diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index cc924388..c7c1d650 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -24,28 +24,28 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 8.0.x + dotnet-version: 9.x.x - name: Restore dependencies run: dotnet restore - working-directory: ./src + working-directory: ./src/Chrysalis - name: Build run: dotnet build --no-restore - working-directory: ./src + working-directory: ./src/Chrysalis - name: Test - run: dotnet test --no-build --verbosity normal - working-directory: ./src + run: dotnet test --verbosity normal + working-directory: ./ - name: Publish run: dotnet publish --no-restore - working-directory: ./src + working-directory: ./src/Chrysalis - name: Pack run: dotnet pack --no-build -c Release -o out - working-directory: ./src + working-directory: ./src/Chrysalis - name: Push to NuGet - run: dotnet nuget push ./src/out/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json + run: dotnet nuget push ./src/Chrysalis/out/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json if: github.event_name == 'release' \ No newline at end of file diff --git a/.gitignore b/.gitignore index 99bf8c17..ca046922 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,9 @@ **/obj/ **/bin-debug/ **/obj-debug/ -.DS_Store \ No newline at end of file +.DS_Store +**/target + +out +CLAUDE.md +build \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..5d882494 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,45 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to dotnet build", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + }, + { + "name": "Chrysalis.Network.Cli", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build:network:cli", + "program": "${workspaceFolder}/src/Chrysalis.Network.Cli/bin/Debug/net9.0/Chrysalis.Network.Cli.dll", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "console": "integratedTerminal" + }, + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/src/Chrysalis.Test/bin/Debug/net8.0/Chrysalis.Test.dll", + "args": [], + "cwd": "${workspaceFolder}/src/Chrysalis.Test", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "integratedTerminal", + "stopAtEntry": false, + "justMyCode": true, + "suppressJITOptimizations": true + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..6045a98b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "deno.enable": false, + "rust-analyzer.linkedProjects": [ + "src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/Cargo.toml" + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..d55af1f5 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,53 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Chrysalis.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "build:network:cli", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/src/Chrysalis.Network.Cli/Chrysalis.Network.Cli.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/Chrysalis.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/Chrysalis.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/CborTypes.png b/CborTypes.png new file mode 100644 index 00000000..5f5f9a78 Binary files /dev/null and b/CborTypes.png differ diff --git a/Chrysalis.sln b/Chrysalis.sln new file mode 100644 index 00000000..05c7da5d --- /dev/null +++ b/Chrysalis.sln @@ -0,0 +1,79 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Cbor.Cli", "src\Chrysalis.Cbor.Cli\Chrysalis.Cbor.Cli.csproj", "{AAA5EC06-8030-067F-F416-55899E16F81D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Test", "src\Chrysalis.Cbor.Test\Chrysalis.Test.csproj", "{B6D86DA9-6597-0A6F-88F9-740F3B44DD6A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis", "src\Chrysalis\Chrysalis.csproj", "{50A6DD83-F98B-5B07-D208-21D95359EFDC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Cbor.Benchmark", "src\Chrysalis.Cbor.Benchmark\Chrysalis.Cbor.Benchmark.csproj", "{070067AA-3F9C-FB4F-0890-CD5D5C2098E1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Cbor", "src\Chrysalis.Cbor\Chrysalis.Cbor.csproj", "{75E9FD85-74D0-AEF7-712E-4AE33F9AF441}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Network", "src\Chrysalis.Network\Chrysalis.Network.csproj", "{5F419E1F-75D9-4F37-9709-1DD5F4969BF2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Network.Cli", "src\Chrysalis.Network.Cli\Chrysalis.Network.Cli.csproj", "{410C13F6-68D9-4CEC-A380-D402BC4FC3ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Cbor.CodeGen", "src\Chrysalis.Cbor.CodeGen\Chrysalis.Cbor.CodeGen.csproj", "{E130E4B0-1F15-489D-99D8-9D1D707A03E4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AAA5EC06-8030-067F-F416-55899E16F81D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AAA5EC06-8030-067F-F416-55899E16F81D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AAA5EC06-8030-067F-F416-55899E16F81D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AAA5EC06-8030-067F-F416-55899E16F81D}.Release|Any CPU.Build.0 = Release|Any CPU + {B6D86DA9-6597-0A6F-88F9-740F3B44DD6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B6D86DA9-6597-0A6F-88F9-740F3B44DD6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B6D86DA9-6597-0A6F-88F9-740F3B44DD6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B6D86DA9-6597-0A6F-88F9-740F3B44DD6A}.Release|Any CPU.Build.0 = Release|Any CPU + {50A6DD83-F98B-5B07-D208-21D95359EFDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50A6DD83-F98B-5B07-D208-21D95359EFDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50A6DD83-F98B-5B07-D208-21D95359EFDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50A6DD83-F98B-5B07-D208-21D95359EFDC}.Release|Any CPU.Build.0 = Release|Any CPU + {070067AA-3F9C-FB4F-0890-CD5D5C2098E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {070067AA-3F9C-FB4F-0890-CD5D5C2098E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {070067AA-3F9C-FB4F-0890-CD5D5C2098E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {070067AA-3F9C-FB4F-0890-CD5D5C2098E1}.Release|Any CPU.Build.0 = Release|Any CPU + {75E9FD85-74D0-AEF7-712E-4AE33F9AF441}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75E9FD85-74D0-AEF7-712E-4AE33F9AF441}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75E9FD85-74D0-AEF7-712E-4AE33F9AF441}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75E9FD85-74D0-AEF7-712E-4AE33F9AF441}.Release|Any CPU.Build.0 = Release|Any CPU + {5F419E1F-75D9-4F37-9709-1DD5F4969BF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F419E1F-75D9-4F37-9709-1DD5F4969BF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F419E1F-75D9-4F37-9709-1DD5F4969BF2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F419E1F-75D9-4F37-9709-1DD5F4969BF2}.Release|Any CPU.Build.0 = Release|Any CPU + {410C13F6-68D9-4CEC-A380-D402BC4FC3ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {410C13F6-68D9-4CEC-A380-D402BC4FC3ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {410C13F6-68D9-4CEC-A380-D402BC4FC3ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {410C13F6-68D9-4CEC-A380-D402BC4FC3ED}.Release|Any CPU.Build.0 = Release|Any CPU + {E130E4B0-1F15-489D-99D8-9D1D707A03E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E130E4B0-1F15-489D-99D8-9D1D707A03E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E130E4B0-1F15-489D-99D8-9D1D707A03E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E130E4B0-1F15-489D-99D8-9D1D707A03E4}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {AAA5EC06-8030-067F-F416-55899E16F81D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {B6D86DA9-6597-0A6F-88F9-740F3B44DD6A} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {50A6DD83-F98B-5B07-D208-21D95359EFDC} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {070067AA-3F9C-FB4F-0890-CD5D5C2098E1} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {75E9FD85-74D0-AEF7-712E-4AE33F9AF441} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {5F419E1F-75D9-4F37-9709-1DD5F4969BF2} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {410C13F6-68D9-4CEC-A380-D402BC4FC3ED} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {E130E4B0-1F15-489D-99D8-9D1D707A03E4} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {728F4C1F-B8FC-42EF-9AE0-69EBD52A1957} + EndGlobalSection +EndGlobal diff --git a/ChrysalisCborTypes.png b/ChrysalisCborTypes.png new file mode 100644 index 00000000..0702969d Binary files /dev/null and b/ChrysalisCborTypes.png differ diff --git a/ChrysalisCborTypes.png:Zone.Identifier b/ChrysalisCborTypes.png:Zone.Identifier new file mode 100644 index 00000000..5119e22a --- /dev/null +++ b/ChrysalisCborTypes.png:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://www.canva.com/ +HostUrl=https://export-download.canva.com/EaTh8/DAGUYfEaTh8/48/0/0001-1205157529241833986.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJHKNGJLC2J7OGJ6Q%2F20241023%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241023T013701Z&X-Amz-Expires=38868&X-Amz-Signature=754b4163814cff243d4cd2285983d726e1fc2673ed263ff071ef7557f595c5e7&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%2A%3DUTF-8%27%27Add%2520a%2520little%2520bit%2520of%2520body%2520text.png&response-expires=Wed%2C%2023%20Oct%202024%2012%3A24%3A49%20GMT diff --git a/README.md b/README.md index 39c76900..4b3f3712 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,154 @@ -# Chrysalis: Cardano Serialization Library for .NET 🦋 +
+

Chrysalis: Cardano Serialization Library for .NET 🦋

+

A .NET Serialization Library for Cardano

+
-[![.NET](https://github.com/0xAccretion/Chrysalis/actions/workflows/dotnet.yml/badge.svg)](https://github.com/0xAccretion/Chrysalis/actions/workflows/dotnet.yml) +
-Chrysalis is an open-source .NET library designed to facilitate the serialization and deserialization of Cardano blockchain data structures. With a strong focus on adhering to the Cardano standards and enhancing the .NET Cardano developer ecosystem, Chrysalis aims to provide developers with a reliable and consistent toolkit for working with Cardano. +![Forks](https://img.shields.io/github/forks/SAIB-Inc/Chrysalis.svg?style=social) +![Stars](https://img.shields.io/github/stars/SAIB-Inc/Chrysalis.svg?style=social) +![License](https://img.shields.io/badge/License-MIT-blue.svg) +![Contributors](https://img.shields.io/github/contributors/SAIB-Inc/Chrysalis.svg?label=Contributors) +![Issues](https://img.shields.io/github/issues/SAIB-Inc/Chrysalis.svg?label=Open%20Issues) +![Issues Closed](https://img.shields.io/github/issues-closed/SAIB-Inc/Chrysalis.svg?label=Closed%20Issues) + + + + NuGet + + +![C#](https://img.shields.io/badge/C%23-purple.svg) + +
+ + +Chrysalis is an open-source .NET library designed to help you create, build, and sign Cardano transactions. As a C# serialization library, Chrysalis facilitates the serialization and deserialization of Cardano blockchain data structures. With a strong focus on adhering to the Cardano standards and enhancing the .NET Cardano developer ecosystem, Chrysalis aims to provide developers with a reliable and consistent toolkit for working with Cardano. 🚧 **NOTE:** This library is currently a work in progress. Feedback and contributions are welcome! -## Features +## Features ✨ -- **Cardano Serialization**: Convert Cardano data structures to and from CBOR (Concise Binary Object Representation). -- **Bech32 Address Encoding/Decoding**: Handle Cardano addresses seamlessly. -- **Extensive Data Model Support**: Work with a wide range of Cardano data types, including Transactions, Assets, MultiAssets, and more. -- **Smart Contract Interaction**: Interact with Cardano smart contracts. -- **Cross-Platform Compatibility**: Use Chrysalis in any .NET project, including .NET Core, .NET Framework, Xamarin, and more. +- **Cardano Serialization**: Convert Cardano blockchain data structures to and from CBOR (Concise Binary Object Representation), allowing seamless and efficient data exchanges while reducing manual handling. +- **Utility functions**: Use provided functions to intuitively interact with the Cardano data types and serialization formats. + - **Bech32 Address Encoding/Decoding**: Simplifies the encoding and decoding of Cardano addresses, ensuring compatibility with widely used formats. This allows you to handle Cardano addresses seamlessly. +- **Extension Functions**: Simplifies the retrieval of values from Cardano data types by providing functions to access various variables within the data structures. +- **Extensive Data Model Support**: Use a wide range of pre-built Cardano data types, including Transactions, Assets, MultiAssets, and more. +- **Smart Contract Interaction**: Utilize Chrysalis' Cbor types in Datum creation and interact with Cardano smart contracts. +- **Cross-Platform Compatibility**: Use Chrysalis in any .NET project, including .NET Core, .NET Framework, Xamarin, and more. This not only allows you to assemble Cardano data through C# but other .NEt languages such as F# or VB.NET. ## Roadmap 🚀 -1. **(De)serialization Support**: Achieve complete serialization and deserialization for any Cardano data type described in CDDL https://github.com/input-output-hk/cardano-ledger/blob/master/eras/alonzo/test-suite/cddl-files/alonzo.cddl. +1. **(De)serialization Support**: Achieve complete serialization and deserialization for any Cardano data type described in CDDL https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl. 2. **Transaction Handling**: Introduce capabilities for building and signing Cardano transactions. 3. **Advanced Address Management**: Implement address generation, derivation, and other associated functionalities. -## Getting Started +## Getting Started 📦 To use Chrysalis in your .NET project: -1. `dotnet add package Chrysalis` -2. Example Usage +1. You can install Chrysalis via NuGet: + `dotnet add package Chrysalis` + +2. Example Usage 🧑‍💻 CBOR (De)serialization ```csharp - var originalTransaction = CborSerializerV2.FromHex(originalTransactionCborHex)!; + var serializedTransaction = CborSerializer.Serialize(originalTransaction); + var deserializedTransaction = CborSerializer.Deserialize(serializedTransaction); + ``` + + Block Deserialization and Serialization + ```csharp + byte[] serializedBlock = CborSerializer.Serialize(originalBlock); + BlockEntity deserializedBlock = CborSerializer.Deserialize(serializedBlock); + ``` + + Access Deserialized Transactions, Transaction Inputs, and Transaction Outputs from a Deserialized Block + ```csharp + IEnumerable transactions = originalBlock.TransactionBodies(); + foreach (TransactionBody tx in transactions) + { + IEnumerable inputs = tx.Inputs(); + IEnumerable outputs = tx.Outputs(); + } + ``` - var serializedTransaction = CborSerializerV2.Serialize(originalTransaction); + Access a Transaction Input's Transaction Id and Index + ```csharp + foreach (TransactionInput input in tx.Inputs()) + { + string id = input.TransacationId(); + ulong index = input.Index(); + } + ``` - var deserializedTransaction = CborSerializerV2.Deserialize(serializedTransaction); + Access a Transaction Output's Address and Balance + ```csharp + foreach (TransactionOutput output in tx.Outputs()) + { + string addr = output.Address().Value.ToBech32(); + Value balance = output.Amount(); + ulong lovelace = balance.Lovelace(); + MultiAssetOutput multiasset = balance.MultiAsset(); + } ``` - Bech32 Address Encoding/Decoding + Serialize Transactions in a Block ```csharp - var addressBech32 = "addr..."; - var addressObject = Address.FromBech32(addressBech32); - var addressBech32Again = addressObject.ToBech32(); - var paymentKeyHash = addressObject.GetPaymentKeyHash(); - var stakeKeyHash = addressObject.GetStakeKeyHash(); + for (uint x = 0; x < transactions.Count(); x++) + { + CborSerializer.Serialize(transactions.ElementAt((int)x)) + } ``` + Bech32 Address Encoding or Decoding + ```csharp + var addressBech32 = "addr..."; + var addressObject = Address.FromBech32(addressBech32); + var addressBech32Again = addressObject.ToBech32(); + var paymentKeyHash = addressObject.GetPaymentKeyHash(); + var stakeKeyHash = addressObject.GetStakeKeyHash(); + ``` -## How to Contribute +## Smart Contract Datums 📝 +Cbor Types +![Example Image](CborTypes.png) + +Datum Example +```csharp + public record AssetClass(CborBytes[] Value) : CborIndefiniteList(Value); + public record AssetClassTuple(AssetClass[] Value) : CborIndefiniteList(Value); + + [CborSerializable(CborType.Constr, Index = 0)] + public record SundaeSwapLiquidityPool( + [CborProperty(0)] + CborBytes Identifier, + + [CborProperty(1)] + AssetClassTuple Assets, + + [CborProperty(2)] + CborUlong CirculatingLp, + + [CborProperty(3)] + CborUlong BidFeesPer10Thousand, + + [CborProperty(4)] + CborUlong AskFeesPer10Thousand, + + [CborProperty(5)] + Option FeeManager, + + [CborProperty(6)] + CborUlong MarketOpen, + + [CborProperty(7)] + CborUlong ProtocolFees + ) : RawCbor; +``` + +## How to Contribute 🤝 Interested in contributing to Chrysalis? Great! We appreciate any help, be it in the form of code contributions, documentation, or even bug reports. @@ -56,19 +157,4 @@ Interested in contributing to Chrysalis? Great! We appreciate any help, be it in - **Pull Request**: Submit a pull request once you're ready. Ensure you describe your changes clearly. - **Feedback**: Wait for feedback and address any comments or suggestions. -## License - -MIT License - -Copyright (c) 2023 0xAccretion - -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. - ---- - -Give your feedback, star the repository if you found it useful, and consider contributing to push the Cardano .NET ecosystem forward! 🌟 diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/BuildPlots.R b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/BuildPlots.R new file mode 100644 index 00000000..a1fed607 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/BuildPlots.R @@ -0,0 +1,186 @@ +BenchmarkDotNetVersion <- "BenchmarkDotNet v0.14.0 " +dir.create(Sys.getenv("R_LIBS_USER"), recursive = TRUE, showWarnings = FALSE) +list.of.packages <- c("ggplot2", "dplyr", "gdata", "tidyr", "grid", "gridExtra", "Rcpp", "R.devices") +new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])] +if(length(new.packages)) install.packages(new.packages, lib = Sys.getenv("R_LIBS_USER"), repos = "https://cran.rstudio.com/") +library(ggplot2) +library(dplyr) +library(gdata) +library(tidyr) +library(grid) +library(gridExtra) +library(R.devices) + +isEmpty <- function(val){ + is.null(val) | val == "" +} + +createPrefix <- function(params){ + separator <- "-" + values <- params[!isEmpty(params)] + paste(replace(values, TRUE, paste0(separator, values)), collapse = "") +} + +ends_with <- function(vars, match, ignore.case = TRUE) { + if (ignore.case) + match <- tolower(match) + n <- nchar(match) + + if (ignore.case) + vars <- tolower(vars) + length <- nchar(vars) + + substr(vars, pmax(1, length - n + 1), length) == match +} +std.error <- function(x) sqrt(var(x)/length(x)) +cummean <- function(x) cumsum(x)/(1:length(x)) +BenchmarkDotNetVersionGrob <- textGrob(BenchmarkDotNetVersion, gp = gpar(fontface=3, fontsize=10), hjust=1, x=1) +nicePlot <- function(p) grid.arrange(p, bottom = BenchmarkDotNetVersionGrob) +printNice <- function(p) {} # print(nicePlot(p)) +ggsaveNice <- function(fileName, p, ...) { + cat(paste0("*** Plot: ", fileName, " ***\n")) + # See https://stackoverflow.com/a/51655831/184842 + suppressGraphics(ggsave(fileName, plot = nicePlot(p), ...)) + cat("------------------------------\n") +} + +args <- commandArgs(trailingOnly = TRUE) +files <- if (length(args) > 0) args else list.files()[list.files() %>% ends_with("-measurements.csv")] +for (file in files) { + title <- gsub("-measurements.csv", "", basename(file)) + measurements <- read.csv(file, sep = ",") + + result <- measurements %>% filter(Measurement_IterationStage == "Result") + if (nrow(result[is.na(result$Job_Id),]) > 0) + result[is.na(result$Job_Id),]$Job_Id <- "" + if (nrow(result[is.na(result$Params),]) > 0) { + result[is.na(result$Params),]$Params <- "" + } else { + result$Job_Id <- trim(paste(result$Job_Id, result$Params)) + } + result$Job_Id <- factor(result$Job_Id, levels = unique(result$Job_Id)) + + timeUnit <- "ns" + if (min(result$Measurement_Value) > 1000) { + result$Measurement_Value <- result$Measurement_Value / 1000 + timeUnit <- "us" + } + if (min(result$Measurement_Value) > 1000) { + result$Measurement_Value <- result$Measurement_Value / 1000 + timeUnit <- "ms" + } + if (min(result$Measurement_Value) > 1000) { + result$Measurement_Value <- result$Measurement_Value / 1000 + timeUnit <- "sec" + } + + resultStats <- result %>% + group_by_(.dots = c("Target_Method", "Job_Id")) %>% + summarise(se = std.error(Measurement_Value), Value = mean(Measurement_Value)) + + benchmarkBoxplot <- ggplot(result, aes(x=Target_Method, y=Measurement_Value, fill=Job_Id)) + + guides(fill=guide_legend(title="Job")) + + xlab("Target") + + ylab(paste("Time,", timeUnit)) + + ggtitle(title) + + geom_boxplot() + benchmarkBarplot <- ggplot(resultStats, aes(x=Target_Method, y=Value, fill=Job_Id)) + + guides(fill=guide_legend(title="Job")) + + xlab("Target") + + ylab(paste("Time,", timeUnit)) + + ggtitle(title) + + geom_bar(position=position_dodge(), stat="identity") + #geom_errorbar(aes(ymin=Value-1.96*se, ymax=Value+1.96*se), width=.2, position=position_dodge(.9)) + + printNice(benchmarkBoxplot) + printNice(benchmarkBarplot) + ggsaveNice(gsub("-measurements.csv", "-boxplot.png", file), benchmarkBoxplot) + ggsaveNice(gsub("-measurements.csv", "-barplot.png", file), benchmarkBarplot) + + for (target in unique(result$Target_Method)) { + df <- result %>% filter(Target_Method == target) + df$Launch <- factor(df$Measurement_LaunchIndex) + df <- df %>% group_by(Job_Id, Launch) %>% mutate(cm = cummean(Measurement_Value)) + + densityPlot <- ggplot(df, aes(x=Measurement_Value, fill=Job_Id)) + + ggtitle(paste(title, "/", target)) + + xlab(paste("Time,", timeUnit)) + + geom_density(alpha=.5, bw="SJ") + printNice(densityPlot) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-density.png"), file), densityPlot) + + facetDensityPlot <- densityPlot + facet_wrap(~Job_Id) + printNice(facetDensityPlot) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-facetDensity.png"), file), facetDensityPlot) + + for (params in unique(df$Params)) { + paramsDf <- df %>% filter(Params == params) + paramsDensityPlot <- ggplot(paramsDf, aes(x=Measurement_Value, fill=Job_Id)) + + ggtitle(paste(title, "/", target, "/", params)) + + xlab(paste("Time,", timeUnit)) + + geom_density(alpha=.5, bw="SJ") + printNice(paramsDensityPlot) + prefix <- createPrefix(c(target,params)) + ggsaveNice(gsub("-measurements.csv", paste0(prefix, "-density.png"), file), paramsDensityPlot) + + paramsFacetDensityPlot <- paramsDensityPlot + facet_wrap(~Job_Id) + printNice(paramsFacetDensityPlot) + ggsaveNice(gsub("-measurements.csv", paste0(prefix, "-facetDensity.png"), file), paramsFacetDensityPlot) + } + + for (job in unique(df$Job_Id)) { + jobDf <- df %>% filter(Job_Id == job) + timelinePlot <- ggplot(jobDf, aes(x = Measurement_IterationIndex, y=Measurement_Value, group=Launch, color=Launch)) + + ggtitle(paste(title, "/", target, "/", job)) + + xlab("IterationIndex") + + ylab(paste("Time,", timeUnit)) + + geom_line() + + geom_point() + printNice(timelinePlot) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-", job, "-timeline.png"), file), timelinePlot) + timelinePlotSmooth <- timelinePlot + geom_smooth() + printNice(timelinePlotSmooth) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-", job, "-timelineSmooth.png"), file), timelinePlotSmooth) + + cummeanPlot <- ggplot(jobDf, aes(x = Measurement_IterationIndex, y=cm, group=Launch, color=Launch)) + + ggtitle(paste(title, "/", target, "/", job)) + + xlab("IterationIndex") + + ylab(paste("Cumulative mean time,", timeUnit)) + + geom_line() + + geom_point() + printNice(cummeanPlot) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-", job, "-cummean.png"), file), cummeanPlot) + + + densityPlotJob <- ggplot(jobDf, aes(x=Measurement_Value, fill="red")) + + ggtitle(paste(title, "/", target, "/", job)) + + xlab(paste("Time,", timeUnit)) + + geom_density(alpha=.5, bw="SJ") + printNice(densityPlotJob) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-", job, "-density.png"), file), densityPlotJob) + } + + timelinePlot <- ggplot(df, aes(x = Measurement_IterationIndex, y=Measurement_Value, group=Launch, color=Launch)) + + ggtitle(paste(title, "/", target)) + + xlab("IterationIndex") + + ylab(paste("Time,", timeUnit)) + + geom_line() + + geom_point() + + facet_wrap(~Job_Id) + printNice(timelinePlot) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-facetTimeline.png"), file), timelinePlot) + timelinePlotSmooth <- timelinePlot + geom_smooth() + printNice(timelinePlotSmooth) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-facetTimelineSmooth.png"), file), timelinePlotSmooth) + + facetCummeanPlot <- ggplot(df, aes(x = Measurement_IterationIndex, y=cm, group=Launch, color=Launch)) + + ggtitle(paste(title, "/", target)) + + xlab("IterationIndex") + + ylab(paste("Cumulative mean time,", timeUnit)) + + geom_line() + + geom_point() + + facet_wrap(~Job_Id) + printNice(facetCummeanPlot) + ggsaveNice(gsub("-measurements.csv", paste0("-", target, "-cummean.png"), file), facetCummeanPlot) + } +} diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..ec6363ca Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-density.png new file mode 100644 index 00000000..b8b8e66c Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..b955bfa2 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..8b23293c Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-cummean.png new file mode 100644 index 00000000..71c4893d Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-density.png new file mode 100644 index 00000000..b8b8e66c Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetDensity.png new file mode 100644 index 00000000..b470d247 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetTimeline.png new file mode 100644 index 00000000..f8fe3648 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetTimelineSmooth.png new file mode 100644 index 00000000..71cddc9e Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-New-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..af093387 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-density.png new file mode 100644 index 00000000..b8b8e66c Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..78b63aea Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..dd74ec66 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-cummean.png new file mode 100644 index 00000000..02c5cb40 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-density.png new file mode 100644 index 00000000..b8b8e66c Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetDensity.png new file mode 100644 index 00000000..b470d247 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetTimeline.png new file mode 100644 index 00000000..074577b1 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetTimelineSmooth.png new file mode 100644 index 00000000..3c142430 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-Old-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-asm.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-asm.md new file mode 100644 index 00000000..10fa7296 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-asm.md @@ -0,0 +1,180 @@ +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks.New() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7F8F41704C18] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7F8F418CE3B8] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7F8F41706D78]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7F8F41706D90]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7F8F418CDB30] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7F8F418CE3D0] +M02_L05: + mov rdi,rbx + call qword ptr [7F8F418CFFC0] + jmp short M02_L02 +; Total bytes of code 125 +``` + +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks.Old() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7FA2850D4B40] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7FA286035290] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7FA2850D6AC0]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7FA2850D6AD8]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7FA286034B58] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7FA2860352A8] +M02_L05: + mov rdi,rbx + call qword ptr [7FA286035A40] + jmp short M02_L02 +; Total bytes of code 125 +``` + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-barplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-barplot.png new file mode 100644 index 00000000..754363fb Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-barplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-boxplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-boxplot.png new file mode 100644 index 00000000..599a8e60 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-boxplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-measurements.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-measurements.csv new file mode 100644 index 00000000..42b2818e --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-measurements.csv @@ -0,0 +1,135 @@ +Target,Target_Namespace,Target_Type,Target_Method,Job_Id,Job_AnalyzeLaunchVariance,Job_EvaluateOverhead,Job_MaxAbsoluteError,Job_MaxRelativeError,Job_MinInvokeCount,Job_MinIterationTime,Job_OutlierMode,Job_Affinity,Job_EnvironmentVariables,Job_Jit,Job_LargeAddressAware,Job_Platform,Job_PowerPlanMode,Job_Runtime,Job_AllowVeryLargeObjects,Job_Concurrent,Job_CpuGroups,Job_Force,Job_HeapAffinitizeMask,Job_HeapCount,Job_NoAffinitize,Job_RetainVm,Job_Server,Job_Arguments,Job_BuildConfiguration,Job_Clock,Job_EngineFactory,Job_NuGetReferences,Job_Toolchain,Job_IsMutator,Job_InvocationCount,Job_IterationCount,Job_IterationTime,Job_LaunchCount,Job_MaxIterationCount,Job_MaxWarmupIterationCount,Job_MemoryRandomization,Job_MinIterationCount,Job_MinWarmupIterationCount,Job_RunStrategy,Job_UnrollFactor,Job_WarmupCount,Job_Display,Params,Measurement_LaunchIndex,Measurement_IterationMode,Measurement_IterationStage,Measurement_IterationIndex,Measurement_Nanoseconds,Measurement_Operations,Measurement_Value,Gen_0,Gen_1,Gen_2,Allocated_Bytes +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,156508,1,156508,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,63976547,1,63976547,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,33132516,4,8283129,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,39602090,5,7920418,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,44343565,6,7390594.17,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,58318299,7,8331185.57,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,69576404,8,8697050.5,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,79835661,9,8870629,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,100019560,10,10001956,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,104685308,11,9516846.18,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,110805507,12,9233792.25,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,120530787,13,9271599,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,130644503,14,9331750.21,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,141701514,15,9446767.6,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,150587260,16,9411703.75,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,284936409,32,8904262.78,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,15,480325766,64,7505090.09,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,16,651648966,128,5091007.55,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,1935,128,15.12,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,567,128,4.43,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,684,128,5.34,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,558,128,4.36,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,567,128,4.43,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,576,128,4.5,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,7,585,128,4.57,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,8,585,128,4.57,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,576,128,4.5,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,603,128,4.71,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,585,128,4.57,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,567,128,4.43,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,684,128,5.34,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,558,128,4.36,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,576,128,4.5,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,558,128,4.36,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,1440,128,11.25,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,684,128,5.34,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,558,128,4.36,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,684,128,5.34,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,585,128,4.57,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,1143,128,8.93,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,630,128,4.92,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,16,576,128,4.5,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,17,540,128,4.22,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,18,585,128,4.57,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,19,567,128,4.43,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,20,558,128,4.36,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,522264613,128,4080192.29,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,501505905,128,3918014.88,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,503342311,128,3932361.8,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,502045956,128,3922234.03,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,517835885,128,4045592.85,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,544859177,128,4256712.32,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,524452883,128,4097288.15,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,528481187,128,4128759.27,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,523453632,128,4089481.5,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,531526231,128,4152548.68,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,520204007,128,4064093.8,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,525023991,128,4101749.93,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,528067805,128,4125529.73,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,502045375.5,128,3922229.5,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,517835304.5,128,4045588.32,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,524452302.5,128,4097283.61,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,528480606.5,128,4128754.74,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,523453051.5,128,4089476.96,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,531525650.5,128,4152544.14,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,520203426.5,128,4064089.27,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,525023410.5,128,4101745.39,37,15,0,4866608 +AlonzoBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,528067224.5,128,4125525.19,37,15,0,4866608 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,162274,1,162274,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,317857251,1,317857251,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,106183047,4,26545761.75,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,146936806,5,29387361.2,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,175365946,6,29227657.67,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,206443897,7,29491985.29,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,226671650,8,28333956.25,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,257814124,9,28646013.78,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,286598319,10,28659831.9,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,313721392,11,28520126.55,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,341489123,12,28457426.92,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,355006337,13,27308179.77,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,347697251,14,24835517.93,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,305266728,15,20351115.2,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,264018087,16,16501130.44,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,486990525,32,15218453.91,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,15,963550381,64,15055474.7,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,1403,64,21.92,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,650,64,10.16,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,669,64,10.45,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,697,64,10.89,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,556,64,8.69,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,565,64,8.83,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,7,499,64,7.8,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,668,64,10.44,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,706,64,11.03,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,725,64,11.33,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,621,64,9.7,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,594,64,9.28,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,565,64,8.83,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,621,64,9.7,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,2156,64,33.69,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,744,64,11.63,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,961,64,15.02,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,687,64,10.73,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,555,64,8.67,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,650,64,10.16,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,631,64,9.86,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,612,64,9.56,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,16,480,64,7.5,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,17,537,64,8.39,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,18,593,64,9.27,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,19,555,64,8.67,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,20,857,64,13.39,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,982348622,64,15349197.22,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,969743196,64,15152237.44,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,947818192,64,14809659.25,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,962975427,64,15046491.05,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,953979032,64,14905922.38,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,962249756,64,15035152.44,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,989814085,64,15465845.08,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,953274878,64,14894919.97,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,969491389,64,15148302.95,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,952848870,64,14888263.59,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,959780063,64,14996563.48,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,953514078,64,14898657.47,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,951547885,64,14867935.7,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,962974801,64,15046481.27,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,953978406,64,14905912.59,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,962249130,64,15035142.66,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,953274252,64,14894910.19,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,969490763,64,15148293.17,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,952848244,64,14888253.81,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,959779437,64,14996553.7,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,953513452,64,14898647.69,32,13,0,8429744 +AlonzoBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,951547259,64,14867925.92,32,13,0,8429744 diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report-github.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report-github.md new file mode 100644 index 00000000..c88ca538 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report-github.md @@ -0,0 +1,16 @@ +``` + +BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL +AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores +.NET SDK 9.0.102 + [Host] : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG + Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 + +IterationCount=10 MaxIterationCount=20 UnrollFactor=1 +WarmupCount=3 + +``` +| Method | Mean | Error | StdDev | Min | Max | Code Size | Gen0 | Gen1 | Allocated | +|------- |----------:|----------:|----------:|----------:|----------:|----------:|---------:|---------:|----------:| +| New | 4.081 ms | 0.1141 ms | 0.0679 ms | 3.922 ms | 4.153 ms | 226 B | 289.0625 | 117.1875 | 4.64 MB | +| Old | 14.965 ms | 0.1619 ms | 0.0964 ms | 14.868 ms | 15.148 ms | 226 B | 500.0000 | 203.1250 | 8.04 MB | diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.csv new file mode 100644 index 00000000..10c5fc79 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.csv @@ -0,0 +1,3 @@ +Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Min,Max,Code Size,Gen0,Gen1,Allocated +New,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,4.081 ms,0.1141 ms,0.0679 ms,3.922 ms,4.153 ms,226 B,289.0625,117.1875,4.64 MB +Old,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,14.965 ms,0.1619 ms,0.0964 ms,14.868 ms,15.148 ms,226 B,500.0000,203.1250,8.04 MB diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.html b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.html new file mode 100644 index 00000000..9bfc05a6 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.html @@ -0,0 +1,33 @@ + + + + +Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-20250220-033532 + + + + +

+BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL
+AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
+.NET SDK 9.0.102
+  [Host]     : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG
+  Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2
+
+
IterationCount=10  MaxIterationCount=20  UnrollFactor=1  
+WarmupCount=3  
+
+ + + + + + +
MethodMeanErrorStdDevMinMaxCode SizeGen0Gen1Allocated
New4.081 ms0.1141 ms0.0679 ms3.922 ms4.153 ms226 B289.0625117.18754.64 MB
Old14.965 ms0.1619 ms0.0964 ms14.868 ms15.148 ms226 B500.0000203.12508.04 MB
+ + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.txt b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.txt new file mode 100644 index 00000000..cd341ed0 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoBenchmarks-report.txt @@ -0,0 +1,323 @@ +*** AlonzoBenchmarks.New: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 156508.00 ns, 156.5080 us/op +WorkloadJitting 1: 1 op, 63976547.00 ns, 63.9765 ms/op +WorkloadPilot 1: 4 op, 33132516.00 ns, 8.2831 ms/op +WorkloadPilot 2: 5 op, 39602090.00 ns, 7.9204 ms/op +WorkloadPilot 3: 6 op, 44343565.00 ns, 7.3906 ms/op +WorkloadPilot 4: 7 op, 58318299.00 ns, 8.3312 ms/op +WorkloadPilot 5: 8 op, 69576404.00 ns, 8.6971 ms/op +WorkloadPilot 6: 9 op, 79835661.00 ns, 8.8706 ms/op +WorkloadPilot 7: 10 op, 100019560.00 ns, 10.0020 ms/op +WorkloadPilot 8: 11 op, 104685308.00 ns, 9.5168 ms/op +WorkloadPilot 9: 12 op, 110805507.00 ns, 9.2338 ms/op +WorkloadPilot 10: 13 op, 120530787.00 ns, 9.2716 ms/op +WorkloadPilot 11: 14 op, 130644503.00 ns, 9.3318 ms/op +WorkloadPilot 12: 15 op, 141701514.00 ns, 9.4468 ms/op +WorkloadPilot 13: 16 op, 150587260.00 ns, 9.4117 ms/op +WorkloadPilot 14: 32 op, 284936409.00 ns, 8.9043 ms/op +WorkloadPilot 15: 64 op, 480325766.00 ns, 7.5051 ms/op +WorkloadPilot 16: 128 op, 651648966.00 ns, 5.0910 ms/op +OverheadWarmup 1: 128 op, 1935.00 ns, 15.1172 ns/op +OverheadWarmup 2: 128 op, 567.00 ns, 4.4297 ns/op +OverheadWarmup 3: 128 op, 684.00 ns, 5.3438 ns/op +OverheadWarmup 4: 128 op, 558.00 ns, 4.3594 ns/op +OverheadWarmup 5: 128 op, 567.00 ns, 4.4297 ns/op +OverheadWarmup 6: 128 op, 576.00 ns, 4.5000 ns/op +OverheadWarmup 7: 128 op, 585.00 ns, 4.5703 ns/op +OverheadWarmup 8: 128 op, 585.00 ns, 4.5703 ns/op +OverheadActual 1: 128 op, 576.00 ns, 4.5000 ns/op +OverheadActual 2: 128 op, 603.00 ns, 4.7109 ns/op +OverheadActual 3: 128 op, 585.00 ns, 4.5703 ns/op +OverheadActual 4: 128 op, 567.00 ns, 4.4297 ns/op +OverheadActual 5: 128 op, 684.00 ns, 5.3438 ns/op +OverheadActual 6: 128 op, 558.00 ns, 4.3594 ns/op +OverheadActual 7: 128 op, 576.00 ns, 4.5000 ns/op +OverheadActual 8: 128 op, 558.00 ns, 4.3594 ns/op +OverheadActual 9: 128 op, 1440.00 ns, 11.2500 ns/op +OverheadActual 10: 128 op, 684.00 ns, 5.3438 ns/op +OverheadActual 11: 128 op, 558.00 ns, 4.3594 ns/op +OverheadActual 12: 128 op, 684.00 ns, 5.3438 ns/op +OverheadActual 13: 128 op, 585.00 ns, 4.5703 ns/op +OverheadActual 14: 128 op, 1143.00 ns, 8.9297 ns/op +OverheadActual 15: 128 op, 630.00 ns, 4.9219 ns/op +OverheadActual 16: 128 op, 576.00 ns, 4.5000 ns/op +OverheadActual 17: 128 op, 540.00 ns, 4.2188 ns/op +OverheadActual 18: 128 op, 585.00 ns, 4.5703 ns/op +OverheadActual 19: 128 op, 567.00 ns, 4.4297 ns/op +OverheadActual 20: 128 op, 558.00 ns, 4.3594 ns/op +WorkloadWarmup 1: 128 op, 522264613.00 ns, 4.0802 ms/op +WorkloadWarmup 2: 128 op, 501505905.00 ns, 3.9180 ms/op +WorkloadWarmup 3: 128 op, 503342311.00 ns, 3.9324 ms/op +WorkloadActual 1: 128 op, 502045956.00 ns, 3.9222 ms/op +WorkloadActual 2: 128 op, 517835885.00 ns, 4.0456 ms/op +WorkloadActual 3: 128 op, 544859177.00 ns, 4.2567 ms/op +WorkloadActual 4: 128 op, 524452883.00 ns, 4.0973 ms/op +WorkloadActual 5: 128 op, 528481187.00 ns, 4.1288 ms/op +WorkloadActual 6: 128 op, 523453632.00 ns, 4.0895 ms/op +WorkloadActual 7: 128 op, 531526231.00 ns, 4.1525 ms/op +WorkloadActual 8: 128 op, 520204007.00 ns, 4.0641 ms/op +WorkloadActual 9: 128 op, 525023991.00 ns, 4.1017 ms/op +WorkloadActual 10: 128 op, 528067805.00 ns, 4.1255 ms/op +WorkloadResult 1: 128 op, 502045375.50 ns, 3.9222 ms/op +WorkloadResult 2: 128 op, 517835304.50 ns, 4.0456 ms/op +WorkloadResult 3: 128 op, 524452302.50 ns, 4.0973 ms/op +WorkloadResult 4: 128 op, 528480606.50 ns, 4.1288 ms/op +WorkloadResult 5: 128 op, 523453051.50 ns, 4.0895 ms/op +WorkloadResult 6: 128 op, 531525650.50 ns, 4.1525 ms/op +WorkloadResult 7: 128 op, 520203426.50 ns, 4.0641 ms/op +WorkloadResult 8: 128 op, 525023410.50 ns, 4.1017 ms/op +WorkloadResult 9: 128 op, 528067224.50 ns, 4.1255 ms/op + +* Statistics for OverheadJitting +Mean = 156.508 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 156.508 μs, Q1 = 156.508 μs, Median = 156.508 μs, Q3 = 156.508 μs, Max = 156.508 μs +IQR = 0.000 μs, LowerFence = 156.508 μs, UpperFence = 156.508 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[156.507 μs ; 156.508 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 63.977 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 63.977 ms, Q1 = 63.977 ms, Median = 63.977 ms, Q3 = 63.977 ms, Max = 63.977 ms +IQR = 0.000 ms, LowerFence = 63.977 ms, UpperFence = 63.977 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[63.977 ms ; 63.977 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 8.575 ms, StdErr = 0.298 ms (3.48%), N = 16, StdDev = 1.193 ms +Min = 5.091 ms, Q1 = 8.192 ms, Median = 8.887 ms, Q3 = 9.352 ms, Max = 10.002 ms +IQR = 1.159 ms, LowerFence = 6.454 ms, UpperFence = 11.091 ms +ConfidenceInterval = [7.361 ms; 9.790 ms] (CI 99.9%), Margin = 1.215 ms (14.16% of Mean) +Skewness = -1.45, Kurtosis = 4.87, MValue = 2 +-------------------- Histogram -------------------- +[4.470 ms ; 5.712 ms) | @ +[5.712 ms ; 7.034 ms) | +[7.034 ms ; 8.279 ms) | @@@ +[8.279 ms ; 9.521 ms) | @@@@@@@@@@@ +[9.521 ms ; 10.623 ms) | @ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 5.915 ns, StdErr = 1.319 ns (22.30%), N = 8, StdDev = 3.731 ns +Min = 4.359 ns, Q1 = 4.430 ns, Median = 4.535 ns, Q3 = 4.764 ns, Max = 15.117 ns +IQR = 0.334 ns, LowerFence = 3.929 ns, UpperFence = 5.265 ns +ConfidenceInterval = [-1.219 ns; 13.049 ns] (CI 99.9%), Margin = 7.134 ns (120.61% of Mean) +Skewness = 1.83, Kurtosis = 4.64, MValue = 2 +-------------------- Histogram -------------------- +[ 2.403 ns ; 7.300 ns) | @@@@@@@ +[ 7.300 ns ; 12.668 ns) | +[12.668 ns ; 17.566 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 5.179 ns, StdErr = 0.392 ns (7.58%), N = 20, StdDev = 1.755 ns +Min = 4.219 ns, Q1 = 4.412 ns, Median = 4.535 ns, Q3 = 5.027 ns, Max = 11.250 ns +IQR = 0.615 ns, LowerFence = 3.489 ns, UpperFence = 5.950 ns +ConfidenceInterval = [3.655 ns; 6.702 ns] (CI 99.9%), Margin = 1.524 ns (29.43% of Mean) +Skewness = 2.51, Kurtosis = 8.23, MValue = 2.46 +-------------------- Histogram -------------------- +[ 3.933 ns ; 5.630 ns) | @@@@@@@@@@@@@@@@@@ +[ 5.630 ns ; 7.327 ns) | +[ 7.327 ns ; 8.081 ns) | +[ 8.081 ns ; 9.778 ns) | @ +[ 9.778 ns ; 10.401 ns) | +[10.401 ns ; 12.099 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 3.977 ms, StdErr = 0.052 ms (1.30%), N = 3, StdDev = 0.090 ms +Min = 3.918 ms, Q1 = 3.925 ms, Median = 3.932 ms, Q3 = 4.006 ms, Max = 4.080 ms +IQR = 0.081 ms, LowerFence = 3.804 ms, UpperFence = 4.128 ms +ConfidenceInterval = [2.339 ms; 5.615 ms] (CI 99.9%), Margin = 1.638 ms (41.19% of Mean) +Skewness = 0.37, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[3.917 ms ; 4.081 ms) | @@@ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 4.098 ms, StdErr = 0.027 ms (0.65%), N = 10, StdDev = 0.085 ms +Min = 3.922 ms, Q1 = 4.070 ms, Median = 4.100 ms, Q3 = 4.128 ms, Max = 4.257 ms +IQR = 0.058 ms, LowerFence = 3.984 ms, UpperFence = 4.214 ms +ConfidenceInterval = [3.970 ms; 4.227 ms] (CI 99.9%), Margin = 0.128 ms (3.13% of Mean) +Skewness = -0.24, Kurtosis = 3.11, MValue = 2 +-------------------- Histogram -------------------- +[3.871 ms ; 3.974 ms) | @ +[3.974 ms ; 4.139 ms) | @@@@@@@ +[4.139 ms ; 4.308 ms) | @@ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 4.081 ms, StdErr = 0.023 ms (0.55%), N = 9, StdDev = 0.068 ms +Min = 3.922 ms, Q1 = 4.064 ms, Median = 4.097 ms, Q3 = 4.126 ms, Max = 4.153 ms +IQR = 0.061 ms, LowerFence = 3.972 ms, UpperFence = 4.218 ms +ConfidenceInterval = [3.967 ms; 4.195 ms] (CI 99.9%), Margin = 0.114 ms (2.80% of Mean) +Skewness = -1.22, Kurtosis = 3.5, MValue = 2 +-------------------- Histogram -------------------- +[3.879 ms ; 3.965 ms) | @ +[3.965 ms ; 4.044 ms) | +[4.044 ms ; 4.195 ms) | @@@@@@@@ +--------------------------------------------------- +*** AlonzoBenchmarks.Old: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 162274.00 ns, 162.2740 us/op +WorkloadJitting 1: 1 op, 317857251.00 ns, 317.8573 ms/op +WorkloadPilot 1: 4 op, 106183047.00 ns, 26.5458 ms/op +WorkloadPilot 2: 5 op, 146936806.00 ns, 29.3874 ms/op +WorkloadPilot 3: 6 op, 175365946.00 ns, 29.2277 ms/op +WorkloadPilot 4: 7 op, 206443897.00 ns, 29.4920 ms/op +WorkloadPilot 5: 8 op, 226671650.00 ns, 28.3340 ms/op +WorkloadPilot 6: 9 op, 257814124.00 ns, 28.6460 ms/op +WorkloadPilot 7: 10 op, 286598319.00 ns, 28.6598 ms/op +WorkloadPilot 8: 11 op, 313721392.00 ns, 28.5201 ms/op +WorkloadPilot 9: 12 op, 341489123.00 ns, 28.4574 ms/op +WorkloadPilot 10: 13 op, 355006337.00 ns, 27.3082 ms/op +WorkloadPilot 11: 14 op, 347697251.00 ns, 24.8355 ms/op +WorkloadPilot 12: 15 op, 305266728.00 ns, 20.3511 ms/op +WorkloadPilot 13: 16 op, 264018087.00 ns, 16.5011 ms/op +WorkloadPilot 14: 32 op, 486990525.00 ns, 15.2185 ms/op +WorkloadPilot 15: 64 op, 963550381.00 ns, 15.0555 ms/op +OverheadWarmup 1: 64 op, 1403.00 ns, 21.9219 ns/op +OverheadWarmup 2: 64 op, 650.00 ns, 10.1563 ns/op +OverheadWarmup 3: 64 op, 669.00 ns, 10.4531 ns/op +OverheadWarmup 4: 64 op, 697.00 ns, 10.8906 ns/op +OverheadWarmup 5: 64 op, 556.00 ns, 8.6875 ns/op +OverheadWarmup 6: 64 op, 565.00 ns, 8.8281 ns/op +OverheadWarmup 7: 64 op, 499.00 ns, 7.7969 ns/op +OverheadActual 1: 64 op, 668.00 ns, 10.4375 ns/op +OverheadActual 2: 64 op, 706.00 ns, 11.0313 ns/op +OverheadActual 3: 64 op, 725.00 ns, 11.3281 ns/op +OverheadActual 4: 64 op, 621.00 ns, 9.7031 ns/op +OverheadActual 5: 64 op, 594.00 ns, 9.2813 ns/op +OverheadActual 6: 64 op, 565.00 ns, 8.8281 ns/op +OverheadActual 7: 64 op, 621.00 ns, 9.7031 ns/op +OverheadActual 8: 64 op, 2156.00 ns, 33.6875 ns/op +OverheadActual 9: 64 op, 744.00 ns, 11.6250 ns/op +OverheadActual 10: 64 op, 961.00 ns, 15.0156 ns/op +OverheadActual 11: 64 op, 687.00 ns, 10.7344 ns/op +OverheadActual 12: 64 op, 555.00 ns, 8.6719 ns/op +OverheadActual 13: 64 op, 650.00 ns, 10.1563 ns/op +OverheadActual 14: 64 op, 631.00 ns, 9.8594 ns/op +OverheadActual 15: 64 op, 612.00 ns, 9.5625 ns/op +OverheadActual 16: 64 op, 480.00 ns, 7.5000 ns/op +OverheadActual 17: 64 op, 537.00 ns, 8.3906 ns/op +OverheadActual 18: 64 op, 593.00 ns, 9.2656 ns/op +OverheadActual 19: 64 op, 555.00 ns, 8.6719 ns/op +OverheadActual 20: 64 op, 857.00 ns, 13.3906 ns/op +WorkloadWarmup 1: 64 op, 982348622.00 ns, 15.3492 ms/op +WorkloadWarmup 2: 64 op, 969743196.00 ns, 15.1522 ms/op +WorkloadWarmup 3: 64 op, 947818192.00 ns, 14.8097 ms/op +WorkloadActual 1: 64 op, 962975427.00 ns, 15.0465 ms/op +WorkloadActual 2: 64 op, 953979032.00 ns, 14.9059 ms/op +WorkloadActual 3: 64 op, 962249756.00 ns, 15.0352 ms/op +WorkloadActual 4: 64 op, 989814085.00 ns, 15.4658 ms/op +WorkloadActual 5: 64 op, 953274878.00 ns, 14.8949 ms/op +WorkloadActual 6: 64 op, 969491389.00 ns, 15.1483 ms/op +WorkloadActual 7: 64 op, 952848870.00 ns, 14.8883 ms/op +WorkloadActual 8: 64 op, 959780063.00 ns, 14.9966 ms/op +WorkloadActual 9: 64 op, 953514078.00 ns, 14.8987 ms/op +WorkloadActual 10: 64 op, 951547885.00 ns, 14.8679 ms/op +WorkloadResult 1: 64 op, 962974801.00 ns, 15.0465 ms/op +WorkloadResult 2: 64 op, 953978406.00 ns, 14.9059 ms/op +WorkloadResult 3: 64 op, 962249130.00 ns, 15.0351 ms/op +WorkloadResult 4: 64 op, 953274252.00 ns, 14.8949 ms/op +WorkloadResult 5: 64 op, 969490763.00 ns, 15.1483 ms/op +WorkloadResult 6: 64 op, 952848244.00 ns, 14.8883 ms/op +WorkloadResult 7: 64 op, 959779437.00 ns, 14.9966 ms/op +WorkloadResult 8: 64 op, 953513452.00 ns, 14.8986 ms/op +WorkloadResult 9: 64 op, 951547259.00 ns, 14.8679 ms/op + +* Statistics for OverheadJitting +Mean = 162.274 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 162.274 μs, Q1 = 162.274 μs, Median = 162.274 μs, Q3 = 162.274 μs, Max = 162.274 μs +IQR = 0.000 μs, LowerFence = 162.274 μs, UpperFence = 162.274 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[162.274 μs ; 162.274 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 317.857 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 317.857 ms, Q1 = 317.857 ms, Median = 317.857 ms, Q3 = 317.857 ms, Max = 317.857 ms +IQR = 0.000 ms, LowerFence = 317.857 ms, UpperFence = 317.857 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[317.857 ms ; 317.857 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 25.103 ms, StdErr = 1.407 ms (5.60%), N = 15, StdDev = 5.447 ms +Min = 15.055 ms, Q1 = 22.593 ms, Median = 28.334 ms, Q3 = 28.653 ms, Max = 29.492 ms +IQR = 6.060 ms, LowerFence = 13.504 ms, UpperFence = 37.742 ms +ConfidenceInterval = [19.279 ms; 30.926 ms] (CI 99.9%), Margin = 5.824 ms (23.20% of Mean) +Skewness = -0.94, Kurtosis = 2.08, MValue = 2.73 +-------------------- Histogram -------------------- +[14.804 ms ; 20.602 ms) | @@@@ +[20.602 ms ; 24.265 ms) | +[24.265 ms ; 30.063 ms) | @@@@@@@@@@@ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 11.248 ns, StdErr = 1.827 ns (16.24%), N = 7, StdDev = 4.834 ns +Min = 7.797 ns, Q1 = 8.758 ns, Median = 10.156 ns, Q3 = 10.672 ns, Max = 21.922 ns +IQR = 1.914 ns, LowerFence = 5.887 ns, UpperFence = 13.543 ns +ConfidenceInterval = [0.361 ns; 22.135 ns] (CI 99.9%), Margin = 10.887 ns (96.79% of Mean) +Skewness = 1.44, Kurtosis = 3.45, MValue = 2 +-------------------- Histogram -------------------- +[ 6.027 ns ; 12.661 ns) | @@@@@@ +[12.661 ns ; 18.605 ns) | +[18.605 ns ; 25.239 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 11.342 ns, StdErr = 1.239 ns (10.92%), N = 20, StdDev = 5.540 ns +Min = 7.500 ns, Q1 = 9.156 ns, Median = 9.781 ns, Q3 = 11.105 ns, Max = 33.688 ns +IQR = 1.949 ns, LowerFence = 6.232 ns, UpperFence = 14.029 ns +ConfidenceInterval = [6.532 ns; 16.153 ns] (CI 99.9%), Margin = 4.811 ns (42.41% of Mean) +Skewness = 3.25, Kurtosis = 13.27, MValue = 2 +-------------------- Histogram -------------------- +[ 6.884 ns ; 12.241 ns) | @@@@@@@@@@@@@@@@@ +[12.241 ns ; 16.882 ns) | @@ +[16.882 ns ; 22.239 ns) | +[22.239 ns ; 27.597 ns) | +[27.597 ns ; 31.009 ns) | +[31.009 ns ; 36.366 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 15.104 ms, StdErr = 0.158 ms (1.04%), N = 3, StdDev = 0.273 ms +Min = 14.810 ms, Q1 = 14.981 ms, Median = 15.152 ms, Q3 = 15.251 ms, Max = 15.349 ms +IQR = 0.270 ms, LowerFence = 14.576 ms, UpperFence = 15.655 ms +ConfidenceInterval = [10.123 ms; 20.085 ms] (CI 99.9%), Margin = 4.981 ms (32.98% of Mean) +Skewness = -0.17, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[14.561 ms ; 15.002 ms) | @ +[15.002 ms ; 15.598 ms) | @@ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 15.015 ms, StdErr = 0.058 ms (0.38%), N = 10, StdDev = 0.183 ms +Min = 14.868 ms, Q1 = 14.896 ms, Median = 14.951 ms, Q3 = 15.044 ms, Max = 15.466 ms +IQR = 0.148 ms, LowerFence = 14.674 ms, UpperFence = 15.265 ms +ConfidenceInterval = [14.739 ms; 15.291 ms] (CI 99.9%), Margin = 0.276 ms (1.84% of Mean) +Skewness = 1.38, Kurtosis = 3.86, MValue = 2 +-------------------- Histogram -------------------- +[14.808 ms ; 15.577 ms) | @@@@@@@@@@ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 14.965 ms, StdErr = 0.032 ms (0.21%), N = 9, StdDev = 0.096 ms +Min = 14.868 ms, Q1 = 14.895 ms, Median = 14.906 ms, Q3 = 15.035 ms, Max = 15.148 ms +IQR = 0.140 ms, LowerFence = 14.685 ms, UpperFence = 15.245 ms +ConfidenceInterval = [14.803 ms; 15.127 ms] (CI 99.9%), Margin = 0.162 ms (1.08% of Mean) +Skewness = 0.61, Kurtosis = 1.78, MValue = 2 +-------------------- Histogram -------------------- +[14.807 ms ; 15.209 ms) | @@@@@@@@@ +--------------------------------------------------- diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..99c4c4d4 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-density.png new file mode 100644 index 00000000..caa25eab Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..58d501ad Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..5dbc4762 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-cummean.png new file mode 100644 index 00000000..a4d35bbb Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-density.png new file mode 100644 index 00000000..caa25eab Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetDensity.png new file mode 100644 index 00000000..22914457 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetTimeline.png new file mode 100644 index 00000000..53e637e8 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetTimelineSmooth.png new file mode 100644 index 00000000..2f17baaf Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-New-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..abaa8675 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-density.png new file mode 100644 index 00000000..caa25eab Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..47628c56 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..270e4974 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-cummean.png new file mode 100644 index 00000000..2c771b4c Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-density.png new file mode 100644 index 00000000..caa25eab Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetDensity.png new file mode 100644 index 00000000..22914457 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetTimeline.png new file mode 100644 index 00000000..7e726c1b Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetTimelineSmooth.png new file mode 100644 index 00000000..8ca4cc35 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-Old-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-asm.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-asm.md new file mode 100644 index 00000000..d4abdb07 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-asm.md @@ -0,0 +1,180 @@ +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks.New() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7F347BAF4B40] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7F347BCAE280] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7F347BAF6BE0]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7F347BAF6C10]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7F347BCADA70] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7F347BCAE298] +M02_L05: + mov rdi,rbx + call qword ptr [7F347BCAE8E0] + jmp short M02_L02 +; Total bytes of code 125 +``` + +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks.Old() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7FC4D43C4C18] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7FC4D53543F0] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7FC4D43C6DA8]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7FC4D43C6DC0]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7FC4D51CFC90] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7FC4D5354408] +M02_L05: + mov rdi,rbx + call qword ptr [7FC4D5354960] + jmp short M02_L02 +; Total bytes of code 125 +``` + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-barplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-barplot.png new file mode 100644 index 00000000..1d99008c Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-barplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-boxplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-boxplot.png new file mode 100644 index 00000000..2881517f Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-boxplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-measurements.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-measurements.csv new file mode 100644 index 00000000..46e7119b --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-measurements.csv @@ -0,0 +1,136 @@ +Target,Target_Namespace,Target_Type,Target_Method,Job_Id,Job_AnalyzeLaunchVariance,Job_EvaluateOverhead,Job_MaxAbsoluteError,Job_MaxRelativeError,Job_MinInvokeCount,Job_MinIterationTime,Job_OutlierMode,Job_Affinity,Job_EnvironmentVariables,Job_Jit,Job_LargeAddressAware,Job_Platform,Job_PowerPlanMode,Job_Runtime,Job_AllowVeryLargeObjects,Job_Concurrent,Job_CpuGroups,Job_Force,Job_HeapAffinitizeMask,Job_HeapCount,Job_NoAffinitize,Job_RetainVm,Job_Server,Job_Arguments,Job_BuildConfiguration,Job_Clock,Job_EngineFactory,Job_NuGetReferences,Job_Toolchain,Job_IsMutator,Job_InvocationCount,Job_IterationCount,Job_IterationTime,Job_LaunchCount,Job_MaxIterationCount,Job_MaxWarmupIterationCount,Job_MemoryRandomization,Job_MinIterationCount,Job_MinWarmupIterationCount,Job_RunStrategy,Job_UnrollFactor,Job_WarmupCount,Job_Display,Params,Measurement_LaunchIndex,Measurement_IterationMode,Measurement_IterationStage,Measurement_IterationIndex,Measurement_Nanoseconds,Measurement_Operations,Measurement_Value,Gen_0,Gen_1,Gen_2,Allocated_Bytes +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,163315,1,163315,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,75045589,1,75045589,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,73585733,4,18396433.25,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,90344490,5,18068898,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,122450206,6,20408367.67,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,143155833,7,20450833.29,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,160669090,8,20083636.25,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,186772516,9,20752501.78,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,203439100,10,20343910,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,229867851,11,20897077.36,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,235865663,12,19655471.92,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,248795833,13,19138141,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,240415137,14,17172509.79,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,240843032,15,16056202.13,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,213923108,16,13370194.25,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,370358431,32,11573700.97,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,15,715927878,64,11186373.09,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,1542,64,24.09,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,440,64,6.88,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,421,64,6.58,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,411,64,6.42,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,430,64,6.72,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,458,64,7.16,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,7,402,64,6.28,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,8,412,64,6.44,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,9,440,64,6.88,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,10,449,64,7.02,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,448,64,7,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,439,64,6.86,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,552,64,8.63,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,430,64,6.72,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,439,64,6.86,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,439,64,6.86,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,1412,64,22.06,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,588,64,9.19,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,411,64,6.42,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,402,64,6.28,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,392,64,6.13,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,458,64,7.16,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,402,64,6.28,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,420,64,6.56,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,449,64,7.02,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,16,439,64,6.86,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,17,420,64,6.56,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,18,421,64,6.58,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,728584510,64,11384132.97,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,720836671,64,11263072.98,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,729443886,64,11397560.72,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,717436956,64,11209952.44,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,722612266,64,11290816.66,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,724592926,64,11321764.47,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,720022193,64,11250346.77,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,716161544,64,11190024.13,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,717104520,64,11204758.13,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,718367247,64,11224488.23,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,715810029,64,11184531.7,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,716361194,64,11193143.66,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,720064789,64,11251012.33,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,717436517,64,11209945.58,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,722611827,64,11290809.8,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,724592487,64,11321757.61,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,720021754,64,11250339.91,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,716161105,64,11190017.27,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,717104081,64,11204751.27,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,718366808,64,11224481.38,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,715809590,64,11184524.84,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,716360755,64,11193136.8,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,10,720064350,64,11251005.47,34,16,0,8913528 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,163026,1,163026,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,344338888,1,344338888,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,178830641,4,44707660.25,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,229970002,5,45994000.4,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,300778387,6,50129731.17,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,330568003,7,47224000.43,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,377093580,8,47136697.5,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,415616243,9,46179582.56,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,454481132,10,45448113.2,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,444894899,11,40444990.82,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,405568943,12,33797411.92,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,413822005,13,31832461.92,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,435045945,14,31074710.36,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,458891076,15,30592738.4,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,487642766,16,30477672.88,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,993491175,32,31046599.22,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,2212,32,69.13,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,427,32,13.34,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,390,32,12.19,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,363,32,11.34,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,437,32,13.66,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,400,32,12.5,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,7,437,32,13.66,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,8,390,32,12.19,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,428,32,13.38,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,400,32,12.5,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,409,32,12.78,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,455,32,14.22,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,428,32,13.38,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,372,32,11.63,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,799,32,24.97,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,418,32,13.06,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,1841,32,57.53,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,613,32,19.16,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,325,32,10.16,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,381,32,11.91,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,418,32,13.06,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,437,32,13.66,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,353,32,11.03,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,16,419,32,13.09,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,17,353,32,11.03,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,18,419,32,13.09,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,19,381,32,11.91,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,20,456,32,14.25,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,996557844,32,31142432.63,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,992011391,32,31000355.97,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,989977628,32,30936800.88,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,981453849,32,30670432.78,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,994001899,32,31062559.34,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,976046384,32,30501449.5,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,981320301,32,30666259.41,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,983741536,32,30741923,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,983681285,32,30740040.16,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,985411541,32,30794110.66,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,982001227,32,30687538.34,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,1006290051,32,31446564.09,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,1002454841,32,31326713.78,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,981453430.5,32,30670419.7,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,994001480.5,32,31062546.27,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,976045965.5,32,30501436.42,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,981319882.5,32,30666246.33,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,983741117.5,32,30741909.92,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,983680866.5,32,30740027.08,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,985411122.5,32,30794097.58,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,982000808.5,32,30687525.27,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,1006289632.5,32,31446551.02,26,0,0,13627079 +AlonzoDuplicateKeyBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,AlonzoDuplicateKeyBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,10,1002454422.5,32,31326700.7,26,0,0,13627079 diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report-github.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report-github.md new file mode 100644 index 00000000..c76adfb4 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report-github.md @@ -0,0 +1,16 @@ +``` + +BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL +AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores +.NET SDK 9.0.102 + [Host] : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG + Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 + +IterationCount=10 MaxIterationCount=20 UnrollFactor=1 +WarmupCount=3 + +``` +| Method | Mean | Error | StdDev | Min | Max | Code Size | Gen0 | Gen1 | Allocated | +|------- |---------:|---------:|---------:|---------:|---------:|----------:|---------:|---------:|----------:| +| New | 11.23 ms | 0.070 ms | 0.046 ms | 11.18 ms | 11.32 ms | 226 B | 531.2500 | 250.0000 | 8.5 MB | +| Old | 30.86 ms | 0.469 ms | 0.310 ms | 30.50 ms | 31.45 ms | 226 B | 812.5000 | - | 13 MB | diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.csv new file mode 100644 index 00000000..97781beb --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.csv @@ -0,0 +1,3 @@ +Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Min,Max,Code Size,Gen0,Gen1,Allocated +New,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,11.23 ms,0.070 ms,0.046 ms,11.18 ms,11.32 ms,226 B,531.2500,250.0000,8.5 MB +Old,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,30.86 ms,0.469 ms,0.310 ms,30.50 ms,31.45 ms,226 B,812.5000,0.0000,13 MB diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.html b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.html new file mode 100644 index 00000000..21a55fef --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.html @@ -0,0 +1,33 @@ + + + + +Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-20250220-033611 + + + + +

+BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL
+AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
+.NET SDK 9.0.102
+  [Host]     : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG
+  Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2
+
+
IterationCount=10  MaxIterationCount=20  UnrollFactor=1  
+WarmupCount=3  
+
+ + + + + + +
MethodMeanErrorStdDevMinMaxCode SizeGen0Gen1Allocated
New11.23 ms0.070 ms0.046 ms11.18 ms11.32 ms226 B531.2500250.00008.5 MB
Old30.86 ms0.469 ms0.310 ms30.50 ms31.45 ms226 B812.5000-13 MB
+ + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.txt b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.txt new file mode 100644 index 00000000..209f3040 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.AlonzoDuplicateKeyBenchmarks-report.txt @@ -0,0 +1,318 @@ +*** AlonzoDuplicateKeyBenchmarks.New: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 163315.00 ns, 163.3150 us/op +WorkloadJitting 1: 1 op, 75045589.00 ns, 75.0456 ms/op +WorkloadPilot 1: 4 op, 73585733.00 ns, 18.3964 ms/op +WorkloadPilot 2: 5 op, 90344490.00 ns, 18.0689 ms/op +WorkloadPilot 3: 6 op, 122450206.00 ns, 20.4084 ms/op +WorkloadPilot 4: 7 op, 143155833.00 ns, 20.4508 ms/op +WorkloadPilot 5: 8 op, 160669090.00 ns, 20.0836 ms/op +WorkloadPilot 6: 9 op, 186772516.00 ns, 20.7525 ms/op +WorkloadPilot 7: 10 op, 203439100.00 ns, 20.3439 ms/op +WorkloadPilot 8: 11 op, 229867851.00 ns, 20.8971 ms/op +WorkloadPilot 9: 12 op, 235865663.00 ns, 19.6555 ms/op +WorkloadPilot 10: 13 op, 248795833.00 ns, 19.1381 ms/op +WorkloadPilot 11: 14 op, 240415137.00 ns, 17.1725 ms/op +WorkloadPilot 12: 15 op, 240843032.00 ns, 16.0562 ms/op +WorkloadPilot 13: 16 op, 213923108.00 ns, 13.3702 ms/op +WorkloadPilot 14: 32 op, 370358431.00 ns, 11.5737 ms/op +WorkloadPilot 15: 64 op, 715927878.00 ns, 11.1864 ms/op +OverheadWarmup 1: 64 op, 1542.00 ns, 24.0938 ns/op +OverheadWarmup 2: 64 op, 440.00 ns, 6.8750 ns/op +OverheadWarmup 3: 64 op, 421.00 ns, 6.5781 ns/op +OverheadWarmup 4: 64 op, 411.00 ns, 6.4219 ns/op +OverheadWarmup 5: 64 op, 430.00 ns, 6.7188 ns/op +OverheadWarmup 6: 64 op, 458.00 ns, 7.1563 ns/op +OverheadWarmup 7: 64 op, 402.00 ns, 6.2813 ns/op +OverheadWarmup 8: 64 op, 412.00 ns, 6.4375 ns/op +OverheadWarmup 9: 64 op, 440.00 ns, 6.8750 ns/op +OverheadWarmup 10: 64 op, 449.00 ns, 7.0156 ns/op +OverheadActual 1: 64 op, 448.00 ns, 7.0000 ns/op +OverheadActual 2: 64 op, 439.00 ns, 6.8594 ns/op +OverheadActual 3: 64 op, 552.00 ns, 8.6250 ns/op +OverheadActual 4: 64 op, 430.00 ns, 6.7188 ns/op +OverheadActual 5: 64 op, 439.00 ns, 6.8594 ns/op +OverheadActual 6: 64 op, 439.00 ns, 6.8594 ns/op +OverheadActual 7: 64 op, 1412.00 ns, 22.0625 ns/op +OverheadActual 8: 64 op, 588.00 ns, 9.1875 ns/op +OverheadActual 9: 64 op, 411.00 ns, 6.4219 ns/op +OverheadActual 10: 64 op, 402.00 ns, 6.2813 ns/op +OverheadActual 11: 64 op, 392.00 ns, 6.1250 ns/op +OverheadActual 12: 64 op, 458.00 ns, 7.1563 ns/op +OverheadActual 13: 64 op, 402.00 ns, 6.2813 ns/op +OverheadActual 14: 64 op, 420.00 ns, 6.5625 ns/op +OverheadActual 15: 64 op, 449.00 ns, 7.0156 ns/op +OverheadActual 16: 64 op, 439.00 ns, 6.8594 ns/op +OverheadActual 17: 64 op, 420.00 ns, 6.5625 ns/op +OverheadActual 18: 64 op, 421.00 ns, 6.5781 ns/op +WorkloadWarmup 1: 64 op, 728584510.00 ns, 11.3841 ms/op +WorkloadWarmup 2: 64 op, 720836671.00 ns, 11.2631 ms/op +WorkloadWarmup 3: 64 op, 729443886.00 ns, 11.3976 ms/op +WorkloadActual 1: 64 op, 717436956.00 ns, 11.2100 ms/op +WorkloadActual 2: 64 op, 722612266.00 ns, 11.2908 ms/op +WorkloadActual 3: 64 op, 724592926.00 ns, 11.3218 ms/op +WorkloadActual 4: 64 op, 720022193.00 ns, 11.2503 ms/op +WorkloadActual 5: 64 op, 716161544.00 ns, 11.1900 ms/op +WorkloadActual 6: 64 op, 717104520.00 ns, 11.2048 ms/op +WorkloadActual 7: 64 op, 718367247.00 ns, 11.2245 ms/op +WorkloadActual 8: 64 op, 715810029.00 ns, 11.1845 ms/op +WorkloadActual 9: 64 op, 716361194.00 ns, 11.1931 ms/op +WorkloadActual 10: 64 op, 720064789.00 ns, 11.2510 ms/op +WorkloadResult 1: 64 op, 717436517.00 ns, 11.2099 ms/op +WorkloadResult 2: 64 op, 722611827.00 ns, 11.2908 ms/op +WorkloadResult 3: 64 op, 724592487.00 ns, 11.3218 ms/op +WorkloadResult 4: 64 op, 720021754.00 ns, 11.2503 ms/op +WorkloadResult 5: 64 op, 716161105.00 ns, 11.1900 ms/op +WorkloadResult 6: 64 op, 717104081.00 ns, 11.2048 ms/op +WorkloadResult 7: 64 op, 718366808.00 ns, 11.2245 ms/op +WorkloadResult 8: 64 op, 715809590.00 ns, 11.1845 ms/op +WorkloadResult 9: 64 op, 716360755.00 ns, 11.1931 ms/op +WorkloadResult 10: 64 op, 720064350.00 ns, 11.2510 ms/op + +* Statistics for OverheadJitting +Mean = 163.315 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 163.315 μs, Q1 = 163.315 μs, Median = 163.315 μs, Q3 = 163.315 μs, Max = 163.315 μs +IQR = 0.000 μs, LowerFence = 163.315 μs, UpperFence = 163.315 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[163.315 μs ; 163.315 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 75.046 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 75.046 ms, Q1 = 75.046 ms, Median = 75.046 ms, Q3 = 75.046 ms, Max = 75.046 ms +IQR = 0.000 ms, LowerFence = 75.046 ms, UpperFence = 75.046 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[75.046 ms ; 75.046 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 17.837 ms, StdErr = 0.859 ms (4.82%), N = 15, StdDev = 3.328 ms +Min = 11.186 ms, Q1 = 16.614 ms, Median = 19.138 ms, Q3 = 20.376 ms, Max = 20.897 ms +IQR = 3.762 ms, LowerFence = 10.972 ms, UpperFence = 26.019 ms +ConfidenceInterval = [14.279 ms; 21.394 ms] (CI 99.9%), Margin = 3.558 ms (19.94% of Mean) +Skewness = -0.92, Kurtosis = 2.3, MValue = 2.2 +-------------------- Histogram -------------------- +[10.507 ms ; 14.049 ms) | @@@ +[14.049 ms ; 17.712 ms) | @@ +[17.712 ms ; 21.254 ms) | @@@@@@@@@@ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 8.445 ns, StdErr = 1.741 ns (20.61%), N = 10, StdDev = 5.505 ns +Min = 6.281 ns, Q1 = 6.473 ns, Median = 6.797 ns, Q3 = 6.980 ns, Max = 24.094 ns +IQR = 0.508 ns, LowerFence = 5.711 ns, UpperFence = 7.742 ns +ConfidenceInterval = [0.122 ns; 16.769 ns] (CI 99.9%), Margin = 8.323 ns (98.56% of Mean) +Skewness = 2.27, Kurtosis = 6.54, MValue = 3.5 +-------------------- Histogram -------------------- +[ 2.927 ns ; 10.073 ns) | @@@@@@@@@ +[10.073 ns ; 16.781 ns) | +[16.781 ns ; 20.740 ns) | +[20.740 ns ; 27.448 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 7.779 ns, StdErr = 0.860 ns (11.05%), N = 18, StdDev = 3.648 ns +Min = 6.125 ns, Q1 = 6.562 ns, Median = 6.859 ns, Q3 = 7.012 ns, Max = 22.062 ns +IQR = 0.449 ns, LowerFence = 5.889 ns, UpperFence = 7.686 ns +ConfidenceInterval = [4.369 ns; 11.188 ns] (CI 99.9%), Margin = 3.410 ns (43.83% of Mean) +Skewness = 3.31, Kurtosis = 13.07, MValue = 2 +-------------------- Histogram -------------------- +[ 5.829 ns ; 9.483 ns) | @@@@@@@@@@@@@@@@@ +[ 9.483 ns ; 13.138 ns) | +[13.138 ns ; 16.792 ns) | +[16.792 ns ; 20.235 ns) | +[20.235 ns ; 23.890 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 11.348 ms, StdErr = 0.043 ms (0.38%), N = 3, StdDev = 0.074 ms +Min = 11.263 ms, Q1 = 11.324 ms, Median = 11.384 ms, Q3 = 11.391 ms, Max = 11.398 ms +IQR = 0.067 ms, LowerFence = 11.223 ms, UpperFence = 11.492 ms +ConfidenceInterval = [9.997 ms; 12.700 ms] (CI 99.9%), Margin = 1.351 ms (11.91% of Mean) +Skewness = -0.37, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[11.263 ms ; 11.398 ms) | @@@ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 11.232 ms, StdErr = 0.015 ms (0.13%), N = 10, StdDev = 0.046 ms +Min = 11.185 ms, Q1 = 11.196 ms, Median = 11.217 ms, Q3 = 11.251 ms, Max = 11.322 ms +IQR = 0.055 ms, LowerFence = 11.114 ms, UpperFence = 11.333 ms +ConfidenceInterval = [11.163 ms; 11.302 ms] (CI 99.9%), Margin = 0.070 ms (0.62% of Mean) +Skewness = 0.68, Kurtosis = 1.97, MValue = 2 +-------------------- Histogram -------------------- +[11.157 ms ; 11.350 ms) | @@@@@@@@@@ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 11.232 ms, StdErr = 0.015 ms (0.13%), N = 10, StdDev = 0.046 ms +Min = 11.185 ms, Q1 = 11.196 ms, Median = 11.217 ms, Q3 = 11.251 ms, Max = 11.322 ms +IQR = 0.055 ms, LowerFence = 11.114 ms, UpperFence = 11.333 ms +ConfidenceInterval = [11.163 ms; 11.302 ms] (CI 99.9%), Margin = 0.070 ms (0.62% of Mean) +Skewness = 0.68, Kurtosis = 1.97, MValue = 2 +-------------------- Histogram -------------------- +[11.157 ms ; 11.350 ms) | @@@@@@@@@@ +--------------------------------------------------- +*** AlonzoDuplicateKeyBenchmarks.Old: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 163026.00 ns, 163.0260 us/op +WorkloadJitting 1: 1 op, 344338888.00 ns, 344.3389 ms/op +WorkloadPilot 1: 4 op, 178830641.00 ns, 44.7077 ms/op +WorkloadPilot 2: 5 op, 229970002.00 ns, 45.9940 ms/op +WorkloadPilot 3: 6 op, 300778387.00 ns, 50.1297 ms/op +WorkloadPilot 4: 7 op, 330568003.00 ns, 47.2240 ms/op +WorkloadPilot 5: 8 op, 377093580.00 ns, 47.1367 ms/op +WorkloadPilot 6: 9 op, 415616243.00 ns, 46.1796 ms/op +WorkloadPilot 7: 10 op, 454481132.00 ns, 45.4481 ms/op +WorkloadPilot 8: 11 op, 444894899.00 ns, 40.4450 ms/op +WorkloadPilot 9: 12 op, 405568943.00 ns, 33.7974 ms/op +WorkloadPilot 10: 13 op, 413822005.00 ns, 31.8325 ms/op +WorkloadPilot 11: 14 op, 435045945.00 ns, 31.0747 ms/op +WorkloadPilot 12: 15 op, 458891076.00 ns, 30.5927 ms/op +WorkloadPilot 13: 16 op, 487642766.00 ns, 30.4777 ms/op +WorkloadPilot 14: 32 op, 993491175.00 ns, 31.0466 ms/op +OverheadWarmup 1: 32 op, 2212.00 ns, 69.1250 ns/op +OverheadWarmup 2: 32 op, 427.00 ns, 13.3438 ns/op +OverheadWarmup 3: 32 op, 390.00 ns, 12.1875 ns/op +OverheadWarmup 4: 32 op, 363.00 ns, 11.3438 ns/op +OverheadWarmup 5: 32 op, 437.00 ns, 13.6563 ns/op +OverheadWarmup 6: 32 op, 400.00 ns, 12.5000 ns/op +OverheadWarmup 7: 32 op, 437.00 ns, 13.6563 ns/op +OverheadWarmup 8: 32 op, 390.00 ns, 12.1875 ns/op +OverheadActual 1: 32 op, 428.00 ns, 13.3750 ns/op +OverheadActual 2: 32 op, 400.00 ns, 12.5000 ns/op +OverheadActual 3: 32 op, 409.00 ns, 12.7813 ns/op +OverheadActual 4: 32 op, 455.00 ns, 14.2188 ns/op +OverheadActual 5: 32 op, 428.00 ns, 13.3750 ns/op +OverheadActual 6: 32 op, 372.00 ns, 11.6250 ns/op +OverheadActual 7: 32 op, 799.00 ns, 24.9688 ns/op +OverheadActual 8: 32 op, 418.00 ns, 13.0625 ns/op +OverheadActual 9: 32 op, 1841.00 ns, 57.5313 ns/op +OverheadActual 10: 32 op, 613.00 ns, 19.1563 ns/op +OverheadActual 11: 32 op, 325.00 ns, 10.1563 ns/op +OverheadActual 12: 32 op, 381.00 ns, 11.9063 ns/op +OverheadActual 13: 32 op, 418.00 ns, 13.0625 ns/op +OverheadActual 14: 32 op, 437.00 ns, 13.6563 ns/op +OverheadActual 15: 32 op, 353.00 ns, 11.0313 ns/op +OverheadActual 16: 32 op, 419.00 ns, 13.0938 ns/op +OverheadActual 17: 32 op, 353.00 ns, 11.0313 ns/op +OverheadActual 18: 32 op, 419.00 ns, 13.0938 ns/op +OverheadActual 19: 32 op, 381.00 ns, 11.9063 ns/op +OverheadActual 20: 32 op, 456.00 ns, 14.2500 ns/op +WorkloadWarmup 1: 32 op, 996557844.00 ns, 31.1424 ms/op +WorkloadWarmup 2: 32 op, 992011391.00 ns, 31.0004 ms/op +WorkloadWarmup 3: 32 op, 989977628.00 ns, 30.9368 ms/op +WorkloadActual 1: 32 op, 981453849.00 ns, 30.6704 ms/op +WorkloadActual 2: 32 op, 994001899.00 ns, 31.0626 ms/op +WorkloadActual 3: 32 op, 976046384.00 ns, 30.5014 ms/op +WorkloadActual 4: 32 op, 981320301.00 ns, 30.6663 ms/op +WorkloadActual 5: 32 op, 983741536.00 ns, 30.7419 ms/op +WorkloadActual 6: 32 op, 983681285.00 ns, 30.7400 ms/op +WorkloadActual 7: 32 op, 985411541.00 ns, 30.7941 ms/op +WorkloadActual 8: 32 op, 982001227.00 ns, 30.6875 ms/op +WorkloadActual 9: 32 op, 1006290051.00 ns, 31.4466 ms/op +WorkloadActual 10: 32 op, 1002454841.00 ns, 31.3267 ms/op +WorkloadResult 1: 32 op, 981453430.50 ns, 30.6704 ms/op +WorkloadResult 2: 32 op, 994001480.50 ns, 31.0625 ms/op +WorkloadResult 3: 32 op, 976045965.50 ns, 30.5014 ms/op +WorkloadResult 4: 32 op, 981319882.50 ns, 30.6662 ms/op +WorkloadResult 5: 32 op, 983741117.50 ns, 30.7419 ms/op +WorkloadResult 6: 32 op, 983680866.50 ns, 30.7400 ms/op +WorkloadResult 7: 32 op, 985411122.50 ns, 30.7941 ms/op +WorkloadResult 8: 32 op, 982000808.50 ns, 30.6875 ms/op +WorkloadResult 9: 32 op, 1006289632.50 ns, 31.4466 ms/op +WorkloadResult 10: 32 op, 1002454422.50 ns, 31.3267 ms/op + +* Statistics for OverheadJitting +Mean = 163.026 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 163.026 μs, Q1 = 163.026 μs, Median = 163.026 μs, Q3 = 163.026 μs, Max = 163.026 μs +IQR = 0.000 μs, LowerFence = 163.026 μs, UpperFence = 163.026 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[163.025 μs ; 163.026 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 344.339 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 344.339 ms, Q1 = 344.339 ms, Median = 344.339 ms, Q3 = 344.339 ms, Max = 344.339 ms +IQR = 0.000 ms, LowerFence = 344.339 ms, UpperFence = 344.339 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[344.339 ms ; 344.339 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 39.720 ms, StdErr = 2.064 ms (5.20%), N = 14, StdDev = 7.721 ms +Min = 30.478 ms, Q1 = 31.264 ms, Median = 42.576 ms, Q3 = 46.133 ms, Max = 50.130 ms +IQR = 14.869 ms, LowerFence = 8.961 ms, UpperFence = 68.437 ms +ConfidenceInterval = [31.011 ms; 48.430 ms] (CI 99.9%), Margin = 8.710 ms (21.93% of Mean) +Skewness = -0.12, Kurtosis = 1.08, MValue = 3.43 +-------------------- Histogram -------------------- +[27.933 ms ; 36.342 ms) | @@@@@@ +[36.342 ms ; 43.214 ms) | @ +[43.214 ms ; 51.623 ms) | @@@@@@@ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 19.750 ns, StdErr = 7.059 ns (35.74%), N = 8, StdDev = 19.967 ns +Min = 11.344 ns, Q1 = 12.188 ns, Median = 12.922 ns, Q3 = 13.656 ns, Max = 69.125 ns +IQR = 1.469 ns, LowerFence = 9.984 ns, UpperFence = 15.859 ns +ConfidenceInterval = [-18.427 ns; 57.927 ns] (CI 99.9%), Margin = 38.177 ns (193.30% of Mean) +Skewness = 1.85, Kurtosis = 4.69, MValue = 2 +-------------------- Histogram -------------------- +[-1.760 ns ; 25.603 ns) | @@@@@@@ +[25.603 ns ; 56.022 ns) | +[56.022 ns ; 82.229 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 15.789 ns, StdErr = 2.313 ns (14.65%), N = 20, StdDev = 10.344 ns +Min = 10.156 ns, Q1 = 11.906 ns, Median = 13.078 ns, Q3 = 13.797 ns, Max = 57.531 ns +IQR = 1.891 ns, LowerFence = 9.070 ns, UpperFence = 16.633 ns +ConfidenceInterval = [6.807 ns; 24.771 ns] (CI 99.9%), Margin = 8.982 ns (56.89% of Mean) +Skewness = 3.29, Kurtosis = 13.31, MValue = 3.11 +-------------------- Histogram -------------------- +[ 9.655 ns ; 19.658 ns) | @@@@@@@@@@@@@@@@@@ +[19.658 ns ; 29.970 ns) | @ +[29.970 ns ; 39.973 ns) | +[39.973 ns ; 52.530 ns) | +[52.530 ns ; 62.533 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 31.027 ms, StdErr = 0.061 ms (0.20%), N = 3, StdDev = 0.105 ms +Min = 30.937 ms, Q1 = 30.969 ms, Median = 31.000 ms, Q3 = 31.071 ms, Max = 31.142 ms +IQR = 0.103 ms, LowerFence = 30.814 ms, UpperFence = 31.226 ms +ConfidenceInterval = [29.106 ms; 32.947 ms] (CI 99.9%), Margin = 1.921 ms (6.19% of Mean) +Skewness = 0.23, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[30.841 ms ; 31.238 ms) | @@@ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 30.864 ms, StdErr = 0.098 ms (0.32%), N = 10, StdDev = 0.310 ms +Min = 30.501 ms, Q1 = 30.675 ms, Median = 30.741 ms, Q3 = 30.995 ms, Max = 31.447 ms +IQR = 0.321 ms, LowerFence = 30.194 ms, UpperFence = 31.477 ms +ConfidenceInterval = [30.394 ms; 31.333 ms] (CI 99.9%), Margin = 0.469 ms (1.52% of Mean) +Skewness = 0.78, Kurtosis = 1.99, MValue = 2 +-------------------- Histogram -------------------- +[30.312 ms ; 30.954 ms) | @@@@@@@ +[30.954 ms ; 31.636 ms) | @@@ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 30.864 ms, StdErr = 0.098 ms (0.32%), N = 10, StdDev = 0.310 ms +Min = 30.501 ms, Q1 = 30.675 ms, Median = 30.741 ms, Q3 = 30.995 ms, Max = 31.447 ms +IQR = 0.321 ms, LowerFence = 30.194 ms, UpperFence = 31.477 ms +ConfidenceInterval = [30.394 ms; 31.333 ms] (CI 99.9%), Margin = 0.469 ms (1.52% of Mean) +Skewness = 0.78, Kurtosis = 1.99, MValue = 2 +-------------------- Histogram -------------------- +[30.312 ms ; 30.954 ms) | @@@@@@@ +[30.954 ms ; 31.636 ms) | @@@ +--------------------------------------------------- diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..d74eb2d4 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-density.png new file mode 100644 index 00000000..eecadf67 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..031de9e9 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..ee847e93 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-cummean.png new file mode 100644 index 00000000..3a5f2e45 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-density.png new file mode 100644 index 00000000..eecadf67 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetDensity.png new file mode 100644 index 00000000..1bb8284b Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetTimeline.png new file mode 100644 index 00000000..7c8e0b39 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetTimelineSmooth.png new file mode 100644 index 00000000..a7555eac Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-New-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..6f6f93d2 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-density.png new file mode 100644 index 00000000..eecadf67 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..bc0e2507 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..b5a65442 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-cummean.png new file mode 100644 index 00000000..36e692c7 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-density.png new file mode 100644 index 00000000..eecadf67 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetDensity.png new file mode 100644 index 00000000..1bb8284b Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetTimeline.png new file mode 100644 index 00000000..f6c86573 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetTimelineSmooth.png new file mode 100644 index 00000000..53b3aa8b Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-Old-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-asm.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-asm.md new file mode 100644 index 00000000..07aaa24d --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-asm.md @@ -0,0 +1,180 @@ +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks.New() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7F8492EC4C18] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7F849308E220] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7F8492EC6CE8]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7F8492EC6D00]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7F849308DA10] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7F849308E238] +M02_L05: + mov rdi,rbx + call qword ptr [7F849308FCF0] + jmp short M02_L02 +; Total bytes of code 125 +``` + +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks.Old() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7FE758104C18] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7FE759074BD0] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7FE758106CA0]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7FE758106CB8]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7FE759074480] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7FE759074BE8] +M02_L05: + mov rdi,rbx + call qword ptr [7FE759075680] + jmp short M02_L02 +; Total bytes of code 125 +``` + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-barplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-barplot.png new file mode 100644 index 00000000..a6496ea1 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-barplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-boxplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-boxplot.png new file mode 100644 index 00000000..749ed8cb Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-boxplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-measurements.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-measurements.csv new file mode 100644 index 00000000..33c16c4f --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-measurements.csv @@ -0,0 +1,134 @@ +Target,Target_Namespace,Target_Type,Target_Method,Job_Id,Job_AnalyzeLaunchVariance,Job_EvaluateOverhead,Job_MaxAbsoluteError,Job_MaxRelativeError,Job_MinInvokeCount,Job_MinIterationTime,Job_OutlierMode,Job_Affinity,Job_EnvironmentVariables,Job_Jit,Job_LargeAddressAware,Job_Platform,Job_PowerPlanMode,Job_Runtime,Job_AllowVeryLargeObjects,Job_Concurrent,Job_CpuGroups,Job_Force,Job_HeapAffinitizeMask,Job_HeapCount,Job_NoAffinitize,Job_RetainVm,Job_Server,Job_Arguments,Job_BuildConfiguration,Job_Clock,Job_EngineFactory,Job_NuGetReferences,Job_Toolchain,Job_IsMutator,Job_InvocationCount,Job_IterationCount,Job_IterationTime,Job_LaunchCount,Job_MaxIterationCount,Job_MaxWarmupIterationCount,Job_MemoryRandomization,Job_MinIterationCount,Job_MinWarmupIterationCount,Job_RunStrategy,Job_UnrollFactor,Job_WarmupCount,Job_Display,Params,Measurement_LaunchIndex,Measurement_IterationMode,Measurement_IterationStage,Measurement_IterationIndex,Measurement_Nanoseconds,Measurement_Operations,Measurement_Value,Gen_0,Gen_1,Gen_2,Allocated_Bytes +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,160400,1,160400,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,62240217,1,62240217,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,30822217,4,7705554.25,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,37974962,5,7594992.4,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,41349835,6,6891639.17,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,49252102,7,7036014.57,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,63310721,8,7913840.13,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,72041652,9,8004628,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,81278997,10,8127899.7,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,88842822,11,8076620.18,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,97699895,12,8141657.92,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,114094586,13,8776506.62,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,117744659,14,8410332.79,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,117179429,15,7811961.93,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,131449129,16,8215570.56,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,258718193,32,8084943.53,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,15,459458383,64,7179037.23,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,16,697446632,128,5448801.81,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,2230,128,17.42,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,665,128,5.2,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,665,128,5.2,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,796,128,6.22,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,590,128,4.61,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,534,128,4.17,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,7,543,128,4.24,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,609,128,4.76,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,600,128,4.69,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,1050,128,8.2,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,712,128,5.56,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,777,128,6.07,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,834,128,6.52,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,703,128,5.49,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,591,128,4.62,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,590,128,4.61,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,1733,128,13.54,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,1068,128,8.34,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,525,128,4.1,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,562,128,4.39,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,580,128,4.53,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,590,128,4.61,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,16,544,128,4.25,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,17,525,128,4.1,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,18,609,128,4.76,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,19,619,128,4.84,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,20,562,128,4.39,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,545581940,128,4262358.91,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,508283561,128,3970965.32,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,492591560,128,3848371.56,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,498660850,128,3895787.89,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,495287030,128,3869429.92,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,494983971,128,3867062.27,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,495006714,128,3867239.95,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,486416041,128,3800125.32,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,479246052,128,3744109.78,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,481556748,128,3762162.09,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,481275959,128,3759968.43,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,487754134,128,3810579.17,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,483182293,128,3774861.66,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,498660245.5,128,3895783.17,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,495286425.5,128,3869425.2,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,494983366.5,128,3867057.55,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,495006109.5,128,3867235.23,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,486415436.5,128,3800120.6,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,479245447.5,128,3744105.06,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,481556143.5,128,3762157.37,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,481275354.5,128,3759963.71,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,487753529.5,128,3810574.45,29,12,0,3885761 +BabbageBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,10,483181688.5,128,3774856.94,29,12,0,3885761 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,159363,1,159363,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,315613630,1,315613630,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,68575845,4,17143961.25,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,82099040,5,16419808,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,97016511,6,16169418.5,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,121734035,7,17390576.43,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,139875461,8,17484432.63,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,163855444,9,18206160.44,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,187691465,10,18769146.5,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,202345046,11,18395004.18,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,209910158,12,17492513.17,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,227184652,13,17475742.46,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,250344529,14,17881752.07,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,262008660,15,17467244,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,273244943,16,17077808.94,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,499921776,32,15622555.5,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,15,732340157,64,11442814.95,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,2107,64,32.92,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,501,64,7.83,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,520,64,8.13,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,520,64,8.13,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,529,64,8.27,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,492,64,7.69,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,501,64,7.83,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,4651,64,72.67,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,538,64,8.41,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,493,64,7.7,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,538,64,8.41,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,493,64,7.7,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,492,64,7.69,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,493,64,7.7,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,492,64,7.69,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,584,64,9.13,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,511,64,7.98,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,1888,64,29.5,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,711,64,11.11,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,410,64,6.41,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,538,64,8.41,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,16,465,64,7.27,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,17,547,64,8.55,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,18,529,64,8.27,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,19,429,64,6.7,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,20,529,64,8.27,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,675739761,64,10558433.77,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,694373979,64,10849593.42,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,691134596,64,10798978.06,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,667042222,64,10422534.72,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,664000254,64,10375003.97,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,661484057,64,10335688.39,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,661337495,64,10333398.36,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,674290204,64,10535784.44,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,665684375,64,10401318.36,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,663970687,64,10374541.98,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,699625486,64,10931648.22,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,671771826,64,10496434.78,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,672044692,64,10500698.31,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,667041702,64,10422526.59,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,663999734,64,10374995.84,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,661483537,64,10335680.27,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,661336975,64,10333390.23,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,674289684,64,10535776.31,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,665683855,64,10401310.23,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,663970167,64,10374533.86,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,671771306,64,10496426.66,22,7,0,5903739 +BabbageBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,BabbageBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,672044172,64,10500690.19,22,7,0,5903739 diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report-github.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report-github.md new file mode 100644 index 00000000..0d4ca225 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report-github.md @@ -0,0 +1,16 @@ +``` + +BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL +AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores +.NET SDK 9.0.102 + [Host] : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG + Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 + +IterationCount=10 MaxIterationCount=20 UnrollFactor=1 +WarmupCount=3 + +``` +| Method | Mean | Error | StdDev | Min | Max | Code Size | Gen0 | Gen1 | Allocated | +|------- |----------:|----------:|----------:|----------:|----------:|----------:|---------:|---------:|----------:| +| New | 3.815 ms | 0.0838 ms | 0.0554 ms | 3.744 ms | 3.896 ms | 226 B | 226.5625 | 93.7500 | 3.71 MB | +| Old | 10.419 ms | 0.1258 ms | 0.0748 ms | 10.333 ms | 10.536 ms | 226 B | 343.7500 | 109.3750 | 5.63 MB | diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.csv new file mode 100644 index 00000000..2ba472ba --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.csv @@ -0,0 +1,3 @@ +Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Min,Max,Code Size,Gen0,Gen1,Allocated +New,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,3.815 ms,0.0838 ms,0.0554 ms,3.744 ms,3.896 ms,226 B,226.5625,93.7500,3.71 MB +Old,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,10.419 ms,0.1258 ms,0.0748 ms,10.333 ms,10.536 ms,226 B,343.7500,109.3750,5.63 MB diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.html b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.html new file mode 100644 index 00000000..2fe1f9ff --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.html @@ -0,0 +1,33 @@ + + + + +Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-20250220-033657 + + + + +

+BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL
+AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
+.NET SDK 9.0.102
+  [Host]     : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG
+  Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2
+
+
IterationCount=10  MaxIterationCount=20  UnrollFactor=1  
+WarmupCount=3  
+
+ + + + + + +
MethodMeanErrorStdDevMinMaxCode SizeGen0Gen1Allocated
New3.815 ms0.0838 ms0.0554 ms3.744 ms3.896 ms226 B226.562593.75003.71 MB
Old10.419 ms0.1258 ms0.0748 ms10.333 ms10.536 ms226 B343.7500109.37505.63 MB
+ + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.txt b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.txt new file mode 100644 index 00000000..19781e55 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.BabbageBenchmarks-report.txt @@ -0,0 +1,321 @@ +*** BabbageBenchmarks.New: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 160400.00 ns, 160.4000 us/op +WorkloadJitting 1: 1 op, 62240217.00 ns, 62.2402 ms/op +WorkloadPilot 1: 4 op, 30822217.00 ns, 7.7056 ms/op +WorkloadPilot 2: 5 op, 37974962.00 ns, 7.5950 ms/op +WorkloadPilot 3: 6 op, 41349835.00 ns, 6.8916 ms/op +WorkloadPilot 4: 7 op, 49252102.00 ns, 7.0360 ms/op +WorkloadPilot 5: 8 op, 63310721.00 ns, 7.9138 ms/op +WorkloadPilot 6: 9 op, 72041652.00 ns, 8.0046 ms/op +WorkloadPilot 7: 10 op, 81278997.00 ns, 8.1279 ms/op +WorkloadPilot 8: 11 op, 88842822.00 ns, 8.0766 ms/op +WorkloadPilot 9: 12 op, 97699895.00 ns, 8.1417 ms/op +WorkloadPilot 10: 13 op, 114094586.00 ns, 8.7765 ms/op +WorkloadPilot 11: 14 op, 117744659.00 ns, 8.4103 ms/op +WorkloadPilot 12: 15 op, 117179429.00 ns, 7.8120 ms/op +WorkloadPilot 13: 16 op, 131449129.00 ns, 8.2156 ms/op +WorkloadPilot 14: 32 op, 258718193.00 ns, 8.0849 ms/op +WorkloadPilot 15: 64 op, 459458383.00 ns, 7.1790 ms/op +WorkloadPilot 16: 128 op, 697446632.00 ns, 5.4488 ms/op +OverheadWarmup 1: 128 op, 2230.00 ns, 17.4219 ns/op +OverheadWarmup 2: 128 op, 665.00 ns, 5.1953 ns/op +OverheadWarmup 3: 128 op, 665.00 ns, 5.1953 ns/op +OverheadWarmup 4: 128 op, 796.00 ns, 6.2188 ns/op +OverheadWarmup 5: 128 op, 590.00 ns, 4.6094 ns/op +OverheadWarmup 6: 128 op, 534.00 ns, 4.1719 ns/op +OverheadWarmup 7: 128 op, 543.00 ns, 4.2422 ns/op +OverheadActual 1: 128 op, 609.00 ns, 4.7578 ns/op +OverheadActual 2: 128 op, 600.00 ns, 4.6875 ns/op +OverheadActual 3: 128 op, 1050.00 ns, 8.2031 ns/op +OverheadActual 4: 128 op, 712.00 ns, 5.5625 ns/op +OverheadActual 5: 128 op, 777.00 ns, 6.0703 ns/op +OverheadActual 6: 128 op, 834.00 ns, 6.5156 ns/op +OverheadActual 7: 128 op, 703.00 ns, 5.4922 ns/op +OverheadActual 8: 128 op, 591.00 ns, 4.6172 ns/op +OverheadActual 9: 128 op, 590.00 ns, 4.6094 ns/op +OverheadActual 10: 128 op, 1733.00 ns, 13.5391 ns/op +OverheadActual 11: 128 op, 1068.00 ns, 8.3438 ns/op +OverheadActual 12: 128 op, 525.00 ns, 4.1016 ns/op +OverheadActual 13: 128 op, 562.00 ns, 4.3906 ns/op +OverheadActual 14: 128 op, 580.00 ns, 4.5313 ns/op +OverheadActual 15: 128 op, 590.00 ns, 4.6094 ns/op +OverheadActual 16: 128 op, 544.00 ns, 4.2500 ns/op +OverheadActual 17: 128 op, 525.00 ns, 4.1016 ns/op +OverheadActual 18: 128 op, 609.00 ns, 4.7578 ns/op +OverheadActual 19: 128 op, 619.00 ns, 4.8359 ns/op +OverheadActual 20: 128 op, 562.00 ns, 4.3906 ns/op +WorkloadWarmup 1: 128 op, 545581940.00 ns, 4.2624 ms/op +WorkloadWarmup 2: 128 op, 508283561.00 ns, 3.9710 ms/op +WorkloadWarmup 3: 128 op, 492591560.00 ns, 3.8484 ms/op +WorkloadActual 1: 128 op, 498660850.00 ns, 3.8958 ms/op +WorkloadActual 2: 128 op, 495287030.00 ns, 3.8694 ms/op +WorkloadActual 3: 128 op, 494983971.00 ns, 3.8671 ms/op +WorkloadActual 4: 128 op, 495006714.00 ns, 3.8672 ms/op +WorkloadActual 5: 128 op, 486416041.00 ns, 3.8001 ms/op +WorkloadActual 6: 128 op, 479246052.00 ns, 3.7441 ms/op +WorkloadActual 7: 128 op, 481556748.00 ns, 3.7622 ms/op +WorkloadActual 8: 128 op, 481275959.00 ns, 3.7600 ms/op +WorkloadActual 9: 128 op, 487754134.00 ns, 3.8106 ms/op +WorkloadActual 10: 128 op, 483182293.00 ns, 3.7749 ms/op +WorkloadResult 1: 128 op, 498660245.50 ns, 3.8958 ms/op +WorkloadResult 2: 128 op, 495286425.50 ns, 3.8694 ms/op +WorkloadResult 3: 128 op, 494983366.50 ns, 3.8671 ms/op +WorkloadResult 4: 128 op, 495006109.50 ns, 3.8672 ms/op +WorkloadResult 5: 128 op, 486415436.50 ns, 3.8001 ms/op +WorkloadResult 6: 128 op, 479245447.50 ns, 3.7441 ms/op +WorkloadResult 7: 128 op, 481556143.50 ns, 3.7622 ms/op +WorkloadResult 8: 128 op, 481275354.50 ns, 3.7600 ms/op +WorkloadResult 9: 128 op, 487753529.50 ns, 3.8106 ms/op +WorkloadResult 10: 128 op, 483181688.50 ns, 3.7749 ms/op + +* Statistics for OverheadJitting +Mean = 160.400 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 160.400 μs, Q1 = 160.400 μs, Median = 160.400 μs, Q3 = 160.400 μs, Max = 160.400 μs +IQR = 0.000 μs, LowerFence = 160.400 μs, UpperFence = 160.400 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[160.399 μs ; 160.400 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 62.240 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 62.240 ms, Q1 = 62.240 ms, Median = 62.240 ms, Q3 = 62.240 ms, Max = 62.240 ms +IQR = 0.000 ms, LowerFence = 62.240 ms, UpperFence = 62.240 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[62.240 ms ; 62.240 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 7.714 ms, StdErr = 0.196 ms (2.54%), N = 16, StdDev = 0.783 ms +Min = 5.449 ms, Q1 = 7.491 ms, Median = 7.959 ms, Q3 = 8.131 ms, Max = 8.777 ms +IQR = 0.640 ms, LowerFence = 6.531 ms, UpperFence = 9.092 ms +ConfidenceInterval = [6.917 ms; 8.511 ms] (CI 99.9%), Margin = 0.797 ms (10.33% of Mean) +Skewness = -1.39, Kurtosis = 4.79, MValue = 2.44 +-------------------- Histogram -------------------- +[5.041 ms ; 5.857 ms) | @ +[5.857 ms ; 6.628 ms) | +[6.628 ms ; 7.595 ms) | @@@ +[7.595 ms ; 8.410 ms) | @@@@@@@@@@@ +[8.410 ms ; 9.184 ms) | @ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 6.722 ns, StdErr = 1.803 ns (26.82%), N = 7, StdDev = 4.770 ns +Min = 4.172 ns, Q1 = 4.426 ns, Median = 5.195 ns, Q3 = 5.707 ns, Max = 17.422 ns +IQR = 1.281 ns, LowerFence = 2.504 ns, UpperFence = 7.629 ns +ConfidenceInterval = [-4.021 ns; 17.465 ns] (CI 99.9%), Margin = 10.743 ns (159.82% of Mean) +Skewness = 1.55, Kurtosis = 3.65, MValue = 2.4 +-------------------- Histogram -------------------- +[ 1.923 ns ; 8.468 ns) | @@@@@@ +[ 8.468 ns ; 14.149 ns) | +[14.149 ns ; 20.695 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 5.618 ns, StdErr = 0.499 ns (8.88%), N = 20, StdDev = 2.231 ns +Min = 4.102 ns, Q1 = 4.496 ns, Median = 4.723 ns, Q3 = 5.689 ns, Max = 13.539 ns +IQR = 1.193 ns, LowerFence = 2.706 ns, UpperFence = 7.479 ns +ConfidenceInterval = [3.681 ns; 7.555 ns] (CI 99.9%), Margin = 1.937 ns (34.48% of Mean) +Skewness = 2.32, Kurtosis = 8.2, MValue = 2.33 +-------------------- Histogram -------------------- +[ 4.007 ns ; 6.165 ns) | @@@@@@@@@@@@@@@@ +[ 6.165 ns ; 8.508 ns) | @@@ +[ 8.508 ns ; 10.666 ns) | +[10.666 ns ; 12.460 ns) | +[12.460 ns ; 14.618 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 4.027 ms, StdErr = 0.123 ms (3.05%), N = 3, StdDev = 0.213 ms +Min = 3.848 ms, Q1 = 3.910 ms, Median = 3.971 ms, Q3 = 4.117 ms, Max = 4.262 ms +IQR = 0.207 ms, LowerFence = 3.599 ms, UpperFence = 4.427 ms +ConfidenceInterval = [0.148 ms; 7.907 ms] (CI 99.9%), Margin = 3.880 ms (96.33% of Mean) +Skewness = 0.25, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[3.716 ms ; 4.103 ms) | @@ +[4.103 ms ; 4.456 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 3.815 ms, StdErr = 0.018 ms (0.46%), N = 10, StdDev = 0.055 ms +Min = 3.744 ms, Q1 = 3.765 ms, Median = 3.805 ms, Q3 = 3.867 ms, Max = 3.896 ms +IQR = 0.102 ms, LowerFence = 3.613 ms, UpperFence = 4.020 ms +ConfidenceInterval = [3.731 ms; 3.899 ms] (CI 99.9%), Margin = 0.084 ms (2.20% of Mean) +Skewness = 0.13, Kurtosis = 1.18, MValue = 2 +-------------------- Histogram -------------------- +[3.740 ms ; 3.920 ms) | @@@@@@@@@@ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 3.815 ms, StdErr = 0.018 ms (0.46%), N = 10, StdDev = 0.055 ms +Min = 3.744 ms, Q1 = 3.765 ms, Median = 3.805 ms, Q3 = 3.867 ms, Max = 3.896 ms +IQR = 0.102 ms, LowerFence = 3.613 ms, UpperFence = 4.020 ms +ConfidenceInterval = [3.731 ms; 3.899 ms] (CI 99.9%), Margin = 0.084 ms (2.20% of Mean) +Skewness = 0.13, Kurtosis = 1.18, MValue = 2 +-------------------- Histogram -------------------- +[3.740 ms ; 3.920 ms) | @@@@@@@@@@ +--------------------------------------------------- +*** BabbageBenchmarks.Old: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 159363.00 ns, 159.3630 us/op +WorkloadJitting 1: 1 op, 315613630.00 ns, 315.6136 ms/op +WorkloadPilot 1: 4 op, 68575845.00 ns, 17.1440 ms/op +WorkloadPilot 2: 5 op, 82099040.00 ns, 16.4198 ms/op +WorkloadPilot 3: 6 op, 97016511.00 ns, 16.1694 ms/op +WorkloadPilot 4: 7 op, 121734035.00 ns, 17.3906 ms/op +WorkloadPilot 5: 8 op, 139875461.00 ns, 17.4844 ms/op +WorkloadPilot 6: 9 op, 163855444.00 ns, 18.2062 ms/op +WorkloadPilot 7: 10 op, 187691465.00 ns, 18.7691 ms/op +WorkloadPilot 8: 11 op, 202345046.00 ns, 18.3950 ms/op +WorkloadPilot 9: 12 op, 209910158.00 ns, 17.4925 ms/op +WorkloadPilot 10: 13 op, 227184652.00 ns, 17.4757 ms/op +WorkloadPilot 11: 14 op, 250344529.00 ns, 17.8818 ms/op +WorkloadPilot 12: 15 op, 262008660.00 ns, 17.4672 ms/op +WorkloadPilot 13: 16 op, 273244943.00 ns, 17.0778 ms/op +WorkloadPilot 14: 32 op, 499921776.00 ns, 15.6226 ms/op +WorkloadPilot 15: 64 op, 732340157.00 ns, 11.4428 ms/op +OverheadWarmup 1: 64 op, 2107.00 ns, 32.9219 ns/op +OverheadWarmup 2: 64 op, 501.00 ns, 7.8281 ns/op +OverheadWarmup 3: 64 op, 520.00 ns, 8.1250 ns/op +OverheadWarmup 4: 64 op, 520.00 ns, 8.1250 ns/op +OverheadWarmup 5: 64 op, 529.00 ns, 8.2656 ns/op +OverheadWarmup 6: 64 op, 492.00 ns, 7.6875 ns/op +OverheadActual 1: 64 op, 501.00 ns, 7.8281 ns/op +OverheadActual 2: 64 op, 4651.00 ns, 72.6719 ns/op +OverheadActual 3: 64 op, 538.00 ns, 8.4063 ns/op +OverheadActual 4: 64 op, 493.00 ns, 7.7031 ns/op +OverheadActual 5: 64 op, 538.00 ns, 8.4063 ns/op +OverheadActual 6: 64 op, 493.00 ns, 7.7031 ns/op +OverheadActual 7: 64 op, 492.00 ns, 7.6875 ns/op +OverheadActual 8: 64 op, 493.00 ns, 7.7031 ns/op +OverheadActual 9: 64 op, 492.00 ns, 7.6875 ns/op +OverheadActual 10: 64 op, 584.00 ns, 9.1250 ns/op +OverheadActual 11: 64 op, 511.00 ns, 7.9844 ns/op +OverheadActual 12: 64 op, 1888.00 ns, 29.5000 ns/op +OverheadActual 13: 64 op, 711.00 ns, 11.1094 ns/op +OverheadActual 14: 64 op, 410.00 ns, 6.4063 ns/op +OverheadActual 15: 64 op, 538.00 ns, 8.4063 ns/op +OverheadActual 16: 64 op, 465.00 ns, 7.2656 ns/op +OverheadActual 17: 64 op, 547.00 ns, 8.5469 ns/op +OverheadActual 18: 64 op, 529.00 ns, 8.2656 ns/op +OverheadActual 19: 64 op, 429.00 ns, 6.7031 ns/op +OverheadActual 20: 64 op, 529.00 ns, 8.2656 ns/op +WorkloadWarmup 1: 64 op, 675739761.00 ns, 10.5584 ms/op +WorkloadWarmup 2: 64 op, 694373979.00 ns, 10.8496 ms/op +WorkloadWarmup 3: 64 op, 691134596.00 ns, 10.7990 ms/op +WorkloadActual 1: 64 op, 667042222.00 ns, 10.4225 ms/op +WorkloadActual 2: 64 op, 664000254.00 ns, 10.3750 ms/op +WorkloadActual 3: 64 op, 661484057.00 ns, 10.3357 ms/op +WorkloadActual 4: 64 op, 661337495.00 ns, 10.3334 ms/op +WorkloadActual 5: 64 op, 674290204.00 ns, 10.5358 ms/op +WorkloadActual 6: 64 op, 665684375.00 ns, 10.4013 ms/op +WorkloadActual 7: 64 op, 663970687.00 ns, 10.3745 ms/op +WorkloadActual 8: 64 op, 699625486.00 ns, 10.9316 ms/op +WorkloadActual 9: 64 op, 671771826.00 ns, 10.4964 ms/op +WorkloadActual 10: 64 op, 672044692.00 ns, 10.5007 ms/op +WorkloadResult 1: 64 op, 667041702.00 ns, 10.4225 ms/op +WorkloadResult 2: 64 op, 663999734.00 ns, 10.3750 ms/op +WorkloadResult 3: 64 op, 661483537.00 ns, 10.3357 ms/op +WorkloadResult 4: 64 op, 661336975.00 ns, 10.3334 ms/op +WorkloadResult 5: 64 op, 674289684.00 ns, 10.5358 ms/op +WorkloadResult 6: 64 op, 665683855.00 ns, 10.4013 ms/op +WorkloadResult 7: 64 op, 663970167.00 ns, 10.3745 ms/op +WorkloadResult 8: 64 op, 671771306.00 ns, 10.4964 ms/op +WorkloadResult 9: 64 op, 672044172.00 ns, 10.5007 ms/op + +* Statistics for OverheadJitting +Mean = 159.363 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 159.363 μs, Q1 = 159.363 μs, Median = 159.363 μs, Q3 = 159.363 μs, Max = 159.363 μs +IQR = 0.000 μs, LowerFence = 159.363 μs, UpperFence = 159.363 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[159.363 μs ; 159.363 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 315.614 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 315.614 ms, Q1 = 315.614 ms, Median = 315.614 ms, Q3 = 315.614 ms, Max = 315.614 ms +IQR = 0.000 ms, LowerFence = 315.614 ms, UpperFence = 315.614 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[315.614 ms ; 315.614 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 16.963 ms, StdErr = 0.448 ms (2.64%), N = 15, StdDev = 1.736 ms +Min = 11.443 ms, Q1 = 16.749 ms, Median = 17.467 ms, Q3 = 17.687 ms, Max = 18.769 ms +IQR = 0.938 ms, LowerFence = 15.341 ms, UpperFence = 19.095 ms +ConfidenceInterval = [15.107 ms; 18.819 ms] (CI 99.9%), Margin = 1.856 ms (10.94% of Mean) +Skewness = -2.03, Kurtosis = 6.97, MValue = 2.75 +-------------------- Histogram -------------------- +[10.519 ms ; 12.367 ms) | @ +[12.367 ms ; 14.215 ms) | +[14.215 ms ; 15.097 ms) | +[15.097 ms ; 17.000 ms) | @@@ +[17.000 ms ; 18.847 ms) | @@@@@@@@@@@ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 12.159 ns, StdErr = 4.154 ns (34.16%), N = 6, StdDev = 10.174 ns +Min = 7.688 ns, Q1 = 7.902 ns, Median = 8.125 ns, Q3 = 8.230 ns, Max = 32.922 ns +IQR = 0.328 ns, LowerFence = 7.410 ns, UpperFence = 8.723 ns +ConfidenceInterval = [-16.371 ns; 40.689 ns] (CI 99.9%), Margin = 28.530 ns (234.64% of Mean) +Skewness = 1.36, Kurtosis = 2.91, MValue = 2 +-------------------- Histogram -------------------- +[ 0.339 ns ; 15.325 ns) | @@@@@ +[15.325 ns ; 25.573 ns) | +[25.573 ns ; 40.271 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 12.369 ns, StdErr = 3.356 ns (27.13%), N = 20, StdDev = 15.009 ns +Min = 6.406 ns, Q1 = 7.699 ns, Median = 8.125 ns, Q3 = 8.441 ns, Max = 72.672 ns +IQR = 0.742 ns, LowerFence = 6.586 ns, UpperFence = 9.555 ns +ConfidenceInterval = [-0.664 ns; 25.402 ns] (CI 99.9%), Margin = 13.033 ns (105.37% of Mean) +Skewness = 3.29, Kurtosis = 13.12, MValue = 2.44 +-------------------- Histogram -------------------- +[ 1.501 ns ; 16.015 ns) | @@@@@@@@@@@@@@@@@@ +[16.015 ns ; 22.243 ns) | +[22.243 ns ; 36.757 ns) | @ +[36.757 ns ; 51.272 ns) | +[51.272 ns ; 65.415 ns) | +[65.415 ns ; 79.929 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 10.736 ms, StdErr = 0.090 ms (0.84%), N = 3, StdDev = 0.156 ms +Min = 10.558 ms, Q1 = 10.679 ms, Median = 10.799 ms, Q3 = 10.824 ms, Max = 10.850 ms +IQR = 0.146 ms, LowerFence = 10.460 ms, UpperFence = 11.043 ms +ConfidenceInterval = [7.898 ms; 13.574 ms] (CI 99.9%), Margin = 2.838 ms (26.44% of Mean) +Skewness = -0.34, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[10.417 ms ; 10.683 ms) | @ +[10.683 ms ; 10.991 ms) | @@ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 10.471 ms, StdErr = 0.056 ms (0.53%), N = 10, StdDev = 0.177 ms +Min = 10.333 ms, Q1 = 10.375 ms, Median = 10.412 ms, Q3 = 10.500 ms, Max = 10.932 ms +IQR = 0.125 ms, LowerFence = 10.187 ms, UpperFence = 10.687 ms +ConfidenceInterval = [10.204 ms; 10.738 ms] (CI 99.9%), Margin = 0.267 ms (2.55% of Mean) +Skewness = 1.65, Kurtosis = 4.73, MValue = 2 +-------------------- Histogram -------------------- +[10.327 ms ; 10.542 ms) | @@@@@@@@@ +[10.542 ms ; 11.039 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 10.419 ms, StdErr = 0.025 ms (0.24%), N = 9, StdDev = 0.075 ms +Min = 10.333 ms, Q1 = 10.375 ms, Median = 10.401 ms, Q3 = 10.496 ms, Max = 10.536 ms +IQR = 0.122 ms, LowerFence = 10.192 ms, UpperFence = 10.679 ms +ConfidenceInterval = [10.294 ms; 10.545 ms] (CI 99.9%), Margin = 0.126 ms (1.21% of Mean) +Skewness = 0.31, Kurtosis = 1.32, MValue = 2 +-------------------- Histogram -------------------- +[10.286 ms ; 10.583 ms) | @@@@@@@@@ +--------------------------------------------------- diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..b8080064 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-density.png new file mode 100644 index 00000000..2a5d38dd Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..90d49980 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..ba7c4d36 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-cummean.png new file mode 100644 index 00000000..07c4c2ee Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-density.png new file mode 100644 index 00000000..2a5d38dd Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetDensity.png new file mode 100644 index 00000000..4c7cede9 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetTimeline.png new file mode 100644 index 00000000..7e6de250 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetTimelineSmooth.png new file mode 100644 index 00000000..fd566a38 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-New-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-cummean.png new file mode 100644 index 00000000..8c763ffe Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-density.png new file mode 100644 index 00000000..2a5d38dd Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-timeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-timeline.png new file mode 100644 index 00000000..230555d4 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-timeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-timelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-timelineSmooth.png new file mode 100644 index 00000000..f8a0419e Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-Job-BZGSBA-timelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-cummean.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-cummean.png new file mode 100644 index 00000000..05891341 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-cummean.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-density.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-density.png new file mode 100644 index 00000000..2a5d38dd Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-density.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetDensity.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetDensity.png new file mode 100644 index 00000000..4c7cede9 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetDensity.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetTimeline.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetTimeline.png new file mode 100644 index 00000000..67d93cf0 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetTimeline.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetTimelineSmooth.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetTimelineSmooth.png new file mode 100644 index 00000000..47579fcf Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-Old-facetTimelineSmooth.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-asm.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-asm.md new file mode 100644 index 00000000..21165236 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-asm.md @@ -0,0 +1,180 @@ +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks.New() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7F329E224B40] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7F329E3DDC68] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7F329E226AF0]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7F329E226B08]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7F329E3DD458] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7F329E3DDC80] +M02_L05: + mov rdi,rbx + call qword ptr [7F329E575338] + jmp short M02_L02 +; Total bytes of code 125 +``` + +## .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 +```assembly +; Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks.Old() + push rbp + sub rsp,20 + lea rbp,[rsp+20] + vxorps xmm8,xmm8,xmm8 + vmovdqu ymmword ptr [rbp-20],ymm8 + mov [rbp-20],rdi + mov dword ptr [rbp-18],0FFFFFFFF + lea rdi,[rbp-20] + call qword ptr [7F31022B4B40] + mov rax,[rbp-10] + test rax,rax + je short M00_L01 +M00_L00: + add rsp,20 + pop rbp + ret +M00_L01: + lea rdi,[rbp-10] + call qword ptr [7F31032051A0] + jmp short M00_L00 +; Total bytes of code 68 +``` +```assembly +; BenchmarkDotNet.Helpers.AwaitHelper.GetResult(System.Threading.Tasks.Task) + push rax + mov esi,[rdi+34] + and esi,11000000 + cmp esi,1000000 + jne short M01_L01 +M01_L00: + add rsp,8 + ret +M01_L01: + xor esi,esi + call qword ptr [7F31022B6AC0]; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + jmp short M01_L00 +; Total bytes of code 33 +``` +```assembly +; System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) + push rbp + push r15 + push rbx + lea rbp,[rsp+10] + mov rbx,rdi + mov r15d,esi + test dword ptr [rbx+34],1600000 + jne short M02_L00 + mov rdi,rbx + xor edx,edx + mov esi,0FFFFFFFF + call qword ptr [7F31022B6AD8]; System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) +M02_L00: + test dword ptr [rbx+34],10000000 + jne short M02_L03 +M02_L01: + mov edi,[rbx+34] + and edi,1600000 + cmp edi,1000000 + jne short M02_L04 +M02_L02: + pop rbx + pop r15 + pop rbp + ret +M02_L03: + mov rdi,rbx + mov rax,[rbx] + mov rax,[rax+40] + call qword ptr [rax+20] + test eax,eax + je short M02_L01 + mov rdi,rbx + call qword ptr [7F3103204A50] + jmp short M02_L01 +M02_L04: + test r15b,2 + jne short M02_L05 + mov rdi,rbx + call qword ptr [7F31032051B8] +M02_L05: + mov rdi,rbx + call qword ptr [7F3103207E10] + jmp short M02_L02 +; Total bytes of code 125 +``` + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-barplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-barplot.png new file mode 100644 index 00000000..d7d28396 Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-barplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-boxplot.png b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-boxplot.png new file mode 100644 index 00000000..d90caa6b Binary files /dev/null and b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-boxplot.png differ diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-measurements.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-measurements.csv new file mode 100644 index 00000000..3b9b5ed3 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-measurements.csv @@ -0,0 +1,134 @@ +Target,Target_Namespace,Target_Type,Target_Method,Job_Id,Job_AnalyzeLaunchVariance,Job_EvaluateOverhead,Job_MaxAbsoluteError,Job_MaxRelativeError,Job_MinInvokeCount,Job_MinIterationTime,Job_OutlierMode,Job_Affinity,Job_EnvironmentVariables,Job_Jit,Job_LargeAddressAware,Job_Platform,Job_PowerPlanMode,Job_Runtime,Job_AllowVeryLargeObjects,Job_Concurrent,Job_CpuGroups,Job_Force,Job_HeapAffinitizeMask,Job_HeapCount,Job_NoAffinitize,Job_RetainVm,Job_Server,Job_Arguments,Job_BuildConfiguration,Job_Clock,Job_EngineFactory,Job_NuGetReferences,Job_Toolchain,Job_IsMutator,Job_InvocationCount,Job_IterationCount,Job_IterationTime,Job_LaunchCount,Job_MaxIterationCount,Job_MaxWarmupIterationCount,Job_MemoryRandomization,Job_MinIterationCount,Job_MinWarmupIterationCount,Job_RunStrategy,Job_UnrollFactor,Job_WarmupCount,Job_Display,Params,Measurement_LaunchIndex,Measurement_IterationMode,Measurement_IterationStage,Measurement_IterationIndex,Measurement_Nanoseconds,Measurement_Operations,Measurement_Value,Gen_0,Gen_1,Gen_2,Allocated_Bytes +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,167357,1,167357,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,57464575,1,57464575,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,8208729,4,2052182.25,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,9554098,5,1910819.6,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,11812061,6,1968676.83,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,14275719,7,2039388.43,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,15858773,8,1982346.63,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,17598518,9,1955390.89,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,19663861,10,1966386.1,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,20143168,11,1831197.09,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,25003739,12,2083644.92,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,30941047,13,2380080.54,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,33188553,14,2370610.93,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,33608905,15,2240593.67,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,36291053,16,2268190.81,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,71854151,32,2245442.22,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,15,146093766,64,2282715.09,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,16,285462772,128,2230177.91,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,17,561511878,256,2193405.77,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,1982,256,7.74,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,1019,256,3.98,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,812,256,3.17,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,812,256,3.17,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,858,256,3.35,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,840,256,3.28,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,7,859,256,3.36,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,849,256,3.32,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,849,256,3.32,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,859,256,3.36,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,840,256,3.28,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,840,256,3.28,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,849,256,3.32,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,1010,256,3.95,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,1227,256,4.79,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,840,256,3.28,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,840,256,3.28,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,840,256,3.28,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,802,256,3.13,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,831,256,3.25,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,1784,256,6.97,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,935,256,3.65,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,387166465,256,1512369,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,275883910,256,1077671.52,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,220388714,256,860893.41,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,219762761,256,858448.29,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,220526439,256,861431.4,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,225244031,256,879859.5,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,215933487,256,843490.18,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,215869084,256,843238.61,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,217833845,256,850913.46,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,218569092,256,853785.52,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,217577252,256,849911.14,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,213661535,256,834615.37,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,212298441,256,829290.79,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,219761912,256,858444.97,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,220525590,256,861428.09,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,215932638,256,843486.87,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,215868235,256,843235.29,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,217832996,256,850910.14,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,218568243,256,853782.2,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,217576403,256,849907.82,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,213660686,256,834612.05,17,2,0,1156598 +ConwayBenchmarks.New,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,New,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,212297592,256,829287.47,17,2,0,1156598 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Jitting,1,164129,1,164129,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Jitting,1,297768794,1,297768794,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,1,19516963,4,4879240.75,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,2,23312264,5,4662452.8,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,3,28386803,6,4731133.83,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,4,35046885,7,5006697.86,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,5,39167235,8,4895904.38,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,6,42042038,9,4671337.56,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,7,47554747,10,4755474.7,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,8,53469267,11,4860842.45,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,9,65118516,12,5426543,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,10,68017620,13,5232124.62,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,11,73407912,14,5243422.29,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,12,82903439,15,5526895.93,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,13,81385402,16,5086587.63,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,14,159684747,32,4990148.34,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,15,343571910,64,5368311.09,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Pilot,16,666093066,128,5203852.08,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,1,1917,128,14.98,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,2,764,128,5.97,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,3,720,128,5.63,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,4,684,128,5.34,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,5,549,128,4.29,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,6,531,128,4.15,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,7,567,128,4.43,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,8,765,128,5.98,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,9,621,128,4.85,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Warmup,10,792,128,6.19,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,1,702,128,5.48,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,2,675,128,5.27,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,3,756,128,5.91,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,4,621,128,4.85,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,5,666,128,5.2,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,6,549,128,4.29,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,7,567,128,4.43,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,8,522,128,4.08,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,9,1332,128,10.41,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,10,819,128,6.4,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,11,1764,128,13.78,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,12,882,128,6.89,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,13,648,128,5.06,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,14,630,128,4.92,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,15,675,128,5.27,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,16,684,128,5.34,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,17,702,128,5.48,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,18,639,128,4.99,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,19,657,128,5.13,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Overhead,Actual,20,639,128,4.99,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,1,602271724,128,4705247.84,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,2,467584958,128,3653007.48,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Warmup,3,360791232,128,2818681.5,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,1,315093565,128,2461668.48,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,2,313649312,128,2450385.25,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,3,307707877,128,2403967.79,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,4,307711293,128,2403994.48,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,5,305530645,128,2386958.16,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,6,357075928,128,2789655.69,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,7,313506850,128,2449272.27,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,8,310736091,128,2427625.71,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,9,316251047,128,2470711.3,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Actual,10,317039044,128,2476867.53,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,1,315092894.5,128,2461663.24,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,2,313648641.5,128,2450380.01,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,3,307707206.5,128,2403962.55,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,4,307710622.5,128,2403989.24,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,5,305529974.5,128,2386952.93,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,6,313506179.5,128,2449267.03,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,7,310735420.5,128,2427620.47,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,8,316250376.5,128,2470706.07,13,3,0,1743762 +ConwayBenchmarks.Old,Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers,ConwayBenchmarks,Old,Job-ONJMYK,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,"Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3)",,1,Workload,Result,9,317038373.5,128,2476862.29,13,3,0,1743762 diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report-github.md b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report-github.md new file mode 100644 index 00000000..4884293f --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report-github.md @@ -0,0 +1,16 @@ +``` + +BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL +AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores +.NET SDK 9.0.102 + [Host] : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG + Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 + +IterationCount=10 MaxIterationCount=20 UnrollFactor=1 +WarmupCount=3 + +``` +| Method | Mean | Error | StdDev | Min | Max | Code Size | Gen0 | Gen1 | Allocated | +|------- |----------:|----------:|----------:|----------:|----------:|----------:|---------:|--------:|----------:| +| New | 0.8472 ms | 0.0178 ms | 0.0106 ms | 0.8293 ms | 0.8614 ms | 226 B | 66.4063 | 7.8125 | 1.1 MB | +| Old | 2.4368 ms | 0.0546 ms | 0.0325 ms | 2.3870 ms | 2.4769 ms | 226 B | 101.5625 | 23.4375 | 1.66 MB | diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.csv b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.csv new file mode 100644 index 00000000..d51b7a24 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.csv @@ -0,0 +1,3 @@ +Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Min,Max,Code Size,Gen0,Gen1,Allocated +New,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,0.8472 ms,0.0178 ms,0.0106 ms,0.8293 ms,0.8614 ms,226 B,66.4063,7.8125,1.1 MB +Old,Job-ONJMYK,False,Default,Default,Default,Default,Default,Default,11111111111111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,10,Default,Default,20,Default,Default,Default,Default,Default,1,3,2.4368 ms,0.0546 ms,0.0325 ms,2.3870 ms,2.4769 ms,226 B,101.5625,23.4375,1.66 MB diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.html b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.html new file mode 100644 index 00000000..0480a9d6 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.html @@ -0,0 +1,33 @@ + + + + +Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-20250220-033732 + + + + +

+BenchmarkDotNet v0.14.0, Ubuntu 24.04.1 LTS (Noble Numbat) WSL
+AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
+.NET SDK 9.0.102
+  [Host]     : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2 DEBUG
+  Job-ONJMYK : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2
+
+
IterationCount=10  MaxIterationCount=20  UnrollFactor=1  
+WarmupCount=3  
+
+ + + + + + +
MethodMeanErrorStdDevMinMaxCode SizeGen0Gen1Allocated
New0.8472 ms0.0178 ms0.0106 ms0.8293 ms0.8614 ms226 B66.40637.81251.1 MB
Old2.4368 ms0.0546 ms0.0325 ms2.3870 ms2.4769 ms226 B101.562523.43751.66 MB
+ + diff --git a/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.txt b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.txt new file mode 100644 index 00000000..024da84b --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/BenchmarkDotNet.Artifacts/results/Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers.ConwayBenchmarks-report.txt @@ -0,0 +1,323 @@ +*** ConwayBenchmarks.New: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 167357.00 ns, 167.3570 us/op +WorkloadJitting 1: 1 op, 57464575.00 ns, 57.4646 ms/op +WorkloadPilot 1: 4 op, 8208729.00 ns, 2.0522 ms/op +WorkloadPilot 2: 5 op, 9554098.00 ns, 1.9108 ms/op +WorkloadPilot 3: 6 op, 11812061.00 ns, 1.9687 ms/op +WorkloadPilot 4: 7 op, 14275719.00 ns, 2.0394 ms/op +WorkloadPilot 5: 8 op, 15858773.00 ns, 1.9823 ms/op +WorkloadPilot 6: 9 op, 17598518.00 ns, 1.9554 ms/op +WorkloadPilot 7: 10 op, 19663861.00 ns, 1.9664 ms/op +WorkloadPilot 8: 11 op, 20143168.00 ns, 1.8312 ms/op +WorkloadPilot 9: 12 op, 25003739.00 ns, 2.0836 ms/op +WorkloadPilot 10: 13 op, 30941047.00 ns, 2.3801 ms/op +WorkloadPilot 11: 14 op, 33188553.00 ns, 2.3706 ms/op +WorkloadPilot 12: 15 op, 33608905.00 ns, 2.2406 ms/op +WorkloadPilot 13: 16 op, 36291053.00 ns, 2.2682 ms/op +WorkloadPilot 14: 32 op, 71854151.00 ns, 2.2454 ms/op +WorkloadPilot 15: 64 op, 146093766.00 ns, 2.2827 ms/op +WorkloadPilot 16: 128 op, 285462772.00 ns, 2.2302 ms/op +WorkloadPilot 17: 256 op, 561511878.00 ns, 2.1934 ms/op +OverheadWarmup 1: 256 op, 1982.00 ns, 7.7422 ns/op +OverheadWarmup 2: 256 op, 1019.00 ns, 3.9805 ns/op +OverheadWarmup 3: 256 op, 812.00 ns, 3.1719 ns/op +OverheadWarmup 4: 256 op, 812.00 ns, 3.1719 ns/op +OverheadWarmup 5: 256 op, 858.00 ns, 3.3516 ns/op +OverheadWarmup 6: 256 op, 840.00 ns, 3.2813 ns/op +OverheadWarmup 7: 256 op, 859.00 ns, 3.3555 ns/op +OverheadActual 1: 256 op, 849.00 ns, 3.3164 ns/op +OverheadActual 2: 256 op, 849.00 ns, 3.3164 ns/op +OverheadActual 3: 256 op, 859.00 ns, 3.3555 ns/op +OverheadActual 4: 256 op, 840.00 ns, 3.2813 ns/op +OverheadActual 5: 256 op, 840.00 ns, 3.2813 ns/op +OverheadActual 6: 256 op, 849.00 ns, 3.3164 ns/op +OverheadActual 7: 256 op, 1010.00 ns, 3.9453 ns/op +OverheadActual 8: 256 op, 1227.00 ns, 4.7930 ns/op +OverheadActual 9: 256 op, 840.00 ns, 3.2813 ns/op +OverheadActual 10: 256 op, 840.00 ns, 3.2813 ns/op +OverheadActual 11: 256 op, 840.00 ns, 3.2813 ns/op +OverheadActual 12: 256 op, 802.00 ns, 3.1328 ns/op +OverheadActual 13: 256 op, 831.00 ns, 3.2461 ns/op +OverheadActual 14: 256 op, 1784.00 ns, 6.9688 ns/op +OverheadActual 15: 256 op, 935.00 ns, 3.6523 ns/op +WorkloadWarmup 1: 256 op, 387166465.00 ns, 1.5124 ms/op +WorkloadWarmup 2: 256 op, 275883910.00 ns, 1.0777 ms/op +WorkloadWarmup 3: 256 op, 220388714.00 ns, 860.8934 us/op +WorkloadActual 1: 256 op, 219762761.00 ns, 858.4483 us/op +WorkloadActual 2: 256 op, 220526439.00 ns, 861.4314 us/op +WorkloadActual 3: 256 op, 225244031.00 ns, 879.8595 us/op +WorkloadActual 4: 256 op, 215933487.00 ns, 843.4902 us/op +WorkloadActual 5: 256 op, 215869084.00 ns, 843.2386 us/op +WorkloadActual 6: 256 op, 217833845.00 ns, 850.9135 us/op +WorkloadActual 7: 256 op, 218569092.00 ns, 853.7855 us/op +WorkloadActual 8: 256 op, 217577252.00 ns, 849.9111 us/op +WorkloadActual 9: 256 op, 213661535.00 ns, 834.6154 us/op +WorkloadActual 10: 256 op, 212298441.00 ns, 829.2908 us/op +WorkloadResult 1: 256 op, 219761912.00 ns, 858.4450 us/op +WorkloadResult 2: 256 op, 220525590.00 ns, 861.4281 us/op +WorkloadResult 3: 256 op, 215932638.00 ns, 843.4869 us/op +WorkloadResult 4: 256 op, 215868235.00 ns, 843.2353 us/op +WorkloadResult 5: 256 op, 217832996.00 ns, 850.9101 us/op +WorkloadResult 6: 256 op, 218568243.00 ns, 853.7822 us/op +WorkloadResult 7: 256 op, 217576403.00 ns, 849.9078 us/op +WorkloadResult 8: 256 op, 213660686.00 ns, 834.6121 us/op +WorkloadResult 9: 256 op, 212297592.00 ns, 829.2875 us/op + +* Statistics for OverheadJitting +Mean = 167.357 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 167.357 μs, Q1 = 167.357 μs, Median = 167.357 μs, Q3 = 167.357 μs, Max = 167.357 μs +IQR = 0.000 μs, LowerFence = 167.357 μs, UpperFence = 167.357 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[167.357 μs ; 167.357 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 57.465 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 57.465 ms, Q1 = 57.465 ms, Median = 57.465 ms, Q3 = 57.465 ms, Max = 57.465 ms +IQR = 0.000 ms, LowerFence = 57.465 ms, UpperFence = 57.465 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[57.465 ms ; 57.465 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 2.118 ms, StdErr = 0.041 ms (1.94%), N = 17, StdDev = 0.169 ms +Min = 1.831 ms, Q1 = 1.969 ms, Median = 2.084 ms, Q3 = 2.245 ms, Max = 2.380 ms +IQR = 0.277 ms, LowerFence = 1.554 ms, UpperFence = 2.661 ms +ConfidenceInterval = [1.953 ms; 2.283 ms] (CI 99.9%), Margin = 0.165 ms (7.79% of Mean) +Skewness = 0.01, Kurtosis = 1.53, MValue = 3.5 +-------------------- Histogram -------------------- +[1.745 ms ; 1.911 ms) | @ +[1.911 ms ; 2.084 ms) | @@@@@@@@ +[2.084 ms ; 2.219 ms) | @ +[2.219 ms ; 2.392 ms) | @@@@@@@ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 4.008 ns, StdErr = 0.631 ns (15.75%), N = 7, StdDev = 1.670 ns +Min = 3.172 ns, Q1 = 3.227 ns, Median = 3.352 ns, Q3 = 3.668 ns, Max = 7.742 ns +IQR = 0.441 ns, LowerFence = 2.564 ns, UpperFence = 4.330 ns +ConfidenceInterval = [0.247 ns; 7.768 ns] (CI 99.9%), Margin = 3.761 ns (93.83% of Mean) +Skewness = 1.53, Kurtosis = 3.6, MValue = 2.4 +-------------------- Histogram -------------------- +[2.431 ns ; 4.722 ns) | @@@@@@ +[4.722 ns ; 6.597 ns) | +[6.597 ns ; 8.888 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 3.697 ns, StdErr = 0.257 ns (6.96%), N = 15, StdDev = 0.997 ns +Min = 3.133 ns, Q1 = 3.281 ns, Median = 3.316 ns, Q3 = 3.504 ns, Max = 6.969 ns +IQR = 0.223 ns, LowerFence = 2.947 ns, UpperFence = 3.838 ns +ConfidenceInterval = [2.631 ns; 4.762 ns] (CI 99.9%), Margin = 1.065 ns (28.82% of Mean) +Skewness = 2.39, Kurtosis = 7.87, MValue = 2.2 +-------------------- Histogram -------------------- +[3.009 ns ; 4.070 ns) | @@@@@@@@@@@@@ +[4.070 ns ; 5.323 ns) | @ +[5.323 ns ; 6.438 ns) | +[6.438 ns ; 7.499 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 1.150 ms, StdErr = 0.192 ms (16.65%), N = 3, StdDev = 0.332 ms +Min = 0.861 ms, Q1 = 0.969 ms, Median = 1.078 ms, Q3 = 1.295 ms, Max = 1.512 ms +IQR = 0.326 ms, LowerFence = 0.481 ms, UpperFence = 1.784 ms +ConfidenceInterval = [-4.902 ms; 7.203 ms] (CI 99.9%), Margin = 6.052 ms (526.16% of Mean) +Skewness = 0.21, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[0.667 ms ; 1.271 ms) | @@ +[1.271 ms ; 1.814 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 850.498 μs, StdErr = 4.546 μs (0.53%), N = 10, StdDev = 14.376 μs +Min = 829.291 μs, Q1 = 843.302 μs, Median = 850.412 μs, Q3 = 857.283 μs, Max = 879.859 μs +IQR = 13.981 μs, LowerFence = 822.330 μs, UpperFence = 878.254 μs +ConfidenceInterval = [828.764 μs; 872.233 μs] (CI 99.9%), Margin = 21.734 μs (2.56% of Mean) +Skewness = 0.43, Kurtosis = 2.42, MValue = 2 +-------------------- Histogram -------------------- +[823.195 μs ; 842.086 μs) | @@ +[842.086 μs ; 870.189 μs) | @@@@@@@ +[870.189 μs ; 888.617 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 847.233 μs, StdErr = 3.540 μs (0.42%), N = 9, StdDev = 10.619 μs +Min = 829.287 μs, Q1 = 843.235 μs, Median = 849.908 μs, Q3 = 853.782 μs, Max = 861.428 μs +IQR = 10.547 μs, LowerFence = 827.415 μs, UpperFence = 869.603 μs +ConfidenceInterval = [829.388 μs; 865.077 μs] (CI 99.9%), Margin = 17.845 μs (2.11% of Mean) +Skewness = -0.3, Kurtosis = 1.64, MValue = 2 +-------------------- Histogram -------------------- +[822.587 μs ; 840.024 μs) | @@ +[840.024 μs ; 868.129 μs) | @@@@@@@ +--------------------------------------------------- +*** ConwayBenchmarks.Old: Job-ONJMYK(IterationCount=10, MaxIterationCount=20, UnrollFactor=1, WarmupCount=3) *** +* Raw * +OverheadJitting 1: 1 op, 164129.00 ns, 164.1290 us/op +WorkloadJitting 1: 1 op, 297768794.00 ns, 297.7688 ms/op +WorkloadPilot 1: 4 op, 19516963.00 ns, 4.8792 ms/op +WorkloadPilot 2: 5 op, 23312264.00 ns, 4.6625 ms/op +WorkloadPilot 3: 6 op, 28386803.00 ns, 4.7311 ms/op +WorkloadPilot 4: 7 op, 35046885.00 ns, 5.0067 ms/op +WorkloadPilot 5: 8 op, 39167235.00 ns, 4.8959 ms/op +WorkloadPilot 6: 9 op, 42042038.00 ns, 4.6713 ms/op +WorkloadPilot 7: 10 op, 47554747.00 ns, 4.7555 ms/op +WorkloadPilot 8: 11 op, 53469267.00 ns, 4.8608 ms/op +WorkloadPilot 9: 12 op, 65118516.00 ns, 5.4265 ms/op +WorkloadPilot 10: 13 op, 68017620.00 ns, 5.2321 ms/op +WorkloadPilot 11: 14 op, 73407912.00 ns, 5.2434 ms/op +WorkloadPilot 12: 15 op, 82903439.00 ns, 5.5269 ms/op +WorkloadPilot 13: 16 op, 81385402.00 ns, 5.0866 ms/op +WorkloadPilot 14: 32 op, 159684747.00 ns, 4.9901 ms/op +WorkloadPilot 15: 64 op, 343571910.00 ns, 5.3683 ms/op +WorkloadPilot 16: 128 op, 666093066.00 ns, 5.2039 ms/op +OverheadWarmup 1: 128 op, 1917.00 ns, 14.9766 ns/op +OverheadWarmup 2: 128 op, 764.00 ns, 5.9688 ns/op +OverheadWarmup 3: 128 op, 720.00 ns, 5.6250 ns/op +OverheadWarmup 4: 128 op, 684.00 ns, 5.3438 ns/op +OverheadWarmup 5: 128 op, 549.00 ns, 4.2891 ns/op +OverheadWarmup 6: 128 op, 531.00 ns, 4.1484 ns/op +OverheadWarmup 7: 128 op, 567.00 ns, 4.4297 ns/op +OverheadWarmup 8: 128 op, 765.00 ns, 5.9766 ns/op +OverheadWarmup 9: 128 op, 621.00 ns, 4.8516 ns/op +OverheadWarmup 10: 128 op, 792.00 ns, 6.1875 ns/op +OverheadActual 1: 128 op, 702.00 ns, 5.4844 ns/op +OverheadActual 2: 128 op, 675.00 ns, 5.2734 ns/op +OverheadActual 3: 128 op, 756.00 ns, 5.9063 ns/op +OverheadActual 4: 128 op, 621.00 ns, 4.8516 ns/op +OverheadActual 5: 128 op, 666.00 ns, 5.2031 ns/op +OverheadActual 6: 128 op, 549.00 ns, 4.2891 ns/op +OverheadActual 7: 128 op, 567.00 ns, 4.4297 ns/op +OverheadActual 8: 128 op, 522.00 ns, 4.0781 ns/op +OverheadActual 9: 128 op, 1332.00 ns, 10.4063 ns/op +OverheadActual 10: 128 op, 819.00 ns, 6.3984 ns/op +OverheadActual 11: 128 op, 1764.00 ns, 13.7813 ns/op +OverheadActual 12: 128 op, 882.00 ns, 6.8906 ns/op +OverheadActual 13: 128 op, 648.00 ns, 5.0625 ns/op +OverheadActual 14: 128 op, 630.00 ns, 4.9219 ns/op +OverheadActual 15: 128 op, 675.00 ns, 5.2734 ns/op +OverheadActual 16: 128 op, 684.00 ns, 5.3438 ns/op +OverheadActual 17: 128 op, 702.00 ns, 5.4844 ns/op +OverheadActual 18: 128 op, 639.00 ns, 4.9922 ns/op +OverheadActual 19: 128 op, 657.00 ns, 5.1328 ns/op +OverheadActual 20: 128 op, 639.00 ns, 4.9922 ns/op +WorkloadWarmup 1: 128 op, 602271724.00 ns, 4.7052 ms/op +WorkloadWarmup 2: 128 op, 467584958.00 ns, 3.6530 ms/op +WorkloadWarmup 3: 128 op, 360791232.00 ns, 2.8187 ms/op +WorkloadActual 1: 128 op, 315093565.00 ns, 2.4617 ms/op +WorkloadActual 2: 128 op, 313649312.00 ns, 2.4504 ms/op +WorkloadActual 3: 128 op, 307707877.00 ns, 2.4040 ms/op +WorkloadActual 4: 128 op, 307711293.00 ns, 2.4040 ms/op +WorkloadActual 5: 128 op, 305530645.00 ns, 2.3870 ms/op +WorkloadActual 6: 128 op, 357075928.00 ns, 2.7897 ms/op +WorkloadActual 7: 128 op, 313506850.00 ns, 2.4493 ms/op +WorkloadActual 8: 128 op, 310736091.00 ns, 2.4276 ms/op +WorkloadActual 9: 128 op, 316251047.00 ns, 2.4707 ms/op +WorkloadActual 10: 128 op, 317039044.00 ns, 2.4769 ms/op +WorkloadResult 1: 128 op, 315092894.50 ns, 2.4617 ms/op +WorkloadResult 2: 128 op, 313648641.50 ns, 2.4504 ms/op +WorkloadResult 3: 128 op, 307707206.50 ns, 2.4040 ms/op +WorkloadResult 4: 128 op, 307710622.50 ns, 2.4040 ms/op +WorkloadResult 5: 128 op, 305529974.50 ns, 2.3870 ms/op +WorkloadResult 6: 128 op, 313506179.50 ns, 2.4493 ms/op +WorkloadResult 7: 128 op, 310735420.50 ns, 2.4276 ms/op +WorkloadResult 8: 128 op, 316250376.50 ns, 2.4707 ms/op +WorkloadResult 9: 128 op, 317038373.50 ns, 2.4769 ms/op + +* Statistics for OverheadJitting +Mean = 164.129 μs, StdErr = 0.000 μs (0.00%), N = 1, StdDev = 0.000 μs +Min = 164.129 μs, Q1 = 164.129 μs, Median = 164.129 μs, Q3 = 164.129 μs, Max = 164.129 μs +IQR = 0.000 μs, LowerFence = 164.129 μs, UpperFence = 164.129 μs +ConfidenceInterval = [NaN μs; NaN μs] (CI 99.9%), Margin = NaN μs (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[164.129 μs ; 164.130 μs) | @ +--------------------------------------------------- + +* Statistics for WorkloadJitting +Mean = 297.769 ms, StdErr = 0.000 ms (0.00%), N = 1, StdDev = 0.000 ms +Min = 297.769 ms, Q1 = 297.769 ms, Median = 297.769 ms, Q3 = 297.769 ms, Max = 297.769 ms +IQR = 0.000 ms, LowerFence = 297.769 ms, UpperFence = 297.769 ms +ConfidenceInterval = [NaN ms; NaN ms] (CI 99.9%), Margin = NaN ms (NaN% of Mean) +Skewness = NaN, Kurtosis = NaN, MValue = 2 +-------------------- Histogram -------------------- +[297.769 ms ; 297.769 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadPilot +Mean = 5.034 ms, StdErr = 0.069 ms (1.37%), N = 16, StdDev = 0.275 ms +Min = 4.662 ms, Q1 = 4.835 ms, Median = 4.998 ms, Q3 = 5.235 ms, Max = 5.527 ms +IQR = 0.400 ms, LowerFence = 4.234 ms, UpperFence = 5.836 ms +ConfidenceInterval = [4.753 ms; 5.314 ms] (CI 99.9%), Margin = 0.280 ms (5.57% of Mean) +Skewness = 0.24, Kurtosis = 1.65, MValue = 2 +-------------------- Histogram -------------------- +[4.636 ms ; 4.923 ms) | @@@@@@@ +[4.923 ms ; 5.260 ms) | @@@@@@ +[5.260 ms ; 5.591 ms) | @@@ +--------------------------------------------------- + +* Statistics for OverheadWarmup +Mean = 6.180 ns, StdErr = 1.006 ns (16.27%), N = 10, StdDev = 3.180 ns +Min = 4.148 ns, Q1 = 4.535 ns, Median = 5.484 ns, Q3 = 5.975 ns, Max = 14.977 ns +IQR = 1.439 ns, LowerFence = 2.376 ns, UpperFence = 8.134 ns +ConfidenceInterval = [1.372 ns; 10.987 ns] (CI 99.9%), Margin = 4.808 ns (77.80% of Mean) +Skewness = 2.04, Kurtosis = 5.9, MValue = 2 +-------------------- Histogram -------------------- +[ 3.231 ns ; 7.105 ns) | @@@@@@@@@ +[ 7.105 ns ; 10.980 ns) | +[10.980 ns ; 13.039 ns) | +[13.039 ns ; 16.914 ns) | @ +--------------------------------------------------- + +* Statistics for OverheadActual +Mean = 5.910 ns, StdErr = 0.510 ns (8.62%), N = 20, StdDev = 2.279 ns +Min = 4.078 ns, Q1 = 4.975 ns, Median = 5.238 ns, Q3 = 5.590 ns, Max = 13.781 ns +IQR = 0.615 ns, LowerFence = 4.052 ns, UpperFence = 6.513 ns +ConfidenceInterval = [3.931 ns; 7.888 ns] (CI 99.9%), Margin = 1.979 ns (33.48% of Mean) +Skewness = 2.37, Kurtosis = 7.93, MValue = 2.73 +-------------------- Histogram -------------------- +[ 3.890 ns ; 6.094 ns) | @@@@@@@@@@@@@@@@ +[ 6.094 ns ; 7.746 ns) | @@ +[ 7.746 ns ; 9.305 ns) | +[ 9.305 ns ; 11.508 ns) | @ +[11.508 ns ; 12.680 ns) | +[12.680 ns ; 14.883 ns) | @ +--------------------------------------------------- + +* Statistics for WorkloadWarmup +Mean = 3.726 ms, StdErr = 0.546 ms (14.65%), N = 3, StdDev = 0.945 ms +Min = 2.819 ms, Q1 = 3.236 ms, Median = 3.653 ms, Q3 = 4.179 ms, Max = 4.705 ms +IQR = 0.943 ms, LowerFence = 1.821 ms, UpperFence = 5.594 ms +ConfidenceInterval = [-13.522 ms; 20.973 ms] (CI 99.9%), Margin = 17.247 ms (462.93% of Mean) +Skewness = 0.08, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[2.376 ms ; 4.096 ms) | @@ +[4.096 ms ; 5.566 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadActual +Mean = 2.472 ms, StdErr = 0.037 ms (1.48%), N = 10, StdDev = 0.116 ms +Min = 2.387 ms, Q1 = 2.410 ms, Median = 2.450 ms, Q3 = 2.468 ms, Max = 2.790 ms +IQR = 0.059 ms, LowerFence = 2.322 ms, UpperFence = 2.556 ms +ConfidenceInterval = [2.297 ms; 2.647 ms] (CI 99.9%), Margin = 0.175 ms (7.08% of Mean) +Skewness = 1.98, Kurtosis = 5.73, MValue = 2 +-------------------- Histogram -------------------- +[2.361 ms ; 2.502 ms) | @@@@@@@@@ +[2.502 ms ; 2.643 ms) | +[2.643 ms ; 2.719 ms) | +[2.719 ms ; 2.860 ms) | @ +--------------------------------------------------- + +* Statistics for WorkloadResult +Mean = 2.437 ms, StdErr = 0.011 ms (0.44%), N = 9, StdDev = 0.032 ms +Min = 2.387 ms, Q1 = 2.404 ms, Median = 2.449 ms, Q3 = 2.462 ms, Max = 2.477 ms +IQR = 0.058 ms, LowerFence = 2.317 ms, UpperFence = 2.548 ms +ConfidenceInterval = [2.382 ms; 2.491 ms] (CI 99.9%), Margin = 0.055 ms (2.24% of Mean) +Skewness = -0.24, Kurtosis = 1.28, MValue = 2 +-------------------- Histogram -------------------- +[2.383 ms ; 2.488 ms) | @@@@@@@@@ +--------------------------------------------------- diff --git a/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/AlonzoBenchmarks.cs b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/AlonzoBenchmarks.cs new file mode 100644 index 00000000..b0e182bc --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/AlonzoBenchmarks.cs @@ -0,0 +1,47 @@ +extern alias Old; +extern alias New; + +using BenchmarkDotNet.Attributes; +using NewSerializer = New::Chrysalis.Cbor.Serialization.CborSerializer; +using OldSerializer = Old::Chrysalis.Cbor.Converters.CborSerializer; +using NewBlock = New::Chrysalis.Cbor.Cardano.Types.Block.AlonzoCompatibleBlock; +using OldBlock = Old::Chrysalis.Cardano.Core.Types.Block.AlonzoCompatibleBlock; + +namespace Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers; + +public class AlonzoBenchmarks +{ + private const int CONCURRENCY_LEVEL = 2; + private const int ITERATIONS_PER_TASK = 2; + + private readonly string _block = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "data", "alonzo_block.cbor")); + + [Benchmark] + public async Task New() + { + byte[] cborBytes = Convert.FromHexString(_block); + + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + NewSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } + + [Benchmark] + public async Task Old() + { + byte[] cborBytes = Convert.FromHexString(_block); + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + OldSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/AlonzoDuplicateKeyBenchmarks.cs b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/AlonzoDuplicateKeyBenchmarks.cs new file mode 100644 index 00000000..8bcb16a1 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/AlonzoDuplicateKeyBenchmarks.cs @@ -0,0 +1,47 @@ +extern alias Old; +extern alias New; + +using BenchmarkDotNet.Attributes; +using NewSerializer = New::Chrysalis.Cbor.Serialization.CborSerializer; +using OldSerializer = Old::Chrysalis.Cbor.Converters.CborSerializer; +using NewBlock = New::Chrysalis.Cbor.Cardano.Types.Block.AlonzoCompatibleBlock; +using OldBlock = Old::Chrysalis.Cardano.Core.Types.Block.AlonzoCompatibleBlock; + +namespace Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers; + +public class AlonzoDuplicateKeyBenchmarks +{ + private const int CONCURRENCY_LEVEL = 2; + private const int ITERATIONS_PER_TASK = 2; + + private readonly string _block = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "data", "alonzo_with_duplicate_key_block.cbor")); + + [Benchmark] + public async Task New() + { + byte[] cborBytes = Convert.FromHexString(_block); + + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + NewSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } + + [Benchmark] + public async Task Old() + { + byte[] cborBytes = Convert.FromHexString(_block); + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + OldSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/BabbageBenchmarks.cs b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/BabbageBenchmarks.cs new file mode 100644 index 00000000..c31c20d8 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/BabbageBenchmarks.cs @@ -0,0 +1,47 @@ +extern alias Old; +extern alias New; + +using BenchmarkDotNet.Attributes; +using NewSerializer = New::Chrysalis.Cbor.Serialization.CborSerializer; +using OldSerializer = Old::Chrysalis.Cbor.Converters.CborSerializer; +using NewBlock = New::Chrysalis.Cbor.Cardano.Types.Block.BabbageBlock; +using OldBlock = Old::Chrysalis.Cardano.Core.Types.Block.BabbageBlock; + +namespace Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers; + +public class BabbageBenchmarks +{ + private const int CONCURRENCY_LEVEL = 2; + private const int ITERATIONS_PER_TASK = 2; + + private readonly string _block = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "data", "babbage_block.cbor")); + + [Benchmark] + public async Task New() + { + byte[] cborBytes = Convert.FromHexString(_block); + + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + NewSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } + + [Benchmark] + public async Task Old() + { + byte[] cborBytes = Convert.FromHexString(_block); + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + OldSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/ConwayBenchmarks.cs b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/ConwayBenchmarks.cs new file mode 100644 index 00000000..3f1cb912 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/Benchmarks/Deserializers/ConwayBenchmarks.cs @@ -0,0 +1,47 @@ +extern alias Old; +extern alias New; + +using BenchmarkDotNet.Attributes; +using NewSerializer = New::Chrysalis.Cbor.Serialization.CborSerializer; +using OldSerializer = Old::Chrysalis.Cbor.Converters.CborSerializer; +using NewBlock = New::Chrysalis.Cbor.Cardano.Types.Block.ConwayBlock; +using OldBlock = Old::Chrysalis.Cardano.Core.Types.Block.ConwayBlock; + +namespace Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers; + +public class ConwayBenchmarks +{ + private const int CONCURRENCY_LEVEL = 2; + private const int ITERATIONS_PER_TASK = 2; + + private readonly string _block = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "data", "conway_block.cbor")); + + [Benchmark] + public async Task New() + { + byte[] cborBytes = Convert.FromHexString(_block); + + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + NewSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } + + [Benchmark] + public async Task Old() + { + byte[] cborBytes = Convert.FromHexString(_block); + + IEnumerable tasks = [.. Enumerable.Range(0, CONCURRENCY_LEVEL).Select(_ => Task.Run(() => + { + for (int i = 0; i < ITERATIONS_PER_TASK; i++) + OldSerializer.Deserialize(cborBytes); + }))]; + + await Task.WhenAll(tasks); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Benchmark/Chrysalis.Cbor.Benchmark.csproj b/src/Chrysalis.Cbor.Benchmark/Chrysalis.Cbor.Benchmark.csproj new file mode 100644 index 00000000..e94af2ad --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/Chrysalis.Cbor.Benchmark.csproj @@ -0,0 +1,25 @@ + + + + Exe + net9.0 + enable + enable + + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/src/Chrysalis.Cbor.Benchmark/Program.cs b/src/Chrysalis.Cbor.Benchmark/Program.cs new file mode 100644 index 00000000..6769b225 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/Program.cs @@ -0,0 +1,30 @@ +using BenchmarkDotNet.Columns; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Exporters; +using BenchmarkDotNet.Jobs; +using BenchmarkDotNet.Reports; +using BenchmarkDotNet.Running; +using Chrysalis.Cbor.Benchmark.Benchmarks.Deserializers; +using Perfolizer.Horology; + +var config = DefaultConfig.Instance + .AddExporter(RPlotExporter.Default) + .AddExporter(PlainExporter.Default) + .AddColumn(StatisticColumn.Min) + .AddColumn(StatisticColumn.Max) + .WithSummaryStyle(SummaryStyle.Default.WithTimeUnit(TimeUnit.Millisecond)) + .WithOptions(ConfigOptions.DisableOptimizationsValidator) + .AddDiagnoser(MemoryDiagnoser.Default) // For memory allocation measurements + .AddDiagnoser(new DisassemblyDiagnoser(new DisassemblyDiagnoserConfig())) + .AddJob(Job.Default + .WithWarmupCount(3) + .WithIterationCount(10) + .WithMaxIterationCount(20) + .WithUnrollFactor(1) + ); + +BenchmarkRunner.Run(config); +BenchmarkRunner.Run(config); +BenchmarkRunner.Run(config); +BenchmarkRunner.Run(config); diff --git a/src/Chrysalis.Cbor.Benchmark/data/alonzo_block.cbor b/src/Chrysalis.Cbor.Benchmark/data/alonzo_block.cbor new file mode 100644 index 00000000..c69748d9 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/data/alonzo_block.cbor @@ -0,0 +1 @@ +84828f1a005904061a01e4f6a5582021c3111a9a7bc94c4473232472fc13cdc2d28ffdd23d9ed7b717eafcaf3cfebd58202f3cc6c3b7f0e0c9ded59042ed973ac7aa4031167f0943c36d33bdf9bce73df15820d31eef88456a81532b2e3542edc12efefb74ad83c60d60448b70f3b0c285b885825840d9921e2e598048e8af42cce072c6e74d22dc0064e94c1b32115ea494065135b167fef63ccb12c5940eae27c726a68dc92db5f473b26a446ca495e23a4d3105b058501273dd72bc5091c6b7c34563576d011a5f61033211ea2ff0cc1976df837898d2084ed7f6f0284bc368b304fccef948c87b536db46af1e47141070fba9ba4788cb9bcaa9726f685ca4a953379c5e4f80d8258400006925d0fcc5b11fcf3d6303510b705e704ef5c1cd71bee6feb58f0895b2feaae9c843966b5e769f74b7937154ae767986ca553110dcff8b69c05961095656058508bd080d854b522a284d558adbd4516909c9ad7bb105bacd150f15c35aa82e2139aa8260a93a0e80287579fe46dd1c16577195d0aa5c861f4af85bed4b69c423587b191346e9a684781555e34a7c91b091924a85820df0c914fe93ecc076b9fa077390a4cd3ecf0413e5f71b88801cdd4d292b169be58208e825442eb570280bbcd1b554cc293231a7872bb05b3cc6ed2d16db6204b14ae0618c75840e7694afdec5e9edd646e5f5bc78362c1b079d0d62ef2c20f94b861cb8792222a3d98ac0fa94152e40a4f78a7bdab89b9c338e2da837725f3f0e4e4b6d67d890b04005901c0cf880816e236766340725d07aa598ebc56b7999a5d2dff8be576bb8c06ff66a5027c1cfda2b0b1c8e32413edd5e592b9adc9e74fcfd2017afe2fe98d1455b4098a0c89711bd71afb2f5e10a1265768f2c84d98d6acd1cf052bcc616a0255e0b867766a7723e99955687dd389c7864394ae1400836d9c38ac1fd467db5e9c11bb1dc787e0eee92473b93b48b09eaaa6d3a160d869895e37c300c2583161878aad6b06c0fe46e0b0d28fa1028047874ff4e70d23c5f453e4687b658311c42640ab8e6a1bdd02719ae72feb428627fed163b58c33f8a7d56ad0945009abb8253beb5e5dff60cf9afc15c910962fe4c34480f06fb8950afdbdde8281b1140e5e3265aca7020a3e3fd0aeaacb75fc9f933737f233cde6c03a7eb92742e028bbecc40969e0b68f08e53bd39362cb9d4226014c2ad89d425c754c1abb11ea9a54480aa4bcfe57ad62b77903cd90eb8e3374f40a7a11beda3c76c9cda5bb05ac5f00f0f868f07eaf1b1a9f5dde8ea19284caeec8e0f4d3cb9e14a676cf1f79adb31428bc910468877a200bd233e78b367b5ee667c29c2a0caeaa3936955e997bb02637975b47b75a0fae0bbe874d16fea05dfaecd87c9870bfce0d4ce1dab6320fed49da8da600818258206384be115440a4398bee154a03b0660cde77866ee87d668213242d8e52f813b300018282581d61b09810bf167ee557da7955bc8135b0a9c9e51fad323acc4b6841abd31b0000000107828e7582583901f0ba8e195c38a3be42b81959060f5e6a9a0cd3d328d8195bbbd7b1990e49deba7d017723225dc1779de91e4d19038609d69c6ab6f684ed0b821a001e8480a1581cb7ef0cfb14f588740d02ce8a53879ff96ab03c7b21ec1c459ac2bddaa15048617368477561726469616e3137333201021a00031a21031a02dc6c00075820449031012be3ce0052199538f0c2db90726f8d36eb11b00db6b510a8c9243cd609a1581cb7ef0cfb14f588740d02ce8a53879ff96ab03c7b21ec1c459ac2bddaa15048617368477561726469616e3137333201a4008182582005f2aef69abfcf78a67779b6e6b0cbc5592724fc53ee6ea0b8f4649eb9bca73000018282583901d5645f643be8735fb35c85c220c5bf521411a310bda81b4208462c3357de49b84973da8064a5867c2ea82a60abb7a010ff88b9e59fadfc221a003d090082581d61d91ef01b73f3010bb173945cf5417257c00c002715a13052015ab54f1a5b4d3873021a00029cd5031a01e4f753a400818258208760b7bb6c2f9c5cc340cd2c62ec3ab27b40777cb079e1b7fe01fe6123dee58501018282581d615fc1436b582a50ff4c5fdbf7e20942bdd45eb3aeaa7abdf442a6a34a1a1dc1b06c82582b82d818582183581c05b073f36ee030589a31148838cd47e8d8c8f82fec9fe091c7d53cd8a0001a0c5f26b11b0000000b9eaf4d11021a00034059031a01e4f7dda400838258209d9c7d4ea2dfbc730fe955b7c0b684123ed86f0054b7dc943727ac7bc7c2c7d200825820190a4421872e886d45325b1c2bbef914d98f11522ea81ed92a8839a87ad9a4b80182582005ede2bc0420a37dec63e032603b03e4a365831e5671aaada2ba6344c0234a7d010182825839010421800176834399c971e71972d5c85d1b45ee9c71242b6fc25cb84dcb4023d8148d86a8072f39cdb21628f2691e7a89f38ed158aa5d27bd1a3b9aca0082581d616904e8b2c26f3dda6c4a5db4b3ec9e31d581c9960977cfe9c6917a431a1c5f0591021a0002e195031a01e4f753a60081825820bdb86187627fde6eee1601c88a792cb9f3a459f6cab26ab281362f9751f0ae4900018182581d61d80fe69ded1ff90f41e526d0332a2ff98ba8a0d85ceb8941b51784201a05f11c47021a0004c4b9031a01e63c82048182068200bf8200581c001ec42376196df0b85b6ad660e7419e77b51b16fda8b931d559562e1a01f9d2708200581c0122c6ccb1533c9992ff08a9029b7b5a016d5c08d31a4963cd027afc1a012661c28200581c01fad190adc72e0884adb77aa72ef9d95d3adb75f782bad63b53a5b71a02c7c0c48200581c0a57686dc0d73abbf6ba8d1310dcf6887b2daa4693d94bc170fc08551a00ecbf328200581c1176b053d803161ca3ac7295f5ea78171b91650dc558d852e4547b601a0008ab5e8200581c125fa8bc3a9acda7a2e3646d6ecfaea925758378ad18011ef7164f461a05bb79a68200581c153d28771d39b9852db013519d4ac5542f6e7ff61c5b5327a129d7681a001ac34e8200581c158cfda322ce2afdebefdf65f9cf1bc671472a470552ee2f55c8837a1a0091b6e68200581c199231d9529171c85390273df7dc21d787883ab3cde9f8ebae107a891a0124b99e8200581c2142e4997ca5f537199575019d277554c0aa14841af61d275978a4dc1a0004dda68200581c22f8366b4ec72f3c0be8b13a2f1360426229f44db187d0534e68c7141a002359898200581c24f1b3791037e55363815fc4b788b886cd1d82a2f2d39e17196cd1a41a001663a58200581c27f1b09428918e1454bf6e7c6cb88e3444f6e6a73f5d0ee644174d491a004b24038200581c350d09ffe65fec05b5cfea6672a16711ed3266ae608cdc6c4a75bae71a04c71cb38200581c3c775aaea2b5571a7f930c0375255d05f21deb42605ee66fd88ca3961a051bb2108200581c417e75dd8b721053008dc50169b08a8c5070db24718e6c1e8b83a0c81a0187281d8200581c42ad1acfc4e58c415d9c410de920c763c006392d7fa69b9a09986b101a2cb1e7d68200581c43a85f2839f1df18abfc04d12a55ec6eefb96f85d1c96236eba8159e19232b8200581c45aaea6b8f8056eb52b26c4115026452bfa4e4cf33a931b0eb85f9711a04ce773c8200581c45b6ff95bf046f3ed0a047e6968e1374d67aa39354965688952fd2171a079227888200581c460417506c1a3042e133cdef4a7dabdd02bda35c14eb43cce13516841903f98200581c46679d60511973cd756322e6fdd1b0d6224eebec681f065a704e753e1a0195a52d8200581c4697386c4e3dc2b43f49564e6361935280f1f751c80a6c9cadbfb33b1a0c85fe408200581c46a31eb43ac7d42255b74f24945badfc5da0014a2e37e6bcb69ce4d91a08b943518200581c4a8b1947b2cf3acdc443a89022a453683c783bf864f8b07a59d943671b000000012bad4bcd8200581c4e049d9d384b6795237264bb400d0174a4c6dc808bdfd70ee692ad2c1a0374aaf08200581c52662fdac99229b8f9682f47c2d3ba181f33e79b429a2a08d0f54d091a0064f8398200581c52f28ebdf268ae3eef783dcac001657502d8fccafa9d8158493f65331a0010daa88200581c59cc53d2aaed4384323b2358333fd607ed9928064b10459af4ec59771a07937e108200581c6877dcb866858b2a4941351c98cd67202262bfd82a016cbbaa0739271b0000011a95bafbed8200581c6cb47c86575faca5f0c555f30b5c45f291aa5d6eeb28d7eed82178491a0048d0198200581c6eab73f5febbfc54243d035bd3df1986a6b88149f6c8178b341dfbc01a00c1e5c38200581c73d2af07d180c46a40ea6f63a04a947588033a401706bc80f72037e51a09017b278200581c745f6af3a90cf0f2bb23f8ab3ae3978ced39a56b31cfacc6b746258b1a01749d798200581c785f7b5357d18f1a887f5b1e114b96071ccccbff253e4b6b01574ae91a0116eac48200581c7ff0ce382f9fc3f12bc0d23749a7d6690b5bca1521a1c83cb78b5e211a0311471d8200581c83b2f390520f69d98a374e391a48da191418e10be9e1f33583ab51771a00945ab98200581c8723dba003e8c3b8d31e20f92d1cab0952b67d4405f64b5957f790c01a00bb80bd8200581c876c8abaa636168c7d43623be103c6bfffcfb0337c05ffd1a7ea72e51b0000000150dda2428200581c98f137b818ec3c13cb9fa89e116af481bc6e80879de23450e714c0f21a00e21bcc8200581c9d6b6319e2e79b0ea46f3a6ed27414ca9563f2fdc1969fd12751ad941a0078fb848200581ca545012a07d0fe8a284fd159753857d3b7ca1f8bfd6a389b0086c73b1a0c64df948200581caaab46ce0889442fe83e74489970ef6337721fe8761478825ec7701e1a16dd0fe38200581cb3877745120a10b5e302cc27303e91fe2a387dcb189a74aacb6493d81a050db0c18200581cbc000424731d5cfdb41da8bbb2e8bfbdcf05becd055a3f831a0ccdfa1a0b46a4c98200581cbfb28b26bc5e5c844e8322889cdb801fbbf0d00a2bfebb67c05367b0192a688200581cc127f4d4d4d729b3a8ba129764c366c7a96c99080546d41f3b18a51b1b000000026b353c4a8200581ccd38f8c900b24bdb5b0d9808b3b781f2c63639ddfe56407291448ced1a009923c88200581cd72821377163a04744a937d9c883ad37f835d53d010377c405a3a76f1a00c6f0ed8200581cdb0de66e9113e8ddecc3642124a557fe0d7753d642162cc1ec85292c1a00b505898200581ce10b3c4fd7b13a5d3b03d0f8f5dac81823e7e25c521b9535eb99f8221a000df4958200581cefb8d63c37774aee85b731f53300e920d0cdfc2fb5e84f6a0ebe678f1969978200581cf1ad22aeae767f9fffccc3c14c271e893c5479bee5e59e673a5ecaed1978008200581cf469490ab5e6ec3f7889b29759e4a40b473c02da521547b1c3027e0f1a00157e568200581cf51bd635bddf367cf9ffc0726f0c492cde7a1b1640c1727d54a7446d1a02d80dda8200581cf8b0dada0c9d9ffeee95d7f536799a4034886e6d60a7367f81948a021a018065828200581cfc19a4302b9fe7b337e6f5a767efc5c875cd874768a19b0c535b9b8c1a000bc7f28200581cfe49dc3325b96a75c098406c0063e9560fc903df998d2b14736f9f2e1a00fb0f8d8200581cfef6bdfbf412da5de3c8d5aa4d9b1e30eef8c44be91b1eeb3afb279a1a0059dfbe8200581cff7893d54dfceeff87c5f298ed1bb1435878ce694a3884eb6619f2b71a013581d3ff07582099f2c2a11bb310d2fc48d394b0946f10eeb0c97614f29d4e23d26694d9212bc7a5008282582045cae0be92fc3798cd1ce05496bc1439728d42f9a8262cc34d7f543f7f5a8c8f01825820fbde6fe2ab20d17e7701a277e3f6f9c426278155ea9b66d58b8b1ad0c9e1bc261841018282583901f33a98483aa3f8e7968b444a5e3dc00e1adea6bcea66b57ed0e94094e512e0225710f61b5cc54df075c02d8b8a56a9a50ae78f5cff08672b1a000f4240825839018ea03c582adafe939362748a746af8cc5956265a1bd725e7a2de86d0e512e0225710f61b5cc54df075c02d8b8a56a9a50ae78f5cff08672b1ab2c6b355021a0002d115031a01e512b70758207bd96a772eadcede1be69dbf670e089a9c84d894b706f6af2e30e238b70bc3fda500818258207da8e470075fad15fdc1e6491c6243f227c8293b45d0bd851701f2ea452bcf9f010181825839015f55d092a48e116c8de09bb9f98b37e76ab59c7459d03d47f8fb60c1e638092504459177f7ca7d69ff356f28abf49805b99265f14aebaebf1a1fdcc802021a0002ab9d031a01e512a9075820f95046da8aee6914b6f42e6fd50a38c17730e8880cfaac5cee91347474280c6aa60081825820a01b9fe136e5703668c9c7776a76cc8541b84824635d237e270670a8ca56a39200018182581d61d80fe69ded1ff90f41e526d0332a2ff98ba8a0d85ceb8941b51784201a05739382021a000376c5031a01e63c82048582068200a48200581c0af10f4a5d365af01f0ca7651713a8a073263b61bbd1f69623097bd71a0fca5cf98200581c14bb4165052cb5bd0ca51869db388610c9ee92ca67e44a239759d0591a04c796e88200581c854139fc8987990fd89699beb1b59b09c047ace356870dcaadc93b221a0052a2268200581cd5b9ca34735343fcfc01d804180c8cfd20c45df317c44dec278ecdf61a0123a66f82008200581c0af10f4a5d365af01f0ca7651713a8a073263b61bbd1f69623097bd782008200581c14bb4165052cb5bd0ca51869db388610c9ee92ca67e44a239759d05982008200581c854139fc8987990fd89699beb1b59b09c047ace356870dcaadc93b2282008200581cd5b9ca34735343fcfc01d804180c8cfd20c45df317c44dec278ecdf607582099f2c2a11bb310d2fc48d394b0946f10eeb0c97614f29d4e23d26694d9212bc7a50081825820269fb6b97199568fd06b86c6dd8270f83150d7d40c215f2ba8f8e457d7bb245000018282583901c6c9a751f0eab448ae680c7606bf4b2384ae9a71295cfb08c17a64ec8603a5a749947b55e82c3ca023c427efed03380884e489835d5bed691a000f424082583901c070231d446324730fde9452e04796492b1929b9673145d01ca9d5458603a5a749947b55e82c3ca023c427efed03380884e489835d5bed691a60e37dc7021a0002b8d9031a01e512be07582070830ca599509b5c16e2ade57f1940041d44cb4261670d2e354199164d112e12a40081825820c0f8e704ffc3d13ba2e4d09a4919f32ae6fcee035b6fda43eb9e9ca17ccd8a4f010181825839012e38ef6f6dae9baa3fa9b2acd8fc2c4f107d7434e51525a00adf110e8a2cf13c17ac2bb9b259e319f57313cecf912ccc0a9e0c8e2f3b9a91821a001c1f69a2581c21514b6c51f0aaa0c9c337329ce93c52fad208cfd0b4ccd51074d9dca14e50494e4b44494e4f43344944353401581cd5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cca14c53706163654275643137303201021a0002964d031a01e512aea4008182582071149f420d83e79cb197334a53498459bb212088f8ec2d173f5c87a83122dc9401018282582b82d818582183581cc0f1996bab57bd968f3cb5f6c52b0b7f3b37a937661d9a3440a7c517a0001ae951ab841b0000002e90edd00082582b82d818582183581cef15b91c9a8943935b925f188ae69d93b1fb3778287e0df8ebad82e8a0001ad69ba11a1b0000003ec066bc87021a0002a3b5031a01e5127ba40081825820697eb1e4e80920aa55dff603bf7e8df6d315e6fd621c99001a25862080a443f501018282583901fe196271973f89a9abb453c5f44581d3cab2ad3dae125f23c65b481caecbe3dc3fa606f16069de1d7013317100de7f2fee422c613712f3251a26def39782581d616904e8b2c26f3dda6c4a5db4b3ec9e31d581c9960977cfe9c6917a431a23b2abff021a00029cd5031a01e4f753a500818258204f00b22bf5e786cea6dcbed8740eda5a7dd26a88ee920674a01e032e56865d7a00018182583901f18d6a760e1b546680e78e4ec2b63c0f625f085b8925ff1ae40f5480973a4d96aa61a3b3af82dbdbfd15d5998f49fca582f4c617103b6fd71a8acad8f6021a0002b104031a01e5045d048183028200581c973a4d96aa61a3b3af82dbdbfd15d5998f49fca582f4c617103b6fd7581cafb33d38e92e03f9ce86f0175cc33e487b8def0ee25235f1e40183d18da2008282582014117c01278cbe88656a15738fa5e01ef899cf23c425ac3ace6c7042a48cf5b0584092bc3b8ba635ad72fb2cd1ef9b904d0651efe9adc5e8d4dda2063e4f9c8e780e3801524b7b047832db5875237751f51492fef8867dd9fa4ed5d9535713d41b008258207e80cc664e8e06f09351542237eba50a14083803f5d71e46d199046ab6d10ca858404854b2990692d016989742b78a0b51823671d7c09f36dc72f748613cca53f4d0b1084bb8ef4ec981bd063be93e1042038da84db130db8c1d41d257cdba27900001818201828200581c43475dd8f7ff3f4bffb1c0675d7e380b6fc4cd01fe4cc6ab6dc799fd82051a02dc6c00a10081825820991fc8c992024656460d6be0ac794b60050a66eeb8c1a673cb3f6cd476aea60958403171975fb103dea7995f85559fd74d4af4eedb58d4f602b62463052a75a541f952414e532562576893a797ee568e21a6ff5211a206313458491f6a18c94cf40ea10281845820f129f07bbfd87fd1d3ff5fb32e9a5566e02208f89518e9994048add22074f4335840faee03bae826b0b75f9b5ac383100098ade25e92b52c77804e9297321c564416efe7543a823d4fe14f4e94cc2f3f6351062775fb0ed002f04cc4825f24ba610f5820424e682a392581268c7544e34e9c54378a8820bdcf7dddce30490bbb2d363b4b41a0a1008282582073099bfb77940ff95733beca81b062d2355c5938e8c0931444b10af9facbf66f5840bab8e6f8412bea5e8ff61f5d0690043013dd4a14c582f0a23572dd444f797d271ed61017a5b5d7632fef01312c5251daa8dfd1bba2e0737808a18fe9d90ac109825820393b3d3cab6be0897cbc87143cc3a24825dc1d8249df4d37969502931cf856ff5840a96042cae910c15af4d7fdef81172665d5e9ebfbee7f965621859ff06128fe350b8d717fff9109fa9007208cc822ca34b42362d9f46f3e9e067779b2cd0c5309a1008882582061261a95b7613ee6bf2067dad77b70349729b0c50d57bc1cf30de0db4a1e73a85840ee884e65a0218cfedb1cd7fb33dd67c1a8483cde46e990a2b07cdf1b2a02429bcaa26705fb905dd0dc7d00f4b0aa76084de11d9142c0d51f623a39d6797609028258209180d818e69cd997e34663c418a648c076f2e19cd4194e486e159d8580bc6cda5840940aa59d5f5b42a414e8a498f3854c2a3dc358f20e5f13315f96ba54ac846394656bbb3cb29c8bac8fb85bc323a0eea55e42090f5169657974ecadc278b6c10b82582089c29f8c4af27b7accbe589747820134ebbaa1caf3ce949270a3d0c7dcfd541b5840507b4bb892b3412cc67ae4c1200111ab4a3092d36542f1c672eea555807da2e5a8f4788a7f696ac83a014c5d0adeae73c976611838a21490b7cd8930ffbef004825820f14f712dc600d793052d4842d50cefa4e65884ea6cf83707079eb8ce302efc855840f08279536d20eef4d5a1b8bc2b068c7c9901577541a62a5adb462596c8707f5efd16a193f9216fb95fcc307116a9d0f756a4cd1525139448aea2a7f828441b068258208b53207629f9a30e4b2015044f337c01735abe67243c19470c9dae8c7b732798584063bf278a2e77401c8fafaf2d53d7ecf6ba5dbfabfce432d56d9c189f1572507a5158a6aa01d33be4355388f7e850b00aff53dafef5fe0154491f688bdd639a038258205fddeedade2714d6db2f9e1104743d2d8d818ecddc306e176108db14caadd44158407d6b15a4ef09f819f9d2498a316cb3269842878200bedf5550b495772bb20880094950cd3cbb8669dbff863a32555401778df131103bb603b96a9f5b28606004825820cbc6b506e94fbefe442eecee376f3b3ebaf89415ef5cd2efb666e06ddae483935840fab6a4d5b9c19d32202ce689c82aed2a89c02a62ef780694937f4196e65656fd3e4ca0679ca8ca1a83025d1afe8fe2d8e3e6b0db6e9cdd491eaa2ec866604b08825820e8c03a03c0b2ddbea4195caf39f41e669f7d251ecf221fbb2f275c0a5d7e05d158404ddc3610fd5b52e310c52e52fbe8e873a831ab91e525b0733dfed21615b412d17ae77421e645b875bab25378c424c7c2471f674e45cfa1dd2b846b17cb7fe300a100828258204d5a7408218b85ba016167e1fcc5e8d0624ac8171de065b2842feaf4c051d5b9584086d8648acf6e8d3eb75fc56113aa29fc5814fc76fc8b06d583563724cd9c5c6cc097b335b2a2095dfa8c344066ca45d74511545c733e85d0fef5ab8e115de10282582071df0e0628e75eb9d6c891c8a4dc38f81ed8cf757ef424fb7ab651ab4cca2e6f5840083d3fb001c8e68b1cf9bec2d645bdf76636cd3bf3b7250597c09d26f2b0587be0eb69e279a8ad9d6f5e747fbce18a53c0da03e264f2fc794cad73be542a7704a10081825820e6fc61be738e242a1e21459b4e4847d739551dcee94b1f9b64fef42d19812887584068839e96ed4962ba56e0e0ad256d13f2980eb433d3879c9d32683034da65f6fa288b06e02e603741dc1f973ffcb8209da5b4cfd06885d9c78ddca1238f418d00a1008882582061261a95b7613ee6bf2067dad77b70349729b0c50d57bc1cf30de0db4a1e73a85840cfe660cdaff7bc3b24b64c80a3792884f56a84c9cbda089a81a6f01d5174598d1227639eb614ab36eb1fd217e212480acb8f7b109e7490e93bdecd4eb764a90f8258209180d818e69cd997e34663c418a648c076f2e19cd4194e486e159d8580bc6cda58403be9de37031ba2784bbfd08945d9cf8e02d30cde58a2feef5df12f901dca43d6b23bc294e7fd3d5cbcd4eef054dd872b48b477b601eec3e6d623c4cc9b97b10f82582089c29f8c4af27b7accbe589747820134ebbaa1caf3ce949270a3d0c7dcfd541b5840061b8f2c0771b3a7e281222bd11f1e26465e6441cef4957d961a1fafe5406fb5e21351a437177dafe2cb02e79c44466f63220eea6d0096763747469d179fe604825820f14f712dc600d793052d4842d50cefa4e65884ea6cf83707079eb8ce302efc8558400fa377081dd0adc26a806788ad60a71b82bf8057b6785c7b6c6307f03640469105f8f55b46e2c0cf4c5ebc8e8bbba2c5741442e30ece4842e875840a4705080c8258208b53207629f9a30e4b2015044f337c01735abe67243c19470c9dae8c7b7327985840ad8c64b2bb2985e5edf89625c70ffb3484104757675f2d8262ec6318cf9bd4716d3ab39d5a8f914ba1743ac69e16e142055620475dfcdd1389c50cb14c4e060c8258205fddeedade2714d6db2f9e1104743d2d8d818ecddc306e176108db14caadd4415840bb4c5cbd67d83698069c6bce1fc976f007abd15f792783c3e2a83135c6c082ce592e7a17ba5dcf70abaa6605a72d28e46d71ffa084984fc23b7e590578bf8e08825820cbc6b506e94fbefe442eecee376f3b3ebaf89415ef5cd2efb666e06ddae4839358405164f088b9005d1293d2dfc355ae8d64646aafe91d59cd5f5ea215ced68da3d47ef92e3185a3e6db2deeef99620a9df196dea1fc7a622cb6984d12840a3beb0d825820e8c03a03c0b2ddbea4195caf39f41e669f7d251ecf221fbb2f275c0a5d7e05d158407c10de828d07245f566237c8b3fc4fe0364480425ed4ee0439e94e57f87a526b2e581593c04b563bfe7fa423993c967fc8fc968fc1965eb51ca69368a2d7eb06a100818258200b68eb8e7438599681f732bda6eb942d32692cff2e0b43f9b944d67031bc493258405715f38cbdac7f18da841251f206b0d75df29f74269d2a6ed4a25884ad9c67fc15dead361482c4b16a51689de08efd54d9985df84fb49d1ca387070ac732e703a1008182582048d87ba1c9b6369754f9fddb76993befb16914f3b495078baff05fa0ad2ea934584021829192ecccffadb0ac65c33d142ef81627f5e7c9ccc6d40c87356390da85bbe0136b912c85102b9a38558eeaadddeecdbd9b677b6a68b90f6ae46583dac303a10281845820e87aefbe36826ed5f12341b167730b0b4cd6aa7cdd55709d9e675e684b15eadf5840ccc01472bb6017068a0c967b01813b0e4a489c390d4fdcc750eab073f806d82909e34ad7d920a679138e9edc2c5f9e44e5196281f8ab4b49c1f99819e8da520a582094a2c075ed1bf539b9972561edfac666d7c0669676bb98c21bed66a67bdd5bbe41a0a10081825820393b3d3cab6be0897cbc87143cc3a24825dc1d8249df4d37969502931cf856ff58407d647699068327b80e8881e1c93b7a5966863d12cb12e0bdf8261fb5f65f31534571cd0075a547c68057e4be9e72815a49ed08b3dad782c2b8f031deeca9a206a1008282582064bf0b03a9391aea875c6b5e258e26626e97e2279f53dbc9c8e853245f93d51b5840731721e1803e3eedf6866bec354e4122db21b404b89e3f34aa2076519e39262c6bcbec568fc3fafef66e79215497e7b7c461ff6f049e4fca9a4b4cb1b07622098258206951036ecb873cf248486656fafc2583350e2c173f5f3b6bcf1b199ab047179858402c213d314de43c42c6a687e7e088a2583989a7cb85e2c5aedf7baa86aa80cc983f2f92c50a362635cf26992e224bb6bf93530c3cf5a972d134a9b3beaf86f20fa60082a11902d1a178386237656630636662313466353838373430643032636538613533383739666639366162303363376232316563316334353961633262646461a17048617368477561726469616e31373332a96a6261636b67726f756e6464426c756563636964783b6261666b726569656973797734767766756e6d703264356b6263363279646e6333746e646737766433687335647537626b72343267686963323765626964782436613932346364642d346537362d346262362d613037312d31313863393562626462653065696d616765783b6261666b726569656973797734767766756e6d703264356b6263363279646e6333746e646737766433687335647537626b72343267686963323765646e616d657248617368477561726469616e202331373332666e756d6265721906c467737065636965736746616e74617379667472616974738a6657697a617264724c6f6e67626f77205370656369616c6973746e4368616d70696f6e2041726d6f726e476c6f72696f75732053776f7264684f6c642043617065654c65616b7968467269656e646c7967416e6e6f7965646642616e6469746e5769636b656420476c6173736573647479706568477561726469616e800482a100a165697373756578396769746875622e636f6d2f696e7075742d6f75747075742d686b2f63617264616e6f2d6c65646765722d73706563732f70756c6c2f32303130800582a219ef64a40158207c76d90d83e9989d67a520dbe6f3817dd8afa84f5932e622238008253479a66d0258202a85741ebd1076759c4a14649b30cddf1abd9014062b6616d3ca90d7b93aba5003581de1e512e0225710f61b5cc54df075c02d8b8a56a9a50ae78f5cff08672b041a01e4f69519ef65a1015840720ab14d84aaa87369eadaf68898b794c65580742263ba36cb1b757a3e4e6aaff0ced6bd8247fddc4950e9c1bcf8bcbf7e66e3f8008ab70aa2b4ff8f741046078006a219ef64a401582069179a00a3a6aefad3e6821df68ccd916a93dddae8947eebcfab929484f51082025820c2cc2477d19a048c3aceb048cb1b0cd81f80abc328fc2386fb8d87041965d53503581de1e638092504459177f7ca7d69ff356f28abf49805b99265f14aebaebf041a01e4f69019ef65a101584072eb8b90a33fdc9693df74470c6e9a1b0eb3a09ae10d8e9184113e43d1b6b93c2b9732147f3062ef61b997d46a3dc760c8618b4e8fbb4ace04b46f20ce77e70f0782a100a165697373756578396769746875622e636f6d2f696e7075742d6f75747075742d686b2f63617264616e6f2d6c65646765722d73706563732f70756c6c2f32303130800882a219ef64a4015820ba5706b0c36a61eb0ddaad50360d879f8283592475598303b288515a5cfcf49d0258207a995be7ad4ad8e1d6b3c50022d9d55777daaf4c3d6046f2bc74fe63ff70597d03581de18603a5a749947b55e82c3ca023c427efed03380884e489835d5bed69041a01e4f69b19ef65a1015840853aa89563db088d1a8411bd6bb30800ab130396f74c2f230297db31e7d3fe510e690578c775652b30b57a328cd8a8115182792dbfa8eb592e0a72cbeaca500480 \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Benchmark/data/alonzo_with_duplicate_key_block.cbor b/src/Chrysalis.Cbor.Benchmark/data/alonzo_with_duplicate_key_block.cbor new file mode 100644 index 00000000..83d1ec64 --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/data/alonzo_with_duplicate_key_block.cbor @@ -0,0 +1 @@ +84828F1A0057D7E81A01CD568058205F484B951F012ED53FDB9E30DA0660902354C705F112745BF3B19EC31BC9BB005820E1806A6AF0EB0931EBDF8B766229CF9323F2252573AA6C6998DD1522FFDFBCC858204A20392BB23CEF3777DC1E9FA9B0719EC829B4B87C9E4295141DFB7C6783C3108258408C6059B6952E68EDCD6431F6EDB191705D29CDF82F8A9B855CEE856C8B33DF96B2F567107B4637F6E1FECA3585C9CB1066088BB8496DEA4260C344E2595C997B58508E39D072957817E7D89C19F78E2BB288553E215E81E435D88CE5B3869D10923982E8253112948035D7697762FBF555005D7682E3D5FDB09FE3EDBBDF65CE72514490882CBC89DD5F0A6CFB205EE52408825840000030ED0D10485C31937741CAB13B3D0C247BF9FF8155BF649C6FB314C40788C68F71E5064920C4964893225A77F8EFE65C19C0110DA27DAD4B72582880748F58500272D91E01C1C6C43C51FD1B1651ACD45ECB841BB2762C569C15E90B65D2515F669538C4F41C19CE20B01BB61D685A2B102124525D2F385A8B04283EEFF3C80017D430A075790DFAE7BA3BF1F3C1A90B192E515820A82D45674A1274786D8B9534F9F1F5887D4CB5103EF76E2D8E60ABBB9E2BE02D5820ED46BC0F963545DEBD5FDC3379D01C1EA7922685A4B823CB4DE51FFC63358B140418E0584052DE2D342719F78585E2B0A6959EB54E1D14385A0B04DAC45CA8AAE062094E7DFFD18AB533C0314779C91474A28D47A57FE085290EC2E422953860764CED0C0304005901C005B77FFDF89651681B6DFF5B1F54AE9824D589FE38DE8B9E0CFBA98B1002AC3013ED3B53EE39910C3AD7226A2D438F35D29B7BF4C8215DD379B9187E6622880A197DF65334198B5B195DC470550CD84D466F08E5B4ACA7B9F06CE4A748DB9C1DA29AF843ED989D7E814E2B778E3B713E5C6E7323531D1782AC3D01BE00B19EC65314E3015D71812389883C1B4C49064E20C3DFFF2745D028A7C336E21E4EEDBF73D048B86F7DF61B3DC2FA412F4BFA21C47CB4485DD1C432FDF562B31604DD3C4FD94F062C6269F74AC840A7A0F66539F84D0FA83520A78FD66779936B8B10C05FA29E3551D554696A95E6F62C240EDDD4CCDDD5E06E8C3876B100D94BA3217BD191B8D3BBD381DCD100E1BDF69D8F48CD3D9004FBC3B22E44546DAC068ACF85B04B6571155D469CEC8E9745D2E4A6F63E6982E65C4DB0F36B95CAF815FE535A45ABA199F9CDBD9A2BE400A49A0A4951EF4E8B423D920964BFB571B2C112F1FA66535424C4EA8CAF91791D4FDBEBA7309013826041C4EAA0FB8C958B0FE39B94353D81A6F788A90B9661770A168A713BF604EEAE769249E22298B86A6AFA27FA3104C1E27F1BBB914483A0686BBF24862F77A5E5B04E22F1D499A8883128FD6686A400818258204965D8B3C4824C86DD438840AC1A6C4D6FD2C1B6C0B58A2C14A845956D60FC4A01018282583901150E57FAE6104A97667E71EE10C3F55DF30ADD6B9C6D9B6189637681A51A1F56EB82FE568B7D57366BA2C8BA379889DD648220334812BCB61A0602410682583901E55D850D4DC5E611B740A5F61F836FB777E496A7A65ABDB3779D9017E28C1958BD7614D1C1A32FE155A47FF88CE2C0889A04E61983AF01831B00000015486ACC6C021A00029361031A01CD729DA40081825820F2CFE413FCC190C6A7424E542430572B0556AB71D16DEBDCA9A711AF1F0285F301018282584C82D818584283581CA74249849532514E2B1CECB943DF5CFA5919B0A8E2D7A1B9E0AB53C1A101581E581C12F1DAE7310D0837C2AD675B952BF5EA75B37FA7F258DEDA6C1301F6001AA4BC56581B000000012A059C1082582B82D818582183581C8E1238576C088D5088017715A77B8903B57EB282289B3F5D0A6C483AA0001A99CC1C161B000000043DAB7E7D021A0002A544031A01CD6451A4008282582095F34F20F95E4E97BB1695C0DE4FF9123FBAABF5BEA3199785DADAC4D40D4CE30182582038F022E851DC49640541D938383A5F63A5CD88B30DAECB651509953E70935CDD01018282582B82D818582183581C4CE47F03FFEA34A3D3316CDDC715ACCE37FEA271FD5079FDB5769543A0001AF669DF521A0119FA4C82581D616904E8B2C26F3DDA6C4A5DB4B3EC9E31D581C9960977CFE9C6917A431A001426BA021A0002BF35031A01CD5709A6008382582000E56B08DE6A647B6F6155EF64A1BC253C532735CBB54FF0F585AAC3A3CC17A0008258205B14E7ECFF7B6AAD407570397359EB4DA84E298285728267C475463A1B0345DD01825820F4D06B5DA11EC1BDF57A72CAA8C3A1DDD5DE3727F9011FB6924C44CD4BA2CC450101828258390148D9F60950CEC0B5F5BA4CA2A305F8D16F23BFB1D2B780FDB199B3F9CBE310A3070E37D57355E49F94E21A4F659C1AD8C9996DD410F4AE1C821A007270E0A1581C2F633081F8B95C9A0160FCAFC2FF18F2676634633CCC9DDD0A7CB25DBF494C464331306F66323501494C464331316F66323501494C464331326F66323501494C464331336F66323501494C464331346F66323501494C464331356F66323501494C464331366F66323501494C464331376F66323501494C464331386F66323501494C464331396F66323501484C4643316F66323501494C464332306F66323501494C464332316F66323501494C464332326F66323501494C464332336F66323501494C464332346F66323501494C464332356F66323501484C4643326F66323501484C4643336F66323501484C4643346F66323501484C4643356F66323501484C4643366F66323501484C4643376F66323501484C4643386F66323501484C4643396F66323501534C6F7665466F7243727970746F31306F66323501534C6F7665466F7243727970746F31316F66323501534C6F7665466F7243727970746F31326F66323501534C6F7665466F7243727970746F31336F66323501534C6F7665466F7243727970746F31346F66323501534C6F7665466F7243727970746F31356F66323501534C6F7665466F7243727970746F31366F66323501534C6F7665466F7243727970746F31376F66323501534C6F7665466F7243727970746F31386F66323501534C6F7665466F7243727970746F31396F66323501524C6F7665466F7243727970746F316F66323501534C6F7665466F7243727970746F32306F66323501534C6F7665466F7243727970746F32316F66323501534C6F7665466F7243727970746F32326F66323501534C6F7665466F7243727970746F32336F66323501534C6F7665466F7243727970746F32346F66323501534C6F7665466F7243727970746F32356F66323501524C6F7665466F7243727970746F326F66323501524C6F7665466F7243727970746F336F66323501524C6F7665466F7243727970746F346F66323501524C6F7665466F7243727970746F356F66323501524C6F7665466F7243727970746F366F66323501524C6F7665466F7243727970746F376F66323501524C6F7665466F7243727970746F386F66323501524C6F7665466F7243727970746F396F66323501FF82581D610CF2D472123546C1D59E974DA3DC0662B3233990EBC212EEA91F2EBE1A008192FB021A0009339D031A01CD56E1075820FA0A2DB8B6D6E5D62D2CBBE16C7D6BD3899138F769C10EBD671654910E8A27C909A1581C2F633081F8B95C9A0160FCAFC2FF18F2676634633CCC9DDD0A7CB25DBF494C464331306F66323501494C464331316F66323501494C464331326F66323501494C464331336F66323501494C464331346F66323501494C464331356F66323501494C464331366F66323501494C464331376F66323501494C464331386F66323501494C464331396F66323501484C4643316F66323501494C464332306F66323501494C464332316F66323501494C464332326F66323501494C464332336F66323501494C464332346F66323501494C464332356F66323501484C4643326F66323501484C4643336F66323501484C4643346F66323501484C4643356F66323501484C4643366F66323501484C4643376F66323501484C4643386F66323501484C4643396F66323501534C6F7665466F7243727970746F31306F66323501534C6F7665466F7243727970746F31316F66323501534C6F7665466F7243727970746F31326F66323501534C6F7665466F7243727970746F31336F66323501534C6F7665466F7243727970746F31346F66323501534C6F7665466F7243727970746F31356F66323501534C6F7665466F7243727970746F31366F66323501534C6F7665466F7243727970746F31376F66323501534C6F7665466F7243727970746F31386F66323501534C6F7665466F7243727970746F31396F66323501524C6F7665466F7243727970746F316F66323501534C6F7665466F7243727970746F32306F66323501534C6F7665466F7243727970746F32316F66323501534C6F7665466F7243727970746F32326F66323501534C6F7665466F7243727970746F32336F66323501534C6F7665466F7243727970746F32346F66323501534C6F7665466F7243727970746F32356F66323501524C6F7665466F7243727970746F326F66323501524C6F7665466F7243727970746F336F66323501524C6F7665466F7243727970746F346F66323501524C6F7665466F7243727970746F356F66323501524C6F7665466F7243727970746F366F66323501524C6F7665466F7243727970746F376F66323501524C6F7665466F7243727970746F386F66323501524C6F7665466F7243727970746F396F66323501FFA400838258206AFC8C499DA5C42C53EA442A8051B3081031F171EEEA4432991506381E2D8EB800825820D3AEFFEA2371A3EF2F195F40246FA89E20C6E349AB24B715E38E0F51D0E7E63601825820ECC73F986B568B27A052A4C0790B44582FDD584744D86F43DC6AAA5F9686AC3601018282583901D9ED3E385682557B35884980DC1721FF24BC2DEA1E22A311831AFB5CE38B3FBA9B40FED456199D3775F4AFDDF380B146336AE517925C554C1B000000015AC7129382584C82D818584283581CA1030E3B880D76789EC6B808E209AE56E827A4F57462B8FEC6802527A101581E581C2B0B011BA3683D173E253C2AC6D394B5300A9CB53F650EAA06FC6E19001A15BF798E1B00000001FB31CA1D021A0002F1BD031A01CD7297A40081825820C6C4EB1417FF576769B8F3FF6CBE2996D4A5CDC4E4B45EC30EB4E7577ED1EE2400018282581D61894D3315AF10374E5D1438C9B4108DE597245B7BC681BFE67C7204731A002DC6C082583901D5311050FC69536704CE36EFC076B515C1CCF8A13BAA820D30FCA8D04B4F2B1786E68840B7AA1C71827992FFB04D7D9C197D2E5B6847F82E1A0316E87F021A00028C81031A01CD728C86A10081825820FDAF2F6EF24890889F502DE09ECDEC7C9F676AB206E87613486F56F9799D605E5840CC1D70B7ACF2CE7281C21FBDB6559C8C1327499A1C4A6E8CEBB7072615EBFE0E51A4BFC2795BF692F9B4388831475FD7F1E9BDBF895EFC9FE83D87AD6E89FA0BA10281845820F4BCA00671176355C1DBE65F0AFBB2BAAC60D4F4762563C53014528F53D4984758409E078F6E746C8C25BF71E322C6AE15C67B28B2E2361AA3B2AE215525697746D592386443F6690D5556A5A550785B001E0F88DD86558D41172FC976DBE1CCB50A582061D1E3D6F0036146FA182D137EBD354A1DC7347829CF5308E166838AF163DCED41A0A10081825820393B3D3CAB6BE0897CBC87143CC3A24825DC1D8249DF4D37969502931CF856FF584063AAC1C764BBEA7851086BB765006D0209B36C15465547777881201140363E81153A18A7740C43A3E5377C111DF6C4FB773CAA30E8E36F45B05B6E15ADE34507A20081825820FD23AF269D1C2FD6BC66414B0AD239D3C6A843736FAE547A3EAC84BFCE301DAB5840DF212C60FD973B40094791B3258ABD26941852FC58FF5AE5D93EAA4027E7E94024CF0F1B792B81BCDB4475558D263E625D5564931610F3244ADC533CF9CAE60801818201828200581C0CF2D472123546C1D59E974DA3DC0662B3233990EBC212EEA91F2EBE82051A01CE9FB8A10283845820372A30B3C7A74189AD37BD55D35CB23722F5796693D983418FFB651E7F6164B158404499F9B35646E7F0844745F06B230305C474BB8E62ED91AE81C0D608F6D6ADDA7819BE1924BDC3BF4877DC912D13301E53CF51B614ECACC79F740379CB39300C582085551602903BC9BB1E393C8F797916EE01AE73272D5F43AD03E0AEB949EA69E55822A101581E581C2B0B011BA3683D5E4F72362A1243BCB5295CD8B1A82DF9E0DD758EE3845820C8354629E05665F031B2D1C4DC939C875D6A8166105A0D1452AD18AE2ED2231D5840459AF05A287FFABBF7D357D58F960292AFD89E4A303BDF1C45490D9853EB8F829C99677557D271712C5B52D5B5D63822F4592FC59D6D111587F827589A9F6E045820292B6546849392C190F00BE1161430AAD58A7281CCDCB491EAEF2818F66D99635822A101581E581C2B0B011BA3683D33AC3B7C2AF8C6AF7FF97376ABA498597192928ABF845820E49A56A62860A3689AFEA7E2E7D9CDF15D40F4958ACF0F5E9220A5063A36C8FB58401EF3F6F373D5B6E34A3C1DCFEDC67B436EFE46F2B363318731F51BCEE65013EF9CF2EBEC16D4A15DEB4C5FF4F882241987C660B00ABD03BA99EE7E1F162CF60158201DB2FA3F78A86ECB6E3ACB6237CA09E8BCC11D39EAE9E41A54F3217DC8578F2D5822A101581E581C2B0B011BA3683D1C06C49F2A0FE17210E840E52FD4BB52A5BFC5667BA100818258205B1F1B34E11EA7676A23D2773EE79A3446C3D2D488C0F50CAB2C41B6535D3D955840A5161E51190D98CF6DF88D70C2C7C4749FAB9822D92B1FD282B7B0857788E6EE1FB4756643375E726E99F2AAE0BC5CEDCF83540902F762C7A1D1A7DC646E6007A10382A11902D1A278383266363333303831663862393563396130313630666361666332666631386632363736363334363333636363396464643061376362323564B832684C4643316F663235A3646E616D656B4C46432031206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643326F663235A3646E616D656B4C46432032206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643336F663235A3646E616D656B4C46432033206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643346F663235A3646E616D656B4C46432034206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643356F663235A3646E616D656B4C46432035206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643366F663235A3646E616D656B4C46432036206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643376F663235A3646E616D656B4C46432037206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643386F663235A3646E616D656B4C46432038206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643396F663235A3646E616D656B4C46432039206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331306F663235A3646E616D656C4C4643203130206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331316F663235A3646E616D656C4C4643203131206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331326F663235A3646E616D656C4C4643203132206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331336F663235A3646E616D656C4C4643203133206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331346F663235A3646E616D656C4C4643203134206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331356F663235A3646E616D656C4C4643203135206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331366F663235A3646E616D656C4C4643203136206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331376F663235A3646E616D656C4C4643203137206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331386F663235A3646E616D656C4C4643203138206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331396F663235A3646E616D656C4C4643203139206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332306F663235A3646E616D656C4C4643203230206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332316F663235A3646E616D656C4C4643203231206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332326F663235A3646E616D656C4C4643203232206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332336F663235A3646E616D656C4C4643203233206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332346F663235A3646E616D656C4C4643203234206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332356F663235A3646E616D656C4C4643203235206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F724C6F7665466F7243727970746F316F663235A3646E616D65754C6F7665466F7243727970746F2031206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F326F663235A3646E616D65754C6F7665466F7243727970746F2032206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F336F663235A3646E616D65754C6F7665466F7243727970746F2033206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F346F663235A3646E616D65754C6F7665466F7243727970746F2034206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F356F663235A3646E616D65754C6F7665466F7243727970746F2035206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F366F663235A3646E616D65754C6F7665466F7243727970746F2036206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F376F663235A3646E616D65754C6F7665466F7243727970746F2037206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F386F663235A3646E616D65754C6F7665466F7243727970746F2038206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F396F663235A3646E616D65754C6F7665466F7243727970746F2039206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31306F663235A3646E616D65764C6F7665466F7243727970746F203130206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31316F663235A3646E616D65764C6F7665466F7243727970746F203131206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31326F663235A3646E616D65764C6F7665466F7243727970746F203132206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31336F663235A3646E616D65764C6F7665466F7243727970746F203133206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31346F663235A3646E616D65764C6F7665466F7243727970746F203134206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31356F663235A3646E616D65764C6F7665466F7243727970746F203135206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31366F663235A3646E616D65764C6F7665466F7243727970746F203136206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31376F663235A3646E616D65764C6F7665466F7243727970746F203137206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31386F663235A3646E616D65764C6F7665466F7243727970746F203138206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31396F663235A3646E616D65764C6F7665466F7243727970746F203139206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32306F663235A3646E616D65764C6F7665466F7243727970746F203230206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32316F663235A3646E616D65764C6F7665466F7243727970746F203231206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32326F663235A3646E616D65764C6F7665466F7243727970746F203232206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32336F663235A3646E616D65764C6F7665466F7243727970746F203233206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32346F663235A3646E616D65764C6F7665466F7243727970746F203234206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F316F663235A3646E616D65764C6F7665466F7243727970746F203235206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A7175353638665677346A706F6C6963794C696E6B7835697066733A2F2F516D61774A655957577176675439515876754D476858394E76683552745933316E4C674A7646445A57314C74517780 \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Benchmark/data/babbage_block.cbor b/src/Chrysalis.Cbor.Benchmark/data/babbage_block.cbor new file mode 100644 index 00000000..240680dc --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/data/babbage_block.cbor @@ -0,0 +1 @@ +85828A1A00A0FAA91A07AF97F758208FD832B38F12F6E1572E9BE0D63465B66D3A9413E39F550DF43476B46C609BB558207194702C765EF7F9E333DAD00C7CA3C2065EAFF5288B177A726B65CFE79379D458201B60A27DF5CE4FC9BB19AF1643815652154CDFBF609D717D9693C07E795071A782584077D15CC438BD3CE4E3E2B17F1B20D85952F069A3EC3BA294FABE9418B296F028DB590F3DAF42A6400A7CAAB0D1A2E25278737326C47C068FA451ADB828044AA85850FBD7FAAA1B9D85F47CA75277FC1D6E987825562026137CDE28A7B5DC21D7FA4D828030F911B1A06C6D759A7747AC3DF362B5DB156B373AC7A9C380BC63F9C9072355484D935BA871C50FA8898432280519380B5820A6651F0265DC9DC19819C20DC2719D6C172037AC798D43312D594DA50442998C845820B095CCD982629951A205A35A81543B3C6F0EFFA999E376D02C1443D510A6F7F70F1903DE5840E4DCAACA8A990945BC5D8F9AD076638ECB5D39D1BA084EA5B27B93B14CE658BEDCB6D5FD1ED133A16769C19B77941890D0ECCAAE4E74F2502FA4E102590CDE038208005901C053409B7ECC3FE5C73FB288DD219CD00EA1ECAB1FE6A0AB877110AB3D2D887C3000F8A10EB2DFBC8BE936D860628C5688D322EDDBB060F70C3A3FA07E568B9A08D133872360CE3A176C4013B9236A90444561F705BB126DD3621B32D9A0EFB86BCF86C02BE0187A039A2AB426D47ADB5128891DD8629639DFA6282AFF8A25206D8F3225D5BC3EFD255897E0FF5728F24556B88F7967EC543376C61D4A186BBC63411A80D8F76680F048886110EED82EA1EF1AA52DDDA81B2DAE2CC9D0EDB59739DE87A4AADA86C41A80FE46DE204E65A9491057690768FFF9A2187356F003FB4A5CA9D816B6836967A9F1C24ABEEF7026CF60FEB48CCE2A5779B4442CF07053D285331D4A67BE56F2F4BB3F87A7D3DEB31DEC91849BE166261108B1B7CDEA0DCA2FFD41026D5B4AC3F246CC3213461A0B9F5C47DA887956CAC51CBA000820A944DB011B3C5A4B6A59A6C332F07C614FA1CC66DFDAC6744268065E4F0E936C6830E50CF83DC7824A2E9DC6E754A138FFBDF7626E485136A43712175462840664E7D5EDAB3606AC58A127B4745785C9B972212350AC0FDF08C4E1E81864D6131D64E9175B979222CD46D7FCBD300DA1774E00526E38AA67333FC835ACAD5242ADCC87A400818258208B1981199658095573859313ACE20F2C933D5AF1E81650733E36DF6E06E9101501018282581D6124D274BFD913B241A8CCA20C6977775718FDDB8F3763F1D365C854451A001E848082583901AE07890AF80E4658691A834F880B3F8142D35F08B7E0A574A787521FFA40984DFE75EA6085AE8D27F52934AF3D0A42A391C514E78A6CDD561A01053236021A00028CAD031A0CC63DF2AB008382582062FF26A140262D3EE197CD93FF234D49F88EAB3483E3BDCC5B69A582F8BB1952008258207942043B920908BAD5626DCFADA4A00D812B3789E3C1925D70355B6B16F52DFA0082582099908C1030BD4F72C4135BB86E6296CDAE04C906F091976E320C2F25A5200E2602018383583911E1317B152FAAC13426E6A83E06FF88A4D62CCE3C1634AB0A5EC1330952563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2821B0000002ED1BAB9B3A4581C0BE55D262B29F564998FF81EFE21BDC0022621C12F15AF08D0F2DDB1A1582020B7729520955D7A53FF8A39082B8011159D6628113EF47C13149179869FE16D01581C13AA2ACCF2E1561723AA26871E071FDF32C867CFF7E7D50AD470D62FA1474D494E5357415001581CCE5B9E0F8A88255B65F2E4D065C6E716E9FA9A8A86DFB86423DD1AC0A14444494E471B00000D0E2C75F5FC581CE4214B7CCE62AC6FBBA385D164DF48E157EAE5863521B4B67CA71D86A1582020B7729520955D7A53FF8A39082B8011159D6628113EF47C13149179869FE16D1A130C6AA25820A7A63A0514F3BA288D15F577D34F3FAA5CA459A1A97D0BA33D270DC93BBF14BD82583901B6A399BB1A6598ADD297EB8724911C41FB720F6D17F6221636B458E3B84DC1F29279A96CD8D21B1F81A63B10D01103A9EB86FFC79D1AB1B21A191F421382583901BCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9D52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2821AF6E2075BA1581C2F2E0404310C106E2A260E8EB5A7E43F00CFF42C667489D30E179816A14D3137323331303430303030303001021A000C04AD031A07AF9BCB0758205160F88B929BF8A6C57C285B889488F9137C0EF3CFD0BCF408A10020E69146D5081A07AF97E30B58207CB052FB69E3AD65E73A6A481850426288F5730FB8D8AE813A94A190A49D5B180D8182582099908C1030BD4F72C4135BB86E6296CDAE04C906F091976E320C2F25A5200E26020E81581CBCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9D1082583901BCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9D52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2821AF6833C48A1581C2F2E0404310C106E2A260E8EB5A7E43F00CFF42C667489D30E179816A14D3137323331303430303030303001111A004C4B40AB0086825820F3DDC3B1EA46C058A39A764068EF2CB7B72B42510857ABE5357EB7E7BC90B45C01825820C112E5947A7816881C274BB4824BA657EC5D9EC07BB4B4ED8123CC94832D4D43028258201C4FF06115A456C8CAE138B9ED57CB11289DB280DD606702A0708E87CE9F55B800825820E63473E75E61545BFC3CF491002C49F9BC0543C7D85C46BE6BC8636F8A9D5E2400825820216394E05B86EF918A6C4D369717182FA5DDF11428AFD5CB16DDA32A3AD1FCCF01825820072BFA83B11291C9F05347FEE5D3499B6362A9D32461DC6745E4859F625B034501018482583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C1A001E848083581D714DD522FB07D1F895EE63270B040E8B6434AA848A9C48EE16A7903AAD1A281959B058208407BD463FDB8AB3C15C3D51A0B80BF2A983357176C26FF8956F48FCA750139682583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C821A003C0B36A4581C279C909F348E533DA5808898F87F9A14BB2C3DFBBACCCD631D927A3FA144534E454B1A006ACFC0581C41223B3ECF502363DC465DCE5AD6671B83AC790E229D3F49E68C3353AE58201DCC6D7C286A2DE84347E820F0C7470EE782590A48716C0D374AF11BF84F91490158202B222B541F34CCC28E4E6E9A9CE1C4628481FE6FE51BC34A1E45E8DE48FDE30D0158202B5A0BB58596616D24DB29C56DE9FBDB2E142C260B8FDEA43F5AE2B5D05684510158202C568BDAA195DF9DF23A9DFB24FDB8F85CBF1BDD532D1B5E0766B9847A6FA2B10158203DABB0E2FD6E598AAC8A60710123C878764D266D335CB6A80219F47772D843D50158204181EF72768DE5384584403C5032FE0134F2C6379AB1B2CFB7DA964C70ABA99501582075DB7CB03250704474C0C723E11EAD164DF7B098BEE79ECBAC4006B3E5C02F990158209356CD737265040D36A951364BE3EF9C18A06B42B5F7F0187D3C165C36E86B690158209C5AF94E7172C88868A08139FF19D47C44C011F7A0820F338241D0FB3D057009015820A99E358C89AC6C4AF9A25DD0538480CD8B498A9CC14BB2C1FE213697DB9EEAF7015820B6CF6DC35253F74A7E28B9EEDB01FAFEA96E28EBE20EE1A75B260CD8366B3FF1015820E56F42B603C7D09944F0362409F5A25D572B8781C55F0385D1260BF95F339246015820EC603D34DC271F802B3B83C5544EE2A86DB0EA922FDF092A6E8226A5FF80058B015820EC793C9A4C1B8981EED97136E7618B231C544195ECF30D1EF78A5E22AE902F3501581C4523C5E21D409B81C95B45B0AEA275B8EA1406E6CAFEA5583B9F8A5FA44B000DE14042756431343334014B000DE14042756431383833014B000DE14042756432353034014B000DE1404275643237303001581CC881C20E49DBACA3FF6CEF365969354150983230C39520B917F5CF7CA1444E696B651A0001D4C082583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C1A07076A6B021A00094B8B031A07AF9BB5081A07AF976909A1581C41223B3ECF502363DC465DCE5AD6671B83AC790E229D3F49E68C3353A1582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B3200B58204F2988C9AE22ADC58096AB9402ADD7C61BB98C8CC6F1915967C070FD22C0C5F70D81825820E63473E75E61545BFC3CF491002C49F9BC0543C7D85C46BE6BC8636F8A9D5E24001082583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C1A12A262B7111A000DF15112828258202E8E08B814BE2341084CC874194BC57E0D35E210954F5E57D2A1D41CB6025C84018258205A4BB987DAF15D6C09134E515D568DDE9FDE0074FFD2FA6BABC8C820DF04A49B01A40081825820DDCAB0065D35CEDF0F7B021B35732116DC79565348B718E5B29C10761F087463010182825839011B405CB6901055942AFC1F8C1EAAFCA00AFA8BD0081DE6E58B4435FD78060531E90533ABF6B0F443BEF89C71206D3FB49BFF0F1CEA076D911A05D75C80825839012E84C78697E056402A15B96833B523B07C493761D2DAE15449C8C99DA2EECF283E18BE26C0704304EF31D63A8EC1B6ECE4F3174B07A22CC21A0024422B021A000290A1031A07AFB404A400878258203149ED17E1577C562DE7EC7224AABE107A78F8A184FC796CDEA8EAC90B526497018258204FAAD68789B140095D8B09DF63D4BEC7B22D2F07CC90BBE4F724B9ED26AF72FB00825820A2AA21BF9C81A61E89BBA8A6F9C0BBF46CA812730912E3F336E0BAD60588BF4D00825820BED656C0E1B30EFB9FB8726C0416BFDE72EAEC2BEEB951199EF2AF96706637E701825820C35D2C9A1FD03429B88A43C773AABFCDC18B2E39CF50EDEF0C1F4AEF53ACB1B603825820CD6CD0844747901801A96275BB7DEEB4654916C514D440248A21DDD2F946F1FB00825820E0CAA29C1EDF4968000B42F35B71A9049369C0A0C38EE89E10099BC40465BEE101018282583901AE4A2F776C488D54616ED50D8BBE4F49A036A7E775AA89535C7BF984293C0F5098A0561F60A629E309F2B38E835EF4EF949EC3E427FDD2961B00000003F5476A0082583901AEDE1E35FF87D21A8297DBF3CED2C975E0556960348D8C5106B52A7E6948A5BEC1CBE3467F5A068DAADFF4F92DE03BD7CA263A370D04ED9A1A20B90FA5021A0002C8A9031A0CC63DF0A50083825820C298DC1865EB0436DC9C18AF92438A8DD5FE8FC220162A49AC2589719B81900000825820B9D8C11A597EBD824FDC5FCF7DBF49A98AE194108B38CB481D08992BDF7E4F29058258203934E5C09462754C0E81C944CDACC67995F8F1892FD6297869E1E94E57D68651010183825839019E415AB35AC812BB7EDFA7223BB1D6E89AC8C45CC010D0E8ECF5807396C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB81A004C4B40825839019E415AB35AC812BB7EDFA7223BB1D6E89AC8C45CC010D0E8ECF5807396C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB8821A00328200AB581C8DA763CE1D6ADB725A295A7F145C32808295B542DE5062D92EFA8370A24E000DE14046726967696433363531014E000DE1404672696769643435363101581CCE4D6F507A71B917DB0377D8F7309FE60DAD3C5397C730EA7F894BBBA24A54616E616B6830313035014A54616E616B683036353401581CD1F6CF1B73A74A154367269E759902739177D24B93286856EFE2B932A15045726D6F204F4720504153532023303701581CD5AB720E866E796D0212C61D36D5664819AB56437F2DF919FCAE5530A151436F6E737469747574696F6E555330323301581CD6EA64DD658ADC56FCB553AF88DB495A423D4573DDB3BD4803DF6AB5A14B323939393630313130353401581CD89775133F108329854694A2BDCB352D26C1D930739257D6CEB89BC3A1457247454E5301581CE1A212122B07460A739AF69751BD01CD03174791F778B2365CC0B8F6A14445524D4F19EEB3581CE304E709916948816B793C857C92EC765095E82653539B7928051ED5A14F53756E416C736F526973657336343801581CEFFF17A2E610E5C9F46E33FE964C39602399F95AA367B37F039C1EFCA15343617264616E6F466F725468654D617373657301581CF0FF48BBB7BBE9D59A40F1CE90E9E9D0FF5002EC48F232B49CA0FB9AA151000DE1406D61646D757369636D616B657201581CFA1A9FE50BA15C82F9FC18C8FDB25C745769061991C0C6C100CAD960A1545468655477656C7665436861707465727334333201825839019E415AB35AC812BB7EDFA7223BB1D6E89AC8C45CC010D0E8ECF5807396C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB81A04276A59021A00031E41031A07AFB41105A1581DE196C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB81A0013B0DDAB008382582011785188711F5B4BB104056865F724D542AFA256C4FB057A444331A273F1EBD602825820769ED9AC76C358169618F5EAABC6B0E37373866665BD4EA17607F4EC0612FEA600825820BEF529C7CF4FB5C33173E75795AA34C4D9EFA4931DD7D6B07E8A8900E0063FF5010183A300581D711869C28A5C1023A10C1DEB30D112226CF45130B800A22D9C2AFC1C9C01821A001E8480A1581C08C56C0FA73748A23C3BC1D9E6A60A4187416FC4FF8FE3475506990EA1484E6F64654665656401028201D818583CD87A9FD8799F581CE33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6DD8799FD8799F1A0005B9801B0000019096A7E9B2FFFFFFFF82581D61E33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1A0089544082581D61E33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1A006F7AEE021A00044EE3031A07AF985B081A07AF97E30B5820829DDE81A2958DAAEC321BCA75A193ED76D580503F89AC44F8A4F96109DF6F220D81825820769ED9AC76C358169618F5EAABC6B0E37373866665BD4EA17607F4EC0612FEA6020E81581CE33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1082581D61E33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1A0049A42D111A00370C3F128182582039435B3F8A6F3FAD8771E07B5B6790A940FECC4C20A7043E945E44FF427E41D30087A100818258206A29EF8CCBEC0A3C966443A3CBF142717338517A0418B40A8CCA20CFAAA5A65E5840A5A4E03B6A9ACEEBBE2A10E11030B19CDB48103D223DA34FB7D3532BA36E30FE4EC6B0498936D6356BFB7B65D27347BD7AAA668F6E11EC0A80E5D3480E56F80DA400818258200303157375F23161027902ABFF500A6268C00A69F45F7BFE5ADBC2F70F15DF9458400CD61DBA11FC23C54FD36E3710EECE5300CF8B573D7D89EB0B59BB74849A1704DBC26CAE0FA14184182CDC0511B94D1E2AE10FD7BF62127127B4A110AF839800038259014F59014C01000032323232323232322223232325333009300E30070021323233533300B3370E9000180480109118011BAE30100031225001232533300D3300E22533301300114A02A66601E66EBCC04800400C5288980118070009BAC3010300C300C300C300C300C300C300C007149858DD48008B18060009BAA300C300B3754601860166EA80184CCCCC0288894CCC04000440084C8C94CCC038CD4CCC038C04CC030008488C008DD718098018912800919B8F0014891CE1317B152FAAC13426E6A83E06FF88A4D62CCE3C1634AB0A5EC133090014A0266008444A00226600A446004602600A601A00626600A008601A006601E0026EA8C03CC038DD5180798071BAA300F300B300E3754601E00244A0026EB0C03000C92616300A001375400660106EA8C024C020DD5000AAB9D5744AE688C8C0088CC0080080048C0088CC00800800555CF2BA15573E6E1D200201591E1B591E1801000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222323232533533355333573460CC0042646424446600200A0086EB4D5D09ABA25002375A6AE85400454CCD5CD1832801099091118010021BAD357426AAE7800C54CCD5CD1832001099190911198018028021BAD357426AE894008C0CCD5D0A80082E1119191A827911111A80391191111AA99A9824806108008B1119191A9A9A80103102D91191919191919191AA99A982A89119982D91299A99820A8071A80103409980200100088008008020B03C9111919191919191919191919191982A299A8050A99AA8100999AB9A3094013303A307908101330820106700B06706E0060063305433355307908101305C05A305953353502B2233500206E2071210011635014222222207A33054353501422208E0122350012322533355333500A2153335004215333500C2130054984C011261533350052130054984C0112603C04F15333500B2130044984C00D261533350042130044984C00D2603B153335003205003A04F153335003215333500B2130044984C00D261533350042130044984C00D2603B04E15333500A2130034984C009261533350032130034984C0092603A153350010700820108201070253335002215333500A21533350042133303A03B00200116161604E15333500921533350032133303903A00200116161604D04E33054330500153306F00B02733054330533306301602548008CC150CC14CCC18C02C0952002330543305333063001010002330543333084012222533500315335002135001222223305D3305C0053306C01402B3305D3305C0043306C01402A3305D3305C00300C3305D3305C0023306C0140193305C001304800D0910122153350041622153350071622153350081622133300C003001323232323232323533307D0050070272222225335330743305100248000CC1440052000161333335003235500B2222223501D222223501B22235051222223232323232323232323253353308B013308B013306E00848000CC1B802920003308B013306D00201E3308B0153353306E00A00315335330870100E07013308B013308A013309A010110703370066E0402800C060CC22804CC2680404411C0084CC22C04CC22804CC268040441C0060CC22C04CC22804CC2680404411C008CC22804CDC08050019984D008088070A99A998370041A802055008A99A99843808078380998458099845009984D0080883819B80337020106A008154020306611402661340202208E00426611602661140266134020220E003066116026611402661340202208E004661140266E04020D40102A804CC2680404403C4CC22C04CC22804CC2680404411C008CC22804CC268040441C0060CC22C04CC20C04048070CC2080404006C4C8C8C8CCCCC2C80400C008CDC019B800180050013370002E002A66A0082605466E0800C00840594CD400C4CCCC0A005406406005C520003370002E00866E0005CD40102A80458C27C04028D40082A404D40042A404D54CD54CCD5CD19B8900148000278044C94CCD5CD19B890014800027C044C94CCD5CD19B8900148000280044C28404CCC2EC0400C0080054CCD5CD19B8900400610041006350020AD0121001160B901350010B0015333573466E2400400C54CCD5CD19B880010031330A8010023370666E080080400444CC2A0040080104CC2A004CDC199B820040110100043370666E080040380414CD4CC1FC01C1A04CDC0998490081100399B80011010133092010220073370666E080040300354CD4CC1F40101984CDC0998480081000219B8000F00E133090010200042235500C2222223501E222223501C222350522222232323232323232323253353308B013306E00748000CC22C04CC1B4008074CC22C04CC22C04CC22804CC2680404011C008CC22804CC268040401C005CCC22C04CC20C0404406CCC2080403C0684C8C8C8C8CCCCC2CC0400C008CDC019B800180060013370002E002A66A00A2605666E0800C00840594CD40104CCCC0A405406406005C52000350020B301350010B60153353330690870100E01E1330AE013370002C00E02A26615C0202C66E0005401C58C27C04024CDC199B820010123370200400266604400600266E0CCDC0981219B803370400400466E08CDC119B82337049004241941E90680780200198600080199B824801120CA0F350050A70130BE01001350030A60153353308001001069133702661260204600266E000440404CC24C0408C004D400428804D54CD4CCC1801F80140544CCC2D0040140340304CCC2D004010030034888D400C88CCC2E40401401000C88D54030888888D407888888D4070888D414888888C8C8C8C94CD4CC21804CC1A4009200033086013306800101833086015335330820101906B13308501330950100B0193370000202426610C026610A026612A020160320026610A026612A020160D60246610C02660FC01802C660FA01402A2A66A6660C8104020120322666661540266E00044008CDC08080008078070068999998550099B810110013370002000401E01C01A2C66603E6A00614C026A00614A02002A66A66100020020D2266E04CC24C0408C004CDC0008808099849808118009A800851009AA99A99983003F00280A899985A00802806806099985A008020060069111A8019119985C80802802001911AA8061111111A80F111111A80E1111A82911111191919191919299A998440099835802240006611002660D80020086611002A66A66108020360DA266110026610E026612E0201A03666E00068050CC21C04CC25C04034014CDC08020008A99A99842008028368998440099843809984B8080680D80D19843809984B8080680299B8033702008002028266110026610E026612E0201A03603466110026610E026612E0201A00A66E04010004CC21C04CC25C040341B4050CC22004CC20004038060CC1FC03005C54CD4CCC1982100402C06C4CCCCC2B004CDC000980099B8101201A01101000F1333330AC013370202603466E0004800404404003C594CD54CCD5CD19B880190011309F013370066E0CCDC119B82002019483403CCDC119B81001019483283D200209E012100116350040A601350030A60153353308001001069133702661260204600266E000440404CC24C0408C004D400428804D54CD4CCC1801F80140544CCC2D0040140340304CCC2D004010030034888D400C88CCC2E40401401000C88D54030888888D407888888D4070888D414888888C8C8C8C94CD4CC21804CC1A4011200033086013308601330680030193306800201833086015335330820100906B133086013308501330950100B009337000060246610A026612A020160100042A66A66104020100D626610C026610A026612A0201601066E00008048CC21404CC2540402C02400C4CC21804CC21404CC2540402C02400CCC21804CC21404CC2540402C020008CC21404CC2540402C1AC048CC21804CC1F8030058CC1F40280544C8C8C8CCCCC2B40400800CCDC019B8101200700133700022002A66A0082604A66E0800800C40414CD400C4CCCC08C03C04C048044520003370202400866E0404000858C26804010CDC199B8200200E00D3370666E08004038030CC244040840F8888C8CDC199B820010033370066E0801120D00F0013370400290650791112999AB9A3371200890000A4000264A666AE68CDC48008028A4000264A666AE68CDC4800A400029000080099B833370400466E04004014CDC019B8200148028014C014CDC10018011192999AB9A33710004900004D808A999AB9A30A10100214800054CCD5CD1851008010A40042A666AE68C28C04008520021330010023370066E0C009200448008C254048894CCD5CD19B880010021330030013370666E00CDC1802000800A4008200426660F2002006046464A666AE68C27C04D55CE80089919191919191919191919191919091999998008050048040028018011BAD357426AE88008DD69ABA100135744010A666AE68C2B4040084C8C8488888CC01001C018DD69ABA135744A0046660F8EB9D71ABA15001153335734615802004264642444446600200E00C6EB4D5D09ABA25002375A6AE85400454CCD5CD18558080109909111118028031BAD357426AAE7801854CCD5CD18550080109919091111198010038031BAD357426AE894008CCC1F1D73AE35742A0022A666AE68C2A4040084C8C8488888CC00C01C018DD69ABA135744A0046660F8EB9D71ABA150010A101135573C00A6AAE74010CC1E1D71ABA100530743574200A60E66AE84014DD51ABA1001357440026AE88004D5D10009AAB9E0010970137540026A002104026A00810C0260C82446660D444A66A660B066606C0D46A004104026A03C1040266606C0A06A6A0040FC0EE05E266008004002200200202A60C82446660D444A66A660B066606C0A06A0040EE6A0200EE66606C0A06A0040EE05E2660080040022002002026666660F0660C602C044660C602C04203E660C602C02003C660A8660A0044607A008660A8660A0042607C008660A8024660A8A66A60C82446660D444A66A660A66AA03A104026A6A0040EE1040226600800400220020020260D6442A66A0020FE440DEA66A6660640A600490000998299981D183C840809984100833800A40042660A66607460F21020266104020CE0029000183800999B8100101D303D001333066059008010305333307F22322325333573466E1C010DC680488010A999AB9A308F0100415333573466E1D205A500313370290001980299B800044800800800400454CCD5CD19B885002481805854CCD5CD19B8950023370090302402426600866E0000D20023370066E08005201433702A00490300B099B8E0060014800120001533500400115335501A13335734611A026606860E60F6660F80C200A0C20D00022A66A0062A66AA0320022666AE68C23804CC0CCC1C81E8CC1EC18001018019C0044CCD5CD18460099819183883C9983D02F80182F833299A9983D91299A8008321109A80111299A9982B00101089834800898030019A9A99A983B03C00501083883610A99A8008B1109A80111299A8018A99A99827800A400420042C112022C666AE68CDC49982C800803240000C80BA6A0020D4A66A60B02446660BC44A66A66088A0226A0040D6266008004002200200200E2C0F8660CE02C6A00A0D460C2006A66A60A42446660B044A66A660826AA0160E06A6A6A0040D80CA0E026600800400220020020060B2442A66A0020DA440BA60BA0026A0280D4660B40020246A6A0080C80BE26A6A0020C20B4A66A609601C420022C2A66A660600040320BA266060002032603200E6068010464646A09C4444464646464646464660706606A00C0066607066068660A600C018660A6006018660706606E6608E6A6A66A60C60CA00401E0BC0B2660B601201090011981C1981F998188070009981C1981B9811800A40006607066068604201C60420026607066068604401C60440026606E604801C6048002660706606A60AA00A09666070A66A609024466609C44A66A60A26A6A0040C40B8266008004002200200200809E442A66A0020C6440A6A66A609024466609C44A66A60A26A0040B8266008004002200200260B000E09E442A66A0020C6440A666609A08000600860A40066A0020ACA66A608824466609444A66A660666A6A6A00E0BC0AE0C46A6A0040AE0C4266008004002200200260A80062C0D06A0100BA6A6A0020B00A6A66A608400C420022C603000C606600E4464646A09E44444A66A6A00E440A8426464646464646464646464646607E660700286660AA09000800C6607E66076014660B40060246607E6607E6607C6609C6A0040C00120106607E6606E6A0040BC6A01A0D26606C6A0040BE6A01A0CA6607E6607866AA60CE0D846A00244660CA00466AA60D40DE46A00244660D0004666A0026E012000700466E0000520000013304000B3500922330723306400233072330640010090540540033303F3303E3304E3535335306A06C0010160650603306200F00E48008CC0FCCC0F0C1700181494CD4C13C488CCC154894CD4C160D4D40081A418C4CC010008004400400400C1588854CD40041A888168C168014CD4C1A01A800C04CD40041754CD4C12C488CCC144894CD4CC0DCD4D4030194178D40081784CC010008004400400400C581BCC160004D403418CCCD4080178D4D4080188178004CC11800C004CC164020D4004170CC140004020D4D40041681554CD4C11001C8400458124C06401CC0D0020448004584D55CF0011AAB9D0013754004444A66A6600600400207809C46A0020B0246666666600204044A666AE68CDC38010008020A999AB9A3371200400203203044666AE68CDC400100081B01E802802001912999AB9A337120040022002200444A666AE68CDC4801000880108008881F11199AB9A3371000400207406644666AE68CDC480100081C81911199AB9A337120040020620706607C91100488100223333550023303F2233350050480010023500304222337000029001000A4000660784446006600400240026607666076E01200070246A0024444400A46A0020A246A0024407246A0024406C464A666AE68C140D55CE8008991919191981E2999AB9A305435573A00626464646464646464646464646464646464646464646424666666666600201A01801601401201000E00A00600460446AE84D5D10011980F1981DBAE2001357420026AE88008CC071D71ABA100135744016A666AE68C190D55CE804899191919827A999AB9A306735573A004264660A066038EB4D5D0800980D9ABA1357440026AAE7800817D4CCD5CD18339AAB9D001132330503301C75A6AE84004C06CD5D09ABA200135573C0020BE6EA8D5D09ABA200237546AE84004D55CF00482E1980C9981B019BAD35742014660300326AE84028CCC059D70029ABA100A33301575C0086AE84028CC054008D5D08051980A1192999AB9A306035573A0022646609260326AE84004C010D5D09ABA200135573C0020B06EA8004D5D08051192999AB9A305F35573A002264646660B060606AE84008CCC059D70029ABA10013303375C6AE84D5D10009ABA200135573C0020AE6EA8004CC045D73AD37546AE84004D5D10009ABA2001357440026AE88004D5D10009ABA200135573C006098A666AE68C15C0044C848888C010014C02CD5D09AAB9E00215333573460AC00226424444600400A60486AE84D55CF0010A999AB9A3055001132122223001005300C357426AAE7800854CCD5CD182A0008990911118018029BAE357426AAE78008130D55CE8009BAA357426AE88008DD51ABA100135573C0020906EA80048C94CCD5CD182800081E8A999AB9A304F00102B04735573A6EA800488C8C94CCD5CD18290008058A999AB9A3051001130193004357426AAE7800854CCD5CD18280008050241AAB9D00137540024464460046EAC004C10888CCCD55CF8009014119198239981C98031AAB9D001300535573C00260086AE8800CD5D0801020919118011BAC00130402233335573E002404C46608860086AE84008C00CD5D100101F91919192999AB9A305300211222203515333573460A4004220922A666AE68C1440084C8C848888888CC004024020DD69ABA135744A0046EB8D5D0A8008A999AB9A3050002132321222222233002009008375C6AE84D5D128011BAE35742A0022A666AE68C13C0084C8C848888888CC018024020DD71ABA135744A004603A6AE85400454CCD5CD1827001099091111111803804180E9ABA135573C0062A666AE68C1340084C848888888C014020C074D5D09AAB9E003045135573C0046AAE74004DD50009192999AB9A304A35573A0022646606660086AE84004DD69ABA1357440026AAE78004108DD50009192999AB9A304935573A00226EB8D5D09AAB9E0010413754002220582205444A66A00442A66A00442660240040020462A66A0024046068446A004446A006446666010008006004002446A004444446A00C44444A66A6601E01400A2A66A6601E0120082A666AE68CDC38040018A999AB9A3370E00E0042A66A00C42A66A004426A004446A004446A00A446A00444A66A666602E00C00A0040022A66A00E42A66A008426604800400206A2A66A006406A08C0680562A66A002405607805405405405444446466A00A466A0084A666AE68CDC78010008018121013919A802101392999AB9A3371E0040020060482A66A00642A66A0044266A004466A00446601200400244405444466A0084054444A666AE68CDC38030018A999AB9A3370E00A0042660220080020520520442A66A00240440664466A004466A00446601C0040024046466A004404646601C004002446A004446A00644A666AE68CDC780200109980780180081091199AA9815019180680191A80091199AA981681A980800311A80091199A800919805A40000020144660160029000000998030010009981280100A91199AB9A3370E00400202C03A44A66A00420020324466AA605205C46A002446604E004666A002466AA605A06446A0024466056004601800200244666010016004002466AA605A06446A0024466056004601600200266600600C004002444666AA605005C06466AA605205C46A002446604E0046010002666AA605005C446A00444A66A666AA6054064601A01646A002446601400400A00C200626606C00800602800266AA605205C46A002446604E0046606844A66A002260120064426A00444A66A6601800401022444660040140082600C00600800442444600200842444600600844666AE68CDC780100080800B9980E80080A11299A801012080091980E11199A8018128010009A80080F9192999AB9A303435573A00226464646466666042666016EB9D71ABA100433300B75CEB8D5D08019BAD357420046EB4D5D0800998051192999AB9A303A35573A0022646604660146AE84004CC035D71ABA1357440026AAE780040C8DD50009ABA1357440026AE88004D5D10009ABA200135573C0020586EA80048C94CCD5CD18199AAB9D0011323301C3005357420026600C0086AE84D5D10009AAB9E00102B375400246464A666AE68C0D00044C8C8C8C8C8488CCC00401801000CDD69ABA1357440046EB4D5D08009ABA2002375A6AE84004D55CF0010A999AB9A3033001130103004357426AAE780080ACD55CE8009BAA0012323253335734606600226424460020066EB8D5D09AAB9E00215333573460640022601E6EB8D5D09AAB9E00202A35573A0026EA800488C8C94CCD5CD18190008980798021ABA135573C0042A666AE68C0CC0040380A8D55CE8009BAA001222325333573460626AAE740044C8CC068C014D5D080098021ABA1357440026AAE780040A4DD5000911A8009119198131119A800A4000446A00444A666AE68CDC7801004898038008980300180298129119A800A4000446A00444A666AE68CDC7801003880089803001919A80081100211A800911A80111111111111999A805900B900B900B9199AA981101500B11A80091299A998090010020980C00180B805912999AB9A3371E6A0040346A0020342666AE68CDC39A80100B1A80080B001805003880B91180F11299A80088019109980300118020009299A800900B0019111A801111299A800909A8029111111111299AA99A999AA981001400A11A800912999AB9A3371E00401C2602C00602A0044260286A0020440244260240022C2C2006424460040066601444A66A0044200620020022018446602E44A66A00203C4426A00444A666AE68CDC78010038A99A8008111109A80111299A8018A999AB9A302D00113301400B0020262202813006003002235001222222222200A2350012201C23500122222222220092220032220012220023333300248811C0BE55D262B29F564998FF81EFE21BDC0022621C12F15AF08D0F2DDB10048811CE4214B7CCE62AC6FBBA385D164DF48E157EAE5863521B4B67CA71D8600330014891C13AA2ACCF2E1561723AA26871E071FDF32C867CFF7E7D50AD470D62F004881074D494E535741500048811C2F2E0404310C106E2A260E8EB5A7E43F00CFF42C667489D30E179816004881054F574E455200221233001003002222221233333001006005004003002300B22112225335001135003006221333500500C300400233355300700F0050040012200130092211222533500110022213300500233355300700D005004001300822112253350010052213300F30040023355300600B00400111001220023005221225333573466E20005200013005490103505436001533500213005491035054370022153335734602C0062004266A600C01000266E0400D2002253357380022C240026004444A66A00220044426A004446600E66601000400C00200660024444A66A00220044426A00444A666AE68C0500044CCC02001C01800C4CCC02001CCC028CCC02C01C00800401800C8C8C00400488CC00CC00800800488488CC00401000C88848CCC00401000C00854CD5CE2490350543100162215335001100200715335738921001622222222007220053704904D0F910B111110021B8748000DC3A40046E1D2004370E90031B8748020DC3A40146E1D200C01049FD8799FD8799FD8799F581CB6A399BB1A6598ADD297EB8724911C41FB720F6D17F6221636B458E3FFD8799FD8799FD8799F581CB84DC1F29279A96CD8D21B1F81A63B10D01103A9EB86FFC79D1AB1B2FFFFFFFFD8799FD8799F581CB6A399BB1A6598ADD297EB8724911C41FB720F6D17F6221636B458E3FFD8799FD8799FD8799F581CB84DC1F29279A96CD8D21B1F81A63B10D01103A9EB86FFC79D1AB1B2FFFFFFFFD87A80D8799FD8799F4040FF1A18E0E563FF1A001E84801A001E8480FFD8799FD8799F4040FFD8799F581CCE5B9E0F8A88255B65F2E4D065C6E716E9FA9A8A86DFB86423DD1AC04444494E47FF1B0000016902C758161B0000018B9265F3F5D8799FD8799FD8799FD8799F581CAAFB1196434CB837FD6F21323CA37B302DFF6387E8A84B3FA28FAF56FFD8799FD8799FD8799F581C52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2FFFFFFFFD87A80FFFFFFFF0582840001D879808219A44D1A00E33567840000D8799FD8799FD8799F581CBCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9DFFD8799FD8799FD8799F581C52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2FFFFFFFF02FF821A00280F711A2EE1ABA7A30081825820F91F45CD2DC870AE7F65186C74C6A183A540898E61D51A3126A6F00BB950B27958402BBF458FCC9ADBBDB5990BA91606CEFABAEE1439BDCB498D1FCC2C9E936A6361A126BE17E9D2955276F5FF66D855C1AFB3FE7B8B1BE0B4CAA9D60ABE3F4D8E08049F80D8799F582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B3D8799F4040FF1A26BE3680D8799F4040FF1A015B23309FD8799FD8799F581C4523C5E21D409B81C95B45B0AEA275B8EA1406E6CAFEA5583B9F8A5F4B000DE14042756431383833FF01FFFF1A48190800582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B31B0000019051AF7A480100FFD8799F582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B3D87A80FFFF058284000501821A00279C441A2F128CEB840100D8799FD8799F5820BAF4F9A24D72868698BDD2FCCCF1C00E3990252F239AFAA031FEA146B8E7942EFF01FF821A001F69F81A260DE8FAA1008182582006E05CFF0C72A3EF4E2853C351BD122FE7E5049A37737983394F012EAB37C8515840725086D5F44100A22705E0BC545C4B24F77266DC6C8154EB1B7FAE989C87566E7CDAECDB4AFB5EDDE2050AFFBA426E27457F2CDF1EC26C31B0AFD2AC61C6680BA1008282582004F3E99F60B98399C5420DBEC2BEECFE5F7E2DB477962BBDB1EAB4FB5C87BE3258402678886A86150F1314C65211E57639FB4B37E45A38E15CB894F27D3EA3B9AE23E32AF0FD551F89C6C13ED156A8CCAFDE94E7568BCE26CCFE7A0A8B40B2D243028258206BB92A20014AF583D1ECB932D8C6FC284274CB5DF043EC36546F0FC8B10C27DE58408A5CCCD412A974E67341364E431BB349C1138A8AE61BF7689E949D7A555A1E14B5CFBC006B66497C4B230F247E433D2F453115011081359258925218972AA50DA10082825820B2C6CA24ECEEAA1D8E3F4E7B7D08582EB988CFCA33ACE149D97D13292D79CEDF58401758913ADDC471E9E53570E72B5778B6E9C7D3D47A4EBB1E64B8959BC70847DA6E1A5B86061C772135C3C7B6BED6B10F4A6A192F59B7653A45FAA64F9B6463048258203A2680B177DBB362922FA79A4C944D79221AC55CA6C3A0C11B60AEC9898BBC1E5840920288EFF6A54E2FB20C25B4F040024926FF0708713E68ED7779582927A1CA4D9EB05D133CE92AADA7F4AD3BD5E704A85AC2F68809569762F25D09937AE42F01A2008182582045E7EE2749DD98AC23244FF99D31DF8C64CBBC17D246B02DE9612268740B7D3558402271B7EB17EBBCB5119D0E41A953FC1344AC69C7B690599404DEDED7193852C175A6C8D7912E8DCA3E3AA87512308C3CA430CE9B5488047282A8BD3105372B090581840001D87980821A0012C8941A15F9CDB0A101A11902A2A1636D736781774D696E737761703A204F7264657220457865637574656480 \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Benchmark/data/conway_block.cbor b/src/Chrysalis.Cbor.Benchmark/data/conway_block.cbor new file mode 100644 index 00000000..a41f250d --- /dev/null +++ b/src/Chrysalis.Cbor.Benchmark/data/conway_block.cbor @@ -0,0 +1 @@ +85828a1a00aab3351a087627515820e13008ed2878e76bec0a7d8b9cce09bf0954b1de7df25e529a9fbb727d00a8fe5820884bda542e411996a77aa9eae42bb7135bf318f21223272e0ba8f6531c8fc6f758207939de8b59dcc48dc96903763bc544cb145c72f57c1ff6aa2d954938e92c2182825840030d6c4da9a6d75239d89d7c4d393505ff6e46c5a8281b8fbfd35a373f3587959794ccd903831a82795cb894f2d104ce397ce0e6538062b01aee71521b8fe6de5850004131777b6bd82b9d65ebf3e586ba7ea193cfc16887724a56aeaddbcce3cffc40217595bfe78cbfb26b8f4521548f8073189e82b3fdeb0a0c1099e7787cb4b166fdc6cdf0ca7041aadab8cfed55530919093358208c420c878f10208c6ea8e219c9ccf10710b8323d00581028a5246bdc6f6eb893845820dbbafa8dd141507d22f03dcbb034f32a52233ab77560476239aac53d1a19be5a1619042d5840ef364b08ab30ca2d6731fb5edb2a86d520315cedddd724b2b7ef4646d1f60ef8ade88f32e79d4beb58cec04dfc214d4743ad2f9b232a2ebfbb0e8915a8a1e70d8209015901c0261b318072ac4bee9670513ea46b31cd45a8b9af8499ad79e9b42fb5a974cefd2338981b6dd8f126541cf2d3a6bb83aff9e062124c8cbe3b6d203ea5401c0b06cc401a42831e535ed2beb69199a11aa883c07a3e4ffe3365b3828cb97abb5be0f48ed8aaa8a0d998dd337d7c893d992e8e475e9db3639afbda80a87acc5f4ba215126835530f42f69481514721a8d91de863ef6dc51c053e4846081ff6984e9833faae8ea0f1fe1896cd687099807c6915c8eeddfef74c313499d7544d61f4d8790a23c4817d53fb5d1ca22e57d4958d6dd0443626ab4446debd98e21f070793f0051c2655eff26ca34a7c5ac7bb6b129af95b73ad3b071d0297fb3b422f3c6d20f35f2131d513811f40a861dc7ba8d2f4bdb2be2113b219a05f326d635709edf49c119cc929a3728c91886e3b781a241893103c8063c98203fc7139dfa119b4b66d2ff8d796f2c53c1ac91fb3bc1ad9f18b2d58c2360820ebf5e3f40514dd10f8d54413ef3c14d2825c6eef2ffebf6771653736e13685969751d3cd31f293944d85c6c025349262e479ef4aa9531d7de3bc57ce599afdc6ec4f452e7fc89f20b076f24ea3aac036c0bc0c163c262839b1d854556570316451b20e05feadb88d84a4008182582033c0049e3b1c8a47c9c0879aa595da1eedcedb99876baa9398138fe7e5cdaf86000182a300583911464eeee89f05aff787d40045af2a40a83fd96c513197d32fbc54ff02160445e0993401c21bfcc5958fe7523c582b4036be914ce854307df5011a0c136e40028201d818590102d8798c4100581c9607a38a73da1c6c104aba3edbad7bf6ae820816407539ecf540eaf7d8798240401a0bebc2001a000927c01a00802dc3d87982581c161e4f460b61d1a78248af3f8a181a6b476e4197d7f9def3453f536a4b5341442054484520434154d879821a1908f02f1b00000002540be4001a0007a120d87982d87981581c8d9913a5d5e98c6aab297d090dd0cb4e850cf238c534b6a9dd907213d87981d87981d87981581c160445e0993401c21bfcc5958fe7523c582b4036be914ce854307df5581c8d9913a5d5e98c6aab297d090dd0cb4e850cf238c534b6a9dd90721381581cedbf33f5d6e083970648e39175c49ec1c093df76b6e6a0f1473e4776825839018d9913a5d5e98c6aab297d090dd0cb4e850cf238c534b6a9dd907213160445e0993401c21bfcc5958fe7523c582b4036be914ce854307df51a0023394c021a0002d09107582010b3cd99c9eb9ddfb67964a72cea96cd80be25fe7c8b161f3c999dc1d3358378a70081825820f8e308859e29fc128d0b70188ff5747aa7abc7dd0d339839d499ec4a03aabda9000181825839015455a2fd7ea563dbcf4dacf267d9d2326b7b7ce2b82140f536a1b8883219ec303b9f9facd2c6f49ad14a4ed5982b6553da4e90e3196a1b881a11ed14b0021a0003d0900b5820a5b75a3d7bf7ebc7e003f09fd99add064f71cc0f45035e3d80ce02c9b02bd9100d818258209349ed1f38b09100a5eaac0f4ad42441af53e70ce06bf57b566395f74a2ec1cb000e81581c5455a2fd7ea563dbcf4dacf267d9d2326b7b7ce2b82140f536a1b88812818258205ec56338104fcbfe32288c649d9633f0d9060abce8b8608b156294f0a81d29e201a800828258208f6646b372d3232eecffb9ef2cfba7b1dff3247b5fdccda22bdc4ecd7bd8042500825820f1b5a90ad9e754577b51dd476de8fbfa0d951e82cdf693346cc30fb7503b159b000183a2005839018d9913a5d5e98c6aab297d090dd0cb4e850cf238c534b6a9dd907213160445e0993401c21bfcc5958fe7523c582b4036be914ce854307df501821a0016e360a1581c161e4f460b61d1a78248af3f8a181a6b476e4197d7f9def3453f536aa14b53414420544845204341541a01005b87a300583931905ab869961b094f1b8197278cfe15b45cbe49fa8f32c6b014f85a2db2f6abf60ccde92eae1a2f4fdf65f2eaf6208d872c6f0e597cc10b0701821a70fb3dd7a2581c161e4f460b61d1a78248af3f8a181a6b476e4197d7f9def3453f536aa14b53414420544845204341541a24c0e7cc581c63f947b8d9535bc4e4ce6919e3dc056547e8d30ada12f29aa5f826b8a15820e216425600a641a314c19a32fff56f751f5bff81740f2232693d607379f3bee401028201d81858e9d87989d87982581c63f947b8d9535bc4e4ce6919e3dc056547e8d30ada12f29aa5f826b85820e216425600a641a314c19a32fff56f751f5bff81740f2232693d607379f3bee4d879824040d87982581c161e4f460b61d1a78248af3f8a181a6b476e4197d7f9def3453f536a4b53414420544845204341541b0000001166b125ce1a001373c2581cedbf33f5d6e083970648e39175c49ec1c093df76b6e6a0f1473e47761b000000028f200558581c8807fbe6e36b1c35ad6f36f0993e2fc67ab6f2db06041cfa3a53c04a581c554daf3e27e50c8c779713be6ba70f95c35f23f0552a28e5a7a340148258390122aea2da15e494e01767145d48bda16b6d437f1c449823a044193daf299a82ef56311aa10adf04c0072d4870eb9f4d5ff315132434841b741a00297bc7021a0005d19905a1581df196f5c1bee23481335ff4aece32fe1dfa1aa40a944a66d2d6edc9a9a5000b58203a98f88216e5025db28f06e90c56b3def9f35e3ac2beef37aef7f09ace7a60c00d8182582006f24741c2cbc3f59096046de95fcd5d90a77e5378d95fd60f2ec261aa5c7981000e81581cedbf33f5d6e083970648e39175c49ec1c093df76b6e6a0f1473e47761283825820b91eda29d145ab6c0bc0d6b7093cb24b131440b7b015033205476f39c690a51f00825820c4a540ac2e06c217dd4fb3f39ca3863da394ba134677dafa9b98830ca71d584d03825820b91eda29d145ab6c0bc0d6b7093cb24b131440b7b015033205476f39c690a51f01a400818258203f43134f45bcadea987e8dccbb569a4526d764787a2adb4045da6543142c8fde01018182583901b610bfca05d92c04eb6a460c2570d6d467813052608c7390daf0017d3afa303ff7969d061294da7def04496d6a87a7c6dde3acbf78a81d131a418b90e9021a00028774031a087627f484a1008182582020c38545a0a4dc453f98da0390d2dd5236bb81a7c11a73415262396cac156eeb5840c5af8bd8a617e7a07a5ae9a1babf6ff10c8ebd63d24866421eb0d597cf680f99492b144b08592ec408c1d2cf87bbe0f095e5b2d1a59839a511791ea4b1d7bd09a200818258201e2fd4178008a65e0d7d67c5fe29886dc825c48dd6be93afa90152106b9a93115840e39d41754c543a562b2664326f12369b3ee7f1088460aae06aa24a0b51b4a8f77d399fdb16f8e25cc5462a3b4fa5cce2c9c263946ff5a93ba56f0f169e76e60d0581840000d87a808219c3501a00989680a2008182582014585da9857b30cf57edccac19d3012b602bb5650c7726a5f1504d9614d205225840811625a2dd2b98db4a8ab7679d6f0e96dc8221ed925699e5e137db3e98099f4512df97e2a593a20c4acbc259e686e6838723cfc8580aae7e8648596d7e4d66060583840000d87a80821a000186a01a01c9c380840001d879830101d87980821a000864701a0d1cef0084030080821a000668a01a09896800a100818258207c344966b70455b888ed29a70cae086e24fab05e53ada41706c91a2f4ba9202f5840e4926495d6fb2d57746ffd9cb183a48f92d2836bb064631407dd5728a3cf222947153eed9ce05e7fc15541e27bc463f97cd726a3d45fb2cd4c9cef614deea409a100a10782582084d7eaaeeaaba1163a821a8b2e65865f8255a7d8d70197bcaa90465ac0559bc658202cd2d799d8afed19fb68ae8aba25178d4cb2ab4efa6536bd60afabb30560560c80 \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Cli/Chrysalis.Cbor.Cli.csproj b/src/Chrysalis.Cbor.Cli/Chrysalis.Cbor.Cli.csproj new file mode 100644 index 00000000..e54cf9f5 --- /dev/null +++ b/src/Chrysalis.Cbor.Cli/Chrysalis.Cbor.Cli.csproj @@ -0,0 +1,14 @@ + + + + + + + + Exe + net9.0 + enable + enable + + + diff --git a/src/Chrysalis.Cbor.Cli/Program.cs b/src/Chrysalis.Cbor.Cli/Program.cs new file mode 100644 index 00000000..1f1dbd58 --- /dev/null +++ b/src/Chrysalis.Cbor.Cli/Program.cs @@ -0,0 +1,55 @@ +using Chrysalis.Cbor.Cardano.Extensions; +using Chrysalis.Cbor.Cardano.Types.Block; +using Chrysalis.Cbor.Serialization; + +if (Console.IsInputRedirected) +{ + Stream inputStream = Console.OpenStandardInput(); + // Stream outputStream = Console.OpenStandardOutput(); + byte[] buffer = new byte[1024]; + + while (true) + { + // Read the 4-byte length prefix + byte[] lengthBytes = new byte[4]; + int bytesRead = inputStream.Read(lengthBytes, 0, 4); + + // Check if we’ve reached the end of the stream or have an incomplete length + if (bytesRead < 4) + { + if (bytesRead > 0) + { + Console.Error.WriteLine("Incomplete length read. Exiting."); + } + break; + } + + // Convert big-endian length to integer + int blockSize = BitConverter.ToInt32([.. lengthBytes.Reverse()], 0); + + int totalBlockBytesRead = 0; + byte[] blockBuffer = new byte[blockSize]; + + // Read the block data in chunks + while (totalBlockBytesRead < blockSize) + { + int bytesToRead = Math.Min(buffer.Length, blockSize - totalBlockBytesRead); + bytesRead = inputStream.Read(buffer, 0, bytesToRead); + + if (bytesRead == 0) + { + Console.Error.WriteLine("Unexpected end of stream while reading block."); + return; + } + + // Copy the read bytes to the block buffer + Buffer.BlockCopy(buffer, 0, blockBuffer, totalBlockBytesRead, bytesRead); + + totalBlockBytesRead += bytesRead; + } + + //Console.Out.WriteLine(Convert.ToHexString(blockBuffer)); + CborSerializer.Deserialize>(blockBuffer); + //Console.Out.WriteLine(block.Block.Slot()); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/Cargo.lock b/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/Cargo.lock new file mode 100644 index 00000000..51498901 --- /dev/null +++ b/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/Cargo.lock @@ -0,0 +1,2025 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "async-trait" +version = "0.1.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bip39" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33415e24172c1b7d6066f6d999545375ab8e1d95421d6784bdfff9496f292387" +dependencies = [ + "bitcoin_hashes", + "rand_core 0.6.4", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals", + "hex-conservative", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cryptoxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382ce8820a5bb815055d3553a610e8cb542b2d767bbacea99038afda96cd760d" + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "ed25519-bip32" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb588f93c0d91b2f668849fd6d030cddb0b2e31f105963be189da5acdf492a21" +dependencies = [ + "cryptoxide", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.170" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" + +[[package]] +name = "linux-raw-sys" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "minicbor" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0452a60c1863c1f50b5f77cd295e8d2786849f35883f0b9e18e7e6e1b5691b0" +dependencies = [ + "half", + "minicbor-derive", +] + +[[package]] +name = "minicbor-derive" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd2209fff77f705b00c737016a48e73733d7fbccb8b007194db148f03561fb70" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "n2c-stdout" +version = "0.1.0" +dependencies = [ + "hex", + "pallas", + "tokio", + "tokio-postgres", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" + +[[package]] +name = "pallas" +version = "0.32.0" +dependencies = [ + "pallas-addresses", + "pallas-codec", + "pallas-configs", + "pallas-crypto", + "pallas-network", + "pallas-primitives", + "pallas-traverse", + "pallas-txbuilder", + "pallas-utxorpc", +] + +[[package]] +name = "pallas-addresses" +version = "0.32.0" +dependencies = [ + "base58", + "bech32", + "crc", + "cryptoxide", + "hex", + "pallas-codec", + "pallas-crypto", + "thiserror", +] + +[[package]] +name = "pallas-applying" +version = "0.32.0" +dependencies = [ + "chrono", + "hex", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "pallas-traverse", + "rand 0.8.5", + "thiserror", +] + +[[package]] +name = "pallas-codec" +version = "0.32.0" +dependencies = [ + "hex", + "minicbor", + "serde", + "thiserror", +] + +[[package]] +name = "pallas-configs" +version = "0.32.0" +dependencies = [ + "base64 0.22.1", + "hex", + "num-rational", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "serde", + "serde_json", + "serde_with", +] + +[[package]] +name = "pallas-crypto" +version = "0.32.0" +dependencies = [ + "cryptoxide", + "hex", + "pallas-codec", + "rand_core 0.6.4", + "serde", + "thiserror", + "zeroize", +] + +[[package]] +name = "pallas-network" +version = "0.32.0" +dependencies = [ + "byteorder", + "hex", + "itertools 0.13.0", + "pallas-codec", + "pallas-crypto", + "rand 0.8.5", + "socket2", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "pallas-primitives" +version = "0.32.0" +dependencies = [ + "base58", + "bech32", + "hex", + "log", + "pallas-codec", + "pallas-crypto", + "serde", + "serde_json", +] + +[[package]] +name = "pallas-traverse" +version = "0.32.0" +dependencies = [ + "hex", + "itertools 0.13.0", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "paste", + "serde", + "thiserror", +] + +[[package]] +name = "pallas-txbuilder" +version = "0.32.0" +dependencies = [ + "hex", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "pallas-traverse", + "pallas-wallet", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "pallas-utxorpc" +version = "0.32.0" +dependencies = [ + "pallas-applying", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "pallas-traverse", + "prost-types", + "utxorpc-spec", +] + +[[package]] +name = "pallas-wallet" +version = "0.32.0" +dependencies = [ + "bech32", + "bip39", + "cryptoxide", + "ed25519-bip32", + "pallas-crypto", + "rand 0.8.5", + "thiserror", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pbjson-build" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" +dependencies = [ + "heck", + "itertools 0.13.0", + "prost", + "prost-types", +] + +[[package]] +name = "pbjson-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887" +dependencies = [ + "bytes", + "chrono", + "pbjson", + "pbjson-build", + "prost", + "prost-build", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap 2.7.1", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "postgres-protocol" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand 0.9.0", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" +dependencies = [ + "bytes", + "fallible-iterator", + "postgres-protocol", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy 0.7.35", +] + +[[package]] +name = "prettyplease" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.23", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f8dcd64f141950290e45c99f7710ede1b600297c91818bb30b3667c0f45dc0" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.1", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" +dependencies = [ + "cfg-if", + "fastrand", + "getrandom 0.3.1", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" + +[[package]] +name = "time-macros" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.9.0", + "socket2", + "tokio", + "tokio-util", + "whoami", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "http", + "http-body", + "http-body-util", + "percent-encoding", + "pin-project", + "prost", + "tokio-stream", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "utxorpc-spec" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7148c5cd211c397a41245cfbd8d4cb8371d748ed5e3cf131ebcd9cacfa794206" +dependencies = [ + "bytes", + "futures-core", + "pbjson", + "pbjson-types", + "prost", + "prost-types", + "serde", + "tonic", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", + "web-sys", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +dependencies = [ + "zerocopy-derive 0.8.23", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/Cargo.toml b/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/Cargo.toml new file mode 100644 index 00000000..a6ada731 --- /dev/null +++ b/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "n2c-stdout" +version = "0.1.0" +edition = "2021" + +[dependencies] +hex = "0.4.3" +pallas = { path = "../../pallas" } +tokio = { version = "1.43.0", features = ["full"] } diff --git a/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/src/main.rs b/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/src/main.rs new file mode 100644 index 00000000..7a7ca83e --- /dev/null +++ b/src/Chrysalis.Cbor.Cli/rust/n2c-stdout/src/main.rs @@ -0,0 +1,195 @@ +use pallas::{ + ledger::traverse::{wellknown::PREVIEW_MAGIC, MultiEraBlock}, + network::{ + facades::NodeClient, + miniprotocols::{chainsync::NextResponse, Point}, + }, +}; +use std::{ + sync::{ + atomic::{AtomicUsize, Ordering}, + Arc, + }, + time::Duration, +}; +use tokio_postgres::{Client, NoTls}; + +#[tokio::main] +async fn main() { + // Initialize the database + let db_client = match initialize_db().await { + Ok(client) => Arc::new(client), + Err(e) => { + eprintln!("Failed to initialize database: {}", e); + return; + } + }; + println!("Database initialized"); + + // Connect to the node + let socket_path = "/home/rjlacanlale/cardano/ipc/node.socket"; + let mut client = match NodeClient::connect(socket_path, PREVIEW_MAGIC).await { + Ok(client) => client, + Err(e) => { + eprintln!("Failed to connect to node: {}", e); + return; + } + }; + println!("Connected to node"); + + // Get the chainsync client + let chainsync_client = client.chainsync(); + + // Define the point + let point = + match hex::decode("20a81db38339bf6ee9b1d7e22b22c0ac4d887d332bbf4f3005db4848cd647743") { + Ok(bytes) => Point::Specific(57371845, bytes), + Err(e) => { + eprintln!("Failed to decode hex: {}", e); + return; + } + }; + + // Find intersection + println!("Finding Intersection..."); + match chainsync_client.find_intersect(vec![point]).await { + Ok(_) => println!("Intersection found"), + Err(e) => { + eprintln!("Failed to find intersection: {}", e); + return; + } + } + + // Use atomic counters for block counting and deserialization tracking + let block_count = Arc::new(AtomicUsize::new(0)); + let deserialized_count = Arc::new(AtomicUsize::new(0)); + + // Create a task to periodically print block count and deserialization stats + let block_count_clone = Arc::clone(&block_count); + let deserialized_count_clone = Arc::clone(&deserialized_count); + + tokio::spawn(async move { + loop { + let blocks = block_count_clone.load(Ordering::Relaxed); + let deserialized = deserialized_count_clone.load(Ordering::Relaxed); + println!( + "Block count: {}, Deserialized: {}, Success rate: {:.2}%", + blocks, + deserialized, + if blocks > 0 { + (deserialized as f64 / blocks as f64) * 100.0 + } else { + 0.0 + } + ); + block_count_clone.store(0, Ordering::Relaxed); + deserialized_count_clone.store(0, Ordering::Relaxed); + tokio::time::sleep(Duration::from_secs(1)).await; + } + }); + + println!("Starting ChainSync..."); + + // Main loop for chain sync + loop { + // Request next message + match chainsync_client.request_next().await { + Ok(response) => { + match response { + // Handle RollForward + NextResponse::RollForward(content, _tip) => { + // Deserialize the block + match MultiEraBlock::decode(&content.0) { + Ok(block) => { + block_count.fetch_add(1, Ordering::Relaxed); + deserialized_count.fetch_add(1, Ordering::Relaxed); + + // Extract block data + let block_number = block.number() as i64; // Using count as number for simplicity + let block_slot = block.slot() as i64; + let block_hash = hex::encode(block.hash()); + + // Insert into database and await completion + match insert_block( + &db_client, + block_number, + block_slot, + &block_hash, + ) + .await + { + Ok(_) => {} + Err(e) => { + eprintln!("Failed to insert block: {}", e); + } + } + } + Err(e) => { + eprintln!("Failed to deserialize block: {}", e); + } + } + } + NextResponse::RollBackward(point, _) => { + println!("Rolling back to {}", point.slot_or_default()); + } + NextResponse::Await => { + println!("Tip reached!"); + } + } + } + Err(e) => { + eprintln!("Error in request_next: {}", e); + } + } + } +} + +async fn initialize_db() -> Result { + // Connect to the database + let (client, connection) = tokio_postgres::connect( + "host=localhost dbname=chrysalis-rs user=postgres password=test1234 port=5432", + NoTls, + ) + .await?; + + // The connection object performs the actual communication with the database + tokio::spawn(async move { + if let Err(e) = connection.await { + eprintln!("connection error: {}", e); + } + }); + + // Drop the table if it exists + client.execute("DROP TABLE IF EXISTS blocks", &[]).await?; + + // Create a fresh table with minimal columns + client + .execute( + "CREATE TABLE blocks ( + block_number BIGINT NOT NULL, + block_slot BIGINT NOT NULL, + block_hash VARCHAR(64) NOT NULL, + timestamp TIMESTAMP NOT NULL DEFAULT NOW() + )", + &[], + ) + .await?; + + Ok(client) +} + +async fn insert_block( + client: &Client, + block_number: i64, + block_slot: i64, + block_hash: &str, +) -> Result<(), tokio_postgres::Error> { + client + .execute( + "INSERT INTO blocks (block_number, block_slot, block_hash) VALUES ($1, $2, $3)", + &[&block_number, &block_slot, &block_hash], + ) + .await?; + + Ok(()) +} diff --git a/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Emitter.cs b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Emitter.cs new file mode 100644 index 00000000..803f45f8 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Emitter.cs @@ -0,0 +1,153 @@ +using System.Runtime.CompilerServices; +using System.Text; +using Microsoft.CodeAnalysis; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private interface ICborSerializerEmitter + { + StringBuilder EmitWriter(StringBuilder sb, SerializableTypeMetadata metadata); + StringBuilder EmitReader(StringBuilder sb, SerializableTypeMetadata metadata); + } + + private static partial class Emitter + { + public const string GenericSerializationUtilFullname = "global::Chrysalis.Cbor.Serialization.Utils.GenericSerializationUtil"; + public const string CborEncodeValueFullName = "global::Chrysalis.Cbor.Types.Primitives.CborEncodedValue"; + + public static void EmitSerializerAndMetadata(SourceProductionContext context, SerializableTypeMetadata metadata) + { + // Metadata emission + context.AddSource($"{metadata?.FullyQualifiedName.Replace("<", "`").Replace(">", "`")}.Metadata.g.cs", metadata?.ToString()!); + + // Serializer emission + StringBuilder sb = new(); + sb.AppendLine("// Automatically generated file"); + sb.AppendLine("#pragma warning disable CS0109"); + sb.AppendLine(); + sb.AppendLine("using System.Formats.Cbor;"); + sb.AppendLine(); + + if (metadata?.Namespace is not null) + { + sb.AppendLine($"namespace {metadata?.Namespace};"); + } + + sb.AppendLine($"public partial {metadata?.Keyword} {metadata?.Indentifier}"); + sb.AppendLine("{"); + + // Type Mapping + if (metadata?.SerializationType is SerializationType.Map) + { + bool isIntKey = metadata.Properties[0].PropertyKeyInt is not null; + sb.AppendLine($"static Dictionary<{(isIntKey ? "int" : "string")}, Type> TypeMapping = new()"); + sb.AppendLine("{"); + + List properties = [.. metadata.Properties]; + for (int i = 0; i < properties.Count; i++) + { + SerializablePropertyMetadata prop = properties[i]; + string? keyValue = isIntKey ? prop.PropertyKeyInt?.ToString() : prop.PropertyKeyString; + + if (i == properties.Count - 1) + { + sb.AppendLine($" {{{keyValue}, typeof({prop.PropertyTypeFullName})}}"); + } + else + { + sb.AppendLine($" {{{keyValue}, typeof({prop.PropertyTypeFullName})}},"); + } + } + + sb.AppendLine("};"); + sb.AppendLine(); + } + + // Property Key Mapping + if (metadata?.SerializationType is SerializationType.Map) + { + bool isIntKey = metadata.Properties[0].PropertyKeyInt is not null; + sb.AppendLine($"static Dictionary KeyMapping = new()"); + sb.AppendLine("{"); + + List properties = [.. metadata.Properties]; + for (int i = 0; i < properties.Count; i++) + { + SerializablePropertyMetadata prop = properties[i]; + string? keyValue = $"\"{prop.PropertyName}\""; + string? value = isIntKey ? prop.PropertyKeyInt?.ToString() : prop.PropertyKeyString; + + if (i == properties.Count - 1) + { + sb.AppendLine($" {{{keyValue}, {value}}}"); + } + else + { + sb.AppendLine($" {{{keyValue}, {value}}},"); + } + } + + sb.AppendLine("};"); + sb.AppendLine(); + } + + EmitSerializableTypeReader(sb, metadata!); + + sb.AppendLine(); + + EmitSerializableTypeWriter(sb, metadata!); + + sb.AppendLine("}"); + sb.AppendLine(); + sb.AppendLine("#pragma warning restore CS0109"); + + context.AddSource($"{metadata?.FullyQualifiedName.Replace("<", "`").Replace(">", "`")}.Serializer.g.cs", sb.ToString()); + } + + private static ICborSerializerEmitter GetEmitter(SerializableTypeMetadata metadata) + { + return metadata.SerializationType switch + { + SerializationType.Constr => new ConstructorEmitter(), + SerializationType.Container => new ContainerEmitter(), + SerializationType.List => new ListEmitter(), + SerializationType.Map => new MapEmitter(), + SerializationType.Union => new UnionEmitter(), + _ => throw new NotSupportedException($"Serialization type {metadata.SerializationType} is not supported.") + }; + } + + public static int ResolveTag(int? index) + { + if (index is null || index < 0) + { + return -1; + } + else + { + int finalIndex = index > 6 ? 1280 - 7 : 121; + return finalIndex + (index ?? 0); + } + } + + private static bool IsPrimitiveType(string type) => type.Replace("?", "") switch + { + "bool" => true, + "int" => true, + "long" => true, + "ulong" => true, + "uint" => true, + "float" => true, + "double" => true, + "decimal" => true, + "string" => true, + "byte[]" => true, + "CborEncodedValue" => true, + "Chrysalis.Cbor.Types.Primitives.CborEncodedValue" => true, + "global::Chrysalis.Cbor.Types.Primitives.CborEncodedValue" => true, + _ => false + }; + } +} diff --git a/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Metadata.cs b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Metadata.cs new file mode 100644 index 00000000..932ce767 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Metadata.cs @@ -0,0 +1,156 @@ +using System.Data.Common; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private enum SerializationType + { + Container, + Map, + List, + Constr, + Union + } + + private sealed class SerializableTypeMetadata( + string baseIdentifier, + string identifier, + string? @namespace, + string? typeParams, + string fullyQualifiedName, + string keyword, + int? cborTag, + int? cborIndex, + SerializationType serializationType, + string? validator, + bool shouldPreserveRaw + ) + { + public string BaseIdentifier { get; } = baseIdentifier; + public string Indentifier { get; } = identifier; + public string? Namespace { get; } = @namespace; + public string? TypeParams { get; } = typeParams; + public string FullyQualifiedName { get; } = fullyQualifiedName; + public string Keyword { get; } = keyword; + public int? CborTag { get; } = cborTag; + public int? CborIndex { get; } = cborIndex; + public SerializationType SerializationType { get; } = serializationType; + public string? Validator { get; } = validator; + public bool ShouldPreserveRaw { get; } = shouldPreserveRaw; + public bool IsTypeNullable => Indentifier.Contains("?"); + + public List ChildTypes { get; } = []; + public List Properties { get; } = []; + + public override string ToString() + { + // better formatted strring + return $$""" + // Keyword: {{Keyword}} + // Identifier: {{Indentifier}} + // Namespace: {{Namespace}} + // TypeParams: {{TypeParams}} + // FullyQualifiedName: {{FullyQualifiedName}} + // SerializationType: {{SerializationType}} + // CborTag: {{CborTag}} + // CborIndex: {{CborIndex}} + // ShouldPreserveRaw: {{ShouldPreserveRaw}} + // Validator: {{Validator}} + // Properties: {{string.Join(",", Properties.Select(p => p.ToString()))}} + // ChildTypes: {{string.Join(",", ChildTypes.Select(t => t.ToString()))}} + // IsTypeNullable: {{IsTypeNullable}} + """; + } + } + + private sealed class SerializablePropertyMetadata( + string propertyName, + string propertyType, + string propertyTypeFullName, + string propertyTypeNamespace, + bool isList, + bool isMap, + string? listItemType, + string? listItemTypeFullName, + string? listItemTypeNamespace, + bool isListItemTypeOpenGeneric, + bool isMapKeyTypeOpenGeneric, + bool isMapValueTypeOpenGeneric, + string? mapKeyType, + string? mapValueType, + string? mapKeyTypeFullName, + string? mapValueTypeFullName, + string? mapKeyTypeNamespace, + string? mapValueTypeNamespace, + bool isNullable, + int? size, + bool isIndefinite, + int? order, + string? propertyKeyString, + int? propertyKeyInt, + bool isOpenGeneric + ) + { + public string PropertyName { get; } = propertyName; + public string PropertyType { get; } = propertyType; + public string PropertyTypeFullName { get; } = propertyTypeFullName; + public string PropertyTypeNamespace { get; } = propertyTypeNamespace; + public bool IsList { get; } = isList; + public bool IsMap { get; } = isMap; + + public string? ListItemType { get; } = listItemType; + public bool IsListItemTypeOpenGeneric { get; } = isListItemTypeOpenGeneric; + public string? ListItemTypeFullName { get; } = listItemTypeFullName; + public string? ListItemTypeNamespace { get; } = listItemTypeNamespace; + public string? MapKeyType { get; } = mapKeyType; + public bool IsMapKeyTypeOpenGeneric { get; } = isMapKeyTypeOpenGeneric; + public string? MapValueType { get; } = mapValueType; + public bool IsMapValueTypeOpenGeneric { get; } = isMapValueTypeOpenGeneric; + public string? MapKeyTypeFullName { get; } = mapKeyTypeFullName; + public string? MapValueTypeFullName { get; } = mapValueTypeFullName; + public string? MapKeyTypeNamespace { get; } = mapKeyTypeNamespace; + public string? MapValueTypeNamespace { get; } = mapValueTypeNamespace; + + // Attributes + public bool IsNullable { get; } = isNullable; + public bool IsTypeNullable => PropertyType.Contains("?"); + public int? Size { get; } = size; + public bool IsIndefinite { get; } = isIndefinite; + public int? Order { get; set; } = order; + public string? PropertyKeyString { get; } = propertyKeyString; + public int? PropertyKeyInt { get; } = propertyKeyInt; + public bool IsOpenGeneric { get; } = isOpenGeneric; + + public override string ToString() + { + return $$""" + // PropertyName: {{PropertyName}} + // PropertyType: {{PropertyType}} + // PropertyTypeFullName: {{PropertyTypeFullName}} + // PropertyTypeNamespace: {{PropertyTypeNamespace}} + // IsNullable: {{IsNullable}} + // Size: {{Size}} + // IsIndefinite: {{IsIndefinite}} + // Order: {{Order}} + // PropertyKeyString: {{PropertyKeyString}} + // PropertyKeyInt: {{PropertyKeyInt}} + // IsList: {{IsList}} + // IsMap: {{IsMap}} + // ListItemType: {{ListItemType}} + // ListItemTypeFullName: {{ListItemTypeFullName}} + // IsListItemTypeOpenGeneric: {{IsListItemTypeOpenGeneric}} + // MapKeyType: {{MapKeyType}} + // MapValueType: {{MapValueType}} + // MapKeyTypeFullName: {{MapKeyTypeFullName}} + // MapValueTypeFullName: {{MapValueTypeFullName}} + // MapKeyTypeNamespace: {{MapKeyTypeNamespace}} + // MapValueTypeNamespace: {{MapValueTypeNamespace}} + // IsMapKeyTypeOpenGeneric: {{IsMapKeyTypeOpenGeneric}} + // IsMapValueTypeOpenGeneric: {{IsMapValueTypeOpenGeneric}} + // IsOpenGeneric: {{IsOpenGeneric}} + // IsTypeNullable: {{IsTypeNullable}} + """; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Parser.cs b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Parser.cs new file mode 100644 index 00000000..8ffb9e15 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.Parser.cs @@ -0,0 +1,545 @@ +using Chrysalis.Cbor.CodeGen.Extensions; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Chrysalis.Cbor.CodeGen; + + +public sealed partial class CborSerializerCodeGen +{ + private static class Parser + { + public static readonly Dictionary _cache = []; + + public const string CborSerializable = "CborSerializable"; + public const string CborMap = "CborMap"; + public const string CborNullable = "CborNullable"; + public const string CborList = "CborList"; + public const string CborUnion = "CborUnion"; + public const string CborConstr = "CborConstr"; + public const string CborTag = "CborTag"; + public const string CborOrder = "CborOrder"; + public const string CborPropertyAttribute = "CborPropertyAttribute"; + public const string CborProperty = "CborProperty"; + public const string CborSize = "CborSize"; + public const string CborIndefinite = "CborIndefinite"; + + // Interfaces + public const string ICborPreserveRawFullName = "Chrysalis.Cbor.Serialization.ICborPreserveRaw"; + public const string ICborPreserveRaw = "ICborPreserveRaw"; + public const string ICborValidatorFullName = "Chrysalis.Cbor.Serialization.ICborValidator`1"; + + public static SerializableTypeMetadata? ParseSerialazableType(TypeDeclarationSyntax tds, SemanticModel model) + { + IEnumerable attributes = tds.AttributeLists.SelectMany(a => a.Attributes); + AttributeSyntax? cborSerializableAttribute = attributes.FirstOrDefault(a => a.Name.ToString() == CborSerializable); + + if (cborSerializableAttribute == null) return null; + + string baseNamespace = GetBaseNamespace(tds, model); + (string path, string parentTypeParams) = GetFullNamespaceWithParentsAndTypeParams(tds, model); + string? keyword = tds.Keyword.ToFullString(); + string? @namespace = baseNamespace; + + string? typeParams = null; + if (tds is TypeDeclarationSyntax typeDecl && typeDecl.TypeParameterList != null) + { + typeParams = typeDecl.TypeParameterList.ToString(); + } + + typeParams ??= parentTypeParams; + + string baseIdentifier = RemoveGenericPart(tds.Identifier.ToFullString()); + string identifier = $"{baseIdentifier}{typeParams}"; + + string fullyQualifiedName = string.IsNullOrEmpty(path) ? baseIdentifier : $"{path}.{baseIdentifier}"; + + if (string.IsNullOrEmpty(parentTypeParams)) + { + fullyQualifiedName = $"{fullyQualifiedName}{typeParams}"; + } + + AttributeSyntax? cborMapAttribute = attributes.FirstOrDefault(a => a.Name.ToString() == CborMap); + AttributeSyntax? cborListAttribute = attributes.FirstOrDefault(a => a.Name.ToString() == CborList); + AttributeSyntax? cborUnionAttribute = attributes.FirstOrDefault(a => a.Name.ToString() == CborUnion); + AttributeSyntax? cborConstrAttribute = attributes.FirstOrDefault(a => a.Name.ToString() == CborConstr); + AttributeSyntax? cborTagAttribute = attributes.FirstOrDefault(a => a.Name.ToString() == CborTag); + + int? constrIndex = cborConstrAttribute?.ArgumentList?.Arguments.FirstOrDefault()?.GetFirstToken().Value as int?; + int? cborTag = cborTagAttribute?.ArgumentList?.Arguments.FirstOrDefault()?.GetFirstToken().Value as int?; + bool shouldPreserveRaw = ShouldPreserveRaw(tds, model); + + SerializationType serializationType = GetSerializationType(cborMapAttribute, cborListAttribute, cborUnionAttribute, cborConstrAttribute); + string? validatorFullyQualifiedName = FindValidatorForType(tds, model, model.Compilation); + + IEnumerable properties = GetPropertyMetadata(tds, model); + IEnumerable childTypes = []; + + SerializableTypeMetadata typeMetadata = new( + baseIdentifier, + identifier, + @namespace, + typeParams, + fullyQualifiedName, + keyword, + cborTag, + constrIndex, + serializationType, + validatorFullyQualifiedName, + shouldPreserveRaw + ); + + if (serializationType == SerializationType.Union) + { + childTypes = GetChildTypes(tds, model); + } + + typeMetadata.Properties.AddRange(properties); + typeMetadata.ChildTypes.AddRange(childTypes); + + _cache[typeMetadata.FullyQualifiedName.Replace("global::", "")] = typeMetadata; + + return typeMetadata; + } + } + + public static bool ShouldPreserveRaw(TypeDeclarationSyntax tds, SemanticModel semanticModel) + { + if (semanticModel.GetDeclaredSymbol(tds) is not INamedTypeSymbol typeSymbol) + return false; + + INamedTypeSymbol? interfaceSymbol = semanticModel.Compilation.GetTypeByMetadataName(Parser.ICborPreserveRaw); + if (interfaceSymbol != null) + return typeSymbol.AllInterfaces.Contains(interfaceSymbol); + + return typeSymbol.AllInterfaces.Any(i => + i.ToDisplayString() == Parser.ICborPreserveRaw || + i.ToDisplayString() == Parser.ICborPreserveRawFullName || + i.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == $"global::{Parser.ICborPreserveRawFullName}"); + } + + private static SerializationType GetSerializationType(AttributeSyntax? cborMapAttribute, AttributeSyntax? cborListAttribute, AttributeSyntax? cborUnionAttribute, AttributeSyntax? cborConstrAttribute) + { + if (cborMapAttribute != null) return SerializationType.Map; + if (cborListAttribute != null) return SerializationType.List; + if (cborUnionAttribute != null) return SerializationType.Union; + if (cborConstrAttribute != null) return SerializationType.Constr; + + return SerializationType.Container; + } + + private static string? FindValidatorForType(TypeDeclarationSyntax typeDecl, SemanticModel semanticModel, Compilation compilation) + { + if (semanticModel.GetDeclaredSymbol(typeDecl) is not INamedTypeSymbol typeSymbol) return null; + + INamedTypeSymbol? openValidatorInterface = compilation.GetTypeByMetadataName(Parser.ICborValidatorFullName); + if (openValidatorInterface == null) return null; + + INamedTypeSymbol closedValidatorInterface = openValidatorInterface.Construct(typeSymbol); + INamedTypeSymbol validator = compilation + .GetSymbolsWithName(_ => true, SymbolFilter.Type) + .OfType() + .FirstOrDefault(t => t.AllInterfaces.Any(i => SymbolEqualityComparer.Default.Equals(i, closedValidatorInterface))); + + return validator?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + } + + private static IEnumerable GetPropertyMetadata(TypeDeclarationSyntax tds, SemanticModel model) + { + if (tds is ClassDeclarationSyntax classDecl) + { + return GetClassPropertyMetadata(classDecl, model); + } + else if (tds is RecordDeclarationSyntax recordDecl) + { + return GetRecordPropertyMetadata(recordDecl, model); + } + + return []; + } + + private static IEnumerable GetClassPropertyMetadata(ClassDeclarationSyntax classDecl, SemanticModel model) + { + IEnumerable attributes = classDecl.AttributeLists.SelectMany(a => a.Attributes); + IEnumerable properties = classDecl.DescendantNodes().OfType(); + + foreach (PropertyDeclarationSyntax property in properties) + { + string propertyName = property.Identifier.ToFullString(); + string propertyType = property.Type.ToFullString(); + string propertyTypeFullName = model.GetSymbolInfo(property.Type).Symbol?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) ?? string.Empty; + string propertyTypeNamespace = model.GetSymbolInfo(property.Type).Symbol?.ContainingNamespace.ToDisplayString() ?? string.Empty; + bool isNullable = attributes.FirstOrDefault(a => a.Name.ToString() == Parser.CborNullable) is not null; + bool isIndefinite = attributes.FirstOrDefault(a => a.Name.ToString() == Parser.CborIndefinite) is not null; + int? size = attributes.FirstOrDefault(a => a.Name.ToString() == Parser.CborSize)?.ArgumentList?.Arguments.FirstOrDefault()?.GetFirstToken().Value as int?; + int? order = attributes.FirstOrDefault(a => a.Name.ToString() == Parser.CborOrder)?.ArgumentList?.Arguments.FirstOrDefault()?.GetFirstToken().Value as int?; + GetCborPropertyKey(property, model, out string? stringKey, out int? intKey); + + + yield return new SerializablePropertyMetadata( + propertyName, + propertyType, + propertyTypeFullName, + propertyTypeNamespace, + false, + false, + null, + null, + null, + false, + false, + false, + null, + null, + null, + null, + null, + null, + isNullable, + size, + isIndefinite, + order, + stringKey, + intKey, + false + ); + } + } + + private static IEnumerable GetRecordPropertyMetadata(RecordDeclarationSyntax recordDecl, SemanticModel model) + { + foreach (ParameterSyntax param in recordDecl.ParameterList?.Parameters ?? []) + { + IEnumerable paramAttributes = param.AttributeLists.SelectMany(a => a.Attributes); + + string propertyName = param.Identifier.Text; + string propertyType = param.Type?.ToString() ?? throw new ArgumentNullException(nameof(param.Type)); + string propertyTypeNamespace = string.Empty; + bool isOpenGeneric = false; + ISymbol? typeSymbol = model.GetSymbolInfo(param.Type).Symbol; + string propertyTypeFullName = ""; + + if (typeSymbol is ITypeSymbol its) + { + if (its.TypeKind is TypeKind.TypeParameter) + { + isOpenGeneric = true; + } + + propertyTypeFullName = its.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + } + + if (typeSymbol != null) + { + if (typeSymbol is INamedTypeSymbol namedType && + namedType.ContainingNamespace != null && + !namedType.ContainingNamespace.IsGlobalNamespace) + { + propertyTypeNamespace = namedType.ContainingNamespace.ToDisplayString(); + } + else if (typeSymbol is IArrayTypeSymbol arrayType) + { + ITypeSymbol elementType = arrayType.ElementType; + if (elementType.ContainingNamespace != null && + !elementType.ContainingNamespace.IsGlobalNamespace) + { + propertyTypeNamespace = elementType.ContainingNamespace.ToDisplayString(); + } + } + } + + bool isNullable = paramAttributes.Any(a => a.Name.ToString() == Parser.CborNullable); + bool isIndefinite = paramAttributes.Any(a => a.Name.ToString() == Parser.CborIndefinite); + + int? size = null; + AttributeSyntax sizeAttr = paramAttributes.FirstOrDefault(a => a.Name.ToString() == Parser.CborSize); + if (sizeAttr?.ArgumentList?.Arguments.FirstOrDefault() is AttributeArgumentSyntax sizeArg) + { + Optional constValue = model.GetConstantValue(sizeArg.Expression); + if (constValue.HasValue && constValue.Value is int sizeVal) + size = sizeVal; + } + + int? order = null; + AttributeSyntax orderAttr = paramAttributes.FirstOrDefault(a => a.Name.ToString() == Parser.CborOrder); + if (orderAttr?.ArgumentList?.Arguments.FirstOrDefault() is AttributeArgumentSyntax orderArg) + { + Optional constValue = model.GetConstantValue(orderArg.Expression); + if (constValue.HasValue && constValue.Value is int orderVal) + order = orderVal; + } + + GetCborPropertyKey(param, model, out string? stringKey, out int? intKey); + + bool isList = false; + bool isMap = false; + + string? listItemType = null; + string? listItemTypeFullName = null; + string? listItemTypeNamespace = null; + bool isListItemTypeOpenGeneric = false; + + + bool isMapKeyTypeOpenGeneric = false; + bool isMapValueTypeOpenGeneric = false; + string? mapKeyType = null; + string? mapValueType = null; + string? mapKeyTypeFullName = null; + string? mapValueTypeFullName = null; + string? mapKeyTypeNamespace = null; + string? mapValueTypeNamespace = null; + + if (typeSymbol is ITypeSymbol ts) + { + + if (IsMapType(ts, out ITypeSymbol? keyTypeSymbol, out ITypeSymbol? valueTypeSymbol)) + { + isMap = true; + mapKeyType = keyTypeSymbol?.Name; + mapKeyTypeFullName = keyTypeSymbol?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + mapValueType = valueTypeSymbol?.Name; + mapValueTypeFullName = valueTypeSymbol?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + mapKeyTypeNamespace = keyTypeSymbol?.ContainingNamespace?.IsGlobalNamespace == false ? + keyTypeSymbol.ContainingNamespace.ToDisplayString() : null; + mapValueTypeNamespace = valueTypeSymbol?.ContainingNamespace?.IsGlobalNamespace == false ? + valueTypeSymbol.ContainingNamespace.ToDisplayString() : null; + + isMapKeyTypeOpenGeneric = (keyTypeSymbol?.TypeKind == TypeKind.TypeParameter) || + (keyTypeSymbol is INamedTypeSymbol namedKeyType && + namedKeyType.IsGenericType && + namedKeyType.TypeArguments.Any(ta => ta.TypeKind == TypeKind.TypeParameter)); + + isMapValueTypeOpenGeneric = (valueTypeSymbol?.TypeKind == TypeKind.TypeParameter) || + (valueTypeSymbol is INamedTypeSymbol namedValueType && + namedValueType.IsGenericType && + namedValueType.TypeArguments.Any(ta => ta.TypeKind == TypeKind.TypeParameter)); + + mapKeyTypeFullName = keyTypeSymbol?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + mapValueTypeFullName = valueTypeSymbol?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + + } + else if (IsListType(ts, out ITypeSymbol? itemTypeSymbol)) + { + isList = true; + listItemType = itemTypeSymbol?.Name; + listItemTypeFullName = itemTypeSymbol?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + listItemTypeNamespace = itemTypeSymbol?.ContainingNamespace?.IsGlobalNamespace == false ? + itemTypeSymbol.ContainingNamespace.ToDisplayString() : null; + isListItemTypeOpenGeneric = (itemTypeSymbol?.TypeKind == TypeKind.TypeParameter) || + (itemTypeSymbol is INamedTypeSymbol namedItemType && + namedItemType.IsGenericType && + namedItemType.TypeArguments.Any(ta => ta.TypeKind == TypeKind.TypeParameter)); + } + } + + yield return new SerializablePropertyMetadata( + propertyName, + propertyType, + propertyTypeFullName, + propertyTypeNamespace, + isList, + isMap, + listItemType, + listItemTypeFullName, + listItemTypeNamespace, + isListItemTypeOpenGeneric, + isMapKeyTypeOpenGeneric, + isMapValueTypeOpenGeneric, + mapKeyType, + mapValueType, + mapKeyTypeFullName, + mapValueTypeFullName, + mapKeyTypeNamespace, + mapValueTypeNamespace, + isNullable, + size, + isIndefinite, + order, + stringKey, + intKey, + isOpenGeneric + ); + } + } + + private static void GetCborPropertyKey(SyntaxNode node, SemanticModel semanticModel, out string? stringKey, out int? intKey) + { + stringKey = null; + intKey = null; + + ISymbol? symbol = semanticModel.GetDeclaredSymbol(node); + AttributeData? attribute = symbol?.GetAttributes() + .FirstOrDefault(a => a.AttributeClass?.Name == Parser.CborProperty || + a.AttributeClass?.Name == Parser.CborPropertyAttribute); + + if (attribute?.ConstructorArguments.FirstOrDefault() is TypedConstant arg) + { + if (arg.Kind == TypedConstantKind.Primitive && arg.Value is int intValue) + { + intKey = intValue; + } + else if (arg.Kind == TypedConstantKind.Primitive && arg.Value is string stringValue) + { + stringKey = stringValue; + } + } + } + + private static IEnumerable GetChildTypes(TypeDeclarationSyntax tds, SemanticModel model) + { + if (model.GetDeclaredSymbol(tds) is not INamedTypeSymbol typeSymbol) return []; + + IEnumerable derivedTypes = FindDerivedTypes(typeSymbol, model.Compilation); + Dictionary resultDict = new(); + + // Process nested types + foreach (TypeDeclarationSyntax nestedType in tds.DescendantNodes().OfType()) + { + if (Parser.ParseSerialazableType(nestedType, model) is SerializableTypeMetadata metadata) + { + if (!resultDict.ContainsKey(metadata.FullyQualifiedName)) + resultDict[metadata.FullyQualifiedName] = metadata; + } + } + + // Process derived types + foreach (INamedTypeSymbol derivedType in derivedTypes) + { + SyntaxReference? syntaxRef = derivedType.DeclaringSyntaxReferences.FirstOrDefault(); + if (syntaxRef?.GetSyntax() is TypeDeclarationSyntax derivedTypeSyntax) + { + SemanticModel derivedTypeModel = model; + if (syntaxRef.SyntaxTree != model.SyntaxTree) + derivedTypeModel = model.Compilation.GetSemanticModel(syntaxRef.SyntaxTree); + + if (Parser.ParseSerialazableType(derivedTypeSyntax, derivedTypeModel) is SerializableTypeMetadata metadata) + { + if (!resultDict.ContainsKey(metadata.FullyQualifiedName)) + resultDict[metadata.FullyQualifiedName] = metadata; + } + } + } + + return resultDict.Values; + } + + private static IEnumerable FindDerivedTypes(INamedTypeSymbol baseType, Compilation compilation) + { + return compilation + .GetSymbolsWithName(name => true, SymbolFilter.Type) + .OfType() + .Where(type => !SymbolEqualityComparer.Default.Equals(type, baseType) && type.BaseType != null && ImplementsOrInheritsFrom(type, baseType) + ); + } + + private static bool ImplementsOrInheritsFrom(INamedTypeSymbol type, INamedTypeSymbol baseType) + { + if (baseType.TypeKind == TypeKind.Interface) + { + return type.AllInterfaces.Any(i => + SymbolEqualityComparer.Default.Equals(i.OriginalDefinition, baseType.OriginalDefinition)); + } + else + { + INamedTypeSymbol? currentType = type; + while (currentType != null) + { + if (SymbolEqualityComparer.Default.Equals(currentType.OriginalDefinition, baseType.OriginalDefinition)) + return true; + + currentType = currentType.BaseType; + } + } + + return false; + } + + private static bool IsListType(ITypeSymbol? typeSymbol, out ITypeSymbol? itemType) + { + itemType = null; + + if (typeSymbol is IArrayTypeSymbol arrayType) + { + itemType = arrayType.ElementType; + return true; + } + + if (typeSymbol is INamedTypeSymbol namedType && namedType.SpecialType != SpecialType.System_String) + { + foreach (INamedTypeSymbol iface in namedType.AllInterfaces) + { + if (iface.OriginalDefinition.ToDisplayString() == "System.Collections.Generic.IEnumerable") + { + itemType = iface.TypeArguments[0]; + return true; + } + } + } + + return false; + } + + private static bool IsMapType(ITypeSymbol typeSymbol, out ITypeSymbol? keyType, out ITypeSymbol? valueType) + { + keyType = null; + valueType = null; + + if (typeSymbol is INamedTypeSymbol namedType) + { + foreach (INamedTypeSymbol iface in namedType.AllInterfaces) + { + if (iface.OriginalDefinition.ToDisplayString() == "System.Collections.Generic.IDictionary") + { + keyType = iface.TypeArguments[0]; + valueType = iface.TypeArguments[1]; + return true; + } + } + } + + return false; + } + + private static (string path, string typeParams) GetFullNamespaceWithParentsAndTypeParams(TypeDeclarationSyntax typeDecl, SemanticModel model) + { + if (model.GetDeclaredSymbol(typeDecl) is INamedTypeSymbol symbol) + { + if (symbol.ContainingType != null) + { + string containerName = symbol.ContainingType.ToDisplayString(); + + string parentTypeParams = ""; + if (symbol.ContainingType.TypeParameters.Length > 0) + { + parentTypeParams = "<" + string.Join(", ", symbol.ContainingType.TypeParameters.Select(tp => tp.Name)) + ">"; + } + + return (containerName, parentTypeParams); + } + + return (symbol.ContainingNamespace.ToDisplayString(), ""); + } + + return (typeDecl.GetNamespace() ?? string.Empty, ""); + } + private static string GetBaseNamespace(TypeDeclarationSyntax typeDecl, SemanticModel model) + { + if (model.GetDeclaredSymbol(typeDecl) is INamedTypeSymbol symbol) + { + return symbol.ContainingNamespace.ToDisplayString(); + } + + return typeDecl.GetNamespace() ?? string.Empty; + } + + private static string RemoveGenericPart(string identifier) + { + int angleBracketIndex = identifier.IndexOf('<'); + if (angleBracketIndex > 0) + { + return identifier.Substring(0, angleBracketIndex).Trim(); + } + return identifier.Trim(); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.ReadEmitter.cs b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.ReadEmitter.cs new file mode 100644 index 00000000..d26852b2 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.ReadEmitter.cs @@ -0,0 +1,353 @@ +using System.Text; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private static partial class Emitter + { + public static StringBuilder EmitSerializableTypeReader(StringBuilder sb, SerializableTypeMetadata metadata) + { + sb.AppendLine($"public static new {metadata.FullyQualifiedName} Read(ReadOnlyMemory data)"); + sb.AppendLine("{"); + ICborSerializerEmitter emitter = GetEmitter(metadata); + emitter.EmitReader(sb, metadata); + sb.AppendLine("}"); + + return sb; + } + + public static StringBuilder EmitSerializablePropertyReader(StringBuilder sb, SerializablePropertyMetadata metadata, string propertyName, bool isList = false) + { + sb.AppendLine($"{metadata.PropertyTypeFullName} {propertyName} = default{(metadata.PropertyType.Contains("?") ? "" : "!")};"); + + if (isList) + { + sb.AppendLine($"if (reader.PeekState() != CborReaderState.EndArray)"); + sb.AppendLine("{"); + } + + if (metadata.IsNullable) + { + sb.AppendLine($"if (reader.PeekState() == CborReaderState.Null)"); + sb.AppendLine("{"); + sb.AppendLine($"reader.ReadNull();"); + sb.AppendLine($"{propertyName} = null;"); + sb.AppendLine("}"); + sb.AppendLine($"else"); + sb.AppendLine("{"); + } + + EmitPrimitiveOrObjectReader(sb, metadata, propertyName); + + if (metadata.IsNullable) sb.AppendLine("}"); + if (isList) + { + sb.AppendLine("}"); + } + + sb.AppendLine(); + + return sb; + } + + public static StringBuilder EmitPrimitivePropertyReader(StringBuilder sb, string type, string propertyName) + { + type = type.Replace("?", ""); + switch (type) + { + case "bool": + sb.AppendLine($"{propertyName} = reader.ReadBoolean();"); + break; + case "int": + sb.AppendLine($"{propertyName} = reader.ReadInt32();"); + break; + case "uint": + sb.AppendLine($"{propertyName} = reader.ReadUInt32();"); + break; + case "long": + sb.AppendLine($"{propertyName} = reader.ReadInt64();"); + break; + case "ulong": + sb.AppendLine($"{propertyName} = reader.ReadUInt64();"); + break; + case "float": + sb.AppendLine($"{propertyName} = reader.ReadSingle();"); + break; + case "double": + sb.AppendLine($"{propertyName} = reader.ReadDouble();"); + break; + case "decimal": + sb.AppendLine($"{propertyName} = reader.ReadDecimal();"); + break; + case "string": + sb.AppendLine($"{propertyName} = reader.ReadTextString();"); + break; + case "byte[]?": + case "byte[]": + sb.AppendLine($"if (reader.PeekState() == CborReaderState.StartIndefiniteLengthByteString)"); + sb.AppendLine("{"); + sb.AppendLine(" reader.ReadStartIndefiniteLengthByteString();"); + sb.AppendLine(" using (var stream = new MemoryStream())"); + sb.AppendLine(" {"); + sb.AppendLine(" while (reader.PeekState() != CborReaderState.EndIndefiniteLengthByteString)"); + sb.AppendLine(" {"); + sb.AppendLine(" byte[] chunk = reader.ReadByteString();"); + sb.AppendLine(" stream.Write(chunk, 0, chunk.Length);"); + sb.AppendLine(" }"); + sb.AppendLine(" reader.ReadEndIndefiniteLengthByteString();"); + sb.AppendLine($" {propertyName} = stream.ToArray();"); + sb.AppendLine(" }"); + sb.AppendLine("}"); + sb.AppendLine("else"); + sb.AppendLine("{"); + sb.AppendLine($" {propertyName} = reader.ReadByteString();"); + sb.AppendLine("}"); + + break; + case "CborEncodedValue": + case "Chrysalis.Cbor.Types.Primitives.CborEncodedValue": + case "global::Chrysalis.Cbor.Types.Primitives.CborEncodedValue": + sb.AppendLine($"{propertyName} = new {CborEncodeValueFullName}(reader.ReadEncodedValue(true).ToArray());"); + break; + } + + return sb; + } + + public static StringBuilder EmitObjectPropertyReader(StringBuilder sb, SerializablePropertyMetadata metadata, string propertyName) + { + if (metadata.IsList) + { + if (metadata.ListItemTypeFullName is null || metadata.ListItemType is null) + { + throw new InvalidOperationException($"List item type is null for property {metadata.PropertyName}"); + } + + sb.AppendLine($"{metadata.ListItemTypeFullName} {propertyName}TempItem = default;"); + sb.AppendLine($"List<{metadata.ListItemTypeFullName}> {propertyName}TempList = new();"); + sb.AppendLine($"reader.ReadStartArray();"); + sb.AppendLine($"while (reader.PeekState() != CborReaderState.EndArray)"); + sb.AppendLine("{"); + + if (metadata.IsListItemTypeOpenGeneric) + { + EmitGenericWithTypeParamsReader(sb, metadata.ListItemType, $"{propertyName}TempItem"); + } + else + { + if (IsPrimitiveType(metadata.ListItemTypeFullName)) + { + EmitPrimitivePropertyReader(sb, metadata.ListItemTypeFullName, $"{propertyName}TempItem"); + } + else + { + // @TODO: Handle nested lists/maps, right now we are assuming that the list item type is a class + sb.AppendLine($"{propertyName}TempItem = ({metadata.ListItemTypeFullName}){metadata.ListItemTypeFullName}.Read(reader.ReadEncodedValue(true));"); + } + } + + sb.AppendLine($"{propertyName}TempList.Add({propertyName}TempItem);"); + + sb.AppendLine("}"); + sb.AppendLine($"reader.ReadEndArray();"); + sb.AppendLine($"{propertyName} = {propertyName}TempList;"); + + return sb; + } + + if (metadata.IsMap) + { + if (metadata.MapKeyTypeFullName is null || metadata.MapValueTypeFullName is null) + { + throw new InvalidOperationException($"Map key or value type is null for property {metadata.PropertyName}"); + } + + sb.AppendLine($"Dictionary<{metadata.MapKeyTypeFullName}, {metadata.MapValueTypeFullName}> {propertyName}TempMap = new();"); + sb.AppendLine($"{metadata.MapKeyTypeFullName} {propertyName}TempKeyItem = default;"); + sb.AppendLine($"{metadata.MapValueTypeFullName} {propertyName}TempValueItem = default;"); + sb.AppendLine($"reader.ReadStartMap();"); + sb.AppendLine($"while (reader.PeekState() != CborReaderState.EndMap)"); + sb.AppendLine("{"); + + if (metadata.IsMapKeyTypeOpenGeneric) + { + EmitGenericWithTypeParamsReader(sb, metadata.MapKeyTypeFullName, $"{propertyName}TempKeyItem"); + } + else + { + if (IsPrimitiveType(metadata.MapKeyTypeFullName)) + { + EmitPrimitivePropertyReader(sb, metadata.MapKeyTypeFullName, $"{propertyName}TempKeyItem"); + } + else + { + // @TODO: Handle nested lists/maps, right now we are assuming that the map key item type is a class + sb.AppendLine($"{propertyName}TempKeyItem = ({metadata.MapKeyTypeFullName}){metadata.MapKeyTypeFullName}.Read(reader.ReadEncodedValue(true));"); + } + } + + if (metadata.IsMapValueTypeOpenGeneric) + { + EmitGenericWithTypeParamsReader(sb, metadata.MapValueTypeFullName, $"{propertyName}TempValueItem"); + } + else + { + if (IsPrimitiveType(metadata.MapValueTypeFullName)) + { + EmitPrimitivePropertyReader(sb, metadata.MapValueTypeFullName, $"{propertyName}TempValueItem"); + } + else + { + // @TODO: Handle nested lists/maps, right now we are assuming that the map value item type is a class + sb.AppendLine($"{propertyName}TempValueItem = ({metadata.MapValueTypeFullName}){metadata.MapValueTypeFullName}.Read(reader.ReadEncodedValue(true));"); + } + } + + sb.AppendLine($"if (!{propertyName}TempMap.ContainsKey({propertyName}TempKeyItem))"); + sb.AppendLine("{"); + sb.AppendLine($"{propertyName}TempMap.Add({propertyName}TempKeyItem, {propertyName}TempValueItem);"); + sb.AppendLine("}"); + + sb.AppendLine("}"); + sb.AppendLine($"reader.ReadEndMap();"); + sb.AppendLine($"{propertyName} = {propertyName}TempMap;"); + + return sb; + } + + if (metadata.IsOpenGeneric) + { + EmitGenericWithTypeParamsReader(sb, metadata.PropertyTypeFullName, propertyName); + } + else + { + sb.AppendLine($"{propertyName} = ({metadata.PropertyTypeFullName}){metadata.PropertyTypeFullName}.Read(reader.ReadEncodedValue(true));"); + } + return sb; + } + + public static StringBuilder EmitCborReaderInstance(StringBuilder sb, string dataName) + { + sb.AppendLine($"var reader = new CborReader({dataName}, CborConformanceMode.Lax);"); + return sb; + } + + public static StringBuilder EmitTagReader(StringBuilder sb, int? tag, string propertyName) + { + if (tag.HasValue) + { + if (tag.Value == -1) + { + sb.AppendLine("reader.ReadTag();"); + } + else + { + sb.AppendLine($"var {propertyName} = (int)reader.ReadTag();"); + sb.AppendLine($"if ({propertyName} != {tag}) throw new Exception(\"Invalid tag\");"); + } + } + + return sb; + } + + public static StringBuilder EmitSerializableTypeValidatorReader(StringBuilder sb, SerializableTypeMetadata metadata, string propertyName) + { + if (metadata.Validator is not null) + { + sb.AppendLine($"{metadata.Validator} validator = new();"); + sb.AppendLine($"if (!validator.Validate({propertyName})) throw new Exception(\"Validation failed\");"); + } + + return sb; + } + + public static StringBuilder EmitGenericWithTypeParamsReader(StringBuilder sb, string type, string propertyName) + { + sb.AppendLine($"{propertyName} = {GenericSerializationUtilFullname}.Read<{type}>(reader);"); + return sb; + } + + public static StringBuilder EmitGenericReader(StringBuilder sb, string type, string propertyName) + { + sb.AppendLine($"{propertyName} = {GenericSerializationUtilFullname}.Read(reader, {type});"); + return sb; + } + + public static StringBuilder EmitPrimitiveOrObjectReader(StringBuilder sb, SerializablePropertyMetadata metadata, string propertyName) + { + string cleanPropertyType = metadata.PropertyType.Replace("?", ""); + if (metadata.IsOpenGeneric) + { + EmitGenericWithTypeParamsReader(sb, metadata.PropertyType, propertyName); + } + else + { + if (IsPrimitiveType(cleanPropertyType)) + { + EmitPrimitivePropertyReader(sb, metadata.PropertyType, propertyName); + } + else + { + EmitObjectPropertyReader(sb, metadata, propertyName); + } + } + + return sb; + } + + public static StringBuilder EmitCustomListReader(StringBuilder sb, SerializableTypeMetadata metadata) + { + Dictionary propMapping = []; + + if (!(metadata.SerializationType == SerializationType.Constr && (metadata.CborIndex is null || metadata.CborIndex < 0))) + { + sb.AppendLine("reader.ReadStartArray();"); + } + + foreach (SerializablePropertyMetadata prop in metadata.Properties) + { + string propName = $"{metadata.BaseIdentifier}{prop.PropertyName}"; + propMapping.Add(prop.PropertyName, propName); + EmitSerializablePropertyReader(sb, prop, propName, true); + } + + if (metadata.SerializationType == SerializationType.Constr && metadata.CborIndex is not null && metadata.CborIndex >= 0) + { + sb.AppendLine("reader.ReadEndArray();"); + } + + sb.AppendLine($"{metadata.FullyQualifiedName} result;"); + + if (metadata.Properties.Count == 0) + { + sb.AppendLine($"result = new {metadata.FullyQualifiedName}();"); + } + else + { + sb.AppendLine($"result = new {metadata.FullyQualifiedName}("); + IOrderedEnumerable properties = metadata.Properties.OrderBy(p => p.Order); + IEnumerable propStrings = properties.Select(prop => propMapping[prop.PropertyName]); + sb.AppendLine(string.Join(",\n", propStrings)); + sb.AppendLine(");"); + } + + EmitReaderValidationAndResult(sb, metadata, "result"); + + return sb; + } + + public static StringBuilder EmitReaderValidationAndResult(StringBuilder sb, SerializableTypeMetadata metadata, string resultName) + { + EmitSerializableTypeValidatorReader(sb, metadata, resultName); + + if (metadata.ShouldPreserveRaw) + { + sb.AppendLine($"{resultName}.Raw = data;"); + } + + sb.AppendLine($"return {resultName};"); + return sb; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.WriteEmitter.cs b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.WriteEmitter.cs new file mode 100644 index 00000000..2341afbd --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.WriteEmitter.cs @@ -0,0 +1,365 @@ +using System.Text; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private static partial class Emitter + { + public static StringBuilder EmitSerializableTypeWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + sb.AppendLine($"public static new void Write(CborWriter writer, {metadata.FullyQualifiedName} data)"); + sb.AppendLine("{"); + ICborSerializerEmitter emitter = GetEmitter(metadata); + emitter.EmitWriter(sb, metadata); + sb.AppendLine("}"); + + return sb; + } + + public static StringBuilder EmitSerializablePropertyWriter(StringBuilder sb, SerializablePropertyMetadata metadata) + { + string propertyName = $"data.{metadata.PropertyName}"; + if (metadata.IsNullable) + { + sb.AppendLine($"if ({propertyName} is null)"); + sb.AppendLine("{"); + sb.AppendLine($"writer.WriteNull();"); + sb.AppendLine("}"); + sb.AppendLine($"else"); + sb.AppendLine("{"); + } + + if (metadata.IsTypeNullable) + { + sb.AppendLine($"if ({propertyName} is not null)"); + sb.AppendLine("{"); + EmitPrimitiveOrObjectWriter(sb, metadata, propertyName); + sb.AppendLine("}"); + } + else + { + EmitPrimitiveOrObjectWriter(sb, metadata, propertyName); + } + + if (metadata.IsNullable) sb.AppendLine("}"); + + sb.AppendLine(); + + return sb; + } + + public static StringBuilder EmitPrimitivePropertyWriter(StringBuilder sb, string type, string propertyName, int? size = null) + { + bool isNullable = type.Contains("?"); + type = type.Replace("?", ""); + switch (type) + { + case "bool": + sb.AppendLine(isNullable + ? $"writer.WriteBoolean({propertyName}.Value);" + : $"writer.WriteBoolean({propertyName});"); + break; + case "int": + sb.AppendLine(isNullable + ? $"writer.WriteInt32({propertyName}.Value);" + : $"writer.WriteInt32({propertyName});"); + break; + case "uint": + sb.AppendLine(isNullable + ? $"writer.WriteUInt32({propertyName}.Value);" + : $"writer.WriteUInt32({propertyName});"); + break; + case "long": + sb.AppendLine(isNullable + ? $"writer.WriteInt64({propertyName}.Value);" + : $"writer.WriteInt64({propertyName});"); + break; + case "ulong": + sb.AppendLine(isNullable + ? $"writer.WriteUInt64({propertyName}.Value);" + : $"writer.WriteUInt64({propertyName});"); + break; + case "float": + sb.AppendLine(isNullable + ? $"writer.WriteSingle({propertyName}.Value);" + : $"writer.WriteSingle({propertyName});"); + break; + case "double": + sb.AppendLine(isNullable + ? $"writer.WriteDouble({propertyName}.Value);" + : $"writer.WriteDouble({propertyName});"); + break; + case "decimal": + sb.AppendLine(isNullable + ? $"writer.WriteDecimal({propertyName}.Value);" + : $"writer.WriteDecimal({propertyName});"); + break; + case "string": + sb.AppendLine($"writer.WriteTextString({propertyName});"); + break; + case "byte[]?": + case "byte[]": + if (size is not null) + { + sb.AppendLine($"if ({propertyName}.Length > {size})"); + sb.AppendLine("{"); + sb.AppendLine($"writer.WriteStartIndefiniteLengthByteString();"); + sb.AppendLine($"var {propertyName.Replace(".", "")}Chunks = {propertyName}.Chunk({size});"); + sb.AppendLine($"foreach (var chunk in {propertyName.Replace(".", "")}Chunks)"); + sb.AppendLine("{"); + sb.AppendLine($"writer.WriteByteString(chunk);"); + sb.AppendLine("}"); + sb.AppendLine($"writer.WriteEndIndefiniteLengthByteString();"); + sb.AppendLine("}"); + sb.AppendLine("else"); + sb.AppendLine("{"); + sb.AppendLine($"writer.WriteByteString({propertyName});"); + sb.AppendLine("}"); + } + else + { + sb.AppendLine($"writer.WriteByteString({propertyName});"); + } + + break; + case "CborEncodedValue": + case "Chrysalis.Cbor.Types.Primitives.CborEncodedValue": + case "global::Chrysalis.Cbor.Types.Primitives.CborEncodedValue": + sb.AppendLine("writer.WriteTag(CborTag.EncodedCborDataItem);"); + sb.AppendLine($"writer.WriteByteString({propertyName}.Value);"); + break; + } + + return sb; + } + + public static StringBuilder EmitObjectPropertyWriter(StringBuilder sb, SerializablePropertyMetadata metadata, string propertyName) + { + if (metadata.IsList) + { + if (metadata.ListItemTypeFullName is null || metadata.ListItemType is null) + { + throw new InvalidOperationException($"List item type is null for property {metadata.PropertyName}"); + } + + if (metadata.IsIndefinite) + { + sb.AppendLine($"writer.WriteStartArray(null);"); + } + else + { + sb.AppendLine($"writer.WriteStartArray({propertyName}.Count());"); + } + + sb.AppendLine($"foreach (var item in {propertyName})"); + sb.AppendLine("{"); + if (metadata.IsListItemTypeOpenGeneric) + { + EmitGenericWithTypeParamsWriter(sb, metadata.ListItemType, $"item"); + } + else + { + if (IsPrimitiveType(metadata.ListItemTypeFullName)) + { + EmitPrimitivePropertyWriter(sb, metadata.ListItemTypeFullName, "item"); + } + else + { + sb.AppendLine($"{metadata.ListItemTypeFullName}.Write(writer, item);"); + } + } + + + sb.AppendLine("}"); + sb.AppendLine($"writer.WriteEndArray();"); + + return sb; + } + + if (metadata.IsMap) + { + if (metadata.MapKeyTypeFullName is null || metadata.MapValueTypeFullName is null) + { + throw new InvalidOperationException($"Map key or value type is null for property {metadata.PropertyName}"); + } + + if (metadata.IsIndefinite) + { + sb.AppendLine($"writer.WriteStartMap(null);"); + } + else + { + sb.AppendLine($"writer.WriteStartMap({propertyName}.Count());"); + } + + sb.AppendLine($"foreach (var kvp in {propertyName})"); + sb.AppendLine("{"); + + if (metadata.IsMapKeyTypeOpenGeneric) + { + EmitGenericWithTypeParamsWriter(sb, metadata.MapKeyTypeFullName, $"kvp.Key"); + } + else + { + if (IsPrimitiveType(metadata.MapKeyTypeFullName)) + { + EmitPrimitivePropertyWriter(sb, metadata.MapKeyTypeFullName, $"kvp.Key"); + } + else + { + sb.AppendLine($"{metadata.MapKeyTypeFullName}.Write(writer, kvp.Key);"); + } + } + + if (metadata.IsMapValueTypeOpenGeneric) + { + EmitGenericWithTypeParamsWriter(sb, metadata.MapValueTypeFullName, $"kvp.Value"); + } + else + { + if (IsPrimitiveType(metadata.MapValueTypeFullName)) + { + EmitPrimitivePropertyWriter(sb, metadata.MapValueTypeFullName, $"kvp.Value"); + } + else + { + sb.AppendLine($"{metadata.MapValueTypeFullName}.Write(writer, kvp.Value);"); + } + } + + sb.AppendLine("}"); + sb.AppendLine($"writer.WriteEndMap();"); + return sb; + } + + if (metadata.IsOpenGeneric) + { + EmitGenericWithTypeParamsWriter(sb, metadata.PropertyTypeFullName, propertyName); + } + else + { + sb.AppendLine($"{metadata.PropertyTypeFullName}.Write(writer, {propertyName});"); + } + + return sb; + } + + public static StringBuilder EmitTagWriter(StringBuilder sb, int? tag) + { + if (tag.HasValue && tag.Value >= 0) + { + sb.AppendLine($"writer.WriteTag((CborTag){tag});"); + } + + return sb; + } + + public static StringBuilder EmitSerializableTypeValidatorWriter(StringBuilder sb, SerializableTypeMetadata metadata, string propertyName) + { + if (metadata.Validator is not null) + { + sb.AppendLine($"{metadata.Validator} validator = new();"); + sb.AppendLine($"if (!validator.Validate({propertyName})) throw new Exception(\"Validation failed\");"); + } + + return sb; + } + + public static StringBuilder EmitGenericWithTypeParamsWriter(StringBuilder sb, string type, string propertyName) + { + sb.AppendLine($"{GenericSerializationUtilFullname}.Write<{type}>(writer, {propertyName});"); + return sb; + } + + public static StringBuilder EmitGenericWriter(StringBuilder sb, string type, string propertyName) + { + sb.AppendLine($"{GenericSerializationUtilFullname}.Write(writer, {type});"); + return sb; + } + + public static StringBuilder EmitPrimitiveOrObjectWriter(StringBuilder sb, SerializablePropertyMetadata metadata, string propertyName) + { + if (metadata.IsOpenGeneric) + { + EmitGenericWithTypeParamsWriter(sb, metadata.PropertyType, propertyName); + } + else + { + if (IsPrimitiveType(metadata.PropertyType)) + { + EmitPrimitivePropertyWriter(sb, metadata.PropertyType, propertyName, metadata.Size); + } + else + { + EmitObjectPropertyWriter(sb, metadata, propertyName); + } + } + + return sb; + } + + public static StringBuilder EmitCustomListWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + EmitPropertyCountWriter(sb, metadata); + if (!(metadata.SerializationType == SerializationType.Constr && (metadata.CborIndex is null || metadata.CborIndex < 0))) + { + sb.AppendLine($"writer.WriteStartArray(propCount);"); + } + + foreach (SerializablePropertyMetadata prop in metadata.Properties) + { + EmitSerializablePropertyWriter(sb, prop); + } + + if (!(metadata.SerializationType == SerializationType.Constr && (metadata.CborIndex is null || metadata.CborIndex < 0))) + { + sb.AppendLine($"writer.WriteEndArray();"); + } + + return sb; + } + + public static StringBuilder EmitWriterValidation(StringBuilder sb, SerializableTypeMetadata metadata) + { + if (metadata.Validator is not null) + { + sb.AppendLine($"{metadata.Validator} validator = new();"); + sb.AppendLine($"if (!validator.Validate(data)) throw new Exception(\"Validation failed\");"); + } + + return sb; + } + + public static StringBuilder EmitPreservedRawWriter(StringBuilder sb) + { + sb.AppendLine($"if (data.Raw is not null)"); + sb.AppendLine("{"); + sb.AppendLine($"writer.WriteByteString(data.Raw?.ToArray());"); + sb.AppendLine("return;"); + sb.AppendLine("}"); + return sb; + } + + public static StringBuilder EmitPropertyCountWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + sb.AppendLine($"int propCount = 0;"); + + foreach (SerializablePropertyMetadata prop in metadata.Properties) + { + if (prop.IsNullable || !prop.IsTypeNullable) + { + sb.AppendLine("propCount++;"); + } + else + { + sb.AppendLine($"if (data.{prop.PropertyName} is not null) propCount++;"); + } + } + + sb.AppendLine(); + + return sb; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.cs b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.cs new file mode 100644 index 00000000..40d46450 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/CborSerializerCodeGen.cs @@ -0,0 +1,40 @@ +using System.Collections.Immutable; +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Chrysalis.Cbor.CodeGen; + +[Generator] +public sealed partial class CborSerializerCodeGen : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + IncrementalValueProvider> typeProvider = context.SyntaxProvider.CreateSyntaxProvider( + predicate: static (node, _) => node is TypeDeclarationSyntax tds && tds.AttributeLists.Count > 0, + transform: static (ctx, _) => (TypeDeclarationSyntax)ctx.Node + ).Collect(); + + IncrementalValueProvider<(Compilation, ImmutableArray)> combined = context.CompilationProvider.Combine(typeProvider); + + context.RegisterSourceOutput(combined, EmitSerializersAndMetadata); + } + + private static void EmitSerializersAndMetadata(SourceProductionContext context, (Compilation compilation, ImmutableArray types) source) + { + Compilation compilation = source.compilation; + ImmutableArray types = source.types; + + foreach (TypeDeclarationSyntax type in types) + { + SemanticModel semanticModel = compilation.GetSemanticModel(type.SyntaxTree); + SerializableTypeMetadata? metadata = Parser.ParseSerialazableType(type, semanticModel); + + if (metadata is not null) + { + Emitter.EmitSerializerAndMetadata(context, metadata); + } + } + } +} + diff --git a/src/Chrysalis.Cbor.CodeGen/Chrysalis.Cbor.CodeGen.csproj b/src/Chrysalis.Cbor.CodeGen/Chrysalis.Cbor.CodeGen.csproj new file mode 100644 index 00000000..a681508e --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/Chrysalis.Cbor.CodeGen.csproj @@ -0,0 +1,25 @@ + + + + netstandard2.0 + enable + enable + Latest + true + + false + true + true + + + + + + + + + + + + + diff --git a/src/Chrysalis.Cbor.CodeGen/Emitters/ConstructorEmitter.cs b/src/Chrysalis.Cbor.CodeGen/Emitters/ConstructorEmitter.cs new file mode 100644 index 00000000..96553478 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/Emitters/ConstructorEmitter.cs @@ -0,0 +1,40 @@ +using System.Text; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private class ConstructorEmitter : ICborSerializerEmitter + { + public StringBuilder EmitReader(StringBuilder sb, SerializableTypeMetadata metadata) + { + int constrIndex = Emitter.ResolveTag(metadata.CborIndex); + Emitter.EmitCborReaderInstance(sb, "data"); + Emitter.EmitTagReader(sb, metadata.CborTag, "tagIndex"); + Emitter.EmitTagReader(sb, constrIndex, "constrIndex"); + Emitter.EmitCustomListReader(sb, metadata); + + return sb; + } + + public StringBuilder EmitWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + Emitter.EmitPreservedRawWriter(sb); + Emitter.EmitWriterValidation(sb, metadata); + Emitter.EmitTagWriter(sb, metadata.CborTag); + + if (metadata.CborIndex is null || metadata.CborIndex < 0) + { + sb.AppendLine("writer.WriteTag((CborTag)data.ConstrIndex);"); + } + else + { + sb.AppendLine($"writer.WriteTag((CborTag){Emitter.ResolveTag(metadata.CborIndex)});"); + } + + Emitter.EmitCustomListWriter(sb, metadata); + + return sb; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/Emitters/ContainerEmitter.cs b/src/Chrysalis.Cbor.CodeGen/Emitters/ContainerEmitter.cs new file mode 100644 index 00000000..03d78cfb --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/Emitters/ContainerEmitter.cs @@ -0,0 +1,39 @@ +using System.Text; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private class ContainerEmitter : ICborSerializerEmitter + { + public StringBuilder EmitReader(StringBuilder sb, SerializableTypeMetadata metadata) + { + if (metadata.Properties.Count > 1 || metadata.Properties.Count < 1) + throw new InvalidOperationException($"Container types must have exactly one property. {metadata.FullyQualifiedName}"); + + SerializablePropertyMetadata prop = metadata.Properties[0]; + Emitter.EmitCborReaderInstance(sb, "data"); + Emitter.EmitTagReader(sb, metadata.CborTag, "tagIndex"); + string propName = $"{metadata.BaseIdentifier}{prop.PropertyName}"; + Emitter.EmitSerializablePropertyReader(sb, prop, propName); + sb.AppendLine($"var result = new {metadata.FullyQualifiedName}({propName});"); + Emitter.EmitReaderValidationAndResult(sb, metadata, "result"); + + return sb; + } + + public StringBuilder EmitWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + if (metadata.Properties.Count > 1 || metadata.Properties.Count < 1) + throw new InvalidOperationException($"Container types must have exactly one property. {metadata.FullyQualifiedName}"); + + Emitter.EmitPreservedRawWriter(sb); + Emitter.EmitWriterValidation(sb, metadata); + SerializablePropertyMetadata prop = metadata.Properties[0]; + Emitter.EmitTagWriter(sb, metadata.CborTag); + Emitter.EmitSerializablePropertyWriter(sb, prop); + + return sb; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/Emitters/ListEmitter.cs b/src/Chrysalis.Cbor.CodeGen/Emitters/ListEmitter.cs new file mode 100644 index 00000000..e1279134 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/Emitters/ListEmitter.cs @@ -0,0 +1,26 @@ +using System.Text; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private class ListEmitter : ICborSerializerEmitter + { + public StringBuilder EmitReader(StringBuilder sb, SerializableTypeMetadata metadata) + { + Emitter.EmitCborReaderInstance(sb, "data"); + Emitter.EmitTagReader(sb, metadata.CborTag, "tagIndex"); + Emitter.EmitCustomListReader(sb, metadata); + return sb; + } + + public StringBuilder EmitWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + Emitter.EmitPreservedRawWriter(sb); + Emitter.EmitWriterValidation(sb, metadata); + Emitter.EmitTagWriter(sb, metadata.CborTag); + Emitter.EmitCustomListWriter(sb, metadata); + return sb; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/Emitters/MapEmitter.cs b/src/Chrysalis.Cbor.CodeGen/Emitters/MapEmitter.cs new file mode 100644 index 00000000..d2cffa6f --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/Emitters/MapEmitter.cs @@ -0,0 +1,91 @@ +using System.Text; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private class MapEmitter : ICborSerializerEmitter + { + public StringBuilder EmitReader(StringBuilder sb, SerializableTypeMetadata metadata) + { + Emitter.EmitCborReaderInstance(sb, "data"); + Emitter.EmitTagReader(sb, metadata.CborTag, "tagIndex"); + bool isIntKey = metadata.Properties[0].PropertyKeyInt is not null; + + sb.AppendLine($"Dictionary<{(isIntKey ? "int" : "string")}, object> resultMap = [];"); + sb.AppendLine($"reader.ReadStartMap();"); + sb.AppendLine("while (reader.PeekState() != CborReaderState.EndMap)"); + sb.AppendLine("{"); + + if (isIntKey) + { + sb.AppendLine($"int key = reader.ReadInt32();"); + } + else + { + sb.AppendLine($"string key = reader.ReadTextString();"); + } + + sb.AppendLine($"object value = null;"); + + Emitter.EmitGenericReader(sb, "TypeMapping[key]", "value"); + + sb.AppendLine($"resultMap.Add(key, value);"); + sb.AppendLine("}"); + sb.AppendLine($"reader.ReadEndMap();"); + sb.AppendLine($"{metadata.FullyQualifiedName} result = new {metadata.FullyQualifiedName}("); + + for (int i = 0; i < metadata.Properties.Count; i++) + { + SerializablePropertyMetadata prop = metadata.Properties[i]; + string? key = isIntKey ? prop.PropertyKeyInt?.ToString() : prop.PropertyKeyString; + + sb.Append($"resultMap.TryGetValue({key}, out var {prop.PropertyName}Value) ? ({prop.PropertyTypeFullName}){prop.PropertyName}Value : default"); + sb.AppendLine($"{(i == metadata.Properties.Count - 1 ? "" : ",")}"); + } + + sb.AppendLine(");"); + + Emitter.EmitReaderValidationAndResult(sb, metadata, "result"); + return sb; + } + + public StringBuilder EmitWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + Emitter.EmitPreservedRawWriter(sb); + Emitter.EmitWriterValidation(sb, metadata); + Emitter.EmitTagWriter(sb, metadata.CborTag); + Emitter.EmitPropertyCountWriter(sb, metadata); + bool isIntKey = metadata.Properties[0].PropertyKeyInt is not null; + + sb.AppendLine($"writer.WriteStartMap(propCount);"); + foreach (var prop in metadata.Properties) + { + if (prop.IsNullable) + { + sb.AppendLine($"{(isIntKey ? $"writer.WriteInt32(KeyMapping[\"{prop.PropertyName}\"])" : $"writer.WriteTextString(KeyMapping[\"{prop.PropertyName}\"])")};"); + Emitter.EmitSerializablePropertyWriter(sb, prop); + } + else + { + if (prop.IsTypeNullable) + { + sb.AppendLine($"if (data.{prop.PropertyName} is not null)"); + sb.AppendLine("{"); + sb.AppendLine($"{(isIntKey ? $"writer.WriteInt32(KeyMapping[\"{prop.PropertyName}\"])" : $"writer.WriteTextString(KeyMapping[\"{prop.PropertyName}\"])")};"); + Emitter.EmitSerializablePropertyWriter(sb, prop); + sb.AppendLine("}"); + } + else + { + sb.AppendLine($"{(isIntKey ? $"writer.WriteInt32(KeyMapping[\"{prop.PropertyName}\"])" : $"writer.WriteTextString(KeyMapping[\"{prop.PropertyName}\"])")};"); + Emitter.EmitSerializablePropertyWriter(sb, prop); + } + } + } + sb.AppendLine($"writer.WriteEndMap();"); + + return sb; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/Emitters/UnionEmitter.cs b/src/Chrysalis.Cbor.CodeGen/Emitters/UnionEmitter.cs new file mode 100644 index 00000000..024b60ed --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/Emitters/UnionEmitter.cs @@ -0,0 +1,45 @@ +using System.Text; + +namespace Chrysalis.Cbor.CodeGen; + +public sealed partial class CborSerializerCodeGen +{ + private class UnionEmitter : ICborSerializerEmitter + { + public StringBuilder EmitReader(StringBuilder sb, SerializableTypeMetadata metadata) + { + sb.AppendLine($"List errors = [];"); + foreach (var childType in metadata.ChildTypes) + { + sb.AppendLine($"try"); + sb.AppendLine("{"); + sb.AppendLine($"return ({metadata.FullyQualifiedName}){childType.FullyQualifiedName}.Read(data);"); + sb.AppendLine("}"); + sb.AppendLine($"catch (Exception ex)"); + sb.AppendLine("{"); + sb.AppendLine($"errors.Add(ex.Message);"); + sb.AppendLine("}"); + } + + sb.AppendLine($"throw new Exception(\"Union deserialization failed. {metadata.FullyQualifiedName} \" + string.Join(\"\\n\", errors));"); + + return sb; + } + + public StringBuilder EmitWriter(StringBuilder sb, SerializableTypeMetadata metadata) + { + sb.AppendLine("switch (data.CborTypeName)"); + sb.AppendLine("{"); + foreach (var childType in metadata.ChildTypes) + { + sb.AppendLine($"case \"{childType.FullyQualifiedName}\":"); + sb.AppendLine($"{childType.FullyQualifiedName}.Write(writer, ({childType.FullyQualifiedName})data);"); + sb.AppendLine($"break;"); + } + sb.AppendLine($"default:"); + sb.AppendLine($"throw new Exception(\"Union serialization failed. {metadata.FullyQualifiedName} \");"); + sb.AppendLine("}"); + return sb; + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/Extensions/RoslynExtension.cs b/src/Chrysalis.Cbor.CodeGen/Extensions/RoslynExtension.cs new file mode 100644 index 00000000..7b3a3dee --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/Extensions/RoslynExtension.cs @@ -0,0 +1,22 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Chrysalis.Cbor.CodeGen.Extensions; + +public static class RoslynExtension +{ + public static string? GetNamespace(this TypeDeclarationSyntax self) + { + if (self.Parent is NamespaceDeclarationSyntax namespaceDecl) + { + return namespaceDecl.Name.ToString(); + } + // Check if the parent is a FileScopedNamespaceDeclarationSyntax (C# 10+) + else if (self.Parent is FileScopedNamespaceDeclarationSyntax fileScopedNamespaceDecl) + { + return fileScopedNamespaceDecl.Name.ToString(); + } + + return null; + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor.CodeGen/README.md b/src/Chrysalis.Cbor.CodeGen/README.md new file mode 100644 index 00000000..28f6b205 --- /dev/null +++ b/src/Chrysalis.Cbor.CodeGen/README.md @@ -0,0 +1,90 @@ +## Overview of Rules + +### Type Attributes +[CborSerializable] - this attribute is used to tell the source generator that this type needs a cbor serializer +[CborList] [CborMap] [CborConstr] [CborUnion] [CborTag] - a helper attribute to assist source gen in determining the code to generate + +### Property Attributes +[CborOrder(int)] - used for properties within a [CborList] or [CborConstr] to preserve the ordering of properties +[CborProperty(int/string)] - used for properties within a [CborMap] to specify the `key` to serialize/deserialize +[CborSize(int)] - used to specify that the type has definite size. `byte[]` support will be initially supported +[CborNullable] - used to specify if a property can be serialized into `null` +[CborIndefinite] - by default, arrays and maps will be serialized into definite length, this tells the source generator to serialize into indefinite length + +### Special Types +1. `CborEncodedValue` - a special type for serializing data with encoding tag +2. Nested record for `Union` types +3. Open generic types, for example `CborDefiniteList` + +### Primitive Types +`int` +`long` +`ulong` +`double` +`decimal` +`string` +`byte[]` - with special handling since [CborSize(int)] can be used for this type + +### Collection Types +#### in order to not complicate things, we will only support these 2 types for now +`IEnumerable` +`Dictionary` + +### Special Rules +`ICborValidator` - is an interface with one function `Validate()` to tell generator that a type must be validated after deserialization or before serialization +`ICborRaw` - is an interface with no function, this just helps the source gen to know if a validate function must be called or not +`CborBase` - is base abstract type that contains the `Raw` property and `Name` which is a helper for union types. All custom types must inherit from CborBase in order for serialization to work properly + +## Development Checklist + +### Base Code + [] Create Chrysalis.Cbor.CodeGen dotnet project + +### Metadata Gathering + [] Create a file `CborSerializerCodeGen.Metadata.cs` which will contain the metadata types + [] Define a type to hold the metadata for the type `CborSerializableTypeMetadata` which includes `typeName`, `namespace`, `attributes`, `interfaces` + [] Create a file `CborSerializerCodeGen.Parser.cs` which will contain the logic on how to extract the metadata + [] Create `CborSerializerCodeGen.cs` class which will be the starting point of the generator + [] Emit a file per type that contains the metadata for debugging + +### Code Generation + [] Create a file `CborSerializerCodeGen.Emitter.cs` that contains the logic for generating code, depending on the rules, this will contain the emitters for primitive types and collection types + [CborList] [CborMap] [CborConstr] [CborUnion] will have their own reusable emitters. [CborTag] [CborNullable] [CborSize] [CborIndefinite] emitter helpers will be on the generic emitter file + [] Create a folder `Emitters` that has `ICborEmitter` interface that has 2 methods `GenerateSerializer` and `GenerateDeserializer` + [] Create primitive type emitter and make sure they work with test types + [] Create collection type (`IEnumerable`, `Dictionary`) emitters with support for closed generics and make sure it works with test types + [] Create [CborList] `ICborEmitter` and test with test types + [] Create [CborConstr] `ICborEmitter` and test with test types + [] Create [CborMap] `ICborEmitter` and test with test types + [] Create [CborUnion] `ICborEmitter` and test with test types + [] Open Generic handling for example `CborDefiniteList` + + ### Testing and debugging + #### Basic + [] Primitive + [] List + [] Map + [] Nullable + [] Indefinite + [] Bounded Bytes + [] Cbor Tag + + #### Complex Types + [] Container + [] Constr + [] Custom List + [] Custom Map + [] Union Type + [] Generic Type + + #### Cardano Types + [] Block + [] Header + [] TransactionBody + [] WitnessSet + [] AuxDataSet + [] InvalidTransactions + +[] Alonzo Block +[] Babbage Block +[] Conway Block diff --git a/src/Chrysalis.Cbor.Test/CborTests.cs b/src/Chrysalis.Cbor.Test/CborTests.cs new file mode 100644 index 00000000..87c91e45 --- /dev/null +++ b/src/Chrysalis.Cbor.Test/CborTests.cs @@ -0,0 +1,184 @@ +using System.Formats.Cbor; +using System.Reflection; +using System.Text.Json; +using Chrysalis.Cbor.Cardano.Types.Block; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Input; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Script; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Types.Test; +using Xunit; + +namespace Chrysalis.Test; + + +record TestRecord(string p, int i); + + +public class CborTests +{ + [Theory] + [InlineData("9FD8799FD8799F9FC24C0AFD35CBEC1F0EB61C6A5B4DC24C0CEFB03531E283A5DF051C66C24C067D7F114BF03905256C13A9C24C0E4A467359993326D19A78FBC24B76D585C1A093723F32404EC24D598DE7F123CC80BA2DBE2FBD40FF4455534462C24C204FCE5E3E25026110000000D8799FD8799FD87A9F1B00000191DAACEA81FFD87A80FFD8799FD87A9F1B00000191DAB17E61FFD87980FFFFFF58404F33E732ADCB80A24B323BD160054CE8CF33641E2DF1AFBA2BFCE109CB8C143745880CA239B1DFB6A0C86241DC36A3E0199071F11A53267FB7836AB0DEDEB103FFFF")] + public void TransactionInputTest(string cbor) + { + byte[] cborRaw = Convert.FromHexString(cbor); + PlutusList txBody = PlutusList.Read(cborRaw); + + Assert.NotNull(txBody); + Assert.Equal(new TestRecord("test", 1), new TestRecord("test", 1)); + } + // // [Theory] + // // [MemberData(nameof(BoolTestData.GetTestData), MemberType = typeof(BoolTestData))] + // // [MemberData(nameof(BytesTestData.GetTestData), MemberType = typeof(BytesTestData))] + // // [MemberData(nameof(IntTestData.GetTestData), MemberType = typeof(IntTestData))] + // // [MemberData(nameof(LongTestData.GetTestData), MemberType = typeof(LongTestData))] + // // [MemberData(nameof(UlongTestData.GetTestData), MemberType = typeof(UlongTestData))] + // // [MemberData(nameof(TextTestData.GetTestData), MemberType = typeof(TextTestData))] + // // public void Deserialize(TestData testData) + // // { + // // Assert.NotNull(testData); + // // Assert.NotNull(testData.Serialized); + // // Assert.NotNull(testData.Deserialized); + + // // byte[] data = Convert.FromHexString(testData.Serialized); + // // Type actualType = testData.Deserialized.GetType(); + + // // // Act + // // MethodInfo deserializeMethod = typeof(CborSerializer) + // // .GetMethod(nameof(CborSerializer.Deserialize))! + // // .MakeGenericMethod(actualType); + + // // object? actual = deserializeMethod.Invoke(null, [data]); + + // // // Assert + // // Assert.NotNull(actual); + // // Assert.IsType(actualType, actual); + // // // Assert.Equivalent(testData.Deserialized, actual); + // // } + + [Theory] + // Babbage + [InlineData("85828A1A00A0FAA91A07AF97F758208FD832B38F12F6E1572E9BE0D63465B66D3A9413E39F550DF43476B46C609BB558207194702C765EF7F9E333DAD00C7CA3C2065EAFF5288B177A726B65CFE79379D458201B60A27DF5CE4FC9BB19AF1643815652154CDFBF609D717D9693C07E795071A782584077D15CC438BD3CE4E3E2B17F1B20D85952F069A3EC3BA294FABE9418B296F028DB590F3DAF42A6400A7CAAB0D1A2E25278737326C47C068FA451ADB828044AA85850FBD7FAAA1B9D85F47CA75277FC1D6E987825562026137CDE28A7B5DC21D7FA4D828030F911B1A06C6D759A7747AC3DF362B5DB156B373AC7A9C380BC63F9C9072355484D935BA871C50FA8898432280519380B5820A6651F0265DC9DC19819C20DC2719D6C172037AC798D43312D594DA50442998C845820B095CCD982629951A205A35A81543B3C6F0EFFA999E376D02C1443D510A6F7F70F1903DE5840E4DCAACA8A990945BC5D8F9AD076638ECB5D39D1BA084EA5B27B93B14CE658BEDCB6D5FD1ED133A16769C19B77941890D0ECCAAE4E74F2502FA4E102590CDE038208005901C053409B7ECC3FE5C73FB288DD219CD00EA1ECAB1FE6A0AB877110AB3D2D887C3000F8A10EB2DFBC8BE936D860628C5688D322EDDBB060F70C3A3FA07E568B9A08D133872360CE3A176C4013B9236A90444561F705BB126DD3621B32D9A0EFB86BCF86C02BE0187A039A2AB426D47ADB5128891DD8629639DFA6282AFF8A25206D8F3225D5BC3EFD255897E0FF5728F24556B88F7967EC543376C61D4A186BBC63411A80D8F76680F048886110EED82EA1EF1AA52DDDA81B2DAE2CC9D0EDB59739DE87A4AADA86C41A80FE46DE204E65A9491057690768FFF9A2187356F003FB4A5CA9D816B6836967A9F1C24ABEEF7026CF60FEB48CCE2A5779B4442CF07053D285331D4A67BE56F2F4BB3F87A7D3DEB31DEC91849BE166261108B1B7CDEA0DCA2FFD41026D5B4AC3F246CC3213461A0B9F5C47DA887956CAC51CBA000820A944DB011B3C5A4B6A59A6C332F07C614FA1CC66DFDAC6744268065E4F0E936C6830E50CF83DC7824A2E9DC6E754A138FFBDF7626E485136A43712175462840664E7D5EDAB3606AC58A127B4745785C9B972212350AC0FDF08C4E1E81864D6131D64E9175B979222CD46D7FCBD300DA1774E00526E38AA67333FC835ACAD5242ADCC87A400818258208B1981199658095573859313ACE20F2C933D5AF1E81650733E36DF6E06E9101501018282581D6124D274BFD913B241A8CCA20C6977775718FDDB8F3763F1D365C854451A001E848082583901AE07890AF80E4658691A834F880B3F8142D35F08B7E0A574A787521FFA40984DFE75EA6085AE8D27F52934AF3D0A42A391C514E78A6CDD561A01053236021A00028CAD031A0CC63DF2AB008382582062FF26A140262D3EE197CD93FF234D49F88EAB3483E3BDCC5B69A582F8BB1952008258207942043B920908BAD5626DCFADA4A00D812B3789E3C1925D70355B6B16F52DFA0082582099908C1030BD4F72C4135BB86E6296CDAE04C906F091976E320C2F25A5200E2602018383583911E1317B152FAAC13426E6A83E06FF88A4D62CCE3C1634AB0A5EC1330952563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2821B0000002ED1BAB9B3A4581C0BE55D262B29F564998FF81EFE21BDC0022621C12F15AF08D0F2DDB1A1582020B7729520955D7A53FF8A39082B8011159D6628113EF47C13149179869FE16D01581C13AA2ACCF2E1561723AA26871E071FDF32C867CFF7E7D50AD470D62FA1474D494E5357415001581CCE5B9E0F8A88255B65F2E4D065C6E716E9FA9A8A86DFB86423DD1AC0A14444494E471B00000D0E2C75F5FC581CE4214B7CCE62AC6FBBA385D164DF48E157EAE5863521B4B67CA71D86A1582020B7729520955D7A53FF8A39082B8011159D6628113EF47C13149179869FE16D1A130C6AA25820A7A63A0514F3BA288D15F577D34F3FAA5CA459A1A97D0BA33D270DC93BBF14BD82583901B6A399BB1A6598ADD297EB8724911C41FB720F6D17F6221636B458E3B84DC1F29279A96CD8D21B1F81A63B10D01103A9EB86FFC79D1AB1B21A191F421382583901BCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9D52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2821AF6E2075BA1581C2F2E0404310C106E2A260E8EB5A7E43F00CFF42C667489D30E179816A14D3137323331303430303030303001021A000C04AD031A07AF9BCB0758205160F88B929BF8A6C57C285B889488F9137C0EF3CFD0BCF408A10020E69146D5081A07AF97E30B58207CB052FB69E3AD65E73A6A481850426288F5730FB8D8AE813A94A190A49D5B180D8182582099908C1030BD4F72C4135BB86E6296CDAE04C906F091976E320C2F25A5200E26020E81581CBCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9D1082583901BCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9D52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2821AF6833C48A1581C2F2E0404310C106E2A260E8EB5A7E43F00CFF42C667489D30E179816A14D3137323331303430303030303001111A004C4B40AB0086825820F3DDC3B1EA46C058A39A764068EF2CB7B72B42510857ABE5357EB7E7BC90B45C01825820C112E5947A7816881C274BB4824BA657EC5D9EC07BB4B4ED8123CC94832D4D43028258201C4FF06115A456C8CAE138B9ED57CB11289DB280DD606702A0708E87CE9F55B800825820E63473E75E61545BFC3CF491002C49F9BC0543C7D85C46BE6BC8636F8A9D5E2400825820216394E05B86EF918A6C4D369717182FA5DDF11428AFD5CB16DDA32A3AD1FCCF01825820072BFA83B11291C9F05347FEE5D3499B6362A9D32461DC6745E4859F625B034501018482583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C1A001E848083581D714DD522FB07D1F895EE63270B040E8B6434AA848A9C48EE16A7903AAD1A281959B058208407BD463FDB8AB3C15C3D51A0B80BF2A983357176C26FF8956F48FCA750139682583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C821A003C0B36A4581C279C909F348E533DA5808898F87F9A14BB2C3DFBBACCCD631D927A3FA144534E454B1A006ACFC0581C41223B3ECF502363DC465DCE5AD6671B83AC790E229D3F49E68C3353AE58201DCC6D7C286A2DE84347E820F0C7470EE782590A48716C0D374AF11BF84F91490158202B222B541F34CCC28E4E6E9A9CE1C4628481FE6FE51BC34A1E45E8DE48FDE30D0158202B5A0BB58596616D24DB29C56DE9FBDB2E142C260B8FDEA43F5AE2B5D05684510158202C568BDAA195DF9DF23A9DFB24FDB8F85CBF1BDD532D1B5E0766B9847A6FA2B10158203DABB0E2FD6E598AAC8A60710123C878764D266D335CB6A80219F47772D843D50158204181EF72768DE5384584403C5032FE0134F2C6379AB1B2CFB7DA964C70ABA99501582075DB7CB03250704474C0C723E11EAD164DF7B098BEE79ECBAC4006B3E5C02F990158209356CD737265040D36A951364BE3EF9C18A06B42B5F7F0187D3C165C36E86B690158209C5AF94E7172C88868A08139FF19D47C44C011F7A0820F338241D0FB3D057009015820A99E358C89AC6C4AF9A25DD0538480CD8B498A9CC14BB2C1FE213697DB9EEAF7015820B6CF6DC35253F74A7E28B9EEDB01FAFEA96E28EBE20EE1A75B260CD8366B3FF1015820E56F42B603C7D09944F0362409F5A25D572B8781C55F0385D1260BF95F339246015820EC603D34DC271F802B3B83C5544EE2A86DB0EA922FDF092A6E8226A5FF80058B015820EC793C9A4C1B8981EED97136E7618B231C544195ECF30D1EF78A5E22AE902F3501581C4523C5E21D409B81C95B45B0AEA275B8EA1406E6CAFEA5583B9F8A5FA44B000DE14042756431343334014B000DE14042756431383833014B000DE14042756432353034014B000DE1404275643237303001581CC881C20E49DBACA3FF6CEF365969354150983230C39520B917F5CF7CA1444E696B651A0001D4C082583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C1A07076A6B021A00094B8B031A07AF9BB5081A07AF976909A1581C41223B3ECF502363DC465DCE5AD6671B83AC790E229D3F49E68C3353A1582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B3200B58204F2988C9AE22ADC58096AB9402ADD7C61BB98C8CC6F1915967C070FD22C0C5F70D81825820E63473E75E61545BFC3CF491002C49F9BC0543C7D85C46BE6BC8636F8A9D5E24001082583901252BF67C93ADE03D9DC874748CE1103EB0B9130968A5248D381C16705C4D87DBFE9794B8DD73D8F76CB5C683BE1DF38D632133CB61AB014C1A12A262B7111A000DF15112828258202E8E08B814BE2341084CC874194BC57E0D35E210954F5E57D2A1D41CB6025C84018258205A4BB987DAF15D6C09134E515D568DDE9FDE0074FFD2FA6BABC8C820DF04A49B01A40081825820DDCAB0065D35CEDF0F7B021B35732116DC79565348B718E5B29C10761F087463010182825839011B405CB6901055942AFC1F8C1EAAFCA00AFA8BD0081DE6E58B4435FD78060531E90533ABF6B0F443BEF89C71206D3FB49BFF0F1CEA076D911A05D75C80825839012E84C78697E056402A15B96833B523B07C493761D2DAE15449C8C99DA2EECF283E18BE26C0704304EF31D63A8EC1B6ECE4F3174B07A22CC21A0024422B021A000290A1031A07AFB404A400878258203149ED17E1577C562DE7EC7224AABE107A78F8A184FC796CDEA8EAC90B526497018258204FAAD68789B140095D8B09DF63D4BEC7B22D2F07CC90BBE4F724B9ED26AF72FB00825820A2AA21BF9C81A61E89BBA8A6F9C0BBF46CA812730912E3F336E0BAD60588BF4D00825820BED656C0E1B30EFB9FB8726C0416BFDE72EAEC2BEEB951199EF2AF96706637E701825820C35D2C9A1FD03429B88A43C773AABFCDC18B2E39CF50EDEF0C1F4AEF53ACB1B603825820CD6CD0844747901801A96275BB7DEEB4654916C514D440248A21DDD2F946F1FB00825820E0CAA29C1EDF4968000B42F35B71A9049369C0A0C38EE89E10099BC40465BEE101018282583901AE4A2F776C488D54616ED50D8BBE4F49A036A7E775AA89535C7BF984293C0F5098A0561F60A629E309F2B38E835EF4EF949EC3E427FDD2961B00000003F5476A0082583901AEDE1E35FF87D21A8297DBF3CED2C975E0556960348D8C5106B52A7E6948A5BEC1CBE3467F5A068DAADFF4F92DE03BD7CA263A370D04ED9A1A20B90FA5021A0002C8A9031A0CC63DF0A50083825820C298DC1865EB0436DC9C18AF92438A8DD5FE8FC220162A49AC2589719B81900000825820B9D8C11A597EBD824FDC5FCF7DBF49A98AE194108B38CB481D08992BDF7E4F29058258203934E5C09462754C0E81C944CDACC67995F8F1892FD6297869E1E94E57D68651010183825839019E415AB35AC812BB7EDFA7223BB1D6E89AC8C45CC010D0E8ECF5807396C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB81A004C4B40825839019E415AB35AC812BB7EDFA7223BB1D6E89AC8C45CC010D0E8ECF5807396C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB8821A00328200AB581C8DA763CE1D6ADB725A295A7F145C32808295B542DE5062D92EFA8370A24E000DE14046726967696433363531014E000DE1404672696769643435363101581CCE4D6F507A71B917DB0377D8F7309FE60DAD3C5397C730EA7F894BBBA24A54616E616B6830313035014A54616E616B683036353401581CD1F6CF1B73A74A154367269E759902739177D24B93286856EFE2B932A15045726D6F204F4720504153532023303701581CD5AB720E866E796D0212C61D36D5664819AB56437F2DF919FCAE5530A151436F6E737469747574696F6E555330323301581CD6EA64DD658ADC56FCB553AF88DB495A423D4573DDB3BD4803DF6AB5A14B323939393630313130353401581CD89775133F108329854694A2BDCB352D26C1D930739257D6CEB89BC3A1457247454E5301581CE1A212122B07460A739AF69751BD01CD03174791F778B2365CC0B8F6A14445524D4F19EEB3581CE304E709916948816B793C857C92EC765095E82653539B7928051ED5A14F53756E416C736F526973657336343801581CEFFF17A2E610E5C9F46E33FE964C39602399F95AA367B37F039C1EFCA15343617264616E6F466F725468654D617373657301581CF0FF48BBB7BBE9D59A40F1CE90E9E9D0FF5002EC48F232B49CA0FB9AA151000DE1406D61646D757369636D616B657201581CFA1A9FE50BA15C82F9FC18C8FDB25C745769061991C0C6C100CAD960A1545468655477656C7665436861707465727334333201825839019E415AB35AC812BB7EDFA7223BB1D6E89AC8C45CC010D0E8ECF5807396C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB81A04276A59021A00031E41031A07AFB41105A1581DE196C7C0721CFA557649A36DCBF7F8AED5B434561235593C7FF1B86FB81A0013B0DDAB008382582011785188711F5B4BB104056865F724D542AFA256C4FB057A444331A273F1EBD602825820769ED9AC76C358169618F5EAABC6B0E37373866665BD4EA17607F4EC0612FEA600825820BEF529C7CF4FB5C33173E75795AA34C4D9EFA4931DD7D6B07E8A8900E0063FF5010183A300581D711869C28A5C1023A10C1DEB30D112226CF45130B800A22D9C2AFC1C9C01821A001E8480A1581C08C56C0FA73748A23C3BC1D9E6A60A4187416FC4FF8FE3475506990EA1484E6F64654665656401028201D818583CD87A9FD8799F581CE33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6DD8799FD8799F1A0005B9801B0000019096A7E9B2FFFFFFFF82581D61E33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1A0089544082581D61E33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1A006F7AEE021A00044EE3031A07AF985B081A07AF97E30B5820829DDE81A2958DAAEC321BCA75A193ED76D580503F89AC44F8A4F96109DF6F220D81825820769ED9AC76C358169618F5EAABC6B0E37373866665BD4EA17607F4EC0612FEA6020E81581CE33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1082581D61E33BB9C5E634BC5BE187EABA0D94725EF71505D4A4CA6E0FED0B2E6D1A0049A42D111A00370C3F128182582039435B3F8A6F3FAD8771E07B5B6790A940FECC4C20A7043E945E44FF427E41D30087A100818258206A29EF8CCBEC0A3C966443A3CBF142717338517A0418B40A8CCA20CFAAA5A65E5840A5A4E03B6A9ACEEBBE2A10E11030B19CDB48103D223DA34FB7D3532BA36E30FE4EC6B0498936D6356BFB7B65D27347BD7AAA668F6E11EC0A80E5D3480E56F80DA400818258200303157375F23161027902ABFF500A6268C00A69F45F7BFE5ADBC2F70F15DF9458400CD61DBA11FC23C54FD36E3710EECE5300CF8B573D7D89EB0B59BB74849A1704DBC26CAE0FA14184182CDC0511B94D1E2AE10FD7BF62127127B4A110AF839800038259014F59014C01000032323232323232322223232325333009300E30070021323233533300B3370E9000180480109118011BAE30100031225001232533300D3300E22533301300114A02A66601E66EBCC04800400C5288980118070009BAC3010300C300C300C300C300C300C300C007149858DD48008B18060009BAA300C300B3754601860166EA80184CCCCC0288894CCC04000440084C8C94CCC038CD4CCC038C04CC030008488C008DD718098018912800919B8F0014891CE1317B152FAAC13426E6A83E06FF88A4D62CCE3C1634AB0A5EC133090014A0266008444A00226600A446004602600A601A00626600A008601A006601E0026EA8C03CC038DD5180798071BAA300F300B300E3754601E00244A0026EB0C03000C92616300A001375400660106EA8C024C020DD5000AAB9D5744AE688C8C0088CC0080080048C0088CC00800800555CF2BA15573E6E1D200201591E1B591E1801000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222323232533533355333573460CC0042646424446600200A0086EB4D5D09ABA25002375A6AE85400454CCD5CD1832801099091118010021BAD357426AAE7800C54CCD5CD1832001099190911198018028021BAD357426AE894008C0CCD5D0A80082E1119191A827911111A80391191111AA99A9824806108008B1119191A9A9A80103102D91191919191919191AA99A982A89119982D91299A99820A8071A80103409980200100088008008020B03C9111919191919191919191919191982A299A8050A99AA8100999AB9A3094013303A307908101330820106700B06706E0060063305433355307908101305C05A305953353502B2233500206E2071210011635014222222207A33054353501422208E0122350012322533355333500A2153335004215333500C2130054984C011261533350052130054984C0112603C04F15333500B2130044984C00D261533350042130044984C00D2603B153335003205003A04F153335003215333500B2130044984C00D261533350042130044984C00D2603B04E15333500A2130034984C009261533350032130034984C0092603A153350010700820108201070253335002215333500A21533350042133303A03B00200116161604E15333500921533350032133303903A00200116161604D04E33054330500153306F00B02733054330533306301602548008CC150CC14CCC18C02C0952002330543305333063001010002330543333084012222533500315335002135001222223305D3305C0053306C01402B3305D3305C0043306C01402A3305D3305C00300C3305D3305C0023306C0140193305C001304800D0910122153350041622153350071622153350081622133300C003001323232323232323533307D0050070272222225335330743305100248000CC1440052000161333335003235500B2222223501D222223501B22235051222223232323232323232323253353308B013308B013306E00848000CC1B802920003308B013306D00201E3308B0153353306E00A00315335330870100E07013308B013308A013309A010110703370066E0402800C060CC22804CC2680404411C0084CC22C04CC22804CC268040441C0060CC22C04CC22804CC2680404411C008CC22804CDC08050019984D008088070A99A998370041A802055008A99A99843808078380998458099845009984D0080883819B80337020106A008154020306611402661340202208E00426611602661140266134020220E003066116026611402661340202208E004661140266E04020D40102A804CC2680404403C4CC22C04CC22804CC2680404411C008CC22804CC268040441C0060CC22C04CC20C04048070CC2080404006C4C8C8C8CCCCC2C80400C008CDC019B800180050013370002E002A66A0082605466E0800C00840594CD400C4CCCC0A005406406005C520003370002E00866E0005CD40102A80458C27C04028D40082A404D40042A404D54CD54CCD5CD19B8900148000278044C94CCD5CD19B890014800027C044C94CCD5CD19B8900148000280044C28404CCC2EC0400C0080054CCD5CD19B8900400610041006350020AD0121001160B901350010B0015333573466E2400400C54CCD5CD19B880010031330A8010023370666E080080400444CC2A0040080104CC2A004CDC199B820040110100043370666E080040380414CD4CC1FC01C1A04CDC0998490081100399B80011010133092010220073370666E080040300354CD4CC1F40101984CDC0998480081000219B8000F00E133090010200042235500C2222223501E222223501C222350522222232323232323232323253353308B013306E00748000CC22C04CC1B4008074CC22C04CC22C04CC22804CC2680404011C008CC22804CC268040401C005CCC22C04CC20C0404406CCC2080403C0684C8C8C8C8CCCCC2CC0400C008CDC019B800180060013370002E002A66A00A2605666E0800C00840594CD40104CCCC0A405406406005C52000350020B301350010B60153353330690870100E01E1330AE013370002C00E02A26615C0202C66E0005401C58C27C04024CDC199B820010123370200400266604400600266E0CCDC0981219B803370400400466E08CDC119B82337049004241941E90680780200198600080199B824801120CA0F350050A70130BE01001350030A60153353308001001069133702661260204600266E000440404CC24C0408C004D400428804D54CD4CCC1801F80140544CCC2D0040140340304CCC2D004010030034888D400C88CCC2E40401401000C88D54030888888D407888888D4070888D414888888C8C8C8C94CD4CC21804CC1A4009200033086013306800101833086015335330820101906B13308501330950100B0193370000202426610C026610A026612A020160320026610A026612A020160D60246610C02660FC01802C660FA01402A2A66A6660C8104020120322666661540266E00044008CDC08080008078070068999998550099B810110013370002000401E01C01A2C66603E6A00614C026A00614A02002A66A66100020020D2266E04CC24C0408C004CDC0008808099849808118009A800851009AA99A99983003F00280A899985A00802806806099985A008020060069111A8019119985C80802802001911AA8061111111A80F111111A80E1111A82911111191919191919299A998440099835802240006611002660D80020086611002A66A66108020360DA266110026610E026612E0201A03666E00068050CC21C04CC25C04034014CDC08020008A99A99842008028368998440099843809984B8080680D80D19843809984B8080680299B8033702008002028266110026610E026612E0201A03603466110026610E026612E0201A00A66E04010004CC21C04CC25C040341B4050CC22004CC20004038060CC1FC03005C54CD4CCC1982100402C06C4CCCCC2B004CDC000980099B8101201A01101000F1333330AC013370202603466E0004800404404003C594CD54CCD5CD19B880190011309F013370066E0CCDC119B82002019483403CCDC119B81001019483283D200209E012100116350040A601350030A60153353308001001069133702661260204600266E000440404CC24C0408C004D400428804D54CD4CCC1801F80140544CCC2D0040140340304CCC2D004010030034888D400C88CCC2E40401401000C88D54030888888D407888888D4070888D414888888C8C8C8C94CD4CC21804CC1A4011200033086013308601330680030193306800201833086015335330820100906B133086013308501330950100B009337000060246610A026612A020160100042A66A66104020100D626610C026610A026612A0201601066E00008048CC21404CC2540402C02400C4CC21804CC21404CC2540402C02400CCC21804CC21404CC2540402C020008CC21404CC2540402C1AC048CC21804CC1F8030058CC1F40280544C8C8C8CCCCC2B40400800CCDC019B8101200700133700022002A66A0082604A66E0800800C40414CD400C4CCCC08C03C04C048044520003370202400866E0404000858C26804010CDC199B8200200E00D3370666E08004038030CC244040840F8888C8CDC199B820010033370066E0801120D00F0013370400290650791112999AB9A3371200890000A4000264A666AE68CDC48008028A4000264A666AE68CDC4800A400029000080099B833370400466E04004014CDC019B8200148028014C014CDC10018011192999AB9A33710004900004D808A999AB9A30A10100214800054CCD5CD1851008010A40042A666AE68C28C04008520021330010023370066E0C009200448008C254048894CCD5CD19B880010021330030013370666E00CDC1802000800A4008200426660F2002006046464A666AE68C27C04D55CE80089919191919191919191919191919091999998008050048040028018011BAD357426AE88008DD69ABA100135744010A666AE68C2B4040084C8C8488888CC01001C018DD69ABA135744A0046660F8EB9D71ABA15001153335734615802004264642444446600200E00C6EB4D5D09ABA25002375A6AE85400454CCD5CD18558080109909111118028031BAD357426AAE7801854CCD5CD18550080109919091111198010038031BAD357426AE894008CCC1F1D73AE35742A0022A666AE68C2A4040084C8C8488888CC00C01C018DD69ABA135744A0046660F8EB9D71ABA150010A101135573C00A6AAE74010CC1E1D71ABA100530743574200A60E66AE84014DD51ABA1001357440026AE88004D5D10009AAB9E0010970137540026A002104026A00810C0260C82446660D444A66A660B066606C0D46A004104026A03C1040266606C0A06A6A0040FC0EE05E266008004002200200202A60C82446660D444A66A660B066606C0A06A0040EE6A0200EE66606C0A06A0040EE05E2660080040022002002026666660F0660C602C044660C602C04203E660C602C02003C660A8660A0044607A008660A8660A0042607C008660A8024660A8A66A60C82446660D444A66A660A66AA03A104026A6A0040EE1040226600800400220020020260D6442A66A0020FE440DEA66A6660640A600490000998299981D183C840809984100833800A40042660A66607460F21020266104020CE0029000183800999B8100101D303D001333066059008010305333307F22322325333573466E1C010DC680488010A999AB9A308F0100415333573466E1D205A500313370290001980299B800044800800800400454CCD5CD19B885002481805854CCD5CD19B8950023370090302402426600866E0000D20023370066E08005201433702A00490300B099B8E0060014800120001533500400115335501A13335734611A026606860E60F6660F80C200A0C20D00022A66A0062A66AA0320022666AE68C23804CC0CCC1C81E8CC1EC18001018019C0044CCD5CD18460099819183883C9983D02F80182F833299A9983D91299A8008321109A80111299A9982B00101089834800898030019A9A99A983B03C00501083883610A99A8008B1109A80111299A8018A99A99827800A400420042C112022C666AE68CDC49982C800803240000C80BA6A0020D4A66A60B02446660BC44A66A66088A0226A0040D6266008004002200200200E2C0F8660CE02C6A00A0D460C2006A66A60A42446660B044A66A660826AA0160E06A6A6A0040D80CA0E026600800400220020020060B2442A66A0020DA440BA60BA0026A0280D4660B40020246A6A0080C80BE26A6A0020C20B4A66A609601C420022C2A66A660600040320BA266060002032603200E6068010464646A09C4444464646464646464660706606A00C0066607066068660A600C018660A6006018660706606E6608E6A6A66A60C60CA00401E0BC0B2660B601201090011981C1981F998188070009981C1981B9811800A40006607066068604201C60420026607066068604401C60440026606E604801C6048002660706606A60AA00A09666070A66A609024466609C44A66A60A26A6A0040C40B8266008004002200200200809E442A66A0020C6440A6A66A609024466609C44A66A60A26A0040B8266008004002200200260B000E09E442A66A0020C6440A666609A08000600860A40066A0020ACA66A608824466609444A66A660666A6A6A00E0BC0AE0C46A6A0040AE0C4266008004002200200260A80062C0D06A0100BA6A6A0020B00A6A66A608400C420022C603000C606600E4464646A09E44444A66A6A00E440A8426464646464646464646464646607E660700286660AA09000800C6607E66076014660B40060246607E6607E6607C6609C6A0040C00120106607E6606E6A0040BC6A01A0D26606C6A0040BE6A01A0CA6607E6607866AA60CE0D846A00244660CA00466AA60D40DE46A00244660D0004666A0026E012000700466E0000520000013304000B3500922330723306400233072330640010090540540033303F3303E3304E3535335306A06C0010160650603306200F00E48008CC0FCCC0F0C1700181494CD4C13C488CCC154894CD4C160D4D40081A418C4CC010008004400400400C1588854CD40041A888168C168014CD4C1A01A800C04CD40041754CD4C12C488CCC144894CD4CC0DCD4D4030194178D40081784CC010008004400400400C581BCC160004D403418CCCD4080178D4D4080188178004CC11800C004CC164020D4004170CC140004020D4D40041681554CD4C11001C8400458124C06401CC0D0020448004584D55CF0011AAB9D0013754004444A66A6600600400207809C46A0020B0246666666600204044A666AE68CDC38010008020A999AB9A3371200400203203044666AE68CDC400100081B01E802802001912999AB9A337120040022002200444A666AE68CDC4801000880108008881F11199AB9A3371000400207406644666AE68CDC480100081C81911199AB9A337120040020620706607C91100488100223333550023303F2233350050480010023500304222337000029001000A4000660784446006600400240026607666076E01200070246A0024444400A46A0020A246A0024407246A0024406C464A666AE68C140D55CE8008991919191981E2999AB9A305435573A00626464646464646464646464646464646464646464646424666666666600201A01801601401201000E00A00600460446AE84D5D10011980F1981DBAE2001357420026AE88008CC071D71ABA100135744016A666AE68C190D55CE804899191919827A999AB9A306735573A004264660A066038EB4D5D0800980D9ABA1357440026AAE7800817D4CCD5CD18339AAB9D001132330503301C75A6AE84004C06CD5D09ABA200135573C0020BE6EA8D5D09ABA200237546AE84004D55CF00482E1980C9981B019BAD35742014660300326AE84028CCC059D70029ABA100A33301575C0086AE84028CC054008D5D08051980A1192999AB9A306035573A0022646609260326AE84004C010D5D09ABA200135573C0020B06EA8004D5D08051192999AB9A305F35573A002264646660B060606AE84008CCC059D70029ABA10013303375C6AE84D5D10009ABA200135573C0020AE6EA8004CC045D73AD37546AE84004D5D10009ABA2001357440026AE88004D5D10009ABA200135573C006098A666AE68C15C0044C848888C010014C02CD5D09AAB9E00215333573460AC00226424444600400A60486AE84D55CF0010A999AB9A3055001132122223001005300C357426AAE7800854CCD5CD182A0008990911118018029BAE357426AAE78008130D55CE8009BAA357426AE88008DD51ABA100135573C0020906EA80048C94CCD5CD182800081E8A999AB9A304F00102B04735573A6EA800488C8C94CCD5CD18290008058A999AB9A3051001130193004357426AAE7800854CCD5CD18280008050241AAB9D00137540024464460046EAC004C10888CCCD55CF8009014119198239981C98031AAB9D001300535573C00260086AE8800CD5D0801020919118011BAC00130402233335573E002404C46608860086AE84008C00CD5D100101F91919192999AB9A305300211222203515333573460A4004220922A666AE68C1440084C8C848888888CC004024020DD69ABA135744A0046EB8D5D0A8008A999AB9A3050002132321222222233002009008375C6AE84D5D128011BAE35742A0022A666AE68C13C0084C8C848888888CC018024020DD71ABA135744A004603A6AE85400454CCD5CD1827001099091111111803804180E9ABA135573C0062A666AE68C1340084C848888888C014020C074D5D09AAB9E003045135573C0046AAE74004DD50009192999AB9A304A35573A0022646606660086AE84004DD69ABA1357440026AAE78004108DD50009192999AB9A304935573A00226EB8D5D09AAB9E0010413754002220582205444A66A00442A66A00442660240040020462A66A0024046068446A004446A006446666010008006004002446A004444446A00C44444A66A6601E01400A2A66A6601E0120082A666AE68CDC38040018A999AB9A3370E00E0042A66A00C42A66A004426A004446A004446A00A446A00444A66A666602E00C00A0040022A66A00E42A66A008426604800400206A2A66A006406A08C0680562A66A002405607805405405405444446466A00A466A0084A666AE68CDC78010008018121013919A802101392999AB9A3371E0040020060482A66A00642A66A0044266A004466A00446601200400244405444466A0084054444A666AE68CDC38030018A999AB9A3370E00A0042660220080020520520442A66A00240440664466A004466A00446601C0040024046466A004404646601C004002446A004446A00644A666AE68CDC780200109980780180081091199AA9815019180680191A80091199AA981681A980800311A80091199A800919805A40000020144660160029000000998030010009981280100A91199AB9A3370E00400202C03A44A66A00420020324466AA605205C46A002446604E004666A002466AA605A06446A0024466056004601800200244666010016004002466AA605A06446A0024466056004601600200266600600C004002444666AA605005C06466AA605205C46A002446604E0046010002666AA605005C446A00444A66A666AA6054064601A01646A002446601400400A00C200626606C00800602800266AA605205C46A002446604E0046606844A66A002260120064426A00444A66A6601800401022444660040140082600C00600800442444600200842444600600844666AE68CDC780100080800B9980E80080A11299A801012080091980E11199A8018128010009A80080F9192999AB9A303435573A00226464646466666042666016EB9D71ABA100433300B75CEB8D5D08019BAD357420046EB4D5D0800998051192999AB9A303A35573A0022646604660146AE84004CC035D71ABA1357440026AAE780040C8DD50009ABA1357440026AE88004D5D10009ABA200135573C0020586EA80048C94CCD5CD18199AAB9D0011323301C3005357420026600C0086AE84D5D10009AAB9E00102B375400246464A666AE68C0D00044C8C8C8C8C8488CCC00401801000CDD69ABA1357440046EB4D5D08009ABA2002375A6AE84004D55CF0010A999AB9A3033001130103004357426AAE780080ACD55CE8009BAA0012323253335734606600226424460020066EB8D5D09AAB9E00215333573460640022601E6EB8D5D09AAB9E00202A35573A0026EA800488C8C94CCD5CD18190008980798021ABA135573C0042A666AE68C0CC0040380A8D55CE8009BAA001222325333573460626AAE740044C8CC068C014D5D080098021ABA1357440026AAE780040A4DD5000911A8009119198131119A800A4000446A00444A666AE68CDC7801004898038008980300180298129119A800A4000446A00444A666AE68CDC7801003880089803001919A80081100211A800911A80111111111111999A805900B900B900B9199AA981101500B11A80091299A998090010020980C00180B805912999AB9A3371E6A0040346A0020342666AE68CDC39A80100B1A80080B001805003880B91180F11299A80088019109980300118020009299A800900B0019111A801111299A800909A8029111111111299AA99A999AA981001400A11A800912999AB9A3371E00401C2602C00602A0044260286A0020440244260240022C2C2006424460040066601444A66A0044200620020022018446602E44A66A00203C4426A00444A666AE68CDC78010038A99A8008111109A80111299A8018A999AB9A302D00113301400B0020262202813006003002235001222222222200A2350012201C23500122222222220092220032220012220023333300248811C0BE55D262B29F564998FF81EFE21BDC0022621C12F15AF08D0F2DDB10048811CE4214B7CCE62AC6FBBA385D164DF48E157EAE5863521B4B67CA71D8600330014891C13AA2ACCF2E1561723AA26871E071FDF32C867CFF7E7D50AD470D62F004881074D494E535741500048811C2F2E0404310C106E2A260E8EB5A7E43F00CFF42C667489D30E179816004881054F574E455200221233001003002222221233333001006005004003002300B22112225335001135003006221333500500C300400233355300700F0050040012200130092211222533500110022213300500233355300700D005004001300822112253350010052213300F30040023355300600B00400111001220023005221225333573466E20005200013005490103505436001533500213005491035054370022153335734602C0062004266A600C01000266E0400D2002253357380022C240026004444A66A00220044426A004446600E66601000400C00200660024444A66A00220044426A00444A666AE68C0500044CCC02001C01800C4CCC02001CCC028CCC02C01C00800401800C8C8C00400488CC00CC00800800488488CC00401000C88848CCC00401000C00854CD5CE2490350543100162215335001100200715335738921001622222222007220053704904D0F910B111110021B8748000DC3A40046E1D2004370E90031B8748020DC3A40146E1D200C01049FD8799FD8799FD8799F581CB6A399BB1A6598ADD297EB8724911C41FB720F6D17F6221636B458E3FFD8799FD8799FD8799F581CB84DC1F29279A96CD8D21B1F81A63B10D01103A9EB86FFC79D1AB1B2FFFFFFFFD8799FD8799F581CB6A399BB1A6598ADD297EB8724911C41FB720F6D17F6221636B458E3FFD8799FD8799FD8799F581CB84DC1F29279A96CD8D21B1F81A63B10D01103A9EB86FFC79D1AB1B2FFFFFFFFD87A80D8799FD8799F4040FF1A18E0E563FF1A001E84801A001E8480FFD8799FD8799F4040FFD8799F581CCE5B9E0F8A88255B65F2E4D065C6E716E9FA9A8A86DFB86423DD1AC04444494E47FF1B0000016902C758161B0000018B9265F3F5D8799FD8799FD8799FD8799F581CAAFB1196434CB837FD6F21323CA37B302DFF6387E8A84B3FA28FAF56FFD8799FD8799FD8799F581C52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2FFFFFFFFD87A80FFFFFFFF0582840001D879808219A44D1A00E33567840000D8799FD8799FD8799F581CBCB15EA0CCDE1A3E6BCA4472724E4017E173F94E97A60D3E682A6E9DFFD8799FD8799FD8799F581C52563C5410BFF6A0D43CCEBB7C37E1F69F5EB260552521ADFF33B9C2FFFFFFFF02FF821A00280F711A2EE1ABA7A30081825820F91F45CD2DC870AE7F65186C74C6A183A540898E61D51A3126A6F00BB950B27958402BBF458FCC9ADBBDB5990BA91606CEFABAEE1439BDCB498D1FCC2C9E936A6361A126BE17E9D2955276F5FF66D855C1AFB3FE7B8B1BE0B4CAA9D60ABE3F4D8E08049F80D8799F582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B3D8799F4040FF1A26BE3680D8799F4040FF1A015B23309FD8799FD8799F581C4523C5E21D409B81C95B45B0AEA275B8EA1406E6CAFEA5583B9F8A5F4B000DE14042756431383833FF01FFFF1A48190800582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B31B0000019051AF7A480100FFD8799F582083835D62DE24C15056AB445A01E093F621ECD85675EFC2BE4E8257C98B59B9B3D87A80FFFF058284000501821A00279C441A2F128CEB840100D8799FD8799F5820BAF4F9A24D72868698BDD2FCCCF1C00E3990252F239AFAA031FEA146B8E7942EFF01FF821A001F69F81A260DE8FAA1008182582006E05CFF0C72A3EF4E2853C351BD122FE7E5049A37737983394F012EAB37C8515840725086D5F44100A22705E0BC545C4B24F77266DC6C8154EB1B7FAE989C87566E7CDAECDB4AFB5EDDE2050AFFBA426E27457F2CDF1EC26C31B0AFD2AC61C6680BA1008282582004F3E99F60B98399C5420DBEC2BEECFE5F7E2DB477962BBDB1EAB4FB5C87BE3258402678886A86150F1314C65211E57639FB4B37E45A38E15CB894F27D3EA3B9AE23E32AF0FD551F89C6C13ED156A8CCAFDE94E7568BCE26CCFE7A0A8B40B2D243028258206BB92A20014AF583D1ECB932D8C6FC284274CB5DF043EC36546F0FC8B10C27DE58408A5CCCD412A974E67341364E431BB349C1138A8AE61BF7689E949D7A555A1E14B5CFBC006B66497C4B230F247E433D2F453115011081359258925218972AA50DA10082825820B2C6CA24ECEEAA1D8E3F4E7B7D08582EB988CFCA33ACE149D97D13292D79CEDF58401758913ADDC471E9E53570E72B5778B6E9C7D3D47A4EBB1E64B8959BC70847DA6E1A5B86061C772135C3C7B6BED6B10F4A6A192F59B7653A45FAA64F9B6463048258203A2680B177DBB362922FA79A4C944D79221AC55CA6C3A0C11B60AEC9898BBC1E5840920288EFF6A54E2FB20C25B4F040024926FF0708713E68ED7779582927A1CA4D9EB05D133CE92AADA7F4AD3BD5E704A85AC2F68809569762F25D09937AE42F01A2008182582045E7EE2749DD98AC23244FF99D31DF8C64CBBC17D246B02DE9612268740B7D3558402271B7EB17EBBCB5119D0E41A953FC1344AC69C7B690599404DEDED7193852C175A6C8D7912E8DCA3E3AA87512308C3CA430CE9B5488047282A8BD3105372B090581840001D87980821A0012C8941A15F9CDB0A101A11902A2A1636D736781774D696E737761703A204F7264657220457865637574656480")] + public async Task DeserializeBabbageBlock(string cbor) + { + byte[] cborRaw = Convert.FromHexString(cbor); + + const int concurrencyLevel = 1; + const int iterationsPerTask = 1; + + IEnumerable tasks = [.. Enumerable.Range(0, concurrencyLevel).Select(_ => Task.Run(() => + { + for (int i = 0; i < iterationsPerTask; i++) + { + Block block = CborSerializer.Deserialize(cborRaw); + byte[] serialized = CborSerializer.Serialize(block); + string serializedHex = Convert.ToHexString(serialized); + Assert.NotNull(block); + } + }))]; + + // Await all tasks to complete; if any fail, the test will fail + await Task.WhenAll(tasks); + } + + [Theory] + // Alonzo + [InlineData("84828f1a005904061a01e4f6a5582021c3111a9a7bc94c4473232472fc13cdc2d28ffdd23d9ed7b717eafcaf3cfebd58202f3cc6c3b7f0e0c9ded59042ed973ac7aa4031167f0943c36d33bdf9bce73df15820d31eef88456a81532b2e3542edc12efefb74ad83c60d60448b70f3b0c285b885825840d9921e2e598048e8af42cce072c6e74d22dc0064e94c1b32115ea494065135b167fef63ccb12c5940eae27c726a68dc92db5f473b26a446ca495e23a4d3105b058501273dd72bc5091c6b7c34563576d011a5f61033211ea2ff0cc1976df837898d2084ed7f6f0284bc368b304fccef948c87b536db46af1e47141070fba9ba4788cb9bcaa9726f685ca4a953379c5e4f80d8258400006925d0fcc5b11fcf3d6303510b705e704ef5c1cd71bee6feb58f0895b2feaae9c843966b5e769f74b7937154ae767986ca553110dcff8b69c05961095656058508bd080d854b522a284d558adbd4516909c9ad7bb105bacd150f15c35aa82e2139aa8260a93a0e80287579fe46dd1c16577195d0aa5c861f4af85bed4b69c423587b191346e9a684781555e34a7c91b091924a85820df0c914fe93ecc076b9fa077390a4cd3ecf0413e5f71b88801cdd4d292b169be58208e825442eb570280bbcd1b554cc293231a7872bb05b3cc6ed2d16db6204b14ae0618c75840e7694afdec5e9edd646e5f5bc78362c1b079d0d62ef2c20f94b861cb8792222a3d98ac0fa94152e40a4f78a7bdab89b9c338e2da837725f3f0e4e4b6d67d890b04005901c0cf880816e236766340725d07aa598ebc56b7999a5d2dff8be576bb8c06ff66a5027c1cfda2b0b1c8e32413edd5e592b9adc9e74fcfd2017afe2fe98d1455b4098a0c89711bd71afb2f5e10a1265768f2c84d98d6acd1cf052bcc616a0255e0b867766a7723e99955687dd389c7864394ae1400836d9c38ac1fd467db5e9c11bb1dc787e0eee92473b93b48b09eaaa6d3a160d869895e37c300c2583161878aad6b06c0fe46e0b0d28fa1028047874ff4e70d23c5f453e4687b658311c42640ab8e6a1bdd02719ae72feb428627fed163b58c33f8a7d56ad0945009abb8253beb5e5dff60cf9afc15c910962fe4c34480f06fb8950afdbdde8281b1140e5e3265aca7020a3e3fd0aeaacb75fc9f933737f233cde6c03a7eb92742e028bbecc40969e0b68f08e53bd39362cb9d4226014c2ad89d425c754c1abb11ea9a54480aa4bcfe57ad62b77903cd90eb8e3374f40a7a11beda3c76c9cda5bb05ac5f00f0f868f07eaf1b1a9f5dde8ea19284caeec8e0f4d3cb9e14a676cf1f79adb31428bc910468877a200bd233e78b367b5ee667c29c2a0caeaa3936955e997bb02637975b47b75a0fae0bbe874d16fea05dfaecd87c9870bfce0d4ce1dab6320fed49da8da600818258206384be115440a4398bee154a03b0660cde77866ee87d668213242d8e52f813b300018282581d61b09810bf167ee557da7955bc8135b0a9c9e51fad323acc4b6841abd31b0000000107828e7582583901f0ba8e195c38a3be42b81959060f5e6a9a0cd3d328d8195bbbd7b1990e49deba7d017723225dc1779de91e4d19038609d69c6ab6f684ed0b821a001e8480a1581cb7ef0cfb14f588740d02ce8a53879ff96ab03c7b21ec1c459ac2bddaa15048617368477561726469616e3137333201021a00031a21031a02dc6c00075820449031012be3ce0052199538f0c2db90726f8d36eb11b00db6b510a8c9243cd609a1581cb7ef0cfb14f588740d02ce8a53879ff96ab03c7b21ec1c459ac2bddaa15048617368477561726469616e3137333201a4008182582005f2aef69abfcf78a67779b6e6b0cbc5592724fc53ee6ea0b8f4649eb9bca73000018282583901d5645f643be8735fb35c85c220c5bf521411a310bda81b4208462c3357de49b84973da8064a5867c2ea82a60abb7a010ff88b9e59fadfc221a003d090082581d61d91ef01b73f3010bb173945cf5417257c00c002715a13052015ab54f1a5b4d3873021a00029cd5031a01e4f753a400818258208760b7bb6c2f9c5cc340cd2c62ec3ab27b40777cb079e1b7fe01fe6123dee58501018282581d615fc1436b582a50ff4c5fdbf7e20942bdd45eb3aeaa7abdf442a6a34a1a1dc1b06c82582b82d818582183581c05b073f36ee030589a31148838cd47e8d8c8f82fec9fe091c7d53cd8a0001a0c5f26b11b0000000b9eaf4d11021a00034059031a01e4f7dda400838258209d9c7d4ea2dfbc730fe955b7c0b684123ed86f0054b7dc943727ac7bc7c2c7d200825820190a4421872e886d45325b1c2bbef914d98f11522ea81ed92a8839a87ad9a4b80182582005ede2bc0420a37dec63e032603b03e4a365831e5671aaada2ba6344c0234a7d010182825839010421800176834399c971e71972d5c85d1b45ee9c71242b6fc25cb84dcb4023d8148d86a8072f39cdb21628f2691e7a89f38ed158aa5d27bd1a3b9aca0082581d616904e8b2c26f3dda6c4a5db4b3ec9e31d581c9960977cfe9c6917a431a1c5f0591021a0002e195031a01e4f753a60081825820bdb86187627fde6eee1601c88a792cb9f3a459f6cab26ab281362f9751f0ae4900018182581d61d80fe69ded1ff90f41e526d0332a2ff98ba8a0d85ceb8941b51784201a05f11c47021a0004c4b9031a01e63c82048182068200bf8200581c001ec42376196df0b85b6ad660e7419e77b51b16fda8b931d559562e1a01f9d2708200581c0122c6ccb1533c9992ff08a9029b7b5a016d5c08d31a4963cd027afc1a012661c28200581c01fad190adc72e0884adb77aa72ef9d95d3adb75f782bad63b53a5b71a02c7c0c48200581c0a57686dc0d73abbf6ba8d1310dcf6887b2daa4693d94bc170fc08551a00ecbf328200581c1176b053d803161ca3ac7295f5ea78171b91650dc558d852e4547b601a0008ab5e8200581c125fa8bc3a9acda7a2e3646d6ecfaea925758378ad18011ef7164f461a05bb79a68200581c153d28771d39b9852db013519d4ac5542f6e7ff61c5b5327a129d7681a001ac34e8200581c158cfda322ce2afdebefdf65f9cf1bc671472a470552ee2f55c8837a1a0091b6e68200581c199231d9529171c85390273df7dc21d787883ab3cde9f8ebae107a891a0124b99e8200581c2142e4997ca5f537199575019d277554c0aa14841af61d275978a4dc1a0004dda68200581c22f8366b4ec72f3c0be8b13a2f1360426229f44db187d0534e68c7141a002359898200581c24f1b3791037e55363815fc4b788b886cd1d82a2f2d39e17196cd1a41a001663a58200581c27f1b09428918e1454bf6e7c6cb88e3444f6e6a73f5d0ee644174d491a004b24038200581c350d09ffe65fec05b5cfea6672a16711ed3266ae608cdc6c4a75bae71a04c71cb38200581c3c775aaea2b5571a7f930c0375255d05f21deb42605ee66fd88ca3961a051bb2108200581c417e75dd8b721053008dc50169b08a8c5070db24718e6c1e8b83a0c81a0187281d8200581c42ad1acfc4e58c415d9c410de920c763c006392d7fa69b9a09986b101a2cb1e7d68200581c43a85f2839f1df18abfc04d12a55ec6eefb96f85d1c96236eba8159e19232b8200581c45aaea6b8f8056eb52b26c4115026452bfa4e4cf33a931b0eb85f9711a04ce773c8200581c45b6ff95bf046f3ed0a047e6968e1374d67aa39354965688952fd2171a079227888200581c460417506c1a3042e133cdef4a7dabdd02bda35c14eb43cce13516841903f98200581c46679d60511973cd756322e6fdd1b0d6224eebec681f065a704e753e1a0195a52d8200581c4697386c4e3dc2b43f49564e6361935280f1f751c80a6c9cadbfb33b1a0c85fe408200581c46a31eb43ac7d42255b74f24945badfc5da0014a2e37e6bcb69ce4d91a08b943518200581c4a8b1947b2cf3acdc443a89022a453683c783bf864f8b07a59d943671b000000012bad4bcd8200581c4e049d9d384b6795237264bb400d0174a4c6dc808bdfd70ee692ad2c1a0374aaf08200581c52662fdac99229b8f9682f47c2d3ba181f33e79b429a2a08d0f54d091a0064f8398200581c52f28ebdf268ae3eef783dcac001657502d8fccafa9d8158493f65331a0010daa88200581c59cc53d2aaed4384323b2358333fd607ed9928064b10459af4ec59771a07937e108200581c6877dcb866858b2a4941351c98cd67202262bfd82a016cbbaa0739271b0000011a95bafbed8200581c6cb47c86575faca5f0c555f30b5c45f291aa5d6eeb28d7eed82178491a0048d0198200581c6eab73f5febbfc54243d035bd3df1986a6b88149f6c8178b341dfbc01a00c1e5c38200581c73d2af07d180c46a40ea6f63a04a947588033a401706bc80f72037e51a09017b278200581c745f6af3a90cf0f2bb23f8ab3ae3978ced39a56b31cfacc6b746258b1a01749d798200581c785f7b5357d18f1a887f5b1e114b96071ccccbff253e4b6b01574ae91a0116eac48200581c7ff0ce382f9fc3f12bc0d23749a7d6690b5bca1521a1c83cb78b5e211a0311471d8200581c83b2f390520f69d98a374e391a48da191418e10be9e1f33583ab51771a00945ab98200581c8723dba003e8c3b8d31e20f92d1cab0952b67d4405f64b5957f790c01a00bb80bd8200581c876c8abaa636168c7d43623be103c6bfffcfb0337c05ffd1a7ea72e51b0000000150dda2428200581c98f137b818ec3c13cb9fa89e116af481bc6e80879de23450e714c0f21a00e21bcc8200581c9d6b6319e2e79b0ea46f3a6ed27414ca9563f2fdc1969fd12751ad941a0078fb848200581ca545012a07d0fe8a284fd159753857d3b7ca1f8bfd6a389b0086c73b1a0c64df948200581caaab46ce0889442fe83e74489970ef6337721fe8761478825ec7701e1a16dd0fe38200581cb3877745120a10b5e302cc27303e91fe2a387dcb189a74aacb6493d81a050db0c18200581cbc000424731d5cfdb41da8bbb2e8bfbdcf05becd055a3f831a0ccdfa1a0b46a4c98200581cbfb28b26bc5e5c844e8322889cdb801fbbf0d00a2bfebb67c05367b0192a688200581cc127f4d4d4d729b3a8ba129764c366c7a96c99080546d41f3b18a51b1b000000026b353c4a8200581ccd38f8c900b24bdb5b0d9808b3b781f2c63639ddfe56407291448ced1a009923c88200581cd72821377163a04744a937d9c883ad37f835d53d010377c405a3a76f1a00c6f0ed8200581cdb0de66e9113e8ddecc3642124a557fe0d7753d642162cc1ec85292c1a00b505898200581ce10b3c4fd7b13a5d3b03d0f8f5dac81823e7e25c521b9535eb99f8221a000df4958200581cefb8d63c37774aee85b731f53300e920d0cdfc2fb5e84f6a0ebe678f1969978200581cf1ad22aeae767f9fffccc3c14c271e893c5479bee5e59e673a5ecaed1978008200581cf469490ab5e6ec3f7889b29759e4a40b473c02da521547b1c3027e0f1a00157e568200581cf51bd635bddf367cf9ffc0726f0c492cde7a1b1640c1727d54a7446d1a02d80dda8200581cf8b0dada0c9d9ffeee95d7f536799a4034886e6d60a7367f81948a021a018065828200581cfc19a4302b9fe7b337e6f5a767efc5c875cd874768a19b0c535b9b8c1a000bc7f28200581cfe49dc3325b96a75c098406c0063e9560fc903df998d2b14736f9f2e1a00fb0f8d8200581cfef6bdfbf412da5de3c8d5aa4d9b1e30eef8c44be91b1eeb3afb279a1a0059dfbe8200581cff7893d54dfceeff87c5f298ed1bb1435878ce694a3884eb6619f2b71a013581d3ff07582099f2c2a11bb310d2fc48d394b0946f10eeb0c97614f29d4e23d26694d9212bc7a5008282582045cae0be92fc3798cd1ce05496bc1439728d42f9a8262cc34d7f543f7f5a8c8f01825820fbde6fe2ab20d17e7701a277e3f6f9c426278155ea9b66d58b8b1ad0c9e1bc261841018282583901f33a98483aa3f8e7968b444a5e3dc00e1adea6bcea66b57ed0e94094e512e0225710f61b5cc54df075c02d8b8a56a9a50ae78f5cff08672b1a000f4240825839018ea03c582adafe939362748a746af8cc5956265a1bd725e7a2de86d0e512e0225710f61b5cc54df075c02d8b8a56a9a50ae78f5cff08672b1ab2c6b355021a0002d115031a01e512b70758207bd96a772eadcede1be69dbf670e089a9c84d894b706f6af2e30e238b70bc3fda500818258207da8e470075fad15fdc1e6491c6243f227c8293b45d0bd851701f2ea452bcf9f010181825839015f55d092a48e116c8de09bb9f98b37e76ab59c7459d03d47f8fb60c1e638092504459177f7ca7d69ff356f28abf49805b99265f14aebaebf1a1fdcc802021a0002ab9d031a01e512a9075820f95046da8aee6914b6f42e6fd50a38c17730e8880cfaac5cee91347474280c6aa60081825820a01b9fe136e5703668c9c7776a76cc8541b84824635d237e270670a8ca56a39200018182581d61d80fe69ded1ff90f41e526d0332a2ff98ba8a0d85ceb8941b51784201a05739382021a000376c5031a01e63c82048582068200a48200581c0af10f4a5d365af01f0ca7651713a8a073263b61bbd1f69623097bd71a0fca5cf98200581c14bb4165052cb5bd0ca51869db388610c9ee92ca67e44a239759d0591a04c796e88200581c854139fc8987990fd89699beb1b59b09c047ace356870dcaadc93b221a0052a2268200581cd5b9ca34735343fcfc01d804180c8cfd20c45df317c44dec278ecdf61a0123a66f82008200581c0af10f4a5d365af01f0ca7651713a8a073263b61bbd1f69623097bd782008200581c14bb4165052cb5bd0ca51869db388610c9ee92ca67e44a239759d05982008200581c854139fc8987990fd89699beb1b59b09c047ace356870dcaadc93b2282008200581cd5b9ca34735343fcfc01d804180c8cfd20c45df317c44dec278ecdf607582099f2c2a11bb310d2fc48d394b0946f10eeb0c97614f29d4e23d26694d9212bc7a50081825820269fb6b97199568fd06b86c6dd8270f83150d7d40c215f2ba8f8e457d7bb245000018282583901c6c9a751f0eab448ae680c7606bf4b2384ae9a71295cfb08c17a64ec8603a5a749947b55e82c3ca023c427efed03380884e489835d5bed691a000f424082583901c070231d446324730fde9452e04796492b1929b9673145d01ca9d5458603a5a749947b55e82c3ca023c427efed03380884e489835d5bed691a60e37dc7021a0002b8d9031a01e512be07582070830ca599509b5c16e2ade57f1940041d44cb4261670d2e354199164d112e12a40081825820c0f8e704ffc3d13ba2e4d09a4919f32ae6fcee035b6fda43eb9e9ca17ccd8a4f010181825839012e38ef6f6dae9baa3fa9b2acd8fc2c4f107d7434e51525a00adf110e8a2cf13c17ac2bb9b259e319f57313cecf912ccc0a9e0c8e2f3b9a91821a001c1f69a2581c21514b6c51f0aaa0c9c337329ce93c52fad208cfd0b4ccd51074d9dca14e50494e4b44494e4f43344944353401581cd5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cca14c53706163654275643137303201021a0002964d031a01e512aea4008182582071149f420d83e79cb197334a53498459bb212088f8ec2d173f5c87a83122dc9401018282582b82d818582183581cc0f1996bab57bd968f3cb5f6c52b0b7f3b37a937661d9a3440a7c517a0001ae951ab841b0000002e90edd00082582b82d818582183581cef15b91c9a8943935b925f188ae69d93b1fb3778287e0df8ebad82e8a0001ad69ba11a1b0000003ec066bc87021a0002a3b5031a01e5127ba40081825820697eb1e4e80920aa55dff603bf7e8df6d315e6fd621c99001a25862080a443f501018282583901fe196271973f89a9abb453c5f44581d3cab2ad3dae125f23c65b481caecbe3dc3fa606f16069de1d7013317100de7f2fee422c613712f3251a26def39782581d616904e8b2c26f3dda6c4a5db4b3ec9e31d581c9960977cfe9c6917a431a23b2abff021a00029cd5031a01e4f753a500818258204f00b22bf5e786cea6dcbed8740eda5a7dd26a88ee920674a01e032e56865d7a00018182583901f18d6a760e1b546680e78e4ec2b63c0f625f085b8925ff1ae40f5480973a4d96aa61a3b3af82dbdbfd15d5998f49fca582f4c617103b6fd71a8acad8f6021a0002b104031a01e5045d048183028200581c973a4d96aa61a3b3af82dbdbfd15d5998f49fca582f4c617103b6fd7581cafb33d38e92e03f9ce86f0175cc33e487b8def0ee25235f1e40183d18da2008282582014117c01278cbe88656a15738fa5e01ef899cf23c425ac3ace6c7042a48cf5b0584092bc3b8ba635ad72fb2cd1ef9b904d0651efe9adc5e8d4dda2063e4f9c8e780e3801524b7b047832db5875237751f51492fef8867dd9fa4ed5d9535713d41b008258207e80cc664e8e06f09351542237eba50a14083803f5d71e46d199046ab6d10ca858404854b2990692d016989742b78a0b51823671d7c09f36dc72f748613cca53f4d0b1084bb8ef4ec981bd063be93e1042038da84db130db8c1d41d257cdba27900001818201828200581c43475dd8f7ff3f4bffb1c0675d7e380b6fc4cd01fe4cc6ab6dc799fd82051a02dc6c00a10081825820991fc8c992024656460d6be0ac794b60050a66eeb8c1a673cb3f6cd476aea60958403171975fb103dea7995f85559fd74d4af4eedb58d4f602b62463052a75a541f952414e532562576893a797ee568e21a6ff5211a206313458491f6a18c94cf40ea10281845820f129f07bbfd87fd1d3ff5fb32e9a5566e02208f89518e9994048add22074f4335840faee03bae826b0b75f9b5ac383100098ade25e92b52c77804e9297321c564416efe7543a823d4fe14f4e94cc2f3f6351062775fb0ed002f04cc4825f24ba610f5820424e682a392581268c7544e34e9c54378a8820bdcf7dddce30490bbb2d363b4b41a0a1008282582073099bfb77940ff95733beca81b062d2355c5938e8c0931444b10af9facbf66f5840bab8e6f8412bea5e8ff61f5d0690043013dd4a14c582f0a23572dd444f797d271ed61017a5b5d7632fef01312c5251daa8dfd1bba2e0737808a18fe9d90ac109825820393b3d3cab6be0897cbc87143cc3a24825dc1d8249df4d37969502931cf856ff5840a96042cae910c15af4d7fdef81172665d5e9ebfbee7f965621859ff06128fe350b8d717fff9109fa9007208cc822ca34b42362d9f46f3e9e067779b2cd0c5309a1008882582061261a95b7613ee6bf2067dad77b70349729b0c50d57bc1cf30de0db4a1e73a85840ee884e65a0218cfedb1cd7fb33dd67c1a8483cde46e990a2b07cdf1b2a02429bcaa26705fb905dd0dc7d00f4b0aa76084de11d9142c0d51f623a39d6797609028258209180d818e69cd997e34663c418a648c076f2e19cd4194e486e159d8580bc6cda5840940aa59d5f5b42a414e8a498f3854c2a3dc358f20e5f13315f96ba54ac846394656bbb3cb29c8bac8fb85bc323a0eea55e42090f5169657974ecadc278b6c10b82582089c29f8c4af27b7accbe589747820134ebbaa1caf3ce949270a3d0c7dcfd541b5840507b4bb892b3412cc67ae4c1200111ab4a3092d36542f1c672eea555807da2e5a8f4788a7f696ac83a014c5d0adeae73c976611838a21490b7cd8930ffbef004825820f14f712dc600d793052d4842d50cefa4e65884ea6cf83707079eb8ce302efc855840f08279536d20eef4d5a1b8bc2b068c7c9901577541a62a5adb462596c8707f5efd16a193f9216fb95fcc307116a9d0f756a4cd1525139448aea2a7f828441b068258208b53207629f9a30e4b2015044f337c01735abe67243c19470c9dae8c7b732798584063bf278a2e77401c8fafaf2d53d7ecf6ba5dbfabfce432d56d9c189f1572507a5158a6aa01d33be4355388f7e850b00aff53dafef5fe0154491f688bdd639a038258205fddeedade2714d6db2f9e1104743d2d8d818ecddc306e176108db14caadd44158407d6b15a4ef09f819f9d2498a316cb3269842878200bedf5550b495772bb20880094950cd3cbb8669dbff863a32555401778df131103bb603b96a9f5b28606004825820cbc6b506e94fbefe442eecee376f3b3ebaf89415ef5cd2efb666e06ddae483935840fab6a4d5b9c19d32202ce689c82aed2a89c02a62ef780694937f4196e65656fd3e4ca0679ca8ca1a83025d1afe8fe2d8e3e6b0db6e9cdd491eaa2ec866604b08825820e8c03a03c0b2ddbea4195caf39f41e669f7d251ecf221fbb2f275c0a5d7e05d158404ddc3610fd5b52e310c52e52fbe8e873a831ab91e525b0733dfed21615b412d17ae77421e645b875bab25378c424c7c2471f674e45cfa1dd2b846b17cb7fe300a100828258204d5a7408218b85ba016167e1fcc5e8d0624ac8171de065b2842feaf4c051d5b9584086d8648acf6e8d3eb75fc56113aa29fc5814fc76fc8b06d583563724cd9c5c6cc097b335b2a2095dfa8c344066ca45d74511545c733e85d0fef5ab8e115de10282582071df0e0628e75eb9d6c891c8a4dc38f81ed8cf757ef424fb7ab651ab4cca2e6f5840083d3fb001c8e68b1cf9bec2d645bdf76636cd3bf3b7250597c09d26f2b0587be0eb69e279a8ad9d6f5e747fbce18a53c0da03e264f2fc794cad73be542a7704a10081825820e6fc61be738e242a1e21459b4e4847d739551dcee94b1f9b64fef42d19812887584068839e96ed4962ba56e0e0ad256d13f2980eb433d3879c9d32683034da65f6fa288b06e02e603741dc1f973ffcb8209da5b4cfd06885d9c78ddca1238f418d00a1008882582061261a95b7613ee6bf2067dad77b70349729b0c50d57bc1cf30de0db4a1e73a85840cfe660cdaff7bc3b24b64c80a3792884f56a84c9cbda089a81a6f01d5174598d1227639eb614ab36eb1fd217e212480acb8f7b109e7490e93bdecd4eb764a90f8258209180d818e69cd997e34663c418a648c076f2e19cd4194e486e159d8580bc6cda58403be9de37031ba2784bbfd08945d9cf8e02d30cde58a2feef5df12f901dca43d6b23bc294e7fd3d5cbcd4eef054dd872b48b477b601eec3e6d623c4cc9b97b10f82582089c29f8c4af27b7accbe589747820134ebbaa1caf3ce949270a3d0c7dcfd541b5840061b8f2c0771b3a7e281222bd11f1e26465e6441cef4957d961a1fafe5406fb5e21351a437177dafe2cb02e79c44466f63220eea6d0096763747469d179fe604825820f14f712dc600d793052d4842d50cefa4e65884ea6cf83707079eb8ce302efc8558400fa377081dd0adc26a806788ad60a71b82bf8057b6785c7b6c6307f03640469105f8f55b46e2c0cf4c5ebc8e8bbba2c5741442e30ece4842e875840a4705080c8258208b53207629f9a30e4b2015044f337c01735abe67243c19470c9dae8c7b7327985840ad8c64b2bb2985e5edf89625c70ffb3484104757675f2d8262ec6318cf9bd4716d3ab39d5a8f914ba1743ac69e16e142055620475dfcdd1389c50cb14c4e060c8258205fddeedade2714d6db2f9e1104743d2d8d818ecddc306e176108db14caadd4415840bb4c5cbd67d83698069c6bce1fc976f007abd15f792783c3e2a83135c6c082ce592e7a17ba5dcf70abaa6605a72d28e46d71ffa084984fc23b7e590578bf8e08825820cbc6b506e94fbefe442eecee376f3b3ebaf89415ef5cd2efb666e06ddae4839358405164f088b9005d1293d2dfc355ae8d64646aafe91d59cd5f5ea215ced68da3d47ef92e3185a3e6db2deeef99620a9df196dea1fc7a622cb6984d12840a3beb0d825820e8c03a03c0b2ddbea4195caf39f41e669f7d251ecf221fbb2f275c0a5d7e05d158407c10de828d07245f566237c8b3fc4fe0364480425ed4ee0439e94e57f87a526b2e581593c04b563bfe7fa423993c967fc8fc968fc1965eb51ca69368a2d7eb06a100818258200b68eb8e7438599681f732bda6eb942d32692cff2e0b43f9b944d67031bc493258405715f38cbdac7f18da841251f206b0d75df29f74269d2a6ed4a25884ad9c67fc15dead361482c4b16a51689de08efd54d9985df84fb49d1ca387070ac732e703a1008182582048d87ba1c9b6369754f9fddb76993befb16914f3b495078baff05fa0ad2ea934584021829192ecccffadb0ac65c33d142ef81627f5e7c9ccc6d40c87356390da85bbe0136b912c85102b9a38558eeaadddeecdbd9b677b6a68b90f6ae46583dac303a10281845820e87aefbe36826ed5f12341b167730b0b4cd6aa7cdd55709d9e675e684b15eadf5840ccc01472bb6017068a0c967b01813b0e4a489c390d4fdcc750eab073f806d82909e34ad7d920a679138e9edc2c5f9e44e5196281f8ab4b49c1f99819e8da520a582094a2c075ed1bf539b9972561edfac666d7c0669676bb98c21bed66a67bdd5bbe41a0a10081825820393b3d3cab6be0897cbc87143cc3a24825dc1d8249df4d37969502931cf856ff58407d647699068327b80e8881e1c93b7a5966863d12cb12e0bdf8261fb5f65f31534571cd0075a547c68057e4be9e72815a49ed08b3dad782c2b8f031deeca9a206a1008282582064bf0b03a9391aea875c6b5e258e26626e97e2279f53dbc9c8e853245f93d51b5840731721e1803e3eedf6866bec354e4122db21b404b89e3f34aa2076519e39262c6bcbec568fc3fafef66e79215497e7b7c461ff6f049e4fca9a4b4cb1b07622098258206951036ecb873cf248486656fafc2583350e2c173f5f3b6bcf1b199ab047179858402c213d314de43c42c6a687e7e088a2583989a7cb85e2c5aedf7baa86aa80cc983f2f92c50a362635cf26992e224bb6bf93530c3cf5a972d134a9b3beaf86f20fa60082a11902d1a178386237656630636662313466353838373430643032636538613533383739666639366162303363376232316563316334353961633262646461a17048617368477561726469616e31373332a96a6261636b67726f756e6464426c756563636964783b6261666b726569656973797734767766756e6d703264356b6263363279646e6333746e646737766433687335647537626b72343267686963323765626964782436613932346364642d346537362d346262362d613037312d31313863393562626462653065696d616765783b6261666b726569656973797734767766756e6d703264356b6263363279646e6333746e646737766433687335647537626b72343267686963323765646e616d657248617368477561726469616e202331373332666e756d6265721906c467737065636965736746616e74617379667472616974738a6657697a617264724c6f6e67626f77205370656369616c6973746e4368616d70696f6e2041726d6f726e476c6f72696f75732053776f7264684f6c642043617065654c65616b7968467269656e646c7967416e6e6f7965646642616e6469746e5769636b656420476c6173736573647479706568477561726469616e800482a100a165697373756578396769746875622e636f6d2f696e7075742d6f75747075742d686b2f63617264616e6f2d6c65646765722d73706563732f70756c6c2f32303130800582a219ef64a40158207c76d90d83e9989d67a520dbe6f3817dd8afa84f5932e622238008253479a66d0258202a85741ebd1076759c4a14649b30cddf1abd9014062b6616d3ca90d7b93aba5003581de1e512e0225710f61b5cc54df075c02d8b8a56a9a50ae78f5cff08672b041a01e4f69519ef65a1015840720ab14d84aaa87369eadaf68898b794c65580742263ba36cb1b757a3e4e6aaff0ced6bd8247fddc4950e9c1bcf8bcbf7e66e3f8008ab70aa2b4ff8f741046078006a219ef64a401582069179a00a3a6aefad3e6821df68ccd916a93dddae8947eebcfab929484f51082025820c2cc2477d19a048c3aceb048cb1b0cd81f80abc328fc2386fb8d87041965d53503581de1e638092504459177f7ca7d69ff356f28abf49805b99265f14aebaebf041a01e4f69019ef65a101584072eb8b90a33fdc9693df74470c6e9a1b0eb3a09ae10d8e9184113e43d1b6b93c2b9732147f3062ef61b997d46a3dc760c8618b4e8fbb4ace04b46f20ce77e70f0782a100a165697373756578396769746875622e636f6d2f696e7075742d6f75747075742d686b2f63617264616e6f2d6c65646765722d73706563732f70756c6c2f32303130800882a219ef64a4015820ba5706b0c36a61eb0ddaad50360d879f8283592475598303b288515a5cfcf49d0258207a995be7ad4ad8e1d6b3c50022d9d55777daaf4c3d6046f2bc74fe63ff70597d03581de18603a5a749947b55e82c3ca023c427efed03380884e489835d5bed69041a01e4f69b19ef65a1015840853aa89563db088d1a8411bd6bb30800ab130396f74c2f230297db31e7d3fe510e690578c775652b30b57a328cd8a8115182792dbfa8eb592e0a72cbeaca500480")] + public async Task DeserializeAlonzoBlock(string cbor) + { + byte[] cborRaw = Convert.FromHexString(cbor); + + const int concurrencyLevel = 1; // Number of parallel tasks + const int iterationsPerTask = 1; // Number of deserializations per task + + IEnumerable tasks = [.. Enumerable.Range(0, concurrencyLevel).Select(_ => Task.Run(() => + { + for (int i = 0; i < iterationsPerTask; i++) + { + Block block = CborSerializer.Deserialize(cborRaw); + byte[] serialized = CborSerializer.Serialize(block); + string serializedHex = Convert.ToHexString(serialized); + Assert.NotNull(block); + } + }))]; + + // Await all tasks to complete; if any fail, the test will fail + await Task.WhenAll(tasks); + } + + [Theory] + // Conway + [InlineData("85828A1A0025AE551A0388C42158205D36A2CC65C7CF514D8621C4AC913DCFEF9139F3A84BD2F4C9ED853F96AA617B5820545FC09BD41A04EFD719877044DDD763CDE3335260D742F8CA8E835824F31D1258204290CF8B693CD83B04905CA77D79501881B3378186C6BB903B02A89F02555A0D8258406755D74A87F79960D2E181DCB52D1B8DDBA9BF28F6E03E3A7F6A25963393F043DC67A48F031C5BEC8A820441340B34394F632C4E58BE842E8B6EFD7BB43AC6B25850BB794CA51C048D909A5A0F03CB0070F9720B85BA24475307F9217CC363C55753237D148250646E1D6784B0B4A5D4CBD11DDA955130FD62EA6E21E75BD69EC3EEBF5B391B5B18301BEE623722BF0579031909455820A14FE193CDBBCDC9FEDC8F7AAA7CD4611F874B9EED58A5A853B084762FDC3B1D845820A039801147356A3B00EC43BEC3F1682C03E5D89E4572F266CEDBF31A0D7E2F58071901AC584008C0BC13C61BBCB410C428E5DFF312C08D477A9928F4D367C8B1C146CE6A6DBF2C479E132D3B6E79A4CB879EB20F03644A2E646BF636FD7AC76BD4B853CC8A058209015901C0A71890FC274689E181319FF56CB3FDCF2385EF05101F1649ACA68BF145B53C0CD6F77C4357DE04825A46232AF9B274BA019F591B7A80DB8E32BA0B64F917D903DDCADFBEA4B927B6814440A6BC5617B2F9154844FE4CF70CBC227950C794FB6BBF1DB8CACE541CA2C8162E30C39E5327AB3C48C79ED7C9EBA010E7A26EC4E71789D2A7772B54090A3EC4AEBB450F2822DA9F054D6FDD5E10898FFA545C6574282D29660EF785A3EA814691B91FA48FEEB70FA60AAF3DB136CFDE0E4B4742EB1FC81EEEE31D65B57534553A05F7979E6F136F931C96CAD44476EF3147CA9564DFE9C52B5895D21864B21252A47F7BC2530F0C2F1095BF67E41E41A0566AB65945E2485186450660C78D6A734F410DCAFFC4DE2203122B2993F1B31B1640739B994106647C80ACB7D2BCE18E9C0D8F83AB93E243E568EAAB87D235DBD88F3DABA50C24B7335B64CC9C70341F324A0F403459DCC2A7EC05A39A84CC455631FE2C6C13ED54133AD332E3FC0900A71AD9F038FA9EE1E81344ADD9BA9931C795CDD4E53958E8A49E17FB639ECC00992425C2356BE13AFD176902151D0A59B6AA03D583A75E3B8280DB4B52C4851E35260DD5320BFAB5ADDD4F7B382D736E48A374A27682AC0086825820B10A2A5454D9F3DF0A0E8BCC8145F2BFC3D8647C169C63CD7DEACA756360D35F00825820B98B1E681CE1AC9F67E0396C15EB67EBCF9D7C267353599A048C0D385F72A21D00825820B98B1E681CE1AC9F67E0396C15EB67EBCF9D7C267353599A048C0D385F72A21D02825820B98B1E681CE1AC9F67E0396C15EB67EBCF9D7C267353599A048C0D385F72A21D03825820B98B1E681CE1AC9F67E0396C15EB67EBCF9D7C267353599A048C0D385F72A21D04825820B98B1E681CE1AC9F67E0396C15EB67EBCF9D7C267353599A048C0D385F72A21D050182A300581D7077898471D1A56F64CD6FD110E081C1F91B92CC1484F2480AFB48190A01821B000000DB284CF8C5A2581CAF829F4472C3728307007831FA000E450883CFCA4893D9EF535E8786A14004581CB6525F0993875DB27B0A1C780F0E0F1678ACED0DE6CAF0D241B61E87A14001028201D818479F0000000000FF82583900F97CCF4FE384174E63F2250A3C4A61F851112ED0B93CAEB6AA84308E95D8FECA512588E1A954EE5A8AE2BEFF32EA360590BE694B5065D8581B0000000940F2F7FA021A0006865D031A0388C500075820D36A2619A672494604E11BB447CBCF5231E9F2BA25C2169177EDC941BD50AD6C081A0388C3D40B5820CB52347F5003DD50D646124C48807B6BFD277A4ADA0E4A2F04CF24F1CF95193B0D81825820B10A2A5454D9F3DF0A0E8BCC8145F2BFC3D8647C169C63CD7DEACA756360D35F000F001082583900F97CCF4FE384174E63F2250A3C4A61F851112ED0B93CAEB6AA84308E95D8FECA512588E1A954EE5A8AE2BEFF32EA360590BE694B5065D8581B0000000940AD3317111A004C4B4012848258202C4D0BB6309E34F44FA28846CC89CEA762EAC9D2CBB2377E04A8CFF8EBE6319300825820B98B1E681CE1AC9F67E0396C15EB67EBCF9D7C267353599A048C0D385F72A21D01825820CCF53FDCEC75C228401EEC309DD877EA115736CCA7BFD99A6242B1E69BA2928F00825820DC5E36EA57DC042A990562A3A30E1A8AC1FDC86B775BB0A60E2321CBFEFA24CA00AD00818258201DD33FBBFA57094C6D110AF56C6AFF7FEA496DFDC4A07377FB378421BD34EF34010182A30058391008BDD73C5FA824860C0190F5165D04A54DEAC6A5ECA670A8D9BAA4800ACBF9E8A3E38520C208D2FA3A34AC0F25895BBF42C8FBFDEE25C76701821A11E1A300A1581CCCB3B38323F49A9CF26786910363ECB0ED2188BC366BA2FB19F3A2CBA14001028201D818583AD87A9FD8799F581CFE6C4B876CD886C5D745653A74693BAB1B88CB155660CD9E860E900340FF44555344621A001E84801B00000191DAACFE00FF82583900FE6C4B876CD886C5D745653A74693BAB1B88CB155660CD9E860E90030ACBF9E8A3E38520C208D2FA3A34AC0F25895BBF42C8FBFDEE25C767821AF85C37C4A1581CCCB3B38323F49A9CF26786910363ECB0ED2188BC366BA2FB19F3A2CBA144555344621A001E8480021A000F4240031A0388C4B005A3581DF069F53D2FD6162B13276616A5906D2171BA47D35A55E9F1ED43034D0B00581DF0B39623ECA85BB2DD04D6178002B4EA86E5155A7222BA3D4B0D473F2C00581DF0F80DDFD36F4BED1C4CD217ECC03B48B7F334BC677D37CD2AD4B2130C00081A0388C3C009A1581CCCB3B38323F49A9CF26786910363ECB0ED2188BC366BA2FB19F3A2CBA2400144555344621A001E84800B58209CF391C9990D9E6739E94417C0DD556CD1CEEC56DAA0C460A64F40147949EEB90D818258201DD33FBBFA57094C6D110AF56C6AFF7FEA496DFDC4A07377FB378421BD34EF34010E81581CFE6C4B876CD886C5D745653A74693BAB1B88CB155660CD9E860E90031082583900FE6C4B876CD886C5D745653A74693BAB1B88CB155660CD9E860E90030ACBF9E8A3E38520C208D2FA3A34AC0F25895BBF42C8FBFDEE25C7671B000000010A3639A4111A0016E36012868258201DD33FBBFA57094C6D110AF56C6AFF7FEA496DFDC4A07377FB378421BD34EF34008258206A6702530FD240D59C8C5C5A9D1C1B27EB97E8BB3306237C31EC872A9E7E44E800825820D4881363D26D9A2A4151F28DE2758AD2D178E21E7BDA08D5ACE2BED7A28E957800825820899827FF697464CDA2C4EC9E1728F55BA3E05EECCDA7B26468A58B981D47F4D8008258205211C14C17F004A208F339F8842D76259E4D22090961709057F166B0D3E65C380082582006B612A91EB2404E00B33887A9172A8DFBF4D65A68F62F3048705069BB1B047D0082A200828258206E290CA92C2484C00955ECF4F6C2E539E2223365872A2018BA1CF761AA3683C85840366702170926F94A51E449E4727A55670F47EADF39B7CDD7C977B894665DC5AD1FECD30FEA2AB439499A19C3164B9B501F40AD66AE409A1C9D05BCD4DDD1A008825820F682256DD3AC458ED70642847BC830DE8B7C4871A4DEE7D2AF1FE4EC72D5AC5E5840DD500D3D2B6AA3C00307230F9581E752709E7D69A7E0DA9E23157B55D426AEE7A9C094A9A8BAB9E1DD75FA8020C869D5602645ADAA1F74E77D60D9F9746317030585840001D87980821A000B47C41A10D440C5840003D87980821A0001754E1A01C2DB0D840002D87980821A0001754E1A01C2DB0D840004D87980821A0001754E1A01C2DB0D840005D87980821A0001754E1A01C2DB0DA20081825820CCD6976C1E7A98C6CEEA2770C5757F5F62BE558DF9170BD85AD31E911B563F145840FC09E6B32D896990C5E2EAF4DAE5FD070ECB2085EE96D544B9EA8C5B60405FC3A21FCD3221FB7C60A5BF0B9FE15AFA091AB4D2FCEDF75FF7DDCAF76421B0410F058484010000821960B61A0093804A8403019FD8799FD8799F9FC24C0AFD35CBEC1F0EB61C6A5B4DC24C0CEFB03531E283A5DF051C66C24C067D7F114BF03905256C13A9C24C0E4A467359993326D19A78FBC24B76D585C1A093723F32404EC24D598DE7F123CC80BA2DBE2FBD40FF4455534462C24C204FCE5E3E25026110000000D8799FD8799FD87A9F1B00000191DAACEA81FFD87A80FFD8799FD87A9F1B00000191DAB17E61FFD87980FFFFFF58404F33E732ADCB80A24B323BD160054CE8CF33641E2DF1AFBA2BFCE109CB8C143745880CA239B1DFB6A0C86241DC36A3E0199071F11A53267FB7836AB0DEDEB103FFFF8219B3281A09901770840300D8799FD8799F58206A6702530FD240D59C8C5C5A9D1C1B27EB97E8BB3306237C31EC872A9E7E44E8FF00FF821A00022BA21A03AE0FA6840302D8799F809F01FFFF821A0018D74E1A1D971D76A100A080")] + public async Task DeserializeConwayBlock(string cbor) + { + byte[] cborRaw = Convert.FromHexString(cbor); + + const int concurrencyLevel = 1; // Number of parallel tasks + const int iterationsPerTask = 2; // Number of deserializations per task + + IEnumerable tasks = [.. Enumerable.Range(0, concurrencyLevel).Select(_ => Task.Run(() => + { + for (int i = 0; i < iterationsPerTask; i++) + { + Block block = ConwayBlock.Read(cborRaw); + byte[] serialized = CborSerializer.Serialize(block); + string serializedHex = Convert.ToHexString(serialized); + Assert.NotNull(block); + } + }))]; + + // Await all tasks to complete; if any fail, the test will fail + await Task.WhenAll(tasks); + } + + [Theory] + // Conway + [InlineData("84828F1A0057D7E81A01CD568058205F484B951F012ED53FDB9E30DA0660902354C705F112745BF3B19EC31BC9BB005820E1806A6AF0EB0931EBDF8B766229CF9323F2252573AA6C6998DD1522FFDFBCC858204A20392BB23CEF3777DC1E9FA9B0719EC829B4B87C9E4295141DFB7C6783C3108258408C6059B6952E68EDCD6431F6EDB191705D29CDF82F8A9B855CEE856C8B33DF96B2F567107B4637F6E1FECA3585C9CB1066088BB8496DEA4260C344E2595C997B58508E39D072957817E7D89C19F78E2BB288553E215E81E435D88CE5B3869D10923982E8253112948035D7697762FBF555005D7682E3D5FDB09FE3EDBBDF65CE72514490882CBC89DD5F0A6CFB205EE52408825840000030ED0D10485C31937741CAB13B3D0C247BF9FF8155BF649C6FB314C40788C68F71E5064920C4964893225A77F8EFE65C19C0110DA27DAD4B72582880748F58500272D91E01C1C6C43C51FD1B1651ACD45ECB841BB2762C569C15E90B65D2515F669538C4F41C19CE20B01BB61D685A2B102124525D2F385A8B04283EEFF3C80017D430A075790DFAE7BA3BF1F3C1A90B192E515820A82D45674A1274786D8B9534F9F1F5887D4CB5103EF76E2D8E60ABBB9E2BE02D5820ED46BC0F963545DEBD5FDC3379D01C1EA7922685A4B823CB4DE51FFC63358B140418E0584052DE2D342719F78585E2B0A6959EB54E1D14385A0B04DAC45CA8AAE062094E7DFFD18AB533C0314779C91474A28D47A57FE085290EC2E422953860764CED0C0304005901C005B77FFDF89651681B6DFF5B1F54AE9824D589FE38DE8B9E0CFBA98B1002AC3013ED3B53EE39910C3AD7226A2D438F35D29B7BF4C8215DD379B9187E6622880A197DF65334198B5B195DC470550CD84D466F08E5B4ACA7B9F06CE4A748DB9C1DA29AF843ED989D7E814E2B778E3B713E5C6E7323531D1782AC3D01BE00B19EC65314E3015D71812389883C1B4C49064E20C3DFFF2745D028A7C336E21E4EEDBF73D048B86F7DF61B3DC2FA412F4BFA21C47CB4485DD1C432FDF562B31604DD3C4FD94F062C6269F74AC840A7A0F66539F84D0FA83520A78FD66779936B8B10C05FA29E3551D554696A95E6F62C240EDDD4CCDDD5E06E8C3876B100D94BA3217BD191B8D3BBD381DCD100E1BDF69D8F48CD3D9004FBC3B22E44546DAC068ACF85B04B6571155D469CEC8E9745D2E4A6F63E6982E65C4DB0F36B95CAF815FE535A45ABA199F9CDBD9A2BE400A49A0A4951EF4E8B423D920964BFB571B2C112F1FA66535424C4EA8CAF91791D4FDBEBA7309013826041C4EAA0FB8C958B0FE39B94353D81A6F788A90B9661770A168A713BF604EEAE769249E22298B86A6AFA27FA3104C1E27F1BBB914483A0686BBF24862F77A5E5B04E22F1D499A8883128FD6686A400818258204965D8B3C4824C86DD438840AC1A6C4D6FD2C1B6C0B58A2C14A845956D60FC4A01018282583901150E57FAE6104A97667E71EE10C3F55DF30ADD6B9C6D9B6189637681A51A1F56EB82FE568B7D57366BA2C8BA379889DD648220334812BCB61A0602410682583901E55D850D4DC5E611B740A5F61F836FB777E496A7A65ABDB3779D9017E28C1958BD7614D1C1A32FE155A47FF88CE2C0889A04E61983AF01831B00000015486ACC6C021A00029361031A01CD729DA40081825820F2CFE413FCC190C6A7424E542430572B0556AB71D16DEBDCA9A711AF1F0285F301018282584C82D818584283581CA74249849532514E2B1CECB943DF5CFA5919B0A8E2D7A1B9E0AB53C1A101581E581C12F1DAE7310D0837C2AD675B952BF5EA75B37FA7F258DEDA6C1301F6001AA4BC56581B000000012A059C1082582B82D818582183581C8E1238576C088D5088017715A77B8903B57EB282289B3F5D0A6C483AA0001A99CC1C161B000000043DAB7E7D021A0002A544031A01CD6451A4008282582095F34F20F95E4E97BB1695C0DE4FF9123FBAABF5BEA3199785DADAC4D40D4CE30182582038F022E851DC49640541D938383A5F63A5CD88B30DAECB651509953E70935CDD01018282582B82D818582183581C4CE47F03FFEA34A3D3316CDDC715ACCE37FEA271FD5079FDB5769543A0001AF669DF521A0119FA4C82581D616904E8B2C26F3DDA6C4A5DB4B3EC9E31D581C9960977CFE9C6917A431A001426BA021A0002BF35031A01CD5709A6008382582000E56B08DE6A647B6F6155EF64A1BC253C532735CBB54FF0F585AAC3A3CC17A0008258205B14E7ECFF7B6AAD407570397359EB4DA84E298285728267C475463A1B0345DD01825820F4D06B5DA11EC1BDF57A72CAA8C3A1DDD5DE3727F9011FB6924C44CD4BA2CC450101828258390148D9F60950CEC0B5F5BA4CA2A305F8D16F23BFB1D2B780FDB199B3F9CBE310A3070E37D57355E49F94E21A4F659C1AD8C9996DD410F4AE1C821A007270E0A1581C2F633081F8B95C9A0160FCAFC2FF18F2676634633CCC9DDD0A7CB25DBF494C464331306F66323501494C464331316F66323501494C464331326F66323501494C464331336F66323501494C464331346F66323501494C464331356F66323501494C464331366F66323501494C464331376F66323501494C464331386F66323501494C464331396F66323501484C4643316F66323501494C464332306F66323501494C464332316F66323501494C464332326F66323501494C464332336F66323501494C464332346F66323501494C464332356F66323501484C4643326F66323501484C4643336F66323501484C4643346F66323501484C4643356F66323501484C4643366F66323501484C4643376F66323501484C4643386F66323501484C4643396F66323501534C6F7665466F7243727970746F31306F66323501534C6F7665466F7243727970746F31316F66323501534C6F7665466F7243727970746F31326F66323501534C6F7665466F7243727970746F31336F66323501534C6F7665466F7243727970746F31346F66323501534C6F7665466F7243727970746F31356F66323501534C6F7665466F7243727970746F31366F66323501534C6F7665466F7243727970746F31376F66323501534C6F7665466F7243727970746F31386F66323501534C6F7665466F7243727970746F31396F66323501524C6F7665466F7243727970746F316F66323501534C6F7665466F7243727970746F32306F66323501534C6F7665466F7243727970746F32316F66323501534C6F7665466F7243727970746F32326F66323501534C6F7665466F7243727970746F32336F66323501534C6F7665466F7243727970746F32346F66323501534C6F7665466F7243727970746F32356F66323501524C6F7665466F7243727970746F326F66323501524C6F7665466F7243727970746F336F66323501524C6F7665466F7243727970746F346F66323501524C6F7665466F7243727970746F356F66323501524C6F7665466F7243727970746F366F66323501524C6F7665466F7243727970746F376F66323501524C6F7665466F7243727970746F386F66323501524C6F7665466F7243727970746F396F66323501FF82581D610CF2D472123546C1D59E974DA3DC0662B3233990EBC212EEA91F2EBE1A008192FB021A0009339D031A01CD56E1075820FA0A2DB8B6D6E5D62D2CBBE16C7D6BD3899138F769C10EBD671654910E8A27C909A1581C2F633081F8B95C9A0160FCAFC2FF18F2676634633CCC9DDD0A7CB25DBF494C464331306F66323501494C464331316F66323501494C464331326F66323501494C464331336F66323501494C464331346F66323501494C464331356F66323501494C464331366F66323501494C464331376F66323501494C464331386F66323501494C464331396F66323501484C4643316F66323501494C464332306F66323501494C464332316F66323501494C464332326F66323501494C464332336F66323501494C464332346F66323501494C464332356F66323501484C4643326F66323501484C4643336F66323501484C4643346F66323501484C4643356F66323501484C4643366F66323501484C4643376F66323501484C4643386F66323501484C4643396F66323501534C6F7665466F7243727970746F31306F66323501534C6F7665466F7243727970746F31316F66323501534C6F7665466F7243727970746F31326F66323501534C6F7665466F7243727970746F31336F66323501534C6F7665466F7243727970746F31346F66323501534C6F7665466F7243727970746F31356F66323501534C6F7665466F7243727970746F31366F66323501534C6F7665466F7243727970746F31376F66323501534C6F7665466F7243727970746F31386F66323501534C6F7665466F7243727970746F31396F66323501524C6F7665466F7243727970746F316F66323501534C6F7665466F7243727970746F32306F66323501534C6F7665466F7243727970746F32316F66323501534C6F7665466F7243727970746F32326F66323501534C6F7665466F7243727970746F32336F66323501534C6F7665466F7243727970746F32346F66323501534C6F7665466F7243727970746F32356F66323501524C6F7665466F7243727970746F326F66323501524C6F7665466F7243727970746F336F66323501524C6F7665466F7243727970746F346F66323501524C6F7665466F7243727970746F356F66323501524C6F7665466F7243727970746F366F66323501524C6F7665466F7243727970746F376F66323501524C6F7665466F7243727970746F386F66323501524C6F7665466F7243727970746F396F66323501FFA400838258206AFC8C499DA5C42C53EA442A8051B3081031F171EEEA4432991506381E2D8EB800825820D3AEFFEA2371A3EF2F195F40246FA89E20C6E349AB24B715E38E0F51D0E7E63601825820ECC73F986B568B27A052A4C0790B44582FDD584744D86F43DC6AAA5F9686AC3601018282583901D9ED3E385682557B35884980DC1721FF24BC2DEA1E22A311831AFB5CE38B3FBA9B40FED456199D3775F4AFDDF380B146336AE517925C554C1B000000015AC7129382584C82D818584283581CA1030E3B880D76789EC6B808E209AE56E827A4F57462B8FEC6802527A101581E581C2B0B011BA3683D173E253C2AC6D394B5300A9CB53F650EAA06FC6E19001A15BF798E1B00000001FB31CA1D021A0002F1BD031A01CD7297A40081825820C6C4EB1417FF576769B8F3FF6CBE2996D4A5CDC4E4B45EC30EB4E7577ED1EE2400018282581D61894D3315AF10374E5D1438C9B4108DE597245B7BC681BFE67C7204731A002DC6C082583901D5311050FC69536704CE36EFC076B515C1CCF8A13BAA820D30FCA8D04B4F2B1786E68840B7AA1C71827992FFB04D7D9C197D2E5B6847F82E1A0316E87F021A00028C81031A01CD728C86A10081825820FDAF2F6EF24890889F502DE09ECDEC7C9F676AB206E87613486F56F9799D605E5840CC1D70B7ACF2CE7281C21FBDB6559C8C1327499A1C4A6E8CEBB7072615EBFE0E51A4BFC2795BF692F9B4388831475FD7F1E9BDBF895EFC9FE83D87AD6E89FA0BA10281845820F4BCA00671176355C1DBE65F0AFBB2BAAC60D4F4762563C53014528F53D4984758409E078F6E746C8C25BF71E322C6AE15C67B28B2E2361AA3B2AE215525697746D592386443F6690D5556A5A550785B001E0F88DD86558D41172FC976DBE1CCB50A582061D1E3D6F0036146FA182D137EBD354A1DC7347829CF5308E166838AF163DCED41A0A10081825820393B3D3CAB6BE0897CBC87143CC3A24825DC1D8249DF4D37969502931CF856FF584063AAC1C764BBEA7851086BB765006D0209B36C15465547777881201140363E81153A18A7740C43A3E5377C111DF6C4FB773CAA30E8E36F45B05B6E15ADE34507A20081825820FD23AF269D1C2FD6BC66414B0AD239D3C6A843736FAE547A3EAC84BFCE301DAB5840DF212C60FD973B40094791B3258ABD26941852FC58FF5AE5D93EAA4027E7E94024CF0F1B792B81BCDB4475558D263E625D5564931610F3244ADC533CF9CAE60801818201828200581C0CF2D472123546C1D59E974DA3DC0662B3233990EBC212EEA91F2EBE82051A01CE9FB8A10283845820372A30B3C7A74189AD37BD55D35CB23722F5796693D983418FFB651E7F6164B158404499F9B35646E7F0844745F06B230305C474BB8E62ED91AE81C0D608F6D6ADDA7819BE1924BDC3BF4877DC912D13301E53CF51B614ECACC79F740379CB39300C582085551602903BC9BB1E393C8F797916EE01AE73272D5F43AD03E0AEB949EA69E55822A101581E581C2B0B011BA3683D5E4F72362A1243BCB5295CD8B1A82DF9E0DD758EE3845820C8354629E05665F031B2D1C4DC939C875D6A8166105A0D1452AD18AE2ED2231D5840459AF05A287FFABBF7D357D58F960292AFD89E4A303BDF1C45490D9853EB8F829C99677557D271712C5B52D5B5D63822F4592FC59D6D111587F827589A9F6E045820292B6546849392C190F00BE1161430AAD58A7281CCDCB491EAEF2818F66D99635822A101581E581C2B0B011BA3683D33AC3B7C2AF8C6AF7FF97376ABA498597192928ABF845820E49A56A62860A3689AFEA7E2E7D9CDF15D40F4958ACF0F5E9220A5063A36C8FB58401EF3F6F373D5B6E34A3C1DCFEDC67B436EFE46F2B363318731F51BCEE65013EF9CF2EBEC16D4A15DEB4C5FF4F882241987C660B00ABD03BA99EE7E1F162CF60158201DB2FA3F78A86ECB6E3ACB6237CA09E8BCC11D39EAE9E41A54F3217DC8578F2D5822A101581E581C2B0B011BA3683D1C06C49F2A0FE17210E840E52FD4BB52A5BFC5667BA100818258205B1F1B34E11EA7676A23D2773EE79A3446C3D2D488C0F50CAB2C41B6535D3D955840A5161E51190D98CF6DF88D70C2C7C4749FAB9822D92B1FD282B7B0857788E6EE1FB4756643375E726E99F2AAE0BC5CEDCF83540902F762C7A1D1A7DC646E6007A10382A11902D1A278383266363333303831663862393563396130313630666361666332666631386632363736363334363333636363396464643061376362323564B832684C4643316F663235A3646E616D656B4C46432031206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643326F663235A3646E616D656B4C46432032206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643336F663235A3646E616D656B4C46432033206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643346F663235A3646E616D656B4C46432034206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643356F663235A3646E616D656B4C46432035206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643366F663235A3646E616D656B4C46432036206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643376F663235A3646E616D656B4C46432037206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643386F663235A3646E616D656B4C46432038206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F684C4643396F663235A3646E616D656B4C46432039206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331306F663235A3646E616D656C4C4643203130206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331316F663235A3646E616D656C4C4643203131206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331326F663235A3646E616D656C4C4643203132206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331336F663235A3646E616D656C4C4643203133206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331346F663235A3646E616D656C4C4643203134206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331356F663235A3646E616D656C4C4643203135206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331366F663235A3646E616D656C4C4643203136206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331376F663235A3646E616D656C4C4643203137206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331386F663235A3646E616D656C4C4643203138206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464331396F663235A3646E616D656C4C4643203139206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332306F663235A3646E616D656C4C4643203230206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332316F663235A3646E616D656C4C4643203231206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332326F663235A3646E616D656C4C4643203232206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332336F663235A3646E616D656C4C4643203233206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332346F663235A3646E616D656C4C4643203234206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F694C464332356F663235A3646E616D656C4C4643203235206F6620323565696D6167657835697066733A2F2F516D5A477A5A39793967576D53356D616D33324771694373475066473134436332357745464A477A59506F656A4569617277656176654964782B4C5530746D516758744843737A3778733661477432507A3768477A58774A70314739386B75515A6C72306F724C6F7665466F7243727970746F316F663235A3646E616D65754C6F7665466F7243727970746F2031206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F326F663235A3646E616D65754C6F7665466F7243727970746F2032206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F336F663235A3646E616D65754C6F7665466F7243727970746F2033206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F346F663235A3646E616D65754C6F7665466F7243727970746F2034206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F356F663235A3646E616D65754C6F7665466F7243727970746F2035206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F366F663235A3646E616D65754C6F7665466F7243727970746F2036206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F376F663235A3646E616D65754C6F7665466F7243727970746F2037206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F386F663235A3646E616D65754C6F7665466F7243727970746F2038206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F396F663235A3646E616D65754C6F7665466F7243727970746F2039206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31306F663235A3646E616D65764C6F7665466F7243727970746F203130206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31316F663235A3646E616D65764C6F7665466F7243727970746F203131206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31326F663235A3646E616D65764C6F7665466F7243727970746F203132206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31336F663235A3646E616D65764C6F7665466F7243727970746F203133206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31346F663235A3646E616D65764C6F7665466F7243727970746F203134206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31356F663235A3646E616D65764C6F7665466F7243727970746F203135206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31366F663235A3646E616D65764C6F7665466F7243727970746F203136206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31376F663235A3646E616D65764C6F7665466F7243727970746F203137206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31386F663235A3646E616D65764C6F7665466F7243727970746F203138206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F31396F663235A3646E616D65764C6F7665466F7243727970746F203139206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32306F663235A3646E616D65764C6F7665466F7243727970746F203230206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32316F663235A3646E616D65764C6F7665466F7243727970746F203231206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32326F663235A3646E616D65764C6F7665466F7243727970746F203232206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32336F663235A3646E616D65764C6F7665466F7243727970746F203233206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734734C6F7665466F7243727970746F32346F663235A3646E616D65764C6F7665466F7243727970746F203234206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A717535363866567734724C6F7665466F7243727970746F316F663235A3646E616D65764C6F7665466F7243727970746F203235206F6620323565696D6167657835697066733A2F2F516D57645A764872584366314A6B525566724E3569414B6A32674534627A58657171666D48436451356F424C376769617277656176654964782B72314E6849674A33623942683259663752747254314233383569744C5A487649357A7175353638665677346A706F6C6963794C696E6B7835697066733A2F2F516D61774A655957577176675439515876754D476858394E76683552745933316E4C674A7646445A57314C74517780")] + public async Task DeserializeAlonzoWithDuplicateKey(string cbor) + { + byte[] cborRaw = Convert.FromHexString(cbor); + + const int concurrencyLevel = 1; // Number of parallel tasks + const int iterationsPerTask = 1; // Number of deserializations per task + + IEnumerable tasks = [.. Enumerable.Range(0, concurrencyLevel).Select(_ => Task.Run(() => + { + for (int i = 0; i < iterationsPerTask; i++) + { + Block block = CborSerializer.Deserialize(cborRaw); + byte[] serialized = CborSerializer.Serialize(block); + string serializedHex = Convert.ToHexString(serialized); + Assert.NotNull(block); + } + }))]; + + // Await all tasks to complete; if any fail, the test will fail + await Task.WhenAll(tasks); + } +} + +// [Theory] +// // Conway +// [InlineData("820785828A1A002D34C71A04563448582025FAE387A21887B140E3E8F6D52116837E06E588640805088B15AB307AA3F85A5820BE5501BDA6376FBE9952E2E4AFAF3F7726C82D45FEBD3E359240F91D3558713E58205606C6FCF1CD2874FC7A7792CB20C50F60CB634821AC2BDE34E215527B7FC3518258407B734B5F5313EF6FA62F75519BF3FB4E8C1C7AABA74371F55C9C74047B2FDD5D258038C090E351422076C71674E594B889B6052D9F22AB62A0A5FA25364142355850647395C521E6549B810DA6F21DDB37392F0C65D1410A3F1CBF7F7A79A64821329C110D868DDC553708FA9146AD0BEBD81E3C83D8F9DE5081BF55A5290147B5A5E19624E95451BDD04217B748A5AAAE0604582029571D16F081709B3C48651860077BEBF9340ABB3FC7133443C54F1F5A5EDCF18458206639753EE5E1717AD8B41A0234B8CF87D6452FCABE2EF989A2442ED0A5CC4AA3061901FC5840C0FF15AABA20D8DDEFA00EEC010D12BE728EE9C11068F245BDA7B40D449E7E85E8E67D0D3B0D63071321BE3E551F3B9F414E2974E8A40B896F9AA04BFBDC4A0A820A025901C0BA463AA894438450B3DA9C5D3D1C54753E8B1D93A735AF7EAD983E3EB98626441BAE2BFF55F794596EC342302EEBC2026A4CDD6C76CC6C55BA735BF04F26B603CB80BED294C6F5EB707FA945628ECD175CADFA11586281307DE618ACD0661EE88623165FEE60C0FF6C9EA8321B1C2BDA6AA273689CC40BB52C2969A6D4C4F1BFBF36EEE18B0783863E61833B01F0A49BEF441087F895A53E6895B8AFD6F0BB2492C2D7ADC28DFACD0D802F33861E1A7174938CE3720325F5E192375BB5851D4253351AF5595B4FCB63F4D82115257C30FCA40CC0905AD063E98985CD70CD6FF896AC42D0F30349655028A5371709AF1EEF6248EDA6C7F034CB840092C79C2F50C00D9777CE1D2B43AAD1CD84FF8BE31BFA0D1B8026EAD61E1981B5D9D3395A57DC2F9D3668EDD9400EF774B9E620B0F64F7D566C210B912BBBB29E1F3978E4F550D491EA45C559C9E4BB8B6C2D44C67BC7714A55C9C72AEF04F3EED2BFF7581A013FD4D5AFD9A079450C83F77583E3DD5F383A5A28975F87EA50AF2A9655EF46BCF263C865094A66B7A33F1B0357734D5C31DA3C091484B8876850BB590DB3DFACF50B5E0F9380DCF1C186F975969CE82690BA3E8C862CB8148350B3A34667218080A080")] +// public async Task DeserializeBlockWithEra(string cbor) +// { +// byte[] cborRaw = Convert.FromHexString(cbor); + +// const int concurrencyLevel = 1; // Number of parallel tasks +// const int iterationsPerTask = 1; // Number of deserializations per task + +// IEnumerable tasks = [.. Enumerable.Range(0, concurrencyLevel).Select(_ => Task.Run(() => +// { +// for (int i = 0; i < iterationsPerTask; i++) +// { +// BlockWithEra block = CborSerializer.Deserialize>(cborRaw); +// Assert.NotNull(block); +// } +// }))]; + +// // Await all tasks to complete; if any fail, the test will fail +// await Task.WhenAll(tasks); +// } +// } \ No newline at end of file diff --git a/src/Chrysalis.Test/Chrysalis.Test.csproj b/src/Chrysalis.Cbor.Test/Chrysalis.Test.csproj similarity index 50% rename from src/Chrysalis.Test/Chrysalis.Test.csproj rename to src/Chrysalis.Cbor.Test/Chrysalis.Test.csproj index 3534efc1..6cd28db6 100644 --- a/src/Chrysalis.Test/Chrysalis.Test.csproj +++ b/src/Chrysalis.Cbor.Test/Chrysalis.Test.csproj @@ -1,29 +1,38 @@ - - - - net8.0 - enable - enable - - false - true - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - + + + + net9.0 + enable + enable + + false + true + + - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + \ No newline at end of file diff --git a/src/Chrysalis.Cbor.Test/ModuleInitializer.cs b/src/Chrysalis.Cbor.Test/ModuleInitializer.cs new file mode 100644 index 00000000..911f0d0c --- /dev/null +++ b/src/Chrysalis.Cbor.Test/ModuleInitializer.cs @@ -0,0 +1,13 @@ +using System.Runtime.CompilerServices; +using VerifyTests; + +namespace Chrysalis.Test; + +public static class ModuleInitializer +{ + [ModuleInitializer] + public static void Init() + { + VerifySourceGenerators.Initialize(); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/AuxiliaryDataSet.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/AuxiliaryDataSet.cs new file mode 100644 index 00000000..0e68eb3e --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/AuxiliaryDataSet.cs @@ -0,0 +1,8 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block; + +[CborSerializable] +public partial record AuxiliaryDataSet(Dictionary Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Block.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Block.cs new file mode 100644 index 00000000..233cb557 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Block.cs @@ -0,0 +1,43 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Header; +using Chrysalis.Cbor.Types.Custom; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; +using Chrysalis.Cbor.Serialization; + +namespace Chrysalis.Cbor.Cardano.Types.Block; + +[CborSerializable] +[CborUnion] +public abstract partial record Block : CborBase { } + +[CborSerializable] +[CborList] +public partial record AlonzoCompatibleBlock( +[CborOrder(0)] BlockHeader Header, +[CborOrder(1)] CborMaybeIndefList TransactionBodies, +[CborOrder(2)] CborMaybeIndefList TransactionWitnessSets, +[CborOrder(3)] AuxiliaryDataSet AuxiliaryDataSet, +[CborOrder(4)] CborMaybeIndefList? InvalidTransactions +) : Block, ICborPreserveRaw; + +[CborSerializable] +[CborList] +public partial record BabbageBlock( + [CborOrder(0)] BlockHeader Header, + [CborOrder(1)] CborMaybeIndefList TransactionBodies, + [CborOrder(2)] CborMaybeIndefList TransactionWitnessSets, + [CborOrder(3)] AuxiliaryDataSet AuxiliaryDataSet, + [CborOrder(4)] CborMaybeIndefList? InvalidTransactions +) : Block, ICborPreserveRaw; + +[CborSerializable] +[CborList] +public partial record ConwayBlock( + [CborOrder(0)] BlockHeader Header, + [CborOrder(1)] CborMaybeIndefList TransactionBodies, + [CborOrder(2)] CborMaybeIndefList TransactionWitnessSets, + [CborOrder(3)] AuxiliaryDataSet AuxiliaryDataSet, + [CborOrder(4)] CborMaybeIndefList? InvalidTransactions +) : Block, ICborPreserveRaw; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/BlockWithEra.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/BlockWithEra.cs new file mode 100644 index 00000000..db0312f2 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/BlockWithEra.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block; + +[CborSerializable] +[CborList] +public partial record BlockWithEra( + [CborOrder(0)] int EraNumber, + [CborOrder(1)] Block Block +) : CborBase, ICborPreserveRaw; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/HeaderBody.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/HeaderBody.cs new file mode 100644 index 00000000..e79c54e0 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/HeaderBody.cs @@ -0,0 +1,47 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Header.Body; + +[CborSerializable] +[CborUnion] +public abstract partial record BlockHeaderBody : CborBase, ICborPreserveRaw +{ +} + +[CborSerializable] +[CborList] +public partial record AlonzoHeaderBody( + [CborOrder(0)] ulong BlockNumber, + [CborOrder(1)] ulong Slot, + [CborOrder(2)][CborNullable] byte[] PrevHash, + [CborOrder(3)] byte[] IssuerVKey, + [CborOrder(4)] byte[] VrfVKey, + [CborOrder(5)] VrfCert NonceVrf, + [CborOrder(6)] VrfCert LeaderVrf, + [CborOrder(7)] ulong BlockBodySize, + [CborOrder(8)] byte[] BlockBodyHash, + [CborOrder(9)] byte[] HotVKey, + [CborOrder(10)] ulong OperationalCertSequenceNumber, + [CborOrder(11)] ulong OperationalCertKesPeriod, + [CborOrder(12)] byte[] OperationalCertSigma, + [CborOrder(13)] ulong ProtocolMajor, + [CborOrder(14)] ulong ProtocolMinor + ) : BlockHeaderBody; + +[CborSerializable] +[CborList] +public partial record BabbageHeaderBody( + [CborOrder(0)] ulong BlockNumber, + [CborOrder(1)] ulong Slot, + [CborOrder(2)][CborNullable] byte[] PrevHash, + [CborOrder(3)] byte[] IssuerVKey, + [CborOrder(4)] byte[] VrfVKey, + [CborOrder(5)] VrfCert VrfResult, + [CborOrder(6)] ulong BlockBodySize, + [CborOrder(7)] byte[] BlockBodyHash, + [CborOrder(8)] OperationalCert OperationalCert, + [CborOrder(9)] ProtocolVersion ProtocolVersion +) : BlockHeaderBody; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/OperationalCert.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/OperationalCert.cs new file mode 100644 index 00000000..f3856f08 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/OperationalCert.cs @@ -0,0 +1,14 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Header.Body; + +[CborSerializable] +[CborList] +public partial record OperationalCert( + [CborOrder(0)] byte[] HotVKey, + [CborOrder(1)] ulong SequenceNumber, + [CborOrder(2)] ulong KesPeriod, + [CborOrder(3)] byte[] Sigma +) : CborBase; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/ProtocolVersion.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/ProtocolVersion.cs new file mode 100644 index 00000000..fecd6f39 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/ProtocolVersion.cs @@ -0,0 +1,11 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Header.Body; + +[CborSerializable] +[CborList] +public partial record ProtocolVersion( + [CborOrder(0)] int MajorProtocolVersion, + [CborOrder(1)] ulong SequenceNumber +) : CborBase; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/VrfCert.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/VrfCert.cs new file mode 100644 index 00000000..127cb1f8 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Body/VrfCert.cs @@ -0,0 +1,11 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Header.Body; + +[CborSerializable] +[CborList] +public partial record VrfCert( + [CborOrder(0)] byte[] Proof, + [CborOrder(1)] byte[] Output +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Header.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Header.cs new file mode 100644 index 00000000..4581df86 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Header/Header.cs @@ -0,0 +1,13 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Header.Body; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Serialization; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Header; + +[CborSerializable] +[CborList] +public partial record BlockHeader( + [CborOrder(0)] BlockHeaderBody HeaderBody, + [CborOrder(1)] byte[] BodySignature +) : CborBase, ICborPreserveRaw; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Anchor.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Anchor.cs new file mode 100644 index 00000000..2f874e78 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Anchor.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction; + +[CborSerializable] +[CborList] +public partial record Anchor( + [CborOrder(0)] string AnchorUrl, + [CborOrder(1)] byte[] AnchorDataHash +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/Certificate.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/Certificate.cs new file mode 100644 index 00000000..ff2a1c2f --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/Certificate.cs @@ -0,0 +1,197 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.ProposalProcedures; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; +using Chrysalis.Cbor.Types.Custom; +using Chrysalis.Cbor.Types.Primitives; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.Certificates; + +[CborSerializable] +[CborUnion] +public abstract partial record Certificate : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record StakeRegistration( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record StakeDeregistration( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record StakeDelegation( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] byte[] PoolKeyHash +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record PoolRegistration( + [CborOrder(0)] int Tag, + [CborOrder(1)] byte[] Operator, + [CborOrder(2)] byte[] VrfKeyHash, + [CborOrder(3)] ulong Pledge, + [CborOrder(4)] ulong Cost, + [CborOrder(5)] CborRationalNumber Margin, + [CborOrder(6)] RewardAccount RewardAccount, + [CborOrder(7)] CborMaybeIndefList PoolOwners, + [CborOrder(8)] CborMaybeIndefList Relay, + [CborOrder(9)][CborNullable] PoolMetadata? PoolMetadata +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record PoolRetirement( + [CborOrder(0)] int Tag, + [CborOrder(1)] byte[] PoolKeyHash, + [CborOrder(2)] ulong EpochNo +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record RegCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] ulong Coin +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record UnRegCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] ulong Coin +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record VoteDelegCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] DRep DRep +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record StakeVoteDelegCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] byte[] PoolKeyHash, + [CborOrder(3)] DRep DRep +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record StakeRegDelegCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] byte[] PoolKeyHash, + [CborOrder(3)] ulong Coin +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record VoteRegDelegCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] DRep DRep, + [CborOrder(3)] ulong Coin +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record StakeVoteRegDelegCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential StakeCredential, + [CborOrder(2)] byte[] PoolKeyHash, + [CborOrder(3)] DRep Drep, + [CborOrder(4)] ulong Coin +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record AuthCommitteeHotCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential CommitteeColdCredential, + [CborOrder(2)] Credential CommitteeHotCredential +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record ResignCommitteeColdCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] byte[] CommitteeColdCredential, + [CborOrder(2)] Anchor? Anchor +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record RegDrepCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential DRepCredential, + [CborOrder(2)] ulong Coin, + [CborOrder(3)][CborNullable] Anchor? Anchor +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record UnRegDrepCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential DrepCredential, + [CborOrder(2)] ulong Coin +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record UpdateDrepCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] Credential DrepCredential, + [CborOrder(2)][CborNullable] Anchor? Anchor +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record GenesisKeyDelegation( + [CborOrder(0)] int Tag, + [CborOrder(1)] byte[] GenesisHash, + [CborOrder(2)] byte[] GenesisDelegateHash, + [CborOrder(3)] byte[] VrfKeyHash +) : Certificate; + + +[CborSerializable] +[CborList] +public partial record MoveInstantaneousRewardsCert( + [CborOrder(0)] int Tag, + [CborOrder(1)] MoveInstantaneousReward MoveInstantaneousReward +) : Certificate; + + diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/MoveInstantaneousReward.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/MoveInstantaneousReward.cs new file mode 100644 index 00000000..72a1f553 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/MoveInstantaneousReward.cs @@ -0,0 +1,28 @@ +using Chrysalis.Cbor.Serialization.Attributes; + + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.Certificates; + +[CborSerializable] +[CborList] +public partial record MoveInstantaneousReward( + [CborOrder(0)] int InstantaneousRewardSource, + [CborOrder(1)] Target InstantaneousRewardTarget +) : CborBase; + + +[CborSerializable] +[CborUnion] +public abstract partial record Target : CborBase +{ +} + +[CborSerializable] +public partial record StakeCredentials(Dictionary Value) : Target; + + +[CborSerializable] +public partial record OtherAccountingPot(ulong Value) : Target; + diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/PoolMetadata.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/PoolMetadata.cs new file mode 100644 index 00000000..72694d6f --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/PoolMetadata.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.Certificates; + +[CborSerializable] +[CborList] +public partial record PoolMetadata( + [CborOrder(0)] string Url, + [CborOrder(1)] byte[] PoolMetadataHash +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/Relay.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/Relay.cs new file mode 100644 index 00000000..c4a39afc --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Certificates/Relay.cs @@ -0,0 +1,37 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.Certificates; + +[CborSerializable] +[CborUnion] +public abstract partial record Relay : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record SingleHostAddr( + [CborOrder(0)] int Tag, + [CborOrder(1)][CborNullable] ulong? Port, + [CborOrder(2)][CborNullable] byte[]? IPv4, + [CborOrder(3)][CborNullable] byte[] IPv6 +) : Relay; + + +[CborSerializable] +[CborList] +public partial record SingleHostName( + [CborOrder(0)] int Tag, + [CborOrder(1)][CborNullable] ulong? Port, + [CborOrder(2)] string DNSName +) : Relay; + + +[CborSerializable] +[CborList] +public partial record MultiHostName( + [CborOrder(0)] int Tag, + [CborOrder(1)] string DNSName +) : Relay; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/ProposalProcedures/RewardAccount.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/ProposalProcedures/RewardAccount.cs new file mode 100644 index 00000000..55320019 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/ProposalProcedures/RewardAccount.cs @@ -0,0 +1,7 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.ProposalProcedures; + +[CborSerializable] +public partial record RewardAccount(byte[] Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/TransactionBody.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/TransactionBody.cs new file mode 100644 index 00000000..ddf7735b --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/TransactionBody.cs @@ -0,0 +1,82 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.Certificates; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Input; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; +using Chrysalis.Cbor.Types.Custom; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; +using static Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output.TransactionOutput; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body; + +[CborSerializable] +[CborUnion] +public abstract partial record TransactionBody : CborBase { } + +[CborSerializable] +[CborMap] +public partial record AlonzoTransactionBody( + [CborProperty(0)] CborMaybeIndefList Inputs, + [CborProperty(1)] CborMaybeIndefList Outputs, + [CborProperty(2)] ulong Fee, + [CborProperty(3)] ulong? TimeToLive, + [CborProperty(4)] CborMaybeIndefList? Certificates, + [CborProperty(5)] Withdrawals? Withdrawals, + [CborProperty(6)] Update? Update, + [CborProperty(7)] byte[]? AuxiliaryDataHash, + [CborProperty(8)] ulong? ValidityIntervalStart, + [CborProperty(9)] MultiAssetMint? Mint, + [CborProperty(11)] byte[]? ScriptDataHash, + [CborProperty(13)] CborMaybeIndefList? Collateral, + [CborProperty(14)] CborMaybeIndefList? RequiredSigners, + [CborProperty(15)] int? NetworkId + ) : TransactionBody; + +[CborSerializable] +[CborMap] +public partial record BabbageTransactionBody( + [CborProperty(0)] CborMaybeIndefList Inputs, + [CborProperty(1)] CborMaybeIndefList Outputs, + [CborProperty(2)] ulong Fee, + [CborProperty(3)] ulong? TimeToLive, + [CborProperty(4)] CborMaybeIndefList? Certificates, + [CborProperty(5)] Withdrawals? Withdrawals, + [CborProperty(6)] Update? Update, + [CborProperty(7)] byte[]? AuxiliaryDataHash, + [CborProperty(8)] ulong? ValidityIntervalStart, + [CborProperty(9)] MultiAssetMint? Mint, + [CborProperty(11)] byte[]? ScriptDataHash, + [CborProperty(13)] CborMaybeIndefList? Collateral, + [CborProperty(14)] CborMaybeIndefList? RequiredSigners, + [CborProperty(15)] byte[]? NetworkId, + [CborProperty(16)] TransactionOutput? CollateralReturn, + [CborProperty(17)] ulong? TotalCollateral, + [CborProperty(18)] CborMaybeIndefList? ReferenceInputs +) : TransactionBody; + + +[CborSerializable] +[CborMap] +public partial record ConwayTransactionBody( + [CborProperty(0)] CborMaybeIndefList Inputs, + [CborProperty(1)] CborMaybeIndefList Outputs, + [CborProperty(2)] ulong Fee, + [CborProperty(3)] ulong? TimeToLive, + [CborProperty(4)] CborMaybeIndefList? Certificates, + [CborProperty(5)] Withdrawals? Withdrawals, + [CborProperty(7)] byte[]? AuxiliaryDataHash, + [CborProperty(8)] ulong? ValidityIntervalStart, + [CborProperty(9)] MultiAssetMint? Mint, + [CborProperty(11)] byte[]? ScriptDataHash, + [CborProperty(13)] CborMaybeIndefList? Collateral, + [CborProperty(14)] CborMaybeIndefList? RequiredSigners, + [CborProperty(15)] int? NetworkId, + [CborProperty(16)] TransactionOutput? CollateralReturn, + [CborProperty(17)] ulong? TotalCollateral, + [CborProperty(18)] CborMaybeIndefList? ReferenceInputs, + [CborProperty(19)] VotingProcedures? VotingProcedures, + [CborProperty(20)] CborMaybeIndefList? ProposalProcedures, + [CborProperty(21)] ulong? TreasuryValue, + [CborProperty(22)] ulong? Donation +) : TransactionBody; + diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Update.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Update.cs new file mode 100644 index 00000000..986cc422 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Update.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body; + +[CborSerializable] +[CborList] +public partial record Update( + [CborOrder(0)] ProposedProtocolParameterUpdates ProposedProtocolParameterUpdates, + [CborOrder(1)] ulong Epoch +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Withdrawals.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Withdrawals.cs new file mode 100644 index 00000000..27d2463f --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Body/Withdrawals.cs @@ -0,0 +1,8 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.ProposalProcedures; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body; + +[CborSerializable] +public partial record Withdrawals(Dictionary Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Credential.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Credential.cs new file mode 100644 index 00000000..0a4cba04 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Credential.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction; + +[CborSerializable] +[CborList] +public partial record Credential( + [CborOrder(0)] int CredentialType, + [CborOrder(1)] byte[] Hash +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/Constituion.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/Constituion.cs new file mode 100644 index 00000000..6985b181 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/Constituion.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborList] +public partial record Constitution( + [CborOrder(0)] Anchor Anchor, + [CborOrder(1)][CborNullable] byte[]? ScriptHash +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/DRep.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/DRep.cs new file mode 100644 index 00000000..2bba4fc3 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/DRep.cs @@ -0,0 +1,38 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborUnion] +public abstract partial record DRep : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record DRepAddrKeyHash( +[CborOrder(0)] int Tag, +[CborOrder(1)] byte[] AddrKeyHash +) : DRep; + +[CborSerializable] +[CborList] +public partial record DRepScriptHash( + [CborOrder(0)] int Tag, + [CborOrder(1)] byte[] ScriptHash +) : DRep; + +[CborSerializable] +[CborList] +public partial record Abstain( + [CborOrder(0)] int Tag +) : DRep; + +[CborSerializable] +[CborList] +public partial record DRepNoConfidence( + [CborOrder(0)] int Tag +) : DRep; + diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/DRepVotingThresholds.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/DRepVotingThresholds.cs new file mode 100644 index 00000000..6516c997 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/DRepVotingThresholds.cs @@ -0,0 +1,20 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Primitives; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborList] +public partial record DRepVotingThresholds( + [CborOrder(0)] CborRationalNumber MotionNoConfidence, + [CborOrder(1)] CborRationalNumber CommitteeNormal, + [CborOrder(2)] CborRationalNumber CommitteeNoConfidence, + [CborOrder(4)] CborRationalNumber UpdateConstitution, + [CborOrder(5)] CborRationalNumber HardForkInitiation, + [CborOrder(6)] CborRationalNumber PpNetworkGroup, + [CborOrder(7)] CborRationalNumber PpEconomicGroup, + [CborOrder(8)] CborRationalNumber PpTechnicalGroup, + [CborOrder(9)] CborRationalNumber PpGovernanceGroup, + [CborOrder(10)] CborRationalNumber TreasuryWithdrawal +) : CborBase; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/GovAction.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/GovAction.cs new file mode 100644 index 00000000..8931911a --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/GovAction.cs @@ -0,0 +1,74 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Header.Body; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; +using Chrysalis.Cbor.Types.Custom; +using Chrysalis.Cbor.Types.Primitives; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborUnion] +public abstract partial record GovAction : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record ParameterChangeAction( + [CborOrder(0)] int ActionType, + [CborOrder(1)] GovActionId? GovActionId, + [CborOrder(2)] ProtocolParamUpdate ProtocolParamUpdate, + [CborOrder(3)] byte[]? PolicyHash +) : GovAction; + + +[CborSerializable] +[CborList] +public partial record HardForkInitiationAction( + [CborOrder(0)] int ActionType, + [CborOrder(1)] GovActionId? GovActionId, + [CborOrder(2)] ProtocolVersion ProtocolVersion + ) : GovAction; + + +[CborSerializable] +[CborList] +public partial record TreasuryWithdrawalsAction( + [CborOrder(0)] int ActionType, + [CborOrder(1)] Withdrawals Withdrawals, + [CborOrder(2)] byte[]? PolicyHash + ) : GovAction; + + +[CborSerializable] +[CborList] +public partial record NoConfidence( + [CborOrder(0)] int ActionType, + [CborOrder(1)] GovActionId? GovActionId +) : GovAction; + +[CborSerializable] +[CborList] +public partial record UpdateCommittee( + [CborOrder(0)] int ActionType, + [CborOrder(1)] GovActionId? GovActionId, + [CborOrder(2)] CborMaybeIndefList NewMembers, + [CborOrder(3)] MemberTermLimits MemberTermLimits, + [CborOrder(4)] CborRationalNumber QuorumThreshold +) : GovAction; + +[CborSerializable] +[CborList] +public partial record NewConstitution( + [CborOrder(0)] int ActionType, + [CborOrder(1)] GovActionId? GovActionId, + [CborOrder(2)] Constitution Constitution +) : GovAction; + +[CborSerializable] +[CborList] +public partial record InfoAction( + [CborOrder(0)] int Value +) : GovAction; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/GovActionId.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/GovActionId.cs new file mode 100644 index 00000000..e13e1cd9 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/GovActionId.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborList] +public partial record GovActionId( + [CborOrder(0)] byte[] TransactionId, + [CborOrder(1)] int GovActionIndex +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/MemberTermLimits.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/MemberTermLimits.cs new file mode 100644 index 00000000..68f94724 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/MemberTermLimits.cs @@ -0,0 +1,7 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +public partial record MemberTermLimits(Dictionary Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/ProposalProcedure.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/ProposalProcedure.cs new file mode 100644 index 00000000..7c543e30 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/ProposalProcedure.cs @@ -0,0 +1,14 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body.ProposalProcedures; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborList] +public partial record ProposalProcedure( + [CborOrder(0)] ulong Deposit, + [CborOrder(1)] RewardAccount RewardAccount, + [CborOrder(2)] GovAction GovAction, + [CborOrder(3)] Anchor Anchor +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/Voter.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/Voter.cs new file mode 100644 index 00000000..951dddb4 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/Voter.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborList] +public partial record Voter( + [CborOrder(0)] int Tag, + [CborOrder(1)] byte[] Hash +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/VotingProcedure.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/VotingProcedure.cs new file mode 100644 index 00000000..c1569086 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/VotingProcedure.cs @@ -0,0 +1,11 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +[CborList] +public partial record VotingProcedure( + [CborOrder(0)] int Vote, + [CborOrder(1)][CborNullable] Anchor? Anchor +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/VotingProcedures.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/VotingProcedures.cs new file mode 100644 index 00000000..2ef9bf95 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Governance/VotingProcedures.cs @@ -0,0 +1,17 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; + +[CborSerializable] +public partial record VotingProcedures( + Dictionary Value +) : CborBase; + +[CborSerializable] +public partial record GovActionIdVotingProcedure(Dictionary Value) : CborBase; + +[CborSerializable] +public partial record VoterChoices( + Dictionary Value +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Input/TransactionInput.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Input/TransactionInput.cs new file mode 100644 index 00000000..c118fba4 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Input/TransactionInput.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Input; + +[CborSerializable] +[CborList] +public partial record TransactionInput( + [CborOrder(0)] byte[] TransactionId, + [CborOrder(1)] ulong Index +) : CborBase; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/Address.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/Address.cs new file mode 100644 index 00000000..41641120 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/Address.cs @@ -0,0 +1,8 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; + +[CborSerializable] +public partial record Address(byte[] Value) : CborBase
, ICborPreserveRaw; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/DatumOption.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/DatumOption.cs new file mode 100644 index 00000000..69eccd19 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/DatumOption.cs @@ -0,0 +1,30 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Primitives; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; + +[CborSerializable] +[CborUnion] +public abstract partial record DatumOption : CborBase +{ + +} + +[CborSerializable] +[CborList] +public partial record DatumHashOption( + [CborOrder(0)] int Option, + [CborOrder(1)] byte[] DatumHash +) : DatumOption, ICborPreserveRaw; + + +[CborSerializable] +[CborList] +public partial record InlineDatumOption( + [CborOrder(0)] int Option, + [CborOrder(1)] CborEncodedValue Data +) : DatumOption, ICborPreserveRaw; + diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/MultiAsset.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/MultiAsset.cs new file mode 100644 index 00000000..8a8df4d2 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/MultiAsset.cs @@ -0,0 +1,22 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; +using static Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output.TokenBundle; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; + +[CborSerializable] +[CborUnion] +public abstract partial record MultiAsset : CborBase +{ +} + +[CborSerializable] +public partial record MultiAssetOutput( + Dictionary Value +) : MultiAsset; + + +[CborSerializable] +public partial record MultiAssetMint( + Dictionary Value +) : MultiAsset; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/TokenBundle.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/TokenBundle.cs new file mode 100644 index 00000000..1c91547f --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/TokenBundle.cs @@ -0,0 +1,17 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; + +[CborSerializable] +[CborUnion] +public abstract partial record TokenBundle : CborBase +{ +} + +[CborSerializable] +public partial record TokenBundleOutput(Dictionary Value) : TokenBundle; + + +[CborSerializable] +public partial record TokenBundleMint(Dictionary Value) : TokenBundle; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/TransactionOutput.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/TransactionOutput.cs new file mode 100644 index 00000000..d60a656e --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/TransactionOutput.cs @@ -0,0 +1,30 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Primitives; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; + +[CborSerializable] +[CborUnion] +public abstract partial record TransactionOutput : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record AlonzoTransactionOutput( +[CborOrder(0)] Address Address, +[CborOrder(1)] Value Amount, +[CborOrder(2)] byte[]? DatumHash +) : TransactionOutput, ICborPreserveRaw; + +[CborSerializable] +[CborMap] +public partial record PostAlonzoTransactionOutput( + [CborProperty(0)] Address Address, + [CborProperty(1)] Value Amount, + [CborProperty(2)] DatumOption? Datum, + [CborProperty(3)] CborEncodedValue? ScriptRef +) : TransactionOutput, ICborPreserveRaw; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/Value.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/Value.cs new file mode 100644 index 00000000..917ca95f --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Output/Value.cs @@ -0,0 +1,21 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; +using static Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output.MultiAsset; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; + +[CborSerializable] +[CborUnion] +public abstract partial record Value : CborBase +{ +} + +[CborSerializable] +public partial record Lovelace(ulong Value) : Value; + +[CborSerializable] +[CborList] +public partial record LovelaceWithMultiAsset( + [CborOrder(0)] Lovelace LovelaceValue, + [CborOrder(1)] MultiAssetOutput MultiAsset + ) : Value; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/CostMdls.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/CostMdls.cs new file mode 100644 index 00000000..70a49121 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/CostMdls.cs @@ -0,0 +1,8 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Custom; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; + +[CborSerializable] +public partial record CostMdls(Dictionary> Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ExUnitPrices.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ExUnitPrices.cs new file mode 100644 index 00000000..60348032 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ExUnitPrices.cs @@ -0,0 +1,13 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Primitives; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; + +[CborSerializable] +[CborList] +public partial record ExUnitPrices( + [CborOrder(0)] CborRationalNumber MemPrice, + [CborOrder(1)] CborRationalNumber StepPrice +) : CborBase; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ExUnits.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ExUnits.cs new file mode 100644 index 00000000..cf1902a7 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ExUnits.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; + +[CborSerializable] +[CborList] +public partial record ExUnits( + [CborOrder(0)] ulong Mem, + [CborOrder(1)] ulong Steps +) : CborBase; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/Nonce.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/Nonce.cs new file mode 100644 index 00000000..e11bd342 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/Nonce.cs @@ -0,0 +1,24 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; + +[CborSerializable] +[CborUnion] +public abstract partial record Nonce : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record NonceWithHash( +[CborOrder(0)] ulong Variant, +[CborOrder(1)] byte[]? Hash +) : Nonce; + +[CborSerializable] +[CborList] +public partial record NonceWithoutHash( + [CborOrder(0)] ulong Variant +) : Nonce; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/PoolVotingThresholds.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/PoolVotingThresholds.cs new file mode 100644 index 00000000..fac0d7a2 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/PoolVotingThresholds.cs @@ -0,0 +1,16 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Primitives; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; + +[CborSerializable] +[CborList] +public partial record PoolVotingThresholds( + [CborOrder(0)] CborRationalNumber MotionNoConfidence, + [CborOrder(1)] CborRationalNumber CommitteeNormal, + [CborOrder(2)] CborRationalNumber CommitteeNoConfidence, + [CborOrder(3)] CborRationalNumber HardForkInitiation, + [CborOrder(4)] CborRationalNumber SecurityVotingThreshold +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ProtocolParamUpdate.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ProtocolParamUpdate.cs new file mode 100644 index 00000000..db496890 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Protocol/ProtocolParamUpdate.cs @@ -0,0 +1,130 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Header.Body; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Governance; +using Chrysalis.Cbor.Types.Primitives; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; + +[CborSerializable] +[CborUnion] +public abstract partial record ProtocolParamUpdate : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record ConwayProtocolParamUpdate( + [CborOrder(0)] ulong? MinFeeA, + [CborOrder(1)] ulong? MinFeeB, + [CborOrder(2)] ulong? MaxBlockBodySize, + [CborOrder(3)] ulong? MaxTransactionSize, + [CborOrder(4)] ulong? MaxBlockHeaderSize, + [CborOrder(5)] ulong? KeyDeposit, + [CborOrder(6)] ulong? PoolDeposit, + [CborOrder(7)] ulong? MaximumEpoch, + [CborOrder(8)] ulong? DesiredNumberOfStakePools, + [CborOrder(9)] CborRationalNumber? PoolPledgeInfluence, + [CborOrder(10)] CborRationalNumber? ExpansionRate, + [CborOrder(11)] CborRationalNumber? TreasuryGrowthRate, + [CborOrder(16)] ulong? MinPoolCost, + [CborOrder(17)] ulong? AdaPerUTxOByte, + [CborOrder(18)] CostMdls? CostModelsForScriptLanguage, + [CborOrder(19)] ExUnitPrices? ExecutionCosts, + [CborOrder(20)] ExUnits? MaxTxExUnits, + [CborOrder(21)] ExUnits? MaxBlockExUnits, + [CborOrder(22)] ulong? MaxValueSize, + [CborOrder(23)] ulong? CollateralPercentage, + [CborOrder(24)] ulong? MaxCollateralInputs, + [CborOrder(25)] PoolVotingThresholds? PoolVotingThresholds, + [CborOrder(26)] DRepVotingThresholds? DRepVotingThresholds, + [CborOrder(27)] ulong? MinCommitteeSize, + [CborOrder(28)] ulong? CommitteeTermLimit, + [CborOrder(29)] ulong? GovernanceActionValidityPeriod, + [CborOrder(30)] ulong? GovernanceActionDeposit, + [CborOrder(31)] ulong? DRepDeposit, + [CborOrder(32)] ulong? DRepInactivityPeriod, + [CborOrder(33)] CborRationalNumber? MinFeeRefScriptCostPerByte +) : ProtocolParamUpdate; + +[CborSerializable] +[CborMap] +public partial record BabbageProtocolParamUpdate( + [CborProperty(0)] ulong? MinFeeA, + [CborProperty(1)] ulong? MinFeeB, + [CborProperty(2)] ulong? MaxBlockBodySize, + [CborProperty(3)] ulong? MaxTransactionSize, + [CborProperty(4)] ulong? MaxBlockHeaderSize, + [CborProperty(5)] ulong? KeyDeposit, + [CborProperty(6)] ulong? PoolDeposit, + [CborProperty(7)] ulong? MaximumEpoch, + [CborProperty(8)] ulong? DesiredNumberOfStakePools, + [CborProperty(9)] CborRationalNumber? PoolPledgeInfluence, + [CborProperty(10)] CborRationalNumber? ExpansionRate, + [CborProperty(11)] CborRationalNumber? TreasuryGrowthRate, + [CborProperty(14)] ProtocolVersion? ProtocolVersion, + [CborProperty(16)] ulong? MinPoolCost, + [CborProperty(17)] ulong? AdaPerUTxOByte, + [CborProperty(18)] CostMdls? CostModelsForScriptLanguage, + [CborProperty(19)] ExUnitPrices? ExecutionCosts, + [CborProperty(20)] ExUnits? MaxTxExUnits, + [CborProperty(21)] ExUnits? MaxBlockExUnits, + [CborProperty(22)] ulong? MaxValueSize, + [CborProperty(23)] ulong? CollateralPercentage, + [CborProperty(24)] ulong? MaxCollateralInputs +) : ProtocolParamUpdate; + +[CborSerializable] +[CborMap] +public partial record AlonzoProtocolParamUpdate( + [CborProperty(0)] ulong? MinFeeA, + [CborProperty(1)] ulong? MinFeeB, + [CborProperty(2)] ulong? MaxBlockBodySize, + [CborProperty(3)] ulong? MaxTransactionSize, + [CborProperty(4)] ulong? MaxBlockHeaderSize, + [CborProperty(5)] ulong? KeyDeposit, + [CborProperty(6)] ulong? PoolDeposit, + [CborProperty(7)] ulong? MaximumEpoch, + [CborProperty(8)] ulong? DesiredNumberOfStakePools, + [CborProperty(9)] CborRationalNumber? PoolPledgeInfluence, + [CborProperty(10)] CborRationalNumber? ExpansionRate, + [CborProperty(11)] CborRationalNumber? TreasuryGrowthRate, + [CborProperty(12)] CborRationalNumber? DecentralizationConstant, + [CborProperty(13)] Nonce? ExtraEntropy, + [CborProperty(14)] ProtocolVersion? ProtocolVersion, + [CborProperty(16)] ulong? MinPoolCost, + [CborProperty(17)] ulong? AdaPerUTxOByte, + [CborProperty(18)] CostMdls? CostModelsForScriptLanguage, + [CborProperty(19)] ExUnitPrices? ExecutionCosts, + [CborProperty(20)] ExUnits? MaxTxExUnits, + [CborProperty(21)] ExUnits? MaxBlockExUnits, + [CborProperty(22)] ulong? MaxValueSize, + [CborProperty(23)] ulong? CollateralPercentage, + [CborProperty(24)] ulong? MaxCollateralInputs +) : ProtocolParamUpdate; + +[CborSerializable] +[CborMap] +public partial record MaryProtocolParamUpdate( + [CborProperty(0)] ulong? MinFeeA, + [CborProperty(1)] ulong? MinFeeB, + [CborProperty(2)] ulong? MaxBlockBodySize, + [CborProperty(3)] ulong? MaxTransactionSize, + [CborProperty(4)] ulong? MaxBlockHeaderSize, + [CborProperty(5)] ulong? KeyDeposit, + [CborProperty(6)] ulong? PoolDeposit, + [CborProperty(7)] ulong? MaximumEpoch, + [CborProperty(8)] ulong? DesiredNumberOfStakePools, + [CborProperty(9)] CborRationalNumber? PoolPledgeInfluence, + [CborProperty(10)] CborRationalNumber? ExpansionRate, + [CborProperty(11)] CborRationalNumber? TreasuryGrowthRate, + [CborProperty(12)] CborRationalNumber? DecentralizationConstant, + [CborProperty(13)] Nonce? ExtraEntropy, + [CborProperty(14)] ProtocolVersion? ProtocolVersion, + [CborProperty(15)] ulong? Coin +) : ProtocolParamUpdate; + +[CborSerializable] +public partial record ProposedProtocolParameterUpdates( + Dictionary Value +) : CborBase; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Script/NativeScript.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Script/NativeScript.cs new file mode 100644 index 00000000..e130b69a --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Script/NativeScript.cs @@ -0,0 +1,53 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Custom; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Script; + +[CborSerializable] +[CborUnion] +public abstract partial record NativeScript : CborBase { } + +[CborSerializable] +[CborList] +public partial record ScriptPubKey( + [CborOrder(0)] int Tag, + [CborOrder(1)] byte[] AddrKeyHash +) : NativeScript; + +[CborSerializable] +[CborList] +public partial record ScriptAll( + [CborOrder(0)] int Tag, + [CborOrder(1)] CborIndefList? Scripts +) : NativeScript; + +[CborSerializable] +[CborList] +public partial record ScriptAny( + [CborOrder(0)] int Tag, + [CborOrder(1)] CborDefList? Scripts +) : NativeScript; + +[CborSerializable] +[CborList] +public partial record ScriptNOfK( + [CborOrder(0)] int Tag, + [CborOrder(1)] int N, + [CborOrder(2)] CborDefList? Scripts +) : NativeScript; + +[CborSerializable] +[CborList] +public partial record InvalidBefore( + [CborOrder(0)] int Tag, + [CborOrder(1)] ulong Slot +) : NativeScript; + +[CborSerializable] +[CborList] +public partial record InvalidHereafter( + [CborOrder(0)] int Tag, + [CborOrder(1)] ulong Slot +) : NativeScript; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Script/PlutusData.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Script/PlutusData.cs new file mode 100644 index 00000000..ef0061f2 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Script/PlutusData.cs @@ -0,0 +1,50 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.Script; + +[CborSerializable] +[CborUnion] +public abstract partial record PlutusData : CborBase +{ +} + +[CborSerializable] +[CborConstr] +public partial record PlutusConstr(List PlutusData) : PlutusData; + +[CborSerializable] +public partial record PlutusMap(Dictionary PlutusData) : PlutusData; + +[CborSerializable] +public partial record PlutusList(List PlutusData) : PlutusData; + + +[CborSerializable] +[CborUnion] +public abstract partial record PlutusBigInt : PlutusData +{ +} + +[CborSerializable] +[CborUnion] +public abstract partial record PlutusInt : PlutusBigInt +{ +} + +[CborSerializable] +public partial record PlutusInt64(long Value) : PlutusInt; + +[CborSerializable] +public partial record PlutusUint64(ulong Value) : PlutusInt; + +[CborSerializable] +[CborTag(2)] +public partial record PlutusBigUint([CborSize(64)] byte[] Value) : PlutusBigInt; + +[CborSerializable] +[CborTag(3)] +public partial record PlutusBigNint([CborSize(64)] byte[] Value) : PlutusBigInt; + +[CborSerializable] +public partial record PlutusBoundedBytes([CborSize(64)] byte[] Value) : PlutusData; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Transaction.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Transaction.cs new file mode 100644 index 00000000..39c448a4 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/Transaction.cs @@ -0,0 +1,39 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Body; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Serialization; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction; + +[CborSerializable] +[CborUnion] +public abstract partial record Transaction : CborBase +{ +} + +[CborSerializable] +[CborList] +public partial record ShelleyTransaction( + [CborOrder(0)] TransactionBody TransactionBody, + [CborOrder(1)] TransactionWitnessSet TransactionWitnessSet, + [CborOrder(2)][CborNullable] Metadata? TransactionMetadata +) : Transaction, ICborPreserveRaw; + +[CborSerializable] +[CborList] +public partial record AllegraTransaction( + [CborOrder(0)] TransactionBody TransactionBody, + [CborOrder(1)] TransactionWitnessSet TransactionWitnessSet, + [CborOrder(2)][CborNullable] AuxiliaryData? AuxiliaryData +) : Transaction, ICborPreserveRaw; + +[CborSerializable] +[CborList] +public partial record PostMaryTransaction( + [CborOrder(0)] TransactionBody TransactionBody, + [CborOrder(1)] TransactionWitnessSet TransactionWitnessSet, + [CborOrder(2)] bool IsValid, + [CborOrder(3)][CborNullable] AuxiliaryData? AuxiliaryData +) : Transaction, ICborPreserveRaw; + diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/TransactionMetadatum.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/TransactionMetadatum.cs new file mode 100644 index 00000000..500646eb --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/TransactionMetadatum.cs @@ -0,0 +1,44 @@ +using Chrysalis.Cbor.Serialization.Attributes; + + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction; + +[CborSerializable] +[CborUnion] +public abstract partial record TransactionMetadatum : CborBase +{ +} + +[CborSerializable] +public partial record MetadatumMap( + Dictionary Value +) : TransactionMetadatum; + +[CborSerializable] +public partial record MetadatumList( + List Value +) : TransactionMetadatum; + + +[CborSerializable] +public partial record MetadatumBytes(byte[] Value) : TransactionMetadatum; + + +[CborSerializable] +public partial record MetadataText(string Value) : TransactionMetadatum; + + +[CborSerializable] +[CborUnion] +public abstract partial record MetadatumInt : TransactionMetadatum +{ +} + +[CborSerializable] +public partial record MetadatumIntLong(long Value) : MetadatumInt; + + +[CborSerializable] +public partial record MetadatumIntUlong(ulong Value) : MetadatumInt; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/AuxiliaryData.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/AuxiliaryData.cs new file mode 100644 index 00000000..56a8129b --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/AuxiliaryData.cs @@ -0,0 +1,36 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Script; +using Chrysalis.Cbor.Types.Custom; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Serialization; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; + +[CborSerializable] +[CborUnion] +public abstract partial record AuxiliaryData : CborBase +{ +} + +[CborSerializable] +[CborMap] +[CborTag(259)] +public partial record PostAlonzoAuxiliaryDataMap( + [CborProperty(0)] Metadata? MetadataValue, + [CborProperty(1)] CborDefList? NativeScriptSet, + [CborProperty(2)] CborDefList? PlutusV1ScriptSet, + [CborProperty(3)] CborDefList? PlutusV2ScriptSet, + [CborProperty(4)] CborDefList? PlutusV3ScriptSet +) : AuxiliaryData, ICborPreserveRaw; + + +[CborSerializable] +public partial record Metadata(Dictionary Value) : AuxiliaryData; + + +[CborSerializable] +[CborList] +public partial record ShellyMaAuxiliaryData( + [CborOrder(0)] Metadata TransactionMetadata, + [CborOrder(1)] CborDefList AuxiliaryScripts +) : AuxiliaryData, ICborPreserveRaw; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/BootstrapWitness.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/BootstrapWitness.cs new file mode 100644 index 00000000..7ba1db0a --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/BootstrapWitness.cs @@ -0,0 +1,15 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; + +[CborSerializable] +[CborList] +public partial record BootstrapWitness( + [CborOrder(0)] byte[] PublicKey, + [CborOrder(1)] byte[] Signature, + [CborOrder(2)] byte[] ChainCode, + [CborOrder(3)] byte[] Attributes +) : CborBase, ICborPreserveRaw; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/Redeemers.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/Redeemers.cs new file mode 100644 index 00000000..eaa27ae0 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/Redeemers.cs @@ -0,0 +1,42 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Protocol; +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Script; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Serialization; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; + +[CborSerializable] +[CborUnion] +public abstract partial record Redeemers : CborBase +{ +} + +[CborSerializable] +public partial record RedeemerList(List Value) : Redeemers, ICborPreserveRaw; + +[CborSerializable] +public partial record RedeemerMap(Dictionary Value) : Redeemers, ICborPreserveRaw; + +[CborSerializable] +[CborList] +public partial record RedeemerEntry( + [CborOrder(0)] int Tag, + [CborOrder(1)] ulong Index, + [CborOrder(2)] PlutusData Data, + [CborOrder(3)] ExUnits ExUnits +) : CborBase, ICborPreserveRaw; + +[CborSerializable] +[CborList] +public partial record RedeemerKey( + [CborOrder(0)] int Tag, + [CborOrder(1)] ulong Index +) : CborBase, ICborPreserveRaw; + +[CborSerializable] +[CborList] +public partial record RedeemerValue( + [CborOrder(0)] PlutusData Data, + [CborOrder(1)] ExUnits ExUnits +) : CborBase, ICborPreserveRaw; diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/TransactionWitnessSet.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/TransactionWitnessSet.cs new file mode 100644 index 00000000..0ec76811 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/TransactionWitnessSet.cs @@ -0,0 +1,37 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Script; +using Chrysalis.Cbor.Types.Custom; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Serialization; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; + +[CborSerializable] +[CborUnion] +public abstract partial record TransactionWitnessSet : CborBase +{ +} + +[CborSerializable] +[CborMap] +public partial record AlonzoTransactionWitnessSet( + [CborProperty(0)] CborMaybeIndefList? VKeyWitnessSet, + [CborProperty(1)] CborMaybeIndefList? NativeScriptSet, + [CborProperty(2)] CborMaybeIndefList? BootstrapWitnessSet, + [CborProperty(3)] CborMaybeIndefList? PlutusV1ScriptSet, + [CborProperty(4)] CborMaybeIndefList? PlutusDataSet, + [CborProperty(5)] Redeemers? Redeemers +) : TransactionWitnessSet, ICborPreserveRaw; + +[CborSerializable] +[CborMap] +public partial record PostAlonzoTransactionWitnessSet( + [CborProperty(0)] CborMaybeIndefList? VKeyWitnessSet, + [CborProperty(1)] CborMaybeIndefList? NativeScriptSet, + [CborProperty(2)] CborMaybeIndefList? BootstrapWitnessSet, + [CborProperty(3)] CborMaybeIndefList? PlutusV1ScriptSet, + [CborProperty(4)] CborMaybeIndefList? PlutusDataSet, + [CborProperty(5)] Redeemers? Redeemers, + [CborProperty(6)] CborMaybeIndefList? PlutusV2ScriptSet, + [CborProperty(7)] CborMaybeIndefList? PlutusV3ScriptSet +) : TransactionWitnessSet, ICborPreserveRaw; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/VKeyWitness.cs b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/VKeyWitness.cs new file mode 100644 index 00000000..b072131f --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Block/Transaction/WitnessSet/VKeyWitness.cs @@ -0,0 +1,13 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Block.Transaction.WitnessSet; + +[CborSerializable] +[CborList] +public partial record VKeyWitness( + [CborOrder(0)] byte[] VKey, + [CborOrder(1)] byte[] Signature +) : CborBase, ICborPreserveRaw; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Primitives/CborBoundedBytes.cs b/src/Chrysalis.Cbor/Cardano/Types/Primitives/CborBoundedBytes.cs new file mode 100644 index 00000000..2b930050 --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Primitives/CborBoundedBytes.cs @@ -0,0 +1,8 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Primitives; + +[CborSerializable] +public partial record CborBoundedBytes([CborSize(64)] byte[] Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Cardano/Types/Primitives/PosixTime.cs b/src/Chrysalis.Cbor/Cardano/Types/Primitives/PosixTime.cs new file mode 100644 index 00000000..ba22115b --- /dev/null +++ b/src/Chrysalis.Cbor/Cardano/Types/Primitives/PosixTime.cs @@ -0,0 +1,7 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Cbor.Cardano.Types.Primitives; + +[CborSerializable] +public partial record PosixTime(ulong Value) : CborBase; diff --git a/src/Chrysalis.Cbor/Chrysalis.Cbor.csproj b/src/Chrysalis.Cbor/Chrysalis.Cbor.csproj new file mode 100644 index 00000000..fc9584e0 --- /dev/null +++ b/src/Chrysalis.Cbor/Chrysalis.Cbor.csproj @@ -0,0 +1,34 @@ + + + net9.0 + enable + enable + 0.6.0 + Chrysalis.Cbor + clark@saib.dev, rjlacanlale@saib.dev, kathea.mayol@saib.dev + SAIB Inc + README.md + LICENSE.md + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Extensions/TypeExtension.cs b/src/Chrysalis.Cbor/Extensions/TypeExtension.cs new file mode 100644 index 00000000..0549ccc0 --- /dev/null +++ b/src/Chrysalis.Cbor/Extensions/TypeExtension.cs @@ -0,0 +1,10 @@ +using System.Runtime.CompilerServices; + +namespace Chrysalis.Cbor.Extensions; + +public static class TypeExtensions +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Type NormalizeType(this Type type) => + type.IsGenericType ? type.GetGenericTypeDefinition() : type; +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Serialization/Attributes/SerializationAttributes.cs b/src/Chrysalis.Cbor/Serialization/Attributes/SerializationAttributes.cs new file mode 100644 index 00000000..876fef01 --- /dev/null +++ b/src/Chrysalis.Cbor/Serialization/Attributes/SerializationAttributes.cs @@ -0,0 +1,125 @@ + + +namespace Chrysalis.Cbor.Serialization.Attributes; + +// Type-level attributes + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false, AllowMultiple = false)] +public sealed class CborSerializableAttribute : Attribute; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false, AllowMultiple = false)] +public sealed class CborMapAttribute : Attribute +{ + public CborMapAttribute() { } +} + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborNullableAttribute : Attribute +{ + public CborNullableAttribute() { } +} + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false, AllowMultiple = false)] +public sealed class CborListAttribute : Attribute +{ + public CborListAttribute() { } +} + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] +public sealed class CborUnionAttribute : Attribute +{ + public CborUnionAttribute() { } +} + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] +public sealed class CborConstrAttribute : Attribute +{ + // Default constructor - use -1 to mean "any index" + public CborConstrAttribute() + { + ConstructorIndex = -1; + } + + // Constructor with index parameter + public CborConstrAttribute(int constructorIndex) + { + ConstructorIndex = constructorIndex; + } + + public int ConstructorIndex { get; } + + // Helper property to check if any index is allowed + public bool IsAnyIndexAllowed => ConstructorIndex == -1; +} + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] +public sealed class CborTagAttribute(int tag) : Attribute +{ + public int Tag { get; } = tag; +} + +// Property/parameter attributes + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborOrderAttribute(int order) : Attribute +{ + public int Order { get; } = order; +} + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborPropertyAttribute : Attribute +{ + public string StringKey { get; } + public int? IntKey { get; } + public bool IsIntKey { get; } + + // Constructor for string keys + public CborPropertyAttribute(string key) + { + StringKey = key; + IntKey = null; + IsIntKey = false; + } + + // Constructor for integer keys + public CborPropertyAttribute(int key) + { + StringKey = key.ToString(); + IntKey = key; + IsIntKey = true; + } +} + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborSizeAttribute(int size) : Attribute +{ + public int Size { get; } = size; +} + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborIndefiniteAttribute : Attribute +{ + public CborIndefiniteAttribute() { } +} + +// Validation attributes + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborValidateExactAttribute(object expectedValue) : Attribute +{ + public object ExpectedValue { get; } = expectedValue; +} + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborValidateRangeAttribute(double minimum, double maximum) : Attribute +{ + public double Minimum { get; } = minimum; + public double Maximum { get; } = maximum; +} + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)] +public sealed class CborValidateAttribute(Type validatorType) : Attribute +{ + public Type ValidatorType { get; } = validatorType; +} + diff --git a/src/Chrysalis.Cbor/Serialization/CborOptions.cs b/src/Chrysalis.Cbor/Serialization/CborOptions.cs new file mode 100644 index 00000000..83b98cdd --- /dev/null +++ b/src/Chrysalis.Cbor/Serialization/CborOptions.cs @@ -0,0 +1,49 @@ +using System.Reflection; + +namespace Chrysalis.Cbor.Serialization; + +public partial record CborOptions +{ + public static readonly CborOptions Default = new(); + + public int Index { get; init; } = -1; + public bool IsDefinite { get; init; } = false; + public int? Tag { get; init; } = -1; + public int? Size { get; init; } = -1; + public Type? ObjectType { get; } + public Type? NormalizedType { get; } + public Type? ConverterType { get; } + public Type? RuntimeType { get; set; } + public object? ExactValue { get; set; } + public ConstructorInfo? Constructor { get; set; } + public IReadOnlyDictionary? IndexPropertyMapping { get; } + public IReadOnlyDictionary? NamedPropertyMapping { get; } + public IReadOnlyCollection? UnionTypes { get; } + + public CborOptions( + int index = -1, + bool isDefinite = false, + int tag = -1, + int size = -1, + Type? objectType = null, + Type? normalizedType = null, + Type? converterType = null, + IReadOnlyDictionary? indexPropertyMapping = null, + IReadOnlyDictionary? namedPropertyMapping = null, + IReadOnlyCollection? unionTypes = null, + ConstructorInfo? constructor = null + ) + { + Index = index; + IsDefinite = isDefinite; + Tag = tag; + Size = size; + ObjectType = objectType; + NormalizedType = normalizedType; + ConverterType = converterType; + IndexPropertyMapping = indexPropertyMapping; + NamedPropertyMapping = namedPropertyMapping; + UnionTypes = unionTypes; + Constructor = constructor; + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Serialization/CborSerializer.cs b/src/Chrysalis.Cbor/Serialization/CborSerializer.cs new file mode 100644 index 00000000..b923ad95 --- /dev/null +++ b/src/Chrysalis.Cbor/Serialization/CborSerializer.cs @@ -0,0 +1,67 @@ +using System.Formats.Cbor; +using System.Runtime.CompilerServices; +using Chrysalis.Cbor.Serialization.Utils; +using Chrysalis.Cbor.Types; + + +namespace Chrysalis.Cbor.Serialization; + +/// +/// Provides methods to serialize and deserialize objects to and from CBOR. +/// +public static class CborSerializer +{ + /// + /// Serializes a CborBase-derived object to a Concise Binary Object Representation (CBOR) byte array. + /// + /// The type of object to serialize, which must inherit from CborBase. + /// The object instance to serialize. If this object already contains serialized data in its Raw property, that data will be returned directly. + /// A byte array containing the CBOR-encoded representation of the object. + /// + /// This method performs the following steps: + /// 1. Checks if the object already contains pre-serialized data (Raw property) + /// 2. If not, creates a new CborWriter with Lax conformance mode + /// 3. Retrieves type-specific serialization options from the CborRegistry + /// 4. Delegates to the appropriate serialization implementation + /// 5. Encodes and returns the final byte array + /// + /// Thrown when an error occurs during serialization. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte[] Serialize(T value) where T : CborBase + { + if (value.Raw is not null) + { + return value.Raw.Value.ToArray(); + } + + CborWriter writer = new(CborConformanceMode.Lax); + GenericSerializationUtil.Write(writer, value); + + return writer.Encode(); + } + + /// + /// Deserializes a CBOR byte array into an object of type T. + /// + /// The target type for deserialization, which must inherit from CborBase. + /// The CBOR-encoded byte array to deserialize. + /// A deserialized instance of type T with its Raw property set to the input data. + /// + /// This method performs the following steps: + /// 1. Creates a new CborReader with the provided data and Lax conformance mode + /// 2. Retrieves type-specific deserialization options from the CborRegistry + /// 3. Delegates to the appropriate deserialization implementation + /// 4. Casts the result to CborBase and validates it is non-null + /// 5. Stores the original byte array in the instance's Raw property + /// 6. Returns the typed instance + /// + /// Thrown when an error occurs during deserialization. + /// Thrown when the deserialized type does not match the expected type. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T Deserialize(ReadOnlyMemory data) where T : CborBase + { + CborReader reader = new(data, CborConformanceMode.Lax); + T? result = GenericSerializationUtil.Read(reader); + return result ?? throw new Exception("Deserialization failed: result is null."); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Serialization/ICborConverter.cs b/src/Chrysalis.Cbor/Serialization/ICborConverter.cs new file mode 100644 index 00000000..fcb4d773 --- /dev/null +++ b/src/Chrysalis.Cbor/Serialization/ICborConverter.cs @@ -0,0 +1,9 @@ +using System.Formats.Cbor; + +namespace Chrysalis.Cbor.Serialization; + +public interface ICborConverter +{ + void Write(CborWriter writer, List value, CborOptions options); + object? Read(CborReader reader, CborOptions options); +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Serialization/ICborPreserveRaw.cs b/src/Chrysalis.Cbor/Serialization/ICborPreserveRaw.cs new file mode 100644 index 00000000..7e3cb566 --- /dev/null +++ b/src/Chrysalis.Cbor/Serialization/ICborPreserveRaw.cs @@ -0,0 +1,3 @@ +namespace Chrysalis.Cbor.Serialization; + +public interface ICborPreserveRaw { } diff --git a/src/Chrysalis.Cbor/Serialization/ICborValidator.cs b/src/Chrysalis.Cbor/Serialization/ICborValidator.cs new file mode 100644 index 00000000..3a7019d3 --- /dev/null +++ b/src/Chrysalis.Cbor/Serialization/ICborValidator.cs @@ -0,0 +1,6 @@ +namespace Chrysalis.Cbor.Serialization; + +public interface ICborValidator +{ + bool Validate(T input); +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Serialization/Utils/GenericSerializationUtil.cs b/src/Chrysalis.Cbor/Serialization/Utils/GenericSerializationUtil.cs new file mode 100644 index 00000000..ee52d430 --- /dev/null +++ b/src/Chrysalis.Cbor/Serialization/Utils/GenericSerializationUtil.cs @@ -0,0 +1,745 @@ + +using System.Collections.Concurrent; +using System.Formats.Cbor; +using System.Reflection; +using System.Runtime.CompilerServices; +using Chrysalis.Cbor.Types.Primitives; + +namespace Chrysalis.Cbor.Serialization.Utils; + +public delegate T ReadDelegate(ReadOnlyMemory data); +public delegate void WriteDelegate(CborWriter writer, T value); + +public static class GenericSerializationUtil +{ + private static readonly ConcurrentDictionary ReadMethodCache = []; + private static readonly ConcurrentDictionary WriteMethodCache = []; + + #region Read + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T? Read(CborReader reader) + { + if (IsPrimitiveType(typeof(T))) + { + return ReadPrimitive(reader); + } + else + { + return ReadNonPrimitive(reader); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static object? Read(CborReader reader, Type type) + { + if (IsPrimitiveType(type)) + { + return ReadPrimitive(type, reader); + } + else + { + return ReadNonPrimitive(type, reader); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static object? Read(CborReader reader, object? value) + { + Type? type = value?.GetType(); + + if (type == null) + { + return null; + } + + if (IsPrimitiveType(type)) + { + return ReadPrimitive(type, reader); + } + else + { + return ReadNonPrimitive(type, reader); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsPrimitiveType(Type type) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + type = Nullable.GetUnderlyingType(type)!; + } + + // Now check if the type is a primitive type or one of the supported types + return type == typeof(bool) || + type == typeof(int) || + type == typeof(uint) || + type == typeof(long) || + type == typeof(ulong) || + type == typeof(float) || + type == typeof(double) || + type == typeof(decimal) || + type == typeof(string) || + type == typeof(byte[]) || + type == typeof(CborEncodedValue); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T? ReadPrimitive(CborReader reader) + { + Type type = typeof(T); + + // Handle nullable types by getting the underlying type + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + // Get the underlying type of the nullable + type = Nullable.GetUnderlyingType(type)!; + } + + // Handle primitive types (including nullable ones) + if (type == typeof(bool)) + return (T)(object)reader.ReadBoolean(); + if (type == typeof(int)) + return (T)(object)reader.ReadInt32(); + if (type == typeof(uint)) + return (T)(object)reader.ReadUInt32(); + if (type == typeof(long)) + return (T)(object)reader.ReadInt64(); + if (type == typeof(ulong)) + return (T)(object)reader.ReadUInt64(); + if (type == typeof(float)) + return (T)(object)reader.ReadSingle(); + if (type == typeof(double)) + return (T)(object)reader.ReadDouble(); + if (type == typeof(decimal)) + return (T)(object)reader.ReadDecimal(); + if (type == typeof(string)) + return (T)(object)reader.ReadTextString(); + if (type == typeof(byte[])) + return (T)(object)ReadByteArray(reader); + if (type == typeof(CborEncodedValue)) + return (T)(object)new CborEncodedValue(reader.ReadEncodedValue().ToArray()); + + // Special handling for nullable types + if (Nullable.GetUnderlyingType(type) != null) + { + // Handle the nullable case (reading the underlying type) + object? value = ReadPrimitive(Nullable.GetUnderlyingType(type)!, reader); // Recursively call to read underlying type + return (T?)value; // Convert back to Nullable + } + + throw new NotSupportedException($"Type {type} is not supported as a primitive type."); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static object? ReadPrimitive(Type type, CborReader reader) + { + // Handle nullable types by checking the underlying type + if (Nullable.GetUnderlyingType(type) != null) + { + // Get the underlying type of the nullable + Type underlyingType = Nullable.GetUnderlyingType(type)!; + + // Read the value for the underlying type (it could be null) + object? value = ReadPrimitive(underlyingType, reader); + + // If value is null, return it as Nullable (null wrapped in nullable type) + if (value == null) + { + return null; // This will return a nullable type (e.g., ulong?) + } + + // Convert the value to the nullable type (T?) + return value; + } + + // Handle non-nullable types + if (type == typeof(bool)) + return reader.ReadBoolean(); + if (type == typeof(int)) + return reader.ReadInt32(); + if (type == typeof(uint)) + return reader.ReadUInt32(); + if (type == typeof(long)) + return reader.ReadInt64(); + if (type == typeof(ulong)) + return reader.ReadUInt64(); + if (type == typeof(float)) + return reader.ReadSingle(); + if (type == typeof(double)) + return reader.ReadDouble(); + if (type == typeof(decimal)) + return reader.ReadDecimal(); + if (type == typeof(string)) + return reader.ReadTextString(); + if (type == typeof(byte[])) + return ReadByteArray(reader); + if (type == typeof(CborEncodedValue)) + return new CborEncodedValue(reader.ReadEncodedValue().ToArray()); + + throw new NotSupportedException($"Type {type} is not supported as a primitive type."); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static byte[] ReadByteArray(CborReader reader) + { + if (reader.PeekState() == CborReaderState.StartIndefiniteLengthByteString) + { + reader.ReadStartIndefiniteLengthByteString(); + using var stream = new MemoryStream(); + while (reader.PeekState() != CborReaderState.EndIndefiniteLengthByteString) + { + byte[] chunk = reader.ReadByteString(); + stream.Write(chunk, 0, chunk.Length); + } + reader.ReadEndIndefiniteLengthByteString(); + return stream.ToArray(); + } + else + { + return reader.ReadByteString(); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T ReadNonPrimitive(CborReader reader) + { + // Read the encoded value + ReadOnlyMemory encodedValue = reader.ReadEncodedValue(); + + try + { + // Check if we have already cached the delegate for this type + if (!ReadMethodCache.TryGetValue(typeof(T), out var readDelegate)) + { + // If not cached, use reflection to find the Read method and create a delegate + var readMethod = typeof(T).GetMethod("Read", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, new[] { typeof(ReadOnlyMemory) }, null) ?? throw new NotSupportedException($"Type {typeof(T).FullName} does not have a valid static Read method."); + + // Create the delegate and cache it + readDelegate = (ReadDelegate)Delegate.CreateDelegate(typeof(ReadDelegate), readMethod); + ReadMethodCache[typeof(T)] = readDelegate; + } + + // Invoke the cached delegate + return ((ReadDelegate)readDelegate)(encodedValue); + } + catch (Exception ex) + { + // Log and throw any errors that occur + throw new InvalidOperationException($"Failed to read type {typeof(T).FullName}: {ex.Message}", ex); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static object? ReadNonPrimitive(Type type, CborReader reader) + { + // Read the encoded value + ReadOnlyMemory encodedValue = reader.ReadEncodedValue(); + + try + { + // Handle nullable types: check if type is Nullable + if (Nullable.GetUnderlyingType(type) != null) + { + // Get the underlying type (e.g., ulong for ulong?) + Type underlyingType = Nullable.GetUnderlyingType(type)!; + + // Check if we have already cached the delegate for the underlying type + if (!ReadMethodCache.TryGetValue(underlyingType, out var readDelegate)) + { + // If not cached, use reflection to find the Read method and create a delegate + var readMethod = underlyingType.GetMethod("Read", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, new[] { typeof(ReadOnlyMemory) }, null) + ?? throw new NotSupportedException($"Type {underlyingType.FullName} does not have a valid static Read method."); + + // Create the delegate for the specific type + readDelegate = (Delegate)Delegate.CreateDelegate(typeof(ReadDelegate<>).MakeGenericType(underlyingType), readMethod); + ReadMethodCache[underlyingType] = readDelegate; + } + + // Invoke the cached delegate for the underlying type and return the result wrapped as Nullable + object? result = readDelegate.DynamicInvoke(encodedValue); + return result == null ? null : Convert.ChangeType(result, type); + } + + // Handle non-nullable types: Use delegates for non-nullable types as well + if (!ReadMethodCache.TryGetValue(type, out var readDelegateNonNullable)) + { + // If not cached, use reflection to find the Read method and create a delegate + var readMethod = type.GetMethod("Read", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, new[] { typeof(ReadOnlyMemory) }, null) + ?? throw new NotSupportedException($"Type {type.FullName} does not have a valid static Read method."); + + // Create the delegate for the specific type + readDelegateNonNullable = (Delegate)Delegate.CreateDelegate(typeof(ReadDelegate<>).MakeGenericType(type), readMethod); + ReadMethodCache[type] = readDelegateNonNullable; + } + + // Invoke the cached delegate for the non-nullable type + return readDelegateNonNullable.DynamicInvoke(encodedValue); + } + catch (Exception ex) when (ex is not InvalidOperationException) + { + // Provide better diagnostics + throw new InvalidOperationException($"Failed to read type {type.FullName} via delegate invocation: {ex.Message}", ex); + } + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static List ReadList(CborReader reader) + { + List result = []; + reader.ReadStartArray(); + + while (reader.PeekState() != CborReaderState.EndArray) + { + T item; + if (IsPrimitiveType(typeof(T))) + { + item = ReadPrimitive(reader)!; + } + else + { + item = ReadNonPrimitive(reader); + } + result.Add(item!); + } + + reader.ReadEndArray(); + return result; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Dictionary ReadDictionary(CborReader reader) + where TKey : notnull + { + Dictionary result = []; + reader.ReadStartMap(); + + while (reader.PeekState() != CborReaderState.EndMap) + { + TKey key; + if (IsPrimitiveType(typeof(TKey))) + { + key = ReadPrimitive(reader)!; + } + else + { + key = ReadNonPrimitive(reader); + } + + TValue? value; + if (IsPrimitiveType(typeof(TValue))) + { + value = ReadPrimitive(reader); + } + else + { + value = ReadNonPrimitive(reader); + } + + result.Add(key, value); + } + + reader.ReadEndMap(); + return result; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static dynamic? ConvertValue(object value, Type targetType) + { + if (value == null) return null; + if (value.GetType() == targetType) return value; + if (targetType.IsPrimitive || targetType == typeof(string) || targetType == typeof(decimal)) + return Convert.ChangeType(value, targetType); + + return value; + } + #endregion + + #region Write + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Write(CborWriter writer, T value) + { + if (IsPrimitiveType(typeof(T))) + { + WritePrimitive(writer, value); + } + else + { + WriteNonPrimitive(writer, value); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Write(CborWriter writer, object? value, Type type) + { + if (IsPrimitiveType(type)) + { + WritePrimitive(writer, value, type); + } + else + { + WriteNonPrimitive(writer, value, type); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Write(CborWriter writer, object? value) + { + Type? type = value?.GetType(); + + if (IsPrimitiveType(type!)) + { + WritePrimitive(writer, value, type!); + } + else + { + WriteNonPrimitive(writer, value, type!); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WritePrimitive(CborWriter writer, object? value, Type type) + { + // Handle nullable types by checking the underlying type + if (Nullable.GetUnderlyingType(type) != null) + { + // Get the underlying type of the nullable + type = Nullable.GetUnderlyingType(type)!; + } + + // Use a switch statement to handle different types + switch (type) + { + case Type t when t == typeof(bool): + if (value is bool boolValue) + writer.WriteBoolean(boolValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(int): + if (value is int intValue) + writer.WriteInt32(intValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(uint): + if (value is uint uintValue) + writer.WriteUInt32(uintValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(long): + if (value is long longValue) + writer.WriteInt64(longValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(ulong): + if (value is ulong ulongValue) + writer.WriteUInt64(ulongValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(float): + if (value is float floatValue) + writer.WriteSingle(floatValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(double): + if (value is double doubleValue) + writer.WriteDouble(doubleValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(decimal): + if (value is decimal decimalValue) + writer.WriteDecimal(decimalValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(string): + if (value is string stringValue) + writer.WriteTextString(stringValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(byte[]): + if (value is byte[] bytesValue) + writer.WriteByteString(bytesValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(CborEncodedValue): + if (value is CborEncodedValue encodedValue) + { + writer.WriteTag(CborTag.EncodedCborDataItem); + writer.WriteByteString(encodedValue.Value); + } + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + default: + throw new NotSupportedException($"Type {type} is not supported as a primitive type."); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WritePrimitive(CborWriter writer, object? value) + { + Type type = typeof(T); + // Handle nullable types by checking the underlying type + if (Nullable.GetUnderlyingType(type) != null) + { + // Get the underlying type of the nullable + type = Nullable.GetUnderlyingType(type)!; + } + + // Use a switch statement to handle different types + switch (type) + { + case Type t when t == typeof(bool): + if (value is bool boolValue) + writer.WriteBoolean(boolValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(int): + if (value is int intValue) + writer.WriteInt32(intValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(uint): + if (value is uint uintValue) + writer.WriteUInt32(uintValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(long): + if (value is long longValue) + writer.WriteInt64(longValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(ulong): + if (value is ulong ulongValue) + writer.WriteUInt64(ulongValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(float): + if (value is float floatValue) + writer.WriteSingle(floatValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(double): + if (value is double doubleValue) + writer.WriteDouble(doubleValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(decimal): + if (value is decimal decimalValue) + writer.WriteDecimal(decimalValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(string): + if (value is string stringValue) + writer.WriteTextString(stringValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(byte[]): + if (value is byte[] bytesValue) + writer.WriteByteString(bytesValue); + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + case Type t when t == typeof(CborEncodedValue): + if (value is CborEncodedValue encodedValue) + { + writer.WriteTag(CborTag.EncodedCborDataItem); + writer.WriteByteString(encodedValue.Value); + } + else + throw new InvalidCastException($"Value is not of type {type}"); + break; + + default: + throw new NotSupportedException($"Type {type} is not supported as a primitive type."); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteNonPrimitive(CborWriter writer, T value) + { + try + { + // Check if we have already cached the delegate for this type + if (!WriteMethodCache.TryGetValue(typeof(T), out var writeDelegate)) + { + // If not cached, use reflection to find the Write method and create a delegate + var writeMethod = typeof(T).GetMethod("Write", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, new[] { typeof(CborWriter), typeof(T) }, null) + ?? throw new NotSupportedException($"Type {typeof(T).FullName} does not have a valid static Write method."); + + // Create the delegate and cache it + writeDelegate = (WriteDelegate)Delegate.CreateDelegate(typeof(WriteDelegate), writeMethod); + WriteMethodCache[typeof(T)] = writeDelegate; + } + + // Invoke the cached delegate + ((WriteDelegate)writeDelegate)(writer, value); + } + catch (Exception ex) + { + // Log and throw any errors that occur + throw new InvalidOperationException($"Failed to write type {typeof(T).FullName}: {ex.Message}", ex); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteNonPrimitive(CborWriter writer, object? value, Type type) + { + try + { + // Handle nullable types: check if type is Nullable + if (Nullable.GetUnderlyingType(type) != null) + { + // Get the underlying type (e.g., ulong for ulong?) + Type underlyingType = Nullable.GetUnderlyingType(type)!; + + // Use the underlying type for the rest of the method + type = underlyingType; + } + + // Check if we have already cached the delegate for this type + if (!WriteMethodCache.TryGetValue(type, out var writeDelegate)) + { + // Find the appropriate Write method + var writeMethod = type.GetMethod("Write", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, new[] { typeof(CborWriter), type }, null) + ?? throw new NotSupportedException($"Type {type.FullName} does not have a valid static Write method."); + + // Create delegate type for the specific type + Type delegateType = typeof(WriteDelegate<>).MakeGenericType(type); + + // Create and cache the delegate + writeDelegate = Delegate.CreateDelegate(delegateType, writeMethod); + WriteMethodCache[type] = writeDelegate; + } + + // Invoke the cached delegate with the appropriate value + writeDelegate.DynamicInvoke(writer, value); + } + catch (Exception ex) when (ex is not InvalidOperationException) + { + // Provide better diagnostics + throw new InvalidOperationException($"Failed to write type {type.FullName} via delegate invocation: {ex.Message}", ex); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteList(CborWriter writer, List list) + { + writer.WriteStartArray(list.Count); + + foreach (var item in list) + { + if (IsPrimitiveType(typeof(T))) + { + WritePrimitive(writer, item); + } + else + { + WriteNonPrimitive(writer, item); + } + } + + writer.WriteEndArray(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteDictionary(CborWriter writer, Dictionary dictionary) + where TKey : notnull + { + + writer.WriteStartMap(dictionary.Count); + + foreach (var kvp in dictionary) + { + // Write key + if (IsPrimitiveType(typeof(TKey))) + { + WritePrimitive(writer, kvp.Key); + } + else + { + WriteNonPrimitive(writer, kvp.Key); + } + + if (IsPrimitiveType(typeof(TValue))) + { + WritePrimitive(writer, kvp.Value); + } + else + { + WriteNonPrimitive(writer, kvp.Value!); + } + } + + writer.WriteEndMap(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteByteArray(CborWriter writer, byte[] data, int chunkSize = 1024) + { + if (data.Length <= chunkSize) + { + // Write as a single byte string if it's small enough + writer.WriteByteString(data); + } + else + { + // Write as chunked byte string for larger data + writer.WriteStartIndefiniteLengthByteString(); + + for (int i = 0; i < data.Length; i += chunkSize) + { + int length = Math.Min(chunkSize, data.Length - i); + byte[] chunk = new byte[length]; + Array.Copy(data, i, chunk, 0, length); + writer.WriteByteString(chunk); + } + + writer.WriteEndIndefiniteLengthByteString(); + } + } + + #endregion +} diff --git a/src/Chrysalis.Cbor/Types/CborBase.cs b/src/Chrysalis.Cbor/Types/CborBase.cs new file mode 100644 index 00000000..7776f2d0 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/CborBase.cs @@ -0,0 +1,62 @@ +using System.Formats.Cbor; + +namespace Chrysalis.Cbor.Types; + +/// +/// Base class for all CBOR-serializable types +/// +/// +/// Base class for all CBOR-serializable types +/// +public abstract partial record CborBase where T : CborBase +{ + // Raw serialized data for caching and quick re-serialization + public ReadOnlyMemory? Raw { get; set; } + + // Type discriminator for unions (to avoid reflection) + // save the fully qualified name of the type + public virtual string? CborTypeName + { + get + { + Type type = GetType(); + + if (type.IsGenericType) + { + // Get the generic type definition + Type genericTypeDef = type.GetGenericTypeDefinition(); + + // Get the namespace and simple type name + string ns = type.Namespace ?? ""; + string baseName = type.Name; + + // Remove the `n and everything after it from the name + int backtickIndex = baseName.IndexOf('`'); + if (backtickIndex > 0) + { + baseName = baseName[..backtickIndex]; + } + + // Get the generic parameter names from the type definition + Type[] genericParams = genericTypeDef.GetGenericArguments(); + string typeParams = string.Join(", ", genericParams.Select(p => p.Name)); + + return $"{ns}.{baseName}<{typeParams}>"; + } + + return type.FullName; + } + } + + public int ConstrIndex { get; set; } = 0; + + public static T Read(ReadOnlyMemory data) + { + throw new NotImplementedException("Read method not implemented for " + typeof(T).Name); + } + + public static ReadOnlyMemory Write(CborWriter writer, T value) + { + throw new NotImplementedException("Write method not implemented for " + typeof(T).Name); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Types/Custom/CborMaybeIndefList.cs b/src/Chrysalis.Cbor/Types/Custom/CborMaybeIndefList.cs new file mode 100644 index 00000000..71feab4f --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Custom/CborMaybeIndefList.cs @@ -0,0 +1,30 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Types.Custom; + +[CborSerializable] +[CborUnion] +public abstract partial record CborMaybeIndefList : CborBase> +{ +} + +[CborSerializable] +public partial record CborDefList(List Value) : CborMaybeIndefList; + + +[CborSerializable] +public partial record CborIndefList(List Value) : CborMaybeIndefList; + + +[CborSerializable] +[CborTag(258)] +public partial record CborDefListWithTag(List Value) : CborMaybeIndefList; + + +[CborSerializable] +[CborTag(258)] +public partial record CborIndefListWithTag( + [CborIndefinite] + List Value +) : CborMaybeIndefList; diff --git a/src/Chrysalis.Cbor/Types/Primitives/CborEncodedValue.cs b/src/Chrysalis.Cbor/Types/Primitives/CborEncodedValue.cs new file mode 100644 index 00000000..4a852415 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Primitives/CborEncodedValue.cs @@ -0,0 +1,6 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Types.Primitives; + +[CborSerializable] +public partial record CborEncodedValue(byte[] Value) : CborBase; diff --git a/src/Chrysalis.Cbor/Types/Primitives/CborRationalNumber.cs b/src/Chrysalis.Cbor/Types/Primitives/CborRationalNumber.cs new file mode 100644 index 00000000..d75507a1 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Primitives/CborRationalNumber.cs @@ -0,0 +1,11 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Types.Primitives; + +[CborSerializable] +[CborTag(30)] +[CborList] +public partial record CborRationalNumber( + [CborOrder(0)] ulong Numerator, + [CborOrder(1)] ulong Denominator +) : CborBase; diff --git a/src/Chrysalis.Cbor/Types/Primitives/Option.cs b/src/Chrysalis.Cbor/Types/Primitives/Option.cs new file mode 100644 index 00000000..a1939d87 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Primitives/Option.cs @@ -0,0 +1,17 @@ +// using Chrysalis.Cbor.Serialization.Attributes; + +// namespace Chrysalis.Cbor.Types.Primitives; + +// [CborSerializable] +// [CborUnion] +// public abstract partial record Option : CborBase> +// { +// [CborSerializable] +// [CborConstr(0)] +// public partial record Some([CborOrder(0)] T Value) : Option; + + +// [CborSerializable] +// [CborConstr(1)] +// public partial record None : Option; +// } \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Types/Test/TestArray.cs b/src/Chrysalis.Cbor/Types/Test/TestArray.cs new file mode 100644 index 00000000..ea27db25 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Test/TestArray.cs @@ -0,0 +1,23 @@ + +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types.Custom; + +namespace Chrysalis.Cbor.Types.Test; + +[CborSerializable] +[CborList] +public partial record TestList( + [CborOrder(0)] + int Value1, + [CborOrder(1)] + List Value2, + [CborOrder(2)] + Dictionary Value3 +) : CborBase; + +[CborSerializable] +[CborList] +public partial record TestListMaybe( + [CborOrder(0)] + CborMaybeIndefList Value1 +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Types/Test/TestConstr.cs b/src/Chrysalis.Cbor/Types/Test/TestConstr.cs new file mode 100644 index 00000000..229d0567 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Test/TestConstr.cs @@ -0,0 +1,27 @@ + +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types.Primitives; + +namespace Chrysalis.Cbor.Types.Test; + +[CborSerializable] +[CborConstr(0)] +public partial record TestConstr( + [CborOrder(0)] + int IntValue, + [CborOrder(1)][CborSize(32)] + byte[] BoundedBytesValue, + [CborOrder(2)] + byte[] UnboundedBytesValue, + [CborOrder(3)][CborNullable] + CborEncodedValue? EncodedValue +) : CborBase, ICborPreserveRaw; + +public class TestConstrValidator : ICborValidator +{ + public bool Validate(TestConstr input) + { + return true; + } +} \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Types/Test/TestMap.cs b/src/Chrysalis.Cbor/Types/Test/TestMap.cs new file mode 100644 index 00000000..2c9add13 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Test/TestMap.cs @@ -0,0 +1,19 @@ + +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Types.Test; + +[CborSerializable] +[CborMap] +public partial record TestMap( + [CborProperty(0)] + int Value1, + [CborProperty(1)] + byte[] Value2, + [CborProperty(2)] + string Value3, + [CborProperty(3)] + bool Value4, + [CborProperty(4)] + long Value6 +) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Types/Test/TestNullableMap.cs b/src/Chrysalis.Cbor/Types/Test/TestNullableMap.cs new file mode 100644 index 00000000..4ec72b92 --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Test/TestNullableMap.cs @@ -0,0 +1,22 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Types.Test; + +// Creating a nullable serializable type +[CborSerializable] +[CborMap] +public partial record NullableTestMap( + [CborProperty(0)] + int Value1, + [CborProperty(1)] + string Value2 +) : CborBase; + +[CborSerializable] +public partial record CborContainerSimpleTest(int Value1) : CborBase; + +[CborSerializable] +public partial record CborContainerConstrTest(TestConstr Value1) : CborBase; + +[CborSerializable] +public partial record CborContainerGenericTest(T Value1) : CborBase>; \ No newline at end of file diff --git a/src/Chrysalis.Cbor/Types/Test/TestUnion.cs b/src/Chrysalis.Cbor/Types/Test/TestUnion.cs new file mode 100644 index 00000000..6cc1387d --- /dev/null +++ b/src/Chrysalis.Cbor/Types/Test/TestUnion.cs @@ -0,0 +1,70 @@ +using Chrysalis.Cbor.Serialization.Attributes; + +namespace Chrysalis.Cbor.Types.Test; + +[CborSerializable] +[CborUnion] +public abstract partial record TestUnion : CborBase +{ + [CborSerializable] + [CborList] + public partial record TestListUnion( + [CborOrder(0)] + int Value1, + [CborOrder(1)] + List Value2, + [CborOrder(2)] + Dictionary Value3 + ) : TestUnion; + + [CborSerializable] + [CborConstr(0)] + public partial record TestConstrUnion( + [CborOrder(0)] + int Value1, + [CborOrder(1)] + byte[] Value2, + [CborOrder(2)] + string Value3, + [CborOrder(3)] + bool Value4, + [CborOrder(4)] + long Value6, + [CborOrder(5)] + float Value7, + [CborOrder(6)] + double Value8, + [CborOrder(7)] + decimal Value9, + [CborOrder(8)] + uint Value11, + [CborOrder(9)] + ulong Value12 + ) : TestUnion; + + [CborSerializable] + [CborMap] + public partial record TestMapUnion( + [CborProperty(0)] + int Value1, + [CborProperty(1)] + byte[] Value2, + [CborProperty(2)] + string Value3, + [CborProperty(3)] + bool Value4, + [CborProperty(4)] + long Value6 + ) : TestUnion; + + + [CborSerializable] + [CborMap] + public partial record NullableTestMapUnion( + [CborProperty(0)] + int Value1, + [CborProperty(1)] + [CborNullable] + string Value2 + ) : TestUnion; +} \ No newline at end of file diff --git a/src/Chrysalis.Network.Cli/BlockDbHelper.cs b/src/Chrysalis.Network.Cli/BlockDbHelper.cs new file mode 100644 index 00000000..edb151b6 --- /dev/null +++ b/src/Chrysalis.Network.Cli/BlockDbHelper.cs @@ -0,0 +1,43 @@ +using Dapper; +using Npgsql; + +namespace Chrysalis.Network.Cli; + +public static class BlockDbHelper +{ + private static readonly string ConnectionString = "Host=localhost;Database=chrysalis-cs;Username=postgres;Password=test1234;Port=5432;Include Error Detail=true;"; + + public static async Task InitializeDbAsync() + { + using var connection = new NpgsqlConnection(ConnectionString); + await connection.OpenAsync(); + + // Drop the table if it exists + await connection.ExecuteAsync("DROP TABLE IF EXISTS blocks"); + + // Create a fresh table with minimal columns + await connection.ExecuteAsync(@" + CREATE TABLE blocks ( + block_number BIGINT NOT NULL, + block_slot BIGINT NOT NULL, + block_hash VARCHAR(64) NOT NULL, + timestamp TIMESTAMP NOT NULL DEFAULT NOW() + )"); + + Console.WriteLine("Database table cleared and recreated"); + } + + public static async Task InsertBlockAsync(ulong blockNumber, ulong blockSlot, string blockHash) + { + using var connection = new NpgsqlConnection(ConnectionString); + await connection.OpenAsync(); + await connection.ExecuteAsync( + "INSERT INTO blocks (block_number, block_slot, block_hash) VALUES (@BlockNumber, @BlockSlot, @BlockHash)", + new + { + BlockNumber = (long)blockNumber, + BlockSlot = (long)blockSlot, + BlockHash = blockHash + }); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network.Cli/Chrysalis.Network.Cli.csproj b/src/Chrysalis.Network.Cli/Chrysalis.Network.Cli.csproj new file mode 100644 index 00000000..ee044654 --- /dev/null +++ b/src/Chrysalis.Network.Cli/Chrysalis.Network.Cli.csproj @@ -0,0 +1,22 @@ + + + + + + + + + + + + + Exe + net9.0 + enable + enable + + + + + + diff --git a/src/Chrysalis.Network.Cli/Program.cs b/src/Chrysalis.Network.Cli/Program.cs new file mode 100644 index 00000000..6e907bf7 --- /dev/null +++ b/src/Chrysalis.Network.Cli/Program.cs @@ -0,0 +1,155 @@ +using System.Formats.Cbor; +using Chrysalis.Cbor.Cardano.Types.Block; +using Chrysalis.Cbor.Cardano.Types.Block.Header.Body; +using Chrysalis.Network.Cbor.ChainSync; +using Chrysalis.Network.Cbor.Common; +using Chrysalis.Network.Cbor.Handshake; +using Chrysalis.Network.Cli; +using Chrysalis.Network.Multiplexer; + +NodeClient client = await NodeClient.ConnectAsync("/home/rjlacanlale/cardano/ipc/node.socket"); +client.Start(); + +ProposeVersions proposeVersion = HandshakeMessages.ProposeVersions(VersionTables.N2C_V10_AND_ABOVE); +CborWriter writer = new(); +ProposeVersions.Write(writer, proposeVersion); +string serialized = Convert.ToHexString(writer.Encode()); + +Console.WriteLine("Sending handshake message..."); +await client.Handshake!.SendAsync(proposeVersion, CancellationToken.None); +Console.WriteLine("Handshake success!!"); + +Point point = new(57371845, Convert.FromHexString("20a81db38339bf6ee9b1d7e22b22c0ac4d887d332bbf4f3005db4848cd647743")); + +Console.WriteLine("Finding Intersection..."); +await client.ChainSync!.FindIntersectionAsync([point], CancellationToken.None); +Console.WriteLine("Intersection found"); + +Console.WriteLine("Initializing Db..."); +await BlockDbHelper.InitializeDbAsync(); + +Console.WriteLine("Starting ChainSync..."); + +int blockCount = 0; +int deserializedCount = 0; +_ = Task.Run(async () => +{ + while (true) + { + Console.WriteLine($"Block count: {blockCount}, Deserialized: {deserializedCount}, Success rate: {(deserializedCount > 0 ? deserializedCount / blockCount * 100.0 : 0.0)}%"); + blockCount = 0; + deserializedCount = 0; + await Task.Delay(1000); + } +}); + +while (true) +{ + try + { + MessageNextResponse? nextResponse = await client.ChainSync!.NextRequestAsync(CancellationToken.None); + + switch (nextResponse) + { + case MessageRollBackward msg: + Console.WriteLine($"Rolling back to {msg.Point.Slot}"); + break; + case MessageRollForward msg: + try + { + Block? block = TestUtils.DeserializeBlockWithEra(msg.Payload.Value); + blockCount++; + deserializedCount++; + + ulong blockNumber = 0; + ulong blockSlot = 0; + string blockHash = string.Empty; + + switch (block) + { + case AlonzoCompatibleBlock alonzoBlock: + switch (alonzoBlock.Header.HeaderBody) + { + case AlonzoHeaderBody alonzoBlockHeaderBody: + blockNumber = alonzoBlockHeaderBody.BlockNumber; + blockSlot = alonzoBlockHeaderBody.Slot; + blockHash = Convert.ToHexString(alonzoBlockHeaderBody.BlockBodyHash); + break; + case BabbageHeaderBody babbageHeaderBody: + blockNumber = babbageHeaderBody.BlockNumber; + blockSlot = babbageHeaderBody.Slot; + blockHash = Convert.ToHexString(babbageHeaderBody.BlockBodyHash); + break; + default: + throw new NotSupportedException($"Unsupported Alonzo block header body: {alonzoBlock.Header.HeaderBody.GetType()}"); + } + break; + case BabbageBlock babbageBlock: + switch (babbageBlock.Header.HeaderBody) + { + case AlonzoHeaderBody alonzoHeaderBody: + blockNumber = alonzoHeaderBody.BlockNumber; + blockSlot = alonzoHeaderBody.Slot; + blockHash = Convert.ToHexString(alonzoHeaderBody.BlockBodyHash); + break; + case BabbageHeaderBody babbageHeaderBody: + blockNumber = babbageHeaderBody.BlockNumber; + blockSlot = babbageHeaderBody.Slot; + blockHash = Convert.ToHexString(babbageHeaderBody.BlockBodyHash); + break; + default: + throw new NotSupportedException($"Unsupported Babbage block header body: {babbageBlock.Header.HeaderBody.GetType()}"); + } + break; + case ConwayBlock conwayBlock: + switch (conwayBlock.Header.HeaderBody) + { + case AlonzoHeaderBody alonzoHeaderBody: + blockNumber = alonzoHeaderBody.BlockNumber; + blockSlot = alonzoHeaderBody.Slot; + blockHash = Convert.ToHexString(alonzoHeaderBody.BlockBodyHash); + break; + case BabbageHeaderBody babbageHeaderBody: + blockNumber = babbageHeaderBody.BlockNumber; + blockSlot = babbageHeaderBody.Slot; + blockHash = Convert.ToHexString(babbageHeaderBody.BlockBodyHash); + break; + default: + throw new NotSupportedException($"Unsupported Conway block header body: {conwayBlock.Header.HeaderBody.GetType()}"); + } + break; + default: + throw new NotSupportedException($"Unsupported block type: {block?.GetType()}"); + } + + // await BlockDbHelper.InsertBlockAsync(blockNumber, blockSlot, blockHash); + } + catch + { + CborReader reader = new(msg.Payload.Value, CborConformanceMode.Lax); + reader.ReadTag(); + reader = new(reader.ReadByteString(), CborConformanceMode.Lax); + reader.ReadStartArray(); + Era era = (Era)reader.ReadInt32(); + ReadOnlyMemory blockBytes = reader.ReadEncodedValue(true); + + + Console.WriteLine($"Failed to deserialize block: {Convert.ToHexString(blockBytes.ToArray())}"); + deserializedCount--; + throw; + } + break; + case MessageAwaitReply msg: + Console.WriteLine($"Block count: {blockCount}"); + blockCount = 0; + deserializedCount = 0; + Console.WriteLine("Tip reached!!!"); + break; + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + throw; + } +} diff --git a/src/Chrysalis.Network.Cli/TestUtils.cs b/src/Chrysalis.Network.Cli/TestUtils.cs new file mode 100644 index 00000000..2eaf7d2a --- /dev/null +++ b/src/Chrysalis.Network.Cli/TestUtils.cs @@ -0,0 +1,38 @@ +using System.Formats.Cbor; +using Chrysalis.Cbor.Cardano.Types.Block; +using Chrysalis.Cbor.Serialization; + +namespace Chrysalis.Network.Cli; + +public enum Era +{ + Unknown = 0, + Byron = 1, + Shelley = 2, + Allegra = 3, + Mary = 4, + Alonzo = 5, + Babbage = 6, + Conway = 7 +} + +public static class TestUtils +{ + public static Block? DeserializeBlockWithEra(byte[] blockCbor) + { + CborReader reader = new(blockCbor, CborConformanceMode.Lax); + reader.ReadTag(); + reader = new(reader.ReadByteString(), CborConformanceMode.Lax); + reader.ReadStartArray(); + Era era = (Era)reader.ReadInt32(); + ReadOnlyMemory blockBytes = reader.ReadEncodedValue(true); + + return era switch + { + Era.Shelley or Era.Allegra or Era.Mary or Era.Alonzo => AlonzoCompatibleBlock.Read(blockBytes), + Era.Babbage => BabbageBlock.Read(blockBytes), + Era.Conway => ConwayBlock.Read(blockBytes), + _ => throw new NotSupportedException($"Unsupported era: {era}") + }; + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/ChainSync/ChainSyncMessage.cs b/src/Chrysalis.Network/Cbor/ChainSync/ChainSyncMessage.cs new file mode 100644 index 00000000..dfbe9557 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/ChainSync/ChainSyncMessage.cs @@ -0,0 +1,77 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Primitives; +using Chrysalis.Network.Cbor.Common; + +namespace Chrysalis.Network.Cbor.ChainSync; + +[CborSerializable] +[CborUnion] +public partial record ChainSyncMessage : CborBase; + +[CborSerializable] +[CborUnion] +public partial record MessageNextResponse : ChainSyncMessage; + +[CborSerializable] +[CborList] +public partial record MessageNextRequest( + [CborOrder(0)] Value0 Idx +) : ChainSyncMessage; + +[CborSerializable] +[CborList] +public partial record MessageAwaitReply( + [CborOrder(0)] Value1 Idx +) : MessageNextResponse; + +[CborSerializable] +[CborList] +public partial record MessageRollForward( + [CborOrder(0)] Value2 Idx, + [CborOrder(1)] CborEncodedValue Payload, + [CborOrder(2)] Tip Tip +) : MessageNextResponse; + +[CborSerializable] +[CborList] +public partial record MessageRollBackward( + [CborOrder(0)] Value3 Idx, + [CborOrder(1)] Point Point, + [CborOrder(2)] Tip Tip +) : MessageNextResponse; + +[CborSerializable] +[CborList] +public partial record MessageFindIntersect( + [CborOrder(0)] Value4 Idx, + [CborOrder(1)] Points Points +) : ChainSyncMessage; + + +[CborSerializable] +[CborUnion] +public partial record MessageIntersectResult : ChainSyncMessage; + +[CborSerializable] +[CborList] +public partial record MessageIntersectFound( + [CborOrder(0)] Value5 Idx, + [CborOrder(1)] Point Point, + [CborOrder(2)] Tip Tip +) : MessageIntersectResult; + +[CborSerializable] +[CborList] +public partial record MessageIntersectNotFound( + [CborOrder(0)] Value6 Idx, + [CborOrder(1)] Point Point, + [CborOrder(2)] Tip Tip +) : MessageIntersectResult; + + +public static class ChainSyncMessages +{ + public static MessageNextRequest NextRequest() => new(new Value0(0)); + public static MessageFindIntersect FindIntersect(Points points) => new(new Value4(4), points); +} diff --git a/src/Chrysalis.Network/Cbor/Common/ExactValue.cs b/src/Chrysalis.Network/Cbor/Common/ExactValue.cs new file mode 100644 index 00000000..eabf49db --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Common/ExactValue.cs @@ -0,0 +1,75 @@ +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Common; + +[CborSerializable] +public partial record Value0(int Value) : CborBase; +public record Value0Validator : ICborValidator +{ + public bool Validate(Value0 input) => input.Value == 0; +} + +[CborSerializable] +public partial record Value1(int Value) : CborBase; +public record Value1Validator : ICborValidator +{ + public bool Validate(Value1 input) => input.Value == 1; +} + +[CborSerializable] +public partial record Value2(int Value) : CborBase; +public record Value2Validator : ICborValidator +{ + public bool Validate(Value2 input) => input.Value == 2; +} + +[CborSerializable] +public partial record Value3(int Value) : CborBase; +public record Value3Validator : ICborValidator +{ + public bool Validate(Value3 input) => input.Value == 3; +} + +[CborSerializable] +public partial record Value4(int Value) : CborBase; +public record Value4Validator : ICborValidator +{ + public bool Validate(Value4 input) => input.Value == 4; +} + +[CborSerializable] +public partial record Value5(int Value) : CborBase; +public record Value5Validator : ICborValidator +{ + public bool Validate(Value5 input) => input.Value == 5; +} + +[CborSerializable] +public partial record Value6(int Value) : CborBase; +public record Value6Validator : ICborValidator +{ + public bool Validate(Value6 input) => input.Value == 6; +} + +[CborSerializable] +public partial record Value7(int Value) : CborBase; +public record Value7Validator : ICborValidator +{ + public bool Validate(Value7 input) => input.Value == 7; +} + +[CborSerializable] +public partial record Value8(int Value) : CborBase; +public record Value8Validator : ICborValidator +{ + public bool Validate(Value8 input) => input.Value == 8; +} + +[CborSerializable] +public partial record Value9(int Value) : CborBase; +public record Value9Validator : ICborValidator +{ + public bool Validate(Value9 input) => input.Value == 9; +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/Common/Points.cs b/src/Chrysalis.Network/Cbor/Common/Points.cs new file mode 100644 index 00000000..518c51f9 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Common/Points.cs @@ -0,0 +1,14 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Common; + +[CborSerializable] +[CborList] +public partial record Point( + [CborOrder(0)] ulong Slot, + [CborOrder(1)] byte[] Hash +) : CborBase; + +[CborSerializable] +public partial record Points(List Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/Common/Tip.cs b/src/Chrysalis.Network/Cbor/Common/Tip.cs new file mode 100644 index 00000000..0cc56414 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Common/Tip.cs @@ -0,0 +1,11 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Common; + +[CborSerializable] +[CborList] +public partial record Tip( + [CborOrder(0)] Point Slot, + [CborOrder(1)] int BlockNumber +) : CborBase; diff --git a/src/Chrysalis.Network/Cbor/Handshake/HandshakeMessage.cs b/src/Chrysalis.Network/Cbor/Handshake/HandshakeMessage.cs new file mode 100644 index 00000000..c90607c9 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Handshake/HandshakeMessage.cs @@ -0,0 +1,99 @@ +using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; +using Chrysalis.Network.Cbor.Common; + +namespace Chrysalis.Network.Cbor.Handshake; + +[CborSerializable] +[CborUnion] +public abstract partial record HandshakeMessage : CborBase; + +public class HandshakeMessages +{ + public static ProposeVersions ProposeVersions(VersionTable versionTable) => + new(new Value0(0), versionTable); + + public static N2NAcceptVersion N2NAcceptVersion(N2NVersion version, N2NVersionData versionData) => + new(new Value1(1), version, versionData); + + public static N2CAcceptVersion N2CAcceptVersion(N2CVersion version, N2CVersionData versionData) => + new(new Value1(1), version, versionData); + + public static Refuse Refuse(RefuseReason reason) => + new(new Value2(2), reason); + + public static N2NQueryReply N2NQueryReply(N2NVersionTable versionTable) => + new(new Value3(3), versionTable); + + public static N2CQueryReply N2CQueryReply(N2CVersionTable versionTable) => + new(new Value3(3), versionTable); +} + +#region ProposeVersions +[CborSerializable] +[CborList] +public partial record ProposeVersions( + [CborOrder(0)] Value0 Idx, + [CborOrder(1)] VersionTable VersionTable +) : HandshakeMessage; + +#endregion + +#region AcceptVersions + +[CborSerializable] +[CborUnion] +public abstract partial record AcceptVersion : HandshakeMessage; + + +[CborSerializable] +[CborList] +public partial record N2NAcceptVersion( + [CborOrder(0)] Value1 Idx, + [CborOrder(1)] N2NVersion Version, + [CborOrder(2)] N2NVersionData VersionData +) : AcceptVersion; + +[CborSerializable] +[CborList] +public partial record N2CAcceptVersion( + [CborOrder(0)] Value1 Idx, + [CborOrder(1)] N2CVersion Version, + [CborOrder(2)] N2CVersionData VersionData +) : AcceptVersion; + + +#endregion + +#region Refuse +[CborSerializable] +[CborList] +public partial record Refuse( + [CborOrder(0)] Value2 Idx, + [CborOrder(1)] RefuseReason Reason +) : HandshakeMessage; + +#endregion + +#region Query +[CborSerializable] +[CborUnion] +public abstract partial record QueryReply : HandshakeMessage; + +[CborSerializable] +[CborList] +public partial record N2NQueryReply( + [CborOrder(0)] Value3 Idx, + [CborOrder(1)] N2NVersionTable VersionTable +) : QueryReply; + +[CborSerializable] +[CborList] +public partial record N2CQueryReply( + [CborOrder(0)] Value3 Idx, + [CborOrder(1)] N2CVersionTable VersionTable +) : QueryReply; + + +#endregion \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/Handshake/N2CVersion.cs b/src/Chrysalis.Network/Cbor/Handshake/N2CVersion.cs new file mode 100644 index 00000000..36706ff8 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Handshake/N2CVersion.cs @@ -0,0 +1,17 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Handshake; + +public static class N2CVersions +{ + public static N2CVersion V16 => new(32784); + public static N2CVersion V17 => new(32785); + public static N2CVersion V18 => new(32786); + public static N2CVersion V19 => new(32787); + public static N2CVersion V20 => new(32788); +} + +[CborSerializable] +public partial record N2CVersion(int Value) : CborBase; + diff --git a/src/Chrysalis.Network/Cbor/Handshake/N2CVersionData.cs b/src/Chrysalis.Network/Cbor/Handshake/N2CVersionData.cs new file mode 100644 index 00000000..05ce651a --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Handshake/N2CVersionData.cs @@ -0,0 +1,12 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Handshake; + +[CborSerializable] +[CborList] +public partial record N2CVersionData( + [CborOrder(0)] ulong NetworkMagic, + [CborOrder(1)] bool? Query +) : CborBase; + diff --git a/src/Chrysalis.Network/Cbor/Handshake/N2NVersion.cs b/src/Chrysalis.Network/Cbor/Handshake/N2NVersion.cs new file mode 100644 index 00000000..687cea3c --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Handshake/N2NVersion.cs @@ -0,0 +1,19 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Handshake; + +public static class N2NVersions +{ + public static N2NVersion V7 => new(7); + public static N2NVersion V8 => new(8); + public static N2NVersion V9 => new(9); + public static N2NVersion V10 => new(10); + public static N2NVersion V11 => new(11); + public static N2NVersion V12 => new(12); + public static N2NVersion V13 => new(13); + public static N2NVersion V14 => new(14); +} + +[CborSerializable] +public partial record N2NVersion(int Value) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/Handshake/N2NVersionData.cs b/src/Chrysalis.Network/Cbor/Handshake/N2NVersionData.cs new file mode 100644 index 00000000..fed0b34a --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Handshake/N2NVersionData.cs @@ -0,0 +1,14 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Handshake; + +[CborSerializable] +[CborList] +public partial record N2NVersionData( + [CborOrder(0)] ulong NetworkMagic, + [CborOrder(1)] bool InitiatorOnlyDiffusionMode, + [CborOrder(2)] int? PeerSharing, + [CborOrder(3)] bool? Query +) : CborBase; + diff --git a/src/Chrysalis.Network/Cbor/Handshake/RefuseReason.cs b/src/Chrysalis.Network/Cbor/Handshake/RefuseReason.cs new file mode 100644 index 00000000..013d2e10 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Handshake/RefuseReason.cs @@ -0,0 +1,34 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; +using Chrysalis.Cbor.Types.Custom; +using Chrysalis.Network.Cbor.Common; + +namespace Chrysalis.Network.Cbor.Handshake; + + +[CborSerializable] +[CborUnion] +public partial record RefuseReason : CborBase; + +[CborSerializable] +[CborList] +public partial record VersionMismatch( + [CborOrder(0)] Value0 Idx, + [CborOrder(1)] CborDefList VersionNumbers +) : RefuseReason; + +[CborSerializable] +[CborList] +public partial record HandshakeDecodeError( + [CborOrder(0)] Value1 Idx, + [CborOrder(1)] int VersionNumber, + [CborOrder(2)] byte[] ErrorData +) : RefuseReason; + +[CborSerializable] +[CborList] +public partial record Refused( + [CborOrder(0)] Value2 Idx, + [CborOrder(1)] int VersionNumber, + [CborOrder(2)] byte[] ErrorData +) : RefuseReason; diff --git a/src/Chrysalis.Network/Cbor/Handshake/VersionTable.cs b/src/Chrysalis.Network/Cbor/Handshake/VersionTable.cs new file mode 100644 index 00000000..bacd75a5 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/Handshake/VersionTable.cs @@ -0,0 +1,36 @@ +using Chrysalis.Cbor.Serialization.Attributes; +using Chrysalis.Cbor.Types; + +namespace Chrysalis.Network.Cbor.Handshake; + +[CborSerializable] +[CborUnion] +public partial record VersionTable : CborBase; + +[CborSerializable] +public partial record N2CVersionTable(Dictionary Value) : VersionTable; + +[CborSerializable] +public partial record N2NVersionTable(Dictionary Value) : VersionTable; + +public class VersionTables +{ + public static N2CVersionTable N2C_V10_AND_ABOVE => + new(new() + { + {N2CVersions.V16, new N2CVersionData(2, false)}, + {N2CVersions.V17, new N2CVersionData(2, false)}, + {N2CVersions.V18, new N2CVersionData(2, false)}, + {N2CVersions.V19, new N2CVersionData(2, false)}, + {N2CVersions.V20, new N2CVersionData(2, false)} + }); + + public static N2NVersionTable N2N_V11_AND_ABOVE => + new(new() + { + {N2NVersions.V11, new N2NVersionData(2, false, 0, false)}, + {N2NVersions.V12, new N2NVersionData(2, false, 0, false)}, + {N2NVersions.V13, new N2NVersionData(2, false, 0, false)}, + {N2NVersions.V14, new N2NVersionData(2, false, 0, false)}, + }); +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/LocalStateQueryMessage.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/LocalStateQueryMessage.cs new file mode 100644 index 00000000..4c2a4de1 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/LocalStateQueryMessage.cs @@ -0,0 +1,9 @@ +// using Chrysalis.Cbor.Attributes; + +// using Chrysalis.Cbor.Types; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery; + +// [CborConverter(typeof(UnionConverter))] +// public abstract record LocalStateQueryMessage : CborBase; + diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Acquire.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Acquire.cs new file mode 100644 index 00000000..c4e7d08d --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Acquire.cs @@ -0,0 +1,49 @@ +// using System.Text.RegularExpressions; +// using Chrysalis.Cbor.Attributes; + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; +// using Chrysalis.Network.Cbor.Common; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(UnionConverter))] +// public abstract record Acquire : LocalStateQueryMessage; + +// public class AcquireTypes +// { +// public static Acquire Default(Point? point) => point is not null ? SpecificPoint(point) : VolatileTip; + +// public static Acquire SpecificPoint(Point point) => +// new SpecificPoint(new ExactValue(new(0)), point); + +// public static Acquire VolatileTip => +// new VolatileTip(new ExactValue(new(8))); + +// public static Acquire ImmutableTip => +// new ImmutableTip(new ExactValue(new(10))); +// } + +// [CborConverter(typeof(UnionConverter))] +// public abstract record AcquireIdx : CborBase; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record SpecificPoint( +// [CborIndex(0)][ExactValue(0)] ExactValue Idx, +// [CborIndex(1)] Point Point +// ) : Acquire; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record VolatileTip( +// [CborIndex(0)][ExactValue(8)] ExactValue Idx +// ) : Acquire; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record ImmutableTip( +// [CborIndex(0)][ExactValue(10)] ExactValue Idx +// ) : Acquire; + diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Acquired.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Acquired.cs new file mode 100644 index 00000000..5a61916c --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Acquired.cs @@ -0,0 +1,11 @@ +// using Chrysalis.Cbor.Attributes; + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record Acquired([CborIndex(0)][ExactValue(1)] ExactValue Idx) : LocalStateQueryMessage; diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Failure.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Failure.cs new file mode 100644 index 00000000..b6bb3a60 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Failure.cs @@ -0,0 +1,23 @@ +// using Chrysalis.Cbor.Attributes; + + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record Failure( +// [CborIndex(0)][ExactValue(2)] ExactValue Idx, +// [CborIndex(1)] FailureReason Reason +// ) : LocalStateQueryMessage; + +// [CborConverter(typeof(UnionConverter))] +// public abstract record FailureReason : CborBase; + +// public partial record AcquireFailurePointTooOld([CborIndex(0)][ExactValue(0)] CborInt Value) : ExactValue(Value); + +// [CborConverter(typeof(IntConverter))] +// public partial record AcquireFailurePointNotOnChain([CborIndex(0)][ExactValue(1)] CborInt Value) : ExactValue(Value); \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/IsMessageDone.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/IsMessageDone.cs new file mode 100644 index 00000000..c08ecd49 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/IsMessageDone.cs @@ -0,0 +1,12 @@ +// using Chrysalis.Cbor.Attributes; + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(CustomListConverter))] +// public partial record IsMessageDone( +// [CborIndex(0)][ExactValue(7)] ExactValue Idx +// ) : LocalStateQueryMessage; diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Query.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Query.cs new file mode 100644 index 00000000..c0525890 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Query.cs @@ -0,0 +1,23 @@ +// using Chrysalis.Cbor.Attributes; +// using Chrysalis.Cbor.Serialization; + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record Query( +// [CborIndex(0)][ExactValue(3)] ExactValue Idx, +// [CborIndex(1)] CborBase QueryRequest +// ) : LocalStateQueryMessage; + +// public class QueryRequest +// { +// public static Query New(CborBase queryRequest) +// { +// return new Query(new ExactValue(new(3)), queryRequest); +// } +// } \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/ReAcquire.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/ReAcquire.cs new file mode 100644 index 00000000..2cc283e6 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/ReAcquire.cs @@ -0,0 +1,47 @@ +// using Chrysalis.Cbor.Attributes; + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; +// using Chrysalis.Network.Cbor.Common; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(UnionConverter))] +// public abstract record ReAcquire : LocalStateQueryMessage; + +// public class ReAcquireIdxs +// { +// public static ReAcquire Default(Point? point = null) => point is not null ? SpecificPoint(point) : VolatileTip; + +// public static ReAcquireSpecificPoint SpecificPoint(Point point) => +// new(new ExactValue(new(6)), point); + +// public static ReAcquireVolatileTip VolatileTip => +// new(new ExactValue(new(9))); + +// public static ReAcquireImmutableTip ImmutableTip => +// new(new ExactValue(new(11))); +// } + +// [CborConverter(typeof(UnionConverter))] +// public abstract record ReAcquireIdx : CborBase; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record ReAcquireSpecificPoint( +// [CborIndex(0)][ExactValue(6)] ExactValue Idx, +// [CborIndex(1)] Point Point +// ) : ReAcquire; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record ReAcquireVolatileTip( +// [CborIndex(0)][ExactValue(9)] ExactValue Idx +// ) : ReAcquire; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record ReAcquireImmutableTip( +// [CborIndex(0)][ExactValue(11)] ExactValue Idx +// ) : ReAcquire; diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Release.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Release.cs new file mode 100644 index 00000000..51cbf0a1 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Release.cs @@ -0,0 +1,12 @@ +// using Chrysalis.Cbor.Attributes; + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(CustomListConverter))] +// public partial record Release( +// [CborIndex(0)][ExactValue(5)] ExactValue Idx +// ) : LocalStateQueryMessage; diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Result.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Result.cs new file mode 100644 index 00000000..69b09fce --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/Messages/Result.cs @@ -0,0 +1,15 @@ +// using Chrysalis.Cbor.Attributes; + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record Result( +// [CborIndex(0)][ExactValue(4)] ExactValue Idx, +// [CborIndex(1)] CborEncodedValue QueryResult +// ) : LocalStateQueryMessage; + diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/QueryResponses.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/QueryResponses.cs new file mode 100644 index 00000000..e74ba102 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/QueryResponses.cs @@ -0,0 +1,28 @@ +// using Chrysalis.Cbor.Attributes; +// using Chrysalis.Cbor.Cardano.Types.Block.Transaction.Output; +// using Chrysalis.Cbor.Plutus.Types; + + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record CurrentEraQueryResponse( +// [CborIndex(0)] CborUlong CurrentEra +// ) : CborBase; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record UtxoByAddressResponse( +// [CborIndex(0)] CborMap Utxos +// ) : CborBase; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record TransactionInput( +// [CborIndex(0)] CborBytes TxHash, +// [CborIndex(1)] CborUlong Index +// ) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/LocalStateQuery/RawQueries.cs b/src/Chrysalis.Network/Cbor/LocalStateQuery/RawQueries.cs new file mode 100644 index 00000000..4dec7de9 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalStateQuery/RawQueries.cs @@ -0,0 +1,95 @@ +// using Chrysalis.Cbor.Attributes; +// using Chrysalis.Cbor.Serialization; + + +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalStateQuery; + +// public enum QueryEra +// { +// Byron = 0, +// Shelley = 1, +// Allegra = 2, +// Mary = 3, +// Alonzo = 4, +// Babbage = 5, +// Conway = 6, +// } + +// public static class RawQueries +// { +// public static BlockQuery CreateBlockQuery(CborBase query) +// { +// return new BlockQuery( +// new CborUlong(0), +// new BlockQuery( +// new CborUlong(0), +// new BlockQuery( +// // @TODO: This is currently hardcoded. We need to probably make this dynamic +// // by querying the current era from the ledger. +// new CborUlong((ulong)QueryEra.Conway), +// query +// ) +// ) +// ); +// } + +// public static BlockQuery GetCurrentEra => +// new BlockQuery( +// new CborUlong(0), +// new BlockQuery( +// new CborUlong(2), +// null +// ) +// ); + +// public static BlockQuery GetTip => CreateBlockQuery( +// new BlockQuery( +// new CborUlong(0), +// null +// ) +// ); + +// public static BlockQuery GetUtxoByAddress(List addresses) +// { +// List cborAddress = [.. addresses.Select(a => new CborBytes(a))]; +// return CreateBlockQuery(new UtxoByAddressQuery(new(6), new Addresses(cborAddress))); +// } + +// public static BlockQuery GetUtxoByTxIns(List txIns) +// { +// return CreateBlockQuery(new UtxoByTxInQuery(new(15), new(txIns))); +// } +// } + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record BasicQuery([CborIndex(0)] CborUlong Idx) : CborBase; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record BlockQuery( +// [CborIndex(0)] CborBase Query, +// [CborIndex(1)] CborBase? InnerQuery +// ) : CborBase; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record UtxoByAddressQuery( +// [CborIndex(0)] CborUlong Idx, +// [CborIndex(1)] Addresses Addresses +// ) : CborBase; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record UtxoByTxInQuery( +// [CborIndex(0)] CborUlong Idx, +// [CborIndex(1)] CborDefList TxIns +// ) : CborBase; + +// [CborConverter(typeof(ListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record Addresses(List Addrs) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Network/Cbor/LocalTxMonitor/LocalTxMonitorMessage.cs b/src/Chrysalis.Network/Cbor/LocalTxMonitor/LocalTxMonitorMessage.cs new file mode 100644 index 00000000..0ef11072 --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalTxMonitor/LocalTxMonitorMessage.cs @@ -0,0 +1,123 @@ +// using System.Transactions; +// using Chrysalis.Cbor.Attributes; +// using Chrysalis.Cbor.Plutus.Types; +// using Chrysalis.Cbor.Serialization.Converters.Custom; +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Custom; +// using Chrysalis.Cbor.Types.Primitives; +// using Chrysalis.Network.Cbor.LocalTxSubmit; + +// namespace Chrysalis.Network.Cbor.Handshake; + +// [CborConverter(typeof(UnionConverter))] +// public abstract record LocalTxMonitorMessage : CborBase; + +// public class LocalTxMonitorMessages +// { +// public static Acquire Acquire() => new(new ExactValue(new(1))); +// public static Release Release() => new(new ExactValue(new(3))); +// public static NextTx NextTx() => new(new ExactValue(new(5))); +// public static HasTx HasTx(string txId) => new(new ExactValue(new(7)), new(txId)); +// public static GetSizes GetSizes() => new(new ExactValue(new(9))); +// public static GetMeasures GetMeasures() => new(new ExactValue(new(11))); + + +// } + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record Done( +// [CborIndex(0)][ExactValue(0)] ExactValue Idx +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record Acquire( +// [CborIndex(0)][ExactValue(1)] ExactValue Idx +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record Acquired( +// [CborIndex(0)][ExactValue(2)] ExactValue Idx, +// [CborIndex(1)] CborUlong Slot +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record Release( +// [CborIndex(0)][ExactValue(3)] ExactValue Idx +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record NextTx( +// [CborIndex(0)][ExactValue(5)] ExactValue Idx +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(UnionConverter))] +// public abstract record ReplyNextTx : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record ReplyNextTxWithoutTx( +// [CborIndex(0)][ExactValue(6)] ExactValue Idx +// ) : ReplyNextTx; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record ReplyNextTxWithTx( +// [CborIndex(0)][ExactValue(6)] ExactValue Idx, +// [CborIndex(1)] EraTx EraTx +// ) : ReplyNextTx; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record HasTx( +// [CborIndex(0)][ExactValue(7)] ExactValue Idx, +// [CborIndex(1)] CborText TxId +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record ReplyHasTx( +// [CborIndex(0)][ExactValue(8)] ExactValue Idx, +// [CborIndex(1)] CborBool HasTx +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record GetSizes( +// [CborIndex(0)][ExactValue(9)] ExactValue Idx +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record ReplyGetSizes( +// [CborIndex(0)][ExactValue(10)] ExactValue Idx, +// [CborIndex(1)] CborList Sizes +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record GetMeasures( +// [CborIndex(0)][ExactValue(11)] ExactValue Idx +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record ReplyGetMeasures( +// [CborIndex(0)][ExactValue(12)] ExactValue Idx, +// [CborIndex(1)] CborUlong Slot, +// [CborIndex(2)] CborMap> Measures +// ) : LocalTxMonitorMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public record Measures( +// [CborIndex(0)] CborInt CurrentSize, +// [CborIndex(1)] CborInt MaxCapacity +// ); + + + diff --git a/src/Chrysalis.Network/Cbor/LocalTxSubmit/LocalTxSubmissionMessage.cs b/src/Chrysalis.Network/Cbor/LocalTxSubmit/LocalTxSubmissionMessage.cs new file mode 100644 index 00000000..cceaed4f --- /dev/null +++ b/src/Chrysalis.Network/Cbor/LocalTxSubmit/LocalTxSubmissionMessage.cs @@ -0,0 +1,66 @@ +// using Chrysalis.Cbor.Serialization.Attributes; +// using Chrysalis.Cbor.Types; +// using Chrysalis.Cbor.Types.Primitives; + +// namespace Chrysalis.Network.Cbor.LocalTxSubmit; + +// [CborSerializable] +// [CborUnion] +// public abstract record LocalTxSubmissionMessage : CborBase; + +// public class LocalTxSubmissionMessages +// { +// public static SubmitTx SubmitTx(EraTx eraTx) => +// new(new ExactValue(new(0)), eraTx); + +// public static AcceptTx AcceptTx() => new(new ExactValue(new(1))); + +// public static RejectTx RejectTx(CborEncodedValue rejectReason) => +// new(new ExactValue(new(2)), rejectReason); + +// public static Done Done() => new(new ExactValue(new(3))); +// } + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record SubmitTx( +// [CborIndex(0)] [ExactValue(0)] +// ExactValue Idx, + +// [CborIndex(1)] +// EraTx EraTx +// ) : LocalTxSubmissionMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record AcceptTx( +// [CborIndex(0)] [ExactValue(1)] +// ExactValue Idx +// ) : LocalTxSubmissionMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record RejectTx( +// [CborIndex(0)] [ExactValue(2)] +// ExactValue Idx, + +// [CborIndex(1)] +// CborEncodedValue RejectReason +// ) : LocalTxSubmissionMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record Done( +// [CborIndex(0)] [ExactValue(3)] +// ExactValue Idx +// ) : LocalTxSubmissionMessage; + +// [CborConverter(typeof(CustomListConverter))] +// [CborOptions(IsDefinite = true)] +// public partial record EraTx( +// [CborIndex(0)] +// CborInt Era, + +// [CborIndex(1)] +// CborEncodedValue Tx +// ) : CborBase; \ No newline at end of file diff --git a/src/Chrysalis.Network/Chrysalis.Network.csproj b/src/Chrysalis.Network/Chrysalis.Network.csproj new file mode 100644 index 00000000..7ce1f5c4 --- /dev/null +++ b/src/Chrysalis.Network/Chrysalis.Network.csproj @@ -0,0 +1,18 @@ + + + + + + + + + net9.0 + enable + enable + + + + + diff --git a/src/Chrysalis.Network/Core/IBearer.cs b/src/Chrysalis.Network/Core/IBearer.cs new file mode 100644 index 00000000..49772e96 --- /dev/null +++ b/src/Chrysalis.Network/Core/IBearer.cs @@ -0,0 +1,25 @@ +using System.IO.Pipelines; + +namespace Chrysalis.Network.Core; + +/// +/// Defines a communication channel that provides bidirectional data transfer capabilities. +/// Implementations typically wrap network connections (TCP, Unix domain sockets, etc.). +/// +/// +/// The IBearer serves as an abstraction layer for different transport mechanisms, +/// providing a consistent interface for reading and writing data through pipes. +/// All implementations must properly manage resources and implement IDisposable. +/// +public interface IBearer : IDisposable +{ + /// + /// Gets a for consuming data from the underlying transport. + /// + PipeReader Reader { get; } + + /// + /// Gets a for sending data to the underlying transport. + /// + PipeWriter Writer { get; } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Core/ProtocolConstants.cs b/src/Chrysalis.Network/Core/ProtocolConstants.cs new file mode 100644 index 00000000..a9ddc650 --- /dev/null +++ b/src/Chrysalis.Network/Core/ProtocolConstants.cs @@ -0,0 +1,7 @@ +namespace Chrysalis.Network.Core; + +public static class ProtocolConstants +{ + public const int MaxSegmentPayloadLength = ushort.MaxValue; + public const ushort SegmentHeaderSize = 8; +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Core/ProtocolType.cs b/src/Chrysalis.Network/Core/ProtocolType.cs new file mode 100644 index 00000000..e430e81d --- /dev/null +++ b/src/Chrysalis.Network/Core/ProtocolType.cs @@ -0,0 +1,15 @@ +namespace Chrysalis.Network.Core; + +public enum ProtocolType +{ + Handshake = 0, + NodeChainSync = 2, + BlockFetch = 3, + TxSubmission = 4, + ClientChainSync = 5, + LocalTxSubmission = 6, + LocalStateQuery = 7, + KeepAlive = 8, + LocalTxMonitor = 9, + PeerSharing = 10, +} diff --git a/src/Chrysalis.Network/Core/TcpBearer.cs b/src/Chrysalis.Network/Core/TcpBearer.cs new file mode 100644 index 00000000..df20fefa --- /dev/null +++ b/src/Chrysalis.Network/Core/TcpBearer.cs @@ -0,0 +1,76 @@ +using System.IO.Pipelines; +using System.Net.Sockets; + +namespace Chrysalis.Network.Core; + +/// +/// TCP implementation of the bearer interface for network communication. +/// +public class TcpBearer : IBearer +{ + private readonly TcpClient _client; + private readonly NetworkStream _stream; + private bool _isDisposed; + + /// + /// Gets the reader for consuming data from the TCP connection. + /// + public PipeReader Reader { get; } + + /// + /// Gets the writer for sending data to the TCP connection. + /// + public PipeWriter Writer { get; } + + private TcpBearer(TcpClient client, NetworkStream stream) + { + _client = client; + _stream = stream; + Reader = PipeReader.Create(stream); + Writer = PipeWriter.Create(stream); + } + + /// + /// Creates a TCP bearer connected to the specified host and port. + /// + /// The host to connect to. + /// The port to connect to. + /// A connected TCP bearer. + public static TcpBearer Create(string host, int port) + { + TcpClient client = new(host, port); + NetworkStream stream = client.GetStream(); + return new TcpBearer(client, stream); + } + + /// + /// Creates a TCP bearer asynchronously connected to the specified host and port. + /// + /// The host to connect to. + /// The port to connect to. + /// A token to cancel the operation. + /// A connected TCP bearer. + public static async Task CreateAsync(string host, int port, CancellationToken cancellationToken) + { + TcpClient client = new(); + await client.ConnectAsync(host, port, cancellationToken); + NetworkStream stream = client.GetStream(); + return new TcpBearer(client, stream); + } + + /// + /// Disposes resources used by the bearer. + /// + public void Dispose() + { + if (_isDisposed) return; + + Reader.Complete(); + Writer.Complete(); + _stream.Dispose(); + _client.Dispose(); + + _isDisposed = true; + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Core/UnixBearer.cs b/src/Chrysalis.Network/Core/UnixBearer.cs new file mode 100644 index 00000000..7e242982 --- /dev/null +++ b/src/Chrysalis.Network/Core/UnixBearer.cs @@ -0,0 +1,64 @@ +using System.IO.Pipelines; +using System.Net.Sockets; +using SocketProtocolType = System.Net.Sockets.ProtocolType; + +namespace Chrysalis.Network.Core; + +/// +/// Unix domain socket implementation of the bearer interface. +/// +public class UnixBearer : IBearer +{ + private readonly Socket _socket; + private readonly NetworkStream _stream; + private bool _isDisposed; + + /// + /// Gets the reader for consuming data from the Unix socket. + /// + public PipeReader Reader { get; } + + /// + /// Gets the writer for sending data to the Unix socket. + /// + public PipeWriter Writer { get; } + + private UnixBearer(Socket socket, NetworkStream stream) + { + _socket = socket; + _stream = stream; + Reader = PipeReader.Create(stream); + Writer = PipeWriter.Create(stream); + } + + /// + /// Creates a Unix domain socket bearer connected to the specified path. + /// + /// The socket path to connect to. + /// A token to cancel the operation. + /// A connected Unix socket bearer. + public static async Task CreateAsync(string path, CancellationToken cancellationToken) + { + Socket socket = new(AddressFamily.Unix, SocketType.Stream, SocketProtocolType.Unspecified); + UnixDomainSocketEndPoint endpoint = new(path); + await socket.ConnectAsync(endpoint, cancellationToken); + NetworkStream stream = new(socket, ownsSocket: true); + return new UnixBearer(socket, stream); + } + + /// + /// Disposes resources used by the bearer. + /// + public void Dispose() + { + if (_isDisposed) return; + + Reader.Complete(); + Writer.Complete(); + _stream.Dispose(); + _socket.Dispose(); + + _isDisposed = true; + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/MiniProtocols/ChainSync.cs b/src/Chrysalis.Network/MiniProtocols/ChainSync.cs new file mode 100644 index 00000000..17b90abf --- /dev/null +++ b/src/Chrysalis.Network/MiniProtocols/ChainSync.cs @@ -0,0 +1,48 @@ +using System.Runtime.CompilerServices; +using Chrysalis.Network.Cbor.ChainSync; +using Chrysalis.Network.Cbor.Common; +using Chrysalis.Network.Core; +using Chrysalis.Network.Multiplexer; +using Point = Chrysalis.Network.Cbor.Common.Point; + +namespace Chrysalis.Network.MiniProtocols; + +/// +/// Implementation of the Ouroboros ChainSync mini-protocol. +/// +/// +/// Initializes a new instance of the ChainSync protocol. +/// +/// The channel for protocol communication. +public class ChainSync(AgentChannel channel) : IMiniProtocol +{ + /// + /// Gets the protocol type identifier. + /// + public static ProtocolType ProtocolType => ProtocolType.ClientChainSync; + + private readonly ChannelBuffer _buffer = new(channel); + private readonly ChainSyncMessage _nextRequest = ChainSyncMessages.NextRequest(); + + /// + /// Finds an intersection point between the local and remote chains. + /// + /// Collection of points to check for intersection. + /// Token to cancel the operation. + /// The response message indicating intersection status. + public async Task FindIntersectionAsync(IEnumerable points, CancellationToken cancellationToken) + { + Points message = new([.. points]); + MessageFindIntersect messageCbor = ChainSyncMessages.FindIntersect(message); + await _buffer.SendFullMessageAsync(messageCbor, cancellationToken); + return await _buffer.ReceiveFullMessageAsync(cancellationToken); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public async Task NextRequestAsync(CancellationToken cancellationToken) + { + await _buffer.SendFullMessageAsync(_nextRequest, cancellationToken); + return await _buffer.ReceiveFullMessageAsync(cancellationToken) as MessageNextResponse; + } +} + diff --git a/src/Chrysalis.Network/MiniProtocols/Extensions/LocalStateQueryExtension.cs b/src/Chrysalis.Network/MiniProtocols/Extensions/LocalStateQueryExtension.cs new file mode 100644 index 00000000..45765359 --- /dev/null +++ b/src/Chrysalis.Network/MiniProtocols/Extensions/LocalStateQueryExtension.cs @@ -0,0 +1,89 @@ +// using Chrysalis.Cbor.Serialization; +// using Chrysalis.Cbor.Types; +// using Chrysalis.Network.Cbor.LocalStateQuery; +// using Chrysalis.Network.Cbor.LocalStateQuery.Messages; + +// namespace Chrysalis.Network.MiniProtocols.Extensions; + +// /// +// /// Extension methods for the LocalStateQuery protocol +// /// +// public static class LocalStateQueryExtension +// { +// private static readonly string DeserializationError = "Failed to deserialize response"; +// private static readonly string InvalidResponseError = "Invalid response format"; + +// /// +// /// Gets UTxOs by address +// /// +// /// The LocalStateQuery protocol instance +// /// List of addresses to query +// /// A task yielding the UTxO response +// /// Thrown when response extraction or deserialization fails +// public static async Task GetUtxosByAddressAsync( +// this LocalStateQuery localStateQuery, +// List addresses) +// { +// Result queryResult = await localStateQuery.QueryAsync(null, RawQueries.GetUtxoByAddress(addresses), +// default); +// byte[] rawBytes = await ExtractRawBytesAsync(queryResult); +// return await DeserializeResponseAsync(rawBytes); +// } + +// /// +// /// Gets UTxOs by transaction inputs +// /// +// /// The LocalStateQuery protocol instance +// /// List of transaction inputs to query +// /// A task yielding the UTxO response +// /// Thrown when response extraction or deserialization fails +// public static async Task GetUtxosByTxInAsync( +// this LocalStateQuery localStateQuery, +// List txIns) +// { +// Result queryResult = await localStateQuery.QueryAsync(null, RawQueries.GetUtxoByTxIns(txIns), +// default); +// byte[] rawBytes = await ExtractRawBytesAsync(queryResult); +// return await DeserializeResponseAsync(rawBytes); +// } + +// /// +// /// Extracts raw bytes from a query result +// /// +// /// The query result to extract bytes from +// /// A task yielding the raw bytes +// /// Thrown when raw bytes extraction fails +// private static Task ExtractRawBytesAsync(Result result) +// { +// try +// { +// if (result.QueryResult.Raw == null) +// throw new InvalidOperationException($"{InvalidResponseError}: Result has no raw data"); + +// return Task.FromResult(result.QueryResult.Raw.Value.ToArray()); +// } +// catch (Exception ex) when (ex is not InvalidOperationException) +// { +// throw new InvalidOperationException($"{InvalidResponseError}: {ex.Message}", ex); +// } +// } + +// /// +// /// Deserializes raw bytes to the specified type +// /// +// /// The type to deserialize to +// /// The raw bytes to deserialize +// /// A task yielding the deserialized object +// /// Thrown when deserialization fails +// private static Task DeserializeResponseAsync(byte[] rawBytes) where T : CborBase +// { +// try +// { +// return Task.FromResult(CborSerializer.Deserialize(rawBytes)); +// } +// catch (Exception ex) +// { +// throw new InvalidOperationException($"{DeserializationError}: {ex.Message}", ex); +// } +// } +// } \ No newline at end of file diff --git a/src/Chrysalis.Network/MiniProtocols/Handshake.cs b/src/Chrysalis.Network/MiniProtocols/Handshake.cs new file mode 100644 index 00000000..e6e6de72 --- /dev/null +++ b/src/Chrysalis.Network/MiniProtocols/Handshake.cs @@ -0,0 +1,28 @@ +using Chrysalis.Network.Cbor.Handshake; +using Chrysalis.Network.Core; +using Chrysalis.Network.Multiplexer; + +namespace Chrysalis.Network.MiniProtocols; + +public class Handshake(AgentChannel channel) : IMiniProtocol +{ + /// + /// Gets the protocol type identifier. + /// + public static ProtocolType ProtocolType => ProtocolType.Handshake; + + private readonly ChannelBuffer _buffer = new(channel); + + /// + /// Sends a version proposal and receives the handshake response. + /// + /// The version proposal message. + /// Token to cancel the operation. + /// The handshake response message. + public async Task SendAsync(ProposeVersions propose, CancellationToken cancellationToken) + { + await _buffer.SendFullMessageAsync(propose, cancellationToken); + return await _buffer.ReceiveFullMessageAsync(cancellationToken); + } +} + diff --git a/src/Chrysalis.Network/MiniProtocols/IMiniProtocol.cs b/src/Chrysalis.Network/MiniProtocols/IMiniProtocol.cs new file mode 100644 index 00000000..12a841b3 --- /dev/null +++ b/src/Chrysalis.Network/MiniProtocols/IMiniProtocol.cs @@ -0,0 +1,9 @@ +using Chrysalis.Network.Core; +using Chrysalis.Network.Multiplexer; + +namespace Chrysalis.Network.MiniProtocols; + +/// +/// Defines the interface for Ouroboros mini-protocols. +/// +public interface IMiniProtocol { } \ No newline at end of file diff --git a/src/Chrysalis.Network/MiniProtocols/LocalStateQuery.cs b/src/Chrysalis.Network/MiniProtocols/LocalStateQuery.cs new file mode 100644 index 00000000..62ecbf9b --- /dev/null +++ b/src/Chrysalis.Network/MiniProtocols/LocalStateQuery.cs @@ -0,0 +1,26 @@ +// using Chrysalis.Network.Cbor.LocalStateQuery.Messages; +// using Chrysalis.Network.Multiplexer; +// using Chrysalis.Cbor.Serialization; +// using Chrysalis.Network.Cbor.LocalStateQuery; +// using Chrysalis.Network.Cbor.Common; + +// namespace Chrysalis.Network.MiniProtocols; + +// public class LocalStateQuery(AgentChannel channel) +// { +// private readonly ChannelBuffer _buffer = new(channel); + +// public async Task QueryAsync(Point? point, BlockQuery query, CancellationToken cancellationToken) +// { +// await _buffer.SendFullMessageAsync(AcquireTypes.Default(point), cancellationToken); +// LocalStateQueryMessage acquireResponse = await _buffer.ReceiveFullMessageAsync(cancellationToken); + +// if (acquireResponse is not Acquired) +// { +// throw new Exception("Failed to acquire"); +// } + +// await _buffer.SendFullMessageAsync(QueryRequest.New(query), cancellationToken); +// return await _buffer.ReceiveFullMessageAsync(cancellationToken); +// } +// } \ No newline at end of file diff --git a/src/Chrysalis.Network/MiniProtocols/LocalTxMonitor.cs b/src/Chrysalis.Network/MiniProtocols/LocalTxMonitor.cs new file mode 100644 index 00000000..e479910f --- /dev/null +++ b/src/Chrysalis.Network/MiniProtocols/LocalTxMonitor.cs @@ -0,0 +1,57 @@ +// using System.Buffers; +// using System.Transactions; +// using Chrysalis.Cbor.Plutus.Types; +// using Chrysalis.Cbor.Serialization; +// using Chrysalis.Network.Cbor.Handshake; +// using Chrysalis.Network.Multiplexer; + +// namespace Chrysalis.Network.MiniProtocols; + +// public class LocalTxMonitor(AgentChannel channel) : IMiniProtocol +// { +// private readonly ChannelBuffer _channelBuffer = new(channel); +// public async Task AcquireAsync(CancellationToken cancellationToken) +// { +// Acquire acquire = LocalTxMonitorMessages.Acquire(); +// await _channelBuffer.SendFullMessageAsync(acquire, cancellationToken); +// return await _channelBuffer.ReceiveFullMessageAsync(cancellationToken); +// } + +// public async Task ReleaseAsync(CancellationToken cancellationToken) +// { +// Release release = LocalTxMonitorMessages.Release(); +// await _channelBuffer.SendFullMessageAsync(release, cancellationToken); +// return await _channelBuffer.ReceiveFullMessageAsync(cancellationToken); +// } + +// public async Task NextTxAsync(CancellationToken cancellationToken) +// { +// NextTx nextTx = LocalTxMonitorMessages.NextTx(); +// await _channelBuffer.SendFullMessageAsync(nextTx, cancellationToken); +// return await _channelBuffer.ReceiveFullMessageAsync(cancellationToken); +// } + +// // @TODO +// public async Task HasTxAsync(string txId, CancellationToken cancellationToken) +// { +// await _channelBuffer.SendFullMessageAsync(LocalTxMonitorMessages.HasTx(txId), cancellationToken); +// return await _channelBuffer.ReceiveFullMessageAsync(cancellationToken); +// } + +// public async Task GetSizesAsync(CancellationToken cancellationToken) +// { +// GetSizes getSizes = LocalTxMonitorMessages.GetSizes(); +// await _channelBuffer.SendFullMessageAsync(getSizes, cancellationToken); +// return await _channelBuffer.ReceiveFullMessageAsync(cancellationToken); +// } + +// // @TODO +// public async Task GetMeasuresAsync(CancellationToken cancellationToken) +// { + +// GetMeasures getMeasures = LocalTxMonitorMessages.GetMeasures(); +// await _channelBuffer.SendFullMessageAsync(getMeasures, cancellationToken); +// return await _channelBuffer.ReceiveFullMessageAsync(cancellationToken); +// } +// } + diff --git a/src/Chrysalis.Network/MiniProtocols/LocalTxSubmit.cs b/src/Chrysalis.Network/MiniProtocols/LocalTxSubmit.cs new file mode 100644 index 00000000..6ba4f362 --- /dev/null +++ b/src/Chrysalis.Network/MiniProtocols/LocalTxSubmit.cs @@ -0,0 +1,14 @@ +// using Chrysalis.Network.Cbor.LocalTxSubmit; +// using Chrysalis.Network.Multiplexer; + +// namespace Chrysalis.Network.MiniProtocols; + +// public class LocalTxSubmit(AgentChannel channel) : IMiniProtocol +// { +// private readonly ChannelBuffer _channelBuffer = new(channel); +// public async Task SubmitTxAsync(SubmitTx submit, CancellationToken cancellationToken) +// { +// await _channelBuffer.SendFullMessageAsync(submit, cancellationToken); +// return await _channelBuffer.ReceiveFullMessageAsync(cancellationToken); +// } +// } \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/AgentChannel.cs b/src/Chrysalis.Network/Multiplexer/AgentChannel.cs new file mode 100644 index 00000000..21820509 --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/AgentChannel.cs @@ -0,0 +1,74 @@ +using System.Buffers; +using System.Buffers.Binary; +using System.IO.Pipelines; +using System.Runtime.CompilerServices; +using System.Threading.Channels; +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Represents a bidirectional communication channel for a specific protocol. +/// +/// +/// AgentChannel acts as a thin wrapper around the multiplexer's channels, +/// providing protocol-specific read and write operations. +/// +/// +/// Initializes a new instance of the class. +/// +/// The protocol ID this channel handles. +/// The writer for sending outbound messages to the multiplexer. +/// The reader for receiving inbound messages from the demultiplexer. +public sealed class AgentChannel( + ProtocolType protocolId, + PipeWriter plexerWriter, + PipeReader plexerReader +) +{ + /// + /// Enqueues a chunk of data to be sent through this protocol channel. + /// + /// The data to send. + /// A token to cancel the operation. + /// A task that completes when the data has been queued for sending. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public async Task EnqueueChunkAsync(ReadOnlySequence chunk, CancellationToken cancellationToken = default) + { + // Get the total length of the payload + int payloadLength = (int)chunk.Length; + + // Create buffer for header (3 bytes total: 1 for protocol ID, 2 for length) + Span protocolMessage = stackalloc byte[3 + payloadLength]; + + // Write protocol ID (1 byte) + protocolMessage[0] = (byte)protocolId; + + // Write payload length (2 bytes) in big-endian format + BinaryPrimitives.WriteUInt16BigEndian(protocolMessage[1..], (ushort)payloadLength); + + // Copy the payload chunk to the protocol message + Span payloadSlice = protocolMessage.Slice(3, payloadLength); + chunk.CopyTo(payloadSlice); + + // Write payload - handle multi-segment sequences efficiently + plexerWriter.Write(protocolMessage); + await plexerWriter.FlushAsync(cancellationToken); + } + + /// + /// Reads the next available chunk of data from this protocol channel. + /// + /// A token to cancel the operation. + /// The received data. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public async Task ReadChunkAsync(CancellationToken cancellationToken = default) => + await plexerReader.ReadAsync(cancellationToken); + + /// + /// Advances the channels reader to a position. + /// + /// The SequencePosition of the last consumed data. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void AdvanceTo(SequencePosition position) => plexerReader.AdvanceTo(position); +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/ChannelBuffer.cs b/src/Chrysalis.Network/Multiplexer/ChannelBuffer.cs new file mode 100644 index 00000000..3833e58c --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/ChannelBuffer.cs @@ -0,0 +1,79 @@ +using System.Buffers; +using System.IO.Pipelines; +using Chrysalis.Cbor.Serialization; +using Chrysalis.Cbor.Types; +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Provides buffer management for sending and receiving complete CBOR messages over an AgentChannel. +/// +/// +/// Initializes a new instance of the ChannelBuffer class. +/// +/// The channel to buffer data for. +public sealed class ChannelBuffer(AgentChannel channel) +{ + public async Task SendFullMessageAsync(T message, CancellationToken cancellationToken) where T : CborBase + { + byte[] payload = CborSerializer.Serialize(message); + ReadOnlyMemory payloadMemory = payload.AsMemory(); + int payloadLength = payload.Length; + + for (int offset = 0; offset < payloadLength; offset += ProtocolConstants.MaxSegmentPayloadLength) + { + if (cancellationToken.IsCancellationRequested) break; + + int chunkSize = Math.Min(ProtocolConstants.MaxSegmentPayloadLength, payloadLength - offset); + ReadOnlyMemory chunkMemory = payloadMemory.Slice(offset, chunkSize); + ReadOnlySequence chunkSequence = new(chunkMemory); + await channel.EnqueueChunkAsync(chunkSequence, cancellationToken); + } + } + + public async Task ReceiveFullMessageAsync(CancellationToken cancellationToken) where T : CborBase + { + while (true) + { + ReadResult readResult = await channel.ReadChunkAsync(cancellationToken); + ReadOnlySequence buffer = readResult.Buffer; + + try + { + T result; + if (buffer.IsSingleSegment) + { + result = CborSerializer.Deserialize(buffer.First); + channel.AdvanceTo(buffer.End); + return result; + } + + // Buffer is multi-segment, need to copy to contiguous memory + byte[] rentedBuffer = ArrayPool.Shared.Rent((int)buffer.Length); + try + { + buffer.CopyTo(rentedBuffer); + result = CborSerializer.Deserialize(rentedBuffer.AsMemory(0, (int)buffer.Length)); + channel.AdvanceTo(buffer.End); + return result; + } + finally + { + ArrayPool.Shared.Return(rentedBuffer); + } + } + catch (Exception) when (!readResult.IsCompleted) + { + // Need more data - mark what we examined but couldn't use + channel.AdvanceTo(buffer.Start); + } + catch (Exception) when (readResult.IsCompleted) + { + // If pipe is completed and we still can't deserialize, that's an error + channel.AdvanceTo(buffer.End); + throw new InvalidOperationException("Pipe completed before a valid message could be parsed"); + } + } + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/Demuxer.cs b/src/Chrysalis.Network/Multiplexer/Demuxer.cs new file mode 100644 index 00000000..1dbc05d8 --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/Demuxer.cs @@ -0,0 +1,178 @@ +using System.Buffers; +using System.Collections.Concurrent; +using System.IO.Pipelines; +using System.Runtime.CompilerServices; +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Handles the demultiplexing of incoming data from a bearer into protocol-specific channels. +/// +/// +/// The Demuxer reads segmented data from the network and routes it to the appropriate +/// protocol handler's channel based on the protocol ID in the segment header. +/// +/// +/// Initializes a new instance of the class. +/// +/// The bearer to read segments from. +public sealed class Demuxer(IBearer bearer) : IDisposable +{ + private readonly ConcurrentDictionary _protocolPipes = []; + private bool _isDisposed; + + /// + /// Subscribes to a specific protocol channel. + /// + /// The protocol type to subscribe to. + /// A channel reader for consuming messages for the specified protocol. + public PipeReader Subscribe(ProtocolType protocol) + { + if (!_protocolPipes.TryGetValue(protocol, out Pipe? pipe)) + { + pipe = new Pipe( + new PipeOptions( + pool: MemoryPool.Shared, + minimumSegmentSize: 4096, + pauseWriterThreshold: 100 * 1024, + resumeWriterThreshold: 99 * 1024 + ) + ); + _protocolPipes[protocol] = pipe; + } + return pipe.Reader; + } + + /// + /// Reads a multiplexed segment from the bearer. + /// + /// A token to cancel the operation. + /// The read segment. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public async ValueTask ReadSegmentAsync(CancellationToken cancellationToken) + { + // Read the header + ReadResult result = await bearer.Reader.ReadAtLeastAsync(ProtocolConstants.SegmentHeaderSize, cancellationToken); + ReadOnlySequence buffer = result.Buffer; + + // Decode the header + ReadOnlySequence headerSlice = buffer.Slice(0, ProtocolConstants.SegmentHeaderSize); + MuxSegmentHeader header = MuxSegmentCodec.DecodeHeader(headerSlice); + + // Advance past the header + bearer.Reader.AdvanceTo(buffer.GetPosition(ProtocolConstants.SegmentHeaderSize)); + + // Read and process the payload + ReadOnlySequence payloadSequence; + + if (buffer.Length >= header.PayloadLength + ProtocolConstants.SegmentHeaderSize) + { + // We already have the complete payload in the buffer + ReadOnlySequence payloadSlice = buffer.Slice(ProtocolConstants.SegmentHeaderSize, header.PayloadLength); + payloadSequence = CopyPayload(payloadSlice); + bearer.Reader.AdvanceTo(buffer.GetPosition(header.PayloadLength + ProtocolConstants.SegmentHeaderSize)); + } + else + { + // We need to read more data for the payload + result = await bearer.Reader.ReadAtLeastAsync(header.PayloadLength, cancellationToken); + ReadOnlySequence payloadSlice = result.Buffer.Slice(0, header.PayloadLength); + payloadSequence = CopyPayload(payloadSlice); + bearer.Reader.AdvanceTo(result.Buffer.GetPosition(header.PayloadLength)); + } + + return new MuxSegment(header, payloadSequence); + } + + // Shared buffer pool to reduce allocations + private static readonly ArrayPool _bufferPool = ArrayPool.Shared; + + /// + /// Creates a copy of the payload from a ReadOnlySequence using buffer pooling. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static ReadOnlySequence CopyPayload(ReadOnlySequence payload) + { + // For very small payloads, using pooling introduces more overhead than benefit + if (payload.Length <= 128) + { + byte[] smallPayloadCopy = new byte[payload.Length]; + payload.CopyTo(smallPayloadCopy); + return new ReadOnlySequence(smallPayloadCopy); + } + + // For larger payloads, use the shared buffer pool + byte[] payloadCopy = _bufferPool.Rent((int)payload.Length); + + try + { + payload.CopyTo(payloadCopy); + // Store the buffer in the memory record for later return to pool + PooledMemory managedPayload = new(payloadCopy, _bufferPool, (int)payload.Length); + return new ReadOnlySequence(managedPayload.Memory); + } + catch + { + // Ensure buffer is returned on exception + _bufferPool.Return(payloadCopy); + throw; + } + } + + // Helper class to track pooled memory and return it when no longer used + private sealed class PooledMemory(byte[] buffer, ArrayPool pool, int length) : IMemoryOwner + { + private readonly byte[] _buffer = buffer; + private readonly ArrayPool _pool = pool; + private readonly int _length = length; + private bool _disposed = false; + + public Memory Memory => _buffer.AsMemory(0, _length); + + public void Dispose() + { + if (!_disposed) + { + _pool.Return(_buffer); + _disposed = true; + } + } + } + + /// + /// Runs the demuxer, continuously reading segments and dispatching them to the appropriate channels. + /// + /// A token to cancel the operation. + public async Task RunAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + MuxSegment segment = await ReadSegmentAsync(cancellationToken); + + if (!_protocolPipes.TryGetValue(segment.Header.ProtocolId, out Pipe? pipe)) continue; + + await pipe.Writer.WriteAsync(segment.Payload.First, cancellationToken); + await pipe.Writer.FlushAsync(cancellationToken); + } + } + + /// + /// Disposes the resources used by the demuxer. + /// + public void Dispose() + { + if (_isDisposed) return; + + // Complete all channels + foreach (Pipe pipe in _protocolPipes.Values) + { + pipe.Writer.Complete(); + } + + // Don't dispose bearer here - it's provided externally + + _isDisposed = true; + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/MuxSegment.cs b/src/Chrysalis.Network/Multiplexer/MuxSegment.cs new file mode 100644 index 00000000..c9f0dfdf --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/MuxSegment.cs @@ -0,0 +1,37 @@ +using System.Buffers; +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Represents the header of a multiplexer segment containing routing and protocol information. +/// +/// The transmission timestamp in milliseconds since session start. +/// The protocol type identifier for routing. +/// The length of the payload in bytes. +/// The mode flag (true for responder, false for initiator). +/// +/// This is a lightweight value type optimized for efficient processing. +/// When passing to methods, use the 'in' modifier to avoid copying. +/// +public record MuxSegmentHeader( + uint TransmissionTime, + ProtocolType ProtocolId, + ushort PayloadLength, + bool Mode +); + +/// +/// Represents a complete multiplexer segment with header and payload data. +/// +/// The segment header containing metadata and routing information. +/// The binary payload data. +/// +/// MuxSegment is the fundamental unit of data transfer in the multiplexing protocol. +/// It encapsulates both the protocol metadata (Header) and the actual message data (Payload). +/// As a value type, it should be passed using the 'in' modifier to avoid copying. +/// +public record MuxSegment( + MuxSegmentHeader Header, + ReadOnlySequence Payload +); \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/MuxSegmentCodec.cs b/src/Chrysalis.Network/Multiplexer/MuxSegmentCodec.cs new file mode 100644 index 00000000..606aba27 --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/MuxSegmentCodec.cs @@ -0,0 +1,159 @@ +using System.Buffers; +using System.Buffers.Binary; +using System.Runtime.CompilerServices; +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Provides minimal and highly optimized methods for encoding and decoding MuxSegments. +/// +/// +/// The codec implements a binary protocol with the following header format: +/// - 4 bytes: Transmission time (uint32, big endian) +/// - 2 bytes: Protocol ID and mode flag (uint16, big endian, high bit = mode) +/// - 2 bytes: Payload length (uint16, big endian) +/// +/// Performance is prioritized through aggressive inlining and avoiding struct copies. +/// +public static class MuxSegmentCodec +{ + // Header size constants + /// Size in bytes of the transmission time field. + private const ushort TRANSMISSION_TIME_SIZE = 4; + + /// Size in bytes of the protocol ID field. + private const ushort PROTOCOL_ID_SIZE = 2; + + /// Size in bytes of the payload length field. + private const ushort PAYLOAD_LENGTH_SIZE = 2; + + /// Total size in bytes of the segment header. + private const ushort HEADER_SIZE = TRANSMISSION_TIME_SIZE + PROTOCOL_ID_SIZE + PAYLOAD_LENGTH_SIZE; + + // Buffer pool for encoding to reduce allocations + private static readonly ArrayPool _encodeBufferPool = ArrayPool.Shared; + + /// + /// Encodes a MuxSegment into a binary representation. + /// + /// The segment to encode. + /// A sequence containing the binary representation of the segment. + /// + /// The encoded format consists of an 8-byte header followed by the payload: + /// - Bytes 0-3: Transmission time (uint32, big endian) + /// - Bytes 4-5: Protocol ID with high bit representing mode (uint16, big endian) + /// - Bytes 6-7: Payload length (uint16, big endian) + /// - Bytes 8+: Payload data + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ReadOnlySequence Encode(in MuxSegment segment) + { + // Calculate total size needed + int totalSize = HEADER_SIZE + segment.Header.PayloadLength; + + // For small segments, avoid the pooling overhead + if (totalSize <= 256) + { + // Create a result buffer directly - better for small segments + byte[] result = new byte[totalSize]; + EncodeToBuffer(segment, result); + return new ReadOnlySequence(result); + } + + // For larger segments, use buffer pooling + byte[] pooledBuffer = _encodeBufferPool.Rent(totalSize); + + try + { + EncodeToBuffer(segment, pooledBuffer); + + // Create a managed memory to ensure buffer is returned to pool + EncodedMemory managedMemory = new EncodedMemory(pooledBuffer, _encodeBufferPool, totalSize); + return new ReadOnlySequence(managedMemory.Memory); + } + catch + { + _encodeBufferPool.Return(pooledBuffer); + throw; + } + } + + /// + /// Helper method to encode segment data to a buffer + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void EncodeToBuffer(in MuxSegment segment, byte[] buffer) + { + // Write header + Span headerSpan = buffer.AsSpan(0, HEADER_SIZE); + BinaryPrimitives.WriteUInt32BigEndian(headerSpan[..4], segment.Header.TransmissionTime); + + ushort protocolIdValue = (ushort)segment.Header.ProtocolId; + if (segment.Header.Mode) + { + protocolIdValue |= 0x8000; // Set high bit for responder mode + } + + BinaryPrimitives.WriteUInt16BigEndian(headerSpan.Slice(4, 2), protocolIdValue); + BinaryPrimitives.WriteUInt16BigEndian(headerSpan.Slice(6, 2), segment.Header.PayloadLength); + + // Write payload after header + if (segment.Header.PayloadLength > 0 && !segment.Payload.IsEmpty) + { + Span payloadSpan = buffer.AsSpan(HEADER_SIZE, segment.Header.PayloadLength); + segment.Payload.CopyTo(payloadSpan); + } + } + + /// + /// Helper class to track and dispose pooled memory + /// + private sealed class EncodedMemory(byte[] buffer, ArrayPool pool, int length) : IMemoryOwner + { + private readonly byte[] _buffer = buffer; + private readonly ArrayPool _pool = pool; + private readonly int _length = length; + private bool _disposed = false; + + public Memory Memory => _buffer.AsMemory(0, _length); + + public void Dispose() + { + if (!_disposed) + { + _pool.Return(_buffer); + _disposed = true; + } + } + } + + /// + /// Decodes a binary sequence into a MuxSegmentHeader. + /// + /// The binary sequence containing the header data (must be at least 8 bytes). + /// The decoded MuxSegmentHeader. + /// + /// This method extracts fields from the binary header: + /// - Transmission time: 4-byte uint32 in big endian + /// - Protocol ID: 15 lower bits of the 2-byte field in big endian + /// - Mode flag: High bit (bit 15) of the protocol ID field + /// - Payload length: 2-byte uint16 in big endian + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static MuxSegmentHeader DecodeHeader(in ReadOnlySequence headerSequence) + { + uint transmissionTime = BinaryPrimitives.ReadUInt32BigEndian(headerSequence.Slice(0, 4).FirstSpan); + ushort protocolIdAndMode = BinaryPrimitives.ReadUInt16BigEndian(headerSequence.Slice(4, 2).FirstSpan); + bool mode = (protocolIdAndMode & 0x8000) != 0; + ProtocolType protocolId = (ProtocolType)(protocolIdAndMode & 0x7FFF); + ushort payloadLength = BinaryPrimitives.ReadUInt16BigEndian(headerSequence.Slice(6, 2).FirstSpan); + + return new( + transmissionTime, + protocolId, + payloadLength, + mode + ); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/Muxer.cs b/src/Chrysalis.Network/Multiplexer/Muxer.cs new file mode 100644 index 00000000..79724c9e --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/Muxer.cs @@ -0,0 +1,123 @@ +using System.Buffers; +using System.Buffers.Binary; +using System.IO.Pipelines; +using System.Runtime.CompilerServices; +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Handles multiplexing of protocol messages onto a shared transport. +/// +/// +/// The Muxer takes messages from different protocol handlers and sends them +/// through a single bearer, adding appropriate headers for demultiplexing. +/// +/// +/// Initializes a new instance of the class. +/// +/// The bearer to write segments to. +/// The mode of operation (initiator or responder). +/// Thrown if bearer is null. +public sealed class Muxer(IBearer bearer, ProtocolMode muxerMode) : IDisposable +{ + private readonly IBearer _bearer = bearer ?? throw new ArgumentNullException(nameof(bearer)); + private readonly ProtocolMode _muxerMode = muxerMode; + private readonly DateTimeOffset _startTime = DateTimeOffset.UtcNow; + private readonly Pipe _pipe = new(); + private bool _isDisposed; + + /// + /// Gets the channel writer for sending messages through the muxer. + /// + public PipeWriter Writer => _pipe.Writer; + + /// + /// Writes a multiplexed segment to the bearer. + /// + /// The segment to write. + /// A token to cancel the operation. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private async Task WriteSegmentAsync(MuxSegment segment, CancellationToken cancellationToken) + { + ReadOnlySequence encodedSegment = MuxSegmentCodec.Encode(segment); + + // Write directly using the sequence without creating an additional Memory/Span + foreach (ReadOnlyMemory memory in encodedSegment) + { + await _bearer.Writer.WriteAsync(memory, cancellationToken); + } + + // Use ValueTask.WhenAll to potentially process multiple operations in parallel + await _bearer.Writer.FlushAsync(cancellationToken); + } + + /// + /// Calculates the transmission time relative to the muxer start time. + /// + /// The transmission time in milliseconds. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private uint CalculateTransmissionTime() => + (uint)Math.Min((DateTimeOffset.UtcNow - _startTime).TotalMilliseconds, uint.MaxValue); + + /// + /// Runs the muxer, continuously reading messages from the channel and writing them to the bearer. + /// + /// A token to cancel the operation. + public async Task RunAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + try + { + ReadResult protocolMessageResult = await _pipe.Reader.ReadAsync(cancellationToken); + ReadOnlySequence protocolMessageBuffer = protocolMessageResult.Buffer; + + // protocol id + ReadOnlySequence protocolIdSlice = protocolMessageBuffer.Slice(0, 1); + ProtocolType protocolId = (ProtocolType)protocolIdSlice.FirstSpan[0]; + + // payload length + ReadOnlySequence payloadLengthSlice = protocolMessageBuffer.Slice(1, 2); + ushort payloadLength = BinaryPrimitives.ReadUInt16BigEndian(payloadLengthSlice.FirstSpan); + + // payload + ReadOnlySequence payloadSlice = protocolMessageBuffer.Slice(3, payloadLength); + + MuxSegmentHeader segmentHeader = new( + TransmissionTime: CalculateTransmissionTime(), + ProtocolId: protocolId, + PayloadLength: (ushort)Math.Min(payloadSlice.Length, ProtocolConstants.MaxSegmentPayloadLength), + Mode: _muxerMode == ProtocolMode.Responder + ); + + MuxSegment segment = new(segmentHeader, payloadSlice); + await WriteSegmentAsync(segment, cancellationToken); + _pipe.Reader.AdvanceTo(payloadSlice.End); + + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + break; + } + catch { } + } + + _pipe.Writer.Complete(); + } + + /// + /// Disposes the resources used by the muxer. + /// + public void Dispose() + { + if (_isDisposed) return; + + // Complete the channel + _pipe.Writer.Complete(); + + // Don't dispose bearer here - it's provided externally + _isDisposed = true; + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/NodeClient.cs b/src/Chrysalis.Network/Multiplexer/NodeClient.cs new file mode 100644 index 00000000..49af9268 --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/NodeClient.cs @@ -0,0 +1,94 @@ +using Chrysalis.Network.Core; +using Chrysalis.Network.MiniProtocols; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Provides a high-level client for connecting to Cardano nodes. +/// +public class NodeClient : IDisposable +{ + private readonly Plexer _plexer; + + /// + /// Gets the LocalTxSubmit protocol handler. + /// + + // public LocalTxSubmit? LocalTxSubmit { get; private set; } + + /// + /// Gets the Handshake protocol handler. + /// + public Handshake? Handshake { get; private set; } + + /// + /// Gets the LocalStateQuery protocol handler. + /// + //public LocalStateQuery? LocalStateQuery { get; private set; } + + /// + /// Gets the ChainSync protocol handler. + /// + public ChainSync? ChainSync { get; private set; } + // public LocalTxSubmit? LocalTxSubmit { get; private set; } + + + /// + /// Initializes a new instance of the NodeClient class. + /// + /// The multiplexer for managing protocol channels. + private NodeClient(Plexer plexer) + { + _plexer = plexer ?? throw new ArgumentNullException(nameof(plexer)); + } + + /// + /// Creates and connects a new NodeClient instance to a Cardano node. + /// + /// The path to the node's Unix domain socket. + /// A token to cancel the connection operation. + /// A connected NodeClient instance. + /// Thrown if the connection fails. + public static async Task ConnectAsync(string socketPath, CancellationToken cancellationToken = default) + { + UnixBearer unixBearer = await UnixBearer.CreateAsync(socketPath, cancellationToken); + Plexer plexer = new(unixBearer); + return new(plexer); + } + + /// + /// Creates and connects a new NodeClient instance to a Cardano node over TCP. + /// + /// The host to connect to. + /// The port to connect to. + /// A token to cancel the connection operation. + /// A connected NodeClient instance. + public static async Task ConnectTcpAsync(string host, int port, CancellationToken cancellationToken = default) + { + TcpBearer tcpBearer = await TcpBearer.CreateAsync(host, port, cancellationToken); + Plexer plexer = new(tcpBearer); + return new(plexer); + } + + /// + /// Starts the client and initializes protocol handlers. + /// + /// A token to cancel the start operation. + /// Thrown if the client is already started. + public void Start() + { + _ = _plexer.RunAsync(CancellationToken.None); + Handshake = new(_plexer.SubscribeClient(ProtocolType.Handshake)); + ChainSync = new(_plexer.SubscribeClient(ProtocolType.ClientChainSync)); + // LocalTxSubmit = new(_plexer.SubscribeClient(ProtocolType.LocalTxSubmission)); + } + + /// + /// Disposes the client and releases all resources. + /// + public void Dispose() + { + _plexer.Dispose(); + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/Plexer.cs b/src/Chrysalis.Network/Multiplexer/Plexer.cs new file mode 100644 index 00000000..b0d3e60f --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/Plexer.cs @@ -0,0 +1,67 @@ +using System.IO.Pipelines; +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Provides bidirectional multiplexing capabilities over a single bearer. +/// +/// +/// Initializes a new instance of the Plexer class. +/// +/// The bearer providing the physical connection. +public sealed class Plexer(IBearer bearer) : IDisposable +{ + private readonly Demuxer _demuxer = new(bearer); + private readonly Muxer _muxer = new(bearer, ProtocolMode.Initiator); + private bool _isDisposed; + + /// + /// Creates a channel for client-side protocol communication. + /// + /// The protocol type to subscribe to. + /// A bidirectional agent channel for the specified protocol. + public AgentChannel SubscribeClient(ProtocolType protocol) + { + PipeWriter writer = _muxer.Writer; + PipeReader reader = _demuxer.Subscribe(protocol); + return new AgentChannel(protocol, writer, reader); + } + + /// + /// Creates a channel for server-side protocol communication. + /// + /// The protocol type to subscribe to. + /// A bidirectional agent channel for the specified protocol. + public AgentChannel SubscribeServer(ProtocolType protocol) => SubscribeClient(protocol); + /// + /// Starts the plexer, running both the demuxer and muxer. + /// + /// A token to cancel the operation. + /// A task that completes when the plexer stops. + /// Thrown if the plexer is already running. + public async Task RunAsync(CancellationToken cancellationToken) + { + await Task.WhenAny( + _demuxer.RunAsync(cancellationToken), + _muxer.RunAsync(cancellationToken) + ); + + throw new InvalidOperationException("Something went wrong"); + } + + /// + /// Disposes the resources used by the plexer. + /// + public void Dispose() + { + if (_isDisposed) + return; + + _muxer.Dispose(); + _demuxer.Dispose(); + + _isDisposed = true; + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/src/Chrysalis.Network/Multiplexer/ProtocolMessage.cs b/src/Chrysalis.Network/Multiplexer/ProtocolMessage.cs new file mode 100644 index 00000000..37974b36 --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/ProtocolMessage.cs @@ -0,0 +1,10 @@ +using Chrysalis.Network.Core; + +namespace Chrysalis.Network.Multiplexer; + +/// +/// Represents a message consisting of a protocol type and payload. +/// +/// The protocol type. +/// The payload data. +public partial record ProtocolMessage(ProtocolType Protocol, byte[] Payload); diff --git a/src/Chrysalis.Network/Multiplexer/ProtocolMode.cs b/src/Chrysalis.Network/Multiplexer/ProtocolMode.cs new file mode 100644 index 00000000..4d94b932 --- /dev/null +++ b/src/Chrysalis.Network/Multiplexer/ProtocolMode.cs @@ -0,0 +1,10 @@ +namespace Chrysalis.Network.Multiplexer; + +/// +/// Specifies the mode of operation for the Muxer. +/// +public enum ProtocolMode +{ + Initiator, + Responder +} diff --git a/src/Chrysalis.Plutus.Cli/Chrysalis.Plutus.Cli.csproj b/src/Chrysalis.Plutus.Cli/Chrysalis.Plutus.Cli.csproj new file mode 100644 index 00000000..3e68dd68 --- /dev/null +++ b/src/Chrysalis.Plutus.Cli/Chrysalis.Plutus.Cli.csproj @@ -0,0 +1,14 @@ + + + + + + + + Exe + net9.0 + enable + enable + + + diff --git a/src/Chrysalis.Plutus.Cli/Program.cs b/src/Chrysalis.Plutus.Cli/Program.cs new file mode 100644 index 00000000..8a04da10 --- /dev/null +++ b/src/Chrysalis.Plutus.Cli/Program.cs @@ -0,0 +1,20 @@ +using Chrysalis.Plutus.VM.EvalTx; + +Console.WriteLine("PlutusVM.Net Transaction Evaluator"); +Console.WriteLine("=================================="); + +string txCborHex = "84a800d90102818258208169cfb0dd7b3686287e4cfff4bc63c883cb4d970c879c07075c30066bd1fbaa000181825839015c5c318d01f729e205c95eb1b02d623dd10e78ea58f72d0c13f892b2e8904edc699e2f0ce7b72be7cec991df651a222e2ae9244eb5975cba1a001bc9fd021a0002ba830b58201124502b69ef6917c02db98f8026871e95a70fcc864eb8146bfd44237612b4670dd90102818258208169cfb0dd7b3686287e4cfff4bc63c883cb4d970c879c07075c30066bd1fbaa0110825839015c5c318d01f729e205c95eb1b02d623dd10e78ea58f72d0c13f892b2e8904edc699e2f0ce7b72be7cec991df651a222e2ae9244eb5975cba1a051f966a111a000417c512d9010281825820decc54303906cd11d6edbcaac049baa9959adfee815e1736a4d364094c98e41900a200d90102818258202a60dcffe8ba15307556dbf8d7df142cb9eb15d601251d400d523689d575b83858402d92e12ab3227a7260456f9a4620d5be9b0a05bf7e9750f2a2c92287177adbb019dcbe1da9bf82bff442a1cc79711a5c1dc670386fda1c6fc15c6b3fa868950705a182000082d8799f4568656c6c6fff82194d101a005ee1c6f5f6"; +string utxoHex = "82828258208169CFB0DD7B3686287E4CFFF4BC63C883CB4D970C879C07075C30066BD1FBAA00A300581D71FAAE60072C45D121B6E58AE35C624693EE3DAD9EA8ED765EB6F76F9F011A001E8480028201D8184AD8799F4568656C6C6FFF82825820DECC54303906CD11D6EDBCAAC049BAA9959ADFEE815E1736A4D364094C98E41900A300581D71FAAE60072C45D121B6E58AE35C624693EE3DAD9EA8ED765EB6F76F9F011A0018CB2603D81858AD820358A958A701010032323232323225333002323232323253330073370E900118041BAA0011323322533300A3370E900018059BAA00513232533300F30110021533300C3370E900018069BAA00313371E6EB8C040C038DD50039BAE3010300E37546020601C6EA800C5858DD7180780098061BAA00516300C001300C300D001300937540022C6014601600660120046010004601000260086EA8004526136565734AAE7555CF2AB9F5742AE89"; + +var results = Evaluator.EvaluateTx(txCborHex, utxoHex); + +Console.WriteLine("\nEvaluation Results"); +for (int i = 0; i < results.Count; i++) +{ + var result = results[i]; + Console.WriteLine($"Redeemer Tag: {result.RedeemerTag}"); + Console.WriteLine($"Index: {result.Index}"); + Console.WriteLine($"ExUnits:"); + Console.WriteLine($" Memory: {result.ExUnits.Mem}"); + Console.WriteLine($" Steps: {result.ExUnits.Steps}"); +} \ No newline at end of file diff --git a/src/Chrysalis.Plutus/Chrysalis.Plutus.csproj b/src/Chrysalis.Plutus/Chrysalis.Plutus.csproj new file mode 100644 index 00000000..8804933f --- /dev/null +++ b/src/Chrysalis.Plutus/Chrysalis.Plutus.csproj @@ -0,0 +1,58 @@ + + + + net9.0 + enable + true + enable + 0.1.0 + Chrysalis.Plutus + ricoquiblat@saib.dev + SAIB Inc + README.md + LICENSE.md + + + + + + + + + true + PreserveNewest + %(FileName)%(Extension) + + + + + + true + PreserveNewest + %(FileName)%(Extension) + + + + + + libpallas_dotnet_rs.so + Always + true + runtimes/linux-x64/native + true + + + + + + + libplutus_vm_dotnet_rs.dylib + Always + true + runtimes/osx-arm64/native + true + + + + + diff --git a/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/Cargo.lock b/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/Cargo.lock new file mode 100644 index 00000000..dfec020f --- /dev/null +++ b/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/Cargo.lock @@ -0,0 +1,1895 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-trait" +version = "0.1.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bip39" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33415e24172c1b7d6066f6d999545375ab8e1d95421d6784bdfff9496f292387" +dependencies = [ + "bitcoin_hashes 0.13.0", + "rand_core", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals", + "hex-conservative 0.1.2", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative 0.2.1", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "chumsky" +version = "1.0.0-alpha.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7b80276986f86789dc56ca6542d53bba9cda3c66091ebbe7bd96fc1bdf20f1f" +dependencies = [ + "hashbrown 0.14.5", + "regex-automata 0.3.9", + "serde", + "stacker", + "unicode-ident", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "cryptoxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382ce8820a5bb815055d3553a610e8cb542b2d767bbacea99038afda96cd760d" + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "ed25519-bip32" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb588f93c0d91b2f668849fd6d030cddb0b2e31f105963be189da5acdf492a21" +dependencies = [ + "cryptoxide", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "gmp-mpfr-sys" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0205cd82059bc63b63cf516d714352a30c44f2c74da9961dfda2617ae6b5918" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" + +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "linux-raw-sys" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "minicbor" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0452a60c1863c1f50b5f77cd295e8d2786849f35883f0b9e18e7e6e1b5691b0" +dependencies = [ + "minicbor-derive 0.15.3", +] + +[[package]] +name = "minicbor" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dedac5a67c5a5ddd9d3216db985a091b0503484725ce5e106551e0459bcbf61f" +dependencies = [ + "half", + "minicbor-derive 0.16.0", +] + +[[package]] +name = "minicbor-derive" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd2209fff77f705b00c737016a48e73733d7fbccb8b007194db148f03561fb70" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "minicbor-derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1164934feccd1ca0b67754a8656c409ec80c5888bcbdb6a7ccd2e43722d819c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" + +[[package]] +name = "pallas" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "pallas-addresses", + "pallas-codec", + "pallas-configs", + "pallas-crypto", + "pallas-network", + "pallas-primitives", + "pallas-traverse", + "pallas-txbuilder", + "pallas-utxorpc", + "pallas-validate", +] + +[[package]] +name = "pallas-addresses" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "base58", + "bech32", + "crc", + "cryptoxide", + "hex", + "pallas-codec", + "pallas-crypto", + "thiserror", +] + +[[package]] +name = "pallas-codec" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "hex", + "minicbor 0.26.1", + "serde", + "thiserror", +] + +[[package]] +name = "pallas-configs" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "base64 0.22.1", + "num-rational", + "pallas-addresses", + "pallas-crypto", + "pallas-primitives", + "serde", + "serde_json", + "serde_with", +] + +[[package]] +name = "pallas-crypto" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "cryptoxide", + "hex", + "pallas-codec", + "rand_core", + "serde", + "thiserror", +] + +[[package]] +name = "pallas-network" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "byteorder", + "hex", + "itertools 0.13.0", + "pallas-codec", + "pallas-crypto", + "rand", + "socket2", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "pallas-primitives" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "hex", + "pallas-codec", + "pallas-crypto", + "serde", + "serde_json", +] + +[[package]] +name = "pallas-traverse" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "hex", + "itertools 0.13.0", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "paste", + "serde", + "thiserror", +] + +[[package]] +name = "pallas-txbuilder" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "hex", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "pallas-traverse", + "pallas-wallet", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "pallas-utxorpc" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "pallas-traverse", + "pallas-validate", + "prost-types", + "utxorpc-spec", +] + +[[package]] +name = "pallas-validate" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "chrono", + "hex", + "itertools 0.14.0", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "pallas-traverse", + "rug", + "serde", + "thiserror", + "tracing", + "uplc", +] + +[[package]] +name = "pallas-wallet" +version = "0.32.0" +source = "git+https://github.com/txpipe/pallas.git#04dee64dbd5fad7833f0a0b876709042622380e0" +dependencies = [ + "bech32", + "bip39", + "cryptoxide", + "ed25519-bip32", + "pallas-crypto", + "rand", + "thiserror", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pbjson-build" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" +dependencies = [ + "heck", + "itertools 0.13.0", + "prost", + "prost-types", +] + +[[package]] +name = "pbjson-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887" +dependencies = [ + "bytes", + "chrono", + "pbjson", + "pbjson-build", + "prost", + "prost-build", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap 2.8.0", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "plutus-vm-dotnet-rs" +version = "0.1.0" +dependencies = [ + "chrono", + "hex", + "pallas", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.23", +] + +[[package]] +name = "prettyplease" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "psm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88" +dependencies = [ + "cc", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rug" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3" +dependencies = [ + "az", + "gmp-mpfr-sys", + "libc", + "libm", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes 0.14.0", + "rand", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.8.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stacker" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9156ebd5870ef293bfb43f91c7a74528d363ec0d424afe24160ed5a4343d08a" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" +dependencies = [ + "cfg-if", + "fastrand", + "getrandom 0.3.1", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" + +[[package]] +name = "time-macros" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "http", + "http-body", + "http-body-util", + "percent-encoding", + "pin-project", + "prost", + "tokio-stream", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "uplc" +version = "0.1.0" +source = "git+https://github.com/pragma-org/uplc.git#0c307f84123c51a7436aad0e3ef853e9f6b12662" +dependencies = [ + "blst", + "bumpalo", + "chumsky", + "cryptoxide", + "minicbor 0.25.1", + "once_cell", + "rug", + "secp256k1", + "thiserror", +] + +[[package]] +name = "utxorpc-spec" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7148c5cd211c397a41245cfbd8d4cb8371d748ed5e3cf131ebcd9cacfa794206" +dependencies = [ + "bytes", + "futures-core", + "pbjson", + "pbjson-types", + "prost", + "prost-types", + "serde", + "tonic", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +dependencies = [ + "zerocopy-derive 0.8.23", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/Cargo.toml b/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/Cargo.toml new file mode 100644 index 00000000..7a1526b1 --- /dev/null +++ b/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "plutus-vm-dotnet-rs" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + + +[dependencies] +hex = "0.4" +chrono = "0.4.39" + +pallas = { git = "https://github.com/txpipe/pallas.git", features = ["phase-two"] } +# pallas = { path = "../../../../../pallas/pallas", features = ["phase-two"] } diff --git a/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/src/lib.rs b/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/src/lib.rs new file mode 100644 index 00000000..6ec76acf --- /dev/null +++ b/src/Chrysalis.Plutus/Dependencies/plutus-vm-dotnet-rs/src/lib.rs @@ -0,0 +1,540 @@ +use pallas::codec::minicbor::{self, Decode, Encode}; +use pallas::codec::utils::{CborWrap, KeepRaw, KeyValuePairs}; +use pallas::ledger::primitives::conway::{ + CostModels, DRepVotingThresholds, MintedTx, NativeScript, PoolVotingThresholds, + PseudoDatumOption, PseudoScript, PseudoTransactionOutput, TransactionOutput, +}; +use pallas::ledger::primitives::{ + self as pallas_primitives, ExUnits, PlutusData, RationalNumber, TransactionInput, +}; +use pallas::ledger::traverse::{Era, MultiEraInput, MultiEraOutput, MultiEraTx}; +use pallas::ledger::validate::uplc::script_context::SlotConfig; +use pallas::ledger::validate::uplc::tx::{eval_tx as eval_tx_raw, TxEvalResult}; +use pallas::ledger::validate::utils::{ + ConwayProtParams, EraCbor, MultiEraProtocolParameters, TxoRef, UtxoMap, +}; +use std::borrow::Cow; +use std::os::raw::{c_uint, c_ulong}; +use std::slice; + +#[repr(C)] +pub struct CTxEvalResult { + pub tag: u8, + pub index: c_uint, + pub memory: c_ulong, + pub steps: c_ulong, +} + +#[repr(C)] +pub struct CTxEvalResultArray { + ptr: *mut CTxEvalResult, + len: usize, +} + +#[derive(Decode, Encode, Clone)] +pub struct ResolvedInput { + #[n(0)] + pub input: TransactionInput, + #[n(1)] + pub output: TransactionOutput, +} + + +impl CTxEvalResultArray { + fn null() -> Self { + CTxEvalResultArray { + ptr: std::ptr::null_mut(), + len: 0, + } + } + + fn from_vec(mut vec: Vec) -> Self { + if vec.is_empty() { + return Self::null(); + } + + let ptr = vec.as_mut_ptr(); + let len = vec.len(); + + std::mem::forget(vec); + + CTxEvalResultArray { ptr, len } + } +} + +#[no_mangle] +pub unsafe extern "C" fn eval_tx( + transaction_cbor_bytes: *const u8, + transaction_cbor_len: usize, + resolved_utxo_cbor_bytes: *const u8, + resolved_utxo_cbor_len: usize, +) -> CTxEvalResultArray { + let transaction_cbor = + bytes_from_raw_parts(transaction_cbor_bytes, transaction_cbor_len).unwrap(); + + let utxo_cbor = bytes_from_raw_parts(resolved_utxo_cbor_bytes, resolved_utxo_cbor_len).unwrap(); + + let c_results = eval(transaction_cbor, utxo_cbor) + .unwrap() + .into_iter() + .map(|result| CTxEvalResult { + tag: result.tag as u8, + index: result.index, + memory: result.units.mem, + steps: result.units.steps, + }) + .collect(); + + CTxEvalResultArray::from_vec(c_results) +} + +#[no_mangle] +pub unsafe extern "C" fn free_eval_results(results: *mut CTxEvalResult, len: usize) { + if !results.is_null() && len > 0 { + let _ = Vec::from_raw_parts(results, len, len); + } +} + +unsafe fn bytes_from_raw_parts(ptr: *const u8, len: usize) -> Option<&'static [u8]> { + if ptr.is_null() || len == 0 { + return None; + } + Some(slice::from_raw_parts(ptr, len)) +} + +fn eval(transaction_cbor: &[u8], utxo_cbor: &[u8]) -> Result, String> { + let mtx: MintedTx = minicbor::decode(transaction_cbor) + .map_err(|e| format!("Failed to decode transaction: {}", e))?; + + let metx = MultiEraTx::from_conway(&mtx); + + let resolved_inputs: Vec = + minicbor::decode(utxo_cbor).map_err(|e| format!("Failed to decode UTXOs: {}", e))?; + + let utxos = build_utxo_map(resolved_inputs); + + let prot_params = MultiEraProtocolParameters::Conway(protocol_params()); + + eval_tx_raw(&metx, &prot_params, &utxos, &SlotConfig::default()) + .map_err(|e| format!("Evaluation failed: {}", e)) +} + +fn build_utxo_map(resolved_inputs: Vec) -> UtxoMap { + let mut utxos: UtxoMap = UtxoMap::new(); + + for resolved_input in resolved_inputs { + let multi_era_in: MultiEraInput = + MultiEraInput::AlonzoCompatible(Box::new(Cow::Owned(resolved_input.input))); + + match resolved_input.output { + PseudoTransactionOutput::Legacy(output) => { + let multi_era_out: MultiEraOutput = + MultiEraOutput::from_alonzo_compatible(&output, Era::Alonzo); + utxos.insert(TxoRef::from(&multi_era_in), EraCbor::from(multi_era_out)); + } + PseudoTransactionOutput::PostAlonzo(tx_out) => { + let mut new_datum_buf: Vec = Vec::new(); + + let datum = match tx_out.datum_option { + Some(datum) => match datum { + PseudoDatumOption::Data(data) => { + let _ = minicbor::encode(data.unwrap(), &mut new_datum_buf); + let keep_raw_new_datum: KeepRaw = Decode::decode( + &mut minicbor::Decoder::new(new_datum_buf.as_slice()), + &mut (), + ) + .unwrap_or_else(|_| panic!("Failed to decode datum")); + Some(PseudoDatumOption::Data(CborWrap(keep_raw_new_datum))) + } + PseudoDatumOption::Hash(_) => None, + }, + None => None, + }; + + let mut new_script_buf: Vec = Vec::new(); + + let script_ref = match tx_out.script_ref { + Some(script_ref) => match script_ref.unwrap() { + PseudoScript::NativeScript(script) => { + let _ = minicbor::encode(script, &mut new_script_buf); + let keep_raw_new_script: KeepRaw = Decode::decode( + &mut minicbor::Decoder::new(&new_script_buf.as_slice()), + &mut (), + ) + .unwrap_or_else(|_| panic!("Failed to decode script")); + Some(CborWrap(PseudoScript::NativeScript(keep_raw_new_script))) + } + PseudoScript::PlutusV1Script(script) => { + Some(CborWrap(PseudoScript::PlutusV1Script(script))) + } + PseudoScript::PlutusV2Script(script) => { + Some(CborWrap(PseudoScript::PlutusV2Script(script))) + } + PseudoScript::PlutusV3Script(script) => { + Some(CborWrap(PseudoScript::PlutusV3Script(script))) + } + }, + None => None, + }; + + let tx_out: pallas_primitives::conway::MintedTransactionOutput = + pallas_primitives::conway::PseudoTransactionOutput::PostAlonzo( + pallas_primitives::conway::MintedPostAlonzoTransactionOutput { + address: tx_out.address, + value: tx_out.value.clone(), + datum_option: datum, + script_ref, + }, + ); + let multi_era_out: MultiEraOutput = + MultiEraOutput::Conway(Box::new(Cow::Owned(tx_out))); + utxos.insert(TxoRef::from(&multi_era_in), EraCbor::from(multi_era_out)); + } + } + } + + utxos +} + +fn protocol_params() -> ConwayProtParams { + ConwayProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2022-10-25T00:00:00Z").unwrap(), + epoch_length: 432000, + slot_length: 1, + minfee_a: 44, + minfee_b: 155381, + max_block_body_size: 90112, + max_transaction_size: 16384, + max_block_header_size: 1100, + key_deposit: 2000000, + pool_deposit: 500000000, + maximum_epoch: 18, + desired_number_of_stake_pools: 500, + pool_pledge_influence: RationalNumber { + numerator: 3, + denominator: 10, + }, + expansion_rate: RationalNumber { + numerator: 3, + denominator: 1000, + }, + treasury_growth_rate: RationalNumber { + numerator: 2, + denominator: 10, + }, + protocol_version: (7, 0), + min_pool_cost: 340000000, + ada_per_utxo_byte: 4310, + cost_models_for_script_languages: CostModels { + plutus_v1: Some(vec![ + 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, + 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, + 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, + 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, + 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, + 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, + 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, + 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, + 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 806990, 30482, 4, 1927926, + 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, + 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 9462713, 1021, 10, + ]), + + plutus_v2: Some(vec![ + 205665, + 812, + 1, + 1, + 1000, + 571, + 0, + 1, + 1000, + 24177, + 4, + 1, + 1000, + 32, + 117366, + 10475, + 4, + 23000, + 100, + 23000, + 100, + 23000, + 100, + 23000, + 100, + 23000, + 100, + 23000, + 100, + 100, + 100, + 23000, + 100, + 19537, + 32, + 175354, + 32, + 46417, + 4, + 221973, + 511, + 0, + 1, + 89141, + 32, + 497525, + 14068, + 4, + 2, + 196500, + 453240, + 220, + 0, + 1, + 1, + 1000, + 28662, + 4, + 2, + 245000, + 216773, + 62, + 1, + 1060367, + 12586, + 1, + 208512, + 421, + 1, + 187000, + 1000, + 52998, + 1, + 80436, + 32, + 43249, + 32, + 1000, + 32, + 80556, + 1, + 57667, + 4, + 1000, + 10, + 197145, + 156, + 1, + 197145, + 156, + 1, + 204924, + 473, + 1, + 208896, + 511, + 1, + 52467, + 32, + 64832, + 32, + 65493, + 32, + 22558, + 32, + 16563, + 32, + 76511, + 32, + 196500, + 453240, + 220, + 0, + 1, + 1, + 69522, + 11687, + 0, + 1, + 60091, + 32, + 196500, + 453240, + 220, + 0, + 1, + 1, + 196500, + 453240, + 220, + 0, + 1, + 1, + 1159724, + 392670, + 0, + 2, + 806990, + 30482, + 4, + 1927926, + 82523, + 4, + 265318, + 0, + 4, + 0, + 85931, + 32, + 205665, + 812, + 1, + 1, + 41182, + 32, + 212342, + 32, + 31220, + 32, + 32696, + 32, + 43357, + 32, + 32247, + 32, + 38314, + 32, + 20000000000, + 20000000000, + 9462713, + 1021, + 10, + 20000000000, + 0, + 20000000000, + ]), + plutus_v3: Some(vec![ + 100788, 420, 1, 1, 1000, 173, 0, 1, 1000, 59957, 4, 1, 11183, 32, 201305, 8356, 4, + 16000, 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 100, 100, + 16000, 100, 94375, 32, 132994, 32, 61462, 4, 72010, 178, 0, 1, 22151, 32, 91189, + 769, 4, 2, 85848, 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 1, 1000, 42921, + 4, 2, 24548, 29498, 38, 1, 898148, 27279, 1, 51775, 558, 1, 39184, 1000, 60594, 1, + 141895, 32, 83150, 32, 15299, 32, 76049, 1, 13169, 4, 22100, 10, 28999, 74, 1, + 28999, 74, 1, 43285, 552, 1, 44749, 541, 1, 33852, 32, 68246, 32, 72362, 32, 7243, + 32, 7391, 32, 11546, 32, 85848, 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, + 90434, 519, 0, 1, 74433, 32, 85848, 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, + 1, 85848, 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 955506, 213312, 0, 2, + 270652, 22588, 4, 1457325, 64566, 4, 20467, 1, 4, 0, 141992, 32, 100788, 420, 1, 1, + 81663, 32, 59498, 32, 20142, 32, 24588, 32, 20744, 32, 25933, 32, 24623, 32, + 43053543, 10, 53384111, 14333, 10, 43574283, 26308, 10, 16000, 100, 16000, 100, + 962335, 18, 2780678, 6, 442008, 1, 52538055, 3756, 18, 267929, 18, 76433006, 8868, + 18, 52948122, 18, 1995836, 36, 3227919, 12, 901022, 1, 166917843, 4307, 36, 284546, + 36, 158221314, 26549, 36, 74698472, 36, 333849714, 1, 254006273, 72, 2174038, 72, + 2261318, 64571, 4, 207616, 8310, 4, 1293828, 28716, 63, 0, 1, 1006041, 43623, 251, + 0, 1, 100181, 726, 719, 0, 1, 100181, 726, 719, 0, 1, 100181, 726, 719, 0, 1, + 107878, 680, 0, 1, 95336, 1, 281145, 18848, 0, 1, 180194, 159, 1, 1, 158519, 8942, + 0, 1, 159378, 8813, 0, 1, 107490, 3298, 1, 106057, 655, 1, 1964219, 24520, 3, + ]), + unknown: KeyValuePairs::from(vec![]), + }, + execution_costs: pallas_primitives::ExUnitPrices { + mem_price: RationalNumber { + numerator: 577, + denominator: 10000, + }, + step_price: RationalNumber { + numerator: 721, + denominator: 10000000, + }, + }, + max_tx_ex_units: ExUnits { + mem: 14000000, + steps: 10000000000, + }, + max_block_ex_units: ExUnits { + mem: 62000000, + steps: 40000000000, + }, + max_value_size: 5000, + collateral_percentage: 150, + max_collateral_inputs: 3, + pool_voting_thresholds: PoolVotingThresholds { + motion_no_confidence: RationalNumber { + numerator: 0, + denominator: 1, + }, + committee_normal: RationalNumber { + numerator: 0, + denominator: 1, + }, + committee_no_confidence: RationalNumber { + numerator: 0, + denominator: 1, + }, + hard_fork_initiation: RationalNumber { + numerator: 0, + denominator: 1, + }, + security_voting_threshold: RationalNumber { + numerator: 0, + denominator: 1, + }, + }, + drep_voting_thresholds: DRepVotingThresholds { + motion_no_confidence: RationalNumber { + numerator: 0, + denominator: 1, + }, + committee_normal: RationalNumber { + numerator: 0, + denominator: 1, + }, + committee_no_confidence: RationalNumber { + numerator: 0, + denominator: 1, + }, + update_constitution: RationalNumber { + numerator: 0, + denominator: 1, + }, + hard_fork_initiation: RationalNumber { + numerator: 0, + denominator: 1, + }, + pp_network_group: RationalNumber { + numerator: 0, + denominator: 1, + }, + pp_economic_group: RationalNumber { + numerator: 0, + denominator: 1, + }, + pp_technical_group: RationalNumber { + numerator: 0, + denominator: 1, + }, + pp_governance_group: RationalNumber { + numerator: 0, + denominator: 1, + }, + treasury_withdrawal: RationalNumber { + numerator: 0, + denominator: 1, + }, + }, + min_committee_size: 0, + committee_term_limit: 0, + governance_action_validity_period: 0, + governance_action_deposit: 0, + drep_deposit: 0, + drep_inactivity_period: 0, + minfee_refscript_cost_per_byte: RationalNumber { + numerator: 0, + denominator: 1, + }, + } +} diff --git a/src/Chrysalis.Plutus/VM/EvalTx/Evaluator.cs b/src/Chrysalis.Plutus/VM/EvalTx/Evaluator.cs new file mode 100644 index 00000000..580e2ecd --- /dev/null +++ b/src/Chrysalis.Plutus/VM/EvalTx/Evaluator.cs @@ -0,0 +1,58 @@ +using System.Runtime.InteropServices; +using Chrysalis.Plutus.VM.Models; +using Chrysalis.Plutus.VM.Models.Interop; +using Chrysalis.Plutus.VM.Models.Enums; +using Chrysalis.Plutus.VM.Interop; + +namespace Chrysalis.Plutus.VM.EvalTx; + + +public static class Evaluator +{ + + public static IReadOnlyList EvaluateTx(string txCborHex, string utxosCborHex) + { + byte[] txCborBytes = Convert.FromHexString(txCborHex); + byte[] utxosCborBytes = Convert.FromHexString(utxosCborHex); + + return EvaluateTx(txCborBytes, utxosCborBytes); + } + + public static IReadOnlyList EvaluateTx(byte[] txCborBytes, byte[] utxosCborBytes) + { + TxEvalResultArray resultArray = NativeMethods.EvalTxRaw( + txCborBytes, + (nuint)txCborBytes.Length, + utxosCborBytes, + (nuint)utxosCborBytes.Length + ); + + try + { + + var results = new List((int)resultArray.Length); + int structSize = Marshal.SizeOf(); + + for (int i = 0; i < (int)resultArray.Length; i++) + { + IntPtr currentPtr = IntPtr.Add(resultArray.Ptr, i * structSize); + TxEvalResult result = Marshal.PtrToStructure(currentPtr); + results.Add(new EvaluationResult( + (RedeemerTag)result.Tag, + result.Index, + new ExUnits(result.Memory, result.Steps) + )); + } + + return results; + } + finally + { + NativeMethods.FreeEvalResults(resultArray); + } + + + } + + +} \ No newline at end of file diff --git a/src/Chrysalis.Plutus/VM/Interop/NativeMethods.cs b/src/Chrysalis.Plutus/VM/Interop/NativeMethods.cs new file mode 100644 index 00000000..8f46b766 --- /dev/null +++ b/src/Chrysalis.Plutus/VM/Interop/NativeMethods.cs @@ -0,0 +1,20 @@ +using System.Runtime.InteropServices; +using Chrysalis.Plutus.VM.Models.Interop; + +namespace Chrysalis.Plutus.VM.Interop; + +internal static partial class NativeMethods +{ + private const string LibraryName = "plutus_vm_dotnet_rs"; + + [LibraryImport(LibraryName, EntryPoint = "eval_tx")] + public static partial TxEvalResultArray EvalTxRaw( + [In] byte[] txCborBytes, + nuint txCborBytesLength, + [In] byte[] utxoCborBytes, + nuint utxoCborBytesLength + ); + + [LibraryImport(LibraryName, EntryPoint = "free_eval_results")] + public static partial void FreeEvalResults(TxEvalResultArray results); +} \ No newline at end of file diff --git a/src/Chrysalis.Plutus/VM/Models/Enums/RedeemerTag.cs b/src/Chrysalis.Plutus/VM/Models/Enums/RedeemerTag.cs new file mode 100644 index 00000000..9e0fc204 --- /dev/null +++ b/src/Chrysalis.Plutus/VM/Models/Enums/RedeemerTag.cs @@ -0,0 +1,11 @@ +namespace Chrysalis.Plutus.VM.Models.Enums; + +public enum RedeemerTag +{ + Spend = 0, + Mint = 1, + Cert = 2, + Reward = 3, + Vote = 4, + Propose = 5, +} diff --git a/src/Chrysalis.Plutus/VM/Models/EvaluationResult.cs b/src/Chrysalis.Plutus/VM/Models/EvaluationResult.cs new file mode 100644 index 00000000..1c0ed85e --- /dev/null +++ b/src/Chrysalis.Plutus/VM/Models/EvaluationResult.cs @@ -0,0 +1,5 @@ +using Chrysalis.Plutus.VM.Models.Enums; + +namespace Chrysalis.Plutus.VM.Models; + +public record EvaluationResult(RedeemerTag RedeemerTag, uint Index, ExUnits ExUnits); \ No newline at end of file diff --git a/src/Chrysalis.Plutus/VM/Models/ExUnits.cs b/src/Chrysalis.Plutus/VM/Models/ExUnits.cs new file mode 100644 index 00000000..caa58062 --- /dev/null +++ b/src/Chrysalis.Plutus/VM/Models/ExUnits.cs @@ -0,0 +1,3 @@ +namespace Chrysalis.Plutus.VM.Models; + +public record ExUnits(ulong Mem, ulong Steps); \ No newline at end of file diff --git a/src/Chrysalis.Plutus/VM/Models/Interop/TxEvalResult.cs b/src/Chrysalis.Plutus/VM/Models/Interop/TxEvalResult.cs new file mode 100644 index 00000000..b846e46e --- /dev/null +++ b/src/Chrysalis.Plutus/VM/Models/Interop/TxEvalResult.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Chrysalis.Plutus.VM.Models.Interop; + +[StructLayout(LayoutKind.Sequential)] +internal struct TxEvalResult +{ + public byte Tag; + public uint Index; + public ulong Memory; + public ulong Steps; +} \ No newline at end of file diff --git a/src/Chrysalis.Plutus/VM/Models/Interop/TxEvalResultsArray.cs b/src/Chrysalis.Plutus/VM/Models/Interop/TxEvalResultsArray.cs new file mode 100644 index 00000000..2be00a7a --- /dev/null +++ b/src/Chrysalis.Plutus/VM/Models/Interop/TxEvalResultsArray.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; + +namespace Chrysalis.Plutus.VM.Models.Interop; + +[StructLayout(LayoutKind.Sequential)] +internal struct TxEvalResultArray +{ + public IntPtr Ptr; + + public nuint Length; + + public readonly bool IsEmpty => Ptr == IntPtr.Zero || Length == 0; + +} diff --git a/src/Chrysalis.Plutus/build-rs.sh b/src/Chrysalis.Plutus/build-rs.sh new file mode 100755 index 00000000..a6901f0b --- /dev/null +++ b/src/Chrysalis.Plutus/build-rs.sh @@ -0,0 +1,30 @@ +#!/bin/bash +if [ ! -d "./lib" ]; then + mkdir ./lib +fi + +# Function to build and copy for Linux +build_for_linux() { + cargo build --release --manifest-path ./Dependencies/plutus-vm-dotnet-rs/Cargo.toml + cp ./Dependencies/plutus-vm-dotnet-rs/target/release/libplutus_vm_dotnet_rs.so "./lib/libplutus_vm_dotnet_rs.so" +} + +# Function to build and copy for macOS +build_for_macos() { + cargo build --release --manifest-path ./Dependencies/plutus-vm-dotnet-rs/Cargo.toml + cp ./Dependencies/plutus-vm-dotnet-rs/target/release/libplutus_vm_dotnet_rs.dylib "./lib/libplutus_vm_dotnet_rs.dylib" +} + +# Check the operating system +OS="`uname`" +case $OS in + 'Linux') + # Linux-specific commands + build_for_linux + ;; + 'Darwin') + # macOS-specific commands + build_for_macos + ;; + *) ;; +esac \ No newline at end of file diff --git a/src/Chrysalis.Plutus/lib/libpallas_dotnet_rs.so b/src/Chrysalis.Plutus/lib/libpallas_dotnet_rs.so new file mode 100644 index 00000000..e69de29b diff --git a/src/Chrysalis.Plutus/lib/libplutus_vm_dotnet_rs.dylib b/src/Chrysalis.Plutus/lib/libplutus_vm_dotnet_rs.dylib new file mode 100755 index 00000000..c0286c6a Binary files /dev/null and b/src/Chrysalis.Plutus/lib/libplutus_vm_dotnet_rs.dylib differ diff --git a/src/Chrysalis.Test/AddressTest.cs b/src/Chrysalis.Test/AddressTest.cs deleted file mode 100644 index cd44016f..00000000 --- a/src/Chrysalis.Test/AddressTest.cs +++ /dev/null @@ -1,80 +0,0 @@ -using Chrysalis.Cardano.Models; - -namespace Chrysalis.Test; - -public class AddressTest -{ - [Fact] - public void Address_ToHex_FromHex_Test() - { - string expectedHex = "019493315cd92eb5d8c4304e67b7e16ae36d61d34502694657811a2c8e337b62cfff6403a06a3acbc34f8c46003c69fe79a3628cefa9c47251"; - - // Decode - Address address = Address.FromHex(expectedHex); - - // Encode - string resultHex = Address.ToHex(address).ToLowerInvariant(); - - // Assert - Assert.Equal(NetworkTag.Mainnet, address.NetworkTag); - Assert.Equal(AddressType.PaymentKeyHash_StakeKeyHash, address.AddressType); - Assert.Equal(expectedHex, resultHex); - Assert.Equal("9493315cd92eb5d8c4304e67b7e16ae36d61d34502694657811a2c8e", Convert.ToHexString(address.GetPaymentKeyHash()).ToLowerInvariant()); - Assert.Equal("337b62cfff6403a06a3acbc34f8c46003c69fe79a3628cefa9c47251", Convert.ToHexString(address.GetStakeKeyHash()).ToLowerInvariant()); - } - - - [Theory] - [InlineData("019493315cd92eb5d8c4304e67b7e16ae36d61d34502694657811a2c8e337b62cfff6403a06a3acbc34f8c46003c69fe79a3628cefa9c47251", "addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x")] - public void Address_Bech32_Test(string expectedHex, string expectedBech32) - { - // Convert the Bech32 string to Address - (_, var addressFromBech32) = Bech32.Decode(expectedBech32); // Assumes a Bech32.Decode implementation exists - var address = Address.FromBytes(addressFromBech32); - // Convert the Address object back to Bech32 string - string resultBech32 = address.ToBech32(); - - // Convert the Address object to its hex representation - string resultHex = Address.ToHex(address).ToLowerInvariant(); - - // Assert that the results match their expected values - Assert.Equal(expectedBech32, resultBech32); - Assert.Equal(expectedHex, resultHex); - } - - [Theory] - [InlineData("addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x")] - [InlineData("addr1z8phkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gten0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgs9yc0hh")] - [InlineData("addr1yx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzerkr0vd4msrxnuwnccdxlhdjar77j6lg0wypcc9uar5d2shs2z78ve")] - [InlineData("addr1x8phkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gt7r0vd4msrxnuwnccdxlhdjar77j6lg0wypcc9uar5d2shskhj42g")] - [InlineData("addr1gx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer5pnz75xxcrzqf96k")] - [InlineData("addr128phkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtupnz75xxcrtw79hu")] - [InlineData("addr1vx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzers66hrl8")] - [InlineData("addr1w8phkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtcyjy7wx")] - [InlineData("stake1uyehkck0lajq8gr28t9uxnuvgcqrc6070x3k9r8048z8y5gh6ffgw")] - [InlineData("stake178phkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtcccycj5")] - [InlineData("addr_test1qz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgs68faae")] - [InlineData("addr_test1zrphkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gten0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgsxj90mg")] - [InlineData("addr_test1yz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzerkr0vd4msrxnuwnccdxlhdjar77j6lg0wypcc9uar5d2shsf5r8qx")] - [InlineData("addr_test1xrphkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gt7r0vd4msrxnuwnccdxlhdjar77j6lg0wypcc9uar5d2shs4p04xh")] - [InlineData("addr_test1gz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer5pnz75xxcrdw5vky")] - [InlineData("addr_test12rphkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtupnz75xxcryqrvmw")] - [InlineData("addr_test1vz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzerspjrlsz")] - [InlineData("addr_test1wrphkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtcl6szpr")] - [InlineData("stake_test1uqehkck0lajq8gr28t9uxnuvgcqrc6070x3k9r8048z8y5gssrtvn")] - [InlineData("stake_test17rphkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtcljw6kf")] - public void Address_Bech32DecodeEncode_Test(string inputBech32) - { - // Decode the Bech32 string - var (hrp, data) = Bech32.Decode(inputBech32); - - // Create an Address object from decoded data - Address address = Address.FromBytes(data); - - // Encode the Address object back to Bech32 - string outputBech32 = address.ToBech32(); - - // Assert - Assert.Equal(inputBech32, outputBech32); - } -} diff --git a/src/Chrysalis.Test/AssetTests.cs b/src/Chrysalis.Test/AssetTests.cs deleted file mode 100644 index 6feaff12..00000000 --- a/src/Chrysalis.Test/AssetTests.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Chrysalis.Cbor; - -namespace Chrysalis.Test; - -public class AssetTests -{ - [Fact] - public void TestAssetFromToCbor() - { - // Arrange - var originalAsset = new Asset - { - { "48595045534b554c4c535f56545f505f45", 1 }, - { "48595045534b554c4c535f56545f565f43", 2 }, - { "48595045534b554c4c535f56545f4d5f4545", 3 }, - { "48595045534b554c4c535f56545f41435f4545", 4 } - }; - - // Act - // Serialization - byte[] serializedCborData = CborSerializerV2.Serialize(originalAsset); - - // Deserialization - var deserializedAsset = CborSerializerV2.Deserialize(serializedCborData); - - // Assert - Assert.NotNull(deserializedAsset); - Assert.Equal(4, deserializedAsset.Count); - Assert.True(deserializedAsset.ContainsKey("48595045534b554c4c535f56545f505f45")); - Assert.True(deserializedAsset.ContainsKey("48595045534b554c4c535f56545f565f43")); - Assert.True(deserializedAsset.ContainsKey("48595045534b554c4c535f56545f4d5f4545")); - Assert.True(deserializedAsset.ContainsKey("48595045534b554c4c535f56545f41435f4545")); - Assert.Equal(1u, deserializedAsset["48595045534b554c4c535f56545f505f45"]); - Assert.Equal(2u, deserializedAsset["48595045534b554c4c535f56545f565f43"]); - Assert.Equal(3u, deserializedAsset["48595045534b554c4c535f56545f4d5f4545"]); - Assert.Equal(4u, deserializedAsset["48595045534b554c4c535f56545f41435f4545"]); - } -} \ No newline at end of file diff --git a/src/Chrysalis.Test/Bech32Test.cs b/src/Chrysalis.Test/Bech32Test.cs deleted file mode 100644 index 8dd0d6ba..00000000 --- a/src/Chrysalis.Test/Bech32Test.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Chrysalis.Test; - -public class Bech32Test -{ - [Fact] - public void TestBech32Encoding() - { - // Arrange - var hrp = "addr"; // For Shelley addresses - byte[] data = Convert.FromHexString("019493315cd92eb5d8c4304e67b7e16ae36d61d34502694657811a2c8e337b62cfff6403a06a3acbc34f8c46003c69fe79a3628cefa9c47251"); - - // You can find a real-world example or use a known good library to generate an expected result. - var expectedBech32String = "addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x"; // replace ... with the expected encoding - - // Act - var result = Bech32.Encode(hrp, data); - (var decodedHrp, var payload) = Bech32.Decode(result); - - // Assert - Assert.Equal(expectedBech32String, result); - Assert.Equal(hrp, decodedHrp); - Assert.True(data.SequenceEqual(payload)); - } -} diff --git a/src/Chrysalis.Test/CborSerializationV2Tests.cs b/src/Chrysalis.Test/CborSerializationV2Tests.cs deleted file mode 100644 index 5fc6afbe..00000000 --- a/src/Chrysalis.Test/CborSerializationV2Tests.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Chrysalis.Cardano.Models; -using Chrysalis.Cbor; - -namespace Chrysalis.Test; - -public class CborSerializationV2Tests -{ - [Fact] - public void TestExampleSerializationAndDeserialization() - { - // Arrange - var nestedExample = new Example - { - TransactionId = "375aaf2a056d060b18b9f4b23233750b7bb7e5bca8655eceda87f2f76e542053", - Index = 1 - }; - - var original = new Example - { - TransactionId = "375aaf2a056d060b18b9f4b23233750b7bb7e5bca8655eceda87f2f76e542053", - Index = 0, - Examples = nestedExample // Adding nested object - }; - - // Act - byte[] serialized = CborSerializerV2.Serialize(original); - var deserialized = CborSerializerV2.Deserialize(serialized); - - // Assert - Assert.Equal(original.TransactionId, deserialized!.TransactionId); - Assert.Equal(original.Index, deserialized.Index); - - // Assert nested object - Assert.NotNull(deserialized.Examples); - Assert.Equal(nestedExample.TransactionId, deserialized.Examples.TransactionId); - Assert.Equal(nestedExample.Index, deserialized.Examples.Index); - } -} diff --git a/src/Chrysalis.Test/GlobalUsings.cs b/src/Chrysalis.Test/GlobalUsings.cs deleted file mode 100644 index 8c927eb7..00000000 --- a/src/Chrysalis.Test/GlobalUsings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; \ No newline at end of file diff --git a/src/Chrysalis.Test/MultiAssetTests.cs b/src/Chrysalis.Test/MultiAssetTests.cs deleted file mode 100644 index bb9c3b88..00000000 --- a/src/Chrysalis.Test/MultiAssetTests.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Chrysalis.Cardano.Models; -using Chrysalis.Cbor; - -namespace Chrysalis.Test; - -public class MultiAssetTests -{ - [Fact] - public void TestMultiAssetFromToCbor() - { - // Arrange - - var originalAsset = new Asset - { - { "48595045534b554c4c535f56545f505f45", 1 }, - { "48595045534b554c4c535f56545f565f43", 2 }, - { "48595045534b554c4c535f56545f4d5f4545", 3 }, - { "48595045534b554c4c535f56545f41435f4545", 4 } - }; - - - var originalMultiAsset = new MultiAsset - { - { "6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56", originalAsset } - }; - - // Act - // Serialization - byte[] serializedCborData = CborSerializerV2.Serialize(originalMultiAsset); - - // Deserialization - var deserializedMultiAsset = CborSerializerV2.Deserialize(serializedCborData); - - // Assert - Assert.NotNull(deserializedMultiAsset); - Assert.Single(deserializedMultiAsset); - Assert.Equal(4, deserializedMultiAsset["6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56"].Count); - - Assert.True(deserializedMultiAsset.ContainsKey("6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56")); - Assert.Equal(1u, deserializedMultiAsset["6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56"]["48595045534b554c4c535f56545f505f45"]); - - Assert.True(deserializedMultiAsset.ContainsKey("6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56")); - Assert.Equal(2u, deserializedMultiAsset["6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56"]["48595045534b554c4c535f56545f565f43"]); - - Assert.True(deserializedMultiAsset.ContainsKey("6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56")); - Assert.Equal(3u, deserializedMultiAsset["6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56"]["48595045534b554c4c535f56545f4d5f4545"]); - - Assert.True(deserializedMultiAsset.ContainsKey("6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56")); - Assert.Equal(4u, deserializedMultiAsset["6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56"]["48595045534b554c4c535f56545f41435f4545"]); - } -} \ No newline at end of file diff --git a/src/Chrysalis.Test/TransactionBodyTests.cs b/src/Chrysalis.Test/TransactionBodyTests.cs deleted file mode 100644 index 3fd74866..00000000 --- a/src/Chrysalis.Test/TransactionBodyTests.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Blake2Fast; -using Chrysalis.Cardano.Models; -using Chrysalis.Cbor; - -namespace Chrysalis.Test; - -public class TransactionBodyTests -{ - public static readonly string originHex = "A40085825820375AAF2A056D060B18B9F4B23233750B7BB7E5BCA8655ECEDA87F2F76E542053008258200312AE1EE8A8756179A9E1844E3E591CB15114AA1F9C9BEA181AC838F82E94FE00825820B5E787BD2BBABD34CB4F5D72F092121B7A32992576D45BC5ED8C451B63FAFC7A008258209561256F19EEB08AF7C29344B1157B112C33663096ADAA14E5A4F009D1DD2348008258209561256F19EEB08AF7C29344B1157B112C33663096ADAA14E5A4F009D1DD234801018282583901E63022B0F461602484968BB10FD8F872787B862ACE2D7E943292A37003EC6A12860EF8C07D4C1A8DE7DF06ACB0F0330A6087ECBE972082A7821A001629B6A1581C6F37A98BD0C9CED4E302EC2FB3A2F19FFBA1B5C0C2BEDEE3DAC30E56A45148595045534B554C4C535F56545F505F45015148595045534B554C4C535F56545F565F43015248595045534B554C4C535F56545F4D5F4545015348595045534B554C4C535F56545F41435F45450182583901E63022B0F461602484968BB10FD8F872787B862ACE2D7E943292A37003EC6A12860EF8C07D4C1A8DE7DF06ACB0F0330A6087ECBE972082A71A00DF2AEC021A0002BD7D031A0636E8BA"; - public static readonly string expectedInputsCborHex = "85825820375aaf2a056d060b18b9f4b23233750b7bb7e5bca8655eceda87f2f76e542053008258200312ae1ee8a8756179a9e1844e3e591cb15114aa1f9c9bea181ac838f82e94fe00825820b5e787bd2bbabd34cb4f5d72f092121b7a32992576d45bc5ed8c451b63fafc7a008258209561256f19eeb08af7c29344b1157b112c33663096adaa14e5a4f009d1dd2348008258209561256f19eeb08af7c29344b1157b112c33663096adaa14e5a4f009d1dd234801"; - public static readonly string expectedOutputsCborHex = "8282583901e63022b0f461602484968bb10fd8f872787b862ace2d7e943292a37003ec6a12860ef8c07d4c1a8de7df06acb0f0330a6087ecbe972082a7821a001629b6a1581c6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56a45148595045534b554c4c535f56545f505f45015148595045534b554c4c535f56545f565f43015248595045534b554c4c535f56545f4d5f4545015348595045534b554c4c535f56545f41435f45450182583901e63022b0f461602484968bb10fd8f872787b862ace2d7e943292a37003ec6a12860ef8c07d4c1a8de7df06acb0f0330a6087ecbe972082a71a00df2aec"; - - [Fact] - public void TestTransactionBodyFromToCbor() - { - // Given - // Replace the hex string with your real hex-encoded CBOR data for a TransactionBody - byte[] originalCborData = Convert.FromHexString(originHex); - - // When (Deserialization) - var deserializedTransactionBody = CborSerializerV2.Deserialize(originalCborData); - - // When (Serialization) - byte[] serializedCborData = CborSerializerV2.Serialize(deserializedTransactionBody!); - - // Then (Validating serialization) - Assert.True(originalCborData.SequenceEqual(serializedCborData)); - } -} diff --git a/src/Chrysalis.Test/TransactionInputTests.cs b/src/Chrysalis.Test/TransactionInputTests.cs deleted file mode 100644 index f0b702a4..00000000 --- a/src/Chrysalis.Test/TransactionInputTests.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Chrysalis.Cardano.Models; -using Chrysalis.Cbor; - -namespace Chrysalis.Test -{ - public class TransactionInputTests - { - private const string OriginalHex = "825820E33B1A20C078149FDE522803EF0B6A50B672E60765AAF6FDE5D15896CA3F862600"; - private static readonly byte[] OriginalCborData = Convert.FromHexString(OriginalHex); - - [Fact] - public void TestTransactionInputFromToCbor() - { - // When (Deserialization) - var transactionInput = CborSerializerV2.Deserialize(OriginalCborData); - - // Prepare expected TransactionId - var expectedTransactionId = "e33b1a20c078149fde522803ef0b6a50b672e60765aaf6fde5d15896ca3f8626"; - - // Then - Assert.Equal(expectedTransactionId, transactionInput!.TransactionId); - Assert.Equal(0u, transactionInput.Index); - - // When (Serialization) - byte[] serializedCborData = CborSerializerV2.Serialize(transactionInput); - - // Then - Assert.True(OriginalCborData.SequenceEqual(serializedCborData)); - } - - [Fact] - public void TestTransactionInputFromToHex() - { - // When - TransactionInput originalTransactionInput = CborSerializerV2.FromHex(OriginalHex)!; - string convertedHex = CborSerializerV2.ToHex(originalTransactionInput); - - // Then - Assert.Equal(OriginalHex.ToLowerInvariant(), convertedHex); - } - - [Fact] - public void TestTransactionInputFromToBytes() - { - // When - TransactionInput originalTransactionInput = CborSerializerV2.Deserialize(OriginalCborData)!; - byte[] convertedBytes = CborSerializerV2.Serialize(originalTransactionInput); - - // Then - Assert.True(OriginalCborData.SequenceEqual(convertedBytes)); - } - } -} diff --git a/src/Chrysalis.Test/TransactionInputsTests.cs b/src/Chrysalis.Test/TransactionInputsTests.cs deleted file mode 100644 index c7309c17..00000000 --- a/src/Chrysalis.Test/TransactionInputsTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Chrysalis.Cbor; -using Chrysalis.Cardano.Models; - -namespace Chrysalis.Test -{ - public class TransactionInputsTests - { - [Fact] - public void TestTransactionInputsFromToCbor() - { - // Arrange - var transactionInput1 = new TransactionInput - { - TransactionId = "e33b1a20c078149fde522803ef0b6a50b672e60765aaf6fde5d15896ca3f8626", - Index = 0 - }; - - var transactionInput2 = new TransactionInput - { - TransactionId = "e33b1a20c078149fde522803ef0b6a50b672e60765aaf6fde5d15896ca3f8625", - Index = 1 - }; - - var originalTransactionInputs = new TransactionInputs - { - transactionInput1, - transactionInput2 - }; - - // Act - // Serialization - byte[] serializedCborData = CborSerializerV2.Serialize(originalTransactionInputs); - - // Deserialization - var deserializedTransactionInputs = CborSerializerV2.Deserialize(serializedCborData); - - // Assert - Assert.NotNull(deserializedTransactionInputs); - Assert.Equal(2, deserializedTransactionInputs.Count); - Assert.Contains(transactionInput1, deserializedTransactionInputs); - Assert.Contains(transactionInput2, deserializedTransactionInputs); - } - } -} diff --git a/src/Chrysalis.Test/TransactionOutputTests.cs b/src/Chrysalis.Test/TransactionOutputTests.cs deleted file mode 100644 index a7d2e838..00000000 --- a/src/Chrysalis.Test/TransactionOutputTests.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Chrysalis.Cardano.Models; -using Chrysalis.Cbor; - -namespace Chrysalis.Test; - -public class TransactionOutputTests -{ - private const string OriginalHex = "82583901E63022B0F461602484968BB10FD8F872787B862ACE2D7E943292A37003EC6A12860EF8C07D4C1A8DE7DF06ACB0F0330A6087ECBE972082A7821A001629B6A1581C6F37A98BD0C9CED4E302EC2FB3A2F19FFBA1B5C0C2BEDEE3DAC30E56A45148595045534B554C4C535F56545F505F45015148595045534B554C4C535F56545F565F43015248595045534B554C4C535F56545F4D5F4545015348595045534B554C4C535F56545F41435F454501"; // Replace with the original Hex representation - private static readonly byte[] OriginalCborData = Convert.FromHexString(OriginalHex); - - [Fact] - public void TestTransactionOutputFromToCbor() - { - // When (Deserialization) - var transactionOutput = CborSerializerV2.Deserialize(OriginalCborData); - - // Prepare expected values - var expectedAddress = "01e63022b0f461602484968bb10fd8f872787b862ace2d7e943292a37003ec6a12860ef8c07d4c1a8de7df06acb0f0330a6087ecbe972082a7"; // Replace with the expected address - var expectedAmount = CborSerializerV2.FromHex("821A001629B6A1581C6F37A98BD0C9CED4E302EC2FB3A2F19FFBA1B5C0C2BEDEE3DAC30E56A45148595045534B554C4C535F56545F505F45015148595045534B554C4C535F56545F565F43025248595045534B554C4C535F56545F4D5F4545035348595045534B554C4C535F56545F41435F454504"); - // Then - Assert.Equal(expectedAddress, transactionOutput!.AddressHex); - Assert.Equal(expectedAmount!.Coin, transactionOutput.Amount.Coin); - - // When (Serialization) - byte[] serializedCborData = CborSerializerV2.Serialize(transactionOutput); - - // Then - Assert.True(OriginalCborData.SequenceEqual(serializedCborData)); - } - - [Fact] - public void TestTransactionOutputFromToHex() - { - // When - TransactionOutput originalTransactionOutput = CborSerializerV2.FromHex(OriginalHex)!; - string convertedHex = CborSerializerV2.ToHex(originalTransactionOutput); - - // Then - Assert.Equal(OriginalHex.ToLowerInvariant(), convertedHex); - } - - [Fact] - public void TestTransactionOutputFromToBytes() - { - // When - TransactionOutput originalTransactionOutput = CborSerializerV2.Deserialize(OriginalCborData)!; - byte[] convertedBytes = CborSerializerV2.Serialize(originalTransactionOutput); - - // Then - Assert.True(OriginalCborData.SequenceEqual(convertedBytes)); - } -} diff --git a/src/Chrysalis.Test/TransactionTest.cs b/src/Chrysalis.Test/TransactionTest.cs deleted file mode 100644 index c3294196..00000000 --- a/src/Chrysalis.Test/TransactionTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Chrysalis.Cardano.Models; -using Chrysalis.Cbor; - -namespace Chrysalis.Test; - -public class TransactionTest -{ - public static readonly string originalTransactionCborHex = "84A400858258207E79511FF1E20B4A47B93152BA033B365BED427BE65A7DB7520045BDE58A0327018258200312AE1EE8A8756179A9E1844E3E591CB15114AA1F9C9BEA181AC838F82E94FE00825820B5E787BD2BBABD34CB4F5D72F092121B7A32992576D45BC5ED8C451B63FAFC7A008258209561256F19EEB08AF7C29344B1157B112C33663096ADAA14E5A4F009D1DD234800825820AE5FBA947FB2E1AD7A044D0BC11189CA9CB18532859B8C5841B960C4221E4D5501018282583901E63022B0F461602484968BB10FD8F872787B862ACE2D7E943292A37003EC6A12860EF8C07D4C1A8DE7DF06ACB0F0330A6087ECBE972082A7821A001629B6A1581C6F37A98BD0C9CED4E302EC2FB3A2F19FFBA1B5C0C2BEDEE3DAC30E56A45148595045534B554C4C535F56545F505F45015148595045534B554C4C535F56545F565F43015248595045534B554C4C535F56545F4D5F4545015348595045534B554C4C535F56545F41435F45450182583901E63022B0F461602484968BB10FD8F872787B862ACE2D7E943292A37003EC6A12860EF8C07D4C1A8DE7DF06ACB0F0330A6087ECBE972082A71A00817E1C021A0002BD7D031A064144F6A100818258206395DDF277DCCA535AAB1C5C65680E8C73AAE3AB883060EF88C45A2DDE1287325840B1917516E6B2F5AB51060A2D7A7C4B7DD61DED3E8BFA99EC9E26F15F22E2E2B858FA21C24BB3722076C87FF79D22D136B64C2AE8FEA9FDEB5DB563B0DFEBCC02F5F6"; - - [Fact] - public void TransactionSerializationDeserializationTest() - { - var originalTransaction = CborSerializerV2.FromHex(originalTransactionCborHex)!; - var serializedTransaction = CborSerializerV2.Serialize(originalTransaction); - var deserializedTransaction = CborSerializerV2.Deserialize(serializedTransaction); - var txId = originalTransaction.Id; - } -} diff --git a/src/Chrysalis.Test/ValueTests.cs b/src/Chrysalis.Test/ValueTests.cs deleted file mode 100644 index 8d0281ee..00000000 --- a/src/Chrysalis.Test/ValueTests.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Chrysalis.Cardano.Models; -using Chrysalis.Cbor; - -namespace Chrysalis.Test; - -public class ValueTests -{ - [Fact] - public void TestIValueSerializationAndDeserialization() - { - // Arrange - var originalAsset = new Asset - { - { "48595045534b554c4c535f56545f505f45", 1 }, - { "48595045534b554c4c535f56545f565f43", 2 }, - { "48595045534b554c4c535f56545f4d5f4545", 3 }, - { "48595045534b554c4c535f56545f41435f4545", 4 } - }; - - - var originalMultiAsset = new MultiAsset - { - { "6f37a98bd0c9ced4e302ec2fb3a2f19ffba1b5c0c2bedee3dac30e56", originalAsset } - }; - - var multiAssetValue = new Value(1452470, originalMultiAsset); - - var coinValue = new Value(1452470); - - // Act - MultiAssetValue - byte[] serializedMultiAssetValue = CborSerializerV2.Serialize(multiAssetValue); - var deserializedMultiAssetValue = CborSerializerV2.Deserialize(serializedMultiAssetValue); - - // Assert - MultiAssetValue - Assert.NotNull(deserializedMultiAssetValue); - Assert.Equal(multiAssetValue.Coin, deserializedMultiAssetValue!.Coin); - Assert.Equal(multiAssetValue.MultiAsset, deserializedMultiAssetValue.MultiAsset); // Adjust this as needed - - // Act - CoinValue - byte[] serializedCoinValue = CborSerializerV2.Serialize(coinValue); - var deserializedCoinValue = CborSerializerV2.Deserialize(serializedCoinValue); - - // Assert - CoinValue - Assert.NotNull(deserializedCoinValue); - Assert.Equal(coinValue.Coin, deserializedCoinValue!.Coin); - } -} diff --git a/src/Chrysalis.sln b/src/Chrysalis.sln deleted file mode 100644 index 0781d72f..00000000 --- a/src/Chrysalis.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.002.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Chrysalis", "Chrysalis\Chrysalis.csproj", "{28AE334A-2DBD-4B01-A9E8-7EFC6DE0A601}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chrysalis.Test", "Chrysalis.Test\Chrysalis.Test.csproj", "{E380E823-6C43-4CB7-AA15-D54B4F9C7415}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {28AE334A-2DBD-4B01-A9E8-7EFC6DE0A601}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28AE334A-2DBD-4B01-A9E8-7EFC6DE0A601}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28AE334A-2DBD-4B01-A9E8-7EFC6DE0A601}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28AE334A-2DBD-4B01-A9E8-7EFC6DE0A601}.Release|Any CPU.Build.0 = Release|Any CPU - {E380E823-6C43-4CB7-AA15-D54B4F9C7415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E380E823-6C43-4CB7-AA15-D54B4F9C7415}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E380E823-6C43-4CB7-AA15-D54B4F9C7415}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E380E823-6C43-4CB7-AA15-D54B4F9C7415}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {676BDC6A-03DD-4A7A-A256-820E1F8BFE4A} - EndGlobalSection -EndGlobal diff --git a/src/Chrysalis/Bech32.cs b/src/Chrysalis/Bech32.cs deleted file mode 100644 index e1f80a7b..00000000 --- a/src/Chrysalis/Bech32.cs +++ /dev/null @@ -1,211 +0,0 @@ -/* - * This implementation of the Bech32 encoder/decoder is based on and inspired by two open-source projects: - * 1. Bech32 library by lontivero - * Source: https://github.com/lontivero/Bech32/blob/master/Bech32/Bech32.cs - * - * 2. CardanoSharp Wallet library - * Source: https://github.com/CardanoSharp/cardanosharp-wallet/blob/master/CardanoSharp.Wallet/Encoding/Bech32.cs - * - * Thanks to the authors and contributors of these projects for their valuable work. - */ - -using System.Buffers; -using System.Text; - -namespace Chrysalis; - -public static class Bech32 -{ - private const string Charset = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; - private const char Separator = '1'; - private static readonly uint[] Generator = - { - 0x3b6a57b2u, 0x26508e6du, 0x1ea119fau, 0x3d4233ddu, 0x2a1462b3u - }; - private const int checkSumSize = 6; - - private static uint Polymod(Span data) - { - uint chk = 1; - foreach (byte b in data) - { - uint temp = chk >> 25; - chk = ((chk & 0x1ffffff) << 5) ^ b; - for (int i = 0; i < 5; i++) - { - if (((temp >> i) & 1) == 1) - { - chk ^= Generator[i]; - } - } - } - return chk; - } - - private static byte[] ExpandHrp(string hrp) - { - var result = new byte[(2 * hrp.Length) + 1]; - for (int i = 0; i < hrp.Length; i++) - { - result[i] = (byte)(hrp[i] >> 5); - result[i + hrp.Length + 1] = (byte)(hrp[i] & 0b0001_1111); - } - return result; - } - - private static byte[] CalculateCheckSum(string hrp, Span data) - { - var values = ExpandHrp(hrp).AsSpan().ConcatFast(data).ConcatFast(new byte[6].AsSpan()).ToArray(); - var pm = Polymod(values.AsSpan()) ^ 1; - var result = new byte[6]; - for (var i = 0; i < 6; i++) - { - result[i] = (byte)((pm >> 5 * (5 - i)) & 0b0001_1111); - } - return result; - } - - public static string Encode(string hrp, Span data) - { - if (string.IsNullOrEmpty(hrp)) - throw new ArgumentNullException(nameof(hrp), "hrp cannot be null or empty."); - if (data.IsEmpty) - throw new ArgumentNullException(nameof(data), "Data cannot be empty."); - - var b32Arr = ConvertBits(data, 8, 5); - var checksum = CalculateCheckSum(hrp, b32Arr); - var result = new StringBuilder(hrp).Append(Separator); - foreach (var b in b32Arr) - { - result.Append(Charset[b]); - } - foreach (var b in checksum) - { - result.Append(Charset[b]); - } - - return result.ToString(); - } - - private static byte[] ConvertBits(Span data, int fromBits, int toBits, bool pad = true) - { - int acc = 0; - int bits = 0; - int maxv = (1 << toBits) - 1; - int maxacc = (1 << (fromBits + toBits - 1)) - 1; - - var result = new ArrayBufferWriter(); - foreach (var b in data) - { - if ((b >> fromBits) != 0) - { - throw new FormatException("Invalid data format."); - } - acc = ((acc << fromBits) | b) & maxacc; - bits += fromBits; - while (bits >= toBits) - { - bits -= toBits; - result.Write(new byte[] { (byte)((acc >> bits) & maxv) }); - } - } - if (pad) - { - if (bits > 0) - { - result.Write(new byte[] { (byte)((acc << (toBits - bits)) & maxv) }); - } - } - else if (bits >= fromBits || ((acc << (toBits - bits)) & maxv) != 0) - { - throw new FormatException("Invalid data format."); - } - return result.WrittenSpan.ToArray(); - } - - public static (string hrp, byte[] data) Decode(string bech32EncodedString) - { - byte[] b32Arr = Bech32Decode(bech32EncodedString, out string hrp); - - if (b32Arr.Length < checkSumSize) - { - throw new FormatException("Invalid data length."); - } - - if (!VerifyChecksum(hrp, b32Arr)) - { - throw new FormatException("Invalid checksum."); - } - - byte[] dataPart = b32Arr.SubArray(0, b32Arr.Length - checkSumSize); - byte[] b256Arr = ConvertBits(dataPart, 5, 8, false) ?? throw new FormatException("Invalid data format."); - - return (hrp, b256Arr); - } - - - private static byte[] Bech32Decode(string bech32EncodedString, out string hrp) - { - bech32EncodedString = bech32EncodedString.ToLower(); - - int sepIndex = bech32EncodedString.LastIndexOf(Separator); - hrp = bech32EncodedString[..sepIndex]; - string data = bech32EncodedString[(sepIndex + 1)..]; - - byte[] b32Arr = new byte[data.Length]; - for (int i = 0; i < data.Length; i++) - { - b32Arr[i] = (byte)Charset.IndexOf(data[i]); - } - - return b32Arr; - } - - public static byte[] ConcatFast(this byte[] firstArray, byte[] secondArray) - { - if (firstArray == null) - throw new ArgumentNullException(nameof(firstArray), "First array can not be null!"); - if (secondArray == null) - throw new ArgumentNullException(nameof(secondArray), "Second array can not be null!"); - - - byte[] result = new byte[firstArray.Length + secondArray.Length]; - Buffer.BlockCopy(firstArray, 0, result, 0, firstArray.Length); - Buffer.BlockCopy(secondArray, 0, result, firstArray.Length, secondArray.Length); - return result; - } - - public static byte[] SubArray(this byte[] sourceArray, int index, int count) - { - if (sourceArray == null) - throw new ArgumentNullException(nameof(sourceArray), "Input can not be null!"); - if (index < 0 || count < 0) - throw new IndexOutOfRangeException("Index or count can not be negative."); - if (sourceArray.Length != 0 && index > sourceArray.Length - 1 || sourceArray.Length == 0 && index != 0) - throw new IndexOutOfRangeException("Index can not be bigger than array length."); - if (count > sourceArray.Length - index) - throw new IndexOutOfRangeException("Array is not long enough."); - - - byte[] result = new byte[count]; - Buffer.BlockCopy(sourceArray, index, result, 0, count); - return result; - } - - private static bool VerifyChecksum(string hrp, byte[] data) - { - byte[] temp = ExpandHrp(hrp).ConcatFast(data); - return Polymod(temp) == 1; - } -} - -public static class SpanExtensions -{ - public static Span ConcatFast(this Span first, Span second) - { - byte[] result = new byte[first.Length + second.Length]; - first.CopyTo(result); - second.CopyTo(result.AsSpan(first.Length)); - return result; - } -} diff --git a/src/Chrysalis/Cardano/Models/Address.cs b/src/Chrysalis/Cardano/Models/Address.cs deleted file mode 100644 index 4aa29b95..00000000 --- a/src/Chrysalis/Cardano/Models/Address.cs +++ /dev/null @@ -1,183 +0,0 @@ -namespace Chrysalis.Cardano.Models; - -public enum NetworkTag -{ - Unknown = -1, - Testnet = 0x00, // ....0000 - Mainnet = 0x01 // ....0001 - // Add other network tags as needed -} - -public enum AddressType -{ - Unknown = -1, - PaymentKeyHash_StakeKeyHash = 0x00, // 0000.... - ScriptHash_StakeKeyHash = 0x10, // 0001.... - PaymentKeyHash_ScriptHash = 0x20, // 0010.... - ScriptHash_ScriptHash = 0x30, // 0011.... - PaymentKeyHash_Pointer = 0x40, // 0100.... - ScriptHash_Pointer = 0x50, // 0101.... - PaymentKeyHash = 0x60, // 0110.... - ScriptHash = 0x70, // 0111.... - Reward_StakeKeyHash = 0xE0, // 1110.... Corresponding to (14) - Reward_ScriptHash = 0xF0, // 1111.... Corresponding to (15) -} - -public class Address -{ - private const byte HeaderTypeMask = 0xF0; - private const byte NetworkTagMask = 0x0F; - - public byte Header { get; private set; } - public byte[] Payload { get; private set; } - private byte _headerType => (byte)(Header & HeaderTypeMask); - private byte _networkTag => (byte)(Header & NetworkTagMask); - public NetworkTag NetworkTag => Enum.IsDefined(typeof(NetworkTag), (int)_networkTag) ? - (NetworkTag)_networkTag : NetworkTag.Unknown; - - public AddressType AddressType => Enum.IsDefined(typeof(AddressType), (int)_headerType) ? - (AddressType)_headerType : AddressType.Unknown; - - private Address(byte header, byte[] payload) - { - Header = header; - Payload = payload; - } - - public static string ToHex(Address address) - { - Span addressBytes = stackalloc byte[address.Payload.Length + 1]; // Allocate memory on the stack - addressBytes[0] = address.Header; - address.Payload.AsSpan().CopyTo(addressBytes[1..]); // Copy data without extra allocations - - return Convert.ToHexString(addressBytes); - } - - public static Address FromHex(string hex) - { - if (hex.Length % 2 != 0) - throw new ArgumentException("Hex string should have an even length", nameof(hex)); - - // Convert hex to byte array - byte[] addressBytes = new byte[hex.Length / 2]; - for (int i = 0; i < hex.Length; i += 2) - { - addressBytes[i / 2] = byte.Parse(hex.AsSpan(i, 2).ToString(), System.Globalization.NumberStyles.HexNumber); - } - - // Use Span for slicing without new array allocations - byte header = addressBytes[0]; - byte[] payload = addressBytes.AsSpan(1).ToArray(); - - return new Address(header, payload); - } - - public static Address FromBytes(byte[] addressBytes) - { - if (addressBytes.Length < 2) - throw new ArgumentException("Address bytes should be at least 2 bytes long.", nameof(addressBytes)); - - // Use Span for slicing without new array allocations - byte header = addressBytes[0]; - byte[] payload = addressBytes.AsSpan(1).ToArray(); - - return new Address(header, payload); - } - - public static Address FromBech32(string bech32String) - { - // Decode the Bech32 string - var (_, data) = Bech32.Decode(bech32String); - - // The first byte of the data is your header (based on your previous methods) - byte header = data[0]; - - // The rest is your payload - byte[] payload = data.AsSpan(1).ToArray(); - - return new Address(header, payload); - } - - public string ToHex() - { - return ToHex(this); - } - - public string ToBech32() - { - // Determine the hrp based on NetworkTag and AddressType - string hrp = GetHrp(); - - // Combine the header and payload into a single byte array. - var combinedData = new byte[Payload.Length + 1]; - combinedData[0] = Header; - Array.Copy(Payload, 0, combinedData, 1, Payload.Length); - - return Bech32.Encode(hrp, combinedData); // Assuming you have the Bech32 class in scope - } - - private string GetHrp() - { - string networkPart = NetworkTag switch - { - NetworkTag.Testnet => "_test", - NetworkTag.Mainnet => "", - _ => throw new InvalidOperationException("Unsupported NetworkTag.") - }; - - string typePart = IsStakeAddress() ? "stake" : "addr"; - - return $"{typePart}{networkPart}"; - } - - - private bool IsStakeAddress() - { - return AddressType == AddressType.Reward_StakeKeyHash || AddressType == AddressType.Reward_ScriptHash; - } - - - public byte[] GetPaymentKeyHash() - { - if (Payload.Length < 28) // Validate if the payload is long enough - { - throw new InvalidOperationException("Payload is not long enough to contain a PaymentKeyHash."); - } - - return AddressType switch - { - AddressType.PaymentKeyHash_StakeKeyHash or AddressType.ScriptHash_StakeKeyHash or AddressType.PaymentKeyHash_ScriptHash or AddressType.ScriptHash_ScriptHash or AddressType.PaymentKeyHash_Pointer or AddressType.ScriptHash_Pointer or AddressType.PaymentKeyHash or AddressType.ScriptHash - => Payload.AsSpan(0, 28).ToArray(), - _ => throw new InvalidOperationException($"Address type {AddressType} does not contain a PaymentKeyHash."), - }; - } - - public byte[] GetStakeKeyHash() - { - if (Payload.Length < 56) // Validate if the payload is long enough - { - throw new InvalidOperationException("Payload is not long enough to contain a StakeKeyHash."); - } - - return AddressType switch - { - AddressType.PaymentKeyHash_StakeKeyHash or AddressType.ScriptHash_StakeKeyHash or AddressType.PaymentKeyHash_ScriptHash or AddressType.ScriptHash_ScriptHash - => Payload.AsSpan(28, 28).ToArray(), - _ => throw new InvalidOperationException($"Address type {AddressType} does not contain a StakeKeyHash."), - }; - } - - public override bool Equals(object? obj) - { - if (obj is not Address other) - return false; - - return Header == other.Header && Payload.SequenceEqual(other.Payload); - } - - public override int GetHashCode() - { - return HashCode.Combine(Header, Payload); - } -} - diff --git a/src/Chrysalis/Cardano/Models/Asset.cs b/src/Chrysalis/Cardano/Models/Asset.cs deleted file mode 100644 index 5cc793d6..00000000 --- a/src/Chrysalis/Cardano/Models/Asset.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Chrysalis.Cbor; - -namespace Chrysalis; - -/// -/// CDDL definition: -/// Asset = { name => coin } -/// -[CborType(CborRepresentation.Map)] -public class Asset : Dictionary -{ - // No additional properties, it's just a specialized Dictionary. -} \ No newline at end of file diff --git a/src/Chrysalis/Cardano/Models/Example.cs b/src/Chrysalis/Cardano/Models/Example.cs deleted file mode 100644 index 8edf4599..00000000 --- a/src/Chrysalis/Cardano/Models/Example.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models; - -[CborType(CborRepresentation.Tuple)] -public record Example -{ - [CborProperty(CborRepresentation.Int32, 0, CborRepresentation.ByteString)] - public string TransactionId { get; set; } = string.Empty; - - [CborProperty(CborRepresentation.Int32, 1, CborRepresentation.Int32)] - public int Index { get; set; } = 0; - - [CborProperty(CborRepresentation.Int32, 2, CborRepresentation.Tuple)] - public Example? Examples { get; set; } -} diff --git a/src/Chrysalis/Cardano/Models/MultiAsset.cs b/src/Chrysalis/Cardano/Models/MultiAsset.cs deleted file mode 100644 index 28392f37..00000000 --- a/src/Chrysalis/Cardano/Models/MultiAsset.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Formats.Cbor; -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models; - -/// -/// CDDL definition: -/// multiasset = { * policy_id => { * asset_name => a } } -/// -[CborType(CborRepresentation.Map)] -public class MultiAsset : Dictionary -{ - // No additional properties, it's just a specialized Dictionary. -} \ No newline at end of file diff --git a/src/Chrysalis/Cardano/Models/Transaction.cs b/src/Chrysalis/Cardano/Models/Transaction.cs deleted file mode 100644 index 9883dba5..00000000 --- a/src/Chrysalis/Cardano/Models/Transaction.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Formats.Cbor; -using Blake2Fast; -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models; - -/// -/// Represents a Cardano transaction. -/// -/// -/// CDDL definition: -/// transaction = -/// [ transaction_body -/// , transaction_witness_set -/// , bool -/// , auxiliary_data / null -/// ] -/// -[CborType(CborRepresentation.Tuple)] -public class Transaction -{ - [CborProperty(CborRepresentation.Int32, 0, CborRepresentation.Record)] - public TransactionBody TransactionBody { get; set; } = new TransactionBody(); - - [CborProperty(CborRepresentation.Int32, 1, CborRepresentation.Ignore)] - public object TransactionWitnessSet { get; set; } = default!; - - [CborProperty(CborRepresentation.Int32, 2, CborRepresentation.Bool)] - public bool IsValid { get; set; } - - [CborProperty(CborRepresentation.Int32, 3, CborRepresentation.Ignore)] - public string? AuxiliaryData { get; set; } - - public string Id => Convert.ToHexString(Blake2b.ComputeHash(32, CborSerializerV2.Serialize(TransactionBody))).ToLowerInvariant(); -} \ No newline at end of file diff --git a/src/Chrysalis/Cardano/Models/TransactionBody.cs b/src/Chrysalis/Cardano/Models/TransactionBody.cs deleted file mode 100644 index 975576c5..00000000 --- a/src/Chrysalis/Cardano/Models/TransactionBody.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Formats.Cbor; -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models; - -/// -/// CDDL definition: -/// transaction_body = -/// { 0 : set ; inputs -/// , 1 : [* transaction_output] -/// , 2 : coin ; fee -/// , ? 3 : uint ; time to live -/// , ? 4 : [* certificate] -/// , ? 5 : withdrawals -/// , ? 6 : update -/// , ? 7 : auxiliary_data_hash -/// , ? 8 : uint ; validity interval start -/// , ? 9 : mint -/// , ? 11 : script_data_hash ; New -/// , ? 13 : set ; Collateral ; new -/// , ? 14 : required_signers ; New -/// , ? 15 : network_id ; New -/// } -/// -[CborType(CborRepresentation.Record)] -public class TransactionBody -{ - [CborProperty(CborRepresentation.Int32, 0, CborRepresentation.Set)] - public TransactionInputs Inputs { get; set; } = []; // Assuming TransactionInputs is a collection - - [CborProperty(CborRepresentation.Int32, 1, CborRepresentation.Array)] - public TransactionOutputs Outputs { get; set; } = []; // Assuming TransactionOutputs is a collection - - [CborProperty(CborRepresentation.Int32, 2, CborRepresentation.Int32)] - public Value Fee { get; set; } = new(); - - [CborProperty(CborRepresentation.Int32, 3, CborRepresentation.Int64)] - public ulong? TTL { get; set; } -} - diff --git a/src/Chrysalis/Cardano/Models/TransactionInput.cs b/src/Chrysalis/Cardano/Models/TransactionInput.cs deleted file mode 100644 index 75f0f58b..00000000 --- a/src/Chrysalis/Cardano/Models/TransactionInput.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models; - -/// -/// Represents an input to a Cardano transaction, consisting of a transaction ID and an index. -/// -/// -/// CDDL definition: -/// transaction_input = [ transaction_id : $hash32 -/// , index : uint -/// ] -/// -[CborType(CborRepresentation.Tuple)] // Assume that CborRepresentation is an enum specifying array or map representation -public class TransactionInput -{ - [CborProperty(CborRepresentation.Int32, 0, CborRepresentation.ByteString)] - public string? TransactionId { get; set; } - - [CborProperty(CborRepresentation.Int32, 1, CborRepresentation.UInt32)] - public uint Index { get; set; } - - public override int GetHashCode() - { - return (TransactionId?.GetHashCode() ?? 0) ^ Index.GetHashCode(); - } - - public override bool Equals(object? obj) - { - if (obj is not TransactionInput other) - { - return false; - } - - return TransactionId == other.TransactionId && Index == other.Index; - } -} \ No newline at end of file diff --git a/src/Chrysalis/Cardano/Models/TransactionInputs.cs b/src/Chrysalis/Cardano/Models/TransactionInputs.cs deleted file mode 100644 index 536ecb15..00000000 --- a/src/Chrysalis/Cardano/Models/TransactionInputs.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Formats.Cbor; -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models -{ - /// - /// Represents a collection of transaction inputs. - /// - [CborType(CborRepresentation.Set)] - public class TransactionInputs : HashSet - { - } -} \ No newline at end of file diff --git a/src/Chrysalis/Cardano/Models/TransactionOutput.cs b/src/Chrysalis/Cardano/Models/TransactionOutput.cs deleted file mode 100644 index dbf5bfb9..00000000 --- a/src/Chrysalis/Cardano/Models/TransactionOutput.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Formats.Cbor; -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models; - -/// -/// Represents an output of a Cardano transaction, consisting of an address, an amount, and an optional datum hash. -/// -/// -/// CDDL definition: -/// transaction_output = -/// [ address -/// , amount : value -/// , ? datum_hash : hash32 ; New -/// ] -/// -[CborType(CborRepresentation.Tuple)] // Assume that CborRepresentation is an enum specifying array or map representation -public class TransactionOutput -{ - [CborProperty(CborRepresentation.Int32, 0, CborRepresentation.ByteString)] - public string AddressHex { get; set; } = string.Empty; - - [CborProperty(CborRepresentation.Int32, 1, CborRepresentation.Int64, true)] - [CborProperty(CborRepresentation.Int32, 1, CborRepresentation.Tuple)] - public Value Amount { get; set; } = new Value(); - - [CborProperty(CborRepresentation.Int32, 2, CborRepresentation.ByteString)] - public string? DatumHash { get; set; } - - public Address Address => Address.FromHex(AddressHex); -} \ No newline at end of file diff --git a/src/Chrysalis/Cardano/Models/TransactionOutputs.cs b/src/Chrysalis/Cardano/Models/TransactionOutputs.cs deleted file mode 100644 index 48d57971..00000000 --- a/src/Chrysalis/Cardano/Models/TransactionOutputs.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Formats.Cbor; -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models -{ - /// - /// Represents a collection of transaction outputs in a Cardano transaction. - /// - [CborType(CborRepresentation.Array)] - public class TransactionOutputs : List - { - - } -} \ No newline at end of file diff --git a/src/Chrysalis/Cardano/Models/Value.cs b/src/Chrysalis/Cardano/Models/Value.cs deleted file mode 100644 index 7dd7ba1b..00000000 --- a/src/Chrysalis/Cardano/Models/Value.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Chrysalis.Cbor; - -namespace Chrysalis.Cardano.Models; - - -[CborType(CborRepresentation.UInt64, true)] -[CborType(CborRepresentation.Tuple)] -public class Value -{ - - public Value() - { - Coin = 0; - MultiAsset = []; - } - - public Value(ulong coin) - { - CborValue = coin; - MultiAsset = []; - } - - public Value(ulong coin, MultiAsset multiAsset) - { - Coin = coin; - MultiAsset = multiAsset; - } - - private ulong _coin = 0; - [CborProperty(CborRepresentation.Int32, 0, CborRepresentation.UInt64)] - public ulong Coin - { - get => CborValue ?? _coin; - set - { - if(CborValue is null) - { - _coin = value; - } - else - { - CborValue = value; - } - } - } - - [CborProperty(CborRepresentation.Int32, 1, CborRepresentation.Map)] - public MultiAsset MultiAsset { get; set; } - - public ulong? CborValue { get; set; } -} diff --git a/src/Chrysalis/Cbor/CborIndex.cs b/src/Chrysalis/Cbor/CborIndex.cs deleted file mode 100644 index 5e665c3c..00000000 --- a/src/Chrysalis/Cbor/CborIndex.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Chrysalis.Cbor; - -public class CborIndex(CborRepresentation type, object value) -{ - public CborRepresentation Type { get; } = type; - public object Value { get; } = value; -} diff --git a/src/Chrysalis/Cbor/CborPropertyAttribute.cs b/src/Chrysalis/Cbor/CborPropertyAttribute.cs deleted file mode 100644 index b66c1534..00000000 --- a/src/Chrysalis/Cbor/CborPropertyAttribute.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Chrysalis.Cbor; - -[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)] -public sealed class CborPropertyAttribute(CborRepresentation indexType, object indexValue, CborRepresentation valueType, bool isBasicType = false) : Attribute -{ - public CborRepresentation IndexType { get; } = indexType; - public object IndexValue { get; } = indexValue; - public CborRepresentation ValueType { get; } = valueType; - public bool IsBasicType { get; set; } = isBasicType; -} \ No newline at end of file diff --git a/src/Chrysalis/Cbor/CborRepresentation.cs b/src/Chrysalis/Cbor/CborRepresentation.cs deleted file mode 100644 index 15d71971..00000000 --- a/src/Chrysalis/Cbor/CborRepresentation.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Chrysalis.Cbor; - -public enum CborRepresentation -{ - Int32, - Int64, - UInt32, - UInt64, - ByteString, - Bool, - Tuple, - Set, - Array, - Record, - Map, - Ignore -} diff --git a/src/Chrysalis/Cbor/CborSerializer.cs b/src/Chrysalis/Cbor/CborSerializer.cs deleted file mode 100644 index a0cbb8cc..00000000 --- a/src/Chrysalis/Cbor/CborSerializer.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Chrysalis.Cbor; - -public class CborSerializer -{ - public static T Deserialize(byte[] data) where T : ICborObject, new() - { - T obj = new(); - obj.FromCbor(data); - return obj; - } - - public static byte[] Serialize(T obj) where T : ICborObject - { - return obj.ToCbor(); - } -} diff --git a/src/Chrysalis/Cbor/CborSerializerV2.cs b/src/Chrysalis/Cbor/CborSerializerV2.cs deleted file mode 100644 index 98fde4ad..00000000 --- a/src/Chrysalis/Cbor/CborSerializerV2.cs +++ /dev/null @@ -1,585 +0,0 @@ -using System.Formats.Cbor; -using System.Collections; -using System.Collections.Generic; -using Microsoft.VisualBasic; -using System.Reflection; - -namespace Chrysalis.Cbor; - -public static class CborSerializerV2 -{ - public static byte[] Serialize(object obj) - { - var writer = new CborWriter(CborConformanceMode.Strict); - SerializeObject(writer, obj, obj.GetType()); - return writer.Encode(); - } - - private static void SerializeObject(CborWriter writer, object obj, Type objType) - { - var cborTypeAttrs = (IEnumerable?)Attribute.GetCustomAttributes(objType, typeof(CborTypeAttribute)); - - if (cborTypeAttrs is not null && cborTypeAttrs.Any()) - { - foreach (var cborTypeAttr in cborTypeAttrs) - { - try - { - if (cborTypeAttr.IsBasicType) - { - // Use reflection to get the value of the 'Value' property - var valueProperty = objType.GetProperty("CborValue") ?? throw new InvalidOperationException("A basic type must have a 'Value' property."); - var value = valueProperty.GetValue(obj); - if (value == null) - { - throw new ArgumentNullException(nameof(value), "Value cannot be null."); - } - SerializePrimitive(writer, value, value.GetType()); - return; // Skip the rest of the serialization steps - } - var representation = cborTypeAttr.Representation; - SerializePrimitive(writer, obj, objType, representation); - return; - } - catch - { - continue; - } - } - throw new NotImplementedException("Unknown CborRepresentation"); - } - else - { - SerializePrimitive(writer, obj, objType); - } - } - - private static void SerializePrimitive(CborWriter writer, object obj, Type objType, CborRepresentation? overrideRepresentation = null) - { - if (overrideRepresentation != null) - { - switch (overrideRepresentation) - { - case CborRepresentation.Set: - case CborRepresentation.Array: - SerializeArray(writer, obj, objType); - break; - case CborRepresentation.Tuple: - SerializeTuple(writer, obj, objType); - break; - case CborRepresentation.Map: - SerializeMap(writer, obj, objType); - break; - case CborRepresentation.Record: - SerializeRecord(writer, obj, objType); - break; - case CborRepresentation.Int32: - writer.WriteInt32((int)obj); - break; - case CborRepresentation.Int64: - writer.WriteInt64((long)obj); - break; - case CborRepresentation.UInt32: - writer.WriteUInt32((uint)obj); - break; - case CborRepresentation.UInt64: - writer.WriteUInt64((ulong)obj); - break; - case CborRepresentation.ByteString: - writer.WriteByteString(Convert.FromHexString((string)obj)); - break; - case CborRepresentation.Bool: - writer.WriteBoolean((bool)obj); - break; - default: - throw new NotImplementedException("Unknown CborRepresentation"); - } - } - else - { - - var cborPropAttrs = (IEnumerable?)Attribute.GetCustomAttributes(objType, typeof(CborPropertyAttribute)); - if (cborPropAttrs is not null && cborPropAttrs.Any()) - { - foreach (var cborPropAttr in cborPropAttrs) - { - try - { - SerializePrimitive(writer, obj, objType, cborPropAttr.ValueType); - return; - } - catch - { - continue; - } - } - throw new NotImplementedException("Unknown CborRepresentation"); - } - else - { - switch (objType) - { - case Type t when t == typeof(string): - writer.WriteByteString(Convert.FromHexString((string)obj)); - break; - case Type t when t == typeof(int): - writer.WriteInt32((int)obj); - break; - case Type t when t == typeof(long): - writer.WriteInt64((long)obj); - break; - case Type t when t == typeof(uint): - writer.WriteUInt32((uint)obj); - break; - case Type t when t == typeof(ulong): - writer.WriteUInt64((ulong)obj); - break; - case Type t when t == typeof(bool): - writer.WriteBoolean((bool)obj); - break; - case Type t when t == typeof(int?): - writer.WriteInt32((int)obj); - break; - case Type t when t == typeof(long?): - writer.WriteInt64((long)obj); - break; - case Type t when t == typeof(uint?): - writer.WriteUInt32((uint)obj); - break; - case Type t when t == typeof(ulong?): - writer.WriteUInt64((ulong)obj); - break; - case Type t when t == typeof(bool?): - writer.WriteBoolean((bool)obj); - break; - default: - throw new NotImplementedException("Type not supported"); - } - } - } - } - - private static void SerializeRecord(CborWriter writer, object obj, Type objType) - { - // Collect properties with CborPropertyAttribute and sort by index - var properties = objType.GetProperties() - .Select(prop => (prop, cborPropAttr: (CborPropertyAttribute?)Attribute.GetCustomAttribute(prop, typeof(CborPropertyAttribute)))) - .Where(x => x.cborPropAttr != null) - .OrderBy(x => x.cborPropAttr!.IndexValue) - .ToList(); - - // Write the start of the map with the item count - writer.WriteStartMap(properties.Count); - - foreach (var (prop, cborPropAttr) in properties) - { - // Serialize the index value as the key - SerializeObject(writer, cborPropAttr!.IndexValue, cborPropAttr.IndexValue.GetType()); - - // Get the property value - object? value = prop.GetValue(obj); - - if (value != null) - { - // Serialize the property value - SerializeObject(writer, value, prop.PropertyType); - } - else - { - // If the value is null, write a CBOR null value or handle as you see fit - writer.WriteNull(); - } - } - - // Write the end of the map - writer.WriteEndMap(); - } - - private static void SerializeArray(CborWriter writer, object obj, Type objType) - { - if (typeof(IEnumerable).IsAssignableFrom(objType) && objType != typeof(string)) - { - var enumerable = (IEnumerable)obj; - writer.WriteStartArray(enumerable.Cast().Count()); - - foreach (var item in enumerable) - { - SerializeObject(writer, item, item.GetType()); - } - - writer.WriteEndArray(); - } - else - { - throw new ArgumentException("Type must be an enumerable to be serialized as a CBOR array"); - } - } - - private static void SerializeTuple(CborWriter writer, object obj, Type objType) - { - var sortedProperties = objType.GetProperties() - .Select(prop => (prop, cborPropAttrs: (IEnumerable?)Attribute.GetCustomAttributes(prop, typeof(CborPropertyAttribute)))) - .Where(x => x.cborPropAttrs != null && x.cborPropAttrs.Any() && x.prop.GetValue(obj) != null) - .OrderBy(x => x.cborPropAttrs!.First().IndexValue) - .ToList(); - - writer.WriteStartArray(sortedProperties.Count); - - foreach (var (prop, cborPropAttr) in sortedProperties) - { - object? value = prop.GetValue(obj); - SerializeObject(writer, value!, value!.GetType()); - } - - writer.WriteEndArray(); - } - - private static void SerializeMap(CborWriter writer, object obj, Type objType) - { - if (typeof(IDictionary).IsAssignableFrom(objType)) - { - // Logic for handling dictionary types - IDictionary dictionary = (IDictionary)obj; - writer.WriteStartMap(dictionary.Count); - - foreach (DictionaryEntry entry in dictionary) - { - SerializeObject(writer, entry.Key, entry.Key.GetType()); - - if (entry.Value == null) - { - throw new ArgumentNullException(nameof(entry.Value), "Dictionary entry value cannot be null."); - } - - SerializeObject(writer, entry.Value, entry.Value.GetType()); - } - } - writer.WriteEndMap(); - } - - public static T? Deserialize(byte[] cborData) - { - var reader = new CborReader(cborData, CborConformanceMode.Strict); - return (T?)DeserializeObject(reader, typeof(T)); - } - - private static object? DeserializeObject(CborReader reader, Type targetType, CborRepresentation? overrideRepresentation = null) - { - var readState = reader.PeekState(); - var cborTypeAttrs = (IEnumerable?)Attribute.GetCustomAttributes(targetType, typeof(CborTypeAttribute)); - var cborTypeAttr = cborTypeAttrs?.FirstOrDefault(x => ConvertCborRepresentationToState(x.Representation) == readState); - var representationToUse = overrideRepresentation ?? cborTypeAttr?.Representation; - - if (cborTypeAttr != null) - { - try - { - if (cborTypeAttr.IsBasicType) - { - // Assume there's a "Value" property and that its type matches the representation - var valueProperty = targetType.GetProperty("CborValue") ?? throw new InvalidOperationException("A basic type must have a 'Value' property."); - var value = DeserializePrimitive(reader, valueProperty.PropertyType, cborTypeAttr.Representation); - - // Create an instance and set the 'Value' property - var instance = Activator.CreateInstance(targetType); - valueProperty.SetValue(instance, value); - - return instance; - } - else - { - return DeserializePrimitive(reader, targetType, representationToUse); - } - } - catch - { - return null; - } - } - else - { - // Fall back to primitive deserialization if no attributes are found - return DeserializePrimitive(reader, targetType, representationToUse); - } - } - - private static object? DeserializePrimitive(CborReader reader, Type targetType, CborRepresentation? representation) - { - if(reader.PeekState() == CborReaderState.Null) - { - reader.ReadNull(); - return null; - } - - if (representation != null) - { - return representation switch - { - CborRepresentation.Set => DeserializeArray(reader, targetType, true), - CborRepresentation.Array => DeserializeArray(reader, targetType), - CborRepresentation.Tuple => DeserializeTuple(reader, targetType), - CborRepresentation.Map => DeserializeMap(reader, targetType), - CborRepresentation.Record => DeserializeRecord(reader, targetType), - CborRepresentation.Int32 => reader.ReadInt32(), - CborRepresentation.Int64 => reader.ReadInt64(), - CborRepresentation.UInt32 => reader.ReadUInt32(), - CborRepresentation.UInt64 => reader.ReadUInt64(), - CborRepresentation.ByteString => Convert.ToHexString(reader.ReadByteString()).ToLowerInvariant(), - CborRepresentation.Bool => reader.ReadBoolean(), - CborRepresentation.Ignore => DeserializeIgnore(reader), - _ => throw new NotImplementedException("Unknown CborRepresentation"), - }; - } - else - { - return targetType switch - { - Type t when t == typeof(int) => reader.ReadInt32(), - Type t when t == typeof(long) => reader.ReadInt64(), - Type t when t == typeof(uint) => reader.ReadUInt32(), - Type t when t == typeof(ulong) => reader.ReadUInt64(), - Type t when t == typeof(string) => Convert.ToHexString(reader.ReadByteString()).ToLowerInvariant(), - Type t when t == typeof(bool) => reader.ReadBoolean(), - Type t when t == typeof(int?) => reader.ReadInt32(), - Type t when t == typeof(long?) => reader.ReadInt64(), - Type t when t == typeof(uint?) => reader.ReadUInt32(), - Type t when t == typeof(ulong?) => reader.ReadUInt64(), - Type t when t == typeof(bool?) => reader.ReadBoolean(), - _ => null - }; - } - } - - private static object? DeserializeRecord(CborReader reader, Type targetType) - { - if (reader.PeekState() != CborReaderState.StartMap) - { - throw new InvalidOperationException("Unexpected CBOR data format"); - } - - var itemCount = reader.ReadStartMap(); - object obj = Activator.CreateInstance(targetType)!; - - // Create a lookup dictionary that maps index values to PropertyInfo objects - var properties = targetType.GetProperties() - .Select(prop => (prop, cborPropAttr: (CborPropertyAttribute?)Attribute.GetCustomAttribute(prop, typeof(CborPropertyAttribute)))) - .Where(x => x.cborPropAttr != null) - .ToDictionary(x => x.cborPropAttr!.IndexValue, x => (x.prop, x.cborPropAttr!.ValueType)); - - for (int i = 0; i < itemCount; i++) - { - object indexValue = reader.ReadInt32(); // Assuming your Record keys are always integers. Adapt as necessary. - - if (properties.TryGetValue(indexValue, out var propertyInfo)) - { - // Deserialize the property value. - object? value = DeserializeObject(reader, propertyInfo.prop.PropertyType); - propertyInfo.prop.SetValue(obj, value); - } - else - { - // Skip unknown key-value pair - reader.SkipValue(); - } - } - - reader.ReadEndMap(); - return obj; - } - - private static object? DeserializeArray(CborReader reader, Type targetType, bool isSet = false) - { - if (!typeof(IEnumerable).IsAssignableFrom(targetType)) - { - throw new ArgumentException("Type must be an enumerable to be deserialized as a CBOR array"); - } - - Type collectionType = targetType != null && targetType!.IsGenericType ? targetType : targetType!.BaseType!; - if (collectionType == null || collectionType.GetGenericArguments().Length == 0) - { - throw new ArgumentException("Type or its base type must be generic."); - } - - Type itemType = collectionType.GetGenericArguments()[0]; - - if (isSet) - { - // create a hashset instnace of setType - var set = Activator.CreateInstance(targetType); - - reader.ReadStartArray(); - while (reader.PeekState() != CborReaderState.EndArray) - { - object? item = DeserializeObject(reader, itemType); - targetType.GetMethod("Add")!.Invoke(set, [item]); - } - reader.ReadEndArray(); - - return set; - } - else - { - IList? list = (IList?)Activator.CreateInstance(targetType); - - reader.ReadStartArray(); - while (reader.PeekState() != CborReaderState.EndArray) - { - object? item = DeserializeObject(reader, itemType); - list?.Add(item); - } - reader.ReadEndArray(); - - return list; - } - } - - private static object? DeserializeTuple(CborReader reader, Type targetType) - { - reader.ReadStartArray(); - - object? instance = Activator.CreateInstance(targetType); - - targetType.GetProperties().ToList() - .ForEach(prop => - { - // Take into account that there might be multiple CborPropertyAttributes on the same property - var readState = reader.PeekState(); - var cborPropAttrs = (CborPropertyAttribute[])Attribute.GetCustomAttributes(prop, typeof(CborPropertyAttribute)); - if (cborPropAttrs.Any() && !IsEndState(readState)) - { - var cborPropAttr = cborPropAttrs.FirstOrDefault(x => ConvertCborRepresentationToState(x.ValueType) == readState); - if (IsIgnoreProperty(prop)) - { - DeserializeObject(reader, prop.PropertyType, CborRepresentation.Ignore); - prop.SetValue(instance, null); - } - else - { - var deserializedValue = DeserializeObject(reader, prop.PropertyType, cborPropAttr?.ValueType); - prop.SetValue(instance, deserializedValue); - } - } - }); - - reader.ReadEndArray(); - - return instance; - } - - private static object? DeserializeMap(CborReader reader, Type targetType) - { - if (reader.PeekState() != CborReaderState.StartMap) - { - throw new InvalidOperationException("Unexpected CBOR data format"); - } - - var itemCount = reader.ReadStartMap(); - object? obj = null; - - Type[] genericTypes = targetType.BaseType?.GetGenericArguments() ?? new Type[0]; - if (genericTypes.Length >= 2) - { - Type keyType = genericTypes[0]; - Type valueType = genericTypes[1]; - - obj = Activator.CreateInstance(targetType); - if (obj == null) - { - throw new InvalidOperationException($"Could not create an instance of {targetType}"); - } - - IDictionary dictionary = (IDictionary)obj; - - for (int i = 0; i < itemCount; i++) - { - object? key = DeserializeObject(reader, keyType); - object? value = DeserializeObject(reader, valueType); - - if (key != null) - { - dictionary.Add(key, value); - } - } - } - - reader.ReadEndMap(); - return obj; - } - - private static bool IsIgnoreProperty(PropertyInfo prop) - { - var cborPropAttrs = (CborPropertyAttribute[])Attribute.GetCustomAttributes(prop, typeof(CborPropertyAttribute)); - return cborPropAttrs.Any(x => x.ValueType == CborRepresentation.Ignore); - } - - private static object? DeserializeIgnore(CborReader reader) - { - switch (reader.PeekState()) - { - case CborReaderState.StartArray: - reader.ReadStartArray(); - while (reader.PeekState() != CborReaderState.EndArray) - { - DeserializeIgnore(reader); - } - reader.ReadEndArray(); - break; - - case CborReaderState.StartMap: - reader.ReadStartMap(); - while (reader.PeekState() != CborReaderState.EndMap) - { - DeserializeIgnore(reader); // Key - DeserializeIgnore(reader); // Value - } - reader.ReadEndMap(); - break; - - default: - reader.SkipValue(); // For all other simple CBOR types, this should suffice - break; - } - - return null; - } - - - private static CborReaderState ConvertCborRepresentationToState(CborRepresentation representation) - { - return representation switch - { - CborRepresentation.Int32 => CborReaderState.UnsignedInteger, - CborRepresentation.Int64 => CborReaderState.UnsignedInteger, - CborRepresentation.UInt32 => CborReaderState.UnsignedInteger, - CborRepresentation.UInt64 => CborReaderState.UnsignedInteger, - CborRepresentation.ByteString => CborReaderState.ByteString, - CborRepresentation.Bool => CborReaderState.Boolean, - CborRepresentation.Tuple => CborReaderState.StartArray, - CborRepresentation.Set => CborReaderState.StartArray, // Assuming sets are also represented as arrays - CborRepresentation.Array => CborReaderState.StartArray, - CborRepresentation.Record => CborReaderState.StartMap, - CborRepresentation.Map => CborReaderState.StartMap, - CborRepresentation.Ignore => CborReaderState.Null, - _ => throw new ArgumentException("Invalid CborRepresentation"), - }; - } - - private static bool IsEndState(CborReaderState state) - { - return state == CborReaderState.EndArray || state == CborReaderState.EndMap; - } - - - - public static string ToHex(object obj) - { - byte[] cborData = Serialize(obj); - return Convert.ToHexString(cborData).ToLowerInvariant(); - } - - public static T? FromHex(string hexString) - { - byte[] cborData = Convert.FromHexString(hexString); - return Deserialize(cborData); - } -} diff --git a/src/Chrysalis/Cbor/CborTypeAttribute.cs b/src/Chrysalis/Cbor/CborTypeAttribute.cs deleted file mode 100644 index f6bacbe6..00000000 --- a/src/Chrysalis/Cbor/CborTypeAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Chrysalis.Cbor; - -[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] -sealed class CborTypeAttribute(CborRepresentation representation) : Attribute -{ - public CborRepresentation Representation { get; } = representation; - public bool IsBasicType { get; set; } - - public CborTypeAttribute(CborRepresentation representation, bool isBasicType) : this(representation) - { - IsBasicType = isBasicType; - } -} diff --git a/src/Chrysalis/Cbor/ICborObject.cs b/src/Chrysalis/Cbor/ICborObject.cs deleted file mode 100644 index 822e7a3f..00000000 --- a/src/Chrysalis/Cbor/ICborObject.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Formats.Cbor; - -namespace Chrysalis.Cbor; - -public interface ICborObject where T : ICborObject -{ - byte[] ToCbor(); - CborWriter ToCbor(CborWriter writer); - T FromCbor(byte[] data); - T FromCbor(CborReader reader); -} diff --git a/src/Chrysalis/Chrysalis.csproj b/src/Chrysalis/Chrysalis.csproj index b501c011..5ad04ec6 100644 --- a/src/Chrysalis/Chrysalis.csproj +++ b/src/Chrysalis/Chrysalis.csproj @@ -1,24 +1,25 @@ - - - - net8.0 - enable - enable - 0.0.7 - Chrysalis - 0xAccretion - AccretionLabs - README.md - LICENSE.md - - - - - - - - - - - - + + + + + + + net9.0 + enable + enable + 0.6.0 + Chrysalis + clark@saib.dev, rjlacanlale@saib.dev, kathea.mayol@saib.dev + SAIB Inc + README.md + LICENSE.md + + + + + + + + + + diff --git a/src/Chrysalis/out/Chrysalis.0.0.1.nupkg b/src/Chrysalis/out/Chrysalis.0.0.1.nupkg deleted file mode 100644 index 627e6fab..00000000 Binary files a/src/Chrysalis/out/Chrysalis.0.0.1.nupkg and /dev/null differ