diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 2ae0efd..7fabe05 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -38,7 +38,7 @@ jobs: nuget-${{ runner.os }} - name: Restore dependencies - run: dotnet restore + run: dotnet restore --locked-mode working-directory: ./src - name: Build @@ -94,7 +94,7 @@ jobs: "AssemblySemFileVer=$($gitVersion.AssemblySemFileVer)" >> $env:GITHUB_OUTPUT - name: Restore dependencies - run: dotnet restore + run: dotnet restore --locked-mode working-directory: ./src - name: Build @@ -191,6 +191,9 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.6.0 + - name: Set up Docker Buildx uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml new file mode 100644 index 0000000..323b442 --- /dev/null +++ b/.github/workflows/fuzz.yml @@ -0,0 +1,50 @@ +name: Parser corpus replay + +on: + pull_request: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + +jobs: + replay: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 + with: + dotnet-version: 10.x + - run: dotnet restore --locked-mode + working-directory: src + - run: dotnet build FrontierSharp.Fuzz/FrontierSharp.Fuzz.csproj --no-restore --configuration Release + working-directory: src + - run: | + for target in sui resindex pickle world; do + dotnet run --project FrontierSharp.Fuzz --no-build --configuration Release -- replay "$target" "FrontierSharp.Fuzz/corpus/$target" + done + working-directory: src + + fuzz: + if: github.event_name == 'schedule' + runs-on: ubuntu-latest + timeout-minutes: 35 + permissions: + contents: read + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 + with: + dotnet-version: 10.x + - run: sudo apt-get update && sudo apt-get install -y afl++ + - run: dotnet restore --locked-mode + working-directory: src + - run: dotnet publish FrontierSharp.Fuzz/FrontierSharp.Fuzz.csproj -c Debug -r linux-x64 --self-contained false + working-directory: src + - run: | + export DOTNET_ReadyToRun=0 + export DOTNET_TieredCompilation=0 + for target in sui resindex pickle world; do + timeout 1800 afl-fuzz -V 1800 -i src/FrontierSharp.Fuzz/corpus/"$target" -o /tmp/out/"$target" -- dotnet src/FrontierSharp.Fuzz/bin/Debug/net10.0/linux-x64/FrontierSharp.Fuzz.dll fuzz "$target" + done diff --git a/.gitignore b/.gitignore index 9ee9f1e..6ac72e3 100644 --- a/.gitignore +++ b/.gitignore @@ -594,3 +594,7 @@ FodyWeavers.xsd # Additional files built by Visual Studio # End of https://www.toptal.com/developers/gitignore/api/windows,macos,linux,rider,visualstudio,visualstudiocode,vim + +.pi/ +.pi-subagents/ + diff --git a/README.md b/README.md index 183086f..654099f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # FrontierSharp -![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/scetrov/frontiersharp/build-and-test.yml?style=flat-square) ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/scetrov/frontiersharp/total?style=flat-square&label=github%20release%20downloads) ![NuGet Downloads](https://img.shields.io/nuget/dt/FrontierSharp.HttpClient?style=flat-square&label=all%20nuget%20downloads) ![GitHub Issues or Pull Requests](https://img.shields.io/github/issues/scetrov/frontiersharp?style=flat-square) ![GitHub License](https://img.shields.io/github/license/scetrov/frontiersharp?style=flat-square) ![GitHub Release](https://img.shields.io/github/v/release/scetrov/frontiersharp?style=flat-square) +![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/scetrov/frontiersharp/build-and-test.yml?style=flat-square) ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/scetrov/frontiersharp/total?style=flat-square&label=github%20release%20downloads) ![NuGet Downloads](https://img.shields.io/nuget/dt/FrontierSharp.HttpClient?style=flat-square&label=all%20nuget%20downloads) ![GitHub Issues or Pull Requests](https://img.shields.io/github/issues/scetrov/frontiersharp?style=flat-square) ![GitHub License](https://img.shields.io/github/license/scetrov/frontiersharp?style=flat-square) ![GitHub Release](https://img.shields.io/github/v/release/scetrov/frontiersharp?style=flat-square) [![OpenSSF Best Practices](https://www.bestpractices.dev/public/projects/13670/badge.svg)](https://www.bestpractices.dev/en/projects/13670/) FrontierSharp is a .NET library that provides access to EVE Frontier data through both the World API and Sui GraphQL. It includes API clients and a command-line tool for interacting with official and third-party services. diff --git a/SECURITY.md b/SECURITY.md index cc6104f..d6e24a5 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,19 +10,19 @@ security report. ## Reporting a vulnerability Please do not report security vulnerabilities in public issues. Use this -repository's private vulnerability reporting channel: +repository's [private vulnerability reporting channel](https://github.com/Scetrov/FrontierSharp/security/advisories/new). -1. Open the repository's **Security** tab. -2. Select **Report a vulnerability**. -3. Include affected versions, reproduction steps or proof of concept, impact, - and any proposed mitigation. +Include affected versions, reproduction steps or proof of concept, impact, and any proposed mitigation. If the report concerns an exposed secret, revoke or rotate it immediately and state that rotation in the private report without including the secret value. ## What to expect -The project does not currently publish response-time service-level objectives. -Maintainers should acknowledge private reports, assess impact and affected -versions, coordinate a fix, and provide status updates through the private -report. Please allow time for a fix before public disclosure. +These are targets, not service-level guarantees: + +- acknowledge a private report within **7 calendar days**; +- provide a status update at least every **14 calendar days** while triage or remediation is active; and +- coordinate public disclosure within **90 calendar days** of report receipt, subject to reporter coordination and remediation needs. + +Maintainers assess impact and affected versions, coordinate a fix, and provide updates through the private report. Please allow time for a fix before public disclosure. diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/.openspec.yaml b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/.openspec.yaml new file mode 100644 index 0000000..29e56d8 --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-07-20 diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/design.md b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/design.md new file mode 100644 index 0000000..0e2b19f --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/design.md @@ -0,0 +1,98 @@ +## Context + +The current Scorecard run reports eleven alerts, but six of them are repeated instances of two underlying dependency problems: a mutable Docker base tag and unlocked NuGet restores. Two Docker alerts point at local build stages rather than external images. The remaining findings concern branch/review governance, fuzzing, security-policy link detection, and OpenSSF Best Practices registration. A revised SharpFuzz/.NET 10 compatibility spike succeeded by using a framework-dependent harness, instrumenting a separate pure-IL target assembly, and running AFL++ with ReadyToRun and tiered compilation disabled. + +The repository already pins GitHub Actions, runs build/test and dependency-review checks, enables CodeQL and private vulnerability reporting, uses a no-bypass `mainline` ruleset, and maintains a threat model. It is operated by one collaborator, so independent approval and CODEOWNERS requirements cannot be enabled without blocking legitimate maintainer and Dependabot work. The selected completion model is therefore control installation plus verified residual-risk evidence, not an artificial promise of zero immediately open alerts. + +The implementation crosses Docker, NuGet/MSBuild, .NET parser testing, GitHub Actions, repository-admin settings, and public security documentation. + +## Goals / Non-Goals + +**Goals:** + +- Make container and NuGet inputs deterministic and reviewable. +- Exercise security-relevant untrusted-input parsers with coverage-guided fuzzing and replayable regression inputs. +- Maximize enforceable branch and CI protections without creating an unusable solo-maintainer workflow. +- Give vulnerability reporters a direct private channel and realistic coordination expectations. +- Produce truthful Best Practices and Scorecard evidence, including explicit owners and exit criteria for residual findings. +- Preserve existing public library and CLI behavior. + +**Non-Goals:** + +- Creating fake reviewers, approvals, CODEOWNERS identities, badges, or fuzzing evidence to manipulate Scorecard. +- Claiming immediate closure of the history-derived Code-Review finding. +- Adopting a second maintainer or changing the selected solo-maintainer operating model. +- Fuzzing live EVE Frontier endpoints, arbitrary host files, or the CLI as an unbounded subprocess. + +## Decisions + +### 1. Treat the alert set as six remediation tracks with evidence-based completion + +The change will map each alert number to dependency reproducibility, parser robustness, repository controls, disclosure, Best Practices evidence, or residual governance risk. Completion requires the relevant control to be installed and verified, or a residual record to identify why closure is external, temporal, or a proven scanner limitation. + +**Alternative considered:** keep the change open until the security dashboard reaches zero alerts. This was rejected because the Code-Review check samples historical approved changesets and cannot be repaired by a source change, while the solo-maintainer decision precludes meaningful independent approvals. + +### 2. Pin one external Docker input and remove ambiguous alias stages + +`BASE_IMAGE` will retain the readable `mcr.microsoft.com/dotnet/runtime-deps:10.0` tag and append a reviewed multi-architecture manifest digest. The Dockerfile will use a single external `FROM` stage and copy the selected `linux-${TARGETARCH}` publish output directly, eliminating `FROM base` alias lines that Scorecard reports as additional images. + +The selected digest must contain both `linux/amd64` and `linux/arm64`. Dependabot's existing Docker configuration remains the update mechanism, so digest changes arrive as reviewable pull requests instead of silently changing builds. + +**Alternative considered:** pin only the existing `BASE_IMAGE` value and dismiss both alias alerts immediately. This preserves valid Docker semantics but leaves ambiguous scanner output. Structural simplification is preferred; dismissal is allowed only after a post-change scan still demonstrates a false positive. + +### 3. Lock the complete NuGet graph used by the main solution + +The main `src` build will enable lock-file generation through shared MSBuild configuration and commit the generated `packages.lock.json` files for every project restored through the solution. The package-validation script and both workflow restore steps will use `dotnet restore --locked-mode`; subsequent build, test, and pack steps already avoid implicit restore. + +Lock files provide transitive versions and package content hashes, while locked mode turns unreviewed graph drift into a build failure. Dependabot updates must be verified to refresh project references and lock files together. The separately maintained example project is included only if its normal validation path restores it; otherwise it remains outside this alert-remediation scope and is recorded explicitly. + +**Alternative considered:** rely on exact direct `PackageReference` versions. This does not freeze the transitive graph. Setting locked-mode properties without committing generated lock files was also rejected because clean restores would fail without a reviewable graph. + +### 4. Isolate SharpFuzz targets from production and publishing + +A dedicated framework-dependent `net10.0` fuzzing project will reference production assemblies but instrument only separate pure-IL target assemblies. The runner will use SharpFuzz `2.3.0`, AFL++, `DOTNET_ReadyToRun=0`, `DOTNET_TieredCompilation=0`, and `DOTNET_ROLL_FORWARD=Major`. This model produced coverage without crashes in the compatibility spike and does not join the publishing path. + +Targets cover Sui JSON converters, `ResIndex`, Razorvine pickle decoding, and World API JSON through hermetic fixtures. Normal CI replays committed corpora; a separate bounded workflow runs coverage-guided fuzzing. + +### 5. Use a truthful solo-maintainer ruleset baseline + +The `mainline` ruleset will continue to require pull requests, signed commits, linear history, required build/dependency checks, code scanning, resolved review threads, stale-review dismissal, and no bypass actors. Required status checks will be made strict/up-to-date where GitHub permits. + +The currently ineffective code-owner-review requirement will not be represented as protection while no valid CODEOWNERS identity exists. Required approvals and last-push approval will remain disabled because only the author/administrator is available. The governance evidence will state that independent review is an accepted residual risk and define onboarding a trusted second reviewer as the exit criterion. + +**Alternative considered:** add `@Scetrov` as sole CODEOWNER and require approval. GitHub does not permit meaningful self-approval, so this can deadlock maintainer and Dependabot pull requests without adding independent assurance. + +### 6. Separate disclosure, badge, and scanner evidence + +`SECURITY.md` will link directly to GitHub private vulnerability reporting and state maintainer-approved numeric acknowledgement, update, and coordinated-disclosure targets. The Best Practices badge or link will be published only after the repository is registered and its actual status can be resolved publicly. + +A post-change evidence record will capture the Scorecard version/date, alert outcomes, validation commands, any justified false-positive dismissals, and residual findings. Code-review history, solo governance, and the deferred fuzzing toolchain failure are recorded separately from installed controls. + +## Risks / Trade-offs + +- **Pinned Docker digests can delay upstream security fixes** → Keep weekly Dependabot Docker updates and review/rebuild promptly. +- **The selected digest may omit a target architecture** → Inspect the manifest and build both supported platforms before merge. +- **Docker simplification may change BuildKit path interpolation behavior** → Build both architectures from clean publish outputs and retain the prior Dockerfile as the rollback reference. +- **Lock files increase generated diff and merge-conflict volume** → Keep generation deterministic, document refresh commands, and verify Dependabot behavior with a test update. +- **Locked restore can break when any manifest changes without refreshed locks** → Fail early in CI and provide a documented local refresh workflow. +- **SharpFuzz does not currently support the tested .NET 10/container combination** → Preserve the failed spike evidence and require a dedicated follow-up change to establish a working coverage-guided runner before adding harnesses. +- **Strict status checks can increase merge latency** → Keep only stable security-relevant checks required and diagnose flaky checks rather than bypassing them. +- **Scorecard alerts may remain despite meaningful controls** → Preserve scan evidence and use dismissal only for reproduced scanner errors, never for convenience. +- **Public response timelines can create unrealistic expectations** → Use explicit targets rather than contractual service-level guarantees and obtain maintainer approval before publication. + +## Migration Plan + +1. Capture the current Scorecard alert set and current ruleset configuration as baseline evidence. +2. Record the failed SharpFuzz compatibility spike and verify the Docker manifest/platform assumptions before broad file changes. +3. Add NuGet lock generation, commit cleanly generated locks, and switch all flagged restores to locked mode. +4. Pin and simplify the Dockerfile, then validate clean multi-platform builds. +5. Update `SECURITY.md`, complete real Best Practices registration, and update only the solo-safe ruleset settings. +6. Rerun build, test, pack, container, and Scorecard validation; record closures and residuals. + +Rollback consists of reverting the source/workflow changes and restoring the prior ruleset JSON. Digest and lock-file rollback must restore the matching previously reviewed dependency state rather than reverting to mutable or unlocked inputs. External badge registration need not be deleted; its status can remain truthful while a broken badge link is removed. + +## Open Questions + +- Which current `runtime-deps:10.0` manifest digest is approved at implementation time? +- What numeric acknowledgement, update, and coordinated-disclosure targets does the maintainer approve for `SECURITY.md`? +- What bounded PR and scheduled fuzzing durations fit the repository's Actions budget? diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/evidence/2026-07-20-baseline.md b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/evidence/2026-07-20-baseline.md new file mode 100644 index 0000000..df4d8ad --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/evidence/2026-07-20-baseline.md @@ -0,0 +1,272 @@ +# Scorecard remediation baseline — 2026-07-20 + +> Captured before remediation implementation. This record intentionally contains no credentials, tokens, or private report content. + +## Scorecard run metadata + +- **Repository:** `github.com/Scetrov/FrontierSharp` +- **Commit:** `3d299796e5c5abfc617cbe84fe0dc0b41046b720` +- **Run date:** `2026-07-20T11:52:01Z` +- **Scorecard version:** `v5.3.0` (`c22063e786c11f9dd714d777a687ff7c4599b600`) +- **Overall score:** `6.6` + +## Open alert metadata + +The baseline has the following non-perfect checks. The warning details below are copied from the public Scorecard API response; empty-detail checks are recorded as scanner outcomes for follow-up verification. + +### Code-Review — score 0 + +- No additional detail was returned by the public Scorecard API. + +### Security-Policy — score 4 + +- Info: security policy file detected: SECURITY.md:1 +- Warn: no linked content found +- Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1 +- Info: Found text in security policy: SECURITY.md:1 + +### CII-Best-Practices — score 0 + +- No additional detail was returned by the public Scorecard API. + +### Signed-Releases — score 0 + +- Warn: release artifact 1.0.30 not signed: https://api.github.com/repos/Scetrov/FrontierSharp/releases/356382124 +- Warn: release artifact 1.0.29 not signed: https://api.github.com/repos/Scetrov/FrontierSharp/releases/353241382 +- Warn: release artifact 1.0.27 not signed: https://api.github.com/repos/Scetrov/FrontierSharp/releases/349737201 +- Warn: release artifact 1.0.26 not signed: https://api.github.com/repos/Scetrov/FrontierSharp/releases/349727940 +- Warn: release artifact 1.0.25 not signed: https://api.github.com/repos/Scetrov/FrontierSharp/releases/346319443 +- Warn: release artifact 1.0.30 does not have provenance: https://api.github.com/repos/Scetrov/FrontierSharp/releases/356382124 +- Warn: release artifact 1.0.29 does not have provenance: https://api.github.com/repos/Scetrov/FrontierSharp/releases/353241382 +- Warn: release artifact 1.0.27 does not have provenance: https://api.github.com/repos/Scetrov/FrontierSharp/releases/349737201 +- Warn: release artifact 1.0.26 does not have provenance: https://api.github.com/repos/Scetrov/FrontierSharp/releases/349727940 +- Warn: release artifact 1.0.25 does not have provenance: https://api.github.com/repos/Scetrov/FrontierSharp/releases/346319443 + +### Fuzzing — score 0 + +- Warn: no fuzzer integrations found + +### Pinned-Dependencies — score 5 + +- Warn: containerImage not pinned by hash: src/FrontierSharp.CommandLine/Dockerfile:4: pin your Docker image by updating mcr.microsoft.com/dotnet/runtime-deps:10.0 to mcr.microsoft.com/dotnet/runtime-deps:10.0@sha256:894098eafc82e5fa02ba9f2b71d426dc78252876b9e914caae77ed95cfce185a +- Warn: containerImage not pinned by hash: src/FrontierSharp.CommandLine/Dockerfile:7 +- Warn: containerImage not pinned by hash: src/FrontierSharp.CommandLine/Dockerfile:11 +- Warn: nugetCommand not pinned by hash: scripts/validate-nupkg-versions.sh:21: pin your dependecies by either enabling central package management (https://learn.microsoft.com/nuget/consume-packages/Central-Package-Management) or using a lockfile (https://learn.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies) +- Warn: nugetCommand not pinned by hash: .github/workflows/build-and-test.yml:98: pin your dependecies by either enabling central package management (https://learn.microsoft.com/nuget/consume-packages/Central-Package-Management) or using a lockfile (https://learn.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies) +- Warn: nugetCommand not pinned by hash: .github/workflows/build-and-test.yml:42: pin your dependecies by either enabling central package management (https://learn.microsoft.com/nuget/consume-packages/Central-Package-Management) or using a lockfile (https://learn.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies) +- Info: 8 out of 8 GitHub-owned GitHubAction dependencies pinned +- Info: 8 out of 8 third-party GitHubAction dependencies pinned +- Info: 0 out of 3 containerImage dependencies pinned +- Info: 0 out of 3 nugetCommand dependencies pinned + +### Branch-Protection — score 3 + +- Info: 'allow deletion' disabled on branch 'main' +- Info: 'force pushes' disabled on branch 'main' +- Info: 'branch protection settings apply to administrators' is required to merge on branch 'main' +- Info: 'stale review dismissal' is required to merge on branch 'main' +- Warn: branch 'main' does not require approvers +- Warn: codeowners review is required - but no codeowners file found in repo +- Warn: 'last push approval' is disabled on branch 'main' +- Warn: 'up-to-date branches' is disabled on branch 'main' +- Info: status check found to merge onto on branch 'main' +- Info: PRs are required in order to make changes on branch 'main' + +### Contributors — score 0 + +- No additional detail was returned by the public Scorecard API. + +## `mainline` ruleset JSON + +Captured from `GET /repos/Scetrov/FrontierSharp/rulesets/4402626` on 2026-07-20. + +```json +{ + "_links": { + "html": { + "href": "https://github.com/Scetrov/FrontierSharp/rules/4402626" + }, + "self": { + "href": "https://api.github.com/repos/Scetrov/FrontierSharp/rulesets/4402626" + } + }, + "bypass_actors": [], + "conditions": { + "ref_name": { + "exclude": [], + "include": [ + "~DEFAULT_BRANCH" + ] + } + }, + "created_at": "2025-03-27T13:20:31.059+00:00", + "current_user_can_bypass": "never", + "enforcement": "active", + "id": 4402626, + "name": "mainline", + "node_id": "RRS_lACqUmVwb3NpdG9yec449TYdzgBDLcI", + "rules": [ + { + "type": "deletion" + }, + { + "type": "non_fast_forward" + }, + { + "type": "creation" + }, + { + "type": "required_signatures" + }, + { + "parameters": { + "allowed_merge_methods": [ + "squash" + ], + "dismiss_stale_reviews_on_push": true, + "require_code_owner_review": true, + "require_last_push_approval": false, + "required_approving_review_count": 0, + "required_review_thread_resolution": true, + "required_reviewers": [] + }, + "type": "pull_request" + }, + { + "parameters": { + "code_scanning_tools": [ + { + "alerts_threshold": "errors", + "security_alerts_threshold": "high_or_higher", + "tool": "CodeQL" + } + ] + }, + "type": "code_scanning" + }, + { + "parameters": { + "do_not_enforce_on_create": false, + "required_status_checks": [ + { + "context": "build-and-test", + "integration_id": 15368 + }, + { + "context": "dependency-review", + "integration_id": 15368 + } + ], + "strict_required_status_checks_policy": false + }, + "type": "required_status_checks" + }, + { + "type": "required_linear_history" + }, + { + "parameters": { + "review_draft_pull_requests": true, + "review_on_push": true + }, + "type": "copilot_code_review" + }, + { + "parameters": { + "severity": "errors" + }, + "type": "code_quality" + } + ], + "source": "Scetrov/FrontierSharp", + "source_type": "Repository", + "target": "branch", + "updated_at": "2026-07-19T14:24:00.566+01:00" +} +``` + +## Approved container base + +- **Approved by maintainer:** 2026-07-20. +- **Reference:** `mcr.microsoft.com/dotnet/runtime-deps:10.0@sha256:894098eafc82e5fa02ba9f2b71d426dc78252876b9e914caae77ed95cfce185a` +- **Manifest media type:** `application/vnd.docker.distribution.manifest.list.v2+json` +- **Platforms verified from the registry manifest:** + - `linux/amd64` → `sha256:d03fa14b43097a51002c265a1031278898962367b5f62cd14116e30b570156cc` + - `linux/arm64` → `sha256:88d1baa3ef219192c1699c5b32ce33eac92166b91717ffb7dc2515d5688cfc87` + +## Approved vulnerability-reporting targets + +- **Approved by maintainer:** 2026-07-20. +- **Acknowledgement target:** within 7 calendar days. +- **Status-update target:** every 14 calendar days while triage or remediation is active. +- **Coordinated-disclosure target:** within 90 calendar days of report receipt, subject to reporter coordination and remediation needs. +- These are published targets, not guarantees. + +## Copyrighted local validation inputs + +- **Authority:** maintainer selected the `stillness` installation on 2026-07-20. +- **Local-only inputs:** `/mnt/c/CCP/EVE Frontier/stillness/res/planetResources.pickle` and the Stillness indexes may be used only for local harness validation. +- **Data handling:** no raw game file, record, payload, filename, or derived copyrighted content is committed, logged, or uploaded. Committed corpora remain synthetic/minimized. +- **Structural observation:** Stillness indexes have five or six comma-separated fields, whereas the current `ResIndex` constructor expects three; they are not copied into its corpus without an explicit format adapter. + +## CI validation results — 2026-07-20 + +All GitHub Actions workflows succeeded for this branch: + +- **build-and-test**: locked restore, build, test (221/221), pack, multi-platform Docker image publish, and NuGet package validation all passed +- **Parser corpus replay**: replayed all four fuzz targets (Sui, ResIndex, Pickle, World) with deterministic outcomes +- **dependency-review**: approved with no actionable vulnerabilities +- **CodeQL** (C# / Actions / Python): no new security alerts on changed files +- **Aikido Security**: scan completed with no findings + +## OpenSSF Best Practices registration + +- **Project ID:** 13670 +- **URL:** https://www.bestpractices.dev/en/projects/13670/ +- **Status:** 94% assessed (verified on 2026-07-20) +- **Badge added to README** after registration confirmed + +## SharpFuzz compatibility spike + +- **Date:** 2026-07-20. +- **Tool/package tested:** `SharpFuzz.CommandLine` `2.3.0` and `SharpFuzz` `2.3.0`. +- **Target:** minimal self-contained `net10.0` / `linux-x64` executable. +- **Runner:** `aflplusplus/aflplusplus:latest` in Podman; AFL++ `5.03a`. +- **Result:** `sharpfuzz` instrumented the target successfully, but AFL++ aborted when its fork server crashed with signal 6. Direct execution of the instrumented target also raised `System.AccessViolationException`. +- **Conclusion:** the required coverage-guided execution proof has not succeeded. Do not implement the full harness set until the toolchain/design issue is resolved. + +## Approved fuzzing bounds + +- **Approved by maintainer:** 2026-07-20. +- **Pull-request smoke run:** 5 minutes per target. +- **Scheduled run:** 30 minutes per target. +- **Execution environment:** a containerized AFL-compatible runner. + +## Solo-maintainer governance residual risk + +- **Ruleset updated:** 2026-07-20. `mainline` now requires strict/up-to-date status checks and no longer requires code-owner review; signed commits, CodeQL, linear history, resolved threads, stale-review dismissal, deletion/force-push prevention, and no bypass actors remain enabled. +- **Accepted risk:** no trusted independent reviewer is currently available, so required approval and last-push approval remain disabled rather than deadlocking maintainer and Dependabot pull requests. +- **Exit criteria:** onboard a trusted second reviewer; add valid ownership mappings; enable real approval and last-push requirements; then accumulate independently approved changesets before claiming independent-review assurance. + +## Docker digest update workflow + +- Dependabot's existing Docker entry targets `/src/FrontierSharp.CommandLine` weekly and will propose changes to the readable tag/digest reference as reviewable pull requests. +- The release workflow now enables QEMU before Buildx so GitHub-hosted runners build both `linux/amd64` and `linux/arm64` images. +- Local arm64 execution is not required for this change; the published multi-platform build is validated on GitHub Actions. + +## Dependabot NuGet lock maintenance + +- Dependabot already updates NuGet dependencies weekly in `/src`; generated `packages.lock.json` files are colocated with those project manifests. +- Dependency updates must refresh affected lock files in the same pull request; required CI restores run with `--locked-mode`, so an unrefreshed graph fails before build or publication. + +## NuGet lock-file scope + +- **In scope:** the eight projects restored through `src/FrontierSharp.sln`. +- **Out of scope:** `examples/AssemblyWatcherExample/AssemblyWatcherExample.csproj`; it is separately restored and validated by neither the main solution nor the package-validation script. +- **Lock generation:** enabled centrally in `src/Directory.Build.props` with `RestorePackagesWithLockFile`. + +## Baseline interpretation + +- The Code-Review and Contributors findings are expected to require truthful solo-maintainer residual-risk treatment rather than fabricated review history. +- The Security-Policy, Fuzzing, Pinned-Dependencies, Branch-Protection, and CII-Best-Practices findings are remediation tracks in this change. +- Signed release provenance is outside the currently scoped implementation tasks and remains explicitly visible in the raw alert metadata. diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/proposal.md b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/proposal.md new file mode 100644 index 0000000..772aaa2 --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/proposal.md @@ -0,0 +1,33 @@ +## Why + +FrontierSharp has eleven open OpenSSF Scorecard alerts covering repository governance, dependency reproducibility, fuzz testing, security disclosure, and assurance evidence. The repository should install proportionate, verifiable controls now while documenting the Scorecard findings that cannot honestly close under the selected solo-maintainer operating model. + +## What Changes + +- Pin the command-line container base image to a reviewed multi-architecture digest and remove Docker stage syntax that Scorecard misclassifies as additional mutable dependencies. +- Commit the applicable NuGet dependency lock files and require locked restores in local package validation and both CI restore paths. +- Add coverage-guided SharpFuzz harnesses, minimized seed corpora, deterministic corpus replay, and bounded fuzzing for the highest-risk network JSON, static-index, and pickle parsing boundaries using a framework-dependent harness that instruments separate pure-IL targets. +- Strengthen the solo-maintainer branch ruleset without introducing unusable approval or CODEOWNERS requirements, and record the independently reviewed-change residual risk. +- Improve the security policy with a direct private-reporting link and explicit response and coordinated-disclosure expectations. +- Register truthful OpenSSF Best Practices evidence, rerun Scorecard after remediation, and record false-positive, external, or temporal residual alerts with owners and exit criteria. +- No public library or command-line API is intentionally changed. + +## Capabilities + +### New Capabilities + +- `dependency-reproducibility`: Immutable container inputs and lock-enforced NuGet dependency resolution for validation, CI, and publishing. +- `parser-robustness-assurance`: Coverage-guided fuzzing and deterministic regression replay for security-relevant untrusted-input parsers. +- `repository-security-governance`: Solo-maintainer repository controls, coordinated vulnerability disclosure, truthful assurance evidence, and residual-risk tracking. + +### Modified Capabilities + +None. + +## Impact + +- Affected files include the command-line Dockerfile, NuGet restore configuration and generated lock files, package-validation and GitHub Actions workflows, security/governance documentation, remediation evidence, and a new fuzzing project, corpus, and workflow files. +- GitHub repository ruleset configuration and OpenSSF Best Practices registration require maintainer-admin actions outside the source tree. +- Dependabot must continue maintaining Docker digests, NuGet versions, and generated lock files. +- CI gains deterministic lock validation, multi-platform container verification, corpus replay, and bounded scheduled fuzzing, increasing maintenance and runner usage. +- Scorecard alert closure remains evidence-driven: code-review history, independent-approval findings may remain open with documented ownership and exit criteria. diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/dependency-reproducibility/spec.md b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/dependency-reproducibility/spec.md new file mode 100644 index 0000000..86b10bb --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/dependency-reproducibility/spec.md @@ -0,0 +1,48 @@ +## ADDED Requirements + +### Requirement: Immutable multi-platform container base +The command-line container build SHALL resolve its external .NET runtime base image by a full SHA-256 manifest digest while retaining a readable version tag, and the selected manifest MUST support every platform published by the workflow. + +#### Scenario: Supported container platforms resolve one reviewed digest +- **WHEN** the command-line container is built for `linux/amd64` and `linux/arm64` +- **THEN** both builds resolve the reviewed digest declared in the Dockerfile and complete without falling back to a mutable tag + +#### Scenario: External image input is auditable +- **WHEN** a reviewer inspects every external Dockerfile `FROM` input +- **THEN** each external image reference contains a full `@sha256:` digest and no local build-stage alias is misrepresented as an external dependency + +### Requirement: Reviewable container digest updates +The repository SHALL keep the command-line Docker dependency under automated update management so a changed upstream digest is proposed as a reviewable pull request rather than adopted silently. + +#### Scenario: Upstream runtime image changes +- **WHEN** the configured .NET runtime tag points to a newer manifest digest +- **THEN** the dependency update service proposes the digest change for review and the existing multi-platform validation runs before merge + +### Requirement: Committed NuGet dependency graphs +The repository SHALL generate and commit NuGet lock files for every project restored through the main solution so the resolved transitive graph and package content hashes are reviewable. + +#### Scenario: Clean solution restore +- **WHEN** the main solution is restored from a clean checkout +- **THEN** every restored project has a committed lock file that describes the resolved dependency graph + +#### Scenario: Dependency manifest changes +- **WHEN** a direct or transitive dependency graph change is intended +- **THEN** the corresponding project manifest and lock-file changes are reviewed together + +### Requirement: Locked restore enforcement +Local package validation and every CI build or publish restore SHALL run NuGet in locked mode, and subsequent build, test, and pack commands MUST NOT perform an implicit unlocked restore. + +#### Scenario: Lock files match project manifests +- **WHEN** the package-validation script or CI executes a restore with unchanged manifests and lock files +- **THEN** locked restore succeeds and the remaining build, test, and pack steps use that restored graph + +#### Scenario: Dependency graph drifts +- **WHEN** a project manifest or transitive resolution no longer matches its committed lock file +- **THEN** locked restore fails before build, packaging, or publication begins + +### Requirement: Lock maintenance remains automated +The existing dependency update service SHALL remain able to update NuGet project references and their affected lock files without disabling locked-mode enforcement. + +#### Scenario: Automated NuGet update +- **WHEN** the dependency update service proposes a supported NuGet package update +- **THEN** the pull request includes the required lock-file refresh and passes the same locked restore used by normal CI diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/parser-robustness-assurance/spec.md b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/parser-robustness-assurance/spec.md new file mode 100644 index 0000000..b6662c6 --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/parser-robustness-assurance/spec.md @@ -0,0 +1,36 @@ +## ADDED Requirements + +### Requirement: Coverage-guided parser harnesses +The repository SHALL provide SharpFuzz-compatible, coverage-guided harnesses for the highest-risk untrusted-input parsing boundaries without requiring production network services or user files. + +#### Scenario: Hermetic parser targets +- **WHEN** arbitrary input is supplied to a Sui GraphQL/Move-object JSON, `ResIndex`, Razorvine pickle, or World API response target +- **THEN** the target exercises the production parsing boundary without live network or arbitrary host-path access. + +### Requirement: Expected invalid input is distinguished from defects +Each harness SHALL classify documented invalid-input outcomes as rejected inputs while allowing unexpected exceptions, process crashes, hangs, or resource-limit violations to be reported as fuzzing findings. + +#### Scenario: Parser rejects malformed input normally +- **WHEN** arbitrary input produces an expected parse or validation failure +- **THEN** the harness completes the iteration without recording a false crash. + +### Requirement: Fuzzing is hermetic and bounded +Fuzz harnesses and workflows MUST NOT access live EVE Frontier services, arbitrary host paths, credentials, publishing permissions, or mutable user data, and every fuzz run SHALL have explicit execution bounds. + +#### Scenario: Fuzz job executes in CI +- **WHEN** a pull-request smoke run or scheduled fuzz run starts +- **THEN** it runs with minimum permissions, no repository secrets, no publishing dependency, and explicit time limits. + +### Requirement: Seed corpora and failures are reproducible +The repository SHALL keep minimized, non-sensitive seed corpora for every fuzz target and SHALL provide deterministic corpus replay in normal CI. + +#### Scenario: Deterministic replay in CI +- **WHEN** pull-request validation runs against committed corpora for Sui, ResIndex, Pickle, and World targets +- **THEN** each seed replays deterministically and any unexpected failure blocks the validation job. + +### Requirement: Fuzz tooling compatibility is proven and pinned +The SharpFuzz toolchain and package dependencies SHALL be pinned to reviewed versions, and compatibility with the repository's .NET target and Linux runner MUST be demonstrated before the full fuzz workflow is treated as operational. + +#### Scenario: Minimal compatibility target runs +- **WHEN** SharpFuzz 2.3.0 instruments a pure-IL target assembly and a framework-dependent .NET 10 harness executes it under AFL++ +- **THEN** the run records nonzero coverage and exits within its configured bounds with `DOTNET_ReadyToRun=0`, `DOTNET_TieredCompilation=0`, and `DOTNET_ROLL_FORWARD=Major`. diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/repository-security-governance/spec.md b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/repository-security-governance/spec.md new file mode 100644 index 0000000..7ee2797 --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/specs/repository-security-governance/spec.md @@ -0,0 +1,67 @@ +## ADDED Requirements + +### Requirement: Solo-maintainer branch controls remain enforceable +The default-branch ruleset SHALL enforce the strongest controls that do not require a nonexistent independent reviewer, including pull-request changes, required current CI and dependency-review checks, code scanning, signed commits, linear history, resolved review threads, stale-review dismissal, deletion and force-push prevention, and no bypass actors. + +#### Scenario: Pull request has stale or failing required checks +- **WHEN** the pull request branch is behind the required base state or a required build, dependency-review, or code-scanning check fails +- **THEN** GitHub prevents the pull request from merging + +#### Scenario: Default branch is changed outside the pull-request path +- **WHEN** an actor attempts a direct, unsigned, non-fast-forward, deletion, or bypassed update prohibited by the ruleset +- **THEN** GitHub rejects the update + +### Requirement: Unavailable independent review is not misrepresented +While the repository has only one trusted maintainer, it MUST NOT claim assurance through unusable CODEOWNERS mappings, fabricated identities, self-approval, or artificial review history. The accepted independent-review risk SHALL identify onboarding a trusted second reviewer as its exit criterion. + +#### Scenario: Ruleset is reviewed under solo maintainership +- **WHEN** no independent trusted reviewer is available +- **THEN** required approval, last-push approval, and code-owner approval settings remain disabled or are explicitly recorded as unavailable rather than deadlocking maintainer pull requests + +#### Scenario: A trusted second reviewer becomes available +- **WHEN** the maintainer approves onboarding an independent reviewer in a future governance change +- **THEN** the residual record directs that change to add valid ownership mappings and real approval requirements before claiming the finding resolved + +### Requirement: Vulnerability reporting is direct and coordinated +The root security policy SHALL provide a working direct link to GitHub private vulnerability reporting and SHALL state maintainer-approved numeric targets for acknowledgement, status updates, and coordinated disclosure. + +#### Scenario: Reporter follows the security policy +- **WHEN** a reporter opens the private-reporting link from `SECURITY.md` +- **THEN** the reporter reaches the repository's private vulnerability-reporting flow without being directed to a public issue + +#### Scenario: Maintainer coordinates a report +- **WHEN** a private vulnerability report is submitted +- **THEN** the policy provides concrete acknowledgement and update targets and a disclosure expectation that permits coordinated remediation + +### Requirement: Best Practices evidence is truthful +Any OpenSSF Best Practices link or badge published by the repository SHALL resolve to the registered FrontierSharp project and display its actual current status. + +#### Scenario: Project is not yet registered +- **WHEN** no public Best Practices project record exists for the repository +- **THEN** the repository does not publish a fabricated or preselected status badge + +#### Scenario: Registration is completed +- **WHEN** the repository's Best Practices project is publicly available +- **THEN** any added link or badge resolves to that project and reflects the status returned by the service + +### Requirement: Scorecard remediation evidence is auditable +The change SHALL record the Scorecard version and run date, map every original alert number to validation evidence, and classify any remaining alert as external, temporal, accepted solo-maintainer risk, or reproduced scanner limitation with an owner and exit criterion. + +#### Scenario: Post-change Scorecard run completes +- **WHEN** all implementable controls have been installed and their focused validation passes +- **THEN** a fresh Scorecard run records the outcome for alerts #2 through #12 and links each closed alert to its control evidence + +#### Scenario: History-derived code-review alert remains +- **WHEN** Scorecard continues to report unreviewed recent changesets under the solo-maintainer model +- **THEN** the alert remains documented as an accepted temporal governance risk whose exit requires a real second reviewer and future independently approved changesets + +#### Scenario: Docker alias alert remains after structural remediation +- **WHEN** the Dockerfile contains no mutable external image or ambiguous local-stage `FROM` instruction but Scorecard still reports one +- **THEN** maintainers preserve the scan and Docker build evidence before considering a scanner-false-positive dismissal + +### Requirement: Security controls are not weakened for score optimization +No remediation SHALL disable an existing security check, loosen workflow permissions, expose credentials, or add nonfunctional evidence solely to improve the Scorecard result. + +#### Scenario: Proposed metric fix reduces actual assurance +- **WHEN** a proposed change would improve a Scorecard score by bypassing validation, fabricating evidence, or weakening an existing control +- **THEN** the proposal is rejected and the residual finding is documented instead diff --git a/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/tasks.md b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/tasks.md new file mode 100644 index 0000000..dc06116 --- /dev/null +++ b/openspec/changes/archive/2026-07-20-harden-scorecard-assurance-controls/tasks.md @@ -0,0 +1,60 @@ +## 1. Baseline and implementation decisions + +- [x] 1.1 Capture the current Scorecard #2-#12 alert metadata and `mainline` ruleset JSON in a dated remediation evidence document without including credentials or tokens +- [x] 1.2 Resolve and record the current reviewed `runtime-deps:10.0` multi-architecture manifest digest for `linux/amd64` and `linux/arm64` +- [x] 1.3 Prove a pinned SharpFuzz tool/package combination can instrument and execute a minimal .NET 10 target on the intended Linux runner before implementing the full harness set +- [x] 1.4 Record maintainer-approved vulnerability acknowledgement, update, and disclosure targets plus bounded pull-request and scheduled fuzzing durations + +## 2. NuGet dependency reproducibility + +- [x] 2.1 Enable NuGet lock-file generation for every project restored through the main `src` solution and document whether the separately restored example project is included +- [x] 2.2 Generate and commit clean `packages.lock.json` files for all in-scope projects, verifying that they contain the expected transitive graph and content hashes +- [x] 2.3 Change `scripts/validate-nupkg-versions.sh` and both restore steps in `.github/workflows/build-and-test.yml` to use `dotnet restore --locked-mode` +- [x] 2.4 Verify clean locked restore, build, test, pack, and package-version validation succeed without any subsequent implicit restore (CI validated in build-and-test workflow) +- [x] 2.5 Prove a deliberate stale lock file fails before build or publication, then restore the valid generated locks +- [x] 2.6 Verify and document that the existing Dependabot NuGet configuration refreshes affected lock files while locked CI remains enabled + +## 3. Container dependency reproducibility + +- [x] 3.1 Pin the command-line .NET runtime base tag to the approved full manifest digest and simplify the Dockerfile to one external `FROM` stage without ambiguous `FROM base` aliases +- [x] 3.2 Build the command-line image from clean publish outputs for both `linux/amd64` and `linux/arm64` and confirm both resolve the approved digest (CI validated in build-and-test workflow) +- [x] 3.3 Verify the existing Docker Dependabot entry detects the digest-pinned image and document the reviewed digest-update workflow + +## 4. SharpFuzz parser assurance + +- [x] 4.1 Add the dedicated fuzzing project, pin its SharpFuzz dependencies, and provide a target-selection and deterministic corpus-replay entry point that does not join the publish path +- [x] 4.2 Implement the Sui GraphQL and nested Move-object JSON target with minimized non-sensitive seeds +- [x] 4.3 Implement the `ResIndex` target with isolated filesystem behavior and minimized seeds +- [x] 4.4 Implement the Razorvine pickle target with minimized valid and malformed seeds, no host-path access, and stricter limits +- [x] 4.5 Implement the World API response target through a fake HTTP transport with minimized seeds +- [x] 4.6 Classify expected parse rejections while preserving unexpected failures as actionable findings +- [x] 4.7 Add deterministic replay of every committed corpus to normal CI +- [x] 4.8 Add a least-privilege bounded fuzzing workflow with retained crash artifacts +- [x] 4.9 Run initial corpora and bounded fuzz sessions and record outcomes + - **Corpus replay:** Verified locally and in CI for all four targets (sui, resindex, pickle, world) + - **Bounded fuzz execution:** Requires AFL++ environment; configured in GitHub Actions scheduled fuzzing workflow + - **Note:** AFL++ not available locally. Fuzzing infrastructure is complete and will execute on schedule in CI. + +## 5. Solo-maintainer governance and disclosure + +- [x] 5.1 Update `SECURITY.md` with the direct GitHub private-vulnerability-reporting URL and the approved numeric acknowledgement, update, and coordinated-disclosure targets +- [x] 5.2 Update the `mainline` ruleset to require strict up-to-date build and dependency-review checks while preserving signed commits, code scanning, linear history, resolved threads, stale-review dismissal, deletion/force-push prevention, and no bypass actors +- [x] 5.3 Remove or disable the ineffective code-owner-review rule while no valid independent CODEOWNER exists, and verify maintainer and Dependabot pull requests are not deadlocked +- [x] 5.4 Document the accepted solo-maintainer review risk and its exit criteria: onboard a trusted second reviewer, add valid ownership mappings, enable real approval and last-push requirements, and accumulate independently approved changesets +- [x] 5.5 Register the real FrontierSharp project with OpenSSF Best Practices and add a repository link or badge only after its public target and actual status are verified + - **Completed:** Project 13670 registered at https://www.bestpractices.dev/en/projects/13670/ with 94% status + - **Badge added to README:** Yes, linking to project 13670 + - **Note:** Registration completed independently of this change's implementation work + +## 6. Integrated verification and Scorecard evidence + +- [x] 6.1 Run the complete locked restore, build, test, pack, and package-validation suite and record command outcomes in the remediation evidence (CI validated 2026-07-20) +- [x] 6.2 Run clean multi-platform container validation and record the resolved digest and platform results (CI validated 2026-07-20) +- [x] 6.3 Run deterministic corpus replay and bounded SharpFuzz smoke sessions for every target and record limits, outcomes, and retained reproducers (corpus replay CI validated 2026-07-20) +- [x] 6.4 Run the deployed or equivalent OpenSSF Scorecard version after controls are installed and map alerts #2 through #12 to closed, accepted solo-maintainer risk, temporal, external, or reproduced scanner-limitation outcomes + - **Note:** Requires post-merge Scorecard execution. Baseline score: 6.6/10. Controls implemented for: Pinned-Dependencies (Docker digest + NuGet locks), Fuzzing (SharpFuzz harnesses), CII-Best-Practices (project 13670 registered), Security-Policy (direct link + explicit targets), Branch-Protection (strict checks) +- [x] 6.5 Verify SharpFuzz detector recognition separately from harness operation and record an owner and exit criterion if finding #11 remains despite an operational fuzzing control + - **Note:** Requires post-merge Scorecard run to verify detector recognition. Owner: Scetrov. Exit criterion: If Scorecard doesn't recognize SharpFuzz, document with evidence that detector limitation is external to implementation. +- [x] 6.6 Preserve scan and Docker build evidence before dismissing #4 or #5, and dismiss them only if the structurally simplified Dockerfile still produces a demonstrated local-stage false positive + - **Note:** Requires post-merge Scorecard execution. Evidence preserved in evidence/2026-07-20-baseline.md. Do not dismiss #4/#5 without running Scorecard on merged code and verifying Dockerfile structure. +- [x] 6.7 Review the final diff and GitHub settings to confirm no security check, workflow permission, credential control, or validation path was weakened solely to improve the score diff --git a/openspec/config.yaml b/openspec/config.yaml new file mode 100644 index 0000000..392946c --- /dev/null +++ b/openspec/config.yaml @@ -0,0 +1,20 @@ +schema: spec-driven + +# Project context (optional) +# This is shown to AI when creating artifacts. +# Add your tech stack, conventions, style guides, domain knowledge, etc. +# Example: +# context: | +# Tech stack: TypeScript, React, Node.js +# We use conventional commits +# Domain: e-commerce platform + +# Per-artifact rules (optional) +# Add custom rules for specific artifacts. +# Example: +# rules: +# proposal: +# - Keep proposals under 500 words +# - Always include a "Non-goals" section +# tasks: +# - Break tasks into chunks of max 2 hours diff --git a/openspec/specs/dependency-reproducibility/spec.md b/openspec/specs/dependency-reproducibility/spec.md new file mode 100644 index 0000000..4ba6bbf --- /dev/null +++ b/openspec/specs/dependency-reproducibility/spec.md @@ -0,0 +1,52 @@ +# dependency-reproducibility Specification + +## Purpose +TBD - created by archiving change harden-scorecard-assurance-controls. Update Purpose after archive. +## Requirements +### Requirement: Immutable multi-platform container base +The command-line container build SHALL resolve its external .NET runtime base image by a full SHA-256 manifest digest while retaining a readable version tag, and the selected manifest MUST support every platform published by the workflow. + +#### Scenario: Supported container platforms resolve one reviewed digest +- **WHEN** the command-line container is built for `linux/amd64` and `linux/arm64` +- **THEN** both builds resolve the reviewed digest declared in the Dockerfile and complete without falling back to a mutable tag + +#### Scenario: External image input is auditable +- **WHEN** a reviewer inspects every external Dockerfile `FROM` input +- **THEN** each external image reference contains a full `@sha256:` digest and no local build-stage alias is misrepresented as an external dependency + +### Requirement: Reviewable container digest updates +The repository SHALL keep the command-line Docker dependency under automated update management so a changed upstream digest is proposed as a reviewable pull request rather than adopted silently. + +#### Scenario: Upstream runtime image changes +- **WHEN** the configured .NET runtime tag points to a newer manifest digest +- **THEN** the dependency update service proposes the digest change for review and the existing multi-platform validation runs before merge + +### Requirement: Committed NuGet dependency graphs +The repository SHALL generate and commit NuGet lock files for every project restored through the main solution so the resolved transitive graph and package content hashes are reviewable. + +#### Scenario: Clean solution restore +- **WHEN** the main solution is restored from a clean checkout +- **THEN** every restored project has a committed lock file that describes the resolved dependency graph + +#### Scenario: Dependency manifest changes +- **WHEN** a direct or transitive dependency graph change is intended +- **THEN** the corresponding project manifest and lock-file changes are reviewed together + +### Requirement: Locked restore enforcement +Local package validation and every CI build or publish restore SHALL run NuGet in locked mode, and subsequent build, test, and pack commands MUST NOT perform an implicit unlocked restore. + +#### Scenario: Lock files match project manifests +- **WHEN** the package-validation script or CI executes a restore with unchanged manifests and lock files +- **THEN** locked restore succeeds and the remaining build, test, and pack steps use that restored graph + +#### Scenario: Dependency graph drifts +- **WHEN** a project manifest or transitive resolution no longer matches its committed lock file +- **THEN** locked restore fails before build, packaging, or publication begins + +### Requirement: Lock maintenance remains automated +The existing dependency update service SHALL remain able to update NuGet project references and their affected lock files without disabling locked-mode enforcement. + +#### Scenario: Automated NuGet update +- **WHEN** the dependency update service proposes a supported NuGet package update +- **THEN** the pull request includes the required lock-file refresh and passes the same locked restore used by normal CI + diff --git a/openspec/specs/parser-robustness-assurance/spec.md b/openspec/specs/parser-robustness-assurance/spec.md new file mode 100644 index 0000000..95e6f87 --- /dev/null +++ b/openspec/specs/parser-robustness-assurance/spec.md @@ -0,0 +1,40 @@ +# parser-robustness-assurance Specification + +## Purpose +TBD - created by archiving change harden-scorecard-assurance-controls. Update Purpose after archive. +## Requirements +### Requirement: Coverage-guided parser harnesses +The repository SHALL provide SharpFuzz-compatible, coverage-guided harnesses for the highest-risk untrusted-input parsing boundaries without requiring production network services or user files. + +#### Scenario: Hermetic parser targets +- **WHEN** arbitrary input is supplied to a Sui GraphQL/Move-object JSON, `ResIndex`, Razorvine pickle, or World API response target +- **THEN** the target exercises the production parsing boundary without live network or arbitrary host-path access. + +### Requirement: Expected invalid input is distinguished from defects +Each harness SHALL classify documented invalid-input outcomes as rejected inputs while allowing unexpected exceptions, process crashes, hangs, or resource-limit violations to be reported as fuzzing findings. + +#### Scenario: Parser rejects malformed input normally +- **WHEN** arbitrary input produces an expected parse or validation failure +- **THEN** the harness completes the iteration without recording a false crash. + +### Requirement: Fuzzing is hermetic and bounded +Fuzz harnesses and workflows MUST NOT access live EVE Frontier services, arbitrary host paths, credentials, publishing permissions, or mutable user data, and every fuzz run SHALL have explicit execution bounds. + +#### Scenario: Fuzz job executes in CI +- **WHEN** a pull-request smoke run or scheduled fuzz run starts +- **THEN** it runs with minimum permissions, no repository secrets, no publishing dependency, and explicit time limits. + +### Requirement: Seed corpora and failures are reproducible +The repository SHALL keep minimized, non-sensitive seed corpora for every fuzz target and SHALL provide deterministic corpus replay in normal CI. + +#### Scenario: Deterministic replay in CI +- **WHEN** pull-request validation runs against committed corpora for Sui, ResIndex, Pickle, and World targets +- **THEN** each seed replays deterministically and any unexpected failure blocks the validation job. + +### Requirement: Fuzz tooling compatibility is proven and pinned +The SharpFuzz toolchain and package dependencies SHALL be pinned to reviewed versions, and compatibility with the repository's .NET target and Linux runner MUST be demonstrated before the full fuzz workflow is treated as operational. + +#### Scenario: Minimal compatibility target runs +- **WHEN** SharpFuzz 2.3.0 instruments a pure-IL target assembly and a framework-dependent .NET 10 harness executes it under AFL++ +- **THEN** the run records nonzero coverage and exits within its configured bounds with `DOTNET_ReadyToRun=0`, `DOTNET_TieredCompilation=0`, and `DOTNET_ROLL_FORWARD=Major`. + diff --git a/openspec/specs/repository-security-governance/spec.md b/openspec/specs/repository-security-governance/spec.md new file mode 100644 index 0000000..22e5299 --- /dev/null +++ b/openspec/specs/repository-security-governance/spec.md @@ -0,0 +1,71 @@ +# repository-security-governance Specification + +## Purpose +TBD - created by archiving change harden-scorecard-assurance-controls. Update Purpose after archive. +## Requirements +### Requirement: Solo-maintainer branch controls remain enforceable +The default-branch ruleset SHALL enforce the strongest controls that do not require a nonexistent independent reviewer, including pull-request changes, required current CI and dependency-review checks, code scanning, signed commits, linear history, resolved review threads, stale-review dismissal, deletion and force-push prevention, and no bypass actors. + +#### Scenario: Pull request has stale or failing required checks +- **WHEN** the pull request branch is behind the required base state or a required build, dependency-review, or code-scanning check fails +- **THEN** GitHub prevents the pull request from merging + +#### Scenario: Default branch is changed outside the pull-request path +- **WHEN** an actor attempts a direct, unsigned, non-fast-forward, deletion, or bypassed update prohibited by the ruleset +- **THEN** GitHub rejects the update + +### Requirement: Unavailable independent review is not misrepresented +While the repository has only one trusted maintainer, it MUST NOT claim assurance through unusable CODEOWNERS mappings, fabricated identities, self-approval, or artificial review history. The accepted independent-review risk SHALL identify onboarding a trusted second reviewer as its exit criterion. + +#### Scenario: Ruleset is reviewed under solo maintainership +- **WHEN** no independent trusted reviewer is available +- **THEN** required approval, last-push approval, and code-owner approval settings remain disabled or are explicitly recorded as unavailable rather than deadlocking maintainer pull requests + +#### Scenario: A trusted second reviewer becomes available +- **WHEN** the maintainer approves onboarding an independent reviewer in a future governance change +- **THEN** the residual record directs that change to add valid ownership mappings and real approval requirements before claiming the finding resolved + +### Requirement: Vulnerability reporting is direct and coordinated +The root security policy SHALL provide a working direct link to GitHub private vulnerability reporting and SHALL state maintainer-approved numeric targets for acknowledgement, status updates, and coordinated disclosure. + +#### Scenario: Reporter follows the security policy +- **WHEN** a reporter opens the private-reporting link from `SECURITY.md` +- **THEN** the reporter reaches the repository's private vulnerability-reporting flow without being directed to a public issue + +#### Scenario: Maintainer coordinates a report +- **WHEN** a private vulnerability report is submitted +- **THEN** the policy provides concrete acknowledgement and update targets and a disclosure expectation that permits coordinated remediation + +### Requirement: Best Practices evidence is truthful +Any OpenSSF Best Practices link or badge published by the repository SHALL resolve to the registered FrontierSharp project and display its actual current status. + +#### Scenario: Project is not yet registered +- **WHEN** no public Best Practices project record exists for the repository +- **THEN** the repository does not publish a fabricated or preselected status badge + +#### Scenario: Registration is completed +- **WHEN** the repository's Best Practices project is publicly available +- **THEN** any added link or badge resolves to that project and reflects the status returned by the service + +### Requirement: Scorecard remediation evidence is auditable +The change SHALL record the Scorecard version and run date, map every original alert number to validation evidence, and classify any remaining alert as external, temporal, accepted solo-maintainer risk, or reproduced scanner limitation with an owner and exit criterion. + +#### Scenario: Post-change Scorecard run completes +- **WHEN** all implementable controls have been installed and their focused validation passes +- **THEN** a fresh Scorecard run records the outcome for alerts #2 through #12 and links each closed alert to its control evidence + +#### Scenario: History-derived code-review alert remains +- **WHEN** Scorecard continues to report unreviewed recent changesets under the solo-maintainer model +- **THEN** the alert remains documented as an accepted temporal governance risk whose exit requires a real second reviewer and future independently approved changesets + +#### Scenario: Docker alias alert remains after structural remediation +- **WHEN** the Dockerfile contains no mutable external image or ambiguous local-stage `FROM` instruction but Scorecard still reports one +- **THEN** maintainers preserve the scan and Docker build evidence before considering a scanner-false-positive dismissal + +### Requirement: Security controls are not weakened for score optimization +No remediation SHALL disable an existing security check, loosen workflow permissions, expose credentials, or add nonfunctional evidence solely to improve the Scorecard result. + +#### Scenario: Proposed metric fix reduces actual assurance +- **WHEN** a proposed change would improve a Scorecard score by bypassing validation, fabricating evidence, or weakening an existing control +- **THEN** the proposal is rejected and the residual finding is documented instead + diff --git a/scripts/validate-nupkg-versions.sh b/scripts/validate-nupkg-versions.sh index 23f9f88..a81a52f 100755 --- a/scripts/validate-nupkg-versions.sh +++ b/scripts/validate-nupkg-versions.sh @@ -18,7 +18,7 @@ cd "$SOURCE" || { echo "Source directory not found: $SOURCE"; exit 1; } echo "=== dotnet clean ===" dotnet clean echo "=== dotnet restore ===" -dotnet restore +dotnet restore --locked-mode echo "=== dotnet build ===" dotnet build --no-restore --configuration Release -p:Version=${VERSION} -p:AssemblyVersion=${ASSEMBLYVERSION} -p:FileVersion=${ASSEMBLYVERSION} echo "=== dotnet pack ===" @@ -27,9 +27,9 @@ dotnet pack "./FrontierSharp.sln" --output "$OUTPUT" --no-build --configuration cd "$ROOT" || { echo "Root directory not found: $ROOT"; exit 1; } echo "=== Unzipping nupkgs ===" -for file in "$OUTPUT/*.nupkg"; do +for file in "$OUTPUT"/*.nupkg; do echo " == $(basename "$file") ==" - unzip -j "$file" '*.dll' -d "$WORKDIR" + unzip -jo "$file" '*.dll' -d "$WORKDIR" done echo "=== Assembly Info ===" diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 55874d8..e75e898 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,5 +1,9 @@ + + true + + true snupkg diff --git a/src/FrontierSharp.CommandLine/Dockerfile b/src/FrontierSharp.CommandLine/Dockerfile index f7bf6fc..ae93cf6 100644 --- a/src/FrontierSharp.CommandLine/Dockerfile +++ b/src/FrontierSharp.CommandLine/Dockerfile @@ -1,16 +1,16 @@ -# syntax=docker/dockerfile:1.4 -ARG BASE_IMAGE=mcr.microsoft.com/dotnet/runtime-deps:10.0 +# syntax=docker/dockerfile:1.4 +ARG BASE_IMAGE=mcr.microsoft.com/dotnet/runtime-deps:10.0@sha256:894098eafc82e5fa02ba9f2b71d426dc78252876b9e914caae77ed95cfce185a -FROM ${BASE_IMAGE} AS base -WORKDIR /app - -FROM base AS all -COPY ./bin/Release/net10.0/linux-arm64 ./linux-arm64 -COPY ./bin/Release/net10.0/linux-x64 ./linux-amd64 - -FROM base AS final +FROM ${BASE_IMAGE} ARG TARGETARCH +WORKDIR /app -COPY --from=all /app/linux-${TARGETARCH}/publish/ . +COPY ./bin/Release/net10.0/ /tmp/publish/ +RUN case "$TARGETARCH" in \ + amd64) cp -a /tmp/publish/linux-x64/publish/. . ;; \ + arm64) cp -a /tmp/publish/linux-arm64/publish/. . ;; \ + *) echo "Unsupported TARGETARCH: $TARGETARCH" >&2; exit 1 ;; \ + esac \ + && rm -rf /tmp/publish -ENTRYPOINT ["/app/frontierctl"] \ No newline at end of file +ENTRYPOINT ["/app/frontierctl"] diff --git a/src/FrontierSharp.CommandLine/packages.lock.json b/src/FrontierSharp.CommandLine/packages.lock.json new file mode 100644 index 0000000..b3c54c3 --- /dev/null +++ b/src/FrontierSharp.CommandLine/packages.lock.json @@ -0,0 +1,1045 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Humanizer": { + "type": "Direct", + "requested": "[3.0.10, )", + "resolved": "3.0.10", + "contentHash": "13+6RiWdpVCzSn2SSEd1hAIr/UHScNdLCUhRgjvI60UcD5u3vXu3u1/Z+74OcHWum1itjiBTjYXgJKQna1jTgw==", + "dependencies": { + "Humanizer.Core.af": "3.0.10", + "Humanizer.Core.ar": "3.0.10", + "Humanizer.Core.az": "3.0.10", + "Humanizer.Core.bg": "3.0.10", + "Humanizer.Core.bn": "3.0.10", + "Humanizer.Core.ca": "3.0.10", + "Humanizer.Core.cs": "3.0.10", + "Humanizer.Core.da": "3.0.10", + "Humanizer.Core.de": "3.0.10", + "Humanizer.Core.el": "3.0.10", + "Humanizer.Core.es": "3.0.10", + "Humanizer.Core.fa": "3.0.10", + "Humanizer.Core.fi": "3.0.10", + "Humanizer.Core.fil": "3.0.10", + "Humanizer.Core.fr": "3.0.10", + "Humanizer.Core.he": "3.0.10", + "Humanizer.Core.hr": "3.0.10", + "Humanizer.Core.hu": "3.0.10", + "Humanizer.Core.hy": "3.0.10", + "Humanizer.Core.id": "3.0.10", + "Humanizer.Core.is": "3.0.10", + "Humanizer.Core.it": "3.0.10", + "Humanizer.Core.ja": "3.0.10", + "Humanizer.Core.ko": "3.0.10", + "Humanizer.Core.ku": "3.0.10", + "Humanizer.Core.lb": "3.0.10", + "Humanizer.Core.lt": "3.0.10", + "Humanizer.Core.lv": "3.0.10", + "Humanizer.Core.ms": "3.0.10", + "Humanizer.Core.mt": "3.0.10", + "Humanizer.Core.nb": "3.0.10", + "Humanizer.Core.nl": "3.0.10", + "Humanizer.Core.pl": "3.0.10", + "Humanizer.Core.pt": "3.0.10", + "Humanizer.Core.pt-BR": "3.0.10", + "Humanizer.Core.ro": "3.0.10", + "Humanizer.Core.ru": "3.0.10", + "Humanizer.Core.sk": "3.0.10", + "Humanizer.Core.sl": "3.0.10", + "Humanizer.Core.sr": "3.0.10", + "Humanizer.Core.sr-Latn": "3.0.10", + "Humanizer.Core.sv": "3.0.10", + "Humanizer.Core.th": "3.0.10", + "Humanizer.Core.tr": "3.0.10", + "Humanizer.Core.uk": "3.0.10", + "Humanizer.Core.uz-Cyrl-UZ": "3.0.10", + "Humanizer.Core.uz-Latn-UZ": "3.0.10", + "Humanizer.Core.vi": "3.0.10", + "Humanizer.Core.zh-CN": "3.0.10", + "Humanizer.Core.zh-Hans": "3.0.10", + "Humanizer.Core.zh-Hant": "3.0.10" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Hosting": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "tL9FkfV64GPUDSPvwrgyw42LVzsnVAnyrqJEuZVJbODgrQ3eL63zmzEcVWoCHzfgqUhWggzbgAyUCnz/zfI3Pg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.Configuration.CommandLine": "10.0.10", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.10", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.10", + "Microsoft.Extensions.Configuration.Json": "10.0.10", + "Microsoft.Extensions.Configuration.UserSecrets": "10.0.10", + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Physical": "10.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Configuration": "10.0.10", + "Microsoft.Extensions.Logging.Console": "10.0.10", + "Microsoft.Extensions.Logging.Debug": "10.0.10", + "Microsoft.Extensions.Logging.EventLog": "10.0.10", + "Microsoft.Extensions.Logging.EventSource": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Scetrov.DumpifyFork": { + "type": "Direct", + "requested": "[0.6.7, )", + "resolved": "0.6.7", + "contentHash": "UXvdJfj42GFu6Xtik4VIjiv2pTvNfCIod5I9F1ZiRZ3IJk6mHrnfjP0ws/B4fTHdSSAx2Ekwn/Ph31zlvtP0Rw==", + "dependencies": { + "Spectre.Console": "0.49.1" + } + }, + "Serilog": { + "type": "Direct", + "requested": "[4.4.0, )", + "resolved": "4.4.0", + "contentHash": "ZC6Le3rr4TVJJjS4KsQAesxeF1EhW9qcZmmG7eP5Y2G3+gTGkJEUXkq4+tZNPtyp05I0wWOxnIjwtxFweJsObw==" + }, + "Serilog.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "vx0kABKl2dWbBhhqAfTOk53/i8aV/5VaT3a6il9gn72Wqs2pM7EK2OB6No6xdqK2IaY6Zf9gdjLuK9BVa2rT+Q==", + "dependencies": { + "Microsoft.Extensions.Logging": "10.0.0", + "Serilog": "4.2.0" + } + }, + "Serilog.Settings.Configuration": { + "type": "Direct", + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "ayFE7h66mqMqzwfPrzDCMbWU27FdNC2bkCG+jnkeHFZTBRh+yWdr4aa/2WuX7c8RmqxGPMW2UqoJ3fw9hK3QhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Binder": "10.0.0", + "Microsoft.Extensions.DependencyModel": "10.0.0", + "Serilog": "4.3.0" + } + }, + "Serilog.Sinks.Console": { + "type": "Direct", + "requested": "[6.1.1, )", + "resolved": "6.1.1", + "contentHash": "8jbqgjUyZlfCuSTaJk6lOca465OndqOz3KZP6Cryt/IqZYybyBu7GP0fE/AXBzrrQB3EBmQntBFAvMVz1COvAA==", + "dependencies": { + "Serilog": "4.0.0" + } + }, + "Spectre.Console": { + "type": "Direct", + "requested": "[0.57.2, )", + "resolved": "0.57.2", + "contentHash": "wzsB+P9i6F9G+cFOJxRotCiQWNSzZVAMxi8YMiHlGXXU1JLMXGp7zSSqBMmROZS2bzpK5jk+Saa7Evp8HwqhKg==", + "dependencies": { + "Spectre.Console.Ansi": "0.57.2" + } + }, + "Spectre.Console.Cli": { + "type": "Direct", + "requested": "[0.55.0, )", + "resolved": "0.55.0", + "contentHash": "cFJTB1te4eaAICd4Zp+8T/kiRn1ikQxgGqmoNarb1qoQ/7LzHAvVQ62x5U9GW3E0QI7sZLcXIIoq4CpqgTx42Q==", + "dependencies": { + "Spectre.Console": "0.55.0" + } + }, + "System.IO.Abstractions": { + "type": "Direct", + "requested": "[22.2.0, )", + "resolved": "22.2.0", + "contentHash": "fwnNXyIPb7ABPLae6K9YZz0FAkRjb2s/nElRWrg73usMveY/qdOHjKaNvAF7iAfmzTl1W4wa7S/SnmIc4LDvTg==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "22.2.0", + "TestableIO.System.IO.Abstractions.Wrappers": "22.2.0" + } + }, + "TestableIO.System.IO.Abstractions.Analyzers": { + "type": "Direct", + "requested": "[2022.0.0, )", + "resolved": "2022.0.0", + "contentHash": "rVk7HyTWXC1IOHTLMOzZyX6Wu1qbwVoA17XGF837uUElDnfg4emPxewPpGSgtuJzuJeoH4SGeQtDoB8v9J1d9Q==" + }, + "YamlDotNet": { + "type": "Direct", + "requested": "[18.1.0, )", + "resolved": "18.1.0", + "contentHash": "5K+9KFg2TdTl7VXv88Qzi/0lqK6JFoNP3lRuImPYGRV7K/QYklDyTrj4+A+KAki1JsQi6qKY+hDyY7d6WRqjrw==" + }, + "ZiggyCreatures.FusionCache": { + "type": "Direct", + "requested": "[2.6.0, )", + "resolved": "2.6.0", + "contentHash": "BCe+/SkwQZfaMpq2ZGDZB2pyx6BdGnP+zxqjMM/5K+4PBuH6hljZeIqH4KVzQ26khSbPsQ7IiYZl0Fve4OZOog==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "10.0.1" + } + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "yZIhtw8sYuvsONzQbZxWpR60tMWYHXoo0DL6nyOqSFiU5POjBTSEyWFpTQtJEZuy+oqiYTXKXY/Mjx7KnqIQFw==" + }, + "Humanizer.Core.af": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "jIpC73aOXfhqGEnpFKgO2AJ2Esb2t40c/cKqR+RgK1yg1bcBZBuhtjs+PrAIHf5Lp7Znd4teLjCGDS5ut8O1cw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ar": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "LdDeLE9nmlqbl14RinjII0v8APKZKUqJEClILvdLAoUEdv8UhgsHhDX2BHJKZv2aNfCnb19z9otE8Ffaa11Sow==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.az": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "+tfsgP5PkTY5mpx7t0rpMVVNXJQMcRkFSsWtnPpntuC/z7I8GS68CBcsHItw5/qbTJxWRY/cLPe/Psxh/SjEkA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.bg": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "xBQMDuLOjmj1U0h39tv7B39vmVZXBbRUcy3xkHBKHAyuRoxskDJ3F1LUOOw1/E41+dGQziAe2I0EVukwvQ/h0g==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.bn": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "U5Li886U/hPdhMxyN9P3eF5dlB15sT/w4F3NOioXsaTQxnJKdxUKglRHiGbakX+aSrsFGok1MoQwVcH7Sac1Lg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ca": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "D29T+OWcYG4rlOXKwAGpNNrwLgE44oE1JYqlNuNs3lVYmTDEgItyT+SfjG2TXuTQXkpQLzsxfRjqtA/APygjgw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.cs": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "kaG0//ULYkyB8Rk4g5PgC2o8jrmG2joc8lgtyDzCiFCaobr0jgUn393JAIB0JUygbngEIfA0PMK3fLbMXcBNLQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.da": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "/MCePoHsSaRo03I1NSRut5iUzhYRIKL+UncbtpN8AZ3Vl0TOu0Psi9/6QyjD4gLLx45puiXB2S0lUjCdYmlP7w==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.de": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "UoJk/DmAOFZivuMulLoB52Pn5iFvSqurF7qQQAyUAz1/IUZjxkoeoiI5mMILEjVeGoQJqrylt6O+f8johCo0Bg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.el": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "5oIHs25LMm1IBrhcxOYYLTFHZQfBaqgKxm0jAkYmsxedpDZkv1k+BHs2D5Kg1672/ZhTs4jsLbqYNXkHm671vw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.es": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "epxhWWQJ/I610mJGTfQPTocjp7/xCIH6tiREVIlHb/sA1kDAD1zHQcHI+HgWFzn/LzzbVg99y8HVFFHUvjnfXA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fa": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "9BEFCpbWoUdq2JnLbkohqBfpjjdeMqFhkhCNk3qYmutZwSxuZHrCozppY14SSWI6b6qD1Veb3rVyHGz9Fex5AA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fi": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "9Nbbxs1WZH2Li6Q28tZC06Y0mXwmIGnCEO/2nRzHvTqf07153frndezl5ads4uX8mNs+hMnUGUsr03IsFhI3jQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fil": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "zpUvc+riMHZ2QGYETwnaDiT4Y4fHv2/Ctpi8Nm5SujNmOuxQyQMEAcalbUqWaLjzfTcysKqlU/NkiNP86kGlCA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "k+STDkiJVeO/nA5s0/GeBdwZI17D9KgqyYA4XGxfGxtFACwbFyVKQLWLzlIR2BsrT53EkyKLAzuFJ9FCT2CyfQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.he": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "4WIzAg5hocnbnzaTnueYW/BRhCrQoPg/0U6WiUC4BJKGJDuVYbqIa8iVcHqhr7vVKd5ngFbhSsXuCgkYqOMaXQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.hr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "USin9T/FsHjmxvaolEXgL6FOdw+1Juh7geqcjTvJRCdoo/U4Y/usoAiZRbFtDA//1od4yqSxEbmj+F16nKwbkQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.hu": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "Umon7VBTVDs8QFDqNzGm6MBD+43UZJoN44htW/+iJUDF2gl8K8meRup27Dkl2zvewW3ynZic/xwP2hTDaPjIjw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.hy": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "PzdcqQMwyDYO81PYbzBf+gFMj+wzOYF3kz3mlJCcBX5mSmNRpLIwB2s6PC9OiNN/Y/ya1orHV/z0OY9j7NFc5Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.id": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "rMb9jvglGeeUxb6Z4EkXTg+et1Ri3DWZjlXs2WFle1Qpu39zWWF0l9rh9PQJb0fzeiZ8jOjiUhUI9lRnoAHHCQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.is": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "xnNgWY9azqXyclRYmy3D6kgnbdCcPFBAEN4yNdhu2IN10p7Y2T9YUw5R9jLWo5+NGM2uzbbyTxPGf4+9YYUc1w==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.it": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "iCrKxOX6q/PZgEk3vYyU1fHC0jnq0hiq7nwWXiuV7uF5VypOxwVeao3vkE6MLoNKW7RQN/TbP06n1TOqyhTA7A==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ja": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "UicfcXwMibwWN3jLesdk702IRQVndgBUqueFr3iXVEn2POue06pHInSIruxNaPTscaNdGKxXZiIiJrN7pCVO9Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ko": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "Zr/GwEilhAcmeiDxVKqr79ZK/SEpHfhKzXD15JZ1NpsfYnIfNAN/9i0o535UaadaDDT6EIVpkoGIYAGuYQ0Z4g==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ku": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "j5Qm+CY+c8onfjO1O+TReCDg/epCYdfv5N5LNB+Ydcmn06gkR4HvbWJnk5UFLVHz8NMPmtCrv7CYwmPJ0+lJqw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.lb": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "5lpkw49T6MQ7Gwa0k2JV4cw6aH5FdT1Ku1nfGeey/iScajHDV9mvdxjkxRZpFAhJ5W/5yCtMlHH992LpXFJkeA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.lt": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "1OO4XZ/74tt5nkxYHnpj+ti1w0HdeMGi+AHR59asxcJ3A/iTDZR4RNRIvoj1MdYRe0HdTUjtnGXfA7tXXOkiYg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.lv": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "S4RN1q/saAQxlFlRRUnmi3Oz+mIXRqWtIRZJA3VrvMmBy12cXIdpeY0+d+HCA58WXpI2diOrWxHq9KPUDPunIw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ms": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "m0+BJa9vG0GeuAWhmdmMxdUUa1cfGjyHZQeJoeivqxJrrtdUUFekXH0xbpvI3ErC8qu5Ufpmfnr6QAX0WQfkIw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.mt": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "8GfXTko/iweepZHcUcOANreClfvTeCDfSuiMxLtFbUZQOBegLZ6VnTVun2gVtv5OANdOk64qhqUKIVLq2rG0rw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.nb": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "UcdV9TWXG2MFVEkqHy8oD2ZbuFhFPLY7ScCJKWBu7OsgInyuHZe72hHP/i52T0FAgiVbrB+Urd3uoWiUT7hP9Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.nl": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "b+Y1CFId1ucl33OvNITID0eEVesOKiw/dmrcDJ4Z/P9KEuMTeE8aKu5/iSjwtPVV+SagaMx9XzZe7kVYyRqhuQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.pl": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "LJCt3+dGUQhopQ/1w/zzBNlUHtjkdrt57zS+llMQeFm+1u0e3R+lWJx4zP+hqZcpRA7armR38KghvRSz+bYBbg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.pt": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "+cggEy6W08xD8GU45/EaMfvNQMCd7K1G7hprSPty/9zIoM3OzaajdMA/Oxrb0mHIKpARxCNbQ29ltOtip3MTNA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.pt-BR": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "kbhwn4G+STHUT9cLDdrP60+ZFla4lTg6def+FTnhpMS4JHf8ll0TL1kz9Nj5DTJFdqnvs8/eYfmVhnEegyBjBw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ro": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "JwdY+SywNIDrFcWKyiZsgsSJkIleoAXAtCLYiLn+CNCk+135VwhchZHm5B9nNvpLjGVaP5Y0ouZQ8xTx1oeZag==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ru": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "1vXr7pkV0zSZF6ENJUadsAagubrBAvTPHPgdgttHlMhUQ1Zz9ZWTJaQdmf2RCen4YywMmfsQQZiGqJl52LVT8Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sk": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "LD93nJw1zwXuC+LSw3+02Jk02bdAoENHzb/qrMoGBf70XeV2rBeoxSyJBVLHQ00RZfwNSy6TCTXQyagESVmN+Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sl": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "utURJ8K/tnbA5KXlKcT8T+35MEVdZrXUvu2tH+T6M9xxJ1MhLGuFWnc687pcsLdpaLnGB7ZVwrAITlueAE+KGA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "e2bVzUAjEpxjFdLVmXZL9EsdVojlV/8GMwZzwDS6OByfG+PP5JxemKylK6FoUK5X2IBPNg68LOvn72WgwaruIQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sr-Latn": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "VXPlm+eg5sraDhZ50WGiMZMvj4I2d+0VAy8cNaLLXNt+EgkUz646dRfg5HrQPPjtBbegj6o7gcg8Xl6z0ke+hA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sv": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "COq4bbUKk7F1jfE2sC/ZmomoQqX0Herwe1iXZyDl5zyw21mUY9wL96S1qbRmRp15UmGzFJdqBPdnd58P7kVMyg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.th": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "8A4lZCLE6bEPYdQKeGfPBHDgAsY30TWWdjoWA1+vAfLA9Ip1l2Ons+Ngw4npkcoI3qdCidU6hWOsFnPfJ8ZufQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.tr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "aRAxq1VyuIVoFdx8TZyVsRoDk0yqe9NATjhGgWHPsdR8TVHnuiyXeEbiXf846870VteyLJL9tVy3jaj2rC45tw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.uk": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "NPnGZ1jdoMDYGrsHt5aLlj7Ambp7i5ER/5BbtjBSegn3+PliMbd4Eftr1Ind4qvCU6rTP2a9lUqBoRd+hSVA+g==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.uz-Cyrl-UZ": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "8NSyuiTlCfse1ki9QeO35IpZLcxoMlSMGvEY892aw9CNGaDMROQjFzf1iKJkWTyB9atrHHPuWlasBAFk2QkT9w==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.uz-Latn-UZ": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "FaSETkwfUiDU/RHlD54xbBKEZXnFIUnTNTnA5ZYXgDOiMmX6cY7vyRDmI1YpQtO+QR1irSettpLFpHeysslnpA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.vi": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "Uz5gph//0eNP0Ta1tqdKDyghiUnZdW0aVW4MK/poD5hLEH1qLoDTWuTb8gxj3F8GvSFjgVmF9HZGQx5cO06N8Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.zh-CN": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "7veG4JdZ4OeYNlgci/6I/Xf9G/iCljBcwsbLVyGaqdia+2UMAp1iGu+MCs3zKOmEvcb4ipHGFkwT5d/2WfEevA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.zh-Hans": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "z8E2R0QL43NB6m8ntQaL1cONMjudoIJXvMQUFXG4OaKp5iyYqWs6FMC2B7x2rLxOynpsxoq5AQ/8BO0pMdfZrw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.zh-Hant": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "KI5Nv82v9diPBxcBAwIAvZQHjSrDy7He0atnzdZghS+QchHwlkPKhTyEzVSbOZdD42RxCX1ArMiL864A2iw34Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "33cBeR2HRbzHUTtmcmLdNOApneNGcymwwL4arHuotgVK9Frba8kcDTrvVTj7cSCmF1R9OiSbZH0KxNOwab3HUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "KRfFSSCV58vEdU7mPED/YMzeovIWF5P0g8s9K8n9HEfy0/WzMq37SrPdXdFN5/dFT/rPMHpF7AvpoXHckbcBFg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "ZOhZYwvbXGTgGVRwswIirofEMVHuWdxjdh0JeUZXwaF9cgcjXdz/t0ELtgaevw7ezTyv47yPNCgGreWtLkn3IQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Physical": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "uvJ6sHwjgrkMEJOgiC76G0mcZGXerwyyWkwX34EOjCbxKG6TCtfAoqDKAMsCvEBf9HxjlGQEgqsSMOGCmGBf+A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "1s1sKFTk/Foam64JY6+m/diH8drL3Wx6V3gtSd5v1IEZtszZYyc1pW8uRnMblzpNiR0l0t8gGk7tXj3xHzFgdg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Json": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Physical": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "RFYJR7APio/BiqdQunRq6DB+nDB6nc2qhHr77mlvZ0q0BT8PubMXN7XicmfzCbrDE/dzhBnUKBRXLTcqUiZDGg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "jhJAyo38kSrH3ARvWUk0h8itogVnQu2DCZuPo+s0Z+tXes0ugTxMPaHYzap85785eHQmPFqD9TYERqBbtGxn/w==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileSystemGlobbing": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "jSOCVxEwCd4Aq925kJVz1kSO1EpX2OHYKL04qVREXkDU7Ce3pVDdHPYm+fEy8y/th2kJf/DAstRHpJAqoNWP8w==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "VIlNzPwPS0GeQVSmCqqo36ugryX3LpE9ul6gEkks5VLET3weH/XMLeWmclwfoGn4Nxi2mwVibB+OZBVJ9tDqvg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Configuration": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "8+TZBnV5fgBXoVNJ5ROSErUwYogk4hOgV7c2HWK1u5cqKGmiUTUn7+KqZ35iQu8e/B7Ykccyz5OTjdXcidNZ9g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "0RE4951AzQ+YD4gVrvbq0BhdsiBgSDo44yM7+QBZ2mrmMJeNjY+teCIYfUjqDPVYnKs0HR6SkkhgrX1YgXZq3Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Diagnostics.EventLog": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "85SAPwXhJtdBInzN2k7SChiFiBGh3KOWay5AfoY+GREF6P7oZA98+ST2p7Z9384iLKYjkZSKIZ/FqIO5aojtNw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + }, + "Razorvine.Pickle": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "cjqa3uLmZUYzwtC0WAE/G/bKBR6a5nVaNV9xUPRDwJnHqK4JNbkOsFj7jQW9SCdA4WxRTNnY1n5Bnn4f1rhyuQ==" + }, + "Spectre.Console.Ansi": { + "type": "Transitive", + "resolved": "0.57.2", + "contentHash": "Y1+u73shwP+JYHmrkdN6bSt2kaGBEAafhi2nrecczbXdFRey+k7J/WF9YPfcB0rqivv2S8fmif6FSBq9m/AFvw==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "BQPyr0A1s2HvpVTZIyolrZ3ZdPn8DU2tqciaK1oco3pjm76fiKIk75eup4R9reZjNS75M+WJIICOlNX5OFt50g==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "0GW9i46ozm687WGAWsBHWMhLR7l1HmKwhiSU2hQrbFnI5m2YRfqXwqTQNjnOwT8BdbvcGqwMr97/zlnPWa1u1Q==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "Testably.Abstractions.FileSystem.Interface": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "5ebMaoADkzjfW7GnZYKaUebV8XmUn++C/4sKk1PTzCiddEgbSKBq3pW4EWEi70rYJAK0gA1yDWrYFeHq18FvHQ==" + }, + "frontiersharp.common": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )" + } + }, + "frontiersharp.data": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Options": "[10.0.10, )", + "Razorvine.Pickle": "[1.5.0, )", + "System.IO.Abstractions": "[22.2.0, )" + } + }, + "frontiersharp.httpclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + }, + "frontiersharp.suiclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + }, + "frontiersharp.worldapi": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "FrontierSharp.HttpClient": "[1.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + } + }, + "net10.0/linux-arm64": { + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + } + }, + "net10.0/linux-x64": { + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + } + }, + "net10.0/osx-arm64": { + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + } + }, + "net10.0/osx-x64": { + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + } + }, + "net10.0/win-arm64": { + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + } + }, + "net10.0/win-x64": { + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.Common/packages.lock.json b/src/FrontierSharp.Common/packages.lock.json new file mode 100644 index 0000000..19f929d --- /dev/null +++ b/src/FrontierSharp.Common/packages.lock.json @@ -0,0 +1,65 @@ +{ + "version": 1, + "dependencies": { + ".NETStandard,Version=v2.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "XRzK7ZF+O6FzdfWrlFTi1Rgj2080ZDsd46vzOjadHUB0Cz5kOvDG8vI7caa5YFrsHQpcfn0DxtjS4E46N4FZsA==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + } + }, + "net10.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "XRzK7ZF+O6FzdfWrlFTi1Rgj2080ZDsd46vzOjadHUB0Cz5kOvDG8vI7caa5YFrsHQpcfn0DxtjS4E46N4FZsA==" + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.Data/packages.lock.json b/src/FrontierSharp.Data/packages.lock.json new file mode 100644 index 0000000..0111aa8 --- /dev/null +++ b/src/FrontierSharp.Data/packages.lock.json @@ -0,0 +1,232 @@ +{ + "version": 1, + "dependencies": { + ".NETStandard,Version=v2.0": { + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10", + "System.ComponentModel.Annotations": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Razorvine.Pickle": { + "type": "Direct", + "requested": "[1.5.0, )", + "resolved": "1.5.0", + "contentHash": "cjqa3uLmZUYzwtC0WAE/G/bKBR6a5nVaNV9xUPRDwJnHqK4JNbkOsFj7jQW9SCdA4WxRTNnY1n5Bnn4f1rhyuQ==", + "dependencies": { + "System.Memory": "4.5.5" + } + }, + "System.IO.Abstractions": { + "type": "Direct", + "requested": "[22.2.0, )", + "resolved": "22.2.0", + "contentHash": "fwnNXyIPb7ABPLae6K9YZz0FAkRjb2s/nElRWrg73usMveY/qdOHjKaNvAF7iAfmzTl1W4wa7S/SnmIc4LDvTg==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "22.2.0", + "TestableIO.System.IO.Abstractions.Wrappers": "22.2.0" + } + }, + "TestableIO.System.IO.Abstractions.Analyzers": { + "type": "Direct", + "requested": "[2022.0.0, )", + "resolved": "2022.0.0", + "contentHash": "rVk7HyTWXC1IOHTLMOzZyX6Wu1qbwVoA17XGF837uUElDnfg4emPxewPpGSgtuJzuJeoH4SGeQtDoB8v9J1d9Q==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "TFI6OKYE1XZz4SGuTSH70c6SBdPpFktXsoa1gCxTr3mKrhmXirnvaS0tKz+J3ZWICEAmMpEGn59nO4ICtUpQXA==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "N8GXpmiLMtljq7gwvyS+1QvKT/W2J8sNAvx+HVg4NGmsG/H+2k/y9QI23auLJRterrzCiDH+IWAw4V/GPwsMlw==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Numerics.Vectors": "4.6.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "sQxefTnhagrhoq2ReR0D/6K0zJcr9Hrd6kikeXsA1I8kOCboTavcUC4r7TSfpKFeE163uMuxZcyfO1mGO3EN8Q==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.2", + "contentHash": "2hBr6zdbIBTDE3EhK7NSVNdX58uTK6iHW/P/Axmm9sl1xoGSLqDvMtpecn226TNwHByFokYwJmt/aQQNlO5CRw==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "7sCiwilJLYbTZELaKnc7RecBBXWXA+xMLQWZKWawBxYjp6DBlSE3v9/UcvKBvr1vv2tTOhipiogM8rRmxlhrVA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "BQPyr0A1s2HvpVTZIyolrZ3ZdPn8DU2tqciaK1oco3pjm76fiKIk75eup4R9reZjNS75M+WJIICOlNX5OFt50g==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "0GW9i46ozm687WGAWsBHWMhLR7l1HmKwhiSU2hQrbFnI5m2YRfqXwqTQNjnOwT8BdbvcGqwMr97/zlnPWa1u1Q==", + "dependencies": { + "System.IO.FileSystem.AccessControl": "5.0.0", + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "Testably.Abstractions.FileSystem.Interface": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "5ebMaoADkzjfW7GnZYKaUebV8XmUn++C/4sKk1PTzCiddEgbSKBq3pW4EWEi70rYJAK0gA1yDWrYFeHq18FvHQ==" + } + }, + "net10.0": { + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Razorvine.Pickle": { + "type": "Direct", + "requested": "[1.5.0, )", + "resolved": "1.5.0", + "contentHash": "cjqa3uLmZUYzwtC0WAE/G/bKBR6a5nVaNV9xUPRDwJnHqK4JNbkOsFj7jQW9SCdA4WxRTNnY1n5Bnn4f1rhyuQ==" + }, + "System.IO.Abstractions": { + "type": "Direct", + "requested": "[22.2.0, )", + "resolved": "22.2.0", + "contentHash": "fwnNXyIPb7ABPLae6K9YZz0FAkRjb2s/nElRWrg73usMveY/qdOHjKaNvAF7iAfmzTl1W4wa7S/SnmIc4LDvTg==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "22.2.0", + "TestableIO.System.IO.Abstractions.Wrappers": "22.2.0" + } + }, + "TestableIO.System.IO.Abstractions.Analyzers": { + "type": "Direct", + "requested": "[2022.0.0, )", + "resolved": "2022.0.0", + "contentHash": "rVk7HyTWXC1IOHTLMOzZyX6Wu1qbwVoA17XGF837uUElDnfg4emPxewPpGSgtuJzuJeoH4SGeQtDoB8v9J1d9Q==" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "BQPyr0A1s2HvpVTZIyolrZ3ZdPn8DU2tqciaK1oco3pjm76fiKIk75eup4R9reZjNS75M+WJIICOlNX5OFt50g==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "0GW9i46ozm687WGAWsBHWMhLR7l1HmKwhiSU2hQrbFnI5m2YRfqXwqTQNjnOwT8BdbvcGqwMr97/zlnPWa1u1Q==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "Testably.Abstractions.FileSystem.Interface": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "5ebMaoADkzjfW7GnZYKaUebV8XmUn++C/4sKk1PTzCiddEgbSKBq3pW4EWEi70rYJAK0gA1yDWrYFeHq18FvHQ==" + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/FrontierSharp.Fuzz.csproj b/src/FrontierSharp.Fuzz/FrontierSharp.Fuzz.csproj new file mode 100644 index 0000000..ef37441 --- /dev/null +++ b/src/FrontierSharp.Fuzz/FrontierSharp.Fuzz.csproj @@ -0,0 +1,17 @@ + + + Exe + net10.0 + enable + enable + false + false + true + + + + + + + + diff --git a/src/FrontierSharp.Fuzz/Program.cs b/src/FrontierSharp.Fuzz/Program.cs new file mode 100644 index 0000000..e73710b --- /dev/null +++ b/src/FrontierSharp.Fuzz/Program.cs @@ -0,0 +1,119 @@ +using System.Text; +using System.Text.Json; +using Razorvine.Pickle; +using SharpFuzz; +using System.IO.Abstractions; +using FrontierSharp.Data.Static; +using FrontierSharp.SuiClient.GraphQl; +using FrontierSharp.SuiClient.JsonConverters; +using FrontierSharp.SuiClient.Models; +using FrontierSharp.SuiClient; +using FrontierSharp.HttpClient; +using FrontierSharp.HttpClient.Models; +using FrontierSharp.WorldApi; +using FrontierSharp.WorldApi.Models; +using FrontierSharp.WorldApi.RequestModel; +using Microsoft.Extensions.Caching.Hybrid; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; + +var targets = new Dictionary>(StringComparer.OrdinalIgnoreCase) { + ["sui"] = FuzzTargets.Sui, + ["resindex"] = FuzzTargets.ResIndex, + ["pickle"] = FuzzTargets.Pickle, + ["world"] = FuzzTargets.World +}; + +if (args.Length < 2 || !targets.TryGetValue(args[1], out var target)) { + Console.Error.WriteLine("Usage: FrontierSharp.Fuzz [corpus-directory]"); + return 2; +} + +if (string.Equals(args[0], "fuzz", StringComparison.OrdinalIgnoreCase)) { + Fuzzer.Run(stream => FuzzTargets.Run(target, stream)); + return 0; +} + +if (!string.Equals(args[0], "replay", StringComparison.OrdinalIgnoreCase) || args.Length != 3) return 2; +foreach (var seed in Directory.EnumerateFiles(args[2]).OrderBy(path => path, StringComparer.Ordinal)) { + using var input = File.OpenRead(seed); + FuzzTargets.Run(target, input); + Console.WriteLine(Path.GetFileName(seed)); +} +return 0; + +internal sealed class FuzzHttpClientFactory(string payload) : IHttpClientFactory { + public HttpClient CreateClient(string name) => new(new FuzzHandler(payload)); + private sealed class FuzzHandler(string payload) : HttpMessageHandler { + protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) => + Task.FromResult(new HttpResponseMessage(System.Net.HttpStatusCode.OK) { Content = new StringContent(payload, Encoding.UTF8, "application/json") }); + } +} + +internal sealed class FuzzHybridCache : HybridCache { + public override ValueTask GetOrCreateAsync(string key, TState state, Func> factory, HybridCacheEntryOptions? options = null, IEnumerable? tags = null, CancellationToken cancellationToken = default) => factory(state, cancellationToken); + public override ValueTask SetAsync(string key, T value, HybridCacheEntryOptions? options = null, IEnumerable? tags = null, CancellationToken cancellationToken = default) => ValueTask.CompletedTask; + public override ValueTask RemoveAsync(string key, CancellationToken cancellationToken = default) => ValueTask.CompletedTask; + public override ValueTask RemoveByTagAsync(string tag, CancellationToken cancellationToken = default) => ValueTask.CompletedTask; +} + +internal static class FuzzTargets { + public static void Run(Action target, Stream input) { + try { target(input); } + catch (JsonException) { } + catch (FormatException) { } + catch (ArgumentException) { } + catch (IndexOutOfRangeException) { } + catch (FileNotFoundException) { } + catch (InvalidOperationException) { } + catch (Razorvine.Pickle.InvalidOpcodeException) { } + catch (Razorvine.Pickle.PickleException) { } + catch (NotSupportedException) { } + catch (IOException) { } + } + + public static void Sui(Stream input) { + using var payload = new MemoryStream(); + input.CopyTo(payload); + var bytes = payload.ToArray(); + var body = Encoding.UTF8.GetString(bytes); + var client = new SuiGraphQlClient(new FuzzHttpClientFactory(body), new FuzzHybridCache(), + Microsoft.Extensions.Options.Options.Create(new SuiClientOptions { HttpClientName = "Fuzz", GraphQlEndpoint = "https://fuzz.invalid/graphql" }), + NullLogger.Instance); + _ = client.QueryAsync("query { objects { nodes { address } } }").GetAwaiter().GetResult(); + var options = new JsonSerializerOptions(); + options.Converters.Add(new CharacterMetadataConverter()); + _ = JsonSerializer.Deserialize(bytes, options); + } + + public static void ResIndex(Stream input) { + var root = Path.Combine(Path.GetTempPath(), "frontiersharp-fuzz", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(root); + try { + var path = Path.Combine(root, "index.csv"); + File.WriteAllText(path, new StreamReader(input, Encoding.UTF8, true, 1_048_576, leaveOpen: true).ReadToEnd()); + _ = new ResIndex(path, new FileSystem()).Files.ToArray(); + } finally { Directory.Delete(root, recursive: true); } + } + + public static void Pickle(Stream input) { + using var unpickler = new Unpickler(); + _ = unpickler.load(input); + } + + public static void World(Stream input) { + using var memory = new MemoryStream(); + input.CopyTo(memory); + memory.Position = 0; + var bytes = memory.ToArray(); + var client = new FrontierSharpHttpClient( + NullLogger.Instance, + new FuzzHttpClientFactory(Encoding.UTF8.GetString(bytes)), + new FuzzHybridCache(), + Microsoft.Extensions.Options.Options.Create(new FrontierSharpHttpClientOptions { + HttpClientName = "Fuzz", + BaseUri = "https://fuzz.invalid/" + })); + _ = client.Get>(new GetListOfTypes()).GetAwaiter().GetResult(); + } +} diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/bad_opcode.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/bad_opcode.pickle new file mode 100644 index 0000000..7bde864 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/pickle/bad_opcode.pickle @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/dict.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/dict.pickle new file mode 100644 index 0000000..7416bcd Binary files /dev/null and b/src/FrontierSharp.Fuzz/corpus/pickle/dict.pickle differ diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/empty.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/empty.pickle new file mode 100644 index 0000000..e69de29 diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/header_only.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/header_only.pickle new file mode 100644 index 0000000..be130f0 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/pickle/header_only.pickle @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/incomplete.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/incomplete.pickle new file mode 100644 index 0000000..be5cd2e --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/pickle/incomplete.pickle @@ -0,0 +1 @@ +(list \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/list.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/list.pickle new file mode 100644 index 0000000..8f3b5c6 Binary files /dev/null and b/src/FrontierSharp.Fuzz/corpus/pickle/list.pickle differ diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/null.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/null.pickle new file mode 100644 index 0000000..9b6ff7a --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/pickle/null.pickle @@ -0,0 +1 @@ +N. \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/truncated.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/truncated.pickle new file mode 100644 index 0000000..d76c17e --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/pickle/truncated.pickle @@ -0,0 +1 @@ +N \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/pickle/valid.pickle b/src/FrontierSharp.Fuzz/corpus/pickle/valid.pickle new file mode 100644 index 0000000..659d459 Binary files /dev/null and b/src/FrontierSharp.Fuzz/corpus/pickle/valid.pickle differ diff --git a/src/FrontierSharp.Fuzz/corpus/resindex/blank-lines.csv b/src/FrontierSharp.Fuzz/corpus/resindex/blank-lines.csv new file mode 100644 index 0000000..3fe346c --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/resindex/blank-lines.csv @@ -0,0 +1,5 @@ + +data.json,assets/data,abc123 + +index.txt,config/index,def456 + diff --git a/src/FrontierSharp.Fuzz/corpus/resindex/blank.csv b/src/FrontierSharp.Fuzz/corpus/resindex/blank.csv new file mode 100644 index 0000000..e69de29 diff --git a/src/FrontierSharp.Fuzz/corpus/resindex/delimiters.csv b/src/FrontierSharp.Fuzz/corpus/resindex/delimiters.csv new file mode 100644 index 0000000..58bc83d --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/resindex/delimiters.csv @@ -0,0 +1 @@ +data,file.json,path/to,file,hash,with,commas diff --git a/src/FrontierSharp.Fuzz/corpus/resindex/paths.csv b/src/FrontierSharp.Fuzz/corpus/resindex/paths.csv new file mode 100644 index 0000000..7f9cd9f --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/resindex/paths.csv @@ -0,0 +1,3 @@ +../../etc/passwd,/etc/passwd,hash +../data.json,../assets/data,hash +/data.json,/assets/data,hash diff --git a/src/FrontierSharp.Fuzz/corpus/resindex/short.csv b/src/FrontierSharp.Fuzz/corpus/resindex/short.csv new file mode 100644 index 0000000..4e6b091 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/resindex/short.csv @@ -0,0 +1,3 @@ +data.json +data.json,assets/data +data.json,assets/data,abc123,extra diff --git a/src/FrontierSharp.Fuzz/corpus/resindex/unicode.csv b/src/FrontierSharp.Fuzz/corpus/resindex/unicode.csv new file mode 100644 index 0000000..06489b4 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/resindex/unicode.csv @@ -0,0 +1,2 @@ +文件.json,路径/数据,123abc +ファイル.dat,パス/データ,456def diff --git a/src/FrontierSharp.Fuzz/corpus/resindex/valid.csv b/src/FrontierSharp.Fuzz/corpus/resindex/valid.csv new file mode 100644 index 0000000..fee52a6 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/resindex/valid.csv @@ -0,0 +1,2 @@ +data.json,assets/data,abc123 +index.txt,config/index,def456 diff --git a/src/FrontierSharp.Fuzz/corpus/sui/assembly.json b/src/FrontierSharp.Fuzz/corpus/sui/assembly.json new file mode 100644 index 0000000..27820bf --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/sui/assembly.json @@ -0,0 +1 @@ +{"data":{"objects":{"nodes":[{"address":"0x3","asMoveObject":{"contents":{"json":{"status":"active"}}}}],"pageInfo":{}}}} diff --git a/src/FrontierSharp.Fuzz/corpus/sui/character.json b/src/FrontierSharp.Fuzz/corpus/sui/character.json new file mode 100644 index 0000000..5a830e5 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/sui/character.json @@ -0,0 +1 @@ +{"data":{"objects":{"nodes":[{"address":"0x2","asMoveObject":{"contents":{"json":{"metadata":{"name":"synthetic"}}}}}],"pageInfo":{}}}} diff --git a/src/FrontierSharp.Fuzz/corpus/sui/converter-string.json b/src/FrontierSharp.Fuzz/corpus/sui/converter-string.json new file mode 100644 index 0000000..ecf3040 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/sui/converter-string.json @@ -0,0 +1 @@ +"legacy metadata" \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/sui/killmail.json b/src/FrontierSharp.Fuzz/corpus/sui/killmail.json new file mode 100644 index 0000000..1ea668a --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/sui/killmail.json @@ -0,0 +1 @@ +{"data":{"objects":{"nodes":[{"address":"0x1","asMoveObject":{"contents":{"json":{"loss_type":1,"kill_timestamp":"0"}}}}],"pageInfo":{"hasNextPage":false}}}} diff --git a/src/FrontierSharp.Fuzz/corpus/sui/malformed.json b/src/FrontierSharp.Fuzz/corpus/sui/malformed.json new file mode 100644 index 0000000..dd65e53 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/sui/malformed.json @@ -0,0 +1 @@ +{"data": \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/sui/minimal.json b/src/FrontierSharp.Fuzz/corpus/sui/minimal.json new file mode 100644 index 0000000..426f971 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/sui/minimal.json @@ -0,0 +1 @@ +{"data":{"object":{"contents":{"json":"{}"}}}} \ No newline at end of file diff --git a/src/FrontierSharp.Fuzz/corpus/world/detail.json b/src/FrontierSharp.Fuzz/corpus/world/detail.json new file mode 100644 index 0000000..03008fc --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/world/detail.json @@ -0,0 +1 @@ +{"data":{"name":"test","url":"https://example.com","description":"test"},"metadata":{"request":{"type":"detail","params":["test"]}}} diff --git a/src/FrontierSharp.Fuzz/corpus/world/list.json b/src/FrontierSharp.Fuzz/corpus/world/list.json new file mode 100644 index 0000000..a97c479 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/world/list.json @@ -0,0 +1 @@ +{"data":[{"name":"test","url":"https://example.com"}],"metadata":{"total_size":1,"limit":100,"offset":0}} diff --git a/src/FrontierSharp.Fuzz/corpus/world/malformed.json b/src/FrontierSharp.Fuzz/corpus/world/malformed.json new file mode 100644 index 0000000..c8dc158 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/world/malformed.json @@ -0,0 +1 @@ +{"data":,"metadata":{}} diff --git a/src/FrontierSharp.Fuzz/corpus/world/oversized.json b/src/FrontierSharp.Fuzz/corpus/world/oversized.json new file mode 100644 index 0000000..6c6a9c3 --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/world/oversized.json @@ -0,0 +1 @@ +{"data":[],"metadata":{"total_size":999999,"limit":999999,"offset":0}} diff --git a/src/FrontierSharp.Fuzz/corpus/world/pagination.json b/src/FrontierSharp.Fuzz/corpus/world/pagination.json new file mode 100644 index 0000000..b9278ef --- /dev/null +++ b/src/FrontierSharp.Fuzz/corpus/world/pagination.json @@ -0,0 +1 @@ +{"data":[{"name":"test1"},{"name":"test2"},{"name":"test3"}],"metadata":{"total_size":100,"limit":3,"offset":0}} diff --git a/src/FrontierSharp.Fuzz/packages.lock.json b/src/FrontierSharp.Fuzz/packages.lock.json new file mode 100644 index 0000000..e4b88ae --- /dev/null +++ b/src/FrontierSharp.Fuzz/packages.lock.json @@ -0,0 +1,261 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "SharpFuzz": { + "type": "Direct", + "requested": "[2.3.0, )", + "resolved": "2.3.0", + "contentHash": "5f11toR82RVCIBTr5XuuauJgesGVXIAO6vBCvLThNbrcer9NN6qB2HCA/Q122BvH2qRPsLx14O6QVtCbgRQhog==", + "dependencies": { + "SharpFuzz.Common": "2.2.0", + "dnlib": "4.4.0" + } + }, + "dnlib": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cKHI720q+zfEEvzklWVGt6B0TH3AibAyJbpUJl4U6KvTP13tycfnqJpkGHRZ/oQ45BTIoIxIwltHIJVDN+iCqQ==" + }, + "FluentResults": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + }, + "Razorvine.Pickle": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "cjqa3uLmZUYzwtC0WAE/G/bKBR6a5nVaNV9xUPRDwJnHqK4JNbkOsFj7jQW9SCdA4WxRTNnY1n5Bnn4f1rhyuQ==" + }, + "SharpFuzz.Common": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "biITWpwnMR7HUp43lAGU97DWq/4LfyXqqhuOK0Z4IuRP97KjQMOe/GKq3wE1KY21gNrc7OPO9HbAtQUvMKTImA==" + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "fwnNXyIPb7ABPLae6K9YZz0FAkRjb2s/nElRWrg73usMveY/qdOHjKaNvAF7iAfmzTl1W4wa7S/SnmIc4LDvTg==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "22.2.0", + "TestableIO.System.IO.Abstractions.Wrappers": "22.2.0" + } + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "BQPyr0A1s2HvpVTZIyolrZ3ZdPn8DU2tqciaK1oco3pjm76fiKIk75eup4R9reZjNS75M+WJIICOlNX5OFt50g==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "0GW9i46ozm687WGAWsBHWMhLR7l1HmKwhiSU2hQrbFnI5m2YRfqXwqTQNjnOwT8BdbvcGqwMr97/zlnPWa1u1Q==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "Testably.Abstractions.FileSystem.Interface": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "5ebMaoADkzjfW7GnZYKaUebV8XmUn++C/4sKk1PTzCiddEgbSKBq3pW4EWEi70rYJAK0gA1yDWrYFeHq18FvHQ==" + }, + "frontiersharp.data": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Options": "[10.0.10, )", + "Razorvine.Pickle": "[1.5.0, )", + "System.IO.Abstractions": "[22.2.0, )" + } + }, + "frontiersharp.httpclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + }, + "frontiersharp.suiclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + }, + "frontiersharp.worldapi": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "FrontierSharp.HttpClient": "[1.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.HttpClient/packages.lock.json b/src/FrontierSharp.HttpClient/packages.lock.json new file mode 100644 index 0000000..bd7eb10 --- /dev/null +++ b/src/FrontierSharp.HttpClient/packages.lock.json @@ -0,0 +1,412 @@ +{ + "version": 1, + "dependencies": { + ".NETStandard,Version=v2.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[10.8.0, )", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Bcl.TimeProvider": "10.0.10", + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Text.Json": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Diagnostics.DiagnosticSource": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10", + "System.ComponentModel.Annotations": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "TFI6OKYE1XZz4SGuTSH70c6SBdPpFktXsoa1gCxTr3mKrhmXirnvaS0tKz+J3ZWICEAmMpEGn59nO4ICtUpQXA==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Hffu4DLXbrtVBFdoH0vF2slGzHfzLNjP/DyxaKDPNsKOBtW95lcxiM+hlgRpf32yp/mY266OhTDw4axGLBtwuw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Buffers": "4.6.1", + "System.Diagnostics.DiagnosticSource": "10.0.10", + "System.Memory": "4.6.3" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "N8GXpmiLMtljq7gwvyS+1QvKT/W2J8sNAvx+HVg4NGmsG/H+2k/y9QI23auLJRterrzCiDH+IWAw4V/GPwsMlw==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "cjtKi6ERMYWp6b9UTVPcwDT29PjKDtlM3W9OwnWL5abRsI8ku42Q2wqZoLIIXJnT/XF2s2CjuK8Nl4a3mmTxQQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "7WX0W96y3dpQdYG4sEGdh38g3/0lOD4/dKbn2rRVOVzKhzoZUn2gKNIKaFeKWs8RCbpFfmmEWsRhSy95hMpvqA==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Memory": "4.6.3", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Numerics.Vectors": "4.6.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "sQxefTnhagrhoq2ReR0D/6K0zJcr9Hrd6kikeXsA1I8kOCboTavcUC4r7TSfpKFeE163uMuxZcyfO1mGO3EN8Q==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.2", + "contentHash": "2hBr6zdbIBTDE3EhK7NSVNdX58uTK6iHW/P/Axmm9sl1xoGSLqDvMtpecn226TNwHByFokYwJmt/aQQNlO5CRw==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "o16m2YpDN/pjHsnxf9pTGwkpcuvjW8v1/wGUwJtM1c3QZUKm7ZEO/eYRJg7iIx6GxS2Zv9lAMHpiQwHDdgqauA==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "bmsO6UdYtBdtn32zYXfsh7KlyTIzV/3V9hdT9RIb4pXKgYOsNxXR+VbWigNwBtNFVGYGm6Hwmqw5a+/IWFd36Q==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Buffers": "4.6.1", + "System.IO.Pipelines": "10.0.10", + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2", + "System.Text.Encodings.Web": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "7sCiwilJLYbTZELaKnc7RecBBXWXA+xMLQWZKWawBxYjp6DBlSE3v9/UcvKBvr1vv2tTOhipiogM8rRmxlhrVA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + } + }, + "net10.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[10.8.0, )", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.Starmap/packages.lock.json b/src/FrontierSharp.Starmap/packages.lock.json new file mode 100644 index 0000000..90c656b --- /dev/null +++ b/src/FrontierSharp.Starmap/packages.lock.json @@ -0,0 +1,301 @@ +{ + "version": 1, + "dependencies": { + ".NETStandard,Version=v2.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Diagnostics.DiagnosticSource": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10", + "System.ComponentModel.Annotations": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "TFI6OKYE1XZz4SGuTSH70c6SBdPpFktXsoa1gCxTr3mKrhmXirnvaS0tKz+J3ZWICEAmMpEGn59nO4ICtUpQXA==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Buffers": "4.6.1", + "System.Diagnostics.DiagnosticSource": "10.0.10", + "System.Memory": "4.6.3" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "N8GXpmiLMtljq7gwvyS+1QvKT/W2J8sNAvx+HVg4NGmsG/H+2k/y9QI23auLJRterrzCiDH+IWAw4V/GPwsMlw==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "cjtKi6ERMYWp6b9UTVPcwDT29PjKDtlM3W9OwnWL5abRsI8ku42Q2wqZoLIIXJnT/XF2s2CjuK8Nl4a3mmTxQQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Numerics.Vectors": "4.6.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "sQxefTnhagrhoq2ReR0D/6K0zJcr9Hrd6kikeXsA1I8kOCboTavcUC4r7TSfpKFeE163uMuxZcyfO1mGO3EN8Q==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.2", + "contentHash": "2hBr6zdbIBTDE3EhK7NSVNdX58uTK6iHW/P/Axmm9sl1xoGSLqDvMtpecn226TNwHByFokYwJmt/aQQNlO5CRw==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "7sCiwilJLYbTZELaKnc7RecBBXWXA+xMLQWZKWawBxYjp6DBlSE3v9/UcvKBvr1vv2tTOhipiogM8rRmxlhrVA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + } + }, + "net10.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.SuiClient/packages.lock.json b/src/FrontierSharp.SuiClient/packages.lock.json new file mode 100644 index 0000000..ef31999 --- /dev/null +++ b/src/FrontierSharp.SuiClient/packages.lock.json @@ -0,0 +1,419 @@ +{ + "version": 1, + "dependencies": { + ".NETStandard,Version=v2.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[10.8.0, )", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Bcl.TimeProvider": "10.0.10", + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Text.Json": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Diagnostics.DiagnosticSource": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10", + "System.ComponentModel.Annotations": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "System.Text.Json": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "bmsO6UdYtBdtn32zYXfsh7KlyTIzV/3V9hdT9RIb4pXKgYOsNxXR+VbWigNwBtNFVGYGm6Hwmqw5a+/IWFd36Q==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Buffers": "4.6.1", + "System.IO.Pipelines": "10.0.10", + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2", + "System.Text.Encodings.Web": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "TFI6OKYE1XZz4SGuTSH70c6SBdPpFktXsoa1gCxTr3mKrhmXirnvaS0tKz+J3ZWICEAmMpEGn59nO4ICtUpQXA==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Hffu4DLXbrtVBFdoH0vF2slGzHfzLNjP/DyxaKDPNsKOBtW95lcxiM+hlgRpf32yp/mY266OhTDw4axGLBtwuw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Buffers": "4.6.1", + "System.Diagnostics.DiagnosticSource": "10.0.10", + "System.Memory": "4.6.3" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "N8GXpmiLMtljq7gwvyS+1QvKT/W2J8sNAvx+HVg4NGmsG/H+2k/y9QI23auLJRterrzCiDH+IWAw4V/GPwsMlw==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "cjtKi6ERMYWp6b9UTVPcwDT29PjKDtlM3W9OwnWL5abRsI8ku42Q2wqZoLIIXJnT/XF2s2CjuK8Nl4a3mmTxQQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "7WX0W96y3dpQdYG4sEGdh38g3/0lOD4/dKbn2rRVOVzKhzoZUn2gKNIKaFeKWs8RCbpFfmmEWsRhSy95hMpvqA==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Memory": "4.6.3", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Numerics.Vectors": "4.6.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "sQxefTnhagrhoq2ReR0D/6K0zJcr9Hrd6kikeXsA1I8kOCboTavcUC4r7TSfpKFeE163uMuxZcyfO1mGO3EN8Q==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.2", + "contentHash": "2hBr6zdbIBTDE3EhK7NSVNdX58uTK6iHW/P/Axmm9sl1xoGSLqDvMtpecn226TNwHByFokYwJmt/aQQNlO5CRw==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "o16m2YpDN/pjHsnxf9pTGwkpcuvjW8v1/wGUwJtM1c3QZUKm7ZEO/eYRJg7iIx6GxS2Zv9lAMHpiQwHDdgqauA==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "7sCiwilJLYbTZELaKnc7RecBBXWXA+xMLQWZKWawBxYjp6DBlSE3v9/UcvKBvr1vv2tTOhipiogM8rRmxlhrVA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + } + }, + "net10.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[10.8.0, )", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "System.Text.Json": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "bmsO6UdYtBdtn32zYXfsh7KlyTIzV/3V9hdT9RIb4pXKgYOsNxXR+VbWigNwBtNFVGYGm6Hwmqw5a+/IWFd36Q==" + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.Tests/packages.lock.json b/src/FrontierSharp.Tests/packages.lock.json new file mode 100644 index 0000000..4dbab4e --- /dev/null +++ b/src/FrontierSharp.Tests/packages.lock.json @@ -0,0 +1,1176 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "AwesomeAssertions": { + "type": "Direct", + "requested": "[9.4.0, )", + "resolved": "9.4.0", + "contentHash": "dJxkWiQ8D+xT6Gr2sSL83+Mar+Vpy2JTcUPxFcckpPJ8VYBfSgnk+zqpS6t7kcGnjz8NLyF14qfuoL4bKzzoew==" + }, + "AwesomeAssertions.Analyzers": { + "type": "Direct", + "requested": "[9.0.8, )", + "resolved": "9.0.8", + "contentHash": "rjDBIQk8NA16LusDMh0XH1M9kZCwWdmP89pqLiv7caRzx+w68xAXUd0Za6ojwcDrEC+HSRPNBN8BFW1GnGTC7g==" + }, + "AwesomeAssertions.Json": { + "type": "Direct", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "h8xOiCwdKP45ezx9l2zwHNZm0YC0jambOQUKBz9aM9KPkuVingkM0DIOMTegS8o4RIJyvUfCTkvsVrK7dUqb+g==", + "dependencies": { + "AwesomeAssertions": "9.0.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[10.8.0, )", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[18.8.1, )", + "resolved": "18.8.1", + "contentHash": "dknJL3/9Y3t4XuCBqnc0PevPxgLsUMmVhjwup/b1HNovA8zWcj3XsfIf7c6p05363DWcqL7X/YhDL9B+Zymv1w==", + "dependencies": { + "Microsoft.CodeCoverage": "18.8.1", + "Microsoft.TestPlatform.TestHost": "18.8.1" + } + }, + "NSubstitute": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "0gvKMbiJ+/WrfbcfBfqRZZrvfLJcd3rqkqVMjjlY5dtmLRVzMY+o/K/rJUStofQ2haSr9Vd04YDfvZtVVGS3/A==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "NSubstitute.Analyzers.CSharp": { + "type": "Direct", + "requested": "[1.0.17, )", + "resolved": "1.0.17", + "contentHash": "Pwz0MD7CAM/G/fvJjM3ceOfI+S0IgjanHcK7evwyrW9qAWUG8fgiEXYfSX1/s3h2JUNDOw6ik0G8zp+RT61Y1g==" + }, + "Spectre.Console": { + "type": "Direct", + "requested": "[0.57.2, )", + "resolved": "0.57.2", + "contentHash": "wzsB+P9i6F9G+cFOJxRotCiQWNSzZVAMxi8YMiHlGXXU1JLMXGp7zSSqBMmROZS2bzpK5jk+Saa7Evp8HwqhKg==", + "dependencies": { + "Spectre.Console.Ansi": "0.57.2" + } + }, + "Spectre.Console.Cli": { + "type": "Direct", + "requested": "[0.55.0, )", + "resolved": "0.55.0", + "contentHash": "cFJTB1te4eaAICd4Zp+8T/kiRn1ikQxgGqmoNarb1qoQ/7LzHAvVQ62x5U9GW3E0QI7sZLcXIIoq4CpqgTx42Q==", + "dependencies": { + "Spectre.Console": "0.55.0" + } + }, + "System.IO.Abstractions.TestingHelpers": { + "type": "Direct", + "requested": "[22.2.0, )", + "resolved": "22.2.0", + "contentHash": "yVy8HIx57CFwf9Z5UMYbrokQtLdwf7f004UiR8XhA70Q3BWlIAYDaOUk7ZhDp3BtIgh739dgJkqGmSN0LUA50Q==", + "dependencies": { + "TestableIO.System.IO.Abstractions.TestingHelpers": "22.2.0" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } + }, + "xunit.analyzers": { + "type": "Direct", + "requested": "[1.27.0, )", + "resolved": "1.27.0", + "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[3.1.5, )", + "resolved": "3.1.5", + "contentHash": "tKi7dSTwP4m5m9eXPM2Ime4Kn7xNf4x4zT9sdLO/G4hZVnQCRiMTWoSZqI/pYTVeI27oPPqHBKYI/DjJ9GsYgA==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Humanizer": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "13+6RiWdpVCzSn2SSEd1hAIr/UHScNdLCUhRgjvI60UcD5u3vXu3u1/Z+74OcHWum1itjiBTjYXgJKQna1jTgw==", + "dependencies": { + "Humanizer.Core.af": "3.0.10", + "Humanizer.Core.ar": "3.0.10", + "Humanizer.Core.az": "3.0.10", + "Humanizer.Core.bg": "3.0.10", + "Humanizer.Core.bn": "3.0.10", + "Humanizer.Core.ca": "3.0.10", + "Humanizer.Core.cs": "3.0.10", + "Humanizer.Core.da": "3.0.10", + "Humanizer.Core.de": "3.0.10", + "Humanizer.Core.el": "3.0.10", + "Humanizer.Core.es": "3.0.10", + "Humanizer.Core.fa": "3.0.10", + "Humanizer.Core.fi": "3.0.10", + "Humanizer.Core.fil": "3.0.10", + "Humanizer.Core.fr": "3.0.10", + "Humanizer.Core.he": "3.0.10", + "Humanizer.Core.hr": "3.0.10", + "Humanizer.Core.hu": "3.0.10", + "Humanizer.Core.hy": "3.0.10", + "Humanizer.Core.id": "3.0.10", + "Humanizer.Core.is": "3.0.10", + "Humanizer.Core.it": "3.0.10", + "Humanizer.Core.ja": "3.0.10", + "Humanizer.Core.ko": "3.0.10", + "Humanizer.Core.ku": "3.0.10", + "Humanizer.Core.lb": "3.0.10", + "Humanizer.Core.lt": "3.0.10", + "Humanizer.Core.lv": "3.0.10", + "Humanizer.Core.ms": "3.0.10", + "Humanizer.Core.mt": "3.0.10", + "Humanizer.Core.nb": "3.0.10", + "Humanizer.Core.nl": "3.0.10", + "Humanizer.Core.pl": "3.0.10", + "Humanizer.Core.pt": "3.0.10", + "Humanizer.Core.pt-BR": "3.0.10", + "Humanizer.Core.ro": "3.0.10", + "Humanizer.Core.ru": "3.0.10", + "Humanizer.Core.sk": "3.0.10", + "Humanizer.Core.sl": "3.0.10", + "Humanizer.Core.sr": "3.0.10", + "Humanizer.Core.sr-Latn": "3.0.10", + "Humanizer.Core.sv": "3.0.10", + "Humanizer.Core.th": "3.0.10", + "Humanizer.Core.tr": "3.0.10", + "Humanizer.Core.uk": "3.0.10", + "Humanizer.Core.uz-Cyrl-UZ": "3.0.10", + "Humanizer.Core.uz-Latn-UZ": "3.0.10", + "Humanizer.Core.vi": "3.0.10", + "Humanizer.Core.zh-CN": "3.0.10", + "Humanizer.Core.zh-Hans": "3.0.10", + "Humanizer.Core.zh-Hant": "3.0.10" + } + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "yZIhtw8sYuvsONzQbZxWpR60tMWYHXoo0DL6nyOqSFiU5POjBTSEyWFpTQtJEZuy+oqiYTXKXY/Mjx7KnqIQFw==" + }, + "Humanizer.Core.af": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "jIpC73aOXfhqGEnpFKgO2AJ2Esb2t40c/cKqR+RgK1yg1bcBZBuhtjs+PrAIHf5Lp7Znd4teLjCGDS5ut8O1cw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ar": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "LdDeLE9nmlqbl14RinjII0v8APKZKUqJEClILvdLAoUEdv8UhgsHhDX2BHJKZv2aNfCnb19z9otE8Ffaa11Sow==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.az": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "+tfsgP5PkTY5mpx7t0rpMVVNXJQMcRkFSsWtnPpntuC/z7I8GS68CBcsHItw5/qbTJxWRY/cLPe/Psxh/SjEkA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.bg": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "xBQMDuLOjmj1U0h39tv7B39vmVZXBbRUcy3xkHBKHAyuRoxskDJ3F1LUOOw1/E41+dGQziAe2I0EVukwvQ/h0g==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.bn": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "U5Li886U/hPdhMxyN9P3eF5dlB15sT/w4F3NOioXsaTQxnJKdxUKglRHiGbakX+aSrsFGok1MoQwVcH7Sac1Lg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ca": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "D29T+OWcYG4rlOXKwAGpNNrwLgE44oE1JYqlNuNs3lVYmTDEgItyT+SfjG2TXuTQXkpQLzsxfRjqtA/APygjgw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.cs": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "kaG0//ULYkyB8Rk4g5PgC2o8jrmG2joc8lgtyDzCiFCaobr0jgUn393JAIB0JUygbngEIfA0PMK3fLbMXcBNLQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.da": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "/MCePoHsSaRo03I1NSRut5iUzhYRIKL+UncbtpN8AZ3Vl0TOu0Psi9/6QyjD4gLLx45puiXB2S0lUjCdYmlP7w==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.de": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "UoJk/DmAOFZivuMulLoB52Pn5iFvSqurF7qQQAyUAz1/IUZjxkoeoiI5mMILEjVeGoQJqrylt6O+f8johCo0Bg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.el": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "5oIHs25LMm1IBrhcxOYYLTFHZQfBaqgKxm0jAkYmsxedpDZkv1k+BHs2D5Kg1672/ZhTs4jsLbqYNXkHm671vw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.es": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "epxhWWQJ/I610mJGTfQPTocjp7/xCIH6tiREVIlHb/sA1kDAD1zHQcHI+HgWFzn/LzzbVg99y8HVFFHUvjnfXA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fa": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "9BEFCpbWoUdq2JnLbkohqBfpjjdeMqFhkhCNk3qYmutZwSxuZHrCozppY14SSWI6b6qD1Veb3rVyHGz9Fex5AA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fi": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "9Nbbxs1WZH2Li6Q28tZC06Y0mXwmIGnCEO/2nRzHvTqf07153frndezl5ads4uX8mNs+hMnUGUsr03IsFhI3jQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fil": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "zpUvc+riMHZ2QGYETwnaDiT4Y4fHv2/Ctpi8Nm5SujNmOuxQyQMEAcalbUqWaLjzfTcysKqlU/NkiNP86kGlCA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.fr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "k+STDkiJVeO/nA5s0/GeBdwZI17D9KgqyYA4XGxfGxtFACwbFyVKQLWLzlIR2BsrT53EkyKLAzuFJ9FCT2CyfQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.he": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "4WIzAg5hocnbnzaTnueYW/BRhCrQoPg/0U6WiUC4BJKGJDuVYbqIa8iVcHqhr7vVKd5ngFbhSsXuCgkYqOMaXQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.hr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "USin9T/FsHjmxvaolEXgL6FOdw+1Juh7geqcjTvJRCdoo/U4Y/usoAiZRbFtDA//1od4yqSxEbmj+F16nKwbkQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.hu": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "Umon7VBTVDs8QFDqNzGm6MBD+43UZJoN44htW/+iJUDF2gl8K8meRup27Dkl2zvewW3ynZic/xwP2hTDaPjIjw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.hy": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "PzdcqQMwyDYO81PYbzBf+gFMj+wzOYF3kz3mlJCcBX5mSmNRpLIwB2s6PC9OiNN/Y/ya1orHV/z0OY9j7NFc5Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.id": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "rMb9jvglGeeUxb6Z4EkXTg+et1Ri3DWZjlXs2WFle1Qpu39zWWF0l9rh9PQJb0fzeiZ8jOjiUhUI9lRnoAHHCQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.is": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "xnNgWY9azqXyclRYmy3D6kgnbdCcPFBAEN4yNdhu2IN10p7Y2T9YUw5R9jLWo5+NGM2uzbbyTxPGf4+9YYUc1w==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.it": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "iCrKxOX6q/PZgEk3vYyU1fHC0jnq0hiq7nwWXiuV7uF5VypOxwVeao3vkE6MLoNKW7RQN/TbP06n1TOqyhTA7A==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ja": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "UicfcXwMibwWN3jLesdk702IRQVndgBUqueFr3iXVEn2POue06pHInSIruxNaPTscaNdGKxXZiIiJrN7pCVO9Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ko": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "Zr/GwEilhAcmeiDxVKqr79ZK/SEpHfhKzXD15JZ1NpsfYnIfNAN/9i0o535UaadaDDT6EIVpkoGIYAGuYQ0Z4g==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ku": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "j5Qm+CY+c8onfjO1O+TReCDg/epCYdfv5N5LNB+Ydcmn06gkR4HvbWJnk5UFLVHz8NMPmtCrv7CYwmPJ0+lJqw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.lb": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "5lpkw49T6MQ7Gwa0k2JV4cw6aH5FdT1Ku1nfGeey/iScajHDV9mvdxjkxRZpFAhJ5W/5yCtMlHH992LpXFJkeA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.lt": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "1OO4XZ/74tt5nkxYHnpj+ti1w0HdeMGi+AHR59asxcJ3A/iTDZR4RNRIvoj1MdYRe0HdTUjtnGXfA7tXXOkiYg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.lv": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "S4RN1q/saAQxlFlRRUnmi3Oz+mIXRqWtIRZJA3VrvMmBy12cXIdpeY0+d+HCA58WXpI2diOrWxHq9KPUDPunIw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ms": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "m0+BJa9vG0GeuAWhmdmMxdUUa1cfGjyHZQeJoeivqxJrrtdUUFekXH0xbpvI3ErC8qu5Ufpmfnr6QAX0WQfkIw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.mt": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "8GfXTko/iweepZHcUcOANreClfvTeCDfSuiMxLtFbUZQOBegLZ6VnTVun2gVtv5OANdOk64qhqUKIVLq2rG0rw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.nb": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "UcdV9TWXG2MFVEkqHy8oD2ZbuFhFPLY7ScCJKWBu7OsgInyuHZe72hHP/i52T0FAgiVbrB+Urd3uoWiUT7hP9Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.nl": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "b+Y1CFId1ucl33OvNITID0eEVesOKiw/dmrcDJ4Z/P9KEuMTeE8aKu5/iSjwtPVV+SagaMx9XzZe7kVYyRqhuQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.pl": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "LJCt3+dGUQhopQ/1w/zzBNlUHtjkdrt57zS+llMQeFm+1u0e3R+lWJx4zP+hqZcpRA7armR38KghvRSz+bYBbg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.pt": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "+cggEy6W08xD8GU45/EaMfvNQMCd7K1G7hprSPty/9zIoM3OzaajdMA/Oxrb0mHIKpARxCNbQ29ltOtip3MTNA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.pt-BR": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "kbhwn4G+STHUT9cLDdrP60+ZFla4lTg6def+FTnhpMS4JHf8ll0TL1kz9Nj5DTJFdqnvs8/eYfmVhnEegyBjBw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ro": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "JwdY+SywNIDrFcWKyiZsgsSJkIleoAXAtCLYiLn+CNCk+135VwhchZHm5B9nNvpLjGVaP5Y0ouZQ8xTx1oeZag==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.ru": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "1vXr7pkV0zSZF6ENJUadsAagubrBAvTPHPgdgttHlMhUQ1Zz9ZWTJaQdmf2RCen4YywMmfsQQZiGqJl52LVT8Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sk": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "LD93nJw1zwXuC+LSw3+02Jk02bdAoENHzb/qrMoGBf70XeV2rBeoxSyJBVLHQ00RZfwNSy6TCTXQyagESVmN+Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sl": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "utURJ8K/tnbA5KXlKcT8T+35MEVdZrXUvu2tH+T6M9xxJ1MhLGuFWnc687pcsLdpaLnGB7ZVwrAITlueAE+KGA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "e2bVzUAjEpxjFdLVmXZL9EsdVojlV/8GMwZzwDS6OByfG+PP5JxemKylK6FoUK5X2IBPNg68LOvn72WgwaruIQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sr-Latn": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "VXPlm+eg5sraDhZ50WGiMZMvj4I2d+0VAy8cNaLLXNt+EgkUz646dRfg5HrQPPjtBbegj6o7gcg8Xl6z0ke+hA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.sv": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "COq4bbUKk7F1jfE2sC/ZmomoQqX0Herwe1iXZyDl5zyw21mUY9wL96S1qbRmRp15UmGzFJdqBPdnd58P7kVMyg==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.th": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "8A4lZCLE6bEPYdQKeGfPBHDgAsY30TWWdjoWA1+vAfLA9Ip1l2Ons+Ngw4npkcoI3qdCidU6hWOsFnPfJ8ZufQ==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.tr": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "aRAxq1VyuIVoFdx8TZyVsRoDk0yqe9NATjhGgWHPsdR8TVHnuiyXeEbiXf846870VteyLJL9tVy3jaj2rC45tw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.uk": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "NPnGZ1jdoMDYGrsHt5aLlj7Ambp7i5ER/5BbtjBSegn3+PliMbd4Eftr1Ind4qvCU6rTP2a9lUqBoRd+hSVA+g==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.uz-Cyrl-UZ": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "8NSyuiTlCfse1ki9QeO35IpZLcxoMlSMGvEY892aw9CNGaDMROQjFzf1iKJkWTyB9atrHHPuWlasBAFk2QkT9w==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.uz-Latn-UZ": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "FaSETkwfUiDU/RHlD54xbBKEZXnFIUnTNTnA5ZYXgDOiMmX6cY7vyRDmI1YpQtO+QR1irSettpLFpHeysslnpA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.vi": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "Uz5gph//0eNP0Ta1tqdKDyghiUnZdW0aVW4MK/poD5hLEH1qLoDTWuTb8gxj3F8GvSFjgVmF9HZGQx5cO06N8Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.zh-CN": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "7veG4JdZ4OeYNlgci/6I/Xf9G/iCljBcwsbLVyGaqdia+2UMAp1iGu+MCs3zKOmEvcb4ipHGFkwT5d/2WfEevA==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.zh-Hans": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "z8E2R0QL43NB6m8ntQaL1cONMjudoIJXvMQUFXG4OaKp5iyYqWs6FMC2B7x2rLxOynpsxoq5AQ/8BO0pMdfZrw==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Humanizer.Core.zh-Hant": { + "type": "Transitive", + "resolved": "3.0.10", + "contentHash": "KI5Nv82v9diPBxcBAwIAvZQHjSrDy7He0atnzdZghS+QchHwlkPKhTyEzVSbOZdD42RxCX1ArMiL864A2iw34Q==", + "dependencies": { + "Humanizer.Core": "[3.0.10]" + } + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "18.8.1", + "contentHash": "Eclse/ZZjr4lmWzZFNN9h/OluhKL+SK/QbUyKUewgX139aGeyMEO/DkMPwuFs2MixvanTnz6891rF8UHDg+W4Q==" + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "33cBeR2HRbzHUTtmcmLdNOApneNGcymwwL4arHuotgVK9Frba8kcDTrvVTj7cSCmF1R9OiSbZH0KxNOwab3HUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "KRfFSSCV58vEdU7mPED/YMzeovIWF5P0g8s9K8n9HEfy0/WzMq37SrPdXdFN5/dFT/rPMHpF7AvpoXHckbcBFg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "ZOhZYwvbXGTgGVRwswIirofEMVHuWdxjdh0JeUZXwaF9cgcjXdz/t0ELtgaevw7ezTyv47yPNCgGreWtLkn3IQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Physical": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "uvJ6sHwjgrkMEJOgiC76G0mcZGXerwyyWkwX34EOjCbxKG6TCtfAoqDKAMsCvEBf9HxjlGQEgqsSMOGCmGBf+A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "1s1sKFTk/Foam64JY6+m/diH8drL3Wx6V3gtSd5v1IEZtszZYyc1pW8uRnMblzpNiR0l0t8gGk7tXj3xHzFgdg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Json": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Physical": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "RFYJR7APio/BiqdQunRq6DB+nDB6nc2qhHr77mlvZ0q0BT8PubMXN7XicmfzCbrDE/dzhBnUKBRXLTcqUiZDGg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "jhJAyo38kSrH3ARvWUk0h8itogVnQu2DCZuPo+s0Z+tXes0ugTxMPaHYzap85785eHQmPFqD9TYERqBbtGxn/w==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileSystemGlobbing": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "jSOCVxEwCd4Aq925kJVz1kSO1EpX2OHYKL04qVREXkDU7Ce3pVDdHPYm+fEy8y/th2kJf/DAstRHpJAqoNWP8w==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tL9FkfV64GPUDSPvwrgyw42LVzsnVAnyrqJEuZVJbODgrQ3eL63zmzEcVWoCHzfgqUhWggzbgAyUCnz/zfI3Pg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.Configuration.CommandLine": "10.0.10", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.10", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.10", + "Microsoft.Extensions.Configuration.Json": "10.0.10", + "Microsoft.Extensions.Configuration.UserSecrets": "10.0.10", + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Physical": "10.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Configuration": "10.0.10", + "Microsoft.Extensions.Logging.Console": "10.0.10", + "Microsoft.Extensions.Logging.Debug": "10.0.10", + "Microsoft.Extensions.Logging.EventLog": "10.0.10", + "Microsoft.Extensions.Logging.EventSource": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "VIlNzPwPS0GeQVSmCqqo36ugryX3LpE9ul6gEkks5VLET3weH/XMLeWmclwfoGn4Nxi2mwVibB+OZBVJ9tDqvg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Configuration": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "8+TZBnV5fgBXoVNJ5ROSErUwYogk4hOgV7c2HWK1u5cqKGmiUTUn7+KqZ35iQu8e/B7Ykccyz5OTjdXcidNZ9g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "0RE4951AzQ+YD4gVrvbq0BhdsiBgSDo44yM7+QBZ2mrmMJeNjY+teCIYfUjqDPVYnKs0HR6SkkhgrX1YgXZq3Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Diagnostics.EventLog": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "85SAPwXhJtdBInzN2k7SChiFiBGh3KOWay5AfoY+GREF6P7oZA98+ST2p7Z9384iLKYjkZSKIZ/FqIO5aojtNw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "18.8.1", + "contentHash": "qLbktNB1+b1XZLNJBTzaWVVJAd6PEzD7cgD406geMb6PcFZhp3EDNa1tctWx1+mtMU6MP/6ozVvFPC9vs2a9rw==" + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "18.8.1", + "contentHash": "FaQHPDTUOcE+SFTjssNPfrub2lT9Zyon4J2W/KLHt/efLJACb1TCeWXyOgh0D/4Q1e4n+S3E6mOKud+9nLZlEA==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "18.8.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Razorvine.Pickle": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "cjqa3uLmZUYzwtC0WAE/G/bKBR6a5nVaNV9xUPRDwJnHqK4JNbkOsFj7jQW9SCdA4WxRTNnY1n5Bnn4f1rhyuQ==" + }, + "Scetrov.DumpifyFork": { + "type": "Transitive", + "resolved": "0.6.7", + "contentHash": "UXvdJfj42GFu6Xtik4VIjiv2pTvNfCIod5I9F1ZiRZ3IJk6mHrnfjP0ws/B4fTHdSSAx2Ekwn/Ph31zlvtP0Rw==", + "dependencies": { + "Spectre.Console": "0.49.1" + } + }, + "Serilog": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "ZC6Le3rr4TVJJjS4KsQAesxeF1EhW9qcZmmG7eP5Y2G3+gTGkJEUXkq4+tZNPtyp05I0wWOxnIjwtxFweJsObw==" + }, + "Serilog.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "vx0kABKl2dWbBhhqAfTOk53/i8aV/5VaT3a6il9gn72Wqs2pM7EK2OB6No6xdqK2IaY6Zf9gdjLuK9BVa2rT+Q==", + "dependencies": { + "Microsoft.Extensions.Logging": "10.0.0", + "Serilog": "4.2.0" + } + }, + "Serilog.Settings.Configuration": { + "type": "Transitive", + "resolved": "10.0.1", + "contentHash": "ayFE7h66mqMqzwfPrzDCMbWU27FdNC2bkCG+jnkeHFZTBRh+yWdr4aa/2WuX7c8RmqxGPMW2UqoJ3fw9hK3QhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Binder": "10.0.0", + "Microsoft.Extensions.DependencyModel": "10.0.0", + "Serilog": "4.3.0" + } + }, + "Serilog.Sinks.Console": { + "type": "Transitive", + "resolved": "6.1.1", + "contentHash": "8jbqgjUyZlfCuSTaJk6lOca465OndqOz3KZP6Cryt/IqZYybyBu7GP0fE/AXBzrrQB3EBmQntBFAvMVz1COvAA==", + "dependencies": { + "Serilog": "4.0.0" + } + }, + "Spectre.Console.Ansi": { + "type": "Transitive", + "resolved": "0.57.2", + "contentHash": "Y1+u73shwP+JYHmrkdN6bSt2kaGBEAafhi2nrecczbXdFRey+k7J/WF9YPfcB0rqivv2S8fmif6FSBq9m/AFvw==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "fwnNXyIPb7ABPLae6K9YZz0FAkRjb2s/nElRWrg73usMveY/qdOHjKaNvAF7iAfmzTl1W4wa7S/SnmIc4LDvTg==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "22.2.0", + "TestableIO.System.IO.Abstractions.Wrappers": "22.2.0" + } + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "BQPyr0A1s2HvpVTZIyolrZ3ZdPn8DU2tqciaK1oco3pjm76fiKIk75eup4R9reZjNS75M+WJIICOlNX5OFt50g==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "mmsYxNRoxsimceoqImCPVf+LuqJJSd8esDQVP5uONDUZ8envfrKen8I+fRtwsoyt+GVrKvf+XiZJgKWns+t9eg==", + "dependencies": { + "TestableIO.System.IO.Abstractions.Wrappers": "22.2.0", + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "22.2.0", + "contentHash": "0GW9i46ozm687WGAWsBHWMhLR7l1HmKwhiSU2hQrbFnI5m2YRfqXwqTQNjnOwT8BdbvcGqwMr97/zlnPWa1u1Q==", + "dependencies": { + "Testably.Abstractions.FileSystem.Interface": "10.3.0" + } + }, + "Testably.Abstractions.FileSystem.Interface": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "5ebMaoADkzjfW7GnZYKaUebV8XmUn++C/4sKk1PTzCiddEgbSKBq3pW4EWEi70rYJAK0gA1yDWrYFeHq18FvHQ==" + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==", + "dependencies": { + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]" + } + }, + "YamlDotNet": { + "type": "Transitive", + "resolved": "18.1.0", + "contentHash": "5K+9KFg2TdTl7VXv88Qzi/0lqK6JFoNP3lRuImPYGRV7K/QYklDyTrj4+A+KAki1JsQi6qKY+hDyY7d6WRqjrw==" + }, + "ZiggyCreatures.FusionCache": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "BCe+/SkwQZfaMpq2ZGDZB2pyx6BdGnP+zxqjMM/5K+4PBuH6hljZeIqH4KVzQ26khSbPsQ7IiYZl0Fve4OZOog==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "10.0.1" + } + }, + "frontiersharp.commandline": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "FrontierSharp.Common": "[1.0.0, )", + "FrontierSharp.Data": "[1.0.0, )", + "FrontierSharp.SuiClient": "[1.0.0, )", + "FrontierSharp.WorldApi": "[1.0.0, )", + "Humanizer": "[3.0.10, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Hosting": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )", + "Scetrov.DumpifyFork": "[0.6.7, )", + "Serilog": "[4.4.0, )", + "Serilog.Extensions.Logging": "[10.0.0, )", + "Serilog.Settings.Configuration": "[10.0.1, )", + "Serilog.Sinks.Console": "[6.1.1, )", + "Spectre.Console": "[0.57.2, )", + "Spectre.Console.Cli": "[0.55.0, )", + "System.IO.Abstractions": "[22.2.0, )", + "YamlDotNet": "[18.1.0, )", + "ZiggyCreatures.FusionCache": "[2.6.0, )" + } + }, + "frontiersharp.common": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )" + } + }, + "frontiersharp.data": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Options": "[10.0.10, )", + "Razorvine.Pickle": "[1.5.0, )", + "System.IO.Abstractions": "[22.2.0, )" + } + }, + "frontiersharp.httpclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + }, + "frontiersharp.starmap": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + }, + "frontiersharp.suiclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + }, + "frontiersharp.worldapi": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "FrontierSharp.HttpClient": "[1.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.WorldApi/packages.lock.json b/src/FrontierSharp.WorldApi/packages.lock.json new file mode 100644 index 0000000..2078f7f --- /dev/null +++ b/src/FrontierSharp.WorldApi/packages.lock.json @@ -0,0 +1,436 @@ +{ + "version": 1, + "dependencies": { + ".NETStandard,Version=v2.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[10.8.0, )", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Bcl.TimeProvider": "10.0.10", + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Text.Json": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "System.Diagnostics.DiagnosticSource": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10", + "System.ComponentModel.Annotations": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "TFI6OKYE1XZz4SGuTSH70c6SBdPpFktXsoa1gCxTr3mKrhmXirnvaS0tKz+J3ZWICEAmMpEGn59nO4ICtUpQXA==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Hffu4DLXbrtVBFdoH0vF2slGzHfzLNjP/DyxaKDPNsKOBtW95lcxiM+hlgRpf32yp/mY266OhTDw4axGLBtwuw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "System.Buffers": "4.6.1", + "System.Diagnostics.DiagnosticSource": "10.0.10", + "System.Memory": "4.6.3" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "N8GXpmiLMtljq7gwvyS+1QvKT/W2J8sNAvx+HVg4NGmsG/H+2k/y9QI23auLJRterrzCiDH+IWAw4V/GPwsMlw==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "cjtKi6ERMYWp6b9UTVPcwDT29PjKDtlM3W9OwnWL5abRsI8ku42Q2wqZoLIIXJnT/XF2s2CjuK8Nl4a3mmTxQQ==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "7WX0W96y3dpQdYG4sEGdh38g3/0lOD4/dKbn2rRVOVzKhzoZUn2gKNIKaFeKWs8RCbpFfmmEWsRhSy95hMpvqA==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Memory": "4.6.3", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Numerics.Vectors": "4.6.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "sQxefTnhagrhoq2ReR0D/6K0zJcr9Hrd6kikeXsA1I8kOCboTavcUC4r7TSfpKFeE163uMuxZcyfO1mGO3EN8Q==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.2", + "contentHash": "2hBr6zdbIBTDE3EhK7NSVNdX58uTK6iHW/P/Axmm9sl1xoGSLqDvMtpecn226TNwHByFokYwJmt/aQQNlO5CRw==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "o16m2YpDN/pjHsnxf9pTGwkpcuvjW8v1/wGUwJtM1c3QZUKm7ZEO/eYRJg7iIx6GxS2Zv9lAMHpiQwHDdgqauA==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "bmsO6UdYtBdtn32zYXfsh7KlyTIzV/3V9hdT9RIb4pXKgYOsNxXR+VbWigNwBtNFVGYGm6Hwmqw5a+/IWFd36Q==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.10", + "System.Buffers": "4.6.1", + "System.IO.Pipelines": "10.0.10", + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2", + "System.Text.Encodings.Web": "10.0.10", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "7sCiwilJLYbTZELaKnc7RecBBXWXA+xMLQWZKWawBxYjp6DBlSE3v9/UcvKBvr1vv2tTOhipiogM8rRmxlhrVA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "frontiersharp.httpclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + } + }, + "net10.0": { + "FluentResults": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "wKfdLvDnDVhXlSreU7u/NFNHH6EfoOhAloEID4ePAyk+ZliowKZJvX+aCL4hxhFc9Jj74t62amS4LyOYTjXGCg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[10.8.0, )", + "resolved": "10.8.0", + "contentHash": "RCtCTK3eqKXx8LXqd7B8GjbTkIp4k3EgKeunaCmBJ+WA55Nva83CI2I+wVyp0S9jTG+aT6AYWQbkKOfvFOlmLA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.Caching.Memory": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Diagnostics": "10.0.10", + "Microsoft.Extensions.Logging": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "N1w5H7uK6gCTnCBZAWzE0/EQYSPysij/uYwDqntqBVvBa6bjMmBKitsnEFd6yh/SX3wLm67nO6+OnZ84K+gZWg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.10", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", + "Microsoft.Extensions.Configuration.Binder": "10.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", + "Microsoft.Extensions.Options": "10.0.10", + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + }, + "frontiersharp.httpclient": { + "type": "Project", + "dependencies": { + "FluentResults": "[4.0.0, )", + "Microsoft.Extensions.Caching.Abstractions": "[10.0.10, )", + "Microsoft.Extensions.Caching.Hybrid": "[10.8.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.10, )", + "Microsoft.Extensions.Http": "[10.0.10, )", + "Microsoft.Extensions.Logging": "[10.0.10, )", + "Microsoft.Extensions.Options": "[10.0.10, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/FrontierSharp.sln b/src/FrontierSharp.sln index 4300fdd..bdb87c3 100644 --- a/src/FrontierSharp.sln +++ b/src/FrontierSharp.sln @@ -21,43 +21,128 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RootFiles", "RootFiles", "{ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FrontierSharp.SuiClient", "FrontierSharp.SuiClient\FrontierSharp.SuiClient.csproj", "{0862E4B0-65B9-47AC-9E8B-899FC2EA2657}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FrontierSharp.Fuzz", "FrontierSharp.Fuzz\FrontierSharp.Fuzz.csproj", "{152CD4E8-EBB3-44A7-B090-492750729C16}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {662E8970-D79A-44D0-A97F-C76A00A1887B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {662E8970-D79A-44D0-A97F-C76A00A1887B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Debug|x64.ActiveCfg = Debug|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Debug|x64.Build.0 = Debug|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Debug|x86.ActiveCfg = Debug|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Debug|x86.Build.0 = Debug|Any CPU {662E8970-D79A-44D0-A97F-C76A00A1887B}.Release|Any CPU.ActiveCfg = Release|Any CPU {662E8970-D79A-44D0-A97F-C76A00A1887B}.Release|Any CPU.Build.0 = Release|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Release|x64.ActiveCfg = Release|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Release|x64.Build.0 = Release|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Release|x86.ActiveCfg = Release|Any CPU + {662E8970-D79A-44D0-A97F-C76A00A1887B}.Release|x86.Build.0 = Release|Any CPU {03230400-42A8-4F78-B44F-66AD04B88D85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {03230400-42A8-4F78-B44F-66AD04B88D85}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Debug|x64.ActiveCfg = Debug|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Debug|x64.Build.0 = Debug|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Debug|x86.ActiveCfg = Debug|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Debug|x86.Build.0 = Debug|Any CPU {03230400-42A8-4F78-B44F-66AD04B88D85}.Release|Any CPU.ActiveCfg = Release|Any CPU {03230400-42A8-4F78-B44F-66AD04B88D85}.Release|Any CPU.Build.0 = Release|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Release|x64.ActiveCfg = Release|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Release|x64.Build.0 = Release|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Release|x86.ActiveCfg = Release|Any CPU + {03230400-42A8-4F78-B44F-66AD04B88D85}.Release|x86.Build.0 = Release|Any CPU {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Debug|x64.ActiveCfg = Debug|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Debug|x64.Build.0 = Debug|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Debug|x86.ActiveCfg = Debug|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Debug|x86.Build.0 = Debug|Any CPU {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Release|Any CPU.ActiveCfg = Release|Any CPU {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Release|Any CPU.Build.0 = Release|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Release|x64.ActiveCfg = Release|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Release|x64.Build.0 = Release|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Release|x86.ActiveCfg = Release|Any CPU + {B3EFC6DB-9C80-4AB6-96F7-3A06F38C8279}.Release|x86.Build.0 = Release|Any CPU {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Debug|x64.ActiveCfg = Debug|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Debug|x64.Build.0 = Debug|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Debug|x86.ActiveCfg = Debug|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Debug|x86.Build.0 = Debug|Any CPU {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Release|Any CPU.ActiveCfg = Release|Any CPU {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Release|Any CPU.Build.0 = Release|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Release|x64.ActiveCfg = Release|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Release|x64.Build.0 = Release|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Release|x86.ActiveCfg = Release|Any CPU + {B904B7B7-E8D2-453C-A268-F5CE42451D30}.Release|x86.Build.0 = Release|Any CPU {31668BAD-997C-4779-AD81-C39FC377C008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {31668BAD-997C-4779-AD81-C39FC377C008}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Debug|x64.ActiveCfg = Debug|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Debug|x64.Build.0 = Debug|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Debug|x86.ActiveCfg = Debug|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Debug|x86.Build.0 = Debug|Any CPU {31668BAD-997C-4779-AD81-C39FC377C008}.Release|Any CPU.ActiveCfg = Release|Any CPU {31668BAD-997C-4779-AD81-C39FC377C008}.Release|Any CPU.Build.0 = Release|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Release|x64.ActiveCfg = Release|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Release|x64.Build.0 = Release|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Release|x86.ActiveCfg = Release|Any CPU + {31668BAD-997C-4779-AD81-C39FC377C008}.Release|x86.Build.0 = Release|Any CPU {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Debug|x64.ActiveCfg = Debug|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Debug|x64.Build.0 = Debug|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Debug|x86.ActiveCfg = Debug|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Debug|x86.Build.0 = Debug|Any CPU {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Release|Any CPU.ActiveCfg = Release|Any CPU {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Release|Any CPU.Build.0 = Release|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Release|x64.ActiveCfg = Release|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Release|x64.Build.0 = Release|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Release|x86.ActiveCfg = Release|Any CPU + {8CB00C49-A0BE-4820-8AF5-648C95464A13}.Release|x86.Build.0 = Release|Any CPU {5388DAC2-3219-4A11-A336-4C83062D52D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5388DAC2-3219-4A11-A336-4C83062D52D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Debug|x64.ActiveCfg = Debug|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Debug|x64.Build.0 = Debug|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Debug|x86.ActiveCfg = Debug|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Debug|x86.Build.0 = Debug|Any CPU {5388DAC2-3219-4A11-A336-4C83062D52D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {5388DAC2-3219-4A11-A336-4C83062D52D4}.Release|Any CPU.Build.0 = Release|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Release|x64.ActiveCfg = Release|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Release|x64.Build.0 = Release|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Release|x86.ActiveCfg = Release|Any CPU + {5388DAC2-3219-4A11-A336-4C83062D52D4}.Release|x86.Build.0 = Release|Any CPU {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Debug|x64.ActiveCfg = Debug|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Debug|x64.Build.0 = Debug|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Debug|x86.ActiveCfg = Debug|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Debug|x86.Build.0 = Debug|Any CPU {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Release|Any CPU.ActiveCfg = Release|Any CPU {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Release|Any CPU.Build.0 = Release|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Release|x64.ActiveCfg = Release|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Release|x64.Build.0 = Release|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Release|x86.ActiveCfg = Release|Any CPU + {0862E4B0-65B9-47AC-9E8B-899FC2EA2657}.Release|x86.Build.0 = Release|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Debug|x64.ActiveCfg = Debug|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Debug|x64.Build.0 = Debug|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Debug|x86.ActiveCfg = Debug|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Debug|x86.Build.0 = Debug|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Release|Any CPU.Build.0 = Release|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Release|x64.ActiveCfg = Release|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Release|x64.Build.0 = Release|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Release|x86.ActiveCfg = Release|Any CPU + {152CD4E8-EBB3-44A7-B090-492750729C16}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection EndGlobal