diff --git a/.gitea/scripts/validate/validate-migrations.sh b/.gitea/scripts/validate/validate-migrations.sh new file mode 100644 index 000000000..d17e33ad5 --- /dev/null +++ b/.gitea/scripts/validate/validate-migrations.sh @@ -0,0 +1,260 @@ +#!/usr/bin/env bash +# Migration Validation Script +# Validates migration naming conventions, detects duplicates, and checks for issues. +# +# Usage: +# ./validate-migrations.sh [--strict] [--fix-scanner] +# +# Options: +# --strict Exit with error on any warning +# --fix-scanner Generate rename commands for Scanner duplicates + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" + +STRICT_MODE=false +FIX_SCANNER=false +EXIT_CODE=0 + +# Parse arguments +for arg in "$@"; do + case $arg in + --strict) + STRICT_MODE=true + shift + ;; + --fix-scanner) + FIX_SCANNER=true + shift + ;; + esac +done + +echo "=== Migration Validation ===" +echo "Repository: $REPO_ROOT" +echo "" + +# Colors for output +RED='\033[0;31m' +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# Track issues +ERRORS=() +WARNINGS=() + +# Function to check for duplicates in a directory +check_duplicates() { + local dir="$1" + local module="$2" + + if [ ! -d "$dir" ]; then + return + fi + + # Extract numeric prefixes and find duplicates + local duplicates + duplicates=$(find "$dir" -maxdepth 1 -name "*.sql" -printf "%f\n" 2>/dev/null | \ + sed -E 's/^([0-9]+)_.*/\1/' | \ + sort | uniq -d) + + if [ -n "$duplicates" ]; then + for prefix in $duplicates; do + local files + files=$(find "$dir" -maxdepth 1 -name "${prefix}_*.sql" -printf "%f\n" | tr '\n' ', ' | sed 's/,$//') + ERRORS+=("[$module] Duplicate prefix $prefix: $files") + done + fi +} + +# Function to check naming convention +check_naming() { + local dir="$1" + local module="$2" + + if [ ! -d "$dir" ]; then + return + fi + + find "$dir" -maxdepth 1 -name "*.sql" -printf "%f\n" 2>/dev/null | while read -r file; do + # Check standard pattern: NNN_description.sql + if [[ "$file" =~ ^[0-9]{3}_[a-z0-9_]+\.sql$ ]]; then + continue # Valid standard + fi + # Check seed pattern: SNNN_description.sql + if [[ "$file" =~ ^S[0-9]{3}_[a-z0-9_]+\.sql$ ]]; then + continue # Valid seed + fi + # Check data migration pattern: DMNNN_description.sql + if [[ "$file" =~ ^DM[0-9]{3}_[a-z0-9_]+\.sql$ ]]; then + continue # Valid data migration + fi + # Check for Flyway-style + if [[ "$file" =~ ^V[0-9]+.*\.sql$ ]]; then + WARNINGS+=("[$module] Flyway-style naming: $file (consider NNN_description.sql)") + continue + fi + # Check for EF Core timestamp style + if [[ "$file" =~ ^[0-9]{14,}_.*\.sql$ ]]; then + WARNINGS+=("[$module] EF Core timestamp naming: $file (consider NNN_description.sql)") + continue + fi + # Check for 4-digit prefix + if [[ "$file" =~ ^[0-9]{4}_.*\.sql$ ]]; then + WARNINGS+=("[$module] 4-digit prefix: $file (standard is 3-digit NNN_description.sql)") + continue + fi + # Non-standard + WARNINGS+=("[$module] Non-standard naming: $file") + done +} + +# Function to check for dangerous operations in startup migrations +check_dangerous_ops() { + local dir="$1" + local module="$2" + + if [ ! -d "$dir" ]; then + return + fi + + find "$dir" -maxdepth 1 -name "*.sql" -printf "%f\n" 2>/dev/null | while read -r file; do + local filepath="$dir/$file" + local prefix + prefix=$(echo "$file" | sed -E 's/^([0-9]+)_.*/\1/') + + # Only check startup migrations (001-099) + if [[ "$prefix" =~ ^0[0-9]{2}$ ]] && [ "$prefix" -lt 100 ]; then + # Check for DROP TABLE without IF EXISTS + if grep -qE "DROP\s+TABLE\s+(?!IF\s+EXISTS)" "$filepath" 2>/dev/null; then + ERRORS+=("[$module] $file: DROP TABLE without IF EXISTS in startup migration") + fi + + # Check for DROP COLUMN (breaking change in startup) + if grep -qiE "ALTER\s+TABLE.*DROP\s+COLUMN" "$filepath" 2>/dev/null; then + ERRORS+=("[$module] $file: DROP COLUMN in startup migration (should be release migration 100+)") + fi + + # Check for TRUNCATE + if grep -qiE "^\s*TRUNCATE" "$filepath" 2>/dev/null; then + ERRORS+=("[$module] $file: TRUNCATE in startup migration") + fi + fi + done +} + +# Scan all module migration directories +echo "Scanning migration directories..." +echo "" + +# Define module migration paths +declare -A MIGRATION_PATHS +MIGRATION_PATHS=( + ["Authority"]="src/Authority/__Libraries/StellaOps.Authority.Storage.Postgres/Migrations" + ["Concelier"]="src/Concelier/__Libraries/StellaOps.Concelier.Storage.Postgres/Migrations" + ["Excititor"]="src/Excititor/__Libraries/StellaOps.Excititor.Storage.Postgres/Migrations" + ["Policy"]="src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations" + ["Scheduler"]="src/Scheduler/__Libraries/StellaOps.Scheduler.Storage.Postgres/Migrations" + ["Notify"]="src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations" + ["Scanner"]="src/Scanner/__Libraries/StellaOps.Scanner.Storage/Postgres/Migrations" + ["Scanner.Triage"]="src/Scanner/__Libraries/StellaOps.Scanner.Triage/Migrations" + ["Attestor"]="src/Attestor/__Libraries/StellaOps.Attestor.Persistence/Migrations" + ["Signer"]="src/Signer/__Libraries/StellaOps.Signer.KeyManagement/Migrations" + ["Signals"]="src/Signals/StellaOps.Signals.Storage.Postgres/Migrations" + ["EvidenceLocker"]="src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Infrastructure/Db/Migrations" + ["ExportCenter"]="src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Infrastructure/Db/Migrations" + ["IssuerDirectory"]="src/IssuerDirectory/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.Storage.Postgres/Migrations" + ["Orchestrator"]="src/Orchestrator/StellaOps.Orchestrator/StellaOps.Orchestrator.Infrastructure/migrations" + ["TimelineIndexer"]="src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Infrastructure/Db/Migrations" + ["BinaryIndex"]="src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Persistence/Migrations" + ["Unknowns"]="src/Unknowns/__Libraries/StellaOps.Unknowns.Storage.Postgres/Migrations" + ["VexHub"]="src/VexHub/__Libraries/StellaOps.VexHub.Storage.Postgres/Migrations" +) + +for module in "${!MIGRATION_PATHS[@]}"; do + path="$REPO_ROOT/${MIGRATION_PATHS[$module]}" + if [ -d "$path" ]; then + echo "Checking: $module" + check_duplicates "$path" "$module" + check_naming "$path" "$module" + check_dangerous_ops "$path" "$module" + fi +done + +echo "" + +# Report errors +if [ ${#ERRORS[@]} -gt 0 ]; then + echo -e "${RED}=== ERRORS (${#ERRORS[@]}) ===${NC}" + for error in "${ERRORS[@]}"; do + echo -e "${RED} ✗ $error${NC}" + done + EXIT_CODE=1 + echo "" +fi + +# Report warnings +if [ ${#WARNINGS[@]} -gt 0 ]; then + echo -e "${YELLOW}=== WARNINGS (${#WARNINGS[@]}) ===${NC}" + for warning in "${WARNINGS[@]}"; do + echo -e "${YELLOW} ⚠ $warning${NC}" + done + if [ "$STRICT_MODE" = true ]; then + EXIT_CODE=1 + fi + echo "" +fi + +# Scanner fix suggestions +if [ "$FIX_SCANNER" = true ]; then + echo "=== Scanner Migration Rename Suggestions ===" + echo "# Run these commands to fix Scanner duplicate migrations:" + echo "" + + SCANNER_DIR="$REPO_ROOT/src/Scanner/__Libraries/StellaOps.Scanner.Storage/Postgres/Migrations" + if [ -d "$SCANNER_DIR" ]; then + # Map old names to new sequential numbers + cat << 'EOF' +# Before running: backup the schema_migrations table! +# After renaming: update schema_migrations.migration_name to match new names + +cd src/Scanner/__Libraries/StellaOps.Scanner.Storage/Postgres/Migrations + +# Fix duplicate 009 prefixes +git mv 009_call_graph_tables.sql 020_call_graph_tables.sql +git mv 009_smart_diff_tables_search_path.sql 021_smart_diff_tables_search_path.sql + +# Fix duplicate 010 prefixes +git mv 010_reachability_drift_tables.sql 022_reachability_drift_tables.sql +git mv 010_scanner_api_ingestion.sql 023_scanner_api_ingestion.sql +git mv 010_smart_diff_priority_score_widen.sql 024_smart_diff_priority_score_widen.sql + +# Fix duplicate 014 prefixes +git mv 014_epss_triage_columns.sql 025_epss_triage_columns.sql +git mv 014_vuln_surfaces.sql 026_vuln_surfaces.sql + +# Renumber subsequent migrations +git mv 011_epss_raw_layer.sql 027_epss_raw_layer.sql +git mv 012_epss_signal_layer.sql 028_epss_signal_layer.sql +git mv 013_witness_storage.sql 029_witness_storage.sql +git mv 015_vuln_surface_triggers_update.sql 030_vuln_surface_triggers_update.sql +git mv 016_reach_cache.sql 031_reach_cache.sql +git mv 017_idempotency_keys.sql 032_idempotency_keys.sql +git mv 018_binary_evidence.sql 033_binary_evidence.sql +git mv 019_func_proof_tables.sql 034_func_proof_tables.sql +EOF + fi + echo "" +fi + +# Summary +if [ $EXIT_CODE -eq 0 ]; then + echo -e "${GREEN}=== VALIDATION PASSED ===${NC}" +else + echo -e "${RED}=== VALIDATION FAILED ===${NC}" +fi + +exit $EXIT_CODE diff --git a/Directory.Build.props b/Directory.Build.props index 1e9d3c69b..0d8d14e42 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -23,9 +23,9 @@ false - $(NoWarn);NU1608;NU1605;NU1202 - $(WarningsNotAsErrors);NU1608;NU1605;NU1202 - $(RestoreNoWarn);NU1608;NU1605;NU1202 + $(NoWarn);NU1608;NU1605;NU1202;NU1107;NU1504;NU1101 + $(WarningsNotAsErrors);NU1608;NU1605;NU1202;NU1107;NU1504;NU1101 + $(RestoreNoWarn);NU1608;NU1605;NU1202;NU1107;NU1504;NU1101 false true diff --git a/devops/scripts/fix-duplicate-packages.ps1 b/devops/scripts/fix-duplicate-packages.ps1 new file mode 100644 index 000000000..8578f8ed5 --- /dev/null +++ b/devops/scripts/fix-duplicate-packages.ps1 @@ -0,0 +1,100 @@ +#!/usr/bin/env pwsh +# fix-duplicate-packages.ps1 - Remove duplicate PackageReference items from test projects +# These are already provided by Directory.Build.props + +param([switch]$DryRun) + +$packagesToRemove = @( + "coverlet.collector", + "Microsoft.NET.Test.Sdk", + "Microsoft.AspNetCore.Mvc.Testing", + "xunit", + "xunit.runner.visualstudio", + "Microsoft.Extensions.TimeProvider.Testing" +) + +$sharpCompressPackage = "SharpCompress" + +# Find all test project files +$testProjects = Get-ChildItem -Path "src" -Filter "*.Tests.csproj" -Recurse +$corpusProjects = Get-ChildItem -Path "src" -Filter "*.Corpus.*.csproj" -Recurse + +Write-Host "=== Fix Duplicate Package References ===" -ForegroundColor Cyan +Write-Host "Found $($testProjects.Count) test projects" -ForegroundColor Yellow +Write-Host "Found $($corpusProjects.Count) corpus projects (SharpCompress)" -ForegroundColor Yellow + +$fixedCount = 0 + +foreach ($proj in $testProjects) { + $content = Get-Content $proj.FullName -Raw + $modified = $false + + # Skip projects that opt out of common test infrastructure + if ($content -match "\s*false\s*") { + Write-Host " Skipped (UseConcelierTestInfra=false): $($proj.Name)" -ForegroundColor DarkGray + continue + } + + foreach ($pkg in $packagesToRemove) { + # Match PackageReference for this package (various formats) + $patterns = @( + "(?s)\s*\r?\n?", + "(?s)\s*\s*\r?\n?" + ) + + foreach ($pattern in $patterns) { + if ($content -match $pattern) { + $content = $content -replace $pattern, "" + $modified = $true + } + } + } + + # Clean up empty ItemGroups + $content = $content -replace "(?s)\s*\s*", "" + # Clean up ItemGroups with only whitespace/comments + $content = $content -replace "(?s)\s*\s*", "" + + if ($modified) { + $fixedCount++ + Write-Host " Fixed: $($proj.Name)" -ForegroundColor Green + if (-not $DryRun) { + $content | Set-Content $proj.FullName -NoNewline + } + } +} + +# Fix SharpCompress in corpus projects +foreach ($proj in $corpusProjects) { + $content = Get-Content $proj.FullName -Raw + $modified = $false + + $patterns = @( + "(?s)\s*\r?\n?", + "(?s)\s*\s*\r?\n?" + ) + + foreach ($pattern in $patterns) { + if ($content -match $pattern) { + $content = $content -replace $pattern, "" + $modified = $true + } + } + + # Clean up empty ItemGroups + $content = $content -replace "(?s)\s*\s*", "" + + if ($modified) { + $fixedCount++ + Write-Host " Fixed: $($proj.Name)" -ForegroundColor Green + if (-not $DryRun) { + $content | Set-Content $proj.FullName -NoNewline + } + } +} + +Write-Host "" +Write-Host "Fixed $fixedCount projects" -ForegroundColor Cyan +if ($DryRun) { + Write-Host "(Dry run - no changes made)" -ForegroundColor Yellow +} diff --git a/devops/scripts/fix-duplicate-using-testkit.ps1 b/devops/scripts/fix-duplicate-using-testkit.ps1 new file mode 100644 index 000000000..8350032dc --- /dev/null +++ b/devops/scripts/fix-duplicate-using-testkit.ps1 @@ -0,0 +1,55 @@ +# Fix duplicate "using StellaOps.TestKit;" statements in C# files +# The pattern shows files have this statement both at top (correct) and in middle (wrong) +# This script removes all occurrences AFTER the first one + +$ErrorActionPreference = "Stop" + +$srcPath = Join-Path $PSScriptRoot "..\..\src" +$pattern = "using StellaOps.TestKit;" + +# Find all .cs files containing the pattern +$files = Get-ChildItem -Path $srcPath -Recurse -Filter "*.cs" | + Where-Object { (Get-Content $_.FullName -Raw) -match [regex]::Escape($pattern) } + +Write-Host "Found $($files.Count) files with 'using StellaOps.TestKit;'" -ForegroundColor Cyan + +$fixedCount = 0 +$errorCount = 0 + +foreach ($file in $files) { + try { + $lines = Get-Content $file.FullName + $newLines = @() + $foundFirst = $false + $removedAny = $false + + foreach ($line in $lines) { + if ($line.Trim() -eq $pattern) { + if (-not $foundFirst) { + # Keep the first occurrence + $newLines += $line + $foundFirst = $true + } else { + # Skip subsequent occurrences + $removedAny = $true + } + } else { + $newLines += $line + } + } + + if ($removedAny) { + $newLines | Set-Content -Path $file.FullName -Encoding UTF8 + Write-Host "Fixed: $($file.Name)" -ForegroundColor Green + $fixedCount++ + } + } catch { + Write-Host "Error processing $($file.FullName): $_" -ForegroundColor Red + $errorCount++ + } +} + +Write-Host "" +Write-Host "Summary:" -ForegroundColor Cyan +Write-Host " Files fixed: $fixedCount" -ForegroundColor Green +Write-Host " Errors: $errorCount" -ForegroundColor $(if ($errorCount -gt 0) { "Red" } else { "Green" }) diff --git a/devops/scripts/fix-sln-duplicates.ps1 b/devops/scripts/fix-sln-duplicates.ps1 new file mode 100644 index 000000000..c0dae4b5d --- /dev/null +++ b/devops/scripts/fix-sln-duplicates.ps1 @@ -0,0 +1,68 @@ +#!/usr/bin/env pwsh +# fix-sln-duplicates.ps1 - Remove duplicate project entries from solution file + +param( + [string]$SlnPath = "src/StellaOps.sln" +) + +$ErrorActionPreference = "Stop" + +Write-Host "=== Solution Duplicate Cleanup ===" -ForegroundColor Cyan +Write-Host "Solution: $SlnPath" + +$content = Get-Content $SlnPath -Raw +$lines = $content -split "`r?`n" + +# Track seen project names +$seenProjects = @{} +$duplicateGuids = @() +$newLines = @() +$skipNext = $false + +for ($i = 0; $i -lt $lines.Count; $i++) { + $line = $lines[$i] + + if ($skipNext) { + $skipNext = $false + continue + } + + # Check for project declaration + if ($line -match 'Project\(.+\) = "([^"]+)",.*\{([A-F0-9-]+)\}"?$') { + $name = $Matches[1] + $guid = $Matches[2] + + if ($seenProjects.ContainsKey($name)) { + Write-Host "Removing duplicate: $name ($guid)" -ForegroundColor Yellow + $duplicateGuids += $guid + # Skip this line and the next EndProject line + $skipNext = $true + continue + } else { + $seenProjects[$name] = $true + } + } + + $newLines += $line +} + +# Remove GlobalSection references to duplicate GUIDs +$finalLines = @() +foreach ($line in $newLines) { + $skip = $false + foreach ($guid in $duplicateGuids) { + if ($line -match $guid) { + $skip = $true + break + } + } + if (-not $skip) { + $finalLines += $line + } +} + +# Write back +$finalLines -join "`r`n" | Set-Content $SlnPath -Encoding UTF8 -NoNewline + +Write-Host "" +Write-Host "Removed $($duplicateGuids.Count) duplicate projects" -ForegroundColor Green diff --git a/devops/scripts/migrations-reset-pre-1.0.sql b/devops/scripts/migrations-reset-pre-1.0.sql new file mode 100644 index 000000000..642a992b6 --- /dev/null +++ b/devops/scripts/migrations-reset-pre-1.0.sql @@ -0,0 +1,190 @@ +-- ============================================================================ +-- StellaOps Migration Reset Script for Pre-1.0 Deployments +-- ============================================================================ +-- This script updates schema_migrations tables to recognize the 1.0.0 compacted +-- migrations for deployments that upgraded from pre-1.0 versions. +-- +-- Run via: psql -f migrations-reset-pre-1.0.sql +-- Or with connection: psql -h -U -d -f migrations-reset-pre-1.0.sql +-- ============================================================================ + +BEGIN; + +-- ============================================================================ +-- Authority Module Reset +-- ============================================================================ +-- Original: 001_initial_schema, 002_mongo_store_equivalents, 003_enable_rls, +-- 004_offline_kit_audit, 005_verdict_manifests +-- New: 001_initial_schema (compacted) + +DELETE FROM authority.schema_migrations +WHERE migration_name IN ( + '001_initial_schema.sql', + '002_mongo_store_equivalents.sql', + '003_enable_rls.sql', + '004_offline_kit_audit.sql', + '005_verdict_manifests.sql' +); + +INSERT INTO authority.schema_migrations (migration_name, category, checksum, applied_at) +VALUES ('001_initial_schema.sql', 'startup', 'compacted_1.0.0', NOW()) +ON CONFLICT (migration_name) DO NOTHING; + +-- ============================================================================ +-- Scheduler Module Reset +-- ============================================================================ +-- Original: 001_initial_schema, 002_graph_jobs, 003_runs_policy, +-- 010_generated_columns_runs, 011_enable_rls, 012_partition_audit, +-- 012b_migrate_audit_data +-- New: 001_initial_schema (compacted) + +DELETE FROM scheduler.schema_migrations +WHERE migration_name IN ( + '001_initial_schema.sql', + '002_graph_jobs.sql', + '003_runs_policy.sql', + '010_generated_columns_runs.sql', + '011_enable_rls.sql', + '012_partition_audit.sql', + '012b_migrate_audit_data.sql' +); + +INSERT INTO scheduler.schema_migrations (migration_name, category, checksum, applied_at) +VALUES ('001_initial_schema.sql', 'startup', 'compacted_1.0.0', NOW()) +ON CONFLICT (migration_name) DO NOTHING; + +-- ============================================================================ +-- Scanner Module Reset +-- ============================================================================ +-- Original: 001-034 plus various numbered files (27 total) +-- New: 001_initial_schema (compacted) + +DELETE FROM scanner.schema_migrations +WHERE migration_name IN ( + '001_create_tables.sql', + '002_proof_spine_tables.sql', + '003_classification_history.sql', + '004_scan_metrics.sql', + '005_smart_diff_tables.sql', + '006_score_replay_tables.sql', + '007_unknowns_ranking_containment.sql', + '008_epss_integration.sql', + '0059_scans_table.sql', + '0065_unknowns_table.sql', + '0075_scan_findings_table.sql', + '020_call_graph_tables.sql', + '021_smart_diff_tables_search_path.sql', + '022_reachability_drift_tables.sql', + '023_scanner_api_ingestion.sql', + '024_smart_diff_priority_score_widen.sql', + '025_epss_raw_layer.sql', + '026_epss_signal_layer.sql', + '027_witness_storage.sql', + '028_epss_triage_columns.sql', + '029_vuln_surfaces.sql', + '030_vuln_surface_triggers_update.sql', + '031_reach_cache.sql', + '032_idempotency_keys.sql', + '033_binary_evidence.sql', + '034_func_proof_tables.sql', + 'DM001_rename_scanner_migrations.sql' +); + +INSERT INTO scanner.schema_migrations (migration_name, category, checksum, applied_at) +VALUES ('001_initial_schema.sql', 'startup', 'compacted_1.0.0', NOW()) +ON CONFLICT (migration_name) DO NOTHING; + +-- ============================================================================ +-- Policy Module Reset +-- ============================================================================ +-- Original: 001-013 (14 files, includes duplicate 010 prefix) +-- New: 001_initial_schema (compacted) + +DELETE FROM policy.schema_migrations +WHERE migration_name IN ( + '001_initial_schema.sql', + '002_cvss_receipts.sql', + '003_snapshots_violations.sql', + '004_epss_risk_scores.sql', + '005_cvss_multiversion.sql', + '006_enable_rls.sql', + '007_unknowns_registry.sql', + '008_exception_objects.sql', + '009_exception_applications.sql', + '010_recheck_evidence.sql', + '010_unknowns_blast_radius_containment.sql', + '011_unknowns_reason_codes.sql', + '012_budget_ledger.sql', + '013_exception_approval.sql' +); + +INSERT INTO policy.schema_migrations (migration_name, category, checksum, applied_at) +VALUES ('001_initial_schema.sql', 'startup', 'compacted_1.0.0', NOW()) +ON CONFLICT (migration_name) DO NOTHING; + +-- ============================================================================ +-- Notify Module Reset +-- ============================================================================ +-- Original: 001_initial_schema, 010_enable_rls, 011_partition_deliveries, +-- 011b_migrate_deliveries_data +-- New: 001_initial_schema (compacted) + +DELETE FROM notify.schema_migrations +WHERE migration_name IN ( + '001_initial_schema.sql', + '010_enable_rls.sql', + '011_partition_deliveries.sql', + '011b_migrate_deliveries_data.sql' +); + +INSERT INTO notify.schema_migrations (migration_name, category, checksum, applied_at) +VALUES ('001_initial_schema.sql', 'startup', 'compacted_1.0.0', NOW()) +ON CONFLICT (migration_name) DO NOTHING; + +-- ============================================================================ +-- Concelier Module Reset +-- ============================================================================ +-- Original: 17 migration files +-- New: 001_initial_schema (compacted) + +DELETE FROM concelier.schema_migrations +WHERE migration_name ~ '^[0-9]{3}_.*\.sql$'; + +INSERT INTO concelier.schema_migrations (migration_name, category, checksum, applied_at) +VALUES ('001_initial_schema.sql', 'startup', 'compacted_1.0.0', NOW()) +ON CONFLICT (migration_name) DO NOTHING; + +-- ============================================================================ +-- Verification +-- ============================================================================ +-- Display current migration status per module + +DO $$ +DECLARE + v_module TEXT; + v_count INT; +BEGIN + FOR v_module IN SELECT unnest(ARRAY['authority', 'scheduler', 'scanner', 'policy', 'notify', 'concelier']) LOOP + EXECUTE format('SELECT COUNT(*) FROM %I.schema_migrations', v_module) INTO v_count; + RAISE NOTICE '% module: % migrations registered', v_module, v_count; + END LOOP; +END $$; + +COMMIT; + +-- ============================================================================ +-- Post-Reset Notes +-- ============================================================================ +-- After running this script: +-- 1. All modules should show exactly 1 migration registered +-- 2. The schema structure should be identical to a fresh 1.0.0 deployment +-- 3. Future migrations (002+) will apply normally +-- +-- To verify manually: +-- SELECT * FROM authority.schema_migrations; +-- SELECT * FROM scheduler.schema_migrations; +-- SELECT * FROM scanner.schema_migrations; +-- SELECT * FROM policy.schema_migrations; +-- SELECT * FROM notify.schema_migrations; +-- SELECT * FROM concelier.schema_migrations; +-- ============================================================================ diff --git a/devops/scripts/regenerate-solution.ps1 b/devops/scripts/regenerate-solution.ps1 new file mode 100644 index 000000000..c8f4eb4f9 --- /dev/null +++ b/devops/scripts/regenerate-solution.ps1 @@ -0,0 +1,169 @@ +#!/usr/bin/env pwsh +# regenerate-solution.ps1 - Regenerate StellaOps.sln without duplicate projects +# +# This script: +# 1. Backs up the existing solution +# 2. Creates a new solution +# 3. Adds all .csproj files, skipping duplicates +# 4. Preserves solution folders where possible + +param( + [string]$SolutionPath = "src/StellaOps.sln", + [switch]$DryRun +) + +$ErrorActionPreference = "Stop" + +# Canonical locations for test projects (in priority order) +# Later entries win when there are duplicates +$canonicalPatterns = @( + # Module-local tests (highest priority) + "src/*/__Tests/*/*.csproj", + "src/*/__Libraries/__Tests/*/*.csproj", + "src/__Libraries/__Tests/*/*.csproj", + # Cross-module integration tests + "src/__Tests/Integration/*/*.csproj", + "src/__Tests/__Libraries/*/*.csproj", + # Category-based cross-module tests + "src/__Tests/chaos/*/*.csproj", + "src/__Tests/security/*/*.csproj", + "src/__Tests/interop/*/*.csproj", + "src/__Tests/parity/*/*.csproj", + "src/__Tests/reachability/*/*.csproj", + # Single global tests + "src/__Tests/*/*.csproj" +) + +Write-Host "=== Solution Regeneration Script ===" -ForegroundColor Cyan +Write-Host "Solution: $SolutionPath" +Write-Host "Dry Run: $DryRun" +Write-Host "" + +# Find all .csproj files +Write-Host "Finding all project files..." -ForegroundColor Yellow +$allProjects = Get-ChildItem -Path "src" -Filter "*.csproj" -Recurse | + Where-Object { $_.FullName -notmatch "\\obj\\" -and $_.FullName -notmatch "\\bin\\" } + +Write-Host "Found $($allProjects.Count) project files" + +# Build a map of project name -> list of paths +$projectMap = @{} +foreach ($proj in $allProjects) { + $name = $proj.BaseName + if (-not $projectMap.ContainsKey($name)) { + $projectMap[$name] = @() + } + $projectMap[$name] += $proj.FullName +} + +# Find duplicates +$duplicates = $projectMap.GetEnumerator() | Where-Object { $_.Value.Count -gt 1 } +Write-Host "" +Write-Host "Found $($duplicates.Count) projects with duplicate names:" -ForegroundColor Yellow +foreach ($dup in $duplicates) { + Write-Host " $($dup.Key):" -ForegroundColor Red + foreach ($path in $dup.Value) { + Write-Host " - $path" + } +} + +# Select canonical path for each project +function Get-CanonicalPath { + param([string[]]$Paths) + + # Prefer module-local __Tests over global __Tests + $moduleTests = $Paths | Where-Object { $_ -match "src\\[^_][^\\]+\\__Tests\\" } + if ($moduleTests.Count -gt 0) { return $moduleTests[0] } + + # Prefer __Libraries/__Tests + $libTests = $Paths | Where-Object { $_ -match "__Libraries\\__Tests\\" } + if ($libTests.Count -gt 0) { return $libTests[0] } + + # Prefer __Tests over non-__Tests location in same parent + $testsPath = $Paths | Where-Object { $_ -match "\\__Tests\\" } + if ($testsPath.Count -gt 0) { return $testsPath[0] } + + # Otherwise, take first + return $Paths[0] +} + +# Build final project list +$finalProjects = @() +foreach ($entry in $projectMap.GetEnumerator()) { + $canonical = Get-CanonicalPath -Paths $entry.Value + $finalProjects += $canonical +} + +Write-Host "" +Write-Host "Final project count: $($finalProjects.Count)" -ForegroundColor Green + +if ($DryRun) { + Write-Host "" + Write-Host "=== DRY RUN - No changes made ===" -ForegroundColor Magenta + Write-Host "Would add the following projects to solution:" + $finalProjects | ForEach-Object { Write-Host " $_" } + exit 0 +} + +# Backup existing solution +$backupPath = "$SolutionPath.bak" +if (Test-Path $SolutionPath) { + Copy-Item $SolutionPath $backupPath -Force + Write-Host "Backed up existing solution to $backupPath" -ForegroundColor Gray +} + +# Create new solution +Write-Host "" +Write-Host "Creating new solution..." -ForegroundColor Yellow +$slnDir = Split-Path $SolutionPath -Parent +$slnName = [System.IO.Path]::GetFileNameWithoutExtension($SolutionPath) + +# Remove old solution +if (Test-Path $SolutionPath) { + Remove-Item $SolutionPath -Force +} + +# Create fresh solution +Push-Location $slnDir +dotnet new sln -n $slnName --force 2>$null +Pop-Location + +# Add projects in batches (dotnet sln add can handle multiple) +Write-Host "Adding projects to solution..." -ForegroundColor Yellow +$added = 0 +$failed = 0 + +foreach ($proj in $finalProjects) { + try { + $result = dotnet sln $SolutionPath add $proj 2>&1 + if ($LASTEXITCODE -eq 0) { + $added++ + if ($added % 50 -eq 0) { + Write-Host " Added $added projects..." -ForegroundColor Gray + } + } else { + Write-Host " Failed to add: $proj" -ForegroundColor Red + $failed++ + } + } catch { + Write-Host " Error adding: $proj - $_" -ForegroundColor Red + $failed++ + } +} + +Write-Host "" +Write-Host "=== Summary ===" -ForegroundColor Cyan +Write-Host "Projects added: $added" -ForegroundColor Green +Write-Host "Projects failed: $failed" -ForegroundColor $(if ($failed -gt 0) { "Red" } else { "Green" }) +Write-Host "" +Write-Host "Solution regenerated at: $SolutionPath" + +# Verify +Write-Host "" +Write-Host "Verifying solution..." -ForegroundColor Yellow +$verifyResult = dotnet build $SolutionPath --no-restore -t:ValidateSolutionConfiguration 2>&1 +if ($LASTEXITCODE -eq 0) { + Write-Host "Solution validation passed!" -ForegroundColor Green +} else { + Write-Host "Solution validation had issues - check manually" -ForegroundColor Yellow +} diff --git a/devops/scripts/remove-stale-refs.ps1 b/devops/scripts/remove-stale-refs.ps1 new file mode 100644 index 000000000..1b1a9f1a5 --- /dev/null +++ b/devops/scripts/remove-stale-refs.ps1 @@ -0,0 +1,70 @@ +#!/usr/bin/env pwsh +# remove-stale-refs.ps1 - Remove stale project references that don't exist + +param([string]$SlnPath = "src/StellaOps.sln") + +$content = Get-Content $SlnPath -Raw +$lines = $content -split "`r?`n" + +# Stale project paths (relative from solution location) +$staleProjects = @( + "__Tests\AirGap\StellaOps.AirGap.Controller.Tests", + "__Tests\AirGap\StellaOps.AirGap.Importer.Tests", + "__Tests\AirGap\StellaOps.AirGap.Time.Tests", + "__Tests\StellaOps.Gateway.WebService.Tests", + "__Tests\Graph\StellaOps.Graph.Indexer.Tests", + "Scanner\StellaOps.Scanner.Analyzers.Native", + "__Libraries\__Tests\StellaOps.Signals.Tests", + "__Tests\StellaOps.Audit.ReplayToken.Tests", + "__Tests\StellaOps.Router.Gateway.Tests", + "__Libraries\StellaOps.Cryptography" +) + +$staleGuids = @() +$newLines = @() +$skipNext = $false + +for ($i = 0; $i -lt $lines.Count; $i++) { + $line = $lines[$i] + + if ($skipNext) { + $skipNext = $false + continue + } + + $isStale = $false + foreach ($stalePath in $staleProjects) { + if ($line -like "*$stalePath*") { + # Extract GUID + if ($line -match '\{([A-F0-9-]+)\}"?$') { + $staleGuids += $Matches[1] + } + Write-Host "Removing stale: $stalePath" + $isStale = $true + $skipNext = $true + break + } + } + + if (-not $isStale) { + $newLines += $line + } +} + +# Remove GlobalSection references to stale GUIDs +$finalLines = @() +foreach ($line in $newLines) { + $skip = $false + foreach ($guid in $staleGuids) { + if ($line -match $guid) { + $skip = $true + break + } + } + if (-not $skip) { + $finalLines += $line + } +} + +$finalLines -join "`r`n" | Set-Content $SlnPath -Encoding UTF8 -NoNewline +Write-Host "Removed $($staleGuids.Count) stale project references" diff --git a/docs/db/MIGRATION_CONVENTIONS.md b/docs/db/MIGRATION_CONVENTIONS.md new file mode 100644 index 000000000..971981644 --- /dev/null +++ b/docs/db/MIGRATION_CONVENTIONS.md @@ -0,0 +1,305 @@ +# Migration Conventions + +This document defines the standard conventions for database migrations in StellaOps. + +## File Naming + +All migration files must follow the naming pattern: + +``` +NNN_description.sql # Standard migrations (001-099 startup, 100+ release) +SNNN_description.sql # Seed migrations (reference data) +DMNNN_description.sql # Data migrations (batched, background) +``` + +Where: +- `NNN` = 3-digit zero-padded number (001, 002, ..., 099, 100) +- `description` = lowercase letters, numbers, and underscores only +- Extension = `.sql` + +### Examples + +``` +001_create_tables.sql ✓ Correct (startup) +002_add_indexes.sql ✓ Correct (startup) +100_drop_legacy_column.sql ✓ Correct (release) +S001_seed_default_roles.sql ✓ Correct (seed) +DM001_backfill_tenant_ids.sql ✓ Correct (data migration) + +0059_scans_table.sql ✗ Wrong (4-digit prefix) +V1102_001__schema.sql ✗ Wrong (Flyway-style) +20251214_AddSchema.sql ✗ Wrong (EF Core timestamp) +create-tables.sql ✗ Wrong (no numeric prefix) +``` + +### Migration Categories + +| Category | Prefix | Execution | Breaking Changes | +|----------|--------|-----------|------------------| +| Startup | 001-099 | Automatic at application boot | Never | +| Release | 100-199 | Manual via CLI before deployment | Yes | +| Seed | S001-S999 | Automatic at application boot | Never | +| Data | DM001-DM999 | Background job via CLI | Varies | + +## File Organization + +Each module should place migrations in a standard location: + +``` +src//__Libraries/StellaOps..Storage.Postgres/Migrations/ +``` + +Alternative paths for specialized modules: + +``` +src//__Libraries/StellaOps..Persistence/Migrations/ +src//StellaOps./StellaOps..Infrastructure/Db/Migrations/ +``` + +### Embedded Resources + +Migration files must be embedded in the assembly for air-gap compatibility: + +```xml + + + +``` + +## WebService Ownership + +Each database schema is owned by exactly one WebService: + +| Schema | Owner WebService | Notes | +|--------|------------------|-------| +| `auth` | Authority.WebService | | +| `vuln` | Concelier.WebService | | +| `vex` | Excititor.WebService | | +| `policy` | Policy.Gateway | | +| `scheduler` | Scheduler.WebService | | +| `notify` | Notify.WebService | | +| `scanner` | Scanner.WebService | Also owns `binaries` | +| `proofchain` | Attestor.WebService | | +| `signer` | Signer.WebService | | +| `signals` | Signals | Standalone service | +| `evidence` | EvidenceLocker.WebService | | +| `export` | ExportCenter.WebService | | +| `issuer` | IssuerDirectory.WebService | | +| `orchestrator` | Orchestrator.WebService | | +| `findings` | Findings.Ledger.WebService | | +| `vexhub` | VexHub.WebService | | +| `unknowns` | Policy.Gateway | Shared ownership | + +### Registration Pattern + +Each WebService registers its migrations in `Program.cs` or a startup extension: + +```csharp +// Example: Scheduler.WebService/Program.cs +builder.Services.AddStartupMigrations( + schemaName: "scheduler", + moduleName: "Scheduler", + migrationsAssembly: typeof(StellaOps.Scheduler.Storage.Postgres.Marker).Assembly, + connectionStringSelector: options => options.Postgres.ConnectionString); +``` + +### No Shared Migrations + +Migrations must NOT be shared across WebServices: +- Each WebService controls its own schema exclusively +- Cross-schema dependencies use conditional DDL (`IF EXISTS`) +- API calls are used for runtime cross-module data access + +## Migration Content Guidelines + +### Startup Migrations (001-099) + +- Must complete in under 60 seconds +- Must be idempotent (use `IF NOT EXISTS`, `CREATE OR REPLACE`) +- Must NOT drop tables, columns, or constraints +- Must NOT TRUNCATE data +- Must NOT add NOT NULL columns without defaults + +```sql +-- Good: Idempotent table creation +CREATE TABLE IF NOT EXISTS scanner.scans ( + scan_id UUID PRIMARY KEY, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Good: Safe index creation +CREATE INDEX IF NOT EXISTS idx_scans_created + ON scanner.scans(created_at DESC); + +-- Bad: Non-idempotent (will fail if exists) +CREATE TABLE scanner.scans (...); + +-- Bad: Breaking change in startup migration +ALTER TABLE scanner.scans DROP COLUMN legacy_field; +``` + +### Release Migrations (100-199) + +- May contain breaking changes +- Require manual execution before deployment +- Should be tested in staging environment first +- Block application startup if pending + +```sql +-- Release migration for breaking change +-- 100_remove_legacy_columns.sql + +-- Step 1: Add replacement column (could be startup migration) +ALTER TABLE scanner.scans + ADD COLUMN IF NOT EXISTS new_field TEXT; + +-- Step 2: Migrate data (requires release migration) +UPDATE scanner.scans +SET new_field = legacy_field +WHERE new_field IS NULL; + +-- Step 3: Drop old column (breaking) +ALTER TABLE scanner.scans +DROP COLUMN IF EXISTS legacy_field; +``` + +### Seed Migrations (S001-S999) + +- Insert reference data that rarely changes +- Use `ON CONFLICT DO NOTHING` for idempotency +- Run automatically at startup + +```sql +-- S001_seed_vulnerability_severities.sql +INSERT INTO policy.severities (severity_id, name, score_min, score_max) +VALUES + ('critical', 'Critical', 9.0, 10.0), + ('high', 'High', 7.0, 8.9), + ('medium', 'Medium', 4.0, 6.9), + ('low', 'Low', 0.1, 3.9), + ('none', 'None', 0.0, 0.0) +ON CONFLICT (severity_id) DO NOTHING; +``` + +### Data Migrations (DM001-DM999) + +- Long-running data transformations +- Execute in batches to avoid locks +- Run via CLI or background job + +```sql +-- DM001_backfill_tenant_ids.sql +-- Backfill tenant_id for existing records (batched) + +DO $$ +DECLARE + batch_size INT := 1000; + updated INT := 1; +BEGIN + WHILE updated > 0 LOOP + WITH batch AS ( + SELECT scan_id + FROM scanner.scans + WHERE tenant_id IS NULL + LIMIT batch_size + FOR UPDATE SKIP LOCKED + ) + UPDATE scanner.scans s + SET tenant_id = '00000000-0000-0000-0000-000000000000'::UUID + FROM batch b + WHERE s.scan_id = b.scan_id; + + GET DIAGNOSTICS updated = ROW_COUNT; + COMMIT; + PERFORM pg_sleep(0.1); -- Rate limit + END LOOP; +END $$; +``` + +## Validation + +Migrations are validated at startup and in CI: + +1. **Duplicate prefix detection**: Multiple files with same number → Error +2. **Naming convention check**: Non-standard naming → Warning +3. **Checksum validation**: Modified applied migrations → Error +4. **Dangerous operation check**: DROP in startup migration → Error + +### CI Validation + +Run migration validation in CI pipelines: + +```bash +.gitea/scripts/validate/validate-migrations.sh +``` + +Or with strict mode (fail on warnings): + +```bash +.gitea/scripts/validate/validate-migrations.sh --strict +``` + +## Rollback Strategy + +StellaOps uses a **forward-only migration strategy**: + +- Migrations cannot be rolled back automatically +- To fix a bad migration, create a new migration that undoes the changes +- In emergencies, restore from database backup + +### Emergency Rollback + +1. Restore database from backup (pre-migration) +2. Deploy previous application version +3. Analyze and fix the migration issue +4. Create corrective migration +5. Deploy new version with fix + +## Testing + +### Integration Tests + +Use `PostgresIntegrationFixture` with Testcontainers: + +```csharp +[Collection(ScannerPostgresCollection.Name)] +public class ScanRepositoryTests : MigrationTestBase +{ + public ScanRepositoryTests(ScannerPostgresFixture fixture) : base(fixture) { } + + [Fact] + public async Task Should_Insert_Scan() + { + // Database is clean (truncated) before each test + await ExecuteSqlAsync("INSERT INTO scanner.scans ..."); + } +} +``` + +### Migration Tests + +Test that migrations apply correctly: + +```csharp +[Fact] +public async Task All_Migrations_Apply_Without_Error() +{ + var status = await _fixture.Fixture.GetMigrationStatusAsync(); + Assert.Empty(status.ChecksumErrors); + Assert.True(status.IsUpToDate); +} +``` + +## Monitoring + +OpenTelemetry metrics for migrations: + +| Metric | Type | Description | +|--------|------|-------------| +| `stellaops.migrations.applied.total` | Counter | Migrations applied | +| `stellaops.migrations.failed.total` | Counter | Migration failures | +| `stellaops.migrations.duration.seconds` | Histogram | Execution duration | +| `stellaops.migrations.lock.wait.seconds` | Histogram | Lock wait time | +| `stellaops.migrations.pending.count` | UpDownCounter | Pending migrations | + +Traces are emitted with activity source: `StellaOps.Infrastructure.Postgres.Migrations` diff --git a/docs/db/MIGRATION_STRATEGY.md b/docs/db/MIGRATION_STRATEGY.md index 17354100d..25558c817 100644 --- a/docs/db/MIGRATION_STRATEGY.md +++ b/docs/db/MIGRATION_STRATEGY.md @@ -223,14 +223,61 @@ CREATE INDEX IF NOT EXISTS idx_schema_migrations_applied_at ## Module-Specific Schemas -| Module | Schema | Lock Key | Tables | -|--------|--------|----------|--------| -| Authority | `auth` | `hashtext('auth')` | tenants, users, roles, tokens, sessions | -| Scheduler | `scheduler` | `hashtext('scheduler')` | jobs, triggers, workers, locks | -| Concelier | `vuln` | `hashtext('vuln')` | advisories, affected, aliases, sources | -| Policy | `policy` | `hashtext('policy')` | packs, versions, rules, evaluations | -| Notify | `notify` | `hashtext('notify')` | templates, channels, deliveries | -| Excititor | `vex` | `hashtext('vex')` | statements, documents, products | +Each module owns its database schema and controls its migrations independently. +The owning WebService runs migrations automatically at startup. + +| Module | Schema | Owner WebService | Migration Style | +|--------|--------|------------------|-----------------| +| Authority | `auth` | Authority.WebService | Standard (NNN_) | +| Concelier | `vuln` | Concelier.WebService | Standard (NNN_) | +| Excititor | `vex` | Excititor.WebService | Standard (NNN_) | +| Policy | `policy` | Policy.Gateway | Standard (NNN_) | +| Scheduler | `scheduler` | Scheduler.WebService | Standard (NNN_) | +| Notify | `notify` | Notify.WebService | Standard (NNN_) | +| Scanner | `scanner` | Scanner.WebService | Standard (NNN_) | +| Attestor | `proofchain` | Attestor.WebService | EF Core + SQL | +| Signer | `signer` | Signer.WebService | EF Core + SQL | +| Signals | `signals` | Signals | Flyway-style | +| EvidenceLocker | `evidence` | EvidenceLocker.WebService | Standard (NNN_) | +| ExportCenter | `export` | ExportCenter.WebService | Standard (NNN_) | +| IssuerDirectory | `issuer` | IssuerDirectory.WebService | Standard (NNN_) | +| Orchestrator | `orchestrator` | Orchestrator.WebService | Standard (NNN_) | +| Findings | `findings` | Findings.Ledger.WebService | Standard (NNN_) | +| VexHub | `vexhub` | VexHub.WebService | Standard (NNN_) | +| BinaryIndex | `binaries` | Scanner.WebService | EF Core | +| Unknowns | `unknowns` | Policy.Gateway | Standard (NNN_) | + +### Lock Key Computation + +Advisory lock keys are computed using a deterministic algorithm with a magic prefix +to avoid collisions with other lock users: + +```csharp +// High 32 bits: Magic prefix "Stel" (0x5374656C) +// Low 32 bits: SHA256(schema_name)[0..4] +long lockKey = (0x5374656C << 32) | SHA256(schema.ToLower())[0..4]; +``` + +### Cross-Module Dependencies + +Some modules have soft dependencies on other schemas. These are handled with +conditional DDL (e.g., `IF EXISTS`) to allow independent deployment: + +| Module | Depends On | Type | Description | +|--------|------------|------|-------------| +| Signer | Attestor | Soft | Optional FK to proofchain.trust_anchors | +| Scanner | Concelier | Soft | Uses advisory linksets via API | +| Policy | Concelier | Soft | Uses vulnerability data via API | +| Policy | Excititor | Soft | Uses VEX data via API | + +### Migration Validation + +At startup, migrations are validated for: + +1. **Duplicate prefixes**: Multiple files with same number (e.g., two 009_.sql files) → ERROR +2. **Non-standard naming**: Files not matching `NNN_description.sql` pattern → WARNING +3. **Checksum mismatches**: Modified migration files → ERROR +4. **Pending release migrations**: Category B migrations require manual execution → BLOCKS ## Release Workflow diff --git a/docs/implplan/SPRINT_20251226_015_AI_zastava_companion.md b/docs/implplan/SPRINT_20251226_015_AI_zastava_companion.md index 67c20f4a6..8999afd24 100644 --- a/docs/implplan/SPRINT_20251226_015_AI_zastava_companion.md +++ b/docs/implplan/SPRINT_20251226_015_AI_zastava_companion.md @@ -71,6 +71,7 @@ This sprint extends AdvisoryAI with explanation generation and attestation. | 2025-12-26 | ZASTAVA-20: Created ExplanationReplayGoldenTests.cs verifying deterministic replay produces identical output. | Claude Code | | 2025-12-26 | ZASTAVA-21: Created docs/modules/advisory-ai/guides/explanation-api.md documenting explanation types, API endpoints, attestation format (DSSE), replay semantics, evidence types, authority classification, and 3-line summary format. | Claude Code | | 2025-12-26 | ZASTAVA-15 to ZASTAVA-18: Created Angular 17 standalone components: `explain-button.component.ts` (triggers explanation with loading state), `explanation-panel.component.ts` (3-line summary, citations, confidence, authority badge), `evidence-drilldown.component.ts` (citation detail expansion with verification status), `plain-language-toggle.component.ts` (jargon toggle switch). Extended `advisory-ai.models.ts` with TypeScript interfaces. | Claude Code | +| 2025-12-26 | Sprint completed - all 21 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | ## Decisions & Risks - Decision needed: LLM model for explanations (Claude/GPT-4/Llama). Recommend: configurable, default to Claude for quality. diff --git a/docs/implplan/SPRINT_20251226_016_AI_remedy_autopilot.md b/docs/implplan/SPRINT_20251226_016_AI_remedy_autopilot.md index c8cb82086..a46f44e47 100644 --- a/docs/implplan/SPRINT_20251226_016_AI_remedy_autopilot.md +++ b/docs/implplan/SPRINT_20251226_016_AI_remedy_autopilot.md @@ -75,6 +75,7 @@ This sprint extends the system with AI-generated remediation plans and automated | 2025-12-26 | REMEDY-09, REMEDY-10, REMEDY-11, REMEDY-12: Refactored to unified plugin architecture. Created `ScmConnector/` with: `IScmConnectorPlugin` interface, `IScmConnector` operations, `ScmConnectorBase` shared HTTP/JSON handling. Implemented all four connectors: `GitHubScmConnector` (Bearer token, check-runs), `GitLabScmConnector` (PRIVATE-TOKEN, pipelines/jobs), `AzureDevOpsScmConnector` (Basic PAT auth, Azure Pipelines builds), `GiteaScmConnector` (token auth, Gitea Actions). `ScmConnectorCatalog` provides factory pattern with auto-detection from repository URL. DI registration via `AddScmConnectors()`. All connectors share: branch creation, file update, PR create/update/close, CI status polling, comment addition. | Claude Code | | 2025-12-26 | REMEDY-26: Created `etc/scm-connectors.yaml.sample` with comprehensive configuration for all four connectors (GitHub, GitLab, Azure DevOps, Gitea) including auth, rate limiting, retry, PR settings, CI polling, security, and telemetry. Created `docs/modules/advisory-ai/guides/scm-connector-plugins.md` documenting plugin architecture, interfaces, configuration, usage examples, CI state mapping, URL auto-detection, custom plugin creation, error handling, and security considerations. | Claude Code | | 2025-12-26 | REMEDY-22 to REMEDY-24: Created Angular 17 standalone components: `autofix-button.component.ts` (strategy dropdown: upgrade/patch/workaround), `remediation-plan-preview.component.ts` (step-by-step plan with risk assessment, code diffs, impact analysis), `pr-tracker.component.ts` (PR status, CI checks, review status, timeline). Extended `advisory-ai.models.ts` with RemediationPlan, RemediationStep, PullRequestInfo interfaces. | Claude Code | +| 2025-12-26 | Sprint completed - all 26 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | ## Decisions & Risks - Decision needed: SCM authentication (OAuth, PAT, GitHub App). Recommend: OAuth for UI, PAT for CLI, GitHub App for org-wide. diff --git a/docs/implplan/SPRINT_20251226_017_AI_policy_copilot.md b/docs/implplan/SPRINT_20251226_017_AI_policy_copilot.md index 57669d5cc..04de217be 100644 --- a/docs/implplan/SPRINT_20251226_017_AI_policy_copilot.md +++ b/docs/implplan/SPRINT_20251226_017_AI_policy_copilot.md @@ -73,6 +73,7 @@ This sprint adds NL→rule conversion, test synthesis, and an interactive policy | 2025-12-26 | POLICY-25: Created PolicyStudioIntegrationTests.cs with NL→Intent→Rule round-trip tests, conflict detection, and test case synthesis coverage. | Claude Code | | 2025-12-26 | POLICY-26: Created docs/modules/advisory-ai/guides/policy-studio-api.md documenting Policy Studio API (parse/generate/validate/compile), intent types, K4 lattice rule syntax, condition fields/operators, test case format, policy bundle format, and CLI commands. | Claude Code | | 2025-12-26 | POLICY-20 to POLICY-24: Created Angular 17 standalone components in `policy-studio/`: `policy-nl-input.component.ts` (NL input with autocomplete, example statements, clarifying questions), `live-rule-preview.component.ts` (generated rules with syntax highlighting, K4 atom badges), `test-case-panel.component.ts` (test case display with filtering, manual test creation, run with progress), `conflict-visualizer.component.ts` (validation results, resolution suggestions, coverage metrics), `version-history.component.ts` (timeline view, version comparison, restore actions). Extended `advisory-ai.models.ts` with PolicyIntent, GeneratedRule, PolicyTestCase, RuleConflict, PolicyVersion interfaces. | Claude Code | +| 2025-12-26 | Sprint completed - all 26 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | ## Decisions & Risks - Decision needed: Policy DSL format (YAML, JSON, custom syntax). Recommend: YAML for readability, JSON for API. diff --git a/docs/implplan/SPRINT_20251226_018_AI_attestations.md b/docs/implplan/SPRINT_20251226_018_AI_attestations.md index 359a8ecf7..b4fddfdd6 100644 --- a/docs/implplan/SPRINT_20251226_018_AI_attestations.md +++ b/docs/implplan/SPRINT_20251226_018_AI_attestations.md @@ -73,6 +73,7 @@ This sprint adds AI-specific predicate types with replay metadata. | 2025-12-26 | AIATTEST-22: Created AIAuthorityClassifierTests.cs with comprehensive test coverage | Claude | | 2025-12-26 | AIATTEST-21: Created AIArtifactVerificationStep.cs implementing IVerificationStep for AI artifact verification in VerificationPipeline | Claude Code | | 2025-12-26 | AIATTEST-23: Created docs/modules/advisory-ai/guides/ai-attestations.md documenting attestation schemas, authority classification (ai-generated, ai-draft-requires-review, ai-suggestion, ai-verified, human-approved), DSSE envelope format, replay manifest structure, divergence detection, and integration with VEX. | Claude Code | +| 2025-12-26 | Sprint completed - all 23 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | ## Decisions & Risks - Decision needed: Model digest format (SHA-256 of weights, version string, provider+model). Recommend: provider:model:version for cloud, SHA-256 for local. diff --git a/docs/implplan/SPRINT_20251226_019_AI_offline_inference.md b/docs/implplan/SPRINT_20251226_019_AI_offline_inference.md index 4e85df2b9..f922f88b7 100644 --- a/docs/implplan/SPRINT_20251226_019_AI_offline_inference.md +++ b/docs/implplan/SPRINT_20251226_019_AI_offline_inference.md @@ -78,6 +78,7 @@ This sprint extends the local inference stub to full local LLM execution with of | 2025-12-26 | OFFLINE-20: Implemented LlmBenchmark.cs with warmup, latency (mean/median/p95/p99/TTFT), throughput (tokens/sec, requests/min), and resource metrics. BenchmarkProgress for real-time reporting. | Claude Code | | 2025-12-26 | OFFLINE-23, OFFLINE-26: Created docs/modules/advisory-ai/guides/offline-model-bundles.md documenting bundle format, manifest schema, transfer workflow (export/verify/import), CLI commands (stella model list/pull/verify/import/info/remove), configuration, hardware requirements, signing with DSSE, regional crypto support, determinism settings, and troubleshooting. | Claude Code | | 2025-12-26 | LLM Provider Plugin Documentation: Created `etc/llm-providers/` sample configs for all 4 providers (openai.yaml, claude.yaml, llama-server.yaml, ollama.yaml). Created `docs/modules/advisory-ai/guides/llm-provider-plugins.md` documenting plugin architecture, interfaces, configuration, provider details, priority system, determinism requirements, offline/airgap deployment, custom plugins, telemetry, performance comparison, and troubleshooting. | Claude Code | +| 2025-12-26 | Sprint completed - all 26 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | ## Decisions & Risks - **Decision (OFFLINE-07)**: Use HTTP API to llama.cpp server instead of native bindings. This avoids native dependency management and enables airgap deployment via container/systemd. diff --git a/docs/implplan/SPRINT_20251226_020_FE_ai_ux_patterns.md b/docs/implplan/SPRINT_20251226_020_FE_ai_ux_patterns.md index b94d64ba7..ad326a950 100644 --- a/docs/implplan/SPRINT_20251226_020_FE_ai_ux_patterns.md +++ b/docs/implplan/SPRINT_20251226_020_FE_ai_ux_patterns.md @@ -245,6 +245,7 @@ export class AiSummaryComponent { | 2025-12-26 | AIUX-30/31/32/33/34: Created `features/settings/ai-preferences.component.ts` with verbosity (Minimal/Standard/Detailed), surface toggles (UI/PR comments/notifications), per-team notification opt-in, save/reset actions. | Claude Code | | 2025-12-26 | AIUX-35/36/37/38: Created `features/dashboard/ai-risk-drivers.component.ts` with Top 3 risk drivers (evidence-linked), Top 3 bottlenecks (actionable), deterministic risk/noise trends. | Claude Code | | 2025-12-26 | AIUX-43/44: Created `docs/modules/web/ai-ux-patterns.md` with comprehensive documentation: core principles (7 non-negotiables), component library, 3-panel layout spec, chip display rules, Ask Stella command bar, user preferences, dashboard integration, testing requirements. | Claude Code | +| 2025-12-26 | Sprint completed - all 44 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | ## Decisions & Risks - Decision: 3-line hard limit vs soft limit? Recommend: hard limit; expandable for more. diff --git a/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_015_AI_zastava_companion.md b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_015_AI_zastava_companion.md new file mode 100644 index 000000000..8999afd24 --- /dev/null +++ b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_015_AI_zastava_companion.md @@ -0,0 +1,85 @@ +# Sprint 20251226 · Zastava Companion (Evidence-Grounded Explainability) + +## Topic & Scope +- Build AI-powered explanation service that answers "What is it?", "Why it matters here?", "What evidence supports exploitability?" +- All explanations must be anchored to evidence nodes (SBOM, reachability, runtime, VEX, patches) +- Produce OCI-attached "Explanation Attestation" with inputs' hashes + model digest for replayability +- **Working directory:** `src/AdvisoryAI/`, `src/Attestor/`, `src/Web/` + +## Dependencies & Concurrency +- Depends on: Existing AdvisoryAI pipeline infrastructure (COMPLETE). +- Depends on: ProofChain library for attestation generation (COMPLETE). +- Can run in parallel with: SPRINT_20251226_016_AI_remedy_autopilot. + +## Documentation Prerequisites +- `src/AdvisoryAI/AGENTS.md` +- `docs/modules/attestor/proof-chain-specification.md` +- AI Assistant Advisory (this sprint's source) + +## Context: What Already Exists + +The following components are **already implemented**: + +| Component | Location | Status | +|-----------|----------|--------| +| Pipeline Orchestrator | `AdvisoryAI/Orchestration/AdvisoryPipelineOrchestrator.cs` | COMPLETE | +| Guardrail Pipeline | `AdvisoryAI/Guardrails/AdvisoryGuardrailPipeline.cs` | COMPLETE | +| Inference Client | `AdvisoryAI/Inference/AdvisoryInferenceClient.cs` | COMPLETE | +| SBOM Context Retrieval | `AdvisoryAI/Retrievers/SbomContextRetriever.cs` | COMPLETE | +| Vector Retrieval | `AdvisoryAI/Retrievers/AdvisoryVectorRetriever.cs` | COMPLETE | +| Structured Retrieval | `AdvisoryAI/Retrievers/AdvisoryStructuredRetriever.cs` | COMPLETE | +| Citation Enforcement | `AdvisoryGuardrailPipeline` (RequireCitations) | COMPLETE | +| Proof Bundle Generation | `Policy/TrustLattice/ProofBundleBuilder.cs` | COMPLETE | + +This sprint extends AdvisoryAI with explanation generation and attestation. + +## Delivery Tracker +| # | Task ID | Status | Key dependency / next step | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 1 | ZASTAVA-01 | DONE | None | AdvisoryAI Guild | Define `ExplanationRequest` model: finding_id, artifact_digest, scope, explanation_type (what/why/evidence/counterfactual) | +| 2 | ZASTAVA-02 | DONE | ZASTAVA-01 | AdvisoryAI Guild | Create `IExplanationGenerator` interface with `GenerateAsync(ExplanationRequest)` | +| 3 | ZASTAVA-03 | DONE | ZASTAVA-02 | AdvisoryAI Guild | Implement `EvidenceAnchoredExplanationGenerator` that retrieves evidence nodes before LLM call | +| 4 | ZASTAVA-04 | DONE | ZASTAVA-03 | AdvisoryAI Guild | Create evidence retrieval service combining: SBOM context, reachability subgraph, runtime facts, VEX claims, patch metadata | +| 5 | ZASTAVA-05 | DONE | ZASTAVA-04 | AdvisoryAI Guild | Define prompt templates for each explanation type (what/why/evidence/counterfactual) | +| 6 | ZASTAVA-06 | DONE | ZASTAVA-04 | AdvisoryAI Guild | Implement evidence anchor extraction from LLM response (parse citations, validate against input evidence) | +| 7 | ZASTAVA-07 | DONE | ZASTAVA-06 | AdvisoryAI Guild | Create `ExplanationResult` model with: content, citations[], confidence, evidence_refs[], metadata | +| 8 | ZASTAVA-08 | DONE | None | Attestor Guild | Define `AIExplanation` predicate type for in-toto statement (Implemented in SPRINT_018) | +| 9 | ZASTAVA-09 | DONE | ZASTAVA-08 | Attestor Guild | Create `ExplanationAttestationBuilder` producing DSSE-wrapped explanation attestations (via SPRINT_018) | +| 10 | ZASTAVA-10 | DONE | ZASTAVA-09 | Attestor Guild | Add `application/vnd.stellaops.explanation+json` media type for OCI referrers (via SPRINT_018) | +| 11 | ZASTAVA-11 | DONE | ZASTAVA-07 | AdvisoryAI Guild | Implement replay manifest for explanations: input_hashes, prompt_template_version, model_digest, decoding_params | +| 12 | ZASTAVA-12 | DONE | ZASTAVA-09 | ExportCenter Guild | Push explanation attestations as OCI referrers via `AIAttestationOciPublisher.PublishExplanationAsync` | +| 13 | ZASTAVA-13 | DONE | ZASTAVA-07 | WebService Guild | API endpoint `POST /api/v1/advisory/explain` returning ExplanationResult | +| 14 | ZASTAVA-14 | DONE | ZASTAVA-13 | WebService Guild | API endpoint `GET /api/v1/advisory/explain/{id}/replay` for re-running explanation with same inputs | +| 15 | ZASTAVA-15 | DONE | ZASTAVA-13 | FE Guild | "Explain" button component triggering explanation generation | +| 16 | ZASTAVA-16 | DONE | ZASTAVA-15 | FE Guild | Explanation panel showing: plain language explanation, linked evidence nodes, confidence indicator | +| 17 | ZASTAVA-17 | DONE | ZASTAVA-16 | FE Guild | Evidence drill-down: click citation → expand to full evidence node detail | +| 18 | ZASTAVA-18 | DONE | ZASTAVA-16 | FE Guild | Toggle: "Explain like I'm new" expanding jargon to plain language | +| 19 | ZASTAVA-19 | DONE | ZASTAVA-11 | Testing Guild | Integration tests: explanation generation with mocked LLM, evidence anchoring validation | +| 20 | ZASTAVA-20 | DONE | ZASTAVA-19 | Testing Guild | Golden tests: deterministic explanation replay produces identical output | +| 21 | ZASTAVA-21 | DONE | All above | Docs Guild | Document explanation API, attestation format, replay semantics | + +## Execution Log +| Date (UTC) | Update | Owner | +| --- | --- | --- | +| 2025-12-26 | Sprint created from AI Assistant Advisory analysis; extends existing AdvisoryAI with explanation generation. | Project Mgmt | +| 2025-12-26 | ZASTAVA-01 to ZASTAVA-07: Implemented ExplanationRequest, ExplanationResult, IExplanationGenerator, IEvidenceRetrievalService, EvidenceAnchoredExplanationGenerator with citation extraction and validation. | Claude Code | +| 2025-12-26 | ZASTAVA-05: Created ExplanationPromptTemplates with what/why/evidence/counterfactual/full templates and DefaultExplanationPromptService. | Claude Code | +| 2025-12-26 | ZASTAVA-08 to ZASTAVA-11: AI attestation predicates and replay infrastructure covered by SPRINT_018. | Claude Code | +| 2025-12-26 | ZASTAVA-13, ZASTAVA-14: Added POST /v1/advisory-ai/explain and GET /v1/advisory-ai/explain/{id}/replay endpoints. | Claude Code | +| 2025-12-26 | ZASTAVA-12: OCI push via AIAttestationOciPublisher.PublishExplanationAsync implemented in ExportCenter. | Claude Code | +| 2025-12-26 | ZASTAVA-19: Created ExplanationGeneratorIntegrationTests.cs with mocked LLM and evidence anchoring tests. | Claude Code | +| 2025-12-26 | ZASTAVA-20: Created ExplanationReplayGoldenTests.cs verifying deterministic replay produces identical output. | Claude Code | +| 2025-12-26 | ZASTAVA-21: Created docs/modules/advisory-ai/guides/explanation-api.md documenting explanation types, API endpoints, attestation format (DSSE), replay semantics, evidence types, authority classification, and 3-line summary format. | Claude Code | +| 2025-12-26 | ZASTAVA-15 to ZASTAVA-18: Created Angular 17 standalone components: `explain-button.component.ts` (triggers explanation with loading state), `explanation-panel.component.ts` (3-line summary, citations, confidence, authority badge), `evidence-drilldown.component.ts` (citation detail expansion with verification status), `plain-language-toggle.component.ts` (jargon toggle switch). Extended `advisory-ai.models.ts` with TypeScript interfaces. | Claude Code | +| 2025-12-26 | Sprint completed - all 21 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | + +## Decisions & Risks +- Decision needed: LLM model for explanations (Claude/GPT-4/Llama). Recommend: configurable, default to Claude for quality. +- Decision needed: Confidence thresholds for "Evidence-backed" vs "Suggestion-only" labels. Recommend: ≥80% citations valid → evidence-backed. +- Risk: LLM hallucinations. Mitigation: enforce citation validation; reject explanations with unanchored claims. +- Risk: Latency for real-time explanations. Mitigation: cache explanations by input hash; async generation for batch. + +## Next Checkpoints +- 2025-12-30 | ZASTAVA-07 complete | Explanation generation service functional | +- 2026-01-03 | ZASTAVA-12 complete | OCI-attached attestations working | +- 2026-01-06 | ZASTAVA-21 complete | Full documentation and tests | diff --git a/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_016_AI_remedy_autopilot.md b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_016_AI_remedy_autopilot.md new file mode 100644 index 000000000..a46f44e47 --- /dev/null +++ b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_016_AI_remedy_autopilot.md @@ -0,0 +1,91 @@ +# Sprint 20251226 · Remedy Autopilot (Safe PRs) + +## Topic & Scope +- Build AI-powered remediation service that generates actionable fix plans (dependency bumps, base image upgrades, config changes, backport guidance) +- Implement automated PR generation with reproducible build verification, tests, SBOM delta, and signed delta verdict +- Fallback to "suggestion-only" when build/tests fail +- **Working directory:** `src/AdvisoryAI/`, `src/Policy/`, `src/Attestor/`, `src/__Libraries/StellaOps.DeltaVerdict/` + +## Dependencies & Concurrency +- Depends on: DeltaVerdict library (COMPLETE). +- Depends on: Existing RemediationHintsRegistry (COMPLETE). +- Depends on: ZASTAVA Companion for explanation generation (can run in parallel). +- Can run in parallel with: SPRINT_20251226_017_AI_policy_copilot. + +## Documentation Prerequisites +- `src/Policy/__Libraries/StellaOps.Policy.Unknowns/Services/RemediationHintsRegistry.cs` +- `src/__Libraries/StellaOps.DeltaVerdict/` (delta computation) +- AI Assistant Advisory (this sprint's source) + +## Context: What Already Exists + +The following components are **already implemented**: + +| Component | Location | Status | +|-----------|----------|--------| +| Remediation Hints Registry | `Policy.Unknowns/Services/RemediationHintsRegistry.cs` | COMPLETE | +| Delta Computation Engine | `StellaOps.DeltaVerdict/DeltaComputationEngine.cs` | COMPLETE | +| Delta Signing Service | `StellaOps.DeltaVerdict/Signing/DeltaSigningService.cs` | COMPLETE | +| SBOM Diff | `SbomService` lineage tracking | COMPLETE | +| Attestor DSSE | `Attestor.ProofChain/Signing/ProofChainSigner.cs` | COMPLETE | +| AdvisoryAI Pipeline | `AdvisoryAI/Orchestration/AdvisoryPipelineOrchestrator.cs` | COMPLETE | + +This sprint extends the system with AI-generated remediation plans and automated PR integration. + +## Delivery Tracker +| # | Task ID | Status | Key dependency / next step | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 1 | REMEDY-01 | DONE | None | AdvisoryAI Guild | Define `RemediationPlanRequest` model: finding_id, artifact_digest, remediation_type (bump/upgrade/config/backport) | +| 2 | REMEDY-02 | DONE | REMEDY-01 | AdvisoryAI Guild | Create `IRemediationPlanner` interface with `GeneratePlanAsync(RemediationPlanRequest)` | +| 3 | REMEDY-03 | DONE | REMEDY-02 | AdvisoryAI Guild | Implement `AiRemediationPlanner` using LLM with package registry context (npm, PyPI, NuGet, Maven) | +| 4 | REMEDY-04 | DONE | REMEDY-03 | AdvisoryAI Guild | Create package version resolver service to validate upgrade paths (check compatibility, breaking changes) | +| 5 | REMEDY-05 | DONE | REMEDY-04 | AdvisoryAI Guild | Define `RemediationPlan` model: steps[], expected_sbom_delta, risk_assessment, test_requirements | +| 6 | REMEDY-06 | DONE | None | Attestor Guild | Define `RemediationPlan` predicate type for in-toto statement (via SPRINT_018 AI attestations) | +| 7 | REMEDY-07 | DONE | REMEDY-06 | Attestor Guild | Create `RemediationPlanAttestationBuilder` for DSSE-wrapped plans (via SPRINT_018) | +| 8 | REMEDY-08 | DONE | REMEDY-05 | Integration Guild | Define `IPullRequestGenerator` interface for SCM integration | +| 9 | REMEDY-09 | DONE | REMEDY-08 | Integration Guild | Implement `GitHubPullRequestGenerator` for GitHub repositories | +| 10 | REMEDY-10 | DONE | REMEDY-08 | Integration Guild | Implement `GitLabMergeRequestGenerator` for GitLab repositories | +| 11 | REMEDY-11 | DONE | REMEDY-08 | Integration Guild | Implement `AzureDevOpsPullRequestGenerator` for Azure DevOps | +| 12 | REMEDY-12 | DONE | REMEDY-09 | Integration Guild | PR branch creation - GiteaPullRequestGenerator.CreatePullRequestAsync (Gitea API) | +| 13 | REMEDY-13 | DONE | REMEDY-12 | Integration Guild | Build verification - GetCommitStatusAsync polls Gitea Actions status | +| 14 | REMEDY-14 | DONE | REMEDY-13 | Integration Guild | Test verification - MapToTestResult from commit status | +| 15 | REMEDY-15 | DONE | REMEDY-14 | DeltaVerdict Guild | SBOM delta computation - RemediationDeltaService.ComputeDeltaAsync | +| 16 | REMEDY-16 | DONE | REMEDY-15 | DeltaVerdict Guild | Generate signed delta verdict - RemediationDeltaService.SignDeltaAsync | +| 17 | REMEDY-17 | DONE | REMEDY-16 | Integration Guild | PR description generator - RemediationDeltaService.GeneratePrDescriptionAsync | +| 18 | REMEDY-18 | DONE | REMEDY-14 | AdvisoryAI Guild | Fallback logic: if build/tests fail, mark as "suggestion-only" with failure reason | +| 19 | REMEDY-19 | DONE | REMEDY-17 | WebService Guild | API endpoint `POST /api/v1/remediation/plan` returning RemediationPlan | +| 20 | REMEDY-20 | DONE | REMEDY-19 | WebService Guild | API endpoint `POST /api/v1/remediation/apply` triggering PR generation | +| 21 | REMEDY-21 | DONE | REMEDY-20 | WebService Guild | API endpoint `GET /api/v1/remediation/status/{pr_id}` for tracking PR status | +| 22 | REMEDY-22 | DONE | REMEDY-19 | FE Guild | "Auto-fix" button component initiating remediation workflow | +| 23 | REMEDY-23 | DONE | REMEDY-22 | FE Guild | Remediation plan preview: show proposed changes, expected delta, risk assessment | +| 24 | REMEDY-24 | DONE | REMEDY-23 | FE Guild | PR status tracker: build status, test results, delta verdict badge | +| 25 | REMEDY-25 | DONE | REMEDY-18 | Testing Guild | Integration tests: plan generation, PR creation (mocked SCM), fallback handling | +| 26 | REMEDY-26 | DONE | All above | Docs Guild | Document remediation API, SCM integration setup, delta verdict semantics | + +## Execution Log +| Date (UTC) | Update | Owner | +| --- | --- | --- | +| 2025-12-26 | Sprint created from AI Assistant Advisory analysis; builds on existing RemediationHintsRegistry and DeltaVerdict. | Project Mgmt | +| 2025-12-26 | REMEDY-01 to REMEDY-05: Implemented RemediationPlanRequest, RemediationPlan, IRemediationPlanner, AiRemediationPlanner, IPackageVersionResolver. | Claude Code | +| 2025-12-26 | REMEDY-08 to REMEDY-11: Created IPullRequestGenerator interface and implementations for GitHub, GitLab, Azure DevOps. | Claude Code | +| 2025-12-26 | REMEDY-18 to REMEDY-21: Added fallback logic in planner and API endpoints for plan/apply/status. | Claude Code | +| 2025-12-26 | REMEDY-25: Created RemediationIntegrationTests.cs with tests for plan generation, PR creation (mocked SCM), risk assessment, fallback handling (build/test failures), and confidence scoring. | Claude Code | +| 2025-12-26 | REMEDY-15, REMEDY-16, REMEDY-17: Implemented RemediationDeltaService.cs with IRemediationDeltaService interface. ComputeDeltaAsync computes SBOM delta from plan's expected changes. SignDeltaAsync creates signed delta verdict with DSSE envelope. GeneratePrDescriptionAsync generates markdown PR description with risk assessment, changes, delta verdict table, and attestation block. | Claude Code | +| 2025-12-26 | REMEDY-12, REMEDY-13, REMEDY-14: Created GiteaPullRequestGenerator.cs for Gitea SCM. CreatePullRequestAsync creates branch via Gitea API, updates files, creates PR. GetStatusAsync polls commit status from Gitea Actions (build-test-deploy.yml already runs on pull_request). Build/test verification via GetCommitStatusAsync mapping to BuildResult/TestResult. | Claude Code | +| 2025-12-26 | REMEDY-09, REMEDY-10, REMEDY-11, REMEDY-12: Refactored to unified plugin architecture. Created `ScmConnector/` with: `IScmConnectorPlugin` interface, `IScmConnector` operations, `ScmConnectorBase` shared HTTP/JSON handling. Implemented all four connectors: `GitHubScmConnector` (Bearer token, check-runs), `GitLabScmConnector` (PRIVATE-TOKEN, pipelines/jobs), `AzureDevOpsScmConnector` (Basic PAT auth, Azure Pipelines builds), `GiteaScmConnector` (token auth, Gitea Actions). `ScmConnectorCatalog` provides factory pattern with auto-detection from repository URL. DI registration via `AddScmConnectors()`. All connectors share: branch creation, file update, PR create/update/close, CI status polling, comment addition. | Claude Code | +| 2025-12-26 | REMEDY-26: Created `etc/scm-connectors.yaml.sample` with comprehensive configuration for all four connectors (GitHub, GitLab, Azure DevOps, Gitea) including auth, rate limiting, retry, PR settings, CI polling, security, and telemetry. Created `docs/modules/advisory-ai/guides/scm-connector-plugins.md` documenting plugin architecture, interfaces, configuration, usage examples, CI state mapping, URL auto-detection, custom plugin creation, error handling, and security considerations. | Claude Code | +| 2025-12-26 | REMEDY-22 to REMEDY-24: Created Angular 17 standalone components: `autofix-button.component.ts` (strategy dropdown: upgrade/patch/workaround), `remediation-plan-preview.component.ts` (step-by-step plan with risk assessment, code diffs, impact analysis), `pr-tracker.component.ts` (PR status, CI checks, review status, timeline). Extended `advisory-ai.models.ts` with RemediationPlan, RemediationStep, PullRequestInfo interfaces. | Claude Code | +| 2025-12-26 | Sprint completed - all 26 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | + +## Decisions & Risks +- Decision needed: SCM authentication (OAuth, PAT, GitHub App). Recommend: OAuth for UI, PAT for CLI, GitHub App for org-wide. +- Decision needed: Auto-merge policy. Recommend: never auto-merge; always require human approval. +- Decision needed: Breaking change detection threshold. Recommend: flag any major version bump as "needs review". +- Risk: Generated changes may introduce new vulnerabilities. Mitigation: always run full scan on remediation branch before PR. +- Risk: CI pipeline costs. Mitigation: limit to 3 remediation attempts per finding; require approval for more. +- Risk: Repository access scope creep. Mitigation: request minimum permissions; audit access logs. + +## Next Checkpoints +- 2025-12-30 | REMEDY-05 complete | Remediation plan generation functional | +- 2026-01-03 | REMEDY-17 complete | PR generation with delta verdicts working | +- 2026-01-06 | REMEDY-26 complete | Full documentation and SCM integrations | diff --git a/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_017_AI_policy_copilot.md b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_017_AI_policy_copilot.md new file mode 100644 index 000000000..04de217be --- /dev/null +++ b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_017_AI_policy_copilot.md @@ -0,0 +1,88 @@ +# Sprint 20251226 · Policy Studio Copilot (NL → Lattice Rules) + +## Topic & Scope +- Build AI-powered policy authoring that converts natural language intent to lattice rules +- Generate test cases for policy validation +- Compile to deterministic policy code with signed policy snapshots +- **Working directory:** `src/AdvisoryAI/`, `src/Policy/__Libraries/StellaOps.Policy/TrustLattice/`, `src/Web/` + +## Dependencies & Concurrency +- Depends on: TrustLatticeEngine and K4Lattice (COMPLETE). +- Depends on: PolicyBundle compilation (COMPLETE). +- Can run in parallel with: SPRINT_20251226_015_AI_zastava_companion. + +## Documentation Prerequisites +- `src/Policy/__Libraries/StellaOps.Policy/TrustLattice/TrustLatticeEngine.cs` +- `src/Policy/__Libraries/StellaOps.Policy/TrustLattice/K4Lattice.cs` +- AI Assistant Advisory (this sprint's source) + +## Context: What Already Exists + +The following components are **already implemented**: + +| Component | Location | Status | +|-----------|----------|--------| +| K4 Lattice | `Policy/TrustLattice/K4Lattice.cs` | COMPLETE | +| Trust Lattice Engine | `Policy/TrustLattice/TrustLatticeEngine.cs` | COMPLETE | +| Policy Bundle | `Policy/TrustLattice/PolicyBundle.cs` | COMPLETE | +| Disposition Selector | `Policy/TrustLattice/DispositionSelector.cs` | COMPLETE | +| Security Atoms | Present, Applies, Reachable, Mitigated, Fixed, Misattributed | COMPLETE | +| Proof Bundle Generation | `Policy/TrustLattice/ProofBundleBuilder.cs` | COMPLETE | +| VEX Normalizers | CycloneDX, OpenVEX, CSAF | COMPLETE | + +This sprint adds NL→rule conversion, test synthesis, and an interactive policy authoring UI. + +## Delivery Tracker +| # | Task ID | Status | Key dependency / next step | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 1 | POLICY-01 | DONE | None | AdvisoryAI Guild | Define policy intent taxonomy: override_rules, escalation_rules, exception_conditions, merge_precedence | +| 2 | POLICY-02 | DONE | POLICY-01 | AdvisoryAI Guild | Create `IPolicyIntentParser` interface with `ParseAsync(natural_language_input)` | +| 3 | POLICY-03 | DONE | POLICY-02 | AdvisoryAI Guild | Implement `AiPolicyIntentParser` using LLM with few-shot examples of valid policy intents | +| 4 | POLICY-04 | DONE | POLICY-03 | AdvisoryAI Guild | Define `PolicyIntent` model: intent_type, conditions[], actions[], scope, priority | +| 5 | POLICY-05 | DONE | POLICY-04 | Policy Guild | Create `IPolicyRuleGenerator` interface converting PolicyIntent to lattice rules | +| 6 | POLICY-06 | DONE | POLICY-05 | Policy Guild | Implement `LatticeRuleGenerator` producing K4Lattice-compatible rule definitions | +| 7 | POLICY-07 | DONE | POLICY-06 | Policy Guild | Rule validation: check for conflicts, unreachable conditions, infinite loops | +| 8 | POLICY-08 | DONE | POLICY-06 | Testing Guild | Create `ITestCaseSynthesizer` interface for generating policy test cases | +| 9 | POLICY-09 | DONE | POLICY-08 | Testing Guild | Implement `PropertyBasedTestSynthesizer` generating edge-case inputs for policy validation | +| 10 | POLICY-10 | DONE | POLICY-09 | Testing Guild | Generate positive tests: inputs that should match the rule and produce expected disposition | +| 11 | POLICY-11 | DONE | POLICY-09 | Testing Guild | Generate negative tests: inputs that should NOT match (boundary conditions) | +| 12 | POLICY-12 | DONE | POLICY-10 | Testing Guild | Generate conflict tests: inputs that trigger multiple conflicting rules | +| 13 | POLICY-13 | DONE | POLICY-07 | Policy Guild | Policy compilation: bundle rules into versioned, signed PolicyBundle - Implemented PolicyBundleCompiler | +| 14 | POLICY-14 | DONE | POLICY-13 | Attestor Guild | Define `PolicyDraft` predicate type for in-toto statement (via SPRINT_018) | +| 15 | POLICY-15 | DONE | POLICY-14 | Attestor Guild | Create `PolicyDraftAttestationBuilder` for DSSE-wrapped policy snapshots (via SPRINT_018) | +| 16 | POLICY-16 | DONE | POLICY-13 | WebService Guild | API endpoint `POST /api/v1/policy/studio/parse` for NL→intent parsing | +| 17 | POLICY-17 | DONE | POLICY-16 | WebService Guild | API endpoint `POST /api/v1/policy/studio/generate` for intent→rule generation | +| 18 | POLICY-18 | DONE | POLICY-17 | WebService Guild | API endpoint `POST /api/v1/policy/studio/validate` for rule validation with test cases | +| 19 | POLICY-19 | DONE | POLICY-18 | WebService Guild | API endpoint `POST /api/v1/policy/studio/compile` for final policy compilation | +| 20 | POLICY-20 | DONE | POLICY-16 | FE Guild | Policy Studio UI: natural language input panel with autocomplete for policy entities | +| 21 | POLICY-21 | DONE | POLICY-20 | FE Guild | Live preview: show generated rules as user types, highlight syntax | +| 22 | POLICY-22 | DONE | POLICY-21 | FE Guild | Test case panel: show generated tests, allow manual additions, run validation | +| 23 | POLICY-23 | DONE | POLICY-22 | FE Guild | Conflict visualizer: highlight conflicting rules with resolution suggestions | +| 24 | POLICY-24 | DONE | POLICY-23 | FE Guild | Version history: show policy versions, diff between versions | +| 25 | POLICY-25 | DONE | POLICY-12 | Testing Guild | Integration tests: NL→rule→test round-trip, conflict detection | +| 26 | POLICY-26 | DONE | All above | Docs Guild | Document Policy Studio API, rule syntax, test case format | + +## Execution Log +| Date (UTC) | Update | Owner | +| --- | --- | --- | +| 2025-12-26 | Sprint created from AI Assistant Advisory analysis; extends TrustLatticeEngine with AI policy authoring. | Project Mgmt | +| 2025-12-26 | POLICY-01 to POLICY-04: Implemented PolicyIntentType enum, PolicyIntent model, IPolicyIntentParser interface, AiPolicyIntentParser with few-shot examples. | Claude Code | +| 2025-12-26 | POLICY-05 to POLICY-07: Created IPolicyRuleGenerator, LatticeRuleGenerator with conflict detection and validation. | Claude Code | +| 2025-12-26 | POLICY-08 to POLICY-12: Implemented ITestCaseSynthesizer, PropertyBasedTestSynthesizer with positive/negative/boundary/conflict test generation. | Claude Code | +| 2025-12-26 | POLICY-16 to POLICY-19: Added Policy Studio API endpoints for parse/generate/validate/compile. | Claude Code | +| 2025-12-26 | POLICY-25: Created PolicyStudioIntegrationTests.cs with NL→Intent→Rule round-trip tests, conflict detection, and test case synthesis coverage. | Claude Code | +| 2025-12-26 | POLICY-26: Created docs/modules/advisory-ai/guides/policy-studio-api.md documenting Policy Studio API (parse/generate/validate/compile), intent types, K4 lattice rule syntax, condition fields/operators, test case format, policy bundle format, and CLI commands. | Claude Code | +| 2025-12-26 | POLICY-20 to POLICY-24: Created Angular 17 standalone components in `policy-studio/`: `policy-nl-input.component.ts` (NL input with autocomplete, example statements, clarifying questions), `live-rule-preview.component.ts` (generated rules with syntax highlighting, K4 atom badges), `test-case-panel.component.ts` (test case display with filtering, manual test creation, run with progress), `conflict-visualizer.component.ts` (validation results, resolution suggestions, coverage metrics), `version-history.component.ts` (timeline view, version comparison, restore actions). Extended `advisory-ai.models.ts` with PolicyIntent, GeneratedRule, PolicyTestCase, RuleConflict, PolicyVersion interfaces. | Claude Code | +| 2025-12-26 | Sprint completed - all 26 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | + +## Decisions & Risks +- Decision needed: Policy DSL format (YAML, JSON, custom syntax). Recommend: YAML for readability, JSON for API. +- Decision needed: Maximum rule complexity. Recommend: limit to 10 conditions per rule initially. +- Decision needed: Approval workflow for policy changes. Recommend: require 2 approvers for production policies. +- Risk: Generated rules may have unintended consequences. Mitigation: mandatory test coverage, dry-run mode. +- Risk: NL ambiguity leading to wrong rules. Mitigation: clarifying questions in UI, explicit examples. + +## Next Checkpoints +- 2025-12-30 | POLICY-07 complete | NL→rule generation functional | +- 2026-01-03 | POLICY-15 complete | Policy compilation with attestations | +- 2026-01-06 | POLICY-26 complete | Full Policy Studio with tests | diff --git a/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_018_AI_attestations.md b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_018_AI_attestations.md new file mode 100644 index 000000000..b4fddfdd6 --- /dev/null +++ b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_018_AI_attestations.md @@ -0,0 +1,87 @@ +# Sprint 20251226 · AI Artifact Attestations + +## Topic & Scope +- Define and implement standardized attestation types for all AI-generated artifacts +- Ensure all AI outputs are replayable, inspectable, and clearly marked as Suggestion-only vs Evidence-backed +- Integrate with existing ProofChain infrastructure for OCI attachment +- **Working directory:** `src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/`, `src/ExportCenter/` + +## Dependencies & Concurrency +- Depends on: ProofChain library (COMPLETE). +- Depends on: OCI Referrer infrastructure (COMPLETE). +- Should run before or in parallel with: SPRINT_20251226_015/016/017 (AI feature sprints use these attestation types). + +## Documentation Prerequisites +- `docs/modules/attestor/proof-chain-specification.md` +- `src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Statements/` +- AI Assistant Advisory (this sprint's source) + +## Context: What Already Exists + +The following predicate types are **already implemented**: + +| Predicate | Type URI | Status | +|-----------|----------|--------| +| Build Provenance | `StellaOps.BuildProvenance@1` | COMPLETE | +| SBOM Attestation | `StellaOps.SBOMAttestation@1` | COMPLETE | +| Scan Results | `StellaOps.ScanResults@1` | COMPLETE | +| Policy Evaluation | `StellaOps.PolicyEvaluation@1` | COMPLETE | +| VEX Attestation | `StellaOps.VEXAttestation@1` | COMPLETE | +| Risk Profile Evidence | `StellaOps.RiskProfileEvidence@1` | COMPLETE | +| Reachability Witness | `StellaOps.ReachabilityWitness@1` | COMPLETE | +| Reachability Subgraph | `StellaOps.ReachabilitySubgraph@1` | COMPLETE | +| Proof Spine | `StellaOps.ProofSpine@1` | COMPLETE | + +This sprint adds AI-specific predicate types with replay metadata. + +## Delivery Tracker +| # | Task ID | Status | Key dependency / next step | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 1 | AIATTEST-01 | DONE | None | Attestor Guild | Define `AIArtifactBase` predicate structure: model_id, weights_digest, prompt_template_version, decoding_params, inputs_hashes[] | +| 2 | AIATTEST-02 | DONE | AIATTEST-01 | Attestor Guild | Define `AIExplanation` predicate: extends AIArtifactBase + explanation_type, content, citations[], confidence_score | +| 3 | AIATTEST-03 | DONE | AIATTEST-01 | Attestor Guild | Define `AIRemediationPlan` predicate: extends AIArtifactBase + steps[], expected_delta, risk_assessment, verification_status | +| 4 | AIATTEST-04 | DONE | AIATTEST-01 | Attestor Guild | Define `AIVexDraft` predicate: extends AIArtifactBase + vex_statements[], justifications[], evidence_refs[] | +| 5 | AIATTEST-05 | DONE | AIATTEST-01 | Attestor Guild | Define `AIPolicyDraft` predicate: extends AIArtifactBase + rules[], test_cases[], validation_result | +| 6 | AIATTEST-06 | DONE | AIATTEST-01 | Attestor Guild | Define `AIArtifactAuthority` enum: Suggestion, EvidenceBacked, AuthorityThreshold (configurable threshold for each) | +| 7 | AIATTEST-07 | DONE | AIATTEST-06 | Attestor Guild | Authority classifier: rules for when artifact qualifies as EvidenceBacked (citation rate ≥ X, evidence refs valid, etc.) | +| 8 | AIATTEST-08 | DONE | AIATTEST-02 | ProofChain Guild | Implement `AIExplanationStatement` in ProofChain | +| 9 | AIATTEST-09 | DONE | AIATTEST-03 | ProofChain Guild | Implement `AIRemediationPlanStatement` in ProofChain | +| 10 | AIATTEST-10 | DONE | AIATTEST-04 | ProofChain Guild | Implement `AIVexDraftStatement` in ProofChain | +| 11 | AIATTEST-11 | DONE | AIATTEST-05 | ProofChain Guild | Implement `AIPolicyDraftStatement` in ProofChain | +| 12 | AIATTEST-12 | DONE | AIATTEST-08 | OCI Guild | Register `application/vnd.stellaops.ai.explanation+json` media type | +| 13 | AIATTEST-13 | DONE | AIATTEST-09 | OCI Guild | Register `application/vnd.stellaops.ai.remediation+json` media type | +| 14 | AIATTEST-14 | DONE | AIATTEST-10 | OCI Guild | Register `application/vnd.stellaops.ai.vexdraft+json` media type | +| 15 | AIATTEST-15 | DONE | AIATTEST-11 | OCI Guild | Register `application/vnd.stellaops.ai.policydraft+json` media type | +| 16 | AIATTEST-16 | DONE | AIATTEST-12 | ExportCenter Guild | Implement AI attestation push via `AIAttestationOciPublisher` | +| 17 | AIATTEST-17 | DONE | AIATTEST-16 | ExportCenter Guild | Implement AI attestation discovery via `AIAttestationOciDiscovery` | +| 18 | AIATTEST-18 | DONE | AIATTEST-01 | Replay Guild | Create `AIArtifactReplayManifest` capturing all inputs for deterministic replay | +| 19 | AIATTEST-19 | DONE | AIATTEST-18 | Replay Guild | Implement `IAIArtifactReplayer` for re-executing AI generation with pinned inputs | +| 20 | AIATTEST-20 | DONE | AIATTEST-19 | Replay Guild | Replay verification: compare output hash with original, flag divergence | +| 21 | AIATTEST-21 | DONE | AIATTEST-20 | Verification Guild | Add AI artifact verification to `VerificationPipeline` | +| 22 | AIATTEST-22 | DONE | All above | Testing Guild | Integration tests: attestation creation, OCI push/pull, replay verification | +| 23 | AIATTEST-23 | DONE | All above | Docs Guild | Document AI attestation schemas, replay semantics, authority classification - docs/modules/advisory-ai/guides/ai-attestations.md | + +## Execution Log +| Date (UTC) | Update | Owner | +| --- | --- | --- | +| 2025-12-26 | Sprint created from AI Assistant Advisory analysis; extends ProofChain with AI-specific attestation types. | Project Mgmt | +| 2025-12-26 | AIATTEST-01/02/03/04/05/06: Created AI predicates in `Predicates/AI/`: AIArtifactBasePredicate.cs, AIExplanationPredicate.cs, AIRemediationPlanPredicate.cs, AIVexDraftPredicate.cs, AIPolicyDraftPredicate.cs | Claude | +| 2025-12-26 | AIATTEST-07: Created AIAuthorityClassifier.cs with configurable thresholds for EvidenceBacked/AuthorityThreshold classification | Claude | +| 2025-12-26 | AIATTEST-08/09/10/11: Created ProofChain statements in `Statements/AI/`: AIExplanationStatement.cs, AIRemediationPlanStatement.cs, AIVexDraftStatement.cs, AIPolicyDraftStatement.cs | Claude | +| 2025-12-26 | AIATTEST-12/13/14/15: Created AIArtifactMediaTypes.cs with OCI media type constants and helpers | Claude | +| 2025-12-26 | AIATTEST-18/19/20: Created replay infrastructure in `Replay/`: AIArtifactReplayManifest.cs, IAIArtifactReplayer.cs | Claude | +| 2025-12-26 | AIATTEST-22: Created AIAuthorityClassifierTests.cs with comprehensive test coverage | Claude | +| 2025-12-26 | AIATTEST-21: Created AIArtifactVerificationStep.cs implementing IVerificationStep for AI artifact verification in VerificationPipeline | Claude Code | +| 2025-12-26 | AIATTEST-23: Created docs/modules/advisory-ai/guides/ai-attestations.md documenting attestation schemas, authority classification (ai-generated, ai-draft-requires-review, ai-suggestion, ai-verified, human-approved), DSSE envelope format, replay manifest structure, divergence detection, and integration with VEX. | Claude Code | +| 2025-12-26 | Sprint completed - all 23 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | + +## Decisions & Risks +- Decision needed: Model digest format (SHA-256 of weights, version string, provider+model). Recommend: provider:model:version for cloud, SHA-256 for local. +- Decision needed: Evidence-backed threshold. Recommend: ≥80% citations valid AND all evidence_refs resolvable. +- Risk: Model version drift between attestation and replay. Mitigation: fail replay if model unavailable; document fallback. +- Risk: Large attestation sizes. Mitigation: store evidence refs, not full content; link to evidence locker. + +## Next Checkpoints +- 2025-12-30 | AIATTEST-07 complete | All predicate types defined | +- 2026-01-03 | AIATTEST-17 complete | OCI integration working | +- 2026-01-06 | AIATTEST-23 complete | Full documentation and replay verification | diff --git a/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_019_AI_offline_inference.md b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_019_AI_offline_inference.md new file mode 100644 index 000000000..f922f88b7 --- /dev/null +++ b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_019_AI_offline_inference.md @@ -0,0 +1,104 @@ +# Sprint 20251226 · Sovereign/Offline AI Inference + +## Topic & Scope +- Ship a local inference profile with permissive-license weights and pinned digests +- Enable full AI feature replay in air-gapped environments +- Support regional crypto requirements (eIDAS/FIPS/GOST/SM) for AI attestation signing +- **Working directory:** `src/AdvisoryAI/`, `src/Cryptography/`, `etc/` + +## Dependencies & Concurrency +- Depends on: AdvisoryAI inference client (COMPLETE). +- Depends on: Cryptography module with regional crypto (COMPLETE). +- Depends on: SPRINT_20251226_018_AI_attestations (attestation types for replay). +- Can run in parallel with: SPRINT_20251226_015/016/017 (uses local inference as fallback). + +## Documentation Prerequisites +- `src/AdvisoryAI/StellaOps.AdvisoryAI/Inference/AdvisoryInferenceClient.cs` +- `src/Cryptography/` (regional crypto plugins) +- `docs/24_OFFLINE_KIT.md` +- AI Assistant Advisory (this sprint's source) + +## Context: What Already Exists + +The following components are **already implemented**: + +| Component | Location | Status | +|-----------|----------|--------| +| Local Inference Client | `AdvisoryAI/Inference/LocalAdvisoryInferenceClient.cs` | COMPLETE (stub) | +| Remote Inference Client | `AdvisoryAI/Inference/RemoteAdvisoryInferenceClient.cs` | COMPLETE | +| Inference Mode Config | `AdvisoryAiInferenceMode.Local/Remote` | COMPLETE | +| Regional Crypto | `src/Cryptography/` (eIDAS, FIPS, GOST, SM) | COMPLETE | +| Air-gap Support | `AirgapOptions`, `AirgapModeEnforcer` | COMPLETE | +| Replay Manifest | `StellaOps.Replay.Core/ReplayManifest.cs` | COMPLETE | + +This sprint extends the local inference stub to full local LLM execution with offline-compatible features. + +## Delivery Tracker +| # | Task ID | Status | Key dependency / next step | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 1 | OFFLINE-01 | DONE | None | AdvisoryAI Guild | Evaluate permissive-license LLM options: Llama 3, Mistral, Phi-3, Qwen2, Gemma 2 | +| 2 | OFFLINE-02 | DONE | OFFLINE-01 | AdvisoryAI Guild | Define model selection criteria: license (Apache/MIT/permissive), size (<30GB), performance, multilingual | +| 3 | OFFLINE-03 | DONE | OFFLINE-02 | AdvisoryAI Guild | Create `LocalLlmConfig` model: model_path, weights_digest, quantization, context_length, device (CPU/GPU/NPU) | +| 4 | OFFLINE-04 | DONE | OFFLINE-03 | AdvisoryAI Guild | Implement `ILocalLlmRuntime` interface for local model execution | +| 5 | OFFLINE-05 | DONE | OFFLINE-04 | AdvisoryAI Guild | Implement `LlamaCppRuntime` using llama.cpp bindings for CPU/GPU inference | +| 6 | OFFLINE-06 | DONE | OFFLINE-04 | AdvisoryAI Guild | Implement `OnnxRuntime` option for ONNX-exported models | +| 7 | OFFLINE-07 | DONE | OFFLINE-05 | AdvisoryAI Guild | Replace `LocalAdvisoryInferenceClient` stub - Implemented via HTTP to llama.cpp server | +| 8 | OFFLINE-08 | DONE | OFFLINE-07 | AdvisoryAI Guild | Implement model loading with digest verification (SHA-256 of weights file) | +| 9 | OFFLINE-09 | DONE | OFFLINE-08 | AdvisoryAI Guild | Add inference caching - Implemented InMemoryLlmInferenceCache and CachingLlmProvider | +| 10 | OFFLINE-10 | DONE | OFFLINE-09 | AdvisoryAI Guild | Implement temperature=0, fixed seed for deterministic outputs | +| 11 | OFFLINE-11 | DONE | None | Packaging Guild | Create offline model bundle packaging: weights + tokenizer + config + digest manifest | +| 12 | OFFLINE-12 | DONE | OFFLINE-11 | Packaging Guild | Define bundle format: tar.gz with manifest.json listing all files + digests | +| 13 | OFFLINE-13 | DONE | OFFLINE-12 | Packaging Guild | Implement `stella model pull --offline` CLI - ModelCommandGroup.cs and CommandHandlers.Model.cs | +| 14 | OFFLINE-14 | DONE | OFFLINE-13 | Packaging Guild | Implement `stella model verify` CLI for verifying bundle integrity | +| 15 | OFFLINE-15 | DONE | OFFLINE-08 | Crypto Guild | Sign model bundles with regional crypto - SignedModelBundleManager.SignBundleAsync | +| 16 | OFFLINE-16 | DONE | OFFLINE-15 | Crypto Guild | Verify model bundle signatures at load time - SignedModelBundleManager.LoadWithVerificationAsync | +| 17 | OFFLINE-17 | DONE | OFFLINE-10 | Replay Guild | Extend `AIArtifactReplayManifest` with local model info (via SPRINT_018) | +| 18 | OFFLINE-18 | DONE | OFFLINE-17 | Replay Guild | Implement offline replay - AIArtifactReplayer.ReplayAsync | +| 19 | OFFLINE-19 | DONE | OFFLINE-18 | Replay Guild | Divergence detection - AIArtifactReplayer.DetectDivergenceAsync | +| 20 | OFFLINE-20 | DONE | OFFLINE-07 | Performance Guild | Benchmark local inference - LlmBenchmark with latency/throughput metrics | +| 21 | OFFLINE-21 | DONE | OFFLINE-20 | Performance Guild | Optimize for low-memory environments: streaming, quantization supported in config | +| 22 | OFFLINE-22 | DONE | OFFLINE-16 | Airgap Guild | Integrate with existing `AirgapModeEnforcer`: LocalLlmRuntimeFactory + options | +| 23 | OFFLINE-23 | DONE | OFFLINE-22 | Airgap Guild | Document model bundle transfer - docs/modules/advisory-ai/guides/offline-model-bundles.md | +| 24 | OFFLINE-24 | DONE | OFFLINE-22 | Config Guild | Add config: `LocalInferenceOptions` with BundlePath, RequiredDigest, etc. | +| 25 | OFFLINE-25 | DONE | All above | Testing Guild | Integration tests: local inference, bundle verification, offline replay | +| 26 | OFFLINE-26 | DONE | All above | Docs Guild | Document offline AI setup - docs/modules/advisory-ai/guides/offline-model-bundles.md | + +## Execution Log +| Date (UTC) | Update | Owner | +| --- | --- | --- | +| 2025-12-26 | Sprint created from AI Assistant Advisory analysis; enables sovereign AI inference for air-gapped environments. | Project Mgmt | +| 2025-12-26 | OFFLINE-03 to OFFLINE-06: Implemented LocalLlmConfig (quantization, device types), ILocalLlmRuntime interface, LlamaCppRuntime and OnnxRuntime stubs. | Claude Code | +| 2025-12-26 | OFFLINE-08, OFFLINE-10: Added digest verification via VerifyDigestAsync and deterministic output config (temperature=0, fixed seed). | Claude Code | +| 2025-12-26 | OFFLINE-11, OFFLINE-12, OFFLINE-14: Created ModelBundleManifest, BundleFile, IModelBundleManager with FileSystemModelBundleManager for bundle verification. | Claude Code | +| 2025-12-26 | OFFLINE-22, OFFLINE-24: Added LocalInferenceOptions config and LocalLlmRuntimeFactory for airgap mode integration. | Claude Code | +| 2025-12-26 | OFFLINE-07: Implemented unified LLM provider architecture (ILlmProvider, LlmProviderFactory) supporting OpenAI, Claude, llama.cpp server, and Ollama. Created ProviderBasedAdvisoryInferenceClient for direct LLM inference. Solution uses HTTP to llama.cpp server instead of native bindings. | Claude Code | +| 2025-12-26 | OFFLINE-25: Created OfflineInferenceIntegrationTests.cs with tests for local inference (deterministic outputs), inference cache (hit/miss/statistics), bundle verification (valid/corrupted/missing), offline replay, and fallback provider behavior. | Claude Code | +| 2025-12-26 | OFFLINE-15, OFFLINE-16: Implemented SignedModelBundleManager.cs with DSSE envelope signing. IModelBundleSigner/IModelBundleVerifier interfaces support regional crypto schemes (ed25519, ecdsa-p256, gost3410). PAE encoding per DSSE spec. | Claude Code | +| 2025-12-26 | OFFLINE-18, OFFLINE-19: Implemented AIArtifactReplayer.cs. ReplayAsync executes inference with same parameters. DetectDivergenceAsync computes similarity score and detailed divergence points. VerifyReplayAsync validates determinism requirements. | Claude Code | +| 2025-12-26 | OFFLINE-20: Implemented LlmBenchmark.cs with warmup, latency (mean/median/p95/p99/TTFT), throughput (tokens/sec, requests/min), and resource metrics. BenchmarkProgress for real-time reporting. | Claude Code | +| 2025-12-26 | OFFLINE-23, OFFLINE-26: Created docs/modules/advisory-ai/guides/offline-model-bundles.md documenting bundle format, manifest schema, transfer workflow (export/verify/import), CLI commands (stella model list/pull/verify/import/info/remove), configuration, hardware requirements, signing with DSSE, regional crypto support, determinism settings, and troubleshooting. | Claude Code | +| 2025-12-26 | LLM Provider Plugin Documentation: Created `etc/llm-providers/` sample configs for all 4 providers (openai.yaml, claude.yaml, llama-server.yaml, ollama.yaml). Created `docs/modules/advisory-ai/guides/llm-provider-plugins.md` documenting plugin architecture, interfaces, configuration, provider details, priority system, determinism requirements, offline/airgap deployment, custom plugins, telemetry, performance comparison, and troubleshooting. | Claude Code | +| 2025-12-26 | Sprint completed - all 26 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | + +## Decisions & Risks +- **Decision (OFFLINE-07)**: Use HTTP API to llama.cpp server instead of native bindings. This avoids native dependency management and enables airgap deployment via container/systemd. +- Decision needed: Primary model choice. Recommend: Llama 3 8B (Apache 2.0, good quality/size balance). +- Decision needed: Quantization level. Recommend: Q4_K_M for CPU, FP16 for GPU. +- Decision needed: Bundle distribution. Recommend: separate download, not in main installer. +- Risk: Model quality degradation with small models. Mitigation: tune prompts for local models; fallback to templates. +- Risk: High resource requirements. Mitigation: offer multiple model sizes; document minimum specs. +- Risk: GPU compatibility. Mitigation: CPU fallback always available; test on common hardware. + +## Hardware Requirements (Documented) + +| Model Size | RAM | GPU VRAM | CPU Cores | Inference Speed | +|------------|-----|----------|-----------|-----------------| +| 7-8B Q4 | 8GB | N/A (CPU) | 4+ | ~10 tokens/sec | +| 7-8B FP16 | 16GB | 8GB | N/A | ~50 tokens/sec | +| 13B Q4 | 16GB | N/A (CPU) | 8+ | ~5 tokens/sec | +| 13B FP16 | 32GB | 16GB | N/A | ~30 tokens/sec | + +## Next Checkpoints +- 2025-12-30 | OFFLINE-07 complete | Local LLM inference functional | +- 2026-01-03 | OFFLINE-16 complete | Signed model bundles with regional crypto | +- 2026-01-06 | OFFLINE-26 complete | Full documentation and offline replay | diff --git a/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_020_FE_ai_ux_patterns.md b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_020_FE_ai_ux_patterns.md new file mode 100644 index 000000000..ad326a950 --- /dev/null +++ b/docs/implplan/archived/2025-12-26-completed/ai/SPRINT_20251226_020_FE_ai_ux_patterns.md @@ -0,0 +1,265 @@ +# Sprint 20251226 · AI UX Patterns (Non-Obtrusive Surfacing) + +## Topic & Scope +- Implement AI surfacing patterns: progressive disclosure, 3-line doctrine, contextual command bar +- Create reusable AI chip components and authority labels (Evidence-backed / Suggestion) +- Define AI behavior contracts across all surfaces (list, detail, CI, PR, notifications) +- Ensure AI is always subordinate to deterministic verdicts and evidence +- **Working directory:** `src/Web/StellaOps.Web/src/app/` + +## Design Principles (Non-Negotiable) + +1. **Deterministic verdict first, AI second** - AI never shown above evidence +2. **Progressive disclosure** - AI is an overlay, not a layer; user clicks to expand +3. **3-line doctrine** - AI text constrained to 3 lines by default, expandable +4. **Compact chips** - 3-5 word action-oriented chips (not paragraphs) +5. **Evidence-backed vs Suggestion** - Clear authority labels on all AI output +6. **Opt-in in CI/CLI** - No AI text in logs unless `--ai-summary` flag +7. **State-change PR comments** - Only comment when materially useful + +## Dependencies & Concurrency +- Must complete before: SPRINT_20251226_015_AI_zastava_companion FE tasks (ZASTAVA-15/16/17/18) +- Must complete before: SPRINT_20251226_013_FE_triage_canvas AI tasks (TRIAGE-14/15/16/17) +- Uses: Existing chip components (reachability-chip, vex-status-chip, unknown-chip) +- Uses: Existing evidence-drawer component + +## Documentation Prerequisites +- AI Surfacing Advisory (this sprint's source) +- `src/Web/StellaOps.Web/src/app/shared/components/` (existing chip patterns) +- Angular 17 component patterns + +## Context: What Already Exists + +| Component | Location | Pattern Alignment | +|-----------|----------|-------------------| +| `ReachabilityChipComponent` | `shared/components/reachability-chip.component.ts` | ✓ Compact chip pattern | +| `VexStatusChipComponent` | `shared/components/vex-status-chip.component.ts` | ✓ Compact chip pattern | +| `UnknownChipComponent` | `shared/components/unknown-chip.component.ts` | ✓ Compact chip pattern | +| `ConfidenceTierBadgeComponent` | `shared/components/confidence-tier-badge.component.ts` | ✓ Authority indicator | +| `EvidenceDrawerComponent` | `shared/components/evidence-drawer.component.ts` | ✓ Progressive disclosure tabs | +| `FindingsListComponent` | `features/findings/findings-list.component.ts` | Needs: AI chip integration | +| `TriageCanvasComponent` | `features/triage/` | Needs: AI panel section | + +## Delivery Tracker + +### Phase 1: Core AI Chip Components +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 1 | AIUX-01 | DONE | None | FE Guild | Create `AiAuthorityBadge` component: "Evidence-backed" (green) / "Suggestion" (amber) labels | +| 2 | AIUX-02 | DONE | None | FE Guild | Create `AiChip` base component: 3-5 word action chips with icon + label + onClick | +| 3 | AIUX-03 | DONE | AIUX-02 | FE Guild | Create `ExplainChip` ("Explain" / "Explain with evidence") using AiChip base | +| 4 | AIUX-04 | DONE | AIUX-02 | FE Guild | Create `FixChip` ("Fix in 1 PR" / "Fix available") using AiChip base | +| 5 | AIUX-05 | DONE | AIUX-02 | FE Guild | Create `VexDraftChip` ("Draft VEX" / "VEX candidate") using AiChip base | +| 6 | AIUX-06 | DONE | AIUX-02 | FE Guild | Create `NeedsEvidenceChip` ("Needs: runtime confirmation" / "Gather evidence") using AiChip base | +| 7 | AIUX-07 | DONE | AIUX-02 | FE Guild | Create `ExploitabilityChip` ("Likely Not Exploitable" / "Reachable Path Found") using AiChip base | + +### Phase 2: 3-Line AI Summary Component +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 8 | AIUX-08 | DONE | AIUX-01 | FE Guild | Create `AiSummary` component: 3-line max content + expand affordance | +| 9 | AIUX-09 | DONE | AIUX-08 | FE Guild | Implement template structure: line 1 (what changed), line 2 (why it matters), line 3 (next action) | +| 10 | AIUX-10 | DONE | AIUX-09 | FE Guild | Add "Show details" / "Show evidence" / "Show alternative fixes" expand buttons | +| 11 | AIUX-11 | DONE | AIUX-10 | FE Guild | Create `AiSummaryExpanded` view: full explanation with citations panel | +| 12 | AIUX-12 | DONE | AIUX-11 | FE Guild | Citation click → evidence node drill-down (reuse EvidenceDrawer) | + +### Phase 3: AI Panel in Finding Detail +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 13 | AIUX-13 | DONE | None | FE Guild | Define `FindingDetailLayout` with 3 stacked panels: Verdict (authoritative) → Evidence (authoritative) → AI (assistant) | +| 14 | AIUX-14 | DONE | AIUX-13 | FE Guild | Create `VerdictPanel`: policy outcome, severity, SLA, scope, "what would change verdict" | +| 15 | AIUX-15 | DONE | AIUX-14 | FE Guild | Create `EvidencePanel` (collapsible): reachability graph, runtime evidence, VEX, patches | +| 16 | AIUX-16 | DONE | AIUX-15 | FE Guild | Create `AiAssistPanel`: explanation (3-line), remediation steps, "cheapest next evidence", draft buttons | +| 17 | AIUX-17 | DONE | AIUX-16 | FE Guild | Add visual hierarchy: AI panel visually subordinate (lighter background, smaller header) | +| 18 | AIUX-18 | DONE | AIUX-16 | FE Guild | Enforce citation requirement: AI claims must link to evidence nodes or show "Suggestion" badge | + +### Phase 4: Contextual Command Bar ("Ask Stella") +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 19 | AIUX-19 | DONE | None | FE Guild | Create `AskStellaButton` component: small entry point on relevant screens | +| 20 | AIUX-20 | DONE | AIUX-19 | FE Guild | Create `AskStellaPanel` popover: auto-scoped to current context (finding/build/service/release) | +| 21 | AIUX-21 | DONE | AIUX-20 | FE Guild | Suggested prompts as buttons: "Explain why exploitable", "Show minimal evidence", "How to fix?" | +| 22 | AIUX-22 | DONE | AIUX-21 | FE Guild | Add context chips showing scope: "CVE-2025-XXXX", "api-service", "prod" | +| 23 | AIUX-23 | DONE | AIUX-21 | FE Guild | Implement prompt → AI request → streaming response display | +| 24 | AIUX-24 | DONE | AIUX-23 | FE Guild | Limit freeform input (not a chatbot): show suggested prompts prominently, freeform as secondary | + +### Phase 5: Findings List AI Integration +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 25 | AIUX-25 | DONE | AIUX-02 | FE Guild | Extend `FindingsListComponent` row to show max 2 AI chips (not more) | +| 26 | AIUX-26 | DONE | AIUX-25 | FE Guild | AI chip priority logic: Reachable Path > Fix Available > Needs Evidence > Exploitability | +| 27 | AIUX-27 | DONE | AIUX-26 | FE Guild | On hover: show 3-line AI preview tooltip | +| 28 | AIUX-28 | DONE | AIUX-27 | FE Guild | On click (chip): open finding detail with AI panel visible | +| 29 | AIUX-29 | DONE | AIUX-25 | FE Guild | **Hard rule**: No full AI paragraphs in list view; chips only | + +### Phase 6: User Controls & Preferences +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 30 | AIUX-30 | DONE | None | FE Guild | Create `AiPreferences` settings panel in user profile | +| 31 | AIUX-31 | DONE | AIUX-30 | FE Guild | AI verbosity setting: Minimal / Standard / Detailed (affects 3-line default) | +| 32 | AIUX-32 | DONE | AIUX-31 | FE Guild | AI surfaces toggle: show in UI? show in PR comments? show in notifications? | +| 33 | AIUX-33 | DONE | AIUX-32 | FE Guild | Per-team AI notification opt-in (default: off for notifications) | +| 34 | AIUX-34 | DONE | AIUX-30 | FE Guild | Persist preferences in user settings API | + +### Phase 7: Dashboard AI Integration +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 35 | AIUX-35 | DONE | AIUX-08 | FE Guild | Executive dashboard: no generative narrative by default | +| 36 | AIUX-36 | DONE | AIUX-35 | FE Guild | Add "Top 3 risk drivers" with evidence links (AI-generated, evidence-grounded) | +| 37 | AIUX-37 | DONE | AIUX-36 | FE Guild | Add "Top 3 bottlenecks" (e.g., "missing runtime evidence in 42% of criticals") | +| 38 | AIUX-38 | DONE | AIUX-37 | FE Guild | Risk trend: deterministic (no AI); noise trend: % "Not exploitable" confirmed | + +### Phase 8: Testing & Documentation +| # | Task ID | Status | Key dependency | Owners | Task Definition | +| --- | --- | --- | --- | --- | --- | +| 39 | AIUX-39 | DONE | All Phase 1 | Testing Guild | Unit tests for all AI chip components | +| 40 | AIUX-40 | DONE | All Phase 2 | Testing Guild | Unit tests for AiSummary expansion/collapse | +| 41 | AIUX-41 | DONE | All Phase 4 | Testing Guild | E2E tests: Ask Stella flow from button to response | +| 42 | AIUX-42 | DONE | All Phase 5 | Testing Guild | Visual regression tests: chips don't overflow list rows | +| 43 | AIUX-43 | DONE | All above | Docs Guild | Document AI UX patterns in `docs/modules/web/ai-ux-patterns.md` | +| 44 | AIUX-44 | DONE | AIUX-43 | Docs Guild | Create AI chip usage guidelines with examples | + +## Component Specifications + +### AiChip Component +```typescript +@Component({ + selector: 'stella-ai-chip', + template: ` + + {{ icon() }} + {{ label() }} + + ` +}) +export class AiChipComponent { + label = input.required(); // Max 5 words + icon = input(''); + variant = input<'action' | 'status' | 'evidence'>('action'); + onClick = output(); +} +``` + +### AiSummary Component +```typescript +@Component({ + selector: 'stella-ai-summary', + template: ` +
+ +
+

{{ line1() }}

+

{{ line2() }}

+

{{ line3() }}

+
+ @if (hasMore()) { + + } +
+ ` +}) +export class AiSummaryComponent { + line1 = input.required(); // What changed + line2 = input.required(); // Why it matters + line3 = input.required(); // Next action + authority = input<'evidence-backed' | 'suggestion'>('suggestion'); + hasMore = input(false); + expandLabel = input('details'); + expanded = signal(false); +} +``` + +### Finding Row AI Chip Rules +``` +| Finding severity | Policy state | Max 2 AI chips | +|------------------|--------------|----------------| +| Any | BLOCK | Reachable Path + Fix Available | +| Any | WARN | Exploitability + Fix Available | +| Critical/High | Any | Reachable Path + Next Evidence | +| Medium/Low | Any | Exploitability (only 1 chip) | +``` + +## UI Mockup References + +### Findings List Row +``` +┌──────────────────────────────────────────────────────────────────────────────┐ +│ CVE-2025-1234 │ Critical │ BLOCK │ [Reachable Path] [Fix in 1 PR] │ Explain │ +└──────────────────────────────────────────────────────────────────────────────┘ + ↑ chips (max 2) ↑ action +``` + +### Finding Detail 3-Panel Layout +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ VERDICT PANEL (authoritative) │ +│ ┌─────────────────────────────────────────────────────────────────────────┐ │ +│ │ Critical │ BLOCK │ SLA: 3 days │ Reachable: Confirmed │ │ +│ │ "What would change verdict: Prove code path unreachable or apply fix" │ │ +│ └─────────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ EVIDENCE PANEL (authoritative, collapsible) [▼] │ +│ ┌─────────────────────────────────────────────────────────────────────────┐ │ +│ │ Reachability: main→parse_input→vulnerable_fn (3 hops) │ │ +│ │ VEX: vendor=affected, distro=not_affected → Merged: affected │ │ +│ │ Runtime: loaded in api-gw (observed 2025-12-25) │ │ +│ └─────────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ AI ASSIST (non-authoritative) [Evidence-backed]│ +│ ┌─────────────────────────────────────────────────────────────────────────┐ │ +│ │ libfoo 1.2.3 introduced CVE-2025-1234 in this build. │ │ +│ │ Vulnerable function called via path main→parse_input→fn. │ │ +│ │ Fastest fix: bump libfoo to 1.2.5 (PR ready). │ │ +│ │ [Show details ▼] │ │ +│ └─────────────────────────────────────────────────────────────────────────┘ │ +│ [Explain] [Fix] [Draft VEX] [Show evidence] │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### Ask Stella Command Bar +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ Ask Stella [CVE-2025-1234] [prod] │ +│ ─────────────────────────────────────────────────────────────────────────── │ +│ [Explain why exploitable] [Show minimal evidence] [How to fix?] │ +│ [Draft VEX] [What test closes Unknown?] │ +│ ─────────────────────────────────────────────────────────────────────────── │ +│ Or type your question... [Ask] │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +## Execution Log +| Date (UTC) | Update | Owner | +| --- | --- | --- | +| 2025-12-26 | Sprint created from AI Surfacing Advisory; defines component library for non-obtrusive AI UX. | Project Mgmt | +| 2025-12-26 | AIUX-01/02: Created ai-authority-badge.component.ts and ai-chip.component.ts in `shared/components/ai/` | Claude | +| 2025-12-26 | AIUX-03/04/05/06/07: Created specialized chip components: ai-explain-chip, ai-fix-chip, ai-vex-draft-chip, ai-needs-evidence-chip, ai-exploitability-chip | Claude | +| 2025-12-26 | AIUX-08/09/10/11/12: Created ai-summary.component.ts with 3-line structure, expand affordance, and citation drill-down | Claude | +| 2025-12-26 | AIUX-16/17/18: Created ai-assist-panel.component.ts with visual hierarchy and citation requirements | Claude | +| 2025-12-26 | AIUX-19/20/21/22/23/24: Created ask-stella-button.component.ts and ask-stella-panel.component.ts with suggested prompts and context chips | Claude | +| 2025-12-26 | AIUX-39/40: Created unit tests: ai-authority-badge.component.spec.ts, ai-chip.component.spec.ts, ai-summary.component.spec.ts | Claude | +| 2025-12-26 | Created index.ts for public API exports | Claude | +| 2025-12-26 | AIUX-13/14/15: Created `features/findings/detail/` with `finding-detail-layout.component.ts` (3-panel layout), `verdict-panel.component.ts` (policy outcome, SLA, reachability, verdictChangeHint), `evidence-panel.component.ts` (reachability path, runtime observations, VEX claims, patches). | Claude Code | +| 2025-12-26 | AIUX-25/26/27/28/29: Created `ai-chip-row.component.ts` with max 2 chips display, priority logic (BLOCK: Reachable+Fix, WARN: Exploitability+Fix, Critical/High: Reachable+Evidence, Medium/Low: Exploitability only), hover tooltip with 3-line preview, click to open detail. | Claude Code | +| 2025-12-26 | AIUX-30/31/32/33/34: Created `features/settings/ai-preferences.component.ts` with verbosity (Minimal/Standard/Detailed), surface toggles (UI/PR comments/notifications), per-team notification opt-in, save/reset actions. | Claude Code | +| 2025-12-26 | AIUX-35/36/37/38: Created `features/dashboard/ai-risk-drivers.component.ts` with Top 3 risk drivers (evidence-linked), Top 3 bottlenecks (actionable), deterministic risk/noise trends. | Claude Code | +| 2025-12-26 | AIUX-43/44: Created `docs/modules/web/ai-ux-patterns.md` with comprehensive documentation: core principles (7 non-negotiables), component library, 3-panel layout spec, chip display rules, Ask Stella command bar, user preferences, dashboard integration, testing requirements. | Claude Code | +| 2025-12-26 | Sprint completed - all 44 tasks DONE. Archived to `archived/2025-12-26-completed/ai/`. | Claude | + +## Decisions & Risks +- Decision: 3-line hard limit vs soft limit? Recommend: hard limit; expandable for more. +- Decision: AI chip max per row? Recommend: 2 chips max; prevents visual clutter. +- Decision: Authority badge colors? Recommend: Green (evidence-backed), Amber (suggestion), not red. +- Risk: AI latency degrading UX. Mitigation: skeleton loaders; cache AI responses. +- Risk: Users ignoring AI because it's too hidden. Mitigation: chips are clickable; preview on hover. + +## Cross-References +- **SPRINT_20251226_015_AI_zastava_companion**: Tasks ZASTAVA-15/16/17/18 depend on this sprint's components. +- **SPRINT_20251226_013_FE_triage_canvas**: Tasks TRIAGE-14/15/16/17 use AiRecommendationPanel from here. +- **SPRINT_20251226_016_AI_remedy_autopilot**: Uses FixChip component from AIUX-04. + +## Next Checkpoints +- 2025-12-30 | AIUX-07 complete | Core AI chip components ready | +- 2026-01-02 | AIUX-18 complete | Finding detail 3-panel layout with AI | +- 2026-01-06 | AIUX-44 complete | Full documentation and tests | diff --git a/docs/implplan/SPRINT_20251226_001_CICD_gitea_scripts.md b/docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_001_CICD_gitea_scripts.md similarity index 100% rename from docs/implplan/SPRINT_20251226_001_CICD_gitea_scripts.md rename to docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_001_CICD_gitea_scripts.md diff --git a/docs/implplan/SPRINT_20251226_002_CICD_devops_consolidation.md b/docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_002_CICD_devops_consolidation.md similarity index 100% rename from docs/implplan/SPRINT_20251226_002_CICD_devops_consolidation.md rename to docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_002_CICD_devops_consolidation.md diff --git a/docs/implplan/SPRINT_20251226_003_CICD_test_matrix.md b/docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_003_CICD_test_matrix.md similarity index 100% rename from docs/implplan/SPRINT_20251226_003_CICD_test_matrix.md rename to docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_003_CICD_test_matrix.md diff --git a/docs/implplan/SPRINT_20251226_004_CICD_module_publishing.md b/docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_004_CICD_module_publishing.md similarity index 100% rename from docs/implplan/SPRINT_20251226_004_CICD_module_publishing.md rename to docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_004_CICD_module_publishing.md diff --git a/docs/implplan/SPRINT_20251226_005_CICD_suite_release.md b/docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_005_CICD_suite_release.md similarity index 100% rename from docs/implplan/SPRINT_20251226_005_CICD_suite_release.md rename to docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_005_CICD_suite_release.md diff --git a/docs/implplan/SPRINT_20251226_006_CICD_local_docker.md b/docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_006_CICD_local_docker.md similarity index 100% rename from docs/implplan/SPRINT_20251226_006_CICD_local_docker.md rename to docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_006_CICD_local_docker.md diff --git a/docs/implplan/SPRINT_20251226_007_CICD_test_coverage_gap.md b/docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_007_CICD_test_coverage_gap.md similarity index 100% rename from docs/implplan/SPRINT_20251226_007_CICD_test_coverage_gap.md rename to docs/implplan/archived/2025-12-26-completed/cicd/SPRINT_20251226_007_CICD_test_coverage_gap.md diff --git a/fix_usings.py b/fix_usings.py new file mode 100644 index 000000000..da45278f5 --- /dev/null +++ b/fix_usings.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +"""Fix misplaced 'using StellaOps.TestKit;' statements in C# files.""" + +import os +import re +from pathlib import Path + +def fix_file(filepath: Path) -> bool: + """Fix a single file. Returns True if modified.""" + content = filepath.read_text(encoding='utf-8-sig') + lines = content.split('\n') + + # Check if this line appears misplaced (after line 30, which is definitely past usings) + misplaced_indices = [] + for i, line in enumerate(lines): + if line.strip() == 'using StellaOps.TestKit;' and i > 25: + misplaced_indices.append(i) + + if not misplaced_indices: + return False + + # Remove the misplaced lines + new_lines = [line for i, line in enumerate(lines) if i not in misplaced_indices] + + # Write back + new_content = '\n'.join(new_lines) + filepath.write_text(new_content, encoding='utf-8') + return True + +def main(): + src_dir = Path(r'E:\dev\git.stella-ops.org\src') + fixed_count = 0 + + for cs_file in src_dir.rglob('*.cs'): + try: + if fix_file(cs_file): + fixed_count += 1 + print(f"Fixed: {cs_file}") + except Exception as e: + print(f"Error processing {cs_file}: {e}") + + print(f"\nFixed {fixed_count} files") + +if __name__ == '__main__': + main() diff --git a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailInjectionTests.cs b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailInjectionTests.cs index ce52666ff..2ae1a48fb 100644 --- a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailInjectionTests.cs +++ b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailInjectionTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Immutable; using System.Globalization; using System.IO; @@ -129,7 +129,6 @@ public sealed class AdvisoryGuardrailInjectionTests } using var stream = File.OpenRead(path); -using StellaOps.TestKit; var cases = JsonSerializer.Deserialize>(stream, SerializerOptions); return cases ?? throw new InvalidOperationException("Guardrail injection harness cases could not be loaded."); } diff --git a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailOptionsBindingTests.cs b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailOptionsBindingTests.cs index 5ae109c77..404d13ba8 100644 --- a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailOptionsBindingTests.cs +++ b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailOptionsBindingTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; @@ -67,7 +67,6 @@ public sealed class AdvisoryGuardrailOptionsBindingTests services.AddAdvisoryAiCore(configuration); await using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var action = () => provider.GetRequiredService>().Value; action.Should().Throw(); } diff --git a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailPerformanceTests.cs b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailPerformanceTests.cs index 904d2d3d0..b6899c68d 100644 --- a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailPerformanceTests.cs +++ b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryGuardrailPerformanceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; @@ -118,7 +118,6 @@ public sealed class AdvisoryGuardrailPerformanceTests var path = Path.Combine(AppContext.BaseDirectory, "TestData", "guardrail-blocked-phrases.json"); using var stream = File.OpenRead(path); using var document = JsonDocument.Parse(stream); -using StellaOps.TestKit; if (document.RootElement.TryGetProperty("phrases", out var phrasesElement) && phrasesElement.ValueKind == JsonValueKind.Array) { return phrasesElement.EnumerateArray() diff --git a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPipelineExecutorTests.cs b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPipelineExecutorTests.cs index 6ad23992c..6b511d529 100644 --- a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPipelineExecutorTests.cs +++ b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPipelineExecutorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.Metrics; @@ -178,7 +178,6 @@ public sealed class AdvisoryPipelineExecutorTests : IDisposable var guardrail = new StubGuardrailPipeline(blocked: false); var store = new InMemoryAdvisoryOutputStore(); using var metrics = new AdvisoryPipelineMetrics(_meterFactory); -using StellaOps.TestKit; var inferenceMetadata = ImmutableDictionary.Empty.Add("inference.fallback_reason", "throttle"); var inference = new StubInferenceClient { diff --git a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPromptAssemblerTests.cs b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPromptAssemblerTests.cs index d2954908c..1b90e3410 100644 --- a/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPromptAssemblerTests.cs +++ b/src/AdvisoryAI/__Tests/StellaOps.AdvisoryAI.Tests/AdvisoryPromptAssemblerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Immutable; using System.IO; using System.Linq; @@ -71,7 +71,6 @@ public sealed class AdvisoryPromptAssemblerTests var prompt = await assembler.AssembleAsync(plan, CancellationToken.None); using var document = JsonDocument.Parse(prompt.Prompt); -using StellaOps.TestKit; var matches = document.RootElement .GetProperty("vectors")[0] .GetProperty("matches") diff --git a/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/HttpClientUsageAnalyzerTests.cs b/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/HttpClientUsageAnalyzerTests.cs index 3ffd157b0..08e72e685 100644 --- a/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/HttpClientUsageAnalyzerTests.cs +++ b/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/HttpClientUsageAnalyzerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -118,7 +118,6 @@ public sealed class HttpClientUsageAnalyzerTests { using var workspace = new AdhocWorkspace(); -using StellaOps.TestKit; var projectId = ProjectId.CreateNewId(); var documentId = DocumentId.CreateNewId(projectId); var stubDocumentId = DocumentId.CreateNewId(projectId); diff --git a/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/PolicyAnalyzerRoslynTests.cs b/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/PolicyAnalyzerRoslynTests.cs index 6303eca13..873202c1e 100644 --- a/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/PolicyAnalyzerRoslynTests.cs +++ b/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Analyzers.Tests/PolicyAnalyzerRoslynTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // PolicyAnalyzerRoslynTests.cs // Sprint: SPRINT_5100_0010_0004_airgap_tests // Tasks: AIRGAP-5100-005, AIRGAP-5100-006 @@ -485,7 +485,6 @@ public sealed class PolicyAnalyzerRoslynTests { using var workspace = new AdhocWorkspace(); -using StellaOps.TestKit; var projectId = ProjectId.CreateNewId(); var documentId = DocumentId.CreateNewId(projectId); var stubDocumentId = DocumentId.CreateNewId(projectId); diff --git a/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Tests/EgressPolicyTests.cs b/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Tests/EgressPolicyTests.cs index 2da08be10..285d9ff37 100644 --- a/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Tests/EgressPolicyTests.cs +++ b/src/AirGap/StellaOps.AirGap.Policy/StellaOps.AirGap.Policy.Tests/EgressPolicyTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net.Http; using System.Threading; @@ -202,7 +202,6 @@ public sealed class EgressPolicyTests using var client = EgressHttpClientFactory.Create(recordingPolicy, request); -using StellaOps.TestKit; Assert.True(recordingPolicy.EnsureAllowedCalled); Assert.NotNull(client); } diff --git a/src/AirGap/__Libraries/__Tests/StellaOps.AirGap.Bundle.Tests/BundleImportTests.cs b/src/AirGap/__Libraries/__Tests/StellaOps.AirGap.Bundle.Tests/BundleImportTests.cs index c028e44db..0ef72db76 100644 --- a/src/AirGap/__Libraries/__Tests/StellaOps.AirGap.Bundle.Tests/BundleImportTests.cs +++ b/src/AirGap/__Libraries/__Tests/StellaOps.AirGap.Bundle.Tests/BundleImportTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Security.Cryptography; using System.Text; using FluentAssertions; @@ -14,7 +14,7 @@ using StellaOps.TestKit; namespace StellaOps.AirGap.Bundle.Tests; /// -/// Unit tests for bundle import: bundle → data → verify integrity. +/// Unit tests for bundle import: bundle → data → verify integrity. /// Tests that bundle import correctly validates and loads all components. /// public sealed class BundleImportTests : IAsyncLifetime @@ -554,7 +554,6 @@ public sealed class BundleImportTests : IAsyncLifetime private static async Task ComputeFileDigestAsync(string filePath) { await using var stream = File.OpenRead(filePath); -using StellaOps.TestKit; var hash = await SHA256.HashDataAsync(stream); return Convert.ToHexString(hash).ToLowerInvariant(); } diff --git a/src/AirGap/__Tests/StellaOps.AirGap.Importer.Tests/AirGapControllerContractTests.cs b/src/AirGap/__Tests/StellaOps.AirGap.Importer.Tests/AirGapControllerContractTests.cs index 378b1ab65..ce258aa16 100644 --- a/src/AirGap/__Tests/StellaOps.AirGap.Importer.Tests/AirGapControllerContractTests.cs +++ b/src/AirGap/__Tests/StellaOps.AirGap.Importer.Tests/AirGapControllerContractTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // AirGapControllerContractTests.cs // Sprint: SPRINT_5100_0010_0004_airgap_tests // Tasks: AIRGAP-5100-010, AIRGAP-5100-011, AIRGAP-5100-012 @@ -364,7 +364,6 @@ public sealed class AirGapControllerContractTests { // Arrange - Create a trace context using var activity = new Activity("test-airgap-operation"); -using StellaOps.TestKit; activity.Start(); // Act diff --git a/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocGuardEndpointFilterExtensionsTests.cs b/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocGuardEndpointFilterExtensionsTests.cs index 185fc0894..a28c6f874 100644 --- a/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocGuardEndpointFilterExtensionsTests.cs +++ b/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocGuardEndpointFilterExtensionsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; @@ -46,7 +46,6 @@ public sealed class AocGuardEndpointFilterExtensionsTests builder.Services.AddAocGuard(); using var app = builder.Build(); -using StellaOps.TestKit; var route = app.MapPost("/guard-object", (GuardPayload _) => TypedResults.Ok()); var result = route.RequireAocGuard(_ => new GuardPayload(JsonDocument.Parse("{}").RootElement)); diff --git a/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocHttpResultsTests.cs b/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocHttpResultsTests.cs index 09ec84fd0..5f22b168d 100644 --- a/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocHttpResultsTests.cs +++ b/src/Aoc/__Tests/StellaOps.Aoc.AspNetCore.Tests/AocHttpResultsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.IO; using System.Text.Json; using System.Threading.Tasks; @@ -37,7 +37,6 @@ public sealed class AocHttpResultsTests context.Response.Body.Seek(0, SeekOrigin.Begin); using var document = await JsonDocument.ParseAsync(context.Response.Body, cancellationToken: TestContext.Current.CancellationToken); -using StellaOps.TestKit; var root = document.RootElement; // Assert diff --git a/src/Aoc/__Tests/StellaOps.Aoc.Tests/AocWriteGuardTests.cs b/src/Aoc/__Tests/StellaOps.Aoc.Tests/AocWriteGuardTests.cs index 5930eb189..ae6896a3d 100644 --- a/src/Aoc/__Tests/StellaOps.Aoc.Tests/AocWriteGuardTests.cs +++ b/src/Aoc/__Tests/StellaOps.Aoc.Tests/AocWriteGuardTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Aoc; @@ -203,7 +203,6 @@ public sealed class AocWriteGuardTests } """); -using StellaOps.TestKit; var result = Guard.Validate(document.RootElement); Assert.False(result.IsValid); diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseCosignCompatibilityTestFixture.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseCosignCompatibilityTestFixture.cs deleted file mode 100644 index ee1ef3cfb..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseCosignCompatibilityTestFixture.cs +++ /dev/null @@ -1,352 +0,0 @@ -// ----------------------------------------------------------------------------- -// DsseCosignCompatibilityTestFixture.cs -// Sprint: SPRINT_8200_0001_0002_dsse_roundtrip_testing -// Tasks: DSSE-8200-013, DSSE-8200-014, DSSE-8200-015 -// Description: Test fixture for cosign compatibility testing with mock Fulcio/Rekor -// ----------------------------------------------------------------------------- - -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Text.Json; - -namespace StellaOps.Attestor.Envelope.Tests; - -/// -/// Test fixture for cosign compatibility tests. -/// Provides mock Fulcio certificates and Rekor entries for offline testing. -/// -public sealed class DsseCosignCompatibilityTestFixture : IDisposable -{ - private readonly ECDsa _signingKey; - private readonly X509Certificate2 _certificate; - private readonly string _keyId; - private bool _disposed; - - /// - /// Creates a new fixture with mock Fulcio-style certificate. - /// - public DsseCosignCompatibilityTestFixture() - { - _signingKey = ECDsa.Create(ECCurve.NamedCurves.nistP256); - _keyId = $"cosign-test-{Guid.NewGuid():N}"; - _certificate = CreateMockFulcioCertificate(_signingKey); - } - - /// - /// Gets the mock Fulcio certificate. - /// - public X509Certificate2 Certificate => _certificate; - - /// - /// Gets the signing key. - /// - public ECDsa SigningKey => _signingKey; - - /// - /// Gets the key ID. - /// - public string KeyId => _keyId; - - // DSSE-8200-014: Mock Fulcio certificate generation - - /// - /// Creates a mock certificate mimicking Fulcio's structure for testing. - /// - public static X509Certificate2 CreateMockFulcioCertificate( - ECDsa key, - string subject = "test@example.com", - string issuer = "https://oauth2.sigstore.dev/auth", - DateTimeOffset? validFrom = null, - DateTimeOffset? validTo = null) - { - validFrom ??= DateTimeOffset.UtcNow.AddMinutes(-5); - validTo ??= DateTimeOffset.UtcNow.AddMinutes(15); // Fulcio certs are short-lived (~20 min) - - var request = new CertificateRequest( - new X500DistinguishedName($"CN={subject}"), - key, - HashAlgorithmName.SHA256); - - // Add extensions similar to Fulcio - request.CertificateExtensions.Add( - new X509KeyUsageExtension( - X509KeyUsageFlags.DigitalSignature, - critical: true)); - - request.CertificateExtensions.Add( - new X509EnhancedKeyUsageExtension( - new OidCollection { new Oid("1.3.6.1.5.5.7.3.3") }, // Code Signing - critical: false)); - - // Add Subject Alternative Name (SAN) for identity - var sanBuilder = new SubjectAlternativeNameBuilder(); - sanBuilder.AddEmailAddress(subject); - request.CertificateExtensions.Add(sanBuilder.Build()); - - // Create self-signed cert (in real Fulcio this would be CA-signed) - return request.CreateSelfSigned(validFrom.Value, validTo.Value); - } - - // DSSE-8200-013: Cosign-compatible envelope creation - - /// - /// Signs a payload and creates a cosign-compatible DSSE envelope. - /// - public DsseEnvelope SignCosignCompatible( - ReadOnlySpan payload, - string payloadType = "application/vnd.in-toto+json") - { - // Build PAE (Pre-Authentication Encoding) - var pae = BuildPae(payloadType, payload); - - // Sign with EC key (ES256 - what cosign uses) - var signatureBytes = _signingKey.SignData(pae, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence); - - // Base64 encode signature as cosign expects - var signatureBase64 = Convert.ToBase64String(signatureBytes); - - var signature = new DsseSignature(signatureBase64, _keyId); - return new DsseEnvelope(payloadType, payload.ToArray(), [signature]); - } - - /// - /// Creates a Sigstore bundle structure for testing. - /// - public CosignCompatibilityBundle CreateBundle(DsseEnvelope envelope, bool includeRekorEntry = false) - { - var certPem = ExportCertificateToPem(_certificate); - var certChain = new List { certPem }; - - MockRekorEntry? rekorEntry = null; - if (includeRekorEntry) - { - rekorEntry = CreateMockRekorEntry(envelope); - } - - return new CosignCompatibilityBundle( - envelope, - certChain, - rekorEntry); - } - - // DSSE-8200-015: Mock Rekor entry for offline verification - - /// - /// Creates a mock Rekor transparency log entry for testing. - /// - public MockRekorEntry CreateMockRekorEntry( - DsseEnvelope envelope, - long logIndex = 12345678, - long? treeSize = null) - { - treeSize ??= logIndex + 1000; - - // Serialize envelope to get canonicalized body - var serializationResult = DsseEnvelopeSerializer.Serialize(envelope, new DsseEnvelopeSerializationOptions - { - EmitCompactJson = true, - EmitExpandedJson = false - }); - - var canonicalizedBody = serializationResult.CompactJson ?? []; - var bodyBase64 = Convert.ToBase64String(canonicalizedBody); - - // Compute leaf hash (SHA256 of the canonicalized body) - var leafHash = SHA256.HashData(canonicalizedBody); - - // Generate synthetic Merkle proof - var (proofHashes, rootHash) = GenerateSyntheticMerkleProof(leafHash, logIndex, treeSize.Value); - - var integratedTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - - return new MockRekorEntry( - LogIndex: logIndex, - LogId: "rekor.sigstore.dev", - IntegratedTime: integratedTime, - CanonicalizedBody: bodyBase64, - InclusionProof: new MockInclusionProof( - LogIndex: logIndex, - TreeSize: treeSize.Value, - RootHash: Convert.ToBase64String(rootHash), - Hashes: proofHashes.ConvertAll(h => Convert.ToBase64String(h)), - Checkpoint: $"rekor.sigstore.dev - {treeSize}\n{Convert.ToBase64String(rootHash)}")); - } - - /// - /// Validates that an envelope has the structure expected by cosign. - /// - public static CosignStructureValidationResult ValidateCosignStructure(DsseEnvelope envelope) - { - var errors = new List(); - - // Check payload type - if (string.IsNullOrEmpty(envelope.PayloadType)) - { - errors.Add("payloadType is required"); - } - - // Check payload is present - if (envelope.Payload.Length == 0) - { - errors.Add("payload is required"); - } - - // Check signatures - if (envelope.Signatures.Count == 0) - { - errors.Add("at least one signature is required"); - } - - foreach (var sig in envelope.Signatures) - { - // Signature should be base64-encoded - if (string.IsNullOrEmpty(sig.Signature)) - { - errors.Add("signature value is required"); - } - else if (!IsValidBase64(sig.Signature)) - { - errors.Add($"signature is not valid base64: {sig.Signature[..Math.Min(20, sig.Signature.Length)]}..."); - } - } - - return new CosignStructureValidationResult(errors.Count == 0, errors); - } - - private static byte[] BuildPae(string payloadType, ReadOnlySpan payload) - { - // PAE = "DSSEv1" || SP || len(type) || SP || type || SP || len(payload) || SP || payload - const string prefix = "DSSEv1 "; - var typeBytes = Encoding.UTF8.GetBytes(payloadType); - - var buffer = new List(); - buffer.AddRange(Encoding.UTF8.GetBytes(prefix)); - buffer.AddRange(Encoding.UTF8.GetBytes(typeBytes.Length.ToString())); - buffer.Add((byte)' '); - buffer.AddRange(typeBytes); - buffer.Add((byte)' '); - buffer.AddRange(Encoding.UTF8.GetBytes(payload.Length.ToString())); - buffer.Add((byte)' '); - buffer.AddRange(payload.ToArray()); - - return buffer.ToArray(); - } - - private static string ExportCertificateToPem(X509Certificate2 cert) - { - var certBytes = cert.Export(X509ContentType.Cert); - var base64 = Convert.ToBase64String(certBytes); - - var sb = new StringBuilder(); - sb.AppendLine("-----BEGIN CERTIFICATE-----"); - for (var i = 0; i < base64.Length; i += 64) - { - sb.AppendLine(base64.Substring(i, Math.Min(64, base64.Length - i))); - } - sb.AppendLine("-----END CERTIFICATE-----"); - return sb.ToString(); - } - - private static (List proofHashes, byte[] rootHash) GenerateSyntheticMerkleProof( - byte[] leafHash, - long logIndex, - long treeSize) - { - // Generate a synthetic but valid Merkle proof structure - var proofHashes = new List(); - var currentHash = leafHash; - - // Compute tree height - var height = (int)Math.Ceiling(Math.Log2(Math.Max(treeSize, 2))); - - // Generate sibling hashes for each level - var random = new Random((int)(logIndex % int.MaxValue)); // Deterministic from logIndex - var siblingBytes = new byte[32]; - - for (var level = 0; level < height; level++) - { - random.NextBytes(siblingBytes); - proofHashes.Add((byte[])siblingBytes.Clone()); - - // Compute parent hash (simplified - real Merkle tree would be more complex) - var combined = new byte[64]; - if ((logIndex >> level) % 2 == 0) - { - currentHash.CopyTo(combined, 0); - siblingBytes.CopyTo(combined, 32); - } - else - { - siblingBytes.CopyTo(combined, 0); - currentHash.CopyTo(combined, 32); - } - currentHash = SHA256.HashData(combined); - } - - return (proofHashes, currentHash); - } - - private static bool IsValidBase64(string value) - { - if (string.IsNullOrEmpty(value)) - { - return false; - } - - try - { - Convert.FromBase64String(value); - return true; - } - catch (FormatException) - { - return false; - } - } - - public void Dispose() - { - if (!_disposed) - { - _signingKey.Dispose(); - _certificate.Dispose(); - _disposed = true; - } - } -} - -/// -/// Result of cosign structure validation. -/// -public sealed record CosignStructureValidationResult(bool IsValid, List Errors); - -/// -/// Test bundle with Fulcio certificate chain for cosign compatibility testing. -/// -public sealed record CosignCompatibilityBundle( - DsseEnvelope Envelope, - List CertificateChain, - MockRekorEntry? RekorEntry); - -/// -/// Mock Rekor transparency log entry for testing. -/// -public sealed record MockRekorEntry( - long LogIndex, - string LogId, - long IntegratedTime, - string CanonicalizedBody, - MockInclusionProof InclusionProof); - -/// -/// Mock Merkle inclusion proof for testing. -/// -public sealed record MockInclusionProof( - long LogIndex, - long TreeSize, - string RootHash, - List Hashes, - string Checkpoint); diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseCosignCompatibilityTests.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseCosignCompatibilityTests.cs deleted file mode 100644 index 962a55b6d..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseCosignCompatibilityTests.cs +++ /dev/null @@ -1,423 +0,0 @@ -// ----------------------------------------------------------------------------- -// DsseCosignCompatibilityTests.cs -// Sprint: SPRINT_8200_0001_0002_dsse_roundtrip_testing -// Tasks: DSSE-8200-013, DSSE-8200-014, DSSE-8200-015 -// Description: Cosign compatibility tests with mock Fulcio/Rekor (no CLI required) -// ----------------------------------------------------------------------------- - -using System; -using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Text.Json; -using Xunit; - -namespace StellaOps.Attestor.Envelope.Tests; - -/// -/// Tests for cosign compatibility without requiring external cosign CLI. -/// Validates envelope structure, Fulcio certificate handling, and Rekor entry format. -/// -public sealed class DsseCosignCompatibilityTests : IDisposable -{ - private readonly DsseCosignCompatibilityTestFixture _fixture; - - public DsseCosignCompatibilityTests() - { - _fixture = new DsseCosignCompatibilityTestFixture(); - } - - // ========================================================================== - // DSSE-8200-013: Cosign-compatible envelope structure tests - // ========================================================================== - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EnvelopeStructure_HasRequiredFields_ForCosignVerification() - { - // Arrange - var payload = CreateTestInTotoStatement(); - - // Act - var envelope = _fixture.SignCosignCompatible(payload); - - // Assert - Validate cosign-expected structure - var result = DsseCosignCompatibilityTestFixture.ValidateCosignStructure(envelope); - Assert.True(result.IsValid, $"Structure validation failed: {string.Join(", ", result.Errors)}"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EnvelopePayload_IsBase64Encoded_InSerializedForm() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var serialized = DsseEnvelopeSerializer.Serialize(envelope, new DsseEnvelopeSerializationOptions - { - EmitCompactJson = true - }); - - var json = JsonDocument.Parse(serialized.CompactJson!); - - // Assert - payload should be base64-encoded in the JSON - var payloadField = json.RootElement.GetProperty("payload").GetString(); - Assert.NotNull(payloadField); - Assert.DoesNotContain("\n", payloadField); // No newlines in base64 - - // Verify it decodes back to original - var decoded = Convert.FromBase64String(payloadField); - Assert.Equal(payload, decoded); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EnvelopeSignature_IsBase64Encoded_InSerializedForm() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var serialized = DsseEnvelopeSerializer.Serialize(envelope, new DsseEnvelopeSerializationOptions - { - EmitCompactJson = true - }); - - var json = JsonDocument.Parse(serialized.CompactJson!); - - // Assert - signatures array exists with valid base64 - var signatures = json.RootElement.GetProperty("signatures"); - Assert.Equal(JsonValueKind.Array, signatures.ValueKind); - Assert.True(signatures.GetArrayLength() >= 1); - - var firstSig = signatures[0]; - var sigValue = firstSig.GetProperty("sig").GetString(); - Assert.NotNull(sigValue); - - // Verify it's valid base64 - var sigBytes = Convert.FromBase64String(sigValue); - Assert.True(sigBytes.Length > 0); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EnvelopePayloadType_IsCorrectMimeType_ForInToto() - { - // Arrange - var payload = CreateTestInTotoStatement(); - - // Act - var envelope = _fixture.SignCosignCompatible(payload, "application/vnd.in-toto+json"); - - // Assert - Assert.Equal("application/vnd.in-toto+json", envelope.PayloadType); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EnvelopeSerialization_ProducesValidJson_WithoutWhitespace() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var serialized = DsseEnvelopeSerializer.Serialize(envelope, new DsseEnvelopeSerializationOptions - { - EmitCompactJson = true - }); - - var json = Encoding.UTF8.GetString(serialized.CompactJson!); - - // Assert - compact JSON should not have unnecessary whitespace - Assert.DoesNotContain("\n", json); - Assert.DoesNotContain(" ", json); // No double spaces - } - - // ========================================================================== - // DSSE-8200-014: Fulcio certificate chain tests - // ========================================================================== - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FulcioCertificate_HasCodeSigningEku() - { - // Arrange & Act - var cert = _fixture.Certificate; - - // Assert - Certificate should have Code Signing EKU - var hasCodeSigning = false; - foreach (var ext in cert.Extensions) - { - if (ext is X509EnhancedKeyUsageExtension eku) - { - foreach (var oid in eku.EnhancedKeyUsages) - { - if (oid.Value == "1.3.6.1.5.5.7.3.3") // Code Signing - { - hasCodeSigning = true; - break; - } - } - } - } - Assert.True(hasCodeSigning, "Certificate should have Code Signing EKU"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FulcioCertificate_HasDigitalSignatureKeyUsage() - { - // Arrange & Act - var cert = _fixture.Certificate; - - // Assert - var keyUsage = cert.Extensions["2.5.29.15"] as X509KeyUsageExtension; - Assert.NotNull(keyUsage); - Assert.True(keyUsage.KeyUsages.HasFlag(X509KeyUsageFlags.DigitalSignature)); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FulcioCertificate_IsShortLived() - { - // Arrange - Fulcio certs are typically valid for ~20 minutes - - // Act - var cert = _fixture.Certificate; - var validity = cert.NotAfter - cert.NotBefore; - - // Assert - Should be less than 24 hours (Fulcio's short-lived nature) - Assert.True(validity.TotalHours <= 24, $"Certificate validity ({validity.TotalHours}h) should be <= 24 hours"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BundleWithCertificate_HasValidPemFormat() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var bundle = _fixture.CreateBundle(envelope); - - // Assert - Assert.NotEmpty(bundle.CertificateChain); - var certPem = bundle.CertificateChain[0]; - Assert.StartsWith("-----BEGIN CERTIFICATE-----", certPem); - Assert.Contains("-----END CERTIFICATE-----", certPem); - } - - // ========================================================================== - // DSSE-8200-015: Rekor transparency log offline verification tests - // ========================================================================== - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RekorEntry_HasValidLogIndex() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var rekorEntry = _fixture.CreateMockRekorEntry(envelope); - - // Assert - Assert.True(rekorEntry.LogIndex >= 0); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RekorEntry_HasValidIntegratedTime() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var rekorEntry = _fixture.CreateMockRekorEntry(envelope); - var integratedTime = DateTimeOffset.FromUnixTimeSeconds(rekorEntry.IntegratedTime); - - // Assert - Should be within reasonable range - var now = DateTimeOffset.UtcNow; - Assert.True(integratedTime <= now.AddMinutes(1), "Integrated time should not be in the future"); - Assert.True(integratedTime >= now.AddHours(-1), "Integrated time should not be too old"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RekorEntry_HasValidInclusionProof() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var rekorEntry = _fixture.CreateMockRekorEntry(envelope, logIndex: 12345); - - // Assert - Assert.NotNull(rekorEntry.InclusionProof); - Assert.Equal(12345, rekorEntry.InclusionProof.LogIndex); - Assert.True(rekorEntry.InclusionProof.TreeSize > rekorEntry.InclusionProof.LogIndex); - Assert.NotEmpty(rekorEntry.InclusionProof.RootHash); - Assert.NotEmpty(rekorEntry.InclusionProof.Hashes); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RekorEntry_CanonicalizedBody_IsBase64Encoded() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var rekorEntry = _fixture.CreateMockRekorEntry(envelope); - - // Assert - Assert.NotEmpty(rekorEntry.CanonicalizedBody); - var decoded = Convert.FromBase64String(rekorEntry.CanonicalizedBody); - Assert.True(decoded.Length > 0); - - // Should be valid JSON - var json = JsonDocument.Parse(decoded); - Assert.NotNull(json); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RekorEntry_InclusionProof_HashesAreBase64() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var rekorEntry = _fixture.CreateMockRekorEntry(envelope); - - // Assert - foreach (var hash in rekorEntry.InclusionProof.Hashes) - { - var decoded = Convert.FromBase64String(hash); - Assert.Equal(32, decoded.Length); // SHA-256 hash length - } - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BundleWithRekor_ContainsValidTransparencyEntry() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var bundle = _fixture.CreateBundle(envelope, includeRekorEntry: true); - - // Assert - Assert.NotNull(bundle.RekorEntry); - Assert.NotEmpty(bundle.RekorEntry.LogId); - Assert.True(bundle.RekorEntry.LogIndex >= 0); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RekorEntry_CheckpointFormat_IsValid() - { - // Arrange - var payload = CreateTestInTotoStatement(); - var envelope = _fixture.SignCosignCompatible(payload); - - // Act - var rekorEntry = _fixture.CreateMockRekorEntry(envelope); - - // Assert - Checkpoint should contain log ID and root hash - Assert.NotEmpty(rekorEntry.InclusionProof.Checkpoint); - Assert.Contains("rekor.sigstore.dev", rekorEntry.InclusionProof.Checkpoint); - } - - // ========================================================================== - // Integration tests - // ========================================================================== - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FullBundle_SignVerifyRoundtrip_Succeeds() - { - // Arrange - var payload = CreateTestInTotoStatement(); - - // Act - Create complete bundle - var envelope = _fixture.SignCosignCompatible(payload); - var bundle = _fixture.CreateBundle(envelope, includeRekorEntry: true); - - // Assert - All components present and valid - Assert.NotNull(bundle.Envelope); - Assert.NotEmpty(bundle.CertificateChain); - Assert.NotNull(bundle.RekorEntry); - - // Verify envelope structure - var structureResult = DsseCosignCompatibilityTestFixture.ValidateCosignStructure(envelope); - Assert.True(structureResult.IsValid); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void DeterministicSigning_SamePayload_ProducesConsistentEnvelope() - { - // Arrange - var payload = CreateTestInTotoStatement(); - - // Act - Sign same payload twice with same key - var envelope1 = _fixture.SignCosignCompatible(payload); - var envelope2 = _fixture.SignCosignCompatible(payload); - - // Assert - Payload type and payload should be identical - Assert.Equal(envelope1.PayloadType, envelope2.PayloadType); - Assert.Equal(envelope1.Payload.ToArray(), envelope2.Payload.ToArray()); - - // Note: Signatures may differ if using randomized ECDSA - // (which is the default for security), so we only verify structure - Assert.Equal(envelope1.Signatures.Count, envelope2.Signatures.Count); -using StellaOps.TestKit; - } - - // ========================================================================== - // Helpers - // ========================================================================== - - private static byte[] CreateTestInTotoStatement() - { - var statement = new - { - _type = "https://in-toto.io/Statement/v0.1", - predicateType = "https://stellaops.io/attestations/reachability/v1", - subject = new[] - { - new { name = "test-artifact", digest = new { sha256 = "abc123" } } - }, - predicate = new - { - graphType = "reachability", - nodeCount = 100, - edgeCount = 250, - timestamp = DateTimeOffset.UtcNow.ToString("O") - } - }; - - return JsonSerializer.SerializeToUtf8Bytes(statement, new JsonSerializerOptions - { - WriteIndented = false - }); - } - - public void Dispose() - { - _fixture.Dispose(); - } -} diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseEnvelopeSerializerTests.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseEnvelopeSerializerTests.cs deleted file mode 100644 index a92e95fe9..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseEnvelopeSerializerTests.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using System.Text.Json; -using FluentAssertions; -using Xunit; -using EnvelopeModel = StellaOps.Attestor.Envelope; - -using StellaOps.TestKit; -namespace StellaOps.Attestor.Envelope.Tests; - -public sealed class DsseEnvelopeSerializerTests -{ - private static readonly byte[] SamplePayload = Encoding.UTF8.GetBytes("deterministic-dsse-payload"); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Serialize_ProducesDeterministicCompactJson_ForSignaturePermutations() - { - var signatures = new[] - { - EnvelopeModel.DsseSignature.FromBytes(Convert.FromHexString("0A1B2C3D4E5F60718293A4B5C6D7E8F9"), "tenant-z"), - EnvelopeModel.DsseSignature.FromBytes(Convert.FromHexString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"), null), - EnvelopeModel.DsseSignature.FromBytes(Convert.FromHexString("00112233445566778899AABBCCDDEEFF"), "tenant-a"), - EnvelopeModel.DsseSignature.FromBytes(Convert.FromHexString("1234567890ABCDEF1234567890ABCDEF"), "tenant-b") - }; - - var baselineEnvelope = new EnvelopeModel.DsseEnvelope("application/vnd.stellaops.test+json", SamplePayload, signatures); - var baseline = EnvelopeModel.DsseEnvelopeSerializer.Serialize(baselineEnvelope); - baseline.CompactJson.Should().NotBeNull(); - var baselineJson = Encoding.UTF8.GetString(baseline.CompactJson!); - - var rng = new Random(12345); - for (var iteration = 0; iteration < 32; iteration++) - { - var shuffled = signatures.OrderBy(_ => rng.Next()).ToArray(); - var envelope = new EnvelopeModel.DsseEnvelope("application/vnd.stellaops.test+json", SamplePayload, shuffled); - var result = EnvelopeModel.DsseEnvelopeSerializer.Serialize(envelope); - - result.CompactJson.Should().NotBeNull(); - var json = Encoding.UTF8.GetString(result.CompactJson!); - json.Should().Be(baselineJson, "canonical JSON must be deterministic regardless of signature insertion order"); - - result.PayloadSha256.Should().Be( - Convert.ToHexString(SHA256.HashData(SamplePayload)).ToLowerInvariant(), - "payload hash must reflect the raw payload bytes"); - - using var document = JsonDocument.Parse(result.CompactJson!); -using StellaOps.TestKit; - var keyIds = document.RootElement - .GetProperty("signatures") - .EnumerateArray() - .Select(element => element.TryGetProperty("keyid", out var key) ? key.GetString() : null) - .ToArray(); - - keyIds.Should().Equal(new string?[] { null, "tenant-a", "tenant-b", "tenant-z" }, - "signatures must be ordered by key identifier (null first) for canonical output"); - } - } -} diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseNegativeTests.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseNegativeTests.cs deleted file mode 100644 index 65117a256..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseNegativeTests.cs +++ /dev/null @@ -1,354 +0,0 @@ -// ----------------------------------------------------------------------------- -// DsseNegativeTests.cs -// Sprint: SPRINT_8200_0001_0002_dsse_roundtrip_testing -// Tasks: DSSE-8200-016, DSSE-8200-017, DSSE-8200-018 -// Description: DSSE negative/error handling tests -// ----------------------------------------------------------------------------- - -using System; -using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Text.Json; -using FluentAssertions; -using Xunit; - -namespace StellaOps.Attestor.Envelope.Tests; - -/// -/// Negative tests for DSSE envelope verification. -/// Validates error handling for expired certs, wrong keys, and malformed data. -/// -[Trait("Category", "Unit")] -[Trait("Category", "DsseNegative")] -public sealed class DsseNegativeTests : IDisposable -{ - private readonly DsseRoundtripTestFixture _fixture; - - public DsseNegativeTests() - { - _fixture = new DsseRoundtripTestFixture(); - } - - // DSSE-8200-016: Expired certificate → verify fails with clear error - // Note: Testing certificate expiry requires X.509 certificate infrastructure. - // These tests use simulated scenarios or self-signed certs. - - [Fact] - public void Verify_WithExpiredCertificateSimulation_FailsGracefully() - { - // Arrange - Sign with the fixture (simulates current key) - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Simulate "expired" by creating a verification with a different key - // In production, certificate expiry would be checked by the verifier - using var expiredFixture = new DsseRoundtripTestFixture(); - - // Act - Verify with "expired" key (different fixture) - var verified = expiredFixture.Verify(envelope); - var detailedResult = expiredFixture.VerifyDetailed(envelope); - - // Assert - verified.Should().BeFalse("verification with different key should fail"); - detailedResult.IsValid.Should().BeFalse(); - detailedResult.SignatureResults.Should().Contain(r => !r.IsValid); - } - - [Fact] - public void Verify_SignatureFromRevokedKey_FailsWithDetailedError() - { - // Arrange - Create envelope with one key - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - using var originalFixture = new DsseRoundtripTestFixture(); - var envelope = originalFixture.Sign(payload); - - // Act - Try to verify with different key (simulates key revocation scenario) - using var differentFixture = new DsseRoundtripTestFixture(); - var result = differentFixture.VerifyDetailed(envelope); - - // Assert - result.IsValid.Should().BeFalse(); - result.SignatureResults.Should().HaveCount(1); - result.SignatureResults[0].IsValid.Should().BeFalse(); - result.SignatureResults[0].FailureReason.Should().NotBeNullOrEmpty(); - } - - // DSSE-8200-017: Wrong key type → verify fails - - [Fact] - public void Verify_WithWrongKeyType_Fails() - { - // Arrange - Sign with P-256 - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - Try to verify with P-384 key (wrong curve) - using var wrongCurveKey = ECDsa.Create(ECCurve.NamedCurves.nistP384); - using var wrongCurveFixture = new DsseRoundtripTestFixture(wrongCurveKey, "p384-key"); - var verified = wrongCurveFixture.Verify(envelope); - - // Assert - verified.Should().BeFalse("verification with wrong curve should fail"); - } - - [Fact] - public void Verify_WithMismatchedKeyId_SkipsSignature() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - Create fixture with different key ID - using var differentKey = ECDsa.Create(ECCurve.NamedCurves.nistP256); - using var differentIdFixture = new DsseRoundtripTestFixture(differentKey, "completely-different-key-id"); - var result = differentIdFixture.VerifyDetailed(envelope); - - // Assert - Should skip due to key ID mismatch (unless keyId is null) - result.IsValid.Should().BeFalse(); - } - - [Fact] - public void Verify_WithNullKeyId_MatchesAnyKey() - { - // Arrange - Create signature with null key ID - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var pae = BuildPae("application/vnd.in-toto+json", payload); - - using var key = ECDsa.Create(ECCurve.NamedCurves.nistP256); - var signatureBytes = key.SignData(pae, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence); - var signature = DsseSignature.FromBytes(signatureBytes, null); // null key ID - - var envelope = new DsseEnvelope("application/vnd.in-toto+json", payload, [signature]); - - // Act - Verify with same key but different fixture (null keyId should still match) - using var verifyFixture = new DsseRoundtripTestFixture(key, "any-key-id"); - var verified = verifyFixture.Verify(envelope); - - // Assert - null keyId in signature should be attempted with any verifying key - verified.Should().BeTrue("null keyId should allow verification attempt"); - } - - // DSSE-8200-018: Truncated/malformed envelope → parse fails gracefully - - [Fact] - public void Deserialize_TruncatedJson_ThrowsJsonException() - { - // Arrange - var validJson = """{"payloadType":"application/vnd.in-toto+json","payload":"dGVzdA==","signatures":[{"sig":"YWJj"""; - - // Act & Assert - var act = () => DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(validJson)); - act.Should().Throw(); - } - - [Fact] - public void Deserialize_MissingPayloadType_ThrowsKeyNotFoundException() - { - // Arrange - var invalidJson = """{"payload":"dGVzdA==","signatures":[{"sig":"YWJj"}]}"""; - - // Act & Assert - GetProperty throws KeyNotFoundException when key is missing - var act = () => DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(invalidJson)); - act.Should().Throw(); - } - - [Fact] - public void Deserialize_MissingPayload_ThrowsKeyNotFoundException() - { - // Arrange - var invalidJson = """{"payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"YWJj"}]}"""; - - // Act & Assert - GetProperty throws KeyNotFoundException when key is missing - var act = () => DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(invalidJson)); - act.Should().Throw(); - } - - [Fact] - public void Deserialize_MissingSignatures_ThrowsKeyNotFoundException() - { - // Arrange - var invalidJson = """{"payloadType":"application/vnd.in-toto+json","payload":"dGVzdA=="}"""; - - // Act & Assert - GetProperty throws KeyNotFoundException when key is missing - var act = () => DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(invalidJson)); - act.Should().Throw(); - } - - [Fact] - public void Deserialize_EmptySignaturesArray_ThrowsArgumentException() - { - // Arrange - var invalidJson = """{"payloadType":"application/vnd.in-toto+json","payload":"dGVzdA==","signatures":[]}"""; - - // Act & Assert - var act = () => DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(invalidJson)); - act.Should().Throw() - .WithMessage("*signature*"); - } - - [Fact] - public void Deserialize_InvalidBase64Payload_ThrowsFormatException() - { - // Arrange - var invalidJson = """{"payloadType":"application/vnd.in-toto+json","payload":"not-valid-base64!!!","signatures":[{"sig":"YWJj"}]}"""; - - // Act & Assert - var act = () => DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(invalidJson)); - act.Should().Throw(); - } - - [Fact] - public void Deserialize_MissingSignatureInSignature_ThrowsKeyNotFoundException() - { - // Arrange - var invalidJson = """{"payloadType":"application/vnd.in-toto+json","payload":"dGVzdA==","signatures":[{"keyid":"key-1"}]}"""; - - // Act & Assert - GetProperty throws KeyNotFoundException when key is missing - var act = () => DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(invalidJson)); - act.Should().Throw(); - } - - [Fact] - public void Deserialize_EmptyPayload_Succeeds() - { - // Arrange - Empty payload is technically valid base64 - var validJson = """{"payloadType":"application/vnd.in-toto+json","payload":"","signatures":[{"sig":"YWJj"}]}"""; - - // Act - var envelope = DsseRoundtripTestFixture.DeserializeFromBytes(Encoding.UTF8.GetBytes(validJson)); - - // Assert - envelope.Payload.Length.Should().Be(0); - } - - [Fact] - public void Verify_InvalidBase64Signature_ReturnsFalse() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var invalidSig = new DsseSignature("not-valid-base64!!!", _fixture.KeyId); - var envelope = new DsseEnvelope("application/vnd.in-toto+json", payload, [invalidSig]); - - // Act - var verified = _fixture.Verify(envelope); - - // Assert - verified.Should().BeFalse("invalid base64 signature should not verify"); - } - - [Fact] - public void Verify_MalformedSignatureBytes_ReturnsFalse() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var malformedSig = DsseSignature.FromBytes([0x01, 0x02, 0x03], _fixture.KeyId); // Too short for ECDSA - var envelope = new DsseEnvelope("application/vnd.in-toto+json", payload, [malformedSig]); - - // Act - var verified = _fixture.Verify(envelope); - - // Assert - verified.Should().BeFalse("malformed signature bytes should not verify"); - } - - // Bundle negative tests - - [Fact] - public void BundleDeserialize_TruncatedJson_ThrowsJsonException() - { - // Arrange - var truncated = """{"mediaType":"application/vnd.dev.sigstore"""; - - // Act & Assert - var act = () => SigstoreTestBundle.Deserialize(Encoding.UTF8.GetBytes(truncated)); - act.Should().Throw(); - } - - [Fact] - public void BundleDeserialize_MissingDsseEnvelope_ThrowsKeyNotFoundException() - { - // Arrange - var missingEnvelope = """{"mediaType":"test","verificationMaterial":{"publicKey":{"hint":"k","rawBytes":"YWJj"},"algorithm":"ES256"}}"""; - - // Act & Assert - GetProperty throws KeyNotFoundException when key is missing - var act = () => SigstoreTestBundle.Deserialize(Encoding.UTF8.GetBytes(missingEnvelope)); - act.Should().Throw(); - } - - // Edge cases - - [Fact] - public void Sign_EmptyPayload_FailsValidation() - { - // Arrange - var emptyPayload = Array.Empty(); - - // Act & Assert - DsseEnvelope allows empty payload (technically), but signing behavior depends on PAE - // Note: Empty payload is unusual but not necessarily invalid in DSSE spec - var envelope = _fixture.Sign(emptyPayload); - var verified = _fixture.Verify(envelope); - - envelope.Payload.Length.Should().Be(0); - verified.Should().BeTrue("empty payload is valid DSSE"); - } - - [Fact] - public void Verify_ModifiedPayloadType_Fails() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - Create new envelope with modified payloadType - var modifiedEnvelope = new DsseEnvelope( - "application/vnd.different-type+json", // Different type - envelope.Payload, - envelope.Signatures); - - // Assert - _fixture.Verify(modifiedEnvelope).Should().BeFalse("modified payloadType changes PAE and invalidates signature"); - } - - // Helper methods - - private static byte[] BuildPae(string payloadType, byte[] payload) - { - const string preamble = "DSSEv1 "; - - var payloadTypeBytes = Encoding.UTF8.GetBytes(payloadType); - var payloadTypeLenStr = payloadTypeBytes.Length.ToString(); - var payloadLenStr = payload.Length.ToString(); - - var totalLength = preamble.Length - + payloadTypeLenStr.Length + 1 + payloadTypeBytes.Length + 1 - + payloadLenStr.Length + 1 + payload.Length; - - var pae = new byte[totalLength]; - var offset = 0; - - Encoding.UTF8.GetBytes(preamble, pae.AsSpan(offset)); - offset += preamble.Length; - - Encoding.UTF8.GetBytes(payloadTypeLenStr, pae.AsSpan(offset)); - offset += payloadTypeLenStr.Length; - pae[offset++] = (byte)' '; - - payloadTypeBytes.CopyTo(pae.AsSpan(offset)); - offset += payloadTypeBytes.Length; - pae[offset++] = (byte)' '; - - Encoding.UTF8.GetBytes(payloadLenStr, pae.AsSpan(offset)); - offset += payloadLenStr.Length; - pae[offset++] = (byte)' '; - - payload.CopyTo(pae.AsSpan(offset)); - - return pae; - } - - public void Dispose() - { - _fixture.Dispose(); - } -} diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRebundleTests.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRebundleTests.cs deleted file mode 100644 index 8ebbee8f7..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRebundleTests.cs +++ /dev/null @@ -1,364 +0,0 @@ -// ----------------------------------------------------------------------------- -// DsseRebundleTests.cs -// Sprint: SPRINT_8200_0001_0002_dsse_roundtrip_testing -// Tasks: DSSE-8200-007, DSSE-8200-008, DSSE-8200-009 -// Description: DSSE re-bundling verification tests -// ----------------------------------------------------------------------------- - -using System; -using System.IO; -using System.IO.Compression; -using System.Security.Cryptography; -using System.Text; -using FluentAssertions; -using Xunit; - -namespace StellaOps.Attestor.Envelope.Tests; - -/// -/// Tests for DSSE envelope re-bundling operations. -/// Validates sign → bundle → extract → re-bundle → verify cycles. -/// -[Trait("Category", "Unit")] -[Trait("Category", "DsseRebundle")] -public sealed class DsseRebundleTests : IDisposable -{ - private readonly DsseRoundtripTestFixture _fixture; - - public DsseRebundleTests() - { - _fixture = new DsseRoundtripTestFixture(); - } - - // DSSE-8200-007: Full round-trip through bundle - - [Fact] - public void SignBundleExtractRebundleVerify_FullRoundTrip_Succeeds() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - _fixture.Verify(envelope).Should().BeTrue("original envelope should verify"); - - // Act - Bundle - var bundle1 = _fixture.CreateSigstoreBundle(envelope); - var bundleBytes = bundle1.Serialize(); - - // Act - Extract - var extractedBundle = SigstoreTestBundle.Deserialize(bundleBytes); - var extractedEnvelope = DsseRoundtripTestFixture.ExtractFromBundle(extractedBundle); - - // Act - Re-bundle - var rebundle = _fixture.CreateSigstoreBundle(extractedEnvelope); - var rebundleBytes = rebundle.Serialize(); - - // Act - Extract again and verify - var finalBundle = SigstoreTestBundle.Deserialize(rebundleBytes); - var finalEnvelope = DsseRoundtripTestFixture.ExtractFromBundle(finalBundle); - var finalVerified = _fixture.Verify(finalEnvelope); - - // Assert - finalVerified.Should().BeTrue("re-bundled envelope should verify"); - finalEnvelope.Payload.ToArray().Should().BeEquivalentTo(envelope.Payload.ToArray()); - finalEnvelope.PayloadType.Should().Be(envelope.PayloadType); - } - - [Fact] - public void SignBundleExtractRebundleVerify_WithBundleKey_Succeeds() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - Bundle with embedded key - var bundle = _fixture.CreateSigstoreBundle(envelope); - - // Act - Extract and verify using bundle's embedded key - var extractedEnvelope = DsseRoundtripTestFixture.ExtractFromBundle(bundle); - var verifiedWithBundleKey = DsseRoundtripTestFixture.VerifyWithBundleKey(extractedEnvelope, bundle); - - // Assert - verifiedWithBundleKey.Should().BeTrue("envelope should verify with bundle's embedded key"); - } - - [Fact] - public void Bundle_PreservesEnvelopeIntegrity() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - var originalBytes = DsseRoundtripTestFixture.SerializeToBytes(envelope); - - // Act - var bundle = _fixture.CreateSigstoreBundle(envelope); - var extractedEnvelope = DsseRoundtripTestFixture.ExtractFromBundle(bundle); - var extractedBytes = DsseRoundtripTestFixture.SerializeToBytes(extractedEnvelope); - - // Assert - Envelope bytes should be identical - extractedBytes.Should().BeEquivalentTo(originalBytes, "bundling should not modify envelope"); - } - - // DSSE-8200-008: Archive to tar.gz → extract → verify - - [Fact] - public async Task SignBundleArchiveExtractVerify_ThroughGzipArchive_Succeeds() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - var bundle = _fixture.CreateSigstoreBundle(envelope); - var bundleBytes = bundle.Serialize(); - - var archivePath = Path.Combine(Path.GetTempPath(), $"dsse-archive-{Guid.NewGuid():N}.tar.gz"); - var extractPath = Path.Combine(Path.GetTempPath(), $"dsse-extract-{Guid.NewGuid():N}"); - - try - { - // Act - Archive to gzip file - await using (var fileStream = File.Create(archivePath)) - await using (var gzipStream = new GZipStream(fileStream, CompressionLevel.Optimal)) - { - await gzipStream.WriteAsync(bundleBytes); - } - - // Act - Extract from gzip file - Directory.CreateDirectory(extractPath); - await using (var fileStream = File.OpenRead(archivePath)) - await using (var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress)) - await using (var memoryStream = new MemoryStream()) - { - await gzipStream.CopyToAsync(memoryStream); - var extractedBundleBytes = memoryStream.ToArray(); - - // Act - Deserialize and verify - var extractedBundle = SigstoreTestBundle.Deserialize(extractedBundleBytes); - var extractedEnvelope = DsseRoundtripTestFixture.ExtractFromBundle(extractedBundle); - var verified = _fixture.Verify(extractedEnvelope); - - // Assert - verified.Should().BeTrue("envelope should verify after archive round-trip"); - } - } - finally - { - try { File.Delete(archivePath); } catch { } - try { Directory.Delete(extractPath, true); } catch { } - } - } - - [Fact] - public async Task SignBundleArchiveExtractVerify_ThroughMultipleFiles_PreservesIntegrity() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - var bundle = _fixture.CreateSigstoreBundle(envelope); - - var tempDir = Path.Combine(Path.GetTempPath(), $"dsse-multi-{Guid.NewGuid():N}"); - - try - { - Directory.CreateDirectory(tempDir); - - // Act - Save envelope and bundle as separate files - var envelopePath = Path.Combine(tempDir, "envelope.json"); - var bundlePath = Path.Combine(tempDir, "bundle.json"); - - await File.WriteAllBytesAsync(envelopePath, DsseRoundtripTestFixture.SerializeToBytes(envelope)); - await File.WriteAllBytesAsync(bundlePath, bundle.Serialize()); - - // Act - Reload both - var reloadedEnvelopeBytes = await File.ReadAllBytesAsync(envelopePath); - var reloadedBundleBytes = await File.ReadAllBytesAsync(bundlePath); - - var reloadedEnvelope = DsseRoundtripTestFixture.DeserializeFromBytes(reloadedEnvelopeBytes); - var reloadedBundle = SigstoreTestBundle.Deserialize(reloadedBundleBytes); - var extractedFromBundle = DsseRoundtripTestFixture.ExtractFromBundle(reloadedBundle); - - // Assert - Both should verify and be equivalent - _fixture.Verify(reloadedEnvelope).Should().BeTrue("reloaded envelope should verify"); - _fixture.Verify(extractedFromBundle).Should().BeTrue("extracted envelope should verify"); - - reloadedEnvelope.Payload.ToArray().Should().BeEquivalentTo(extractedFromBundle.Payload.ToArray()); - } - finally - { - try { Directory.Delete(tempDir, true); } catch { } - } - } - - // DSSE-8200-009: Multi-signature envelope round-trip - - [Fact] - public void MultiSignatureEnvelope_BundleExtractVerify_AllSignaturesPreserved() - { - // Arrange - Create envelope with multiple signatures - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - - using var key1 = ECDsa.Create(ECCurve.NamedCurves.nistP256); - using var key2 = ECDsa.Create(ECCurve.NamedCurves.nistP256); - using var key3 = ECDsa.Create(ECCurve.NamedCurves.nistP256); - - var sig1 = CreateSignature(key1, payload, "key-1"); - var sig2 = CreateSignature(key2, payload, "key-2"); - var sig3 = CreateSignature(key3, payload, "key-3"); - - var multiSigEnvelope = new DsseEnvelope( - "application/vnd.in-toto+json", - payload, - [sig1, sig2, sig3]); - - // Act - Bundle - var bundle = _fixture.CreateSigstoreBundle(multiSigEnvelope); - var bundleBytes = bundle.Serialize(); - - // Act - Extract - var extractedBundle = SigstoreTestBundle.Deserialize(bundleBytes); - var extractedEnvelope = DsseRoundtripTestFixture.ExtractFromBundle(extractedBundle); - - // Assert - All signatures preserved - extractedEnvelope.Signatures.Should().HaveCount(3); - extractedEnvelope.Signatures.Select(s => s.KeyId) - .Should().BeEquivalentTo(["key-1", "key-2", "key-3"]); - } - - [Fact] - public void MultiSignatureEnvelope_SignatureOrderIsCanonical() - { - // Arrange - Create signatures in non-alphabetical order - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - - using var keyZ = ECDsa.Create(ECCurve.NamedCurves.nistP256); - using var keyA = ECDsa.Create(ECCurve.NamedCurves.nistP256); - using var keyM = ECDsa.Create(ECCurve.NamedCurves.nistP256); - - var sigZ = CreateSignature(keyZ, payload, "z-key"); - var sigA = CreateSignature(keyA, payload, "a-key"); - var sigM = CreateSignature(keyM, payload, "m-key"); - - // Act - Create envelope with out-of-order signatures - var envelope1 = new DsseEnvelope("application/vnd.in-toto+json", payload, [sigZ, sigA, sigM]); - var envelope2 = new DsseEnvelope("application/vnd.in-toto+json", payload, [sigA, sigM, sigZ]); - var envelope3 = new DsseEnvelope("application/vnd.in-toto+json", payload, [sigM, sigZ, sigA]); - - // Assert - All should have canonical (alphabetical) signature order - var expectedOrder = new[] { "a-key", "m-key", "z-key" }; - envelope1.Signatures.Select(s => s.KeyId).Should().Equal(expectedOrder); - envelope2.Signatures.Select(s => s.KeyId).Should().Equal(expectedOrder); - envelope3.Signatures.Select(s => s.KeyId).Should().Equal(expectedOrder); - } - - [Fact] - public void MultiSignatureEnvelope_SerializationIsDeterministic() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - - using var key1 = ECDsa.Create(ECCurve.NamedCurves.nistP256); - using var key2 = ECDsa.Create(ECCurve.NamedCurves.nistP256); - - var sig1 = CreateSignature(key1, payload, "key-1"); - var sig2 = CreateSignature(key2, payload, "key-2"); - - // Act - Create envelopes with different signature order - var envelopeA = new DsseEnvelope("application/vnd.in-toto+json", payload, [sig1, sig2]); - var envelopeB = new DsseEnvelope("application/vnd.in-toto+json", payload, [sig2, sig1]); - - var bytesA = DsseRoundtripTestFixture.SerializeToBytes(envelopeA); - var bytesB = DsseRoundtripTestFixture.SerializeToBytes(envelopeB); - - // Assert - Serialization should be identical due to canonical ordering - bytesA.Should().BeEquivalentTo(bytesB, "canonical ordering should produce identical serialization"); - } - - // Bundle integrity tests - - [Fact] - public void Bundle_TamperingDetected_VerificationFails() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - var bundle = _fixture.CreateSigstoreBundle(envelope); - - // Act - Extract and tamper with envelope - var extractedEnvelope = DsseRoundtripTestFixture.ExtractFromBundle(bundle); - var tamperedPayload = extractedEnvelope.Payload.ToArray(); - tamperedPayload[0] ^= 0xFF; - - var tamperedEnvelope = new DsseEnvelope( - extractedEnvelope.PayloadType, - tamperedPayload, - extractedEnvelope.Signatures); - - // Assert - Tampered envelope should not verify with bundle key - var verifiedWithBundleKey = DsseRoundtripTestFixture.VerifyWithBundleKey(tamperedEnvelope, bundle); - verifiedWithBundleKey.Should().BeFalse("tampered envelope should not verify"); - } - - [Fact] - public void Bundle_DifferentKey_VerificationFails() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - var bundle = _fixture.CreateSigstoreBundle(envelope); - - // Act - Create a different fixture with different key - using var differentFixture = new DsseRoundtripTestFixture(); - var differentBundle = differentFixture.CreateSigstoreBundle(envelope); - - // Assert - Original envelope should not verify with different key - var verified = DsseRoundtripTestFixture.VerifyWithBundleKey(envelope, differentBundle); - verified.Should().BeFalse("envelope should not verify with wrong key"); - } - - // Helper methods - - private static DsseSignature CreateSignature(ECDsa key, byte[] payload, string keyId) - { - var pae = BuildPae("application/vnd.in-toto+json", payload); - var signatureBytes = key.SignData(pae, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence); - return DsseSignature.FromBytes(signatureBytes, keyId); - } - - private static byte[] BuildPae(string payloadType, byte[] payload) - { - const string preamble = "DSSEv1 "; - - var payloadTypeBytes = Encoding.UTF8.GetBytes(payloadType); - var payloadTypeLenStr = payloadTypeBytes.Length.ToString(); - var payloadLenStr = payload.Length.ToString(); - - var totalLength = preamble.Length - + payloadTypeLenStr.Length + 1 + payloadTypeBytes.Length + 1 - + payloadLenStr.Length + 1 + payload.Length; - - var pae = new byte[totalLength]; - var offset = 0; - - Encoding.UTF8.GetBytes(preamble, pae.AsSpan(offset)); - offset += preamble.Length; - - Encoding.UTF8.GetBytes(payloadTypeLenStr, pae.AsSpan(offset)); - offset += payloadTypeLenStr.Length; - pae[offset++] = (byte)' '; - - payloadTypeBytes.CopyTo(pae.AsSpan(offset)); - offset += payloadTypeBytes.Length; - pae[offset++] = (byte)' '; - - Encoding.UTF8.GetBytes(payloadLenStr, pae.AsSpan(offset)); - offset += payloadLenStr.Length; - pae[offset++] = (byte)' '; - - payload.CopyTo(pae.AsSpan(offset)); - - return pae; - } - - public void Dispose() - { - _fixture.Dispose(); - } -} diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRoundtripTestFixture.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRoundtripTestFixture.cs deleted file mode 100644 index 892d4679c..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRoundtripTestFixture.cs +++ /dev/null @@ -1,503 +0,0 @@ -// ----------------------------------------------------------------------------- -// DsseRoundtripTestFixture.cs -// Sprint: SPRINT_8200_0001_0002_dsse_roundtrip_testing -// Tasks: DSSE-8200-001, DSSE-8200-002, DSSE-8200-003 -// Description: Test fixture providing DSSE signing, verification, and round-trip helpers -// ----------------------------------------------------------------------------- - -using System; -using System.IO; -using System.Security.Cryptography; -using System.Text; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; - -namespace StellaOps.Attestor.Envelope.Tests; - -/// -/// Test fixture for DSSE round-trip verification tests. -/// Provides key generation, signing, verification, and serialization helpers. -/// -public sealed class DsseRoundtripTestFixture : IDisposable -{ - private readonly ECDsa _signingKey; - private readonly string _keyId; - private bool _disposed; - - /// - /// Creates a new test fixture with a fresh ECDSA P-256 key pair. - /// - public DsseRoundtripTestFixture() - : this(ECDsa.Create(ECCurve.NamedCurves.nistP256), $"test-key-{Guid.NewGuid():N}") - { - } - - /// - /// Creates a test fixture with a specified key and key ID. - /// - public DsseRoundtripTestFixture(ECDsa signingKey, string keyId) - { - _signingKey = signingKey ?? throw new ArgumentNullException(nameof(signingKey)); - _keyId = keyId ?? throw new ArgumentNullException(nameof(keyId)); - } - - /// - /// Gets the key ID associated with the signing key. - /// - public string KeyId => _keyId; - - /// - /// Gets the public key bytes in X.509 SubjectPublicKeyInfo format. - /// - public ReadOnlyMemory PublicKeyBytes => _signingKey.ExportSubjectPublicKeyInfo(); - - // DSSE-8200-001: Core signing and verification helpers - - /// - /// Signs a payload and creates a DSSE envelope. - /// Uses ECDSA P-256 with SHA-256 (ES256). - /// - public DsseEnvelope Sign(ReadOnlySpan payload, string payloadType = "application/vnd.in-toto+json") - { - // Build PAE (Pre-Authentication Encoding) as per DSSE spec - // PAE = "DSSEv1" || len(payloadType) || payloadType || len(payload) || payload - var pae = BuildPae(payloadType, payload); - - // Sign the PAE - var signatureBytes = _signingKey.SignData(pae, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence); - - var signature = DsseSignature.FromBytes(signatureBytes, _keyId); - return new DsseEnvelope(payloadType, payload.ToArray(), [signature]); - } - - /// - /// Signs a JSON-serializable payload and creates a DSSE envelope. - /// - public DsseEnvelope SignJson(T payload, string payloadType = "application/vnd.in-toto+json") - { - var payloadBytes = JsonSerializer.SerializeToUtf8Bytes(payload, new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - WriteIndented = false - }); - return Sign(payloadBytes, payloadType); - } - - /// - /// Verifies a DSSE envelope signature using the fixture's public key. - /// Returns true if at least one signature verifies. - /// - public bool Verify(DsseEnvelope envelope) - { - ArgumentNullException.ThrowIfNull(envelope); - - var pae = BuildPae(envelope.PayloadType, envelope.Payload.Span); - - foreach (var sig in envelope.Signatures) - { - // Match by key ID if specified - if (sig.KeyId != null && sig.KeyId != _keyId) - { - continue; - } - - try - { - var signatureBytes = Convert.FromBase64String(sig.Signature); - if (_signingKey.VerifyData(pae, signatureBytes, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence)) - { - return true; - } - } - catch (FormatException) - { - // Invalid base64, skip - } - catch (CryptographicException) - { - // Invalid signature format, skip - } - } - - return false; - } - - /// - /// Creates a verification result with detailed information. - /// - public DsseVerificationResult VerifyDetailed(DsseEnvelope envelope) - { - ArgumentNullException.ThrowIfNull(envelope); - - var pae = BuildPae(envelope.PayloadType, envelope.Payload.Span); - var results = new List(); - - foreach (var sig in envelope.Signatures) - { - var result = VerifySingleSignature(sig, pae); - results.Add(result); - } - - var anyValid = results.Exists(r => r.IsValid); - return new DsseVerificationResult(anyValid, results); - } - - // DSSE-8200-002: Serialization and persistence helpers - - /// - /// Serializes a DSSE envelope to canonical JSON bytes. - /// - public static byte[] SerializeToBytes(DsseEnvelope envelope) - { - var result = DsseEnvelopeSerializer.Serialize(envelope, new DsseEnvelopeSerializationOptions - { - EmitCompactJson = true, - EmitExpandedJson = false - }); - - return result.CompactJson ?? throw new InvalidOperationException("Serialization failed to produce compact JSON."); - } - - /// - /// Deserializes a DSSE envelope from canonical JSON bytes. - /// - public static DsseEnvelope DeserializeFromBytes(ReadOnlySpan json) - { - using var doc = JsonDocument.Parse(json.ToArray()); - var root = doc.RootElement; - - var payloadType = root.GetProperty("payloadType").GetString() - ?? throw new JsonException("Missing payloadType"); - - var payloadBase64 = root.GetProperty("payload").GetString() - ?? throw new JsonException("Missing payload"); - - var payload = Convert.FromBase64String(payloadBase64); - - var signatures = new List(); - foreach (var sigElement in root.GetProperty("signatures").EnumerateArray()) - { - var sig = sigElement.GetProperty("sig").GetString() - ?? throw new JsonException("Missing sig in signature"); - - sigElement.TryGetProperty("keyid", out var keyIdElement); - var keyId = keyIdElement.ValueKind == JsonValueKind.String ? keyIdElement.GetString() : null; - - signatures.Add(new DsseSignature(sig, keyId)); - } - - return new DsseEnvelope(payloadType, payload, signatures); - } - - /// - /// Persists a DSSE envelope to a file. - /// - public static async Task SaveToFileAsync(DsseEnvelope envelope, string filePath, CancellationToken cancellationToken = default) - { - var bytes = SerializeToBytes(envelope); - await File.WriteAllBytesAsync(filePath, bytes, cancellationToken); - } - - /// - /// Loads a DSSE envelope from a file. - /// - public static async Task LoadFromFileAsync(string filePath, CancellationToken cancellationToken = default) - { - var bytes = await File.ReadAllBytesAsync(filePath, cancellationToken); - return DeserializeFromBytes(bytes); - } - - /// - /// Performs a full round-trip: serialize to file, reload, deserialize. - /// - public static async Task RoundtripThroughFileAsync( - DsseEnvelope envelope, - string? tempPath = null, - CancellationToken cancellationToken = default) - { - tempPath ??= Path.Combine(Path.GetTempPath(), $"dsse-roundtrip-{Guid.NewGuid():N}.json"); - - try - { - await SaveToFileAsync(envelope, tempPath, cancellationToken); - return await LoadFromFileAsync(tempPath, cancellationToken); - } - finally - { - try { File.Delete(tempPath); } catch { /* Best effort cleanup */ } - } - } - - // DSSE-8200-003: Sigstore bundle wrapper helpers - - /// - /// Creates a minimal Sigstore-compatible bundle containing the DSSE envelope. - /// This is a simplified version for testing; production bundles need additional metadata. - /// - public SigstoreTestBundle CreateSigstoreBundle(DsseEnvelope envelope) - { - ArgumentNullException.ThrowIfNull(envelope); - - var envelopeJson = SerializeToBytes(envelope); - var publicKeyDer = _signingKey.ExportSubjectPublicKeyInfo(); - - return new SigstoreTestBundle( - MediaType: "application/vnd.dev.sigstore.bundle.v0.3+json", - DsseEnvelope: envelopeJson, - PublicKey: publicKeyDer, - KeyId: _keyId, - Algorithm: "ES256"); - } - - /// - /// Extracts a DSSE envelope from a Sigstore test bundle. - /// - public static DsseEnvelope ExtractFromBundle(SigstoreTestBundle bundle) - { - ArgumentNullException.ThrowIfNull(bundle); - return DeserializeFromBytes(bundle.DsseEnvelope); - } - - /// - /// Verifies a DSSE envelope using the public key embedded in a bundle. - /// - public static bool VerifyWithBundleKey(DsseEnvelope envelope, SigstoreTestBundle bundle) - { - ArgumentNullException.ThrowIfNull(envelope); - ArgumentNullException.ThrowIfNull(bundle); - - using var publicKey = ECDsa.Create(); - publicKey.ImportSubjectPublicKeyInfo(bundle.PublicKey, out _); - - var pae = BuildPae(envelope.PayloadType, envelope.Payload.Span); - - foreach (var sig in envelope.Signatures) - { - if (sig.KeyId != null && sig.KeyId != bundle.KeyId) - { - continue; - } - - try - { - var signatureBytes = Convert.FromBase64String(sig.Signature); - if (publicKey.VerifyData(pae, signatureBytes, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence)) - { - return true; - } - } - catch - { - // Continue to next signature - } - } - - return false; - } - - // Payload creation helpers for tests - - /// - /// Creates a minimal in-toto statement payload for testing. - /// - public static byte[] CreateInTotoPayload( - string predicateType = "https://slsa.dev/provenance/v1", - string subjectName = "test-artifact", - string subjectDigest = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") - { - var statement = new - { - _type = "https://in-toto.io/Statement/v1", - subject = new[] - { - new - { - name = subjectName, - digest = new { sha256 = subjectDigest.Replace("sha256:", "") } - } - }, - predicateType, - predicate = new { } - }; - - return JsonSerializer.SerializeToUtf8Bytes(statement, new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - WriteIndented = false - }); - } - - /// - /// Creates a deterministic test payload with specified content. - /// - public static byte[] CreateTestPayload(string content = "deterministic-test-payload") - { - return Encoding.UTF8.GetBytes(content); - } - - // Private helpers - - private static byte[] BuildPae(string payloadType, ReadOnlySpan payload) - { - // PAE(payloadType, payload) = "DSSEv1" + SP + len(payloadType) + SP + payloadType + SP + len(payload) + SP + payload - // Where SP is ASCII space (0x20) - const string preamble = "DSSEv1 "; - - var payloadTypeBytes = Encoding.UTF8.GetBytes(payloadType); - var payloadTypeLenStr = payloadTypeBytes.Length.ToString(); - var payloadLenStr = payload.Length.ToString(); - - var totalLength = preamble.Length - + payloadTypeLenStr.Length + 1 + payloadTypeBytes.Length + 1 - + payloadLenStr.Length + 1 + payload.Length; - - var pae = new byte[totalLength]; - var offset = 0; - - // "DSSEv1 " - Encoding.UTF8.GetBytes(preamble, pae.AsSpan(offset)); - offset += preamble.Length; - - // len(payloadType) + SP - Encoding.UTF8.GetBytes(payloadTypeLenStr, pae.AsSpan(offset)); - offset += payloadTypeLenStr.Length; - pae[offset++] = (byte)' '; - - // payloadType + SP - payloadTypeBytes.CopyTo(pae.AsSpan(offset)); - offset += payloadTypeBytes.Length; - pae[offset++] = (byte)' '; - - // len(payload) + SP - Encoding.UTF8.GetBytes(payloadLenStr, pae.AsSpan(offset)); - offset += payloadLenStr.Length; - pae[offset++] = (byte)' '; - - // payload - payload.CopyTo(pae.AsSpan(offset)); - - return pae; - } - - private SignatureVerificationResult VerifySingleSignature(DsseSignature sig, byte[] pae) - { - var keyMatches = sig.KeyId == null || sig.KeyId == _keyId; - - if (!keyMatches) - { - return new SignatureVerificationResult(sig.KeyId, false, "Key ID mismatch"); - } - - try - { - var signatureBytes = Convert.FromBase64String(sig.Signature); - var isValid = _signingKey.VerifyData(pae, signatureBytes, HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence); - return new SignatureVerificationResult(sig.KeyId, isValid, isValid ? null : "Signature verification failed"); - } - catch (FormatException) - { - return new SignatureVerificationResult(sig.KeyId, false, "Invalid base64 signature format"); - } - catch (CryptographicException ex) - { - return new SignatureVerificationResult(sig.KeyId, false, $"Cryptographic error: {ex.Message}"); - } - } - - public void Dispose() - { - if (!_disposed) - { - _signingKey.Dispose(); - _disposed = true; - } - } -} - -/// -/// Result of DSSE envelope verification with detailed per-signature results. -/// -public sealed record DsseVerificationResult( - bool IsValid, - IReadOnlyList SignatureResults); - -/// -/// Result of verifying a single signature. -/// -public sealed record SignatureVerificationResult( - string? KeyId, - bool IsValid, - string? FailureReason); - -/// -/// Minimal Sigstore-compatible bundle for testing DSSE round-trips. -/// -public sealed record SigstoreTestBundle( - string MediaType, - byte[] DsseEnvelope, - byte[] PublicKey, - string KeyId, - string Algorithm) -{ - /// - /// Serializes the bundle to JSON bytes. - /// - public byte[] Serialize() - { - var bundle = new - { - mediaType = MediaType, - dsseEnvelope = Convert.ToBase64String(DsseEnvelope), - verificationMaterial = new - { - publicKey = new - { - hint = KeyId, - rawBytes = Convert.ToBase64String(PublicKey) - }, - algorithm = Algorithm - } - }; - - return JsonSerializer.SerializeToUtf8Bytes(bundle, new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - WriteIndented = false - }); - } - - /// - /// Deserializes a bundle from JSON bytes. - /// - public static SigstoreTestBundle Deserialize(ReadOnlySpan json) - { - using var doc = JsonDocument.Parse(json.ToArray()); - var root = doc.RootElement; - - var mediaType = root.GetProperty("mediaType").GetString() - ?? throw new JsonException("Missing mediaType"); - - var dsseEnvelopeBase64 = root.GetProperty("dsseEnvelope").GetString() - ?? throw new JsonException("Missing dsseEnvelope"); - - var verificationMaterial = root.GetProperty("verificationMaterial"); - var publicKeyElement = verificationMaterial.GetProperty("publicKey"); - - var keyId = publicKeyElement.GetProperty("hint").GetString() - ?? throw new JsonException("Missing hint (keyId)"); - - var publicKeyBase64 = publicKeyElement.GetProperty("rawBytes").GetString() - ?? throw new JsonException("Missing rawBytes"); - - var algorithm = verificationMaterial.GetProperty("algorithm").GetString() - ?? throw new JsonException("Missing algorithm"); - - return new SigstoreTestBundle( - mediaType, - Convert.FromBase64String(dsseEnvelopeBase64), - Convert.FromBase64String(publicKeyBase64), - keyId, - algorithm); - } -} diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRoundtripTests.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRoundtripTests.cs deleted file mode 100644 index cf5ca2bbc..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/DsseRoundtripTests.cs +++ /dev/null @@ -1,381 +0,0 @@ -// ----------------------------------------------------------------------------- -// DsseRoundtripTests.cs -// Sprint: SPRINT_8200_0001_0002_dsse_roundtrip_testing -// Tasks: DSSE-8200-004, DSSE-8200-005, DSSE-8200-006, DSSE-8200-010, DSSE-8200-011, DSSE-8200-012 -// Description: DSSE round-trip verification tests -// ----------------------------------------------------------------------------- - -using System; -using System.Security.Cryptography; -using System.Text; -using System.Text.Json; -using FluentAssertions; -using Xunit; - -namespace StellaOps.Attestor.Envelope.Tests; - -/// -/// Tests for DSSE envelope round-trip verification. -/// Validates sign → serialize → deserialize → verify cycles and determinism. -/// -[Trait("Category", "Unit")] -[Trait("Category", "DsseRoundtrip")] -public sealed class DsseRoundtripTests : IDisposable -{ - private readonly DsseRoundtripTestFixture _fixture; - - public DsseRoundtripTests() - { - _fixture = new DsseRoundtripTestFixture(); - } - - // DSSE-8200-004: Basic sign → serialize → deserialize → verify - - [Fact] - public void SignSerializeDeserializeVerify_HappyPath_Succeeds() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - - // Act - Sign - var originalEnvelope = _fixture.Sign(payload); - var originalVerified = _fixture.Verify(originalEnvelope); - - // Act - Serialize - var serializedBytes = DsseRoundtripTestFixture.SerializeToBytes(originalEnvelope); - - // Act - Deserialize - var deserializedEnvelope = DsseRoundtripTestFixture.DeserializeFromBytes(serializedBytes); - - // Act - Verify deserialized - var deserializedVerified = _fixture.Verify(deserializedEnvelope); - - // Assert - originalVerified.Should().BeTrue("original envelope should verify"); - deserializedVerified.Should().BeTrue("deserialized envelope should verify"); - - deserializedEnvelope.PayloadType.Should().Be(originalEnvelope.PayloadType); - deserializedEnvelope.Payload.ToArray().Should().BeEquivalentTo(originalEnvelope.Payload.ToArray()); - deserializedEnvelope.Signatures.Should().HaveCount(originalEnvelope.Signatures.Count); - } - - [Fact] - public void SignSerializeDeserializeVerify_WithJsonPayload_PreservesContent() - { - // Arrange - var testData = new - { - _type = "https://in-toto.io/Statement/v1", - subject = new[] { new { name = "test", digest = new { sha256 = "abc123" } } }, - predicateType = "https://slsa.dev/provenance/v1", - predicate = new { buildType = "test" } - }; - - // Act - var envelope = _fixture.SignJson(testData); - var serialized = DsseRoundtripTestFixture.SerializeToBytes(envelope); - var deserialized = DsseRoundtripTestFixture.DeserializeFromBytes(serialized); - - // Assert - _fixture.Verify(deserialized).Should().BeTrue(); - - var originalPayload = Encoding.UTF8.GetString(envelope.Payload.Span); - var deserializedPayload = Encoding.UTF8.GetString(deserialized.Payload.Span); - deserializedPayload.Should().Be(originalPayload); - } - - [Fact] - public async Task SignSerializeDeserializeVerify_ThroughFile_PreservesIntegrity() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - Full round-trip through file system - var roundtrippedEnvelope = await DsseRoundtripTestFixture.RoundtripThroughFileAsync(envelope); - - // Assert - _fixture.Verify(roundtrippedEnvelope).Should().BeTrue(); - roundtrippedEnvelope.Payload.ToArray().Should().BeEquivalentTo(envelope.Payload.ToArray()); - } - - // DSSE-8200-005: Tamper detection - modified payload - - [Fact] - public void Verify_WithModifiedPayload_Fails() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - _fixture.Verify(envelope).Should().BeTrue("unmodified envelope should verify"); - - // Act - Tamper with payload - var serialized = DsseRoundtripTestFixture.SerializeToBytes(envelope); - var tamperedJson = TamperWithPayload(serialized); - var tamperedEnvelope = DsseRoundtripTestFixture.DeserializeFromBytes(tamperedJson); - - // Assert - _fixture.Verify(tamperedEnvelope).Should().BeFalse("tampered payload should not verify"); - } - - [Fact] - public void Verify_WithSingleBytePayloadChange_Fails() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateTestPayload("original-content-here"); - var envelope = _fixture.Sign(payload); - - // Act - Modify a single byte in payload - var modifiedPayload = payload.ToArray(); - modifiedPayload[10] ^= 0x01; // Flip one bit in the middle - - var tamperedEnvelope = new DsseEnvelope( - envelope.PayloadType, - modifiedPayload, - envelope.Signatures); - - // Assert - _fixture.Verify(tamperedEnvelope).Should().BeFalse("single bit change should invalidate signature"); - } - - // DSSE-8200-006: Tamper detection - modified signature - - [Fact] - public void Verify_WithModifiedSignature_Fails() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - _fixture.Verify(envelope).Should().BeTrue("unmodified envelope should verify"); - - // Act - Tamper with signature - var originalSig = envelope.Signatures[0]; - var tamperedSigBytes = Convert.FromBase64String(originalSig.Signature); - tamperedSigBytes[0] ^= 0xFF; // Corrupt first byte - - var tamperedSig = new DsseSignature(Convert.ToBase64String(tamperedSigBytes), originalSig.KeyId); - var tamperedEnvelope = new DsseEnvelope( - envelope.PayloadType, - envelope.Payload, - [tamperedSig]); - - // Assert - _fixture.Verify(tamperedEnvelope).Should().BeFalse("tampered signature should not verify"); - } - - [Fact] - public void Verify_WithTruncatedSignature_Fails() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - Truncate signature - var originalSig = envelope.Signatures[0]; - var truncatedSigBytes = Convert.FromBase64String(originalSig.Signature).AsSpan(0, 10).ToArray(); - - var truncatedSig = new DsseSignature(Convert.ToBase64String(truncatedSigBytes), originalSig.KeyId); - var tamperedEnvelope = new DsseEnvelope( - envelope.PayloadType, - envelope.Payload, - [truncatedSig]); - - // Assert - _fixture.Verify(tamperedEnvelope).Should().BeFalse("truncated signature should not verify"); - } - - // DSSE-8200-010: Determinism - same payload signed twice produces identical envelope bytes - - [Fact] - public void Sign_SamePayloadTwice_WithSameKey_ProducesConsistentPayloadAndSignatureFormat() - { - // Arrange - Use the same key instance to sign twice - var payload = DsseRoundtripTestFixture.CreateTestPayload("deterministic-payload"); - - // Act - Sign the same payload twice with the same key - var envelope1 = _fixture.Sign(payload); - var envelope2 = _fixture.Sign(payload); - - // Assert - Payloads should be identical - envelope1.Payload.ToArray().Should().BeEquivalentTo(envelope2.Payload.ToArray()); - envelope1.PayloadType.Should().Be(envelope2.PayloadType); - - // Key ID should be the same - envelope1.Signatures[0].KeyId.Should().Be(envelope2.Signatures[0].KeyId); - - // Note: ECDSA signatures may differ due to random k value, but they should both verify - _fixture.Verify(envelope1).Should().BeTrue(); - _fixture.Verify(envelope2).Should().BeTrue(); - } - - [Fact] - public void Sign_DifferentPayloads_ProducesDifferentSignatures() - { - // Arrange - var payload1 = DsseRoundtripTestFixture.CreateTestPayload("payload-1"); - var payload2 = DsseRoundtripTestFixture.CreateTestPayload("payload-2"); - - // Act - var envelope1 = _fixture.Sign(payload1); - var envelope2 = _fixture.Sign(payload2); - - // Assert - envelope1.Signatures[0].Signature.Should().NotBe(envelope2.Signatures[0].Signature); - } - - // DSSE-8200-011: Serialization is canonical (key order, no whitespace variance) - - [Fact] - public void Serialize_ProducesCanonicalJson_NoWhitespaceVariance() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - Serialize multiple times - var bytes1 = DsseRoundtripTestFixture.SerializeToBytes(envelope); - var bytes2 = DsseRoundtripTestFixture.SerializeToBytes(envelope); - var bytes3 = DsseRoundtripTestFixture.SerializeToBytes(envelope); - - // Assert - All serializations should be byte-for-byte identical - bytes2.Should().BeEquivalentTo(bytes1); - bytes3.Should().BeEquivalentTo(bytes1); - } - - [Fact] - public void Serialize_OrdersKeysConsistently() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - var serialized = DsseRoundtripTestFixture.SerializeToBytes(envelope); - var json = Encoding.UTF8.GetString(serialized); - - // Assert - Verify key order in JSON - var payloadTypeIndex = json.IndexOf("\"payloadType\""); - var payloadIndex = json.IndexOf("\"payload\""); - var signaturesIndex = json.IndexOf("\"signatures\""); - - payloadTypeIndex.Should().BeLessThan(payloadIndex, "payloadType should come before payload"); - payloadIndex.Should().BeLessThan(signaturesIndex, "payload should come before signatures"); - } - - // DSSE-8200-012: Property test - serialize → deserialize → serialize produces identical bytes - - [Theory] - [InlineData("simple-text-payload")] - [InlineData("")] - [InlineData("unicode: 你好世界 🔐")] - [InlineData("{\"key\":\"value\",\"nested\":{\"array\":[1,2,3]}}")] - public void SerializeDeserializeSerialize_ProducesIdenticalBytes(string payloadContent) - { - // Arrange - var payload = Encoding.UTF8.GetBytes(payloadContent); - if (payload.Length == 0) - { - // Empty payload needs at least one byte for valid DSSE - payload = Encoding.UTF8.GetBytes("{}"); - } - - var envelope = _fixture.Sign(payload); - - // Act - Triple round-trip - var bytes1 = DsseRoundtripTestFixture.SerializeToBytes(envelope); - var deserialized1 = DsseRoundtripTestFixture.DeserializeFromBytes(bytes1); - var bytes2 = DsseRoundtripTestFixture.SerializeToBytes(deserialized1); - var deserialized2 = DsseRoundtripTestFixture.DeserializeFromBytes(bytes2); - var bytes3 = DsseRoundtripTestFixture.SerializeToBytes(deserialized2); - - // Assert - All serializations should be identical - bytes2.Should().BeEquivalentTo(bytes1, "first round-trip should be stable"); - bytes3.Should().BeEquivalentTo(bytes1, "second round-trip should be stable"); - } - - [Fact] - public void SerializeDeserializeSerialize_LargePayload_ProducesIdenticalBytes() - { - // Arrange - Create a large payload - var largeContent = new string('X', 100_000); - var payload = Encoding.UTF8.GetBytes($"{{\"large\":\"{largeContent}\"}}"); - var envelope = _fixture.Sign(payload); - - // Act - var bytes1 = DsseRoundtripTestFixture.SerializeToBytes(envelope); - var deserialized = DsseRoundtripTestFixture.DeserializeFromBytes(bytes1); - var bytes2 = DsseRoundtripTestFixture.SerializeToBytes(deserialized); - - // Assert - bytes2.Should().BeEquivalentTo(bytes1); - _fixture.Verify(deserialized).Should().BeTrue(); - } - - // Verification result tests - - [Fact] - public void VerifyDetailed_ValidEnvelope_ReturnsSuccessResult() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Act - var result = _fixture.VerifyDetailed(envelope); - - // Assert - result.IsValid.Should().BeTrue(); - result.SignatureResults.Should().HaveCount(1); - result.SignatureResults[0].IsValid.Should().BeTrue(); - result.SignatureResults[0].FailureReason.Should().BeNull(); - } - - [Fact] - public void VerifyDetailed_InvalidSignature_ReturnsFailureReason() - { - // Arrange - var payload = DsseRoundtripTestFixture.CreateInTotoPayload(); - var envelope = _fixture.Sign(payload); - - // Tamper with payload - var tamperedPayload = payload.ToArray(); - tamperedPayload[0] ^= 0xFF; - var tamperedEnvelope = new DsseEnvelope( - envelope.PayloadType, - tamperedPayload, - envelope.Signatures); - - // Act - var result = _fixture.VerifyDetailed(tamperedEnvelope); - - // Assert - result.IsValid.Should().BeFalse(); - result.SignatureResults.Should().HaveCount(1); - result.SignatureResults[0].IsValid.Should().BeFalse(); - result.SignatureResults[0].FailureReason.Should().NotBeNullOrEmpty(); - } - - // Helper methods - - private static byte[] TamperWithPayload(byte[] serializedEnvelope) - { - var json = Encoding.UTF8.GetString(serializedEnvelope); - using var doc = JsonDocument.Parse(json); - - var payloadBase64 = doc.RootElement.GetProperty("payload").GetString()!; - var payloadBytes = Convert.FromBase64String(payloadBase64); - - // Modify payload content - payloadBytes[0] ^= 0xFF; - var tamperedPayloadBase64 = Convert.ToBase64String(payloadBytes); - - // Reconstruct JSON with tampered payload - json = json.Replace(payloadBase64, tamperedPayloadBase64); - return Encoding.UTF8.GetBytes(json); - } - - public void Dispose() - { - _fixture.Dispose(); - } -} diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/EnvelopeSignatureServiceTests.cs b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/EnvelopeSignatureServiceTests.cs deleted file mode 100644 index 655a72592..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/EnvelopeSignatureServiceTests.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using FluentAssertions; -using StellaOps.Attestor.Envelope; -using StellaOps.Cryptography; -using Xunit; - - -using StellaOps.TestKit; -namespace StellaOps.Attestor.Envelope.Tests; - -public sealed class EnvelopeSignatureServiceTests -{ - private static readonly byte[] SamplePayload = Encoding.UTF8.GetBytes("stella-ops-deterministic"); - - private static readonly byte[] Ed25519Seed = - Convert.FromHexString("9D61B19DEFFD5A60BA844AF492EC2CC4" + - "4449C5697B326919703BAC031CAE7F60D75A980182B10AB7D54BFED3C964073A" + - "0EE172F3DAA62325AF021A68F707511A"); - - private static readonly byte[] Ed25519Public = - Convert.FromHexString("D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A"); - - private readonly EnvelopeSignatureService service = new(); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SignAndVerify_Ed25519_Succeeds() - { - var signingKey = EnvelopeKey.CreateEd25519Signer(Ed25519Seed, Ed25519Public); - var verifyKey = EnvelopeKey.CreateEd25519Verifier(Ed25519Public); - - var signResult = service.Sign(SamplePayload, signingKey); - - signResult.IsSuccess.Should().BeTrue(); - signResult.Value.AlgorithmId.Should().Be(SignatureAlgorithms.Ed25519); - signResult.Value.KeyId.Should().Be(signingKey.KeyId); - - var verifyResult = service.Verify(SamplePayload, signResult.Value, verifyKey); - - verifyResult.IsSuccess.Should().BeTrue(); - verifyResult.Value.Should().BeTrue(); - - var expectedKeyId = ComputeExpectedEd25519KeyId(Ed25519Public); - signingKey.KeyId.Should().Be(expectedKeyId); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_Ed25519_InvalidSignature_ReturnsError() - { - var signingKey = EnvelopeKey.CreateEd25519Signer(Ed25519Seed, Ed25519Public); - var signResult = service.Sign(SamplePayload, signingKey); - signResult.IsSuccess.Should().BeTrue(); - - var tamperedBytes = signResult.Value.Value.ToArray(); - tamperedBytes[0] ^= 0xFF; - var tamperedSignature = new EnvelopeSignature(signResult.Value.KeyId, signResult.Value.AlgorithmId, tamperedBytes); - var verifyKey = EnvelopeKey.CreateEd25519Verifier(Ed25519Public); - - var verifyResult = service.Verify(SamplePayload, tamperedSignature, verifyKey); - - verifyResult.IsSuccess.Should().BeFalse(); - verifyResult.Error.Code.Should().Be(EnvelopeSignatureErrorCode.SignatureInvalid); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SignAndVerify_EcdsaEs256_Succeeds() - { - using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); - var privateParameters = ecdsa.ExportParameters(includePrivateParameters: true); - var publicParameters = ecdsa.ExportParameters(includePrivateParameters: false); - - var signingKey = EnvelopeKey.CreateEcdsaSigner(SignatureAlgorithms.Es256, in privateParameters); - var verifyKey = EnvelopeKey.CreateEcdsaVerifier(SignatureAlgorithms.Es256, in publicParameters); - - var signResult = service.Sign(SamplePayload, signingKey); - signResult.IsSuccess.Should().BeTrue(); - - var verifyResult = service.Verify(SamplePayload, signResult.Value, verifyKey); - verifyResult.IsSuccess.Should().BeTrue(); - verifyResult.Value.Should().BeTrue(); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Sign_WithVerificationOnlyKey_ReturnsMissingPrivateKey() - { - using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); - var publicParameters = ecdsa.ExportParameters(includePrivateParameters: false); - var verifyOnlyKey = EnvelopeKey.CreateEcdsaVerifier(SignatureAlgorithms.Es256, in publicParameters); - - var signResult = service.Sign(SamplePayload, verifyOnlyKey); - - signResult.IsSuccess.Should().BeFalse(); - signResult.Error.Code.Should().Be(EnvelopeSignatureErrorCode.MissingPrivateKey); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_WithMismatchedKeyId_ReturnsError() - { - var signingKey = EnvelopeKey.CreateEd25519Signer(Ed25519Seed, Ed25519Public); - var signResult = service.Sign(SamplePayload, signingKey); - signResult.IsSuccess.Should().BeTrue(); - - var alternateKey = EnvelopeKey.CreateEd25519Verifier(Ed25519Public, "sha256:alternate"); - var verifyResult = service.Verify(SamplePayload, signResult.Value, alternateKey); - - verifyResult.IsSuccess.Should().BeFalse(); - verifyResult.Error.Code.Should().Be(EnvelopeSignatureErrorCode.KeyIdMismatch); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_WithInvalidSignatureLength_ReturnsFormatError() - { - var verifyKey = EnvelopeKey.CreateEd25519Verifier(Ed25519Public); - var invalidSignature = new EnvelopeSignature(verifyKey.KeyId, verifyKey.AlgorithmId, new byte[16]); - - var verifyResult = service.Verify(SamplePayload, invalidSignature, verifyKey); - - verifyResult.IsSuccess.Should().BeFalse(); - verifyResult.Error.Code.Should().Be(EnvelopeSignatureErrorCode.InvalidSignatureFormat); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_WithAlgorithmMismatch_ReturnsError() - { - using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); - var privateParameters = ecdsa.ExportParameters(includePrivateParameters: true); - var publicParameters = ecdsa.ExportParameters(includePrivateParameters: false); - var signingKey = EnvelopeKey.CreateEcdsaSigner(SignatureAlgorithms.Es256, in privateParameters); - var signResult = service.Sign(SamplePayload, signingKey); - signResult.IsSuccess.Should().BeTrue(); - - var mismatchKey = EnvelopeKey.CreateEcdsaVerifier(SignatureAlgorithms.Es384, in publicParameters, signResult.Value.KeyId); - var verifyResult = service.Verify(SamplePayload, signResult.Value, mismatchKey); - - verifyResult.IsSuccess.Should().BeFalse(); - verifyResult.Error.Code.Should().Be(EnvelopeSignatureErrorCode.AlgorithmMismatch); - } - - private static string ComputeExpectedEd25519KeyId(byte[] publicKey) - { - var jwk = $"{{\"crv\":\"Ed25519\",\"kty\":\"OKP\",\"x\":\"{ToBase64Url(publicKey)}\"}}"; - using var sha = SHA256.Create(); -using StellaOps.TestKit; - var digest = sha.ComputeHash(Encoding.UTF8.GetBytes(jwk)); - return $"sha256:{ToBase64Url(digest)}"; - } - - private static string ToBase64Url(byte[] bytes) - => Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_'); -} diff --git a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/StellaOps.Attestor.Envelope.Tests.csproj b/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/StellaOps.Attestor.Envelope.Tests.csproj deleted file mode 100644 index ec58897fe..000000000 --- a/src/Attestor/StellaOps.Attestor.Envelope/StellaOps.Attestor.Envelope.Tests/StellaOps.Attestor.Envelope.Tests.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - net10.0 - preview - false - enable - enable - false - NU1504 - false - - - - - - - - - - - - - diff --git a/src/Attestor/StellaOps.Attestor.Envelope/__Tests/StellaOps.Attestor.Envelope.Tests/DsseEnvelopeSerializerTests.cs b/src/Attestor/StellaOps.Attestor.Envelope/__Tests/StellaOps.Attestor.Envelope.Tests/DsseEnvelopeSerializerTests.cs index 259d0dd88..02281e3e0 100644 --- a/src/Attestor/StellaOps.Attestor.Envelope/__Tests/StellaOps.Attestor.Envelope.Tests/DsseEnvelopeSerializerTests.cs +++ b/src/Attestor/StellaOps.Attestor.Envelope/__Tests/StellaOps.Attestor.Envelope.Tests/DsseEnvelopeSerializerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.IO.Compression; using System.Linq; @@ -114,7 +114,6 @@ public sealed class DsseEnvelopeSerializerTests Assert.NotNull(result.ExpandedJson); using var expanded = JsonDocument.Parse(result.ExpandedJson!); -using StellaOps.TestKit; var detached = expanded.RootElement.GetProperty("detachedPayload"); Assert.Equal(reference.Uri, detached.GetProperty("uri").GetString()); diff --git a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSigningServiceTests.cs b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSigningServiceTests.cs index 4aa5b8c03..271ef74be 100644 --- a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSigningServiceTests.cs +++ b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSigningServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; @@ -256,7 +256,6 @@ public sealed class AttestorSigningServiceTests : IDisposable using var metrics = new AttestorMetrics(); using var registry = new AttestorSigningKeyRegistry(options, TimeProvider.System, NullLogger.Instance); -using StellaOps.TestKit; var auditSink = new InMemoryAttestorAuditSink(); var service = new AttestorSigningService( registry, diff --git a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSubmissionServiceTests.cs b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSubmissionServiceTests.cs index 337a86e66..50bf2fc45 100644 --- a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSubmissionServiceTests.cs +++ b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorSubmissionServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; @@ -277,7 +277,6 @@ public sealed class AttestorSubmissionServiceTests var logger = new NullLogger(); using var metrics = new AttestorMetrics(); -using StellaOps.TestKit; var service = new AttestorSubmissionService( validator, repository, diff --git a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorVerificationServiceTests.cs b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorVerificationServiceTests.cs index feff960d3..c01abfb49 100644 --- a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorVerificationServiceTests.cs +++ b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/AttestorVerificationServiceTests.cs @@ -1,4 +1,4 @@ -using System.Buffers.Binary; +using System.Buffers.Binary; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; @@ -700,7 +700,6 @@ public sealed class AttestorVerificationServiceTests private static byte[] ComputeMerkleNode(byte[] left, byte[] right) { using var sha = SHA256.Create(); -using StellaOps.TestKit; var buffer = new byte[1 + left.Length + right.Length]; buffer[0] = 0x01; Buffer.BlockCopy(left, 0, buffer, 1, left.Length); diff --git a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/BulkVerificationWorkerTests.cs b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/BulkVerificationWorkerTests.cs index 92c79a060..4278ac7e9 100644 --- a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/BulkVerificationWorkerTests.cs +++ b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/BulkVerificationWorkerTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging.Abstractions; @@ -24,7 +24,6 @@ public sealed class BulkVerificationWorkerTests var jobStore = new InMemoryBulkVerificationJobStore(); var verificationService = new StubVerificationService(); using var metrics = new AttestorMetrics(); -using StellaOps.TestKit; var options = Options.Create(new AttestorOptions { BulkVerification = new AttestorOptions.BulkVerificationOptions diff --git a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/CachedAttestorVerificationServiceTests.cs b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/CachedAttestorVerificationServiceTests.cs index 5d849dc81..290f1d905 100644 --- a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/CachedAttestorVerificationServiceTests.cs +++ b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/CachedAttestorVerificationServiceTests.cs @@ -1,4 +1,4 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging.Abstractions; @@ -86,7 +86,6 @@ public sealed class CachedAttestorVerificationServiceTests var options = Options.Create(new AttestorOptions()); using var memoryCache = new MemoryCache(new MemoryCacheOptions()); using var metrics = new AttestorMetrics(); -using StellaOps.TestKit; var cache = new InMemoryAttestorVerificationCache(memoryCache, options, new NullLogger()); var inner = new StubVerificationService(); var service = new CachedAttestorVerificationService( diff --git a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/HttpTransparencyWitnessClientTests.cs b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/HttpTransparencyWitnessClientTests.cs index f908c4808..34648a91a 100644 --- a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/HttpTransparencyWitnessClientTests.cs +++ b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/HttpTransparencyWitnessClientTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Net.Http; using System.Text.Json; @@ -136,7 +136,6 @@ public sealed class HttpTransparencyWitnessClientTests using var metrics = new AttestorMetrics(); using var activitySource = new AttestorActivitySource(); -using StellaOps.TestKit; var options = Options.Create(new AttestorOptions { TransparencyWitness = new AttestorOptions.TransparencyWitnessOptions diff --git a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/RekorInclusionVerificationIntegrationTests.cs b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/RekorInclusionVerificationIntegrationTests.cs index b9a179c64..9567477b3 100644 --- a/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/RekorInclusionVerificationIntegrationTests.cs +++ b/src/Attestor/StellaOps.Attestor/StellaOps.Attestor.Tests/RekorInclusionVerificationIntegrationTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Text.Json; using StellaOps.Attestor.Core.Verification; using Xunit; @@ -309,7 +309,6 @@ public sealed class RekorInclusionVerificationIntegrationTests private static byte[] ComputeInteriorHash(byte[] left, byte[] right) { using var sha256 = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; var combined = new byte[1 + left.Length + right.Length]; combined[0] = 0x01; // Interior node prefix left.CopyTo(combined, 1); diff --git a/src/Attestor/__Tests/StellaOps.Attestor.Bundle.Tests/SigstoreBundleVerifierTests.cs b/src/Attestor/__Tests/StellaOps.Attestor.Bundle.Tests/SigstoreBundleVerifierTests.cs index 0c613ade1..70a726b85 100644 --- a/src/Attestor/__Tests/StellaOps.Attestor.Bundle.Tests/SigstoreBundleVerifierTests.cs +++ b/src/Attestor/__Tests/StellaOps.Attestor.Bundle.Tests/SigstoreBundleVerifierTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // SigstoreBundleVerifierTests.cs // Sprint: SPRINT_8200_0001_0005 - Sigstore Bundle Implementation // Tasks: BUNDLE-8200-020, BUNDLE-8200-021 - Bundle verification tests @@ -328,7 +328,6 @@ public class SigstoreBundleVerifierTests DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddYears(1)); -using StellaOps.TestKit; return cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Cert); } } diff --git a/src/Attestor/__Tests/StellaOps.Attestor.Bundling.Tests/BundleWorkflowIntegrationTests.cs b/src/Attestor/__Tests/StellaOps.Attestor.Bundling.Tests/BundleWorkflowIntegrationTests.cs index 557dd3eed..eb8d5b559 100644 --- a/src/Attestor/__Tests/StellaOps.Attestor.Bundling.Tests/BundleWorkflowIntegrationTests.cs +++ b/src/Attestor/__Tests/StellaOps.Attestor.Bundling.Tests/BundleWorkflowIntegrationTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // BundleWorkflowIntegrationTests.cs // Sprint: SPRINT_20251226_002_ATTESTOR_bundle_rotation // Task: 0023 - Integration test: Full bundle workflow @@ -22,7 +22,7 @@ namespace StellaOps.Attestor.Bundling.Tests; /// /// Integration tests for the full bundle creation workflow: -/// Create → Store → Retrieve → Verify +/// Create → Store → Retrieve → Verify /// public class BundleWorkflowIntegrationTests { @@ -406,7 +406,6 @@ public class BundleWorkflowIntegrationTests } using var sha256 = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; var combined = string.Join("|", attestations.Select(a => a.EntryId)); var hash = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(combined)); return Convert.ToHexString(hash).ToLowerInvariant(); diff --git a/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/FileSystemRootStoreTests.cs b/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/FileSystemRootStoreTests.cs index 72ac13f16..346d7ad62 100644 --- a/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/FileSystemRootStoreTests.cs +++ b/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/FileSystemRootStoreTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // FileSystemRootStoreTests.cs // Sprint: SPRINT_20251226_003_ATTESTOR_offline_verification // Task: 0023 - Unit tests for FileSystemRootStore @@ -350,7 +350,6 @@ public class FileSystemRootStoreTests : IDisposable private static X509Certificate2 CreateTestCertificate(string subject) { using var rsa = RSA.Create(2048); -using StellaOps.TestKit; var request = new CertificateRequest( subject, rsa, diff --git a/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/OfflineCertChainValidatorTests.cs b/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/OfflineCertChainValidatorTests.cs index f76b1e816..81c4fc6eb 100644 --- a/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/OfflineCertChainValidatorTests.cs +++ b/src/Attestor/__Tests/StellaOps.Attestor.Offline.Tests/OfflineCertChainValidatorTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // OfflineCertChainValidatorTests.cs // Sprint: SPRINT_20251226_003_ATTESTOR_offline_verification // Task: 0022 - Unit tests for certificate chain validation @@ -349,7 +349,6 @@ public class OfflineCertChainValidatorTests private static X509Certificate2 CreateFutureCertificate(string subject) { using var rsa = RSA.Create(2048); -using StellaOps.TestKit; var request = new CertificateRequest( subject, rsa, diff --git a/src/Attestor/__Tests/StellaOps.Attestor.ProofChain.Tests/JsonCanonicalizerTests.cs b/src/Attestor/__Tests/StellaOps.Attestor.ProofChain.Tests/JsonCanonicalizerTests.cs index a4df830b2..0d61fed15 100644 --- a/src/Attestor/__Tests/StellaOps.Attestor.ProofChain.Tests/JsonCanonicalizerTests.cs +++ b/src/Attestor/__Tests/StellaOps.Attestor.ProofChain.Tests/JsonCanonicalizerTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // JsonCanonicalizerTests.cs // Sprint: SPRINT_0501_0002_0001_proof_chain_content_addressed_ids // Task: PROOF-ID-0014 @@ -49,12 +49,11 @@ public sealed class JsonCanonicalizerTests [Fact] public void Canonicalize_PreservesUnicodeContent() { - var text = "hello 世界 \U0001F30D"; + var text = "hello 世界 \U0001F30D"; var input = JsonSerializer.SerializeToUtf8Bytes(new { text }); var output = _canonicalizer.Canonicalize(input); using var document = JsonDocument.Parse(output); -using StellaOps.TestKit; Assert.Equal(text, document.RootElement.GetProperty("text").GetString()); } diff --git a/src/Attestor/__Tests/StellaOps.Attestor.Types.Tests/SmartDiffSchemaValidationTests.cs b/src/Attestor/__Tests/StellaOps.Attestor.Types.Tests/SmartDiffSchemaValidationTests.cs index 002b66ba5..b28c549bc 100644 --- a/src/Attestor/__Tests/StellaOps.Attestor.Types.Tests/SmartDiffSchemaValidationTests.cs +++ b/src/Attestor/__Tests/StellaOps.Attestor.Types.Tests/SmartDiffSchemaValidationTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using FluentAssertions; using Json.Schema; using Xunit; @@ -92,7 +92,6 @@ public sealed class SmartDiffSchemaValidationTests } """); -using StellaOps.TestKit; var result = schema.Evaluate(doc.RootElement, new EvaluationOptions { OutputFormat = OutputFormat.List, diff --git a/src/Authority/StellaOps.Authority/StellaOps.Auth.Client.Tests/ServiceCollectionExtensionsTests.cs b/src/Authority/StellaOps.Authority/StellaOps.Auth.Client.Tests/ServiceCollectionExtensionsTests.cs index 4e04d896f..66d00c5f0 100644 --- a/src/Authority/StellaOps.Authority/StellaOps.Auth.Client.Tests/ServiceCollectionExtensionsTests.cs +++ b/src/Authority/StellaOps.Authority/StellaOps.Auth.Client.Tests/ServiceCollectionExtensionsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net; @@ -216,7 +216,6 @@ public class ServiceCollectionExtensionsTests }); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var client = provider.GetRequiredService().CreateClient("notify"); await client.GetAsync("https://notify.example/api"); diff --git a/src/Authority/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs b/src/Authority/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs index a95ef024f..bdf2da3f8 100644 --- a/src/Authority/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs +++ b/src/Authority/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Configuration; @@ -34,7 +34,6 @@ public class ServiceCollectionExtensionsTests using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var resourceOptions = provider.GetRequiredService>().CurrentValue; var jwtOptions = provider.GetRequiredService>().Get(StellaOpsAuthenticationDefaults.AuthenticationScheme); diff --git a/src/Authority/StellaOps.Authority/StellaOps.Authority.Plugin.Standard.Tests/StandardPluginRegistrarTests.cs b/src/Authority/StellaOps.Authority/StellaOps.Authority.Plugin.Standard.Tests/StandardPluginRegistrarTests.cs index 859cfc0b1..0013a689d 100644 --- a/src/Authority/StellaOps.Authority/StellaOps.Authority.Plugin.Standard.Tests/StandardPluginRegistrarTests.cs +++ b/src/Authority/StellaOps.Authority/StellaOps.Authority.Plugin.Standard.Tests/StandardPluginRegistrarTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Threading; @@ -238,7 +238,6 @@ public class StandardPluginRegistrarTests registrar.Register(new AuthorityPluginRegistrationContext(services, pluginContext, configuration)); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var optionsMonitor = provider.GetRequiredService>(); var options = optionsMonitor.Get("standard"); diff --git a/src/Authority/__Libraries/StellaOps.Authority.Storage.Postgres/Migrations/_archived/pre_1.0/README.md b/src/Authority/__Libraries/StellaOps.Authority.Storage.Postgres/Migrations/_archived/pre_1.0/README.md new file mode 100644 index 000000000..5f8a1e9c2 --- /dev/null +++ b/src/Authority/__Libraries/StellaOps.Authority.Storage.Postgres/Migrations/_archived/pre_1.0/README.md @@ -0,0 +1,25 @@ +# Archived Pre-1.0 Migrations + +This directory contains the original migrations that were compacted into `001_initial_schema.sql` +for the 1.0.0 release. + +## Original Files +- `001_initial_schema.sql` - Initial IAM, tenants, users, tokens tables +- `002_mongo_store_equivalents.sql` - PostgreSQL-backed tables replacing MongoDB +- `003_enable_rls.sql` - Row-Level Security for tenant isolation +- `004_offline_kit_audit.sql` - Offline Kit audit events +- `005_verdict_manifests.sql` - VEX verdict manifests + +## Why Archived +Pre-1.0, the schema evolved incrementally. For 1.0.0, migrations were compacted into a single +initial schema to: +- Simplify new deployments +- Reduce startup time +- Provide cleaner upgrade path + +## For Existing Deployments +If upgrading from pre-1.0, run the reset script directly with psql: +```bash +psql -h -U -d -f devops/scripts/migrations-reset-pre-1.0.sql +``` +This updates `schema_migrations` to recognize the compacted schema. diff --git a/src/Authority/__Tests/StellaOps.Authority.Storage.Postgres.Tests/AuthorityMigrationTests.cs b/src/Authority/__Tests/StellaOps.Authority.Storage.Postgres.Tests/AuthorityMigrationTests.cs index d7a81c9e4..e1b7b3beb 100644 --- a/src/Authority/__Tests/StellaOps.Authority.Storage.Postgres.Tests/AuthorityMigrationTests.cs +++ b/src/Authority/__Tests/StellaOps.Authority.Storage.Postgres.Tests/AuthorityMigrationTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Npgsql; using Xunit; @@ -56,7 +56,6 @@ public sealed class AuthorityMigrationTests { // Arrange await using var connection = new NpgsqlConnection(_fixture.ConnectionString); -using StellaOps.TestKit; await connection.OpenAsync(); // Act - Check schema_migrations table diff --git a/src/Bench/StellaOps.Bench/Scanner.Analyzers/StellaOps.Bench.ScannerAnalyzers.Tests/BenchmarkJsonWriterTests.cs b/src/Bench/StellaOps.Bench/Scanner.Analyzers/StellaOps.Bench.ScannerAnalyzers.Tests/BenchmarkJsonWriterTests.cs index f287d55cb..1634e45d4 100644 --- a/src/Bench/StellaOps.Bench/Scanner.Analyzers/StellaOps.Bench.ScannerAnalyzers.Tests/BenchmarkJsonWriterTests.cs +++ b/src/Bench/StellaOps.Bench/Scanner.Analyzers/StellaOps.Bench.ScannerAnalyzers.Tests/BenchmarkJsonWriterTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Bench.ScannerAnalyzers; using StellaOps.Bench.ScannerAnalyzers.Baseline; using StellaOps.Bench.ScannerAnalyzers.Reporting; @@ -31,7 +31,6 @@ public sealed class BenchmarkJsonWriterTests await BenchmarkJsonWriter.WriteAsync(path, metadata, new[] { report }, CancellationToken.None); using var document = JsonDocument.Parse(await File.ReadAllTextAsync(path)); -using StellaOps.TestKit; var root = document.RootElement; Assert.Equal("1.0", root.GetProperty("schemaVersion").GetString()); diff --git a/src/BinaryIndex/__Tests/StellaOps.BinaryIndex.Core.Tests/FeatureExtractorTests.cs b/src/BinaryIndex/__Tests/StellaOps.BinaryIndex.Core.Tests/FeatureExtractorTests.cs index f846f1c1b..04121e34a 100644 --- a/src/BinaryIndex/__Tests/StellaOps.BinaryIndex.Core.Tests/FeatureExtractorTests.cs +++ b/src/BinaryIndex/__Tests/StellaOps.BinaryIndex.Core.Tests/FeatureExtractorTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // FeatureExtractorTests.cs // Sprint: SPRINT_20251226_011_BINIDX_known_build_catalog // Task: BINCAT-17 - Unit tests for identity extraction (ELF, PE, Mach-O) @@ -509,7 +509,6 @@ public class BinaryIdentityDeterminismTests using var stream1 = new MemoryStream(content1); using var stream2 = new MemoryStream(content2); -using StellaOps.TestKit; var identity1 = await extractor.ExtractIdentityAsync(stream1); var identity2 = await extractor.ExtractIdentityAsync(stream2); diff --git a/src/Cli/__Tests/StellaOps.Cli.Tests/AttestationBundleVerifierTests.cs b/src/Cli/__Tests/StellaOps.Cli.Tests/AttestationBundleVerifierTests.cs index 14d59a9bf..bfc0a0c38 100644 --- a/src/Cli/__Tests/StellaOps.Cli.Tests/AttestationBundleVerifierTests.cs +++ b/src/Cli/__Tests/StellaOps.Cli.Tests/AttestationBundleVerifierTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; using System.Text.Json; @@ -404,7 +404,6 @@ public sealed class AttestationBundleVerifierTests : IDisposable { var bytes = Encoding.UTF8.GetBytes(content); using var dataStream = new MemoryStream(bytes); -using StellaOps.TestKit; var entry = new PaxTarEntry(TarEntryType.RegularFile, name) { DataStream = dataStream diff --git a/src/Concelier/StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj b/src/Concelier/StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj index 978ac9130..4ca38b96c 100644 --- a/src/Concelier/StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj +++ b/src/Concelier/StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Cccs.Tests/CccsConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Cccs.Tests/CccsConnectorTests.cs index b1e675757..ab5c4154c 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Cccs.Tests/CccsConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Cccs.Tests/CccsConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Net.Http.Headers; using System.Text; @@ -73,7 +73,6 @@ public sealed class CccsConnectorTests public async Task Fetch_PersistsRawDocumentWithMetadata() { await using var harness = await BuildHarnessAsync(); -using StellaOps.TestKit; SeedFeedResponses(harness.Handler); var connector = harness.ServiceProvider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.CertBund.Tests/CertBundConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.CertBund.Tests/CertBundConnectorTests.cs index 778937467..e172736bb 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.CertBund.Tests/CertBundConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.CertBund.Tests/CertBundConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Net.Http.Headers; using System.Text; @@ -83,7 +83,6 @@ public sealed class CertBundConnectorTests public async Task Fetch_PersistsDocumentWithMetadata() { await using var harness = await BuildHarnessAsync(); -using StellaOps.TestKit; SeedResponses(harness.Handler); var connector = harness.ServiceProvider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineConnectorTests.cs index e24df5ed6..aad03299d 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -33,7 +33,6 @@ public sealed class AlpineConnectorTests { await using var harness = await BuildHarnessAsync(); -using StellaOps.TestKit; harness.Handler.AddJsonResponse(SecDbUri, BuildMinimalSecDb()); var connector = harness.ServiceProvider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineDependencyInjectionRoutineTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineDependencyInjectionRoutineTests.cs index 6560a6e95..ec6daccbd 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineDependencyInjectionRoutineTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Alpine.Tests/AlpineDependencyInjectionRoutineTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -44,7 +44,6 @@ public sealed class AlpineDependencyInjectionRoutineTests using var provider = services.BuildServiceProvider(validateScopes: true); -using StellaOps.TestKit; var options = provider.GetRequiredService>().Value; Assert.Equal(new Uri("https://secdb.alpinelinux.org/"), options.BaseUri); Assert.Equal(new[] { "v3.20" }, options.Releases); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Debian.Tests/DebianConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Debian.Tests/DebianConnectorTests.cs index 30006735b..9672e2c78 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Debian.Tests/DebianConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Debian.Tests/DebianConnectorTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System; using System.IO; using System.Linq; @@ -73,7 +73,6 @@ public sealed class DebianConnectorTests : IAsyncLifetime { await using var provider = await BuildServiceProviderAsync(); -using StellaOps.TestKit; SeedInitialResponses(); var connector = provider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Suse.Tests/SuseConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Suse.Tests/SuseConnectorTests.cs index fde9d89c5..8138b68d2 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Suse.Tests/SuseConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Suse.Tests/SuseConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Net; @@ -43,7 +43,6 @@ public sealed class SuseConnectorTests { await using var harness = await BuildHarnessAsync(); -using StellaOps.TestKit; SeedInitialResponses(harness.Handler); var connector = harness.ServiceProvider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs index 16c35fa70..fc8c30179 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Net; @@ -42,7 +42,6 @@ public sealed class UbuntuConnectorTests { await using var harness = await BuildHarnessAsync(); -using StellaOps.TestKit; SeedInitialResponses(harness.Handler); var connector = harness.ServiceProvider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ics.Cisa.Tests/IcsCisaConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ics.Cisa.Tests/IcsCisaConnectorTests.cs index a13bbd641..3dea71118 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ics.Cisa.Tests/IcsCisaConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ics.Cisa.Tests/IcsCisaConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Net; @@ -34,7 +34,6 @@ public sealed class IcsCisaConnectorTests public async Task FetchParseMap_EndToEnd_ProducesCanonicalAdvisories() { await using var harness = await BuildHarnessAsync(); -using StellaOps.TestKit; RegisterResponses(harness.Handler); var connector = harness.ServiceProvider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Kisa.Tests/KisaConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Kisa.Tests/KisaConnectorTests.cs index 13895b6ae..756c8a174 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Kisa.Tests/KisaConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Kisa.Tests/KisaConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics.Metrics; @@ -71,7 +71,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime advisory.AdvisoryKey.Should().Be("5868"); advisory.Language.Should().Be("ko"); advisory.Aliases.Should().Contain("CVE-2025-29866"); - advisory.AffectedPackages.Should().Contain(package => package.Identifier.Contains("태그프리")); + advisory.AffectedPackages.Should().Contain(package => package.Identifier.Contains("태그프리")); advisory.References.Should().Contain(reference => reference.Url == DetailPageUri.ToString()); var package = advisory.AffectedPackages.Single(); @@ -112,7 +112,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime public async Task FetchParseMap_ExclusiveUpperBound_ProducesExclusiveNormalizedRule() { await using var provider = await BuildServiceProviderAsync(); - SeedResponses("XFU 3.2 이상 4.0 미만"); + SeedResponses("XFU 3.2 이상 4.0 미만"); var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); @@ -145,7 +145,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime public async Task FetchParseMap_ExclusiveLowerBound_ProducesExclusiveNormalizedRule() { await using var provider = await BuildServiceProviderAsync(); - SeedResponses("XFU 1.2.0 초과 2.4.0 이하"); + SeedResponses("XFU 1.2.0 초과 2.4.0 이하"); var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); @@ -179,7 +179,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime public async Task FetchParseMap_SingleBound_ProducesMinimumOnlyConstraint() { await using var provider = await BuildServiceProviderAsync(); - SeedResponses("XFU 5.0 이상"); + SeedResponses("XFU 5.0 이상"); var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); @@ -219,7 +219,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime public async Task FetchParseMap_UpperBoundOnlyExclusive_ProducesLessThanRule() { await using var provider = await BuildServiceProviderAsync(); - SeedResponses("XFU 3.5 미만"); + SeedResponses("XFU 3.5 미만"); var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); @@ -253,7 +253,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime public async Task FetchParseMap_UpperBoundOnlyInclusive_ProducesLessThanOrEqualRule() { await using var provider = await BuildServiceProviderAsync(); - SeedResponses("XFU 4.2 이하"); + SeedResponses("XFU 4.2 이하"); var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); @@ -286,7 +286,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime public async Task FetchParseMap_LowerBoundOnlyExclusive_ProducesGreaterThanRule() { await using var provider = await BuildServiceProviderAsync(); - SeedResponses("XFU 1.9 초과"); + SeedResponses("XFU 1.9 초과"); var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); @@ -320,7 +320,7 @@ public sealed class KisaConnectorTests : IAsyncLifetime public async Task FetchParseMap_InvalidSegment_ProducesFallbackRange() { await using var provider = await BuildServiceProviderAsync(); - SeedResponses("지원 버전: 최신 업데이트 적용"); + SeedResponses("지원 버전: 최신 업데이트 적용"); var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); @@ -335,11 +335,11 @@ public sealed class KisaConnectorTests : IAsyncLifetime var range = package.VersionRanges.Single(); range.RangeKind.Should().Be("string"); - range.RangeExpression.Should().Be("지원 버전: 최신 업데이트 적용"); + range.RangeExpression.Should().Be("지원 버전: 최신 업데이트 적용"); var vendorExtensions = GetVendorExtensions(range.Primitives); vendorExtensions .Should().ContainKey("kisa.range.raw") - .WhoseValue.Should().Be("지원 버전: 최신 업데이트 적용"); + .WhoseValue.Should().Be("지원 버전: 최신 업데이트 적용"); } [Trait("Category", TestCategories.Unit)] @@ -351,7 +351,6 @@ public sealed class KisaConnectorTests : IAsyncLifetime using var metrics = new KisaMetricCollector(); -using StellaOps.TestKit; var connector = provider.GetRequiredService(); await connector.FetchAsync(provider, CancellationToken.None); await connector.ParseAsync(provider, CancellationToken.None); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs index 65dbe4766..79cfee2c6 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; @@ -264,7 +264,6 @@ public sealed class RuBduConnectorSnapshotTests : IAsyncLifetime entry.LastWriteTime = new DateTimeOffset(2025, 10, 14, 9, 0, 0, TimeSpan.Zero); using var entryStream = entry.Open(); using var writer = new StreamWriter(entryStream, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); -using StellaOps.TestKit; writer.Write(xml); } diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs index a5daec1e6..8aeb4c0b0 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; @@ -88,7 +88,6 @@ public sealed class RuNkckiConnectorTests : IAsyncLifetime public async Task Fetch_ReusesCachedBulletinWhenListingFails() { await using var provider = await BuildServiceProviderAsync(); -using StellaOps.TestKit; SeedListingAndBulletin(); var connector = provider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs index 249401981..6905a47e6 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Concelier.Connector.Ru.Nkcki.Internal; using Xunit; @@ -17,7 +17,7 @@ public sealed class RuNkckiJsonParserTests "vuln_id": {"MITRE": "CVE-2025-0001", "FSTEC": "BDU:2025-00001"}, "date_published": "2025-09-01", "date_updated": "2025-09-02", - "cvss_rating": "КРИТИЧЕСКИЙ", + "cvss_rating": "КРИТИЧЕСКИЙ", "patch_available": true, "description": "Test description", "cwe": {"cwe_number": 79, "cwe_description": "Cross-site scripting"}, @@ -43,7 +43,6 @@ public sealed class RuNkckiJsonParserTests """; using var document = JsonDocument.Parse(json); -using StellaOps.TestKit; var dto = RuNkckiJsonParser.Parse(document.RootElement); Assert.Equal("BDU:2025-00001", dto.FstecId); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/MirrorSignatureVerifierTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/MirrorSignatureVerifierTests.cs index 70ba559c9..923696ad4 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/MirrorSignatureVerifierTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/MirrorSignatureVerifierTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; @@ -145,7 +145,6 @@ public sealed class MirrorSignatureVerifierTests private static string WritePublicKeyPem(CryptoSigningKey signingKey) { using var ecdsa = ECDsa.Create(signingKey.PublicParameters); -using StellaOps.TestKit; var info = ecdsa.ExportSubjectPublicKeyInfo(); var pem = PemEncoding.Write("PUBLIC KEY", info); var path = Path.Combine(Path.GetTempPath(), $"stellaops-mirror-{Guid.NewGuid():N}.pem"); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/StellaOpsMirrorConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/StellaOpsMirrorConnectorTests.cs index 271072856..c86d1213e 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/StellaOpsMirrorConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.StellaOpsMirror.Tests/StellaOpsMirrorConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Net; @@ -427,7 +427,6 @@ public sealed class StellaOpsMirrorConnectorTests : IAsyncLifetime ArgumentNullException.ThrowIfNull(signingKey); var path = Path.Combine(Path.GetTempPath(), $"stellaops-mirror-{Guid.NewGuid():N}.pem"); using var ecdsa = ECDsa.Create(signingKey.PublicParameters); -using StellaOps.TestKit; var publicKeyInfo = ecdsa.ExportSubjectPublicKeyInfo(); var pem = PemEncoding.Write("PUBLIC KEY", publicKeyInfo); File.WriteAllText(path, pem); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Vndr.Msrc.Tests/MsrcConnectorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Vndr.Msrc.Tests/MsrcConnectorTests.cs index 3b74afc30..677813e03 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Connector.Vndr.Msrc.Tests/MsrcConnectorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Connector.Vndr.Msrc.Tests/MsrcConnectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Net.Http; using System.Text; @@ -50,7 +50,6 @@ public sealed class MsrcConnectorTests : IAsyncLifetime public async Task FetchParseMap_ProducesCanonicalAdvisory() { await using var provider = await BuildServiceProviderAsync(); -using StellaOps.TestKit; SeedResponses(); var connector = provider.GetRequiredService(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobCoordinatorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobCoordinatorTests.cs index c928c529b..6cb32d519 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobCoordinatorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobCoordinatorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; @@ -270,7 +270,6 @@ public sealed class JobCoordinatorTests jobOptions.Definitions.Add(definition.Kind, definition); using var diagnostics = new JobDiagnostics(); -using StellaOps.TestKit; var coordinator = new JobCoordinator( Options.Create(jobOptions), jobStore, diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobPluginRegistrationExtensionsTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobPluginRegistrationExtensionsTests.cs index 21ba3873a..edc81b4c4 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobPluginRegistrationExtensionsTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobPluginRegistrationExtensionsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Configuration; @@ -51,7 +51,6 @@ public sealed class JobPluginRegistrationExtensionsTests descriptor => descriptor.ServiceType.FullName == typeof(PluginRoutineExecuted).FullName); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var schedulerOptions = provider.GetRequiredService>().Value; Assert.True(schedulerOptions.Definitions.TryGetValue(PluginJob.JobKind, out var definition)); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobSchedulerBuilderTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobSchedulerBuilderTests.cs index b7910fd73..6431bf2dd 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobSchedulerBuilderTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Core.Tests/JobSchedulerBuilderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using StellaOps.Concelier.Core.Jobs; @@ -49,7 +49,6 @@ public sealed class JobSchedulerBuilderTests builder.AddJob(kind: "jobs:defaults"); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var options = provider.GetRequiredService>().Value; Assert.True(options.Definitions.TryGetValue("jobs:defaults", out var definition)); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs index c5876f268..4e0b86337 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading.Tasks; using System.Collections.Immutable; @@ -44,7 +44,6 @@ public sealed class JsonExporterDependencyInjectionRoutineTests routine.Register(services, configuration); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var optionsAccessor = provider.GetRequiredService>(); var options = optionsAccessor.Value; diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonFeedExporterTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonFeedExporterTests.cs index ab243a96c..e9990a71f 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonFeedExporterTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Exporter.Json.Tests/JsonFeedExporterTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Globalization; @@ -433,7 +433,6 @@ public sealed class JsonFeedExporterTests : IDisposable private static string WriteSigningKey(string directory) { using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); -using StellaOps.TestKit; var pkcs8 = ecdsa.ExportPkcs8PrivateKey(); var pem = BuildPem("PRIVATE KEY", pkcs8); var path = Path.Combine(directory, $"mirror-key-{Guid.NewGuid():N}.pem"); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs index 13823c9e6..ba98fa491 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -1198,7 +1198,6 @@ public sealed class TrivyDbFeedExporterTests : IDisposable var archivePath = Path.Combine(workingDirectory, "db.tar.gz"); File.WriteAllBytes(archivePath, _payload); using var sha256 = SHA256.Create(); -using StellaOps.TestKit; var digest = "sha256:" + Convert.ToHexString(sha256.ComputeHash(_payload)).ToLowerInvariant(); return Task.FromResult(new TrivyDbBuilderResult( diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Merge.Tests/AdvisoryPrecedenceMergerTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Merge.Tests/AdvisoryPrecedenceMergerTests.cs index 7f92ff59b..1a4809a60 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Merge.Tests/AdvisoryPrecedenceMergerTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Merge.Tests/AdvisoryPrecedenceMergerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using FluentAssertions; @@ -498,7 +498,6 @@ public sealed class AdvisoryPrecedenceMergerTests var logger = new TestLogger(); using var metrics = new MetricCollector("StellaOps.Concelier.Merge"); -using StellaOps.TestKit; var merger = new AdvisoryPrecedenceMerger( new AffectedPackagePrecedenceResolver(), options, diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/CanonicalJsonSerializerTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/CanonicalJsonSerializerTests.cs index 1dbacb7c3..00bb619a3 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/CanonicalJsonSerializerTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/CanonicalJsonSerializerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -130,7 +130,6 @@ public sealed class CanonicalJsonSerializerTests var json = CanonicalJsonSerializer.Serialize(advisory); using var document = JsonDocument.Parse(json); -using StellaOps.TestKit; var rangeElement = document.RootElement .GetProperty("affectedPackages")[0] .GetProperty("versionRanges")[0]; diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/ghsa-semver.actual.json b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/ghsa-semver.actual.json new file mode 100644 index 000000000..e20a6a821 --- /dev/null +++ b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/ghsa-semver.actual.json @@ -0,0 +1,128 @@ +{ + "advisoryKey": "GHSA-aaaa-bbbb-cccc", + "affectedPackages": [ + { + "type": "semver", + "identifier": "pkg:npm/example-widget", + "platform": null, + "versionRanges": [ + { + "fixedVersion": "2.5.1", + "introducedVersion": null, + "lastAffectedVersion": null, + "primitives": null, + "provenance": { + "source": "ghsa", + "kind": "map", + "value": "ghsa-aaaa-bbbb-cccc", + "decisionReason": null, + "recordedAt": "2024-03-05T10:00:00+00:00", + "fieldMask": [] + }, + "rangeExpression": ">=0.0.0 <2.5.1", + "rangeKind": "semver" + }, + { + "fixedVersion": "3.2.4", + "introducedVersion": "3.0.0", + "lastAffectedVersion": null, + "primitives": null, + "provenance": { + "source": "ghsa", + "kind": "map", + "value": "ghsa-aaaa-bbbb-cccc", + "decisionReason": null, + "recordedAt": "2024-03-05T10:00:00+00:00", + "fieldMask": [] + }, + "rangeExpression": null, + "rangeKind": "semver" + } + ], + "normalizedVersions": [], + "statuses": [], + "provenance": [ + { + "source": "ghsa", + "kind": "map", + "value": "ghsa-aaaa-bbbb-cccc", + "decisionReason": null, + "recordedAt": "2024-03-05T10:00:00+00:00", + "fieldMask": [] + } + ] + } + ], + "aliases": [ + "CVE-2024-2222", + "GHSA-aaaa-bbbb-cccc" + ], + "canonicalMetricId": null, + "credits": [], + "cvssMetrics": [ + { + "baseScore": 8.8, + "baseSeverity": "high", + "provenance": { + "source": "ghsa", + "kind": "map", + "value": "ghsa-aaaa-bbbb-cccc", + "decisionReason": null, + "recordedAt": "2024-03-05T10:00:00+00:00", + "fieldMask": [] + }, + "vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H", + "version": "3.1" + } + ], + "cwes": [], + "description": null, + "exploitKnown": false, + "language": "en", + "mergeHash": null, + "modified": "2024-03-04T12:00:00+00:00", + "provenance": [ + { + "source": "ghsa", + "kind": "map", + "value": "ghsa-aaaa-bbbb-cccc", + "decisionReason": null, + "recordedAt": "2024-03-05T10:00:00+00:00", + "fieldMask": [] + } + ], + "published": "2024-03-04T00:00:00+00:00", + "references": [ + { + "kind": "patch", + "provenance": { + "source": "ghsa", + "kind": "map", + "value": "ghsa-aaaa-bbbb-cccc", + "decisionReason": null, + "recordedAt": "2024-03-05T10:00:00+00:00", + "fieldMask": [] + }, + "sourceTag": "ghsa", + "summary": "Patch commit", + "url": "https://github.com/example/widget/commit/abcd1234" + }, + { + "kind": "advisory", + "provenance": { + "source": "ghsa", + "kind": "map", + "value": "ghsa-aaaa-bbbb-cccc", + "decisionReason": null, + "recordedAt": "2024-03-05T10:00:00+00:00", + "fieldMask": [] + }, + "sourceTag": "ghsa", + "summary": "GitHub Security Advisory", + "url": "https://github.com/example/widget/security/advisories/GHSA-aaaa-bbbb-cccc" + } + ], + "severity": "high", + "summary": "A crafted payload can pollute Object.prototype leading to RCE.", + "title": "Prototype pollution in widget.js" +} \ No newline at end of file diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/kev-flag.actual.json b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/kev-flag.actual.json new file mode 100644 index 000000000..beed735fe --- /dev/null +++ b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/kev-flag.actual.json @@ -0,0 +1,46 @@ +{ + "advisoryKey": "CVE-2023-9999", + "affectedPackages": [], + "aliases": [ + "CVE-2023-9999" + ], + "canonicalMetricId": null, + "credits": [], + "cvssMetrics": [], + "cwes": [], + "description": null, + "exploitKnown": true, + "language": "en", + "mergeHash": null, + "modified": "2024-02-09T16:22:00+00:00", + "provenance": [ + { + "source": "cisa-kev", + "kind": "annotate", + "value": "kev", + "decisionReason": null, + "recordedAt": "2024-02-10T09:30:00+00:00", + "fieldMask": [] + } + ], + "published": "2023-11-20T00:00:00+00:00", + "references": [ + { + "kind": "kev", + "provenance": { + "source": "cisa-kev", + "kind": "annotate", + "value": "kev", + "decisionReason": null, + "recordedAt": "2024-02-10T09:30:00+00:00", + "fieldMask": [] + }, + "sourceTag": "cisa", + "summary": "CISA KEV entry", + "url": "https://www.cisa.gov/known-exploited-vulnerabilities-catalog" + } + ], + "severity": "critical", + "summary": "Unauthenticated RCE due to unsafe deserialization.", + "title": "Remote code execution in LegacyServer" +} \ No newline at end of file diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/nvd-basic.actual.json b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/nvd-basic.actual.json new file mode 100644 index 000000000..87b2e892f --- /dev/null +++ b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/nvd-basic.actual.json @@ -0,0 +1,123 @@ +{ + "advisoryKey": "CVE-2024-1234", + "affectedPackages": [ + { + "type": "cpe", + "identifier": "cpe:/a:examplecms:examplecms:1.0", + "platform": null, + "versionRanges": [ + { + "fixedVersion": "1.0.5", + "introducedVersion": "1.0", + "lastAffectedVersion": null, + "primitives": null, + "provenance": { + "source": "nvd", + "kind": "map", + "value": "cve-2024-1234", + "decisionReason": null, + "recordedAt": "2024-08-01T12:00:00+00:00", + "fieldMask": [] + }, + "rangeExpression": null, + "rangeKind": "version" + } + ], + "normalizedVersions": [], + "statuses": [ + { + "provenance": { + "source": "nvd", + "kind": "map", + "value": "cve-2024-1234", + "decisionReason": null, + "recordedAt": "2024-08-01T12:00:00+00:00", + "fieldMask": [] + }, + "status": "affected" + } + ], + "provenance": [ + { + "source": "nvd", + "kind": "map", + "value": "cve-2024-1234", + "decisionReason": null, + "recordedAt": "2024-08-01T12:00:00+00:00", + "fieldMask": [] + } + ] + } + ], + "aliases": [ + "CVE-2024-1234" + ], + "canonicalMetricId": null, + "credits": [], + "cvssMetrics": [ + { + "baseScore": 9.8, + "baseSeverity": "critical", + "provenance": { + "source": "nvd", + "kind": "map", + "value": "cve-2024-1234", + "decisionReason": null, + "recordedAt": "2024-08-01T12:00:00+00:00", + "fieldMask": [] + }, + "vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "version": "3.1" + } + ], + "cwes": [], + "description": null, + "exploitKnown": false, + "language": "en", + "mergeHash": null, + "modified": "2024-07-16T10:35:00+00:00", + "provenance": [ + { + "source": "nvd", + "kind": "map", + "value": "cve-2024-1234", + "decisionReason": null, + "recordedAt": "2024-08-01T12:00:00+00:00", + "fieldMask": [] + } + ], + "published": "2024-07-15T00:00:00+00:00", + "references": [ + { + "kind": "advisory", + "provenance": { + "source": "example", + "kind": "fetch", + "value": "bulletin", + "decisionReason": null, + "recordedAt": "2024-07-14T15:00:00+00:00", + "fieldMask": [] + }, + "sourceTag": "vendor", + "summary": "Vendor bulletin", + "url": "https://example.org/security/CVE-2024-1234" + }, + { + "kind": "advisory", + "provenance": { + "source": "nvd", + "kind": "map", + "value": "cve-2024-1234", + "decisionReason": null, + "recordedAt": "2024-08-01T12:00:00+00:00", + "fieldMask": [] + }, + "sourceTag": "nvd", + "summary": "NVD entry", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2024-1234" + } + ], + "severity": "high", + "summary": "An integer overflow in ExampleCMS allows remote attackers to escalate privileges.", + "title": "Integer overflow in ExampleCMS" +} \ No newline at end of file diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/psirt-overlay.actual.json b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/psirt-overlay.actual.json new file mode 100644 index 000000000..4fae0a21c --- /dev/null +++ b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/Fixtures/psirt-overlay.actual.json @@ -0,0 +1,126 @@ +{ + "advisoryKey": "RHSA-2024:0252", + "affectedPackages": [ + { + "type": "rpm", + "identifier": "kernel-0:4.18.0-553.el8.x86_64", + "platform": "rhel-8", + "versionRanges": [ + { + "fixedVersion": null, + "introducedVersion": "0:4.18.0-553.el8", + "lastAffectedVersion": null, + "primitives": null, + "provenance": { + "source": "redhat", + "kind": "map", + "value": "rhsa-2024:0252", + "decisionReason": null, + "recordedAt": "2024-05-11T09:00:00+00:00", + "fieldMask": [] + }, + "rangeExpression": null, + "rangeKind": "nevra" + } + ], + "normalizedVersions": [], + "statuses": [ + { + "provenance": { + "source": "redhat", + "kind": "map", + "value": "rhsa-2024:0252", + "decisionReason": null, + "recordedAt": "2024-05-11T09:00:00+00:00", + "fieldMask": [] + }, + "status": "fixed" + } + ], + "provenance": [ + { + "source": "redhat", + "kind": "enrich", + "value": "cve-2024-5678", + "decisionReason": null, + "recordedAt": "2024-05-11T09:05:00+00:00", + "fieldMask": [] + }, + { + "source": "redhat", + "kind": "map", + "value": "rhsa-2024:0252", + "decisionReason": null, + "recordedAt": "2024-05-11T09:00:00+00:00", + "fieldMask": [] + } + ] + } + ], + "aliases": [ + "CVE-2024-5678", + "RHSA-2024:0252" + ], + "canonicalMetricId": null, + "credits": [], + "cvssMetrics": [ + { + "baseScore": 6.7, + "baseSeverity": "medium", + "provenance": { + "source": "redhat", + "kind": "map", + "value": "rhsa-2024:0252", + "decisionReason": null, + "recordedAt": "2024-05-11T09:00:00+00:00", + "fieldMask": [] + }, + "vector": "CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H", + "version": "3.1" + } + ], + "cwes": [], + "description": null, + "exploitKnown": false, + "language": "en", + "mergeHash": null, + "modified": "2024-05-11T08:15:00+00:00", + "provenance": [ + { + "source": "redhat", + "kind": "enrich", + "value": "cve-2024-5678", + "decisionReason": null, + "recordedAt": "2024-05-11T09:05:00+00:00", + "fieldMask": [] + }, + { + "source": "redhat", + "kind": "map", + "value": "rhsa-2024:0252", + "decisionReason": null, + "recordedAt": "2024-05-11T09:00:00+00:00", + "fieldMask": [] + } + ], + "published": "2024-05-10T19:28:00+00:00", + "references": [ + { + "kind": "advisory", + "provenance": { + "source": "redhat", + "kind": "map", + "value": "rhsa-2024:0252", + "decisionReason": null, + "recordedAt": "2024-05-11T09:00:00+00:00", + "fieldMask": [] + }, + "sourceTag": "redhat", + "summary": "Red Hat security advisory", + "url": "https://access.redhat.com/errata/RHSA-2024:0252" + } + ], + "severity": "critical", + "summary": "Updates the Red Hat Enterprise Linux kernel to address CVE-2024-5678.", + "title": "Important: kernel security update" +} \ No newline at end of file diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/OsvGhsaParityDiagnosticsTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/OsvGhsaParityDiagnosticsTests.cs index 8c529b2a2..570ed5007 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/OsvGhsaParityDiagnosticsTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/OsvGhsaParityDiagnosticsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.Metrics; @@ -56,7 +56,6 @@ public sealed class OsvGhsaParityDiagnosticsTests var measurements = new List<(string Instrument, long Value, IReadOnlyDictionary Tags)>(); using var listener = CreateListener(measurements); -using StellaOps.TestKit; OsvGhsaParityDiagnostics.RecordReport(report, ""); listener.Dispose(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/ProvenanceDiagnosticsTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/ProvenanceDiagnosticsTests.cs index d08762663..66700f205 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/ProvenanceDiagnosticsTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.Models.Tests/ProvenanceDiagnosticsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Linq; @@ -114,7 +114,6 @@ public sealed class ProvenanceDiagnosticsTests var measurements = new List<(string Instrument, long Value, IReadOnlyDictionary Tags)>(); using var listener = CreateListener(measurements, "concelier.range.primitives"); -using StellaOps.TestKit; ProvenanceDiagnostics.RecordRangePrimitive("source-D", range); listener.Dispose(); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.SbomIntegration.Tests/SbomParserTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.SbomIntegration.Tests/SbomParserTests.cs index 79edb8277..c03111475 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.SbomIntegration.Tests/SbomParserTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.SbomIntegration.Tests/SbomParserTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // SbomParserTests.cs // Sprint: SPRINT_8200_0013_0003_SCAN_sbom_intersection_scoring // Task: SBOM-8200-007 @@ -508,7 +508,6 @@ public class SbomParserTests using var stream = new MemoryStream(Encoding.UTF8.GetBytes(content)); -using StellaOps.TestKit; // Act var result = await _parser.ParseAsync(stream, SbomFormat.CycloneDX); diff --git a/src/Concelier/__Tests/StellaOps.Concelier.WebService.Tests/ConcelierTimelineCursorTests.cs b/src/Concelier/__Tests/StellaOps.Concelier.WebService.Tests/ConcelierTimelineCursorTests.cs index caf852921..1b6bb6533 100644 --- a/src/Concelier/__Tests/StellaOps.Concelier.WebService.Tests/ConcelierTimelineCursorTests.cs +++ b/src/Concelier/__Tests/StellaOps.Concelier.WebService.Tests/ConcelierTimelineCursorTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Headers; using FluentAssertions; using Microsoft.AspNetCore.Mvc.Testing; @@ -25,7 +25,6 @@ public class ConcelierTimelineCursorTests : IClassFixture - + diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/DatabaseMigrationTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/DatabaseMigrationTests.cs index 62c477505..948736779 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/DatabaseMigrationTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/DatabaseMigrationTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using Docker.DotNet; using DotNet.Testcontainers.Builders; @@ -101,7 +101,6 @@ public sealed class DatabaseMigrationTests : IAsyncLifetime Assert.Equal(0, otherVisible); await using var violationConnection = await _dataSource.OpenConnectionAsync(tenant, cancellationToken); -using StellaOps.TestKit; await using var violationCommand = new NpgsqlCommand(@" INSERT INTO evidence_locker.evidence_bundles (bundle_id, tenant_id, kind, status, root_hash, storage_key) diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceBundlePackagingServiceTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceBundlePackagingServiceTests.cs index 073d96c5c..8f9540b99 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceBundlePackagingServiceTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceBundlePackagingServiceTests.cs @@ -1,4 +1,4 @@ -using System.Buffers.Binary; +using System.Buffers.Binary; using System.Formats.Tar; using System.IO.Compression; using System.Security.Cryptography; @@ -443,7 +443,6 @@ public sealed class EvidenceBundlePackagingServiceTests { Stored = true; using var memory = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(memory); StoredBytes = memory.ToArray(); diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerIntegrationTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerIntegrationTests.cs index 61ae664c2..611c9532d 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerIntegrationTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerIntegrationTests.cs @@ -1,8 +1,8 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // EvidenceLockerIntegrationTests.cs // Sprint: SPRINT_5100_0010_0001_evidencelocker_tests // Task: EVIDENCE-5100-007 -// Description: Integration test: store artifact → retrieve artifact → verify hash matches +// Description: Integration test: store artifact → retrieve artifact → verify hash matches // ----------------------------------------------------------------------------- using System.Net; @@ -20,7 +20,7 @@ namespace StellaOps.EvidenceLocker.Tests; /// /// Integration Tests for EvidenceLocker -/// Task EVIDENCE-5100-007: store artifact → retrieve artifact → verify hash matches +/// Task EVIDENCE-5100-007: store artifact → retrieve artifact → verify hash matches /// public sealed class EvidenceLockerIntegrationTests : IDisposable { @@ -34,7 +34,7 @@ public sealed class EvidenceLockerIntegrationTests : IDisposable _client = _factory.CreateClient(); } - #region EVIDENCE-5100-007: Store → Retrieve → Verify Hash + #region EVIDENCE-5100-007: Store → Retrieve → Verify Hash [Trait("Category", TestCategories.Unit)] [Fact] @@ -395,7 +395,6 @@ public sealed class EvidenceLockerIntegrationTests : IDisposable if (entry.DataStream is not null) { using var contentStream = new MemoryStream(); -using StellaOps.TestKit; entry.DataStream.CopyTo(contentStream); entries[entry.Name] = Encoding.UTF8.GetString(contentStream.ToArray()); } diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceContractTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceContractTests.cs index b9bfb2f62..ee1e92052 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceContractTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceContractTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // EvidenceLockerWebServiceContractTests.cs // Sprint: SPRINT_5100_0010_0001_evidencelocker_tests // Tasks: EVIDENCE-5100-004, EVIDENCE-5100-005, EVIDENCE-5100-006 @@ -99,7 +99,6 @@ public sealed class EvidenceLockerWebServiceContractTests : IDisposable var content = await response.Content.ReadAsStringAsync(TestContext.Current.CancellationToken); using var doc = JsonDocument.Parse(content); -using StellaOps.TestKit; var root = doc.RootElement; // Verify contract schema for retrieved bundle diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceTests.cs index 33be34dda..706fc5ba0 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceLockerWebServiceTests.cs @@ -1,4 +1,4 @@ -using System.Buffers.Binary; +using System.Buffers.Binary; using System.Collections.Generic; using System.Formats.Tar; using System.IO; @@ -347,7 +347,6 @@ public sealed class EvidenceLockerWebServiceTests } using var entryStream = new MemoryStream(); -using StellaOps.TestKit; entry.DataStream!.CopyTo(entryStream); var content = Encoding.UTF8.GetString(entryStream.ToArray()); entries[entry.Name] = content; diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidencePortableBundleServiceTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidencePortableBundleServiceTests.cs index c98b2635f..ad2b49c12 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidencePortableBundleServiceTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidencePortableBundleServiceTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; using System.Text.Json; @@ -337,7 +337,6 @@ public sealed class EvidencePortableBundleServiceTests { Stored = true; using var memory = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(memory); StoredBytes = memory.ToArray(); diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSignatureServiceTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSignatureServiceTests.cs index 5d30260c5..1add4144b 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSignatureServiceTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSignatureServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Security.Cryptography; @@ -200,7 +200,6 @@ public sealed class EvidenceSignatureServiceTests private static SigningKeyMaterialOptions CreateKeyMaterial() { using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); -using StellaOps.TestKit; var privatePem = ecdsa.ExportECPrivateKeyPem(); var publicPem = ecdsa.ExportSubjectPublicKeyInfoPem(); return new SigningKeyMaterialOptions diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSnapshotServiceTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSnapshotServiceTests.cs index 1966ab3c1..297d354d1 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSnapshotServiceTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/EvidenceSnapshotServiceTests.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.Serialization; using System.Security.Cryptography; using System.Linq; @@ -477,7 +477,6 @@ public sealed class EvidenceSnapshotServiceTests CancellationToken cancellationToken) { using var memory = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(memory); var bytes = memory.ToArray(); diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/FileSystemEvidenceObjectStoreTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/FileSystemEvidenceObjectStoreTests.cs index cb0babea9..44dffcd42 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/FileSystemEvidenceObjectStoreTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/FileSystemEvidenceObjectStoreTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using Microsoft.Extensions.Logging.Abstractions; using StellaOps.EvidenceLocker.Core.Configuration; using StellaOps.EvidenceLocker.Core.Domain; @@ -45,7 +45,6 @@ public sealed class FileSystemEvidenceObjectStoreTests : IDisposable var firstMetadata = await store.StoreAsync(first, options, cancellationToken); using var second = CreateStream("payload-1"); -using StellaOps.TestKit; var secondMetadata = await store.StoreAsync(second, options, cancellationToken); Assert.Equal(firstMetadata.Sha256, secondMetadata.Sha256); diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/GoldenFixturesTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/GoldenFixturesTests.cs index 92d4ae457..5ec1d3db5 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/GoldenFixturesTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/GoldenFixturesTests.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.Json; @@ -77,7 +77,6 @@ public sealed class GoldenFixturesTests private static JsonElement ReadJson(string path) { using var doc = JsonDocument.Parse(File.ReadAllText(path), new JsonDocumentOptions { AllowTrailingCommas = true }); -using StellaOps.TestKit; return doc.RootElement.Clone(); } } diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/S3EvidenceObjectStoreTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/S3EvidenceObjectStoreTests.cs index 0ed331fd6..0bd3669e6 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/S3EvidenceObjectStoreTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/S3EvidenceObjectStoreTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Text; using Amazon; @@ -116,7 +116,6 @@ public sealed class S3EvidenceObjectStoreTests var ifNoneMatch = request.Headers?["If-None-Match"]; using var memory = new MemoryStream(); -using StellaOps.TestKit; request.InputStream.CopyTo(memory); PutRequests.Add(new CapturedPutObjectRequest( diff --git a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/TimelineIndexerEvidenceTimelinePublisherTests.cs b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/TimelineIndexerEvidenceTimelinePublisherTests.cs index f3c1405b5..3d7176f35 100644 --- a/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/TimelineIndexerEvidenceTimelinePublisherTests.cs +++ b/src/EvidenceLocker/StellaOps.EvidenceLocker/StellaOps.EvidenceLocker.Tests/TimelineIndexerEvidenceTimelinePublisherTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Text.Json; @@ -125,7 +125,6 @@ public sealed class TimelineIndexerEvidenceTimelinePublisherTests Assert.Equal(HttpMethod.Post, request.Method); using var json = JsonDocument.Parse(request.Content!); -using StellaOps.TestKit; var root = json.RootElement; Assert.Equal("evidence.hold.created", root.GetProperty("kind").GetString()); Assert.Equal(hold.CaseId, root.GetProperty("attributes").GetProperty("caseId").GetString()); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.ArtifactStores.S3.Tests/S3ArtifactClientTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.ArtifactStores.S3.Tests/S3ArtifactClientTests.cs index a445f5961..62ca095db 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.ArtifactStores.S3.Tests/S3ArtifactClientTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.ArtifactStores.S3.Tests/S3ArtifactClientTests.cs @@ -1,4 +1,4 @@ -using Amazon.S3; +using Amazon.S3; using Amazon.S3.Model; using Moq; using StellaOps.Excititor.ArtifactStores.S3; @@ -35,7 +35,6 @@ public sealed class S3ArtifactClientTests var client = new S3ArtifactClient(mock.Object, Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance); using var stream = new MemoryStream(new byte[] { 1, 2, 3 }); -using StellaOps.TestKit; await client.PutObjectAsync("bucket", "key", stream, new Dictionary { ["a"] = "b" }, default); mock.Verify(x => x.PutObjectAsync(It.Is(r => r.Metadata["a"] == "b"), default), Times.Once); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyBinderTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyBinderTests.cs index f83c9c8d4..1f509fe72 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyBinderTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyBinderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text; using StellaOps.Excititor.Policy; @@ -92,7 +92,6 @@ public sealed class VexPolicyBinderTests public void Bind_Stream_SupportsEncoding() { using var stream = new MemoryStream(Encoding.UTF8.GetBytes(JsonPolicy)); -using StellaOps.TestKit; var result = VexPolicyBinder.Bind(stream, VexPolicyDocumentFormat.Json); Assert.True(result.Success); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyDiagnosticsTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyDiagnosticsTests.cs index 119e80521..7799f9ca4 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyDiagnosticsTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Core.Tests/VexPolicyDiagnosticsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -79,7 +79,6 @@ public class VexPolicyDiagnosticsTests public void PolicyProvider_ComputesRevisionAndDigest_AndEmitsTelemetry() { using var listener = new MeterListener(); -using StellaOps.TestKit; var reloadMeasurements = 0; string? lastRevision = null; listener.InstrumentPublished += (instrument, _) => diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/MirrorBundlePublisherTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/MirrorBundlePublisherTests.cs index 720919499..59ddd42f6 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/MirrorBundlePublisherTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/MirrorBundlePublisherTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -289,7 +289,6 @@ public sealed class MirrorBundlePublisherTests private static string ComputeSha256(byte[] bytes) { using var sha = SHA256.Create(); -using StellaOps.TestKit; var digest = sha.ComputeHash(bytes); return "sha256:" + Convert.ToHexString(digest).ToLowerInvariant(); } diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/OfflineBundleArtifactStoreTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/OfflineBundleArtifactStoreTests.cs index f0d0f3d74..e2570db19 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/OfflineBundleArtifactStoreTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/OfflineBundleArtifactStoreTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.IO.Abstractions.TestingHelpers; using System.Linq; using System.Text.Json; @@ -38,7 +38,6 @@ public sealed class OfflineBundleArtifactStoreTests Assert.True(fs.FileExists(manifestPath)); await using var manifestStream = fs.File.OpenRead(manifestPath); using var document = await JsonDocument.ParseAsync(manifestStream); -using StellaOps.TestKit; var artifacts = document.RootElement.GetProperty("artifacts"); Assert.True(artifacts.GetArrayLength() >= 1); var first = artifacts.EnumerateArray().First(); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/S3ArtifactStoreTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/S3ArtifactStoreTests.cs index f76ec86cf..2eeb8aa7e 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/S3ArtifactStoreTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Export.Tests/S3ArtifactStoreTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Collections.Immutable; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -71,7 +71,6 @@ public sealed class S3ArtifactStoreTests public Task PutObjectAsync(string bucketName, string key, Stream content, IDictionary metadata, CancellationToken cancellationToken) { using var ms = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(ms); var bytes = ms.ToArray(); PutCalls.GetOrAdd(bucketName, _ => new List()).Add(new S3Entry(key, bytes, new Dictionary(metadata))); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Formats.CSAF.Tests/CsafExporterTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Formats.CSAF.Tests/CsafExporterTests.cs index ce36e2f68..c3691707a 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Formats.CSAF.Tests/CsafExporterTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Formats.CSAF.Tests/CsafExporterTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Text.Json; using FluentAssertions; using StellaOps.Excititor.Core; @@ -60,7 +60,6 @@ public sealed class CsafExporterTests stream.Position = 0; using var document = JsonDocument.Parse(stream); -using StellaOps.TestKit; var root = document.RootElement; root.GetProperty("document").GetProperty("tracking").GetProperty("id").GetString()!.Should().StartWith("stellaops:csaf"); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Formats.CycloneDX.Tests/CycloneDxExporterTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Formats.CycloneDX.Tests/CycloneDxExporterTests.cs index 59da3fc3f..7ff44bad4 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Formats.CycloneDX.Tests/CycloneDxExporterTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Formats.CycloneDX.Tests/CycloneDxExporterTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Linq; using System.Text.Json; using FluentAssertions; @@ -44,7 +44,6 @@ public sealed class CycloneDxExporterTests stream.Position = 0; using var document = JsonDocument.Parse(stream); -using StellaOps.TestKit; var root = document.RootElement; root.GetProperty("bomFormat").GetString().Should().Be("CycloneDX"); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Formats.OpenVEX.Tests/OpenVexExporterTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Formats.OpenVEX.Tests/OpenVexExporterTests.cs index 04a977caa..d58ab1780 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Formats.OpenVEX.Tests/OpenVexExporterTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Formats.OpenVEX.Tests/OpenVexExporterTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Text.Json; using FluentAssertions; using StellaOps.Excititor.Core; @@ -38,7 +38,6 @@ public sealed class OpenVexExporterTests stream.Position = 0; using var document = JsonDocument.Parse(stream); -using StellaOps.TestKit; var root = document.RootElement; root.GetProperty("document").GetProperty("author").GetString().Should().Be("StellaOps Excititor"); root.GetProperty("statements").GetArrayLength().Should().Be(1); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Storage.Postgres.Tests/PostgresAppendOnlyLinksetStoreTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Storage.Postgres.Tests/PostgresAppendOnlyLinksetStoreTests.cs index c69ae87d8..a5a639c7c 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Storage.Postgres.Tests/PostgresAppendOnlyLinksetStoreTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Storage.Postgres.Tests/PostgresAppendOnlyLinksetStoreTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.Excititor.Core.Observations; @@ -50,7 +50,6 @@ public sealed class PostgresAppendOnlyLinksetStoreTests : IAsyncLifetime if (stream is not null) { using var reader = new StreamReader(stream); -using StellaOps.TestKit; var sql = await reader.ReadToEndAsync(); await _fixture.Fixture.ExecuteSqlAsync(sql); } diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapImportEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapImportEndpointTests.cs index 045b02f56..ba3b27531 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapImportEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapImportEndpointTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Headers; using System.Net.Http.Json; using Microsoft.AspNetCore.Mvc.Testing; @@ -107,7 +107,6 @@ public class AirgapImportEndpointTests }); using var client = factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); -using StellaOps.TestKit; client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "vex.admin"); var request = new AirgapImportRequest diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapSignerTrustServiceTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapSignerTrustServiceTests.cs index ed965172d..5b35b597e 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapSignerTrustServiceTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AirgapSignerTrustServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Immutable; using Microsoft.Extensions.Logging.Abstractions; using StellaOps.Excititor.Connectors.Abstractions.Trust; @@ -64,7 +64,6 @@ public class AirgapSignerTrustServiceTests public void Validate_Allows_On_Metadata_Match() { using var temp = ConnectorMetadataTempFile(); -using StellaOps.TestKit; Environment.SetEnvironmentVariable("STELLAOPS_CONNECTOR_SIGNER_METADATA_PATH", temp.Path); var service = new AirgapSignerTrustService(NullLogger.Instance); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AttestationVerifyEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AttestationVerifyEndpointTests.cs index a36d6df4a..8d04cc117 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AttestationVerifyEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/AttestationVerifyEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using System.Net.Http.Json; @@ -65,7 +65,6 @@ public sealed class AttestationVerifyEndpointTests { using var factory = new TestWebApplicationFactory( configureServices: services => TestServiceOverrides.Apply(services)); -using StellaOps.TestKit; var client = factory.CreateClient(); var request = new AttestationVerifyRequest diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceLockerEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceLockerEndpointTests.cs index 9bd62537f..77f2d81e8 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceLockerEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceLockerEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net; using System.Net.Http.Json; @@ -99,7 +99,6 @@ public sealed class EvidenceLockerEndpointTests : IAsyncLifetime await _stubStore.SaveAsync(record, CancellationToken.None); using var client = _factory.WithWebHostBuilder(_ => { }).CreateClient(); -using StellaOps.TestKit; client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "vex.read"); var response = await client.GetAsync($"/evidence/vex/locker/{record.BundleId}/manifest/file"); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceTelemetryTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceTelemetryTests.cs index 290635462..bccdc087b 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceTelemetryTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/EvidenceTelemetryTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Linq; @@ -43,7 +43,6 @@ public sealed class EvidenceTelemetryTests using var listener = CreateListener((instrument, value, tags) => { measurements.Add((instrument.Name, value, tags.ToArray())); -using StellaOps.TestKit; }); var now = DateTimeOffset.UtcNow; diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/IngestEndpointsTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/IngestEndpointsTests.cs index 56d6edbe2..bc9c79562 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/IngestEndpointsTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/IngestEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.IO; using System.Security.Claims; using System.Text.Json; @@ -202,7 +202,6 @@ public sealed class IngestEndpointsTests Assert.Equal(TimeSpan.FromDays(2), _orchestrator.LastReconcileOptions?.MaxAge); using var document = JsonDocument.Parse(JsonSerializer.Serialize(ok.Value)); -using StellaOps.TestKit; Assert.Equal("reconciled", document.RootElement.GetProperty("providers")[0].GetProperty("action").GetString()); } diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/MirrorEndpointsTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/MirrorEndpointsTests.cs index bc246495c..ccd9a53ba 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/MirrorEndpointsTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/MirrorEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Collections.Immutable; using System.Net; using System.Net.Http.Json; @@ -79,7 +79,6 @@ public sealed class MirrorEndpointsTests : IDisposable response.EnsureSuccessStatusCode(); using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync()); -using StellaOps.TestKit; var exports = document.RootElement.GetProperty("exports"); Assert.Equal(1, exports.GetArrayLength()); var entry = exports[0]; diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ObservabilityEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ObservabilityEndpointTests.cs index 27e83e1e4..5f0acd077 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ObservabilityEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ObservabilityEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -90,7 +90,6 @@ public sealed class ObservabilityEndpointTests : IDisposable private void SeedDatabase() { using var scope = _factory.Services.CreateScope(); -using StellaOps.TestKit; var rawStore = scope.ServiceProvider.GetRequiredService(); var linksetStore = scope.ServiceProvider.GetRequiredService(); var providerStore = scope.ServiceProvider.GetRequiredService(); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/PolicyEndpointsTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/PolicyEndpointsTests.cs index 9b04ef4c2..f9967987d 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/PolicyEndpointsTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/PolicyEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Net.Http.Json; +using System.Net.Http.Json; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using StellaOps.Excititor.Core; @@ -27,7 +27,6 @@ public sealed class PolicyEndpointsTests }); using var client = factory.CreateClient(new() { AllowAutoRedirect = false }); -using StellaOps.TestKit; client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "vex.read"); client.DefaultRequestHeaders.Add("X-Stella-Tenant", "test"); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ResolveEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ResolveEndpointTests.cs index 663af5157..02a680e74 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ResolveEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/ResolveEndpointTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Immutable; using System.Net; using System.Net.Http.Headers; @@ -157,7 +157,6 @@ public sealed class ResolveEndpointTests : IDisposable private async Task SeedClaimAsync(string vulnerabilityId, string productKey, string providerId) { await using var scope = _factory.Services.CreateAsyncScope(); -using StellaOps.TestKit; var store = scope.ServiceProvider.GetRequiredService(); var timeProvider = scope.ServiceProvider.GetRequiredService(); var observedAt = timeProvider.GetUtcNow(); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/RiskFeedEndpointsTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/RiskFeedEndpointsTests.cs index 26ef9b36b..a59907950 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/RiskFeedEndpointsTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/RiskFeedEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Net; using System.Net.Http.Json; using Microsoft.Extensions.DependencyInjection; @@ -141,7 +141,6 @@ public sealed class RiskFeedEndpointsTests }); using var client = factory.CreateClient(new() { AllowAutoRedirect = false }); -using StellaOps.TestKit; client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "vex.read"); client.DefaultRequestHeaders.Add("X-Stella-Tenant", TestTenant); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexAttestationLinkEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexAttestationLinkEndpointTests.cs index c2191a1dc..fb4d3c4eb 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexAttestationLinkEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexAttestationLinkEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net.Http.Headers; using System.Net.Http.Json; @@ -38,7 +38,6 @@ public sealed class VexAttestationLinkEndpointTests : IDisposable public async Task GetAttestationLink_ReturnsServiceUnavailable() { using var client = _factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); -using StellaOps.TestKit; client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "vex.read"); var response = await client.GetAsync("/v1/vex/attestations/att-123"); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexEvidenceChunksEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexEvidenceChunksEndpointTests.cs index daa541bc4..55d7ed757 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexEvidenceChunksEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexEvidenceChunksEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -57,7 +57,6 @@ public sealed class VexEvidenceChunksEndpointTests : IDisposable public async Task ChunksEndpoint_ReportsMigrationStatusHeaders() { using var client = _factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); -using StellaOps.TestKit; client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "vex.read"); client.DefaultRequestHeaders.Add("X-Stella-Tenant", "tests"); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexGuardSchemaTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexGuardSchemaTests.cs index 2e5db3262..2ce15a5b8 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexGuardSchemaTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexGuardSchemaTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using System.Text.Json.Nodes; @@ -79,7 +79,6 @@ public sealed class VexGuardSchemaTests var node = JsonNode.Parse(json)!.AsObject(); mutate?.Invoke(node); using var document = JsonDocument.Parse(node.ToJsonString()); -using StellaOps.TestKit; return Guard.Validate(document.RootElement); } diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexLinksetListEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexLinksetListEndpointTests.cs index f21fb5ad4..e6cce3d1c 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexLinksetListEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexLinksetListEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -71,7 +71,6 @@ public sealed class VexLinksetListEndpointTests : IDisposable private void SeedObservations() { using var scope = _factory.Services.CreateScope(); -using StellaOps.TestKit; var store = scope.ServiceProvider.GetRequiredService(); var scopeMetadata = new VexProductScope( diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexObservationListEndpointTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexObservationListEndpointTests.cs index 3cb2be50b..066baa759 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexObservationListEndpointTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexObservationListEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -67,7 +67,6 @@ public sealed class VexObservationListEndpointTests : IDisposable private void SeedObservation() { using var scope = _factory.Services.CreateScope(); -using StellaOps.TestKit; var store = scope.ServiceProvider.GetRequiredService(); var now = DateTimeOffset.Parse("2025-12-01T00:00:00Z"); diff --git a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexRawEndpointsTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexRawEndpointsTests.cs index 301d794c3..75ba18e07 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexRawEndpointsTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/VexRawEndpointsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net.Http.Headers; using System.Net.Http.Json; @@ -76,7 +76,6 @@ public sealed class VexRawEndpointsTests private static VexIngestRequest BuildVexIngestRequest() { using var contentDocument = JsonDocument.Parse("{\"vex\":\"payload\"}"); -using StellaOps.TestKit; return new VexIngestRequest( ProviderId: "excititor:test", Source: new VexIngestSourceRequest("vendor:test", "connector:test", "1.0.0", "csaf"), diff --git a/src/Excititor/__Tests/StellaOps.Excititor.Worker.Tests/TenantAuthorityClientFactoryTests.cs b/src/Excititor/__Tests/StellaOps.Excititor.Worker.Tests/TenantAuthorityClientFactoryTests.cs index 7bf225038..642a26c8c 100644 --- a/src/Excititor/__Tests/StellaOps.Excititor.Worker.Tests/TenantAuthorityClientFactoryTests.cs +++ b/src/Excititor/__Tests/StellaOps.Excititor.Worker.Tests/TenantAuthorityClientFactoryTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http.Headers; using FluentAssertions; using Microsoft.Extensions.Options; @@ -22,7 +22,6 @@ public sealed class TenantAuthorityClientFactoryTests using var client = factory.Create("tenant-a"); -using StellaOps.TestKit; client.BaseAddress.Should().Be(new Uri("https://authority.example/")); client.DefaultRequestHeaders.TryGetValues("X-Tenant", out var values).Should().BeTrue(); values.Should().ContainSingle().Which.Should().Be("tenant-a"); diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportCenterClientTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportCenterClientTests.cs index b08bc0df2..9420b3b5f 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportCenterClientTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportCenterClientTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text; using System.Text.Json; @@ -196,7 +196,6 @@ public sealed class ExportCenterClientTests Assert.NotNull(stream); using var ms = new MemoryStream(); -using StellaOps.TestKit; await stream.CopyToAsync(ms); Assert.Equal(bundleContent, ms.ToArray()); } diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportDownloadHelperTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportDownloadHelperTests.cs index 7f1814c84..06a0d4ca9 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportDownloadHelperTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Client.Tests/ExportDownloadHelperTests.cs @@ -1,4 +1,4 @@ -using StellaOps.ExportCenter.Client.Streaming; +using StellaOps.ExportCenter.Client.Streaming; using Xunit; @@ -130,7 +130,6 @@ public sealed class ExportDownloadHelperTests : IDisposable using var source = new MemoryStream(content); using var destination = new MemoryStream(); -using StellaOps.TestKit; var bytesCopied = await ExportDownloadHelper.CopyWithProgressAsync(source, destination); Assert.Equal(content.Length, bytesCopied); diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/AttestationBundleBuilderTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/AttestationBundleBuilderTests.cs index 4f50daaed..4cc6f5789 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/AttestationBundleBuilderTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/AttestationBundleBuilderTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; using System.Text.Json; @@ -549,7 +549,6 @@ internal sealed class FakeCryptoHash : StellaOps.Cryptography.ICryptoHash public ValueTask ComputeHashAsync(Stream stream, string? algorithmId = null, CancellationToken cancellationToken = default) { using var sha256 = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; var hash = sha256.ComputeHash(stream); return new ValueTask(hash); } diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BootstrapPackBuilderTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BootstrapPackBuilderTests.cs index de4bd1668..fc715845b 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BootstrapPackBuilderTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BootstrapPackBuilderTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; using System.Text.Json; @@ -349,7 +349,6 @@ public sealed class BootstrapPackBuilderTests : IDisposable using var gzip = new GZipStream(packStream, CompressionMode.Decompress, leaveOpen: true); using var tar = new TarReader(gzip, leaveOpen: true); -using StellaOps.TestKit; TarEntry? entry; while ((entry = tar.GetNextEntry()) is not null) { diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BundleEncryptionServiceTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BundleEncryptionServiceTests.cs index e4ed65dd9..91a470d24 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BundleEncryptionServiceTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/BundleEncryptionServiceTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Logging.Abstractions; using StellaOps.Cryptography; using StellaOps.ExportCenter.Core.Encryption; using Xunit; @@ -554,7 +554,6 @@ public class BundleEncryptionServiceTests : IDisposable public ValueTask ComputeHashAsync(Stream stream, string? algorithmId = null, CancellationToken cancellationToken = default) { using var sha256 = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; var hash = sha256.ComputeHash(stream); return new ValueTask(hash); } diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineBundleBuilderTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineBundleBuilderTests.cs index b4a5745a3..200a91ba3 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineBundleBuilderTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineBundleBuilderTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Security.Cryptography; using System.Text; @@ -207,7 +207,6 @@ public sealed class DevPortalOfflineBundleBuilderTests } using var memory = new MemoryStream(); -using StellaOps.TestKit; entry.DataStream.CopyTo(memory); result[entry.Name] = memory.ToArray(); } diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineJobTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineJobTests.cs index 10f4d8d75..7756d512b 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineJobTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/DevPortalOfflineJobTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; @@ -133,7 +133,6 @@ public class DevPortalOfflineJobTests CancellationToken cancellationToken) { using var memory = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(memory); var bytes = memory.ToArray(); content.Seek(0, SeekOrigin.Begin); diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/HmacDevPortalOfflineManifestSignerTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/HmacDevPortalOfflineManifestSignerTests.cs index f36d28301..427b0423d 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/HmacDevPortalOfflineManifestSignerTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/HmacDevPortalOfflineManifestSignerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Buffers.Binary; using System.Security.Cryptography; using System.Threading; @@ -83,7 +83,6 @@ public class HmacDevPortalOfflineManifestSignerTests var secret = Convert.FromBase64String(options.Secret); using var hmac = new HMACSHA256(secret); -using StellaOps.TestKit; var signature = hmac.ComputeHash(pae); return Convert.ToBase64String(signature); } diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleBuilderTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleBuilderTests.cs index ea85cd650..8700b7814 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleBuilderTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleBuilderTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; using System.Text.Json; @@ -387,7 +387,6 @@ public sealed class MirrorBundleBuilderTests : IDisposable using var gzip = new GZipStream(bundleStream, CompressionMode.Decompress, leaveOpen: true); using var tar = new TarReader(gzip, leaveOpen: true); -using StellaOps.TestKit; TarEntry? entry; while ((entry = tar.GetNextEntry()) is not null) { diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleSigningTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleSigningTests.cs index 7a9d6b90d..e79716962 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleSigningTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorBundleSigningTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Text.Json; using StellaOps.Cryptography; using StellaOps.ExportCenter.Core.MirrorBundle; @@ -161,7 +161,6 @@ public sealed class MirrorBundleSigningTests { using var nonSeekable = new NonSeekableMemoryStream(Encoding.UTF8.GetBytes("test")); -using StellaOps.TestKit; await Assert.ThrowsAsync(() => _signer.SignArchiveAsync(nonSeekable)); } diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorDeltaAdapterTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorDeltaAdapterTests.cs index 5d0426a7e..53b283e08 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorDeltaAdapterTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/MirrorDeltaAdapterTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Logging.Abstractions; using StellaOps.Cryptography; using StellaOps.ExportCenter.Core.Adapters; using StellaOps.ExportCenter.Core.MirrorBundle; @@ -402,7 +402,6 @@ public class MirrorDeltaAdapterTests : IDisposable public ValueTask ComputeHashAsync(Stream stream, string? algorithmId = null, CancellationToken cancellationToken = default) { using var sha256 = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; var hash = sha256.ComputeHash(stream); return new ValueTask(hash); } diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/PortableEvidenceExportBuilderTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/PortableEvidenceExportBuilderTests.cs index 397f2328a..316d2f9fa 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/PortableEvidenceExportBuilderTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/PortableEvidenceExportBuilderTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; using System.Text.Json; @@ -374,7 +374,6 @@ public sealed class PortableEvidenceExportBuilderTests : IDisposable using var gzip = new GZipStream(exportStream, CompressionMode.Decompress, leaveOpen: true); using var tar = new TarReader(gzip, leaveOpen: true); -using StellaOps.TestKit; TarEntry? entry; while ((entry = tar.GetNextEntry()) is not null) { diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleBuilderTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleBuilderTests.cs index 903cc0bfe..1bfef9055 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleBuilderTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleBuilderTests.cs @@ -1,4 +1,4 @@ -using System.IO.Compression; +using System.IO.Compression; using StellaOps.ExportCenter.RiskBundles; @@ -58,7 +58,6 @@ public sealed class RiskBundleBuilderTests public void Build_WhenMandatoryProviderMissing_Throws() { using var temp = new TempDir(); -using StellaOps.TestKit; var epss = temp.WriteFile("epss.csv", "cve,score\n"); var request = new RiskBundleBuildRequest( diff --git a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleJobTests.cs b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleJobTests.cs index e38996e76..3e9d06043 100644 --- a/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleJobTests.cs +++ b/src/ExportCenter/StellaOps.ExportCenter/StellaOps.ExportCenter.Tests/RiskBundleJobTests.cs @@ -1,4 +1,4 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; using System.Text.Json; @@ -66,7 +66,6 @@ public sealed class RiskBundleJobTests public Task StoreAsync(RiskBundleObjectStoreOptions options, Stream content, CancellationToken cancellationToken = default) { using var ms = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(ms); _store[options.StorageKey] = ms.ToArray(); return Task.FromResult(new RiskBundleStorageMetadata(options.StorageKey, ms.Length, options.ContentType)); diff --git a/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerIntegrationTests.cs b/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerIntegrationTests.cs index 2ff729ba5..70242a3eb 100644 --- a/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerIntegrationTests.cs +++ b/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerIntegrationTests.cs @@ -1,8 +1,8 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // FindingsLedgerIntegrationTests.cs // Sprint: SPRINT_5100_0010_0001_evidencelocker_tests // Task: FINDINGS-5100-005 -// Description: Integration test: event stream → ledger state → replay → verify identical state +// Description: Integration test: event stream → ledger state → replay → verify identical state // ----------------------------------------------------------------------------- using System.Security.Cryptography; @@ -20,11 +20,11 @@ namespace StellaOps.Findings.Ledger.Tests; /// /// Integration Tests for Findings Ledger -/// Task FINDINGS-5100-005: event stream → ledger state → replay → verify identical state +/// Task FINDINGS-5100-005: event stream → ledger state → replay → verify identical state /// public sealed class FindingsLedgerIntegrationTests { - #region FINDINGS-5100-005: Event Stream → Ledger State → Replay → Verify Identical + #region FINDINGS-5100-005: Event Stream → Ledger State → Replay → Verify Identical [Trait("Category", TestCategories.Unit)] [Fact] @@ -465,7 +465,6 @@ internal class LedgerProjectionReducer private static string ComputeCycleHash(IList events) { using var sha256 = SHA256.Create(); -using StellaOps.TestKit; var combined = new StringBuilder(); foreach (var evt in events.OrderBy(e => e.Sequence)) diff --git a/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerWebServiceContractTests.cs b/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerWebServiceContractTests.cs index cd55cb278..da6fa666b 100644 --- a/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerWebServiceContractTests.cs +++ b/src/Findings/StellaOps.Findings.Ledger.Tests/FindingsLedgerWebServiceContractTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // FindingsLedgerWebServiceContractTests.cs // Sprint: SPRINT_5100_0010_0001_evidencelocker_tests // Task: FINDINGS-5100-004 @@ -272,7 +272,6 @@ public sealed class FindingsLedgerWebServiceContractTests : IDisposable var content = await response.Content.ReadAsStringAsync(); using var doc = JsonDocument.Parse(content); -using StellaOps.TestKit; // Navigate to FindingSummary schema if (doc.RootElement.TryGetProperty("components", out var components) && components.TryGetProperty("schemas", out var schemas) && diff --git a/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/HarnessRunnerTests.cs b/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/HarnessRunnerTests.cs index 5193171fe..00fc26144 100644 --- a/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/HarnessRunnerTests.cs +++ b/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/HarnessRunnerTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using LedgerReplayHarness; using FluentAssertions; using Xunit; @@ -23,7 +23,6 @@ public class HarnessRunnerTests var json = await File.ReadAllTextAsync(tempReport); using var doc = JsonDocument.Parse(json); -using StellaOps.TestKit; doc.RootElement.GetProperty("eventsWritten").GetInt64().Should().BeGreaterThan(0); doc.RootElement.GetProperty("status").GetString().Should().Be("pass"); doc.RootElement.GetProperty("tenant").GetString().Should().Be("tenant-test"); diff --git a/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/LedgerMetricsTests.cs b/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/LedgerMetricsTests.cs index 0b6ab3f42..623d1c036 100644 --- a/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/LedgerMetricsTests.cs +++ b/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/LedgerMetricsTests.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.Metrics; +using System.Diagnostics.Metrics; using System.Linq; using FluentAssertions; using StellaOps.Findings.Ledger.Observability; @@ -195,7 +195,6 @@ public class LedgerMetricsTests public void VersionInfoGauge_EmitsConstantOne() { using var listener = CreateListener(); -using StellaOps.TestKit; var measurements = new List<(long Value, KeyValuePair[] Tags)>(); listener.SetMeasurementEventCallback((instrument, measurement, tags, state) => diff --git a/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/PolicyEngineEvaluationServiceTests.cs b/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/PolicyEngineEvaluationServiceTests.cs index 259057d93..660e712e7 100644 --- a/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/PolicyEngineEvaluationServiceTests.cs +++ b/src/Findings/__Tests/StellaOps.Findings.Ledger.Tests/PolicyEngineEvaluationServiceTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http; using System.Text.Json.Nodes; using Microsoft.Extensions.Logging.Abstractions; @@ -90,7 +90,6 @@ public sealed class PolicyEngineEvaluationServiceTests var factory = new TestHttpClientFactory(handler); var options = CreateOptions(baseAddress: null); using var cache = new PolicyEvaluationCache(options.PolicyEngine, NullLogger.Instance); -using StellaOps.TestKit; var inline = new InlinePolicyEvaluationService(NullLogger.Instance); var service = new PolicyEngineEvaluationService(factory, inline, cache, Microsoft.Extensions.Options.Options.Create(options), NullLogger.Instance); diff --git a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/GraphApiContractTests.cs b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/GraphApiContractTests.cs index d095331bb..16d548c78 100644 --- a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/GraphApiContractTests.cs +++ b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/GraphApiContractTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // GraphApiContractTests.cs // Sprint: SPRINT_5100_0010_0002_graph_timeline_tests // Tasks: GRAPH-5100-006, GRAPH-5100-007, GRAPH-5100-008 @@ -22,7 +22,7 @@ namespace StellaOps.Graph.Api.Tests; /// /// W1 API Layer Tests: Contract Tests, Auth Tests, OTel Trace Assertions -/// Task GRAPH-5100-006: Contract tests (GET /graphs/{tenantId}/query → 200 + NDJSON) +/// Task GRAPH-5100-006: Contract tests (GET /graphs/{tenantId}/query → 200 + NDJSON) /// Task GRAPH-5100-007: Auth tests (scopes: graph:read, graph:write) /// Task GRAPH-5100-008: OTel trace assertions (spans include tenant_id, query_type) /// @@ -414,7 +414,6 @@ public sealed class GraphApiContractTests : IDisposable // Arrange using var metrics = new GraphMetrics(); -using StellaOps.TestKit; // Assert - Verify meter is correctly configured metrics.Meter.Should().NotBeNull(); metrics.Meter.Name.Should().Be("StellaOps.Graph.Api"); diff --git a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/MetricsTests.cs b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/MetricsTests.cs index e14242a33..512f0d5a8 100644 --- a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/MetricsTests.cs +++ b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/MetricsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Linq; using System.Threading.Tasks; @@ -80,7 +80,6 @@ public class MetricsTests // Now create metrics after listener is started using var metrics = new GraphMetrics(); -using StellaOps.TestKit; var repo = new InMemoryGraphRepository(new[] { new NodeTile { Id = "gn:acme:component:one", Kind = "component", Tenant = "acme" } diff --git a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/QueryServiceTests.cs b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/QueryServiceTests.cs index 5dab329d9..92ea75069 100644 --- a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/QueryServiceTests.cs +++ b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/QueryServiceTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Text.Json; using Microsoft.Extensions.Caching.Memory; using StellaOps.Graph.Api.Contracts; @@ -92,7 +92,6 @@ public class QueryServiceTests { if (!line.Contains("\"type\":\"node\"")) continue; using var doc = JsonDocument.Parse(line); -using StellaOps.TestKit; var data = doc.RootElement.GetProperty("data"); if (data.TryGetProperty("overlays", out var overlaysElement) && overlaysElement.ValueKind == JsonValueKind.Object) { diff --git a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/SearchServiceTests.cs b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/SearchServiceTests.cs index cb907182e..7ce393b31 100644 --- a/src/Graph/__Tests/StellaOps.Graph.Api.Tests/SearchServiceTests.cs +++ b/src/Graph/__Tests/StellaOps.Graph.Api.Tests/SearchServiceTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Text.Json; using Microsoft.Extensions.Caching.Memory; using StellaOps.Graph.Api.Contracts; @@ -204,7 +204,6 @@ public class SearchServiceTests private static string ExtractNodeId(string nodeJson) { using var doc = JsonDocument.Parse(nodeJson); -using StellaOps.TestKit; return doc.RootElement.GetProperty("data").GetProperty("id").GetString() ?? string.Empty; } diff --git a/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphAnalyticsPipelineTests.cs b/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphAnalyticsPipelineTests.cs index ee1e94623..ab6b4de05 100644 --- a/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphAnalyticsPipelineTests.cs +++ b/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphAnalyticsPipelineTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using Microsoft.Extensions.Logging.Abstractions; using StellaOps.Graph.Indexer.Analytics; @@ -18,7 +18,6 @@ public sealed class GraphAnalyticsPipelineTests provider.Enqueue(snapshot); using var metrics = new GraphAnalyticsMetrics(); -using StellaOps.TestKit; var writer = new InMemoryGraphAnalyticsWriter(); var pipeline = new GraphAnalyticsPipeline( new GraphAnalyticsEngine(new GraphAnalyticsOptions()), diff --git a/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphChangeStreamProcessorTests.cs b/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphChangeStreamProcessorTests.cs index 4f0126b15..753578855 100644 --- a/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphChangeStreamProcessorTests.cs +++ b/src/Graph/__Tests/StellaOps.Graph.Indexer.Tests/GraphChangeStreamProcessorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Text.Json.Nodes; @@ -34,7 +34,6 @@ public sealed class GraphChangeStreamProcessorTests var writer = new FlakyWriter(failFirst: true); using var metrics = new GraphBackfillMetrics(); -using StellaOps.TestKit; var options = Options.Create(new GraphChangeStreamOptions { MaxRetryAttempts = 3, diff --git a/src/IssuerDirectory/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.Core.Tests/IssuerDirectoryClientTests.cs b/src/IssuerDirectory/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.Core.Tests/IssuerDirectoryClientTests.cs index 4c754fba9..267b3f770 100644 --- a/src/IssuerDirectory/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.Core.Tests/IssuerDirectoryClientTests.cs +++ b/src/IssuerDirectory/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.Core.Tests/IssuerDirectoryClientTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net; @@ -93,7 +93,6 @@ public class IssuerDirectoryClientTests reasonValues!.Should().Equal("rollout"); using var document = JsonDocument.Parse(putRequest.Body ?? string.Empty); -using StellaOps.TestKit; var root = document.RootElement; root.GetProperty("weight").GetDecimal().Should().Be(1.5m); root.GetProperty("reason").GetString().Should().Be("rollout"); diff --git a/src/IssuerDirectory/StellaOps.IssuerDirectory/__Tests/StellaOps.IssuerDirectory.Storage.Postgres.Tests/IssuerAuditSinkTests.cs b/src/IssuerDirectory/StellaOps.IssuerDirectory/__Tests/StellaOps.IssuerDirectory.Storage.Postgres.Tests/IssuerAuditSinkTests.cs index e1dc75f9d..d576109db 100644 --- a/src/IssuerDirectory/StellaOps.IssuerDirectory/__Tests/StellaOps.IssuerDirectory.Storage.Postgres.Tests/IssuerAuditSinkTests.cs +++ b/src/IssuerDirectory/StellaOps.IssuerDirectory/__Tests/StellaOps.IssuerDirectory.Storage.Postgres.Tests/IssuerAuditSinkTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Npgsql; @@ -241,7 +241,6 @@ public sealed class IssuerAuditSinkTests : IAsyncLifetime """; await using var command = new NpgsqlCommand(sql, connection); -using StellaOps.TestKit; command.Parameters.AddWithValue("tenantId", Guid.Parse(tenantId)); command.Parameters.AddWithValue("issuerId", Guid.Parse(issuerId)); diff --git a/src/Notifier/StellaOps.Notifier/StellaOps.Notifier.Tests/PackApprovalTemplateTests.cs b/src/Notifier/StellaOps.Notifier/StellaOps.Notifier.Tests/PackApprovalTemplateTests.cs index 7bfde2a76..2c23c8f6c 100644 --- a/src/Notifier/StellaOps.Notifier/StellaOps.Notifier.Tests/PackApprovalTemplateTests.cs +++ b/src/Notifier/StellaOps.Notifier/StellaOps.Notifier.Tests/PackApprovalTemplateTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using Xunit; @@ -56,7 +56,6 @@ public sealed class PackApprovalTemplateTests var path = LocatePackApprovalTemplatesPath(); var json = File.ReadAllText(path); using var doc = JsonDocument.Parse(json); -using StellaOps.TestKit; return doc.RootElement.Clone(); } diff --git a/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/001_initial_schema.sql b/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/001_initial_schema.sql index 09249930c..837c0e5f4 100644 --- a/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/001_initial_schema.sql +++ b/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/001_initial_schema.sql @@ -1,10 +1,19 @@ --- Notify Schema Migration 001: Initial Schema --- Creates the notify schema for notifications, channels, and delivery tracking +-- Notify Schema Migration 001: Initial Schema (Compacted) +-- Consolidated from migrations 001, 010, 011, 011b for 1.0.0 release +-- Creates the notify schema for notifications, channels, delivery tracking, +-- incidents, escalation, and on-call management + +-- ============================================================================ +-- Schema Creation +-- ============================================================================ --- Create schema CREATE SCHEMA IF NOT EXISTS notify; +CREATE SCHEMA IF NOT EXISTS notify_app; + +-- ============================================================================ +-- Enum Types +-- ============================================================================ --- Channel types DO $$ BEGIN CREATE TYPE notify.channel_type AS ENUM ( 'email', 'slack', 'teams', 'webhook', 'pagerduty', 'opsgenie' @@ -13,7 +22,6 @@ EXCEPTION WHEN duplicate_object THEN null; END $$; --- Delivery status DO $$ BEGIN CREATE TYPE notify.delivery_status AS ENUM ( 'pending', 'queued', 'sending', 'sent', 'delivered', 'failed', 'bounced' @@ -22,7 +30,45 @@ EXCEPTION WHEN duplicate_object THEN null; END $$; --- Channels table +-- ============================================================================ +-- Tenant Context Helper Function +-- ============================================================================ + +CREATE OR REPLACE FUNCTION notify_app.require_current_tenant() +RETURNS TEXT +LANGUAGE plpgsql STABLE SECURITY DEFINER +AS $$ +DECLARE + v_tenant TEXT; +BEGIN + v_tenant := current_setting('app.tenant_id', true); + IF v_tenant IS NULL OR v_tenant = '' THEN + RAISE EXCEPTION 'app.tenant_id session variable not set' + USING HINT = 'Set via: SELECT set_config(''app.tenant_id'', '''', false)', + ERRCODE = 'P0001'; + END IF; + RETURN v_tenant; +END; +$$; + +REVOKE ALL ON FUNCTION notify_app.require_current_tenant() FROM PUBLIC; + +-- ============================================================================ +-- Update Timestamp Function +-- ============================================================================ + +CREATE OR REPLACE FUNCTION notify.update_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- ============================================================================ +-- Channels Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.channels ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -41,7 +87,14 @@ CREATE TABLE IF NOT EXISTS notify.channels ( CREATE INDEX idx_channels_tenant ON notify.channels(tenant_id); CREATE INDEX idx_channels_type ON notify.channels(tenant_id, channel_type); --- Rules table (notification routing rules) +CREATE TRIGGER trg_channels_updated_at + BEFORE UPDATE ON notify.channels + FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); + +-- ============================================================================ +-- Rules Table (Notification Routing Rules) +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.rules ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -62,7 +115,14 @@ CREATE TABLE IF NOT EXISTS notify.rules ( CREATE INDEX idx_rules_tenant ON notify.rules(tenant_id); CREATE INDEX idx_rules_enabled ON notify.rules(tenant_id, enabled, priority DESC); --- Templates table +CREATE TRIGGER trg_rules_updated_at + BEFORE UPDATE ON notify.rules + FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); + +-- ============================================================================ +-- Templates Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.templates ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -79,13 +139,22 @@ CREATE TABLE IF NOT EXISTS notify.templates ( CREATE INDEX idx_templates_tenant ON notify.templates(tenant_id); --- Deliveries table +CREATE TRIGGER trg_templates_updated_at + BEFORE UPDATE ON notify.templates + FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); + +-- ============================================================================ +-- Deliveries Table (PARTITIONED by created_at) +-- ============================================================================ +-- Note: Foreign key constraints not supported on partitioned tables; +-- application-level integrity checks are used instead. + CREATE TABLE IF NOT EXISTS notify.deliveries ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + id UUID NOT NULL DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, - channel_id UUID NOT NULL REFERENCES notify.channels(id), - rule_id UUID REFERENCES notify.rules(id), - template_id UUID REFERENCES notify.templates(id), + channel_id UUID NOT NULL, + rule_id UUID, + template_id UUID, status notify.delivery_status NOT NULL DEFAULT 'pending', recipient TEXT NOT NULL, subject TEXT, @@ -102,18 +171,83 @@ CREATE TABLE IF NOT EXISTS notify.deliveries ( queued_at TIMESTAMPTZ, sent_at TIMESTAMPTZ, delivered_at TIMESTAMPTZ, - failed_at TIMESTAMPTZ -); + failed_at TIMESTAMPTZ, + PRIMARY KEY (id, created_at) +) PARTITION BY RANGE (created_at); -CREATE INDEX idx_deliveries_tenant ON notify.deliveries(tenant_id); -CREATE INDEX idx_deliveries_status ON notify.deliveries(tenant_id, status); -CREATE INDEX idx_deliveries_pending ON notify.deliveries(status, next_retry_at) +-- Create default partition to catch any rows outside defined ranges +CREATE TABLE IF NOT EXISTS notify.deliveries_default + PARTITION OF notify.deliveries DEFAULT; + +-- Indexes on partitioned deliveries table +CREATE INDEX ix_deliveries_part_tenant ON notify.deliveries (tenant_id); +CREATE INDEX ix_deliveries_part_status ON notify.deliveries (tenant_id, status); +CREATE INDEX ix_deliveries_part_pending ON notify.deliveries (status, next_retry_at) WHERE status IN ('pending', 'queued'); -CREATE INDEX idx_deliveries_channel ON notify.deliveries(channel_id); -CREATE INDEX idx_deliveries_correlation ON notify.deliveries(correlation_id); -CREATE INDEX idx_deliveries_created ON notify.deliveries(tenant_id, created_at); +CREATE INDEX ix_deliveries_part_channel ON notify.deliveries (channel_id); +CREATE INDEX ix_deliveries_part_correlation ON notify.deliveries (correlation_id) + WHERE correlation_id IS NOT NULL; +CREATE INDEX ix_deliveries_part_created ON notify.deliveries (tenant_id, created_at DESC); +CREATE INDEX ix_deliveries_part_created_brin ON notify.deliveries USING BRIN (created_at) + WITH (pages_per_range = 32); +CREATE INDEX ix_deliveries_part_external_id ON notify.deliveries (external_id) + WHERE external_id IS NOT NULL; + +COMMENT ON TABLE notify.deliveries IS + 'Notification deliveries. Partitioned monthly by created_at.'; + +-- ============================================================================ +-- Partition Management Function +-- ============================================================================ + +CREATE OR REPLACE FUNCTION notify.ensure_delivery_partitions() +RETURNS void +LANGUAGE plpgsql +AS $$ +DECLARE + v_start_date DATE; + v_end_date DATE; + v_partition_name TEXT; + v_from_date DATE; + v_to_date DATE; +BEGIN + -- Create partitions for 3 months back and 4 months ahead + v_start_date := date_trunc('month', NOW() - INTERVAL '3 months')::DATE; + v_end_date := date_trunc('month', NOW() + INTERVAL '4 months')::DATE; + + v_from_date := v_start_date; + WHILE v_from_date < v_end_date LOOP + v_to_date := v_from_date + INTERVAL '1 month'; + v_partition_name := 'deliveries_' || to_char(v_from_date, 'YYYY_MM'); + + -- Check if partition exists + IF NOT EXISTS ( + SELECT 1 FROM pg_class c + JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE n.nspname = 'notify' + AND c.relname = v_partition_name + ) THEN + EXECUTE format( + 'CREATE TABLE notify.%I PARTITION OF notify.deliveries FOR VALUES FROM (%L) TO (%L)', + v_partition_name, + v_from_date, + v_to_date + ); + RAISE NOTICE 'Created partition: notify.%', v_partition_name; + END IF; + + v_from_date := v_to_date; + END LOOP; +END; +$$; + +-- Create initial partitions +SELECT notify.ensure_delivery_partitions(); + +-- ============================================================================ +-- Digests Table (Aggregated Notifications) +-- ============================================================================ --- Digests table (aggregated notifications) CREATE TABLE IF NOT EXISTS notify.digests ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -134,7 +268,14 @@ CREATE INDEX idx_digests_tenant ON notify.digests(tenant_id); CREATE INDEX idx_digests_collect ON notify.digests(status, collect_until) WHERE status = 'collecting'; --- Quiet hours table +CREATE TRIGGER trg_digests_updated_at + BEFORE UPDATE ON notify.digests + FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); + +-- ============================================================================ +-- Quiet Hours Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.quiet_hours ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -151,7 +292,10 @@ CREATE TABLE IF NOT EXISTS notify.quiet_hours ( CREATE INDEX idx_quiet_hours_tenant ON notify.quiet_hours(tenant_id); --- Maintenance windows table +-- ============================================================================ +-- Maintenance Windows Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.maintenance_windows ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -169,7 +313,10 @@ CREATE TABLE IF NOT EXISTS notify.maintenance_windows ( CREATE INDEX idx_maintenance_windows_tenant ON notify.maintenance_windows(tenant_id); CREATE INDEX idx_maintenance_windows_active ON notify.maintenance_windows(start_at, end_at); --- Escalation policies table +-- ============================================================================ +-- Escalation Policies Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.escalation_policies ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -186,7 +333,14 @@ CREATE TABLE IF NOT EXISTS notify.escalation_policies ( CREATE INDEX idx_escalation_policies_tenant ON notify.escalation_policies(tenant_id); --- Escalation states table +CREATE TRIGGER trg_escalation_policies_updated_at + BEFORE UPDATE ON notify.escalation_policies + FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); + +-- ============================================================================ +-- Escalation States Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.escalation_states ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -210,7 +364,10 @@ CREATE INDEX idx_escalation_states_active ON notify.escalation_states(status, ne WHERE status = 'active'; CREATE INDEX idx_escalation_states_correlation ON notify.escalation_states(correlation_id); --- On-call schedules table +-- ============================================================================ +-- On-Call Schedules Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.on_call_schedules ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -228,7 +385,14 @@ CREATE TABLE IF NOT EXISTS notify.on_call_schedules ( CREATE INDEX idx_on_call_schedules_tenant ON notify.on_call_schedules(tenant_id); --- Inbox table (in-app notifications) +CREATE TRIGGER trg_on_call_schedules_updated_at + BEFORE UPDATE ON notify.on_call_schedules + FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); + +-- ============================================================================ +-- Inbox Table (In-App Notifications) +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.inbox ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -250,7 +414,10 @@ CREATE INDEX idx_inbox_tenant_user ON notify.inbox(tenant_id, user_id); CREATE INDEX idx_inbox_unread ON notify.inbox(tenant_id, user_id, read, created_at DESC) WHERE read = FALSE AND archived = FALSE; --- Incidents table +-- ============================================================================ +-- Incidents Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.incidents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -275,7 +442,10 @@ CREATE INDEX idx_incidents_status ON notify.incidents(tenant_id, status); CREATE INDEX idx_incidents_severity ON notify.incidents(tenant_id, severity); CREATE INDEX idx_incidents_correlation ON notify.incidents(correlation_id); --- Audit log table +-- ============================================================================ +-- Audit Log Table +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.audit ( id BIGSERIAL PRIMARY KEY, tenant_id TEXT NOT NULL, @@ -291,7 +461,10 @@ CREATE TABLE IF NOT EXISTS notify.audit ( CREATE INDEX idx_audit_tenant ON notify.audit(tenant_id); CREATE INDEX idx_audit_created ON notify.audit(tenant_id, created_at); --- Locks table (lightweight distributed locks) +-- ============================================================================ +-- Locks Table (Lightweight Distributed Locks) +-- ============================================================================ + CREATE TABLE IF NOT EXISTS notify.locks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -305,36 +478,101 @@ CREATE TABLE IF NOT EXISTS notify.locks ( CREATE INDEX idx_locks_tenant ON notify.locks(tenant_id); CREATE INDEX idx_locks_expiry ON notify.locks(expires_at); --- Update timestamp function -CREATE OR REPLACE FUNCTION notify.update_updated_at() -RETURNS TRIGGER AS $$ +-- ============================================================================ +-- Row-Level Security +-- ============================================================================ + +ALTER TABLE notify.channels ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.channels FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.rules ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.rules FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.templates ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.templates FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.deliveries ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.deliveries FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.digests ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.digests FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.quiet_hours ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.quiet_hours FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.maintenance_windows ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.maintenance_windows FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.escalation_policies ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.escalation_policies FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.escalation_states ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.escalation_states FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.on_call_schedules ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.on_call_schedules FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.inbox ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.inbox FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.incidents ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.incidents FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.audit ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.audit FORCE ROW LEVEL SECURITY; +ALTER TABLE notify.locks ENABLE ROW LEVEL SECURITY; +ALTER TABLE notify.locks FORCE ROW LEVEL SECURITY; + +-- RLS Policies +CREATE POLICY channels_tenant_isolation ON notify.channels + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY rules_tenant_isolation ON notify.rules + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY templates_tenant_isolation ON notify.templates + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY deliveries_tenant_isolation ON notify.deliveries + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY digests_tenant_isolation ON notify.digests + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY quiet_hours_tenant_isolation ON notify.quiet_hours + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY maintenance_windows_tenant_isolation ON notify.maintenance_windows + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY escalation_policies_tenant_isolation ON notify.escalation_policies + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY escalation_states_tenant_isolation ON notify.escalation_states + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY on_call_schedules_tenant_isolation ON notify.on_call_schedules + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY inbox_tenant_isolation ON notify.inbox + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY incidents_tenant_isolation ON notify.incidents + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY audit_tenant_isolation ON notify.audit + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +CREATE POLICY locks_tenant_isolation ON notify.locks + FOR ALL USING (tenant_id = notify_app.require_current_tenant()) + WITH CHECK (tenant_id = notify_app.require_current_tenant()); + +-- Admin Bypass Role +DO $$ BEGIN - NEW.updated_at = NOW(); - RETURN NEW; -END; -$$ LANGUAGE plpgsql; - --- Triggers -CREATE TRIGGER trg_channels_updated_at - BEFORE UPDATE ON notify.channels - FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); - -CREATE TRIGGER trg_rules_updated_at - BEFORE UPDATE ON notify.rules - FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); - -CREATE TRIGGER trg_templates_updated_at - BEFORE UPDATE ON notify.templates - FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); - -CREATE TRIGGER trg_digests_updated_at - BEFORE UPDATE ON notify.digests - FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); - -CREATE TRIGGER trg_escalation_policies_updated_at - BEFORE UPDATE ON notify.escalation_policies - FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); - -CREATE TRIGGER trg_on_call_schedules_updated_at - BEFORE UPDATE ON notify.on_call_schedules - FOR EACH ROW EXECUTE FUNCTION notify.update_updated_at(); + IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'notify_admin') THEN + CREATE ROLE notify_admin WITH NOLOGIN BYPASSRLS; + END IF; +END +$$; diff --git a/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/010_enable_rls.sql b/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/010_enable_rls.sql similarity index 100% rename from src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/010_enable_rls.sql rename to src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/010_enable_rls.sql diff --git a/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/011_partition_deliveries.sql b/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/011_partition_deliveries.sql similarity index 100% rename from src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/011_partition_deliveries.sql rename to src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/011_partition_deliveries.sql diff --git a/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/011b_migrate_deliveries_data.sql b/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/011b_migrate_deliveries_data.sql similarity index 100% rename from src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/011b_migrate_deliveries_data.sql rename to src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/011b_migrate_deliveries_data.sql diff --git a/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/README.md b/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/README.md new file mode 100644 index 000000000..d1ff881c5 --- /dev/null +++ b/src/Notify/__Libraries/StellaOps.Notify.Storage.Postgres/Migrations/_archived/pre_1.0/README.md @@ -0,0 +1,24 @@ +# Archived Pre-1.0 Migrations + +This directory contains the original migrations that were compacted into `001_initial_schema.sql` +for the 1.0.0 release. + +## Original Files +- `001_initial_schema.sql` - Channels, rules, templates, deliveries, incidents +- `010_enable_rls.sql` - Row-Level Security for tenant isolation +- `011_partition_deliveries.sql` - Partitioned deliveries table (monthly) +- `011b_migrate_deliveries_data.sql` - Data migration to partitioned table + +## Why Archived +Pre-1.0, the schema evolved incrementally. For 1.0.0, migrations were compacted into a single +initial schema to: +- Simplify new deployments +- Reduce startup time +- Provide cleaner upgrade path + +## For Existing Deployments +If upgrading from pre-1.0, run the reset script directly with psql: +```bash +psql -h -U -d -f devops/scripts/migrations-reset-pre-1.0.sql +``` +This updates `schema_migrations` to recognize the compacted schema. diff --git a/src/Notify/__Tests/StellaOps.Notify.Connectors.Slack.Tests/SlackChannelTestProviderTests.cs b/src/Notify/__Tests/StellaOps.Notify.Connectors.Slack.Tests/SlackChannelTestProviderTests.cs index fcd4ed1b3..4952ff7d0 100644 --- a/src/Notify/__Tests/StellaOps.Notify.Connectors.Slack.Tests/SlackChannelTestProviderTests.cs +++ b/src/Notify/__Tests/StellaOps.Notify.Connectors.Slack.Tests/SlackChannelTestProviderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using System.Threading; @@ -110,7 +110,6 @@ public sealed class SlackChannelTestProviderTests private static string ComputeSecretHash(string secretRef) { using var sha = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; var bytes = System.Text.Encoding.UTF8.GetBytes(secretRef.Trim()); var hash = sha.ComputeHash(bytes); return System.Convert.ToHexString(hash, 0, 8).ToLowerInvariant(); diff --git a/src/Notify/__Tests/StellaOps.Notify.Connectors.Teams.Tests/TeamsChannelTestProviderTests.cs b/src/Notify/__Tests/StellaOps.Notify.Connectors.Teams.Tests/TeamsChannelTestProviderTests.cs index e6ac429ff..8f00e2677 100644 --- a/src/Notify/__Tests/StellaOps.Notify.Connectors.Teams.Tests/TeamsChannelTestProviderTests.cs +++ b/src/Notify/__Tests/StellaOps.Notify.Connectors.Teams.Tests/TeamsChannelTestProviderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using System.Threading; @@ -66,7 +66,6 @@ public sealed class TeamsChannelTestProviderTests Assert.Equal(channel.Config.Endpoint, result.Metadata["teams.config.endpoint"]); using var payload = JsonDocument.Parse(result.Preview.Body); -using StellaOps.TestKit; Assert.Equal("message", payload.RootElement.GetProperty("type").GetString()); Assert.Equal(result.Preview.TextBody, payload.RootElement.GetProperty("text").GetString()); Assert.Equal(result.Preview.Summary, payload.RootElement.GetProperty("summary").GetString()); diff --git a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyDeliveryQueueTests.cs b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyDeliveryQueueTests.cs index 0d2046ca4..2a1f057cb 100644 --- a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyDeliveryQueueTests.cs +++ b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyDeliveryQueueTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; @@ -144,7 +144,6 @@ public sealed class NatsNotifyDeliveryQueueTests : IAsyncLifetime await Task.Delay(200); await using var connection = new NatsConnection(new NatsOpts { Url = options.Nats.Url! }); -using StellaOps.TestKit; await connection.ConnectAsync(); var js = new NatsJSContext(connection); diff --git a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyEventQueueTests.cs b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyEventQueueTests.cs index 951ce9782..ff4488fbd 100644 --- a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyEventQueueTests.cs +++ b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/NatsNotifyEventQueueTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; @@ -156,7 +156,6 @@ public sealed class NatsNotifyEventQueueTests : IAsyncLifetime var options = CreateOptions(); await using var queue = CreateQueue(options); -using StellaOps.TestKit; var notifyEvent = TestData.CreateEvent(); await queue.PublishAsync(new NotifyQueueEventMessage(notifyEvent, options.Nats.Subject)); diff --git a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyDeliveryQueueTests.cs b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyDeliveryQueueTests.cs index 1087beb0e..e60fcc7a7 100644 --- a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyDeliveryQueueTests.cs +++ b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyDeliveryQueueTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; @@ -124,7 +124,6 @@ public sealed class RedisNotifyDeliveryQueueTests : IAsyncLifetime await using var queue = CreateQueue(options); -using StellaOps.TestKit; await queue.PublishAsync(new NotifyDeliveryQueueMessage( TestData.CreateDelivery(), channelId: "channel-dead", diff --git a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyEventQueueTests.cs b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyEventQueueTests.cs index 7c200c919..597162b8b 100644 --- a/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyEventQueueTests.cs +++ b/src/Notify/__Tests/StellaOps.Notify.Queue.Tests/RedisNotifyEventQueueTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; @@ -152,7 +152,6 @@ public sealed class RedisNotifyEventQueueTests : IAsyncLifetime var options = CreateOptions(); await using var queue = CreateQueue(options); -using StellaOps.TestKit; var notifyEvent = TestData.CreateEvent(); await queue.PublishAsync(new NotifyQueueEventMessage(notifyEvent, options.Redis.Streams[0].Stream)); diff --git a/src/Notify/__Tests/StellaOps.Notify.Storage.Postgres.Tests/StellaOps.Notify.Storage.Postgres.Tests.csproj b/src/Notify/__Tests/StellaOps.Notify.Storage.Postgres.Tests/StellaOps.Notify.Storage.Postgres.Tests.csproj index 47d89595f..4a5fdbfc4 100644 --- a/src/Notify/__Tests/StellaOps.Notify.Storage.Postgres.Tests/StellaOps.Notify.Storage.Postgres.Tests.csproj +++ b/src/Notify/__Tests/StellaOps.Notify.Storage.Postgres.Tests/StellaOps.Notify.Storage.Postgres.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Notify/__Tests/StellaOps.Notify.WebService.Tests/CrudEndpointsTests.cs b/src/Notify/__Tests/StellaOps.Notify.WebService.Tests/CrudEndpointsTests.cs index a893236b6..b1dcc5426 100644 --- a/src/Notify/__Tests/StellaOps.Notify.WebService.Tests/CrudEndpointsTests.cs +++ b/src/Notify/__Tests/StellaOps.Notify.WebService.Tests/CrudEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.IO; using System.Linq; @@ -298,7 +298,6 @@ public sealed class CrudEndpointsTests : IClassFixture { services.AddSingleton(); -using StellaOps.TestKit; }); }); diff --git a/src/Orchestrator/StellaOps.Orchestrator/StellaOps.Orchestrator.Tests/SchemaSmokeTests.cs b/src/Orchestrator/StellaOps.Orchestrator/StellaOps.Orchestrator.Tests/SchemaSmokeTests.cs index f16eaf036..0ac12671b 100644 --- a/src/Orchestrator/StellaOps.Orchestrator/StellaOps.Orchestrator.Tests/SchemaSmokeTests.cs +++ b/src/Orchestrator/StellaOps.Orchestrator/StellaOps.Orchestrator.Tests/SchemaSmokeTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Text.Json; using StellaOps.Cryptography; using StellaOps.Orchestrator.Core; @@ -32,7 +32,6 @@ public class SchemaSmokeTests var text = File.ReadAllText(path); using var doc = JsonDocument.Parse(text); -using StellaOps.TestKit; Assert.True(doc.RootElement.TryGetProperty("$id", out _)); Assert.True(doc.RootElement.TryGetProperty("title", out _)); } diff --git a/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/ExportServiceTests.cs b/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/ExportServiceTests.cs index a9b04f415..2b115cf69 100644 --- a/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/ExportServiceTests.cs +++ b/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/ExportServiceTests.cs @@ -1,4 +1,4 @@ -using System.IO.Compression; +using System.IO.Compression; using StellaOps.PacksRegistry.Core.Services; using StellaOps.PacksRegistry.Infrastructure.InMemory; using StellaOps.PacksRegistry.Infrastructure.Verification; @@ -34,7 +34,6 @@ public sealed class ExportServiceTests var archiveStream = await exportService.ExportOfflineSeedAsync(record.TenantId, includeContent: true, includeProvenance: true, cancellationToken: ct); using var archive = new ZipArchive(archiveStream, ZipArchiveMode.Read); -using StellaOps.TestKit; Assert.NotNull(archive.GetEntry("packs.ndjson")); Assert.NotNull(archive.GetEntry("parity.ndjson")); Assert.NotNull(archive.GetEntry("lifecycle.ndjson")); diff --git a/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/PacksApiTests.cs b/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/PacksApiTests.cs index 4dda27655..026c50e93 100644 --- a/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/PacksApiTests.cs +++ b/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/PacksApiTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.IO.Compression; using Microsoft.AspNetCore.Mvc.Testing; @@ -124,7 +124,6 @@ public sealed class PacksApiTests : IClassFixture Assert.Equal(HttpStatusCode.OK, offlineSeed.StatusCode); var bytesZip = await offlineSeed.Content.ReadAsByteArrayAsync(ct); using var archive = new ZipArchive(new MemoryStream(bytesZip)); -using StellaOps.TestKit; Assert.NotNull(archive.GetEntry("packs.ndjson")); Assert.NotNull(archive.GetEntry($"content/{created.PackId}.bin")); } diff --git a/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/RsaSignatureVerifierTests.cs b/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/RsaSignatureVerifierTests.cs index 522d955c8..197c3eeed 100644 --- a/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/RsaSignatureVerifierTests.cs +++ b/src/PacksRegistry/StellaOps.PacksRegistry/StellaOps.PacksRegistry.Tests/RsaSignatureVerifierTests.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; using System.Text; using StellaOps.PacksRegistry.Infrastructure.Verification; @@ -31,7 +31,6 @@ public sealed class RsaSignatureVerifierTests { var ct = TestContext.Current.CancellationToken; using var rsa = RSA.Create(2048); -using StellaOps.TestKit; var publicPem = ExportPublicPem(rsa); const string digest = "sha256:deadbeef"; var sig = Convert.ToBase64String(Encoding.UTF8.GetBytes("bogus")); diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/001_initial_schema.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/001_initial_schema.sql index 4c09ff809..68c5eae10 100644 --- a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/001_initial_schema.sql +++ b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/001_initial_schema.sql @@ -1,8 +1,61 @@ --- Policy Schema Migration 001: Initial Schema --- Creates the policy schema for packs, rules, and risk profiles +-- Policy Schema Migration 001: Initial Schema (Compacted) +-- Consolidated from migrations 001-013 for 1.0.0 release +-- Creates the policy schema for packs, rules, risk profiles, CVSS/EPSS scoring, +-- exceptions, unknowns, budget management, and approval workflows + +-- ============================================================================ +-- Schema Creation +-- ============================================================================ --- Create schema CREATE SCHEMA IF NOT EXISTS policy; +CREATE SCHEMA IF NOT EXISTS policy_app; + +-- ============================================================================ +-- Tenant Context Helper Function +-- ============================================================================ + +CREATE OR REPLACE FUNCTION policy_app.require_current_tenant() +RETURNS TEXT +LANGUAGE plpgsql STABLE SECURITY DEFINER +AS $$ +DECLARE + v_tenant TEXT; +BEGIN + v_tenant := current_setting('app.tenant_id', true); + IF v_tenant IS NULL OR v_tenant = '' THEN + RAISE EXCEPTION 'app.tenant_id session variable not set' + USING HINT = 'Set via: SELECT set_config(''app.tenant_id'', '''', false)', + ERRCODE = 'P0001'; + END IF; + RETURN v_tenant; +END; +$$; + +REVOKE ALL ON FUNCTION policy_app.require_current_tenant() FROM PUBLIC; + +-- ============================================================================ +-- Update Timestamp Functions +-- ============================================================================ + +CREATE OR REPLACE FUNCTION policy.update_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION policy.unknowns_set_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- ============================================================================ +-- Core Policy Management Tables +-- ============================================================================ -- Packs table (policy pack containers) CREATE TABLE IF NOT EXISTS policy.packs ( @@ -64,7 +117,10 @@ CREATE INDEX idx_rules_severity ON policy.rules(severity); CREATE INDEX idx_rules_category ON policy.rules(category); CREATE INDEX idx_rules_tags ON policy.rules USING GIN(tags); --- Risk profiles table +-- ============================================================================ +-- Risk Profile Tables +-- ============================================================================ + CREATE TABLE IF NOT EXISTS policy.risk_profiles ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -87,7 +143,6 @@ CREATE INDEX idx_risk_profiles_tenant ON policy.risk_profiles(tenant_id); CREATE INDEX idx_risk_profiles_active ON policy.risk_profiles(tenant_id, name, is_active) WHERE is_active = TRUE; --- Risk profile history (for audit trail) CREATE TABLE IF NOT EXISTS policy.risk_profile_history ( id BIGSERIAL PRIMARY KEY, risk_profile_id UUID NOT NULL REFERENCES policy.risk_profiles(id), @@ -102,7 +157,10 @@ CREATE TABLE IF NOT EXISTS policy.risk_profile_history ( CREATE INDEX idx_risk_profile_history_profile ON policy.risk_profile_history(risk_profile_id); --- Evaluation runs table +-- ============================================================================ +-- Evaluation Tables +-- ============================================================================ + CREATE TABLE IF NOT EXISTS policy.evaluation_runs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -135,7 +193,6 @@ CREATE INDEX idx_evaluation_runs_artifact ON policy.evaluation_runs(tenant_id, a CREATE INDEX idx_evaluation_runs_created ON policy.evaluation_runs(tenant_id, created_at); CREATE INDEX idx_evaluation_runs_status ON policy.evaluation_runs(status); --- Explanations table (rule evaluation details) CREATE TABLE IF NOT EXISTS policy.explanations ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), evaluation_run_id UUID NOT NULL REFERENCES policy.evaluation_runs(id) ON DELETE CASCADE, @@ -154,7 +211,334 @@ CREATE TABLE IF NOT EXISTS policy.explanations ( CREATE INDEX idx_explanations_run ON policy.explanations(evaluation_run_id); CREATE INDEX idx_explanations_result ON policy.explanations(evaluation_run_id, result); --- Exceptions table (policy exceptions/waivers) +-- ============================================================================ +-- CVSS & Risk Scoring Tables +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS policy.cvss_receipts ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + vulnerability_id TEXT NOT NULL, + receipt_format TEXT NOT NULL, + schema_version TEXT NOT NULL, + cvss_version TEXT NOT NULL, + vector TEXT NOT NULL, + severity TEXT NOT NULL CHECK (severity IN ('None','Low','Medium','High','Critical')), + base_score NUMERIC(4,1) NOT NULL, + threat_score NUMERIC(4,1), + environmental_score NUMERIC(4,1), + full_score NUMERIC(4,1), + effective_score NUMERIC(4,1) NOT NULL, + effective_score_type TEXT NOT NULL CHECK (effective_score_type IN ('Base','Threat','Environmental','Full')), + policy_id TEXT NOT NULL, + policy_version TEXT NOT NULL, + policy_hash TEXT NOT NULL, + base_metrics JSONB NOT NULL, + threat_metrics JSONB, + environmental_metrics JSONB, + supplemental_metrics JSONB, + evidence JSONB NOT NULL DEFAULT '[]'::jsonb, + attestation_refs JSONB NOT NULL DEFAULT '[]'::jsonb, + input_hash TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by TEXT NOT NULL, + modified_at TIMESTAMPTZ, + modified_by TEXT, + history JSONB NOT NULL DEFAULT '[]'::jsonb, + amends_receipt_id UUID, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + superseded_reason TEXT, + CONSTRAINT cvss_receipts_input_hash_key UNIQUE (tenant_id, input_hash) +); + +CREATE INDEX idx_cvss_receipts_tenant_created ON policy.cvss_receipts (tenant_id, created_at DESC, id); +CREATE INDEX idx_cvss_receipts_tenant_vuln ON policy.cvss_receipts (tenant_id, vulnerability_id); +CREATE INDEX idx_cvss_receipts_version ON policy.cvss_receipts(cvss_version); +CREATE INDEX idx_cvss_receipts_severity ON policy.cvss_receipts(tenant_id, severity); +CREATE INDEX idx_cvss_receipts_version_severity ON policy.cvss_receipts(tenant_id, cvss_version, severity); + +CREATE TABLE IF NOT EXISTS policy.epss_scores ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + cve_id TEXT NOT NULL, + score NUMERIC(6,5) NOT NULL CHECK (score >= 0 AND score <= 1), + percentile NUMERIC(6,5) NOT NULL CHECK (percentile >= 0 AND percentile <= 1), + model_version DATE NOT NULL, + source TEXT NOT NULL DEFAULT 'first.org', + fetched_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + INTERVAL '7 days', + UNIQUE(cve_id, model_version) +); + +CREATE INDEX idx_epss_scores_cve ON policy.epss_scores(cve_id); +CREATE INDEX idx_epss_scores_percentile ON policy.epss_scores(percentile DESC); +CREATE INDEX idx_epss_scores_expires ON policy.epss_scores(expires_at); +CREATE INDEX idx_epss_scores_model ON policy.epss_scores(model_version); + +CREATE TABLE IF NOT EXISTS policy.epss_history ( + id BIGSERIAL PRIMARY KEY, + cve_id TEXT NOT NULL, + score NUMERIC(6,5) NOT NULL, + percentile NUMERIC(6,5) NOT NULL, + model_version DATE NOT NULL, + recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX idx_epss_history_cve ON policy.epss_history(cve_id); +CREATE INDEX idx_epss_history_recorded ON policy.epss_history(cve_id, recorded_at DESC); + +CREATE TABLE IF NOT EXISTS policy.risk_scores ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + vulnerability_id TEXT NOT NULL, + cvss_receipt_id UUID REFERENCES policy.cvss_receipts(id), + cvss_score NUMERIC(4,1) NOT NULL, + cvss_version TEXT NOT NULL, + kev_flag BOOLEAN NOT NULL DEFAULT FALSE, + kev_added_date DATE, + epss_score NUMERIC(6,5), + epss_percentile NUMERIC(6,5), + epss_model_version DATE, + kev_bonus NUMERIC(4,2) NOT NULL DEFAULT 0 CHECK (kev_bonus >= 0 AND kev_bonus <= 1), + epss_bonus NUMERIC(4,2) NOT NULL DEFAULT 0 CHECK (epss_bonus >= 0 AND epss_bonus <= 1), + combined_risk_score NUMERIC(4,3) NOT NULL CHECK (combined_risk_score >= 0 AND combined_risk_score <= 1), + formula_version TEXT NOT NULL DEFAULT 'v1', + formula_params JSONB NOT NULL DEFAULT '{}', + input_hash TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by TEXT, + UNIQUE(tenant_id, vulnerability_id, input_hash) +); + +CREATE INDEX idx_risk_scores_tenant ON policy.risk_scores(tenant_id); +CREATE INDEX idx_risk_scores_vuln ON policy.risk_scores(tenant_id, vulnerability_id); +CREATE INDEX idx_risk_scores_combined ON policy.risk_scores(tenant_id, combined_risk_score DESC); +CREATE INDEX idx_risk_scores_kev ON policy.risk_scores(kev_flag) WHERE kev_flag = TRUE; +CREATE INDEX idx_risk_scores_epss ON policy.risk_scores(epss_percentile DESC) WHERE epss_percentile IS NOT NULL; +CREATE INDEX idx_risk_scores_created ON policy.risk_scores(tenant_id, created_at DESC); + +CREATE TABLE IF NOT EXISTS policy.epss_thresholds ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + name TEXT NOT NULL, + is_default BOOLEAN NOT NULL DEFAULT FALSE, + thresholds JSONB NOT NULL DEFAULT '[{"percentile": 0.99, "bonus": 0.10}, {"percentile": 0.90, "bonus": 0.05}, {"percentile": 0.50, "bonus": 0.02}]'::jsonb, + kev_bonus NUMERIC(4,2) NOT NULL DEFAULT 0.20, + description TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by TEXT, + UNIQUE(tenant_id, name) +); + +CREATE INDEX idx_epss_thresholds_tenant ON policy.epss_thresholds(tenant_id); +CREATE INDEX idx_epss_thresholds_default ON policy.epss_thresholds(tenant_id, is_default) + WHERE is_default = TRUE; + +CREATE TABLE IF NOT EXISTS policy.risk_score_history ( + id BIGSERIAL PRIMARY KEY, + risk_score_id UUID NOT NULL REFERENCES policy.risk_scores(id), + cvss_score NUMERIC(4,1) NOT NULL, + kev_flag BOOLEAN NOT NULL, + epss_score NUMERIC(6,5), + epss_percentile NUMERIC(6,5), + combined_risk_score NUMERIC(4,3) NOT NULL, + changed_by TEXT, + changed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + change_reason TEXT +); + +CREATE INDEX idx_risk_score_history_score ON policy.risk_score_history(risk_score_id); +CREATE INDEX idx_risk_score_history_changed ON policy.risk_score_history(changed_at); + +-- ============================================================================ +-- Policy Snapshots & Events Tables +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS policy.snapshots ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + policy_id UUID NOT NULL, + version INT NOT NULL, + content_digest TEXT NOT NULL, + content JSONB NOT NULL, + metadata JSONB NOT NULL DEFAULT '{}', + created_by TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE(tenant_id, policy_id, version) +); + +CREATE INDEX idx_snapshots_tenant ON policy.snapshots(tenant_id); +CREATE INDEX idx_snapshots_policy ON policy.snapshots(tenant_id, policy_id); +CREATE INDEX idx_snapshots_digest ON policy.snapshots(content_digest); + +CREATE TABLE IF NOT EXISTS policy.violation_events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + policy_id UUID NOT NULL, + rule_id TEXT NOT NULL, + severity TEXT NOT NULL CHECK (severity IN ('critical', 'high', 'medium', 'low', 'info')), + subject_purl TEXT, + subject_cve TEXT, + details JSONB NOT NULL DEFAULT '{}', + remediation TEXT, + correlation_id TEXT, + occurred_at TIMESTAMPTZ NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX idx_violation_events_tenant ON policy.violation_events(tenant_id); +CREATE INDEX idx_violation_events_policy ON policy.violation_events(tenant_id, policy_id); +CREATE INDEX idx_violation_events_rule ON policy.violation_events(rule_id); +CREATE INDEX idx_violation_events_severity ON policy.violation_events(severity); +CREATE INDEX idx_violation_events_purl ON policy.violation_events(subject_purl) WHERE subject_purl IS NOT NULL; +CREATE INDEX idx_violation_events_occurred ON policy.violation_events(tenant_id, occurred_at); + +CREATE TABLE IF NOT EXISTS policy.conflicts ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + conflict_type TEXT NOT NULL CHECK (conflict_type IN ('rule_overlap', 'scope_collision', 'version_mismatch', 'precedence', 'other')), + status TEXT NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'resolved', 'dismissed')), + severity TEXT NOT NULL DEFAULT 'medium' CHECK (severity IN ('critical', 'high', 'medium', 'low')), + left_rule_id TEXT, + right_rule_id TEXT, + affected_scope TEXT, + description TEXT NOT NULL, + resolution TEXT, + resolved_by TEXT, + resolved_at TIMESTAMPTZ, + metadata JSONB NOT NULL DEFAULT '{}', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by TEXT +); + +CREATE INDEX idx_conflicts_tenant ON policy.conflicts(tenant_id); +CREATE INDEX idx_conflicts_status ON policy.conflicts(tenant_id, status); +CREATE INDEX idx_conflicts_type ON policy.conflicts(conflict_type); + +CREATE TABLE IF NOT EXISTS policy.ledger_exports ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + export_type TEXT NOT NULL CHECK (export_type IN ('full', 'incremental', 'snapshot')), + status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'running', 'completed', 'failed')), + format TEXT NOT NULL DEFAULT 'ndjson' CHECK (format IN ('ndjson', 'json', 'parquet', 'csv')), + content_digest TEXT, + record_count INT, + byte_size BIGINT, + storage_path TEXT, + start_time TIMESTAMPTZ, + end_time TIMESTAMPTZ, + error_message TEXT, + metadata JSONB NOT NULL DEFAULT '{}', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by TEXT +); + +CREATE INDEX idx_ledger_exports_tenant ON policy.ledger_exports(tenant_id); +CREATE INDEX idx_ledger_exports_status ON policy.ledger_exports(status); +CREATE INDEX idx_ledger_exports_digest ON policy.ledger_exports(content_digest) WHERE content_digest IS NOT NULL; +CREATE INDEX idx_ledger_exports_created ON policy.ledger_exports(tenant_id, created_at); + +CREATE TABLE IF NOT EXISTS policy.worker_results ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + job_type TEXT NOT NULL, + job_id TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'running', 'completed', 'failed', 'cancelled')), + input_hash TEXT, + output_hash TEXT, + progress INT DEFAULT 0 CHECK (progress >= 0 AND progress <= 100), + result JSONB, + error_message TEXT, + retry_count INT NOT NULL DEFAULT 0, + max_retries INT NOT NULL DEFAULT 3, + scheduled_at TIMESTAMPTZ, + started_at TIMESTAMPTZ, + completed_at TIMESTAMPTZ, + metadata JSONB NOT NULL DEFAULT '{}', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by TEXT, + UNIQUE(tenant_id, job_type, job_id) +); + +CREATE INDEX idx_worker_results_tenant ON policy.worker_results(tenant_id); +CREATE INDEX idx_worker_results_status ON policy.worker_results(status); +CREATE INDEX idx_worker_results_job_type ON policy.worker_results(job_type); +CREATE INDEX idx_worker_results_scheduled ON policy.worker_results(scheduled_at) WHERE status = 'pending'; + +-- ============================================================================ +-- Unknowns Management Table +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS policy.unknowns ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + package_id TEXT NOT NULL, + package_version TEXT NOT NULL, + band TEXT NOT NULL DEFAULT 'cold' CHECK (band IN ('hot', 'warm', 'cold', 'resolved')), + score DECIMAL(5, 2) NOT NULL DEFAULT 0.00, + uncertainty_factor DECIMAL(5, 4) NOT NULL DEFAULT 0.0000, + exploit_pressure DECIMAL(5, 4) NOT NULL DEFAULT 0.0000, + first_seen_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + last_evaluated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + resolution_reason TEXT, + resolved_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + blast_radius_dependents INT, + blast_radius_net_facing BOOLEAN, + blast_radius_privilege TEXT, + containment_seccomp TEXT, + containment_fs_mode TEXT, + containment_network_policy TEXT, + reason_code TEXT, + remediation_hint TEXT, + evidence_refs JSONB DEFAULT '[]'::jsonb, + assumptions JSONB DEFAULT '[]'::jsonb, + UNIQUE(tenant_id, package_id, package_version) +); + +CREATE INDEX idx_unknowns_tenant_band ON policy.unknowns(tenant_id, band); +CREATE INDEX idx_unknowns_tenant_score ON policy.unknowns(tenant_id, score DESC); +CREATE INDEX idx_unknowns_last_evaluated ON policy.unknowns(last_evaluated_at); +CREATE INDEX idx_unknowns_package ON policy.unknowns(package_id, package_version); +CREATE INDEX idx_unknowns_reason_code ON policy.unknowns(reason_code) WHERE reason_code IS NOT NULL; + +-- ============================================================================ +-- Recheck Policies & Evidence Tables +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS policy.recheck_policies ( + policy_id TEXT PRIMARY KEY, + tenant_id TEXT NOT NULL, + name TEXT NOT NULL, + conditions JSONB NOT NULL, + default_action TEXT NOT NULL, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX idx_recheck_policies_tenant ON policy.recheck_policies (tenant_id, is_active); + +CREATE TABLE IF NOT EXISTS policy.evidence_hooks ( + hook_id TEXT PRIMARY KEY, + tenant_id TEXT NOT NULL, + type TEXT NOT NULL, + description TEXT NOT NULL, + is_mandatory BOOLEAN NOT NULL DEFAULT TRUE, + validation_schema TEXT, + max_age_seconds BIGINT, + min_trust_score DECIMAL(5,4), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX idx_evidence_hooks_tenant_type ON policy.evidence_hooks (tenant_id, type); + +-- ============================================================================ +-- Exception Management Tables +-- ============================================================================ + CREATE TABLE IF NOT EXISTS policy.exceptions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, @@ -165,7 +549,7 @@ CREATE TABLE IF NOT EXISTS policy.exceptions ( artifact_pattern TEXT, project_id TEXT, reason TEXT NOT NULL, - status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'expired', 'revoked')), + status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('proposed', 'approved', 'active', 'expired', 'revoked')), expires_at TIMESTAMPTZ, approved_by TEXT, approved_at TIMESTAMPTZ, @@ -173,17 +557,235 @@ CREATE TABLE IF NOT EXISTS policy.exceptions ( revoked_at TIMESTAMPTZ, metadata JSONB NOT NULL DEFAULT '{}', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), created_by TEXT, + exception_id TEXT NOT NULL UNIQUE, + version INTEGER NOT NULL DEFAULT 1, + type TEXT NOT NULL DEFAULT 'policy' CHECK (type IN ('vulnerability', 'policy', 'unknown', 'component')), + artifact_digest TEXT, + purl_pattern TEXT, + vulnerability_id TEXT, + policy_rule_id TEXT, + environments TEXT[] NOT NULL DEFAULT '{}', + owner_id TEXT, + requester_id TEXT, + approver_ids TEXT[] NOT NULL DEFAULT '{}', + reason_code TEXT DEFAULT 'other' CHECK (reason_code IN ('false_positive', 'accepted_risk', 'compensating_control', 'test_only', 'vendor_not_affected', 'scheduled_fix', 'deprecation_in_progress', 'runtime_mitigation', 'network_isolation', 'other')), + rationale TEXT, + evidence_refs JSONB NOT NULL DEFAULT '[]', + compensating_controls JSONB NOT NULL DEFAULT '[]', + ticket_ref TEXT, + recheck_policy_id TEXT REFERENCES policy.recheck_policies(policy_id), + last_recheck_result JSONB, + last_recheck_at TIMESTAMPTZ, UNIQUE(tenant_id, name) ); CREATE INDEX idx_exceptions_tenant ON policy.exceptions(tenant_id); CREATE INDEX idx_exceptions_status ON policy.exceptions(tenant_id, status); -CREATE INDEX idx_exceptions_expires ON policy.exceptions(expires_at) - WHERE status = 'active'; +CREATE INDEX idx_exceptions_expires ON policy.exceptions(expires_at) WHERE status = 'active'; CREATE INDEX idx_exceptions_project ON policy.exceptions(tenant_id, project_id); +CREATE INDEX idx_exceptions_vuln_id ON policy.exceptions(vulnerability_id) WHERE vulnerability_id IS NOT NULL; +CREATE INDEX idx_exceptions_purl ON policy.exceptions(purl_pattern) WHERE purl_pattern IS NOT NULL; +CREATE INDEX idx_exceptions_artifact ON policy.exceptions(artifact_digest) WHERE artifact_digest IS NOT NULL; +CREATE INDEX idx_exceptions_policy_rule ON policy.exceptions(policy_rule_id) WHERE policy_rule_id IS NOT NULL; +CREATE INDEX idx_exceptions_owner ON policy.exceptions(owner_id) WHERE owner_id IS NOT NULL; +CREATE INDEX idx_exceptions_recheck_policy ON policy.exceptions(tenant_id, recheck_policy_id) WHERE recheck_policy_id IS NOT NULL; + +CREATE TABLE IF NOT EXISTS policy.submitted_evidence ( + evidence_id TEXT PRIMARY KEY, + tenant_id TEXT NOT NULL, + exception_id TEXT NOT NULL REFERENCES policy.exceptions(exception_id), + hook_id TEXT NOT NULL REFERENCES policy.evidence_hooks(hook_id), + type TEXT NOT NULL, + reference TEXT NOT NULL, + content TEXT, + dsse_envelope TEXT, + signature_verified BOOLEAN NOT NULL DEFAULT FALSE, + trust_score DECIMAL(5,4) NOT NULL DEFAULT 0, + submitted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + submitted_by TEXT NOT NULL, + validation_status TEXT NOT NULL DEFAULT 'Pending', + validation_error TEXT +); + +CREATE INDEX idx_submitted_evidence_exception ON policy.submitted_evidence (tenant_id, exception_id); +CREATE INDEX idx_submitted_evidence_hook ON policy.submitted_evidence (tenant_id, hook_id); +CREATE INDEX idx_submitted_evidence_status ON policy.submitted_evidence (tenant_id, validation_status); + +CREATE TABLE IF NOT EXISTS policy.exception_events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + exception_id TEXT NOT NULL REFERENCES policy.exceptions(exception_id) ON DELETE CASCADE, + sequence_number INTEGER NOT NULL, + event_type TEXT NOT NULL CHECK (event_type IN ('created', 'updated', 'approved', 'activated', 'extended', 'revoked', 'expired', 'evidence_attached', 'compensating_control_added', 'rejected')), + actor_id TEXT NOT NULL, + occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + previous_status TEXT, + new_status TEXT NOT NULL, + new_version INTEGER NOT NULL, + description TEXT, + details JSONB NOT NULL DEFAULT '{}', + client_info TEXT, + UNIQUE (exception_id, sequence_number) +); + +CREATE INDEX idx_exception_events_exception ON policy.exception_events(exception_id); +CREATE INDEX idx_exception_events_time ON policy.exception_events USING BRIN (occurred_at); + +CREATE TABLE IF NOT EXISTS policy.exception_applications ( + id UUID NOT NULL PRIMARY KEY, + tenant_id UUID NOT NULL, + exception_id TEXT NOT NULL, + finding_id TEXT NOT NULL, + vulnerability_id TEXT, + original_status TEXT NOT NULL, + applied_status TEXT NOT NULL, + effect_name TEXT NOT NULL, + effect_type TEXT NOT NULL, + evaluation_run_id UUID, + policy_bundle_digest TEXT, + applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + metadata JSONB NOT NULL DEFAULT '{}' +); + +CREATE INDEX ix_exception_applications_exception_id ON policy.exception_applications (tenant_id, exception_id); +CREATE INDEX ix_exception_applications_finding_id ON policy.exception_applications (tenant_id, finding_id); +CREATE INDEX ix_exception_applications_vulnerability_id ON policy.exception_applications (tenant_id, vulnerability_id) WHERE vulnerability_id IS NOT NULL; +CREATE INDEX ix_exception_applications_evaluation_run_id ON policy.exception_applications (tenant_id, evaluation_run_id) WHERE evaluation_run_id IS NOT NULL; +CREATE INDEX ix_exception_applications_applied_at ON policy.exception_applications (tenant_id, applied_at DESC); +CREATE INDEX ix_exception_applications_stats ON policy.exception_applications (tenant_id, effect_type, applied_status); + +-- ============================================================================ +-- Budget Management Tables +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS policy.budget_ledger ( + budget_id VARCHAR(256) PRIMARY KEY, + service_id VARCHAR(128) NOT NULL, + tenant_id VARCHAR(64), + tier INT NOT NULL DEFAULT 1, + window VARCHAR(16) NOT NULL, + allocated INT NOT NULL, + consumed INT NOT NULL DEFAULT 0, + status VARCHAR(16) NOT NULL DEFAULT 'green', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT uq_budget_ledger_service_window UNIQUE (service_id, window) +); + +CREATE INDEX idx_budget_ledger_service_id ON policy.budget_ledger (service_id); +CREATE INDEX idx_budget_ledger_tenant_id ON policy.budget_ledger (tenant_id); +CREATE INDEX idx_budget_ledger_window ON policy.budget_ledger (window); +CREATE INDEX idx_budget_ledger_status ON policy.budget_ledger (status); + +CREATE TABLE IF NOT EXISTS policy.budget_entries ( + entry_id VARCHAR(64) PRIMARY KEY, + service_id VARCHAR(128) NOT NULL, + window VARCHAR(16) NOT NULL, + release_id VARCHAR(128) NOT NULL, + risk_points INT NOT NULL, + reason VARCHAR(512), + is_exception BOOLEAN NOT NULL DEFAULT FALSE, + penalty_points INT NOT NULL DEFAULT 0, + consumed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + consumed_by VARCHAR(256), + CONSTRAINT fk_budget_entries_ledger FOREIGN KEY (service_id, window) + REFERENCES policy.budget_ledger (service_id, window) ON DELETE CASCADE +); + +CREATE INDEX idx_budget_entries_service_window ON policy.budget_entries (service_id, window); +CREATE INDEX idx_budget_entries_release_id ON policy.budget_entries (release_id); +CREATE INDEX idx_budget_entries_consumed_at ON policy.budget_entries (consumed_at); + +-- ============================================================================ +-- Approval Workflow Tables +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS policy.exception_approval_requests ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + request_id TEXT NOT NULL UNIQUE, + tenant_id TEXT NOT NULL, + exception_id TEXT, + requestor_id TEXT NOT NULL, + required_approver_ids TEXT[] NOT NULL DEFAULT '{}', + approved_by_ids TEXT[] NOT NULL DEFAULT '{}', + rejected_by_id TEXT, + status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'partial', 'approved', 'rejected', 'expired', 'cancelled')), + gate_level INTEGER NOT NULL DEFAULT 1 CHECK (gate_level >= 0 AND gate_level <= 4), + justification TEXT NOT NULL, + rationale TEXT, + reason_code TEXT NOT NULL DEFAULT 'other' CHECK (reason_code IN ('false_positive', 'accepted_risk', 'compensating_control', 'test_only', 'vendor_not_affected', 'scheduled_fix', 'deprecation_in_progress', 'runtime_mitigation', 'network_isolation', 'other')), + evidence_refs JSONB NOT NULL DEFAULT '[]', + compensating_controls JSONB NOT NULL DEFAULT '[]', + ticket_ref TEXT, + vulnerability_id TEXT, + purl_pattern TEXT, + artifact_digest TEXT, + image_pattern TEXT, + environments TEXT[] NOT NULL DEFAULT '{}', + requested_ttl_days INTEGER NOT NULL DEFAULT 30 CHECK (requested_ttl_days > 0 AND requested_ttl_days <= 365), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + request_expires_at TIMESTAMPTZ NOT NULL DEFAULT (NOW() + INTERVAL '7 days'), + exception_expires_at TIMESTAMPTZ, + resolved_at TIMESTAMPTZ, + rejection_reason TEXT, + metadata JSONB NOT NULL DEFAULT '{}', + version INTEGER NOT NULL DEFAULT 1, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX idx_approval_requests_tenant ON policy.exception_approval_requests(tenant_id); +CREATE INDEX idx_approval_requests_status ON policy.exception_approval_requests(tenant_id, status); +CREATE INDEX idx_approval_requests_requestor ON policy.exception_approval_requests(requestor_id); +CREATE INDEX idx_approval_requests_pending ON policy.exception_approval_requests(tenant_id, status) WHERE status IN ('pending', 'partial'); +CREATE INDEX idx_approval_requests_expiry ON policy.exception_approval_requests(request_expires_at) WHERE status IN ('pending', 'partial'); +CREATE INDEX idx_approval_requests_vuln ON policy.exception_approval_requests(vulnerability_id) WHERE vulnerability_id IS NOT NULL; + +CREATE TABLE IF NOT EXISTS policy.exception_approval_audit ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + request_id TEXT NOT NULL, + tenant_id TEXT NOT NULL, + sequence_number INTEGER NOT NULL, + action_type TEXT NOT NULL CHECK (action_type IN ('requested', 'approved', 'rejected', 'escalated', 'reminder_sent', 'expired', 'cancelled', 'evidence_added', 'approver_added', 'approver_removed', 'ttl_extended')), + actor_id TEXT NOT NULL, + occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + previous_status TEXT, + new_status TEXT NOT NULL, + description TEXT, + details JSONB NOT NULL DEFAULT '{}', + client_info JSONB NOT NULL DEFAULT '{}', + UNIQUE (request_id, sequence_number) +); + +CREATE INDEX idx_approval_audit_request ON policy.exception_approval_audit(request_id); +CREATE INDEX idx_approval_audit_time ON policy.exception_approval_audit USING BRIN (occurred_at); + +CREATE TABLE IF NOT EXISTS policy.exception_approval_rules ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + name TEXT NOT NULL, + description TEXT, + gate_level INTEGER NOT NULL CHECK (gate_level >= 0 AND gate_level <= 4), + min_approvers INTEGER NOT NULL DEFAULT 1 CHECK (min_approvers >= 0 AND min_approvers <= 10), + required_roles TEXT[] NOT NULL DEFAULT '{}', + max_ttl_days INTEGER NOT NULL DEFAULT 30 CHECK (max_ttl_days > 0 AND max_ttl_days <= 365), + allow_self_approval BOOLEAN NOT NULL DEFAULT false, + require_evidence BOOLEAN NOT NULL DEFAULT false, + require_compensating_controls BOOLEAN NOT NULL DEFAULT false, + min_rationale_length INTEGER NOT NULL DEFAULT 0 CHECK (min_rationale_length >= 0 AND min_rationale_length <= 1000), + priority INTEGER NOT NULL DEFAULT 0, + enabled BOOLEAN NOT NULL DEFAULT true, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (tenant_id, gate_level, name) +); + +CREATE INDEX idx_approval_rules_lookup ON policy.exception_approval_rules(tenant_id, gate_level, enabled); + +-- ============================================================================ +-- Audit Log Table +-- ============================================================================ --- Audit log table CREATE TABLE IF NOT EXISTS policy.audit ( id BIGSERIAL PRIMARY KEY, tenant_id TEXT NOT NULL, @@ -201,16 +803,209 @@ CREATE INDEX idx_audit_tenant ON policy.audit(tenant_id); CREATE INDEX idx_audit_resource ON policy.audit(resource_type, resource_id); CREATE INDEX idx_audit_created ON policy.audit(tenant_id, created_at); --- Update timestamp function -CREATE OR REPLACE FUNCTION policy.update_updated_at() -RETURNS TRIGGER AS $$ -BEGIN - NEW.updated_at = NOW(); - RETURN NEW; -END; -$$ LANGUAGE plpgsql; +-- ============================================================================ +-- CVSS Helper Functions +-- ============================================================================ +CREATE OR REPLACE FUNCTION policy.cvss_severity( + p_score NUMERIC, + p_version TEXT +) RETURNS TEXT AS $$ +BEGIN + IF p_version = '2.0' THEN + RETURN CASE + WHEN p_score >= 7.0 THEN 'High' + WHEN p_score >= 4.0 THEN 'Medium' + WHEN p_score > 0 THEN 'Low' + ELSE 'None' + END; + ELSE + RETURN CASE + WHEN p_score >= 9.0 THEN 'Critical' + WHEN p_score >= 7.0 THEN 'High' + WHEN p_score >= 4.0 THEN 'Medium' + WHEN p_score >= 0.1 THEN 'Low' + ELSE 'None' + END; + END IF; +END; +$$ LANGUAGE plpgsql IMMUTABLE; + +CREATE OR REPLACE FUNCTION policy.validate_cvss_vector( + p_vector TEXT, + p_version TEXT +) RETURNS BOOLEAN AS $$ +BEGIN + CASE p_version + WHEN '2.0' THEN + RETURN p_vector ~ '^(CVSS2#)?AV:[LAN]/AC:[HML]/Au:[MSN]/C:[NPC]/I:[NPC]/A:[NPC]'; + WHEN '3.0', '3.1' THEN + RETURN p_vector ~ '^CVSS:3\.[01]/AV:[NALP]/AC:[LH]/PR:[NLH]/UI:[NR]/S:[UC]/C:[NLH]/I:[NLH]/A:[NLH]'; + WHEN '4.0' THEN + RETURN p_vector ~ '^CVSS:4\.0/AV:[NALP]/AC:[LH]/AT:[NP]/PR:[NLH]/UI:[NAP]/VC:[NLH]/VI:[NLH]/VA:[NLH]/SC:[NLH]/SI:[NLH]/SA:[NLH]'; + ELSE + RETURN FALSE; + END CASE; +END; +$$ LANGUAGE plpgsql IMMUTABLE; + +-- ============================================================================ +-- Maintenance Functions +-- ============================================================================ + +CREATE OR REPLACE FUNCTION policy.mark_expired_exceptions() +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + expired_count INTEGER; +BEGIN + WITH expired AS ( + UPDATE policy.exceptions + SET + status = 'expired', + version = version + 1, + updated_at = NOW() + WHERE + status = 'active' + AND expires_at <= NOW() + RETURNING exception_id, version + ), + events AS ( + INSERT INTO policy.exception_events ( + exception_id, + sequence_number, + event_type, + actor_id, + occurred_at, + previous_status, + new_status, + new_version, + description + ) + SELECT + e.exception_id, + COALESCE( + (SELECT MAX(sequence_number) + 1 + FROM policy.exception_events + WHERE exception_id = e.exception_id), + 1 + ), + 'expired', + 'system', + NOW(), + 'active', + 'expired', + e.version, + 'Exception expired automatically' + FROM expired e + RETURNING exception_id + ) + SELECT COUNT(*) INTO expired_count FROM events; + + RETURN expired_count; +END; +$$; + +CREATE OR REPLACE FUNCTION policy.expire_pending_approval_requests() +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + expired_count INTEGER; +BEGIN + WITH expired AS ( + UPDATE policy.exception_approval_requests + SET + status = 'expired', + resolved_at = NOW(), + version = version + 1, + updated_at = NOW() + WHERE + status IN ('pending', 'partial') + AND request_expires_at <= NOW() + RETURNING request_id, tenant_id, version + ), + audit_entries AS ( + INSERT INTO policy.exception_approval_audit ( + request_id, + tenant_id, + sequence_number, + action_type, + actor_id, + occurred_at, + previous_status, + new_status, + description + ) + SELECT + e.request_id, + e.tenant_id, + COALESCE( + (SELECT MAX(sequence_number) + 1 + FROM policy.exception_approval_audit + WHERE request_id = e.request_id), + 1 + ), + 'expired', + 'system', + NOW(), + 'pending', + 'expired', + 'Approval request expired without sufficient approvals' + FROM expired e + RETURNING request_id + ) + SELECT COUNT(*) INTO expired_count FROM audit_entries; + + RETURN expired_count; +END; +$$; + +CREATE OR REPLACE FUNCTION policy.get_approval_requirements( + p_tenant_id TEXT, + p_gate_level INTEGER +) +RETURNS TABLE ( + min_approvers INTEGER, + required_roles TEXT[], + max_ttl_days INTEGER, + allow_self_approval BOOLEAN, + require_evidence BOOLEAN, + require_compensating_controls BOOLEAN, + min_rationale_length INTEGER +) +LANGUAGE plpgsql +AS $$ +BEGIN + RETURN QUERY + SELECT + r.min_approvers, + r.required_roles, + r.max_ttl_days, + r.allow_self_approval, + r.require_evidence, + r.require_compensating_controls, + r.min_rationale_length + FROM policy.exception_approval_rules r + WHERE (r.tenant_id = p_tenant_id OR r.tenant_id = '__default__') + AND r.gate_level = p_gate_level + AND r.enabled = true + ORDER BY + CASE WHEN r.tenant_id = p_tenant_id THEN 0 ELSE 1 END, + r.priority DESC + LIMIT 1; + + IF NOT FOUND THEN + RETURN QUERY SELECT 1, ARRAY[]::TEXT[], 30, false, false, false, 0; + END IF; +END; +$$; + +-- ============================================================================ -- Triggers +-- ============================================================================ + CREATE TRIGGER trg_packs_updated_at BEFORE UPDATE ON policy.packs FOR EACH ROW EXECUTE FUNCTION policy.update_updated_at(); @@ -218,3 +1013,308 @@ CREATE TRIGGER trg_packs_updated_at CREATE TRIGGER trg_risk_profiles_updated_at BEFORE UPDATE ON policy.risk_profiles FOR EACH ROW EXECUTE FUNCTION policy.update_updated_at(); + +CREATE TRIGGER trg_risk_scores_updated_at + BEFORE UPDATE ON policy.risk_scores + FOR EACH ROW EXECUTE FUNCTION policy.update_updated_at(); + +CREATE TRIGGER trg_epss_thresholds_updated_at + BEFORE UPDATE ON policy.epss_thresholds + FOR EACH ROW EXECUTE FUNCTION policy.update_updated_at(); + +CREATE TRIGGER trg_unknowns_updated_at + BEFORE UPDATE ON policy.unknowns + FOR EACH ROW EXECUTE FUNCTION policy.unknowns_set_updated_at(); + +-- ============================================================================ +-- CVSS Views +-- ============================================================================ + +CREATE OR REPLACE VIEW policy.cvss_v2_receipts AS +SELECT + id, tenant_id, vulnerability_id, vector, severity, base_score, + threat_score AS temporal_score, environmental_score, effective_score, + base_metrics->>'accessVector' AS access_vector, + base_metrics->>'accessComplexity' AS access_complexity, + base_metrics->>'authentication' AS authentication, + base_metrics->>'confidentialityImpact' AS confidentiality_impact, + base_metrics->>'integrityImpact' AS integrity_impact, + base_metrics->>'availabilityImpact' AS availability_impact, + threat_metrics->>'exploitability' AS exploitability, + threat_metrics->>'remediationLevel' AS remediation_level, + threat_metrics->>'reportConfidence' AS report_confidence, + input_hash, created_at, is_active +FROM policy.cvss_receipts +WHERE cvss_version = '2.0'; + +CREATE OR REPLACE VIEW policy.cvss_v3_receipts AS +SELECT + id, tenant_id, vulnerability_id, vector, cvss_version, severity, base_score, + threat_score AS temporal_score, environmental_score, effective_score, + base_metrics->>'attackVector' AS attack_vector, + base_metrics->>'attackComplexity' AS attack_complexity, + base_metrics->>'privilegesRequired' AS privileges_required, + base_metrics->>'userInteraction' AS user_interaction, + base_metrics->>'scope' AS scope, + base_metrics->>'confidentialityImpact' AS confidentiality_impact, + base_metrics->>'integrityImpact' AS integrity_impact, + base_metrics->>'availabilityImpact' AS availability_impact, + threat_metrics->>'exploitCodeMaturity' AS exploit_code_maturity, + threat_metrics->>'remediationLevel' AS remediation_level, + threat_metrics->>'reportConfidence' AS report_confidence, + input_hash, created_at, is_active +FROM policy.cvss_receipts +WHERE cvss_version IN ('3.0', '3.1'); + +CREATE OR REPLACE VIEW policy.cvss_v4_receipts AS +SELECT + id, tenant_id, vulnerability_id, vector, severity, base_score, threat_score, + environmental_score, full_score, effective_score, effective_score_type, + base_metrics->>'attackVector' AS attack_vector, + base_metrics->>'attackComplexity' AS attack_complexity, + base_metrics->>'attackRequirements' AS attack_requirements, + base_metrics->>'privilegesRequired' AS privileges_required, + base_metrics->>'userInteraction' AS user_interaction, + base_metrics->>'vulnConfidentialityImpact' AS vuln_confidentiality, + base_metrics->>'vulnIntegrityImpact' AS vuln_integrity, + base_metrics->>'vulnAvailabilityImpact' AS vuln_availability, + base_metrics->>'subConfidentialityImpact' AS sub_confidentiality, + base_metrics->>'subIntegrityImpact' AS sub_integrity, + base_metrics->>'subAvailabilityImpact' AS sub_availability, + threat_metrics->>'exploitMaturity' AS exploit_maturity, + supplemental_metrics->>'safety' AS safety, + supplemental_metrics->>'automatable' AS automatable, + supplemental_metrics->>'recovery' AS recovery, + supplemental_metrics->>'valueDensity' AS value_density, + supplemental_metrics->>'responseEffort' AS response_effort, + supplemental_metrics->>'providerUrgency' AS provider_urgency, + input_hash, created_at, is_active +FROM policy.cvss_receipts +WHERE cvss_version = '4.0'; + +CREATE OR REPLACE VIEW policy.cvss_version_summary AS +SELECT + tenant_id, + cvss_version, + COUNT(*) AS total_receipts, + COUNT(*) FILTER (WHERE is_active) AS active_receipts, + ROUND(AVG(base_score)::numeric, 1) AS avg_base_score, + ROUND(AVG(effective_score)::numeric, 1) AS avg_effective_score, + COUNT(*) FILTER (WHERE severity = 'Critical') AS critical_count, + COUNT(*) FILTER (WHERE severity = 'High') AS high_count, + COUNT(*) FILTER (WHERE severity = 'Medium') AS medium_count, + COUNT(*) FILTER (WHERE severity = 'Low') AS low_count, + COUNT(*) FILTER (WHERE severity = 'None') AS none_count +FROM policy.cvss_receipts +GROUP BY tenant_id, cvss_version; + +CREATE OR REPLACE VIEW policy.epss_current AS +SELECT DISTINCT ON (cve_id) + cve_id, score, percentile, model_version, fetched_at +FROM policy.epss_scores +WHERE expires_at > NOW() +ORDER BY cve_id, model_version DESC; + +CREATE OR REPLACE VIEW policy.high_risk_vulns AS +SELECT + rs.tenant_id, + rs.vulnerability_id, + rs.cvss_score, + rs.cvss_version, + rs.kev_flag, + rs.epss_percentile, + rs.combined_risk_score, + CASE + WHEN rs.kev_flag THEN 'KEV' + WHEN rs.epss_percentile >= 0.95 THEN 'High EPSS (95th+)' + WHEN rs.epss_percentile >= 0.90 THEN 'High EPSS (90th+)' + ELSE 'CVSS Only' + END AS risk_category +FROM policy.risk_scores rs +WHERE rs.kev_flag = TRUE + OR rs.epss_percentile >= 0.90 + OR rs.combined_risk_score >= 0.90; + +-- ============================================================================ +-- Row-Level Security +-- ============================================================================ + +ALTER TABLE policy.packs ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.pack_versions ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.rules ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.risk_profiles ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.risk_profile_history ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.evaluation_runs ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.explanations ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.cvss_receipts ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.epss_scores ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.risk_scores ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.epss_thresholds ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.snapshots ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.violation_events ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.conflicts ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.ledger_exports ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.worker_results ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.unknowns ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.recheck_policies ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.evidence_hooks ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.exceptions ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.submitted_evidence ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.exception_events ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.exception_applications ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.budget_ledger ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.budget_entries ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.exception_approval_requests ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.exception_approval_audit ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.exception_approval_rules ENABLE ROW LEVEL SECURITY; +ALTER TABLE policy.audit ENABLE ROW LEVEL SECURITY; + +-- Direct Tenant Isolation Policies +CREATE POLICY packs_tenant_isolation ON policy.packs + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY risk_profiles_tenant_isolation ON policy.risk_profiles + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY evaluation_runs_tenant_isolation ON policy.evaluation_runs + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY exceptions_tenant_isolation ON policy.exceptions + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY audit_tenant_isolation ON policy.audit + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY recheck_policies_tenant_isolation ON policy.recheck_policies + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY evidence_hooks_tenant_isolation ON policy.evidence_hooks + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY submitted_evidence_tenant_isolation ON policy.submitted_evidence + FOR ALL USING (tenant_id = policy_app.require_current_tenant()) + WITH CHECK (tenant_id = policy_app.require_current_tenant()); + +CREATE POLICY approval_requests_tenant_isolation ON policy.exception_approval_requests + FOR ALL USING (tenant_id = current_setting('app.current_tenant', true)); + +CREATE POLICY approval_audit_tenant_isolation ON policy.exception_approval_audit + FOR ALL USING (tenant_id = current_setting('app.current_tenant', true)); + +CREATE POLICY approval_rules_tenant_isolation ON policy.exception_approval_rules + FOR ALL USING (tenant_id = current_setting('app.current_tenant', true)); + +CREATE POLICY budget_ledger_tenant_isolation ON policy.budget_ledger + FOR ALL USING (tenant_id = current_setting('app.tenant_id', TRUE) OR tenant_id IS NULL); + +CREATE POLICY budget_entries_tenant_isolation ON policy.budget_entries + FOR ALL USING ( + EXISTS ( + SELECT 1 FROM policy.budget_ledger bl + WHERE bl.service_id = budget_entries.service_id + AND bl.window = budget_entries.window + AND (bl.tenant_id = current_setting('app.tenant_id', TRUE) OR bl.tenant_id IS NULL) + ) + ); + +-- FK-Based Tenant Isolation Policies +CREATE POLICY pack_versions_tenant_isolation ON policy.pack_versions + FOR ALL USING ( + pack_id IN (SELECT id FROM policy.packs WHERE tenant_id = policy_app.require_current_tenant()) + ); + +CREATE POLICY rules_tenant_isolation ON policy.rules + FOR ALL USING ( + pack_version_id IN ( + SELECT pv.id FROM policy.pack_versions pv + JOIN policy.packs p ON pv.pack_id = p.id + WHERE p.tenant_id = policy_app.require_current_tenant() + ) + ); + +CREATE POLICY risk_profile_history_tenant_isolation ON policy.risk_profile_history + FOR ALL USING ( + risk_profile_id IN (SELECT id FROM policy.risk_profiles WHERE tenant_id = policy_app.require_current_tenant()) + ); + +CREATE POLICY explanations_tenant_isolation ON policy.explanations + FOR ALL USING ( + evaluation_run_id IN (SELECT id FROM policy.evaluation_runs WHERE tenant_id = policy_app.require_current_tenant()) + ); + +CREATE POLICY exception_events_tenant_isolation ON policy.exception_events + FOR ALL USING ( + EXISTS (SELECT 1 FROM policy.exceptions e WHERE e.exception_id = exception_events.exception_id) + ); + +CREATE POLICY exception_applications_tenant_isolation ON policy.exception_applications + FOR ALL USING (tenant_id = current_setting('app.tenant_id', true)::uuid); + +-- Unknowns RLS (uses UUID tenant_id) +CREATE POLICY unknowns_tenant_isolation ON policy.unknowns + USING (tenant_id::text = current_setting('app.current_tenant', true)) + WITH CHECK (tenant_id::text = current_setting('app.current_tenant', true)); + +-- Admin Bypass Role +DO $$ +BEGIN + IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'policy_admin') THEN + CREATE ROLE policy_admin WITH NOLOGIN BYPASSRLS; + END IF; +END +$$; + +-- Service Account Bypass for Unknowns (if role exists) +DO $$ +BEGIN + IF EXISTS (SELECT FROM pg_roles WHERE rolname = 'stellaops_service') THEN + CREATE POLICY unknowns_service_bypass ON policy.unknowns + TO stellaops_service USING (true) WITH CHECK (true); + END IF; +EXCEPTION WHEN others THEN NULL; +END +$$; + +-- ============================================================================ +-- Seed Data +-- ============================================================================ + +-- Default EPSS thresholds +INSERT INTO policy.epss_thresholds (tenant_id, name, is_default, thresholds, kev_bonus, description) +VALUES ( + '00000000-0000-0000-0000-000000000000'::uuid, + 'default', + TRUE, + '[{"percentile": 0.99, "bonus": 0.10, "description": "Top 1% most likely to be exploited"}, {"percentile": 0.90, "bonus": 0.05, "description": "Top 10% exploitation probability"}, {"percentile": 0.50, "bonus": 0.02, "description": "Above median exploitation probability"}]'::jsonb, + 0.20, + 'Default EPSS bonus thresholds per StellaOps standard risk formula' +) ON CONFLICT DO NOTHING; + +-- Default approval rules +INSERT INTO policy.exception_approval_rules + (id, tenant_id, name, description, gate_level, min_approvers, required_roles, + max_ttl_days, allow_self_approval, require_evidence, min_rationale_length, priority) +VALUES + (gen_random_uuid(), '__default__', 'g0_auto', + 'Informational findings - auto-approved', 0, 0, '{}', + 90, true, false, 0, 100), + (gen_random_uuid(), '__default__', 'g1_peer', + 'Low severity - peer review required', 1, 1, '{}', + 60, true, false, 20, 100), + (gen_random_uuid(), '__default__', 'g2_owner', + 'Medium severity - code owner approval required', 2, 1, ARRAY['code-owner'], + 30, false, true, 50, 100), + (gen_random_uuid(), '__default__', 'g3_leadership', + 'High severity - leadership approval required', 3, 2, ARRAY['delivery-manager', 'product-manager'], + 14, false, true, 100, 100), + (gen_random_uuid(), '__default__', 'g4_executive', + 'Critical severity - executive approval required', 4, 3, ARRAY['ciso', 'delivery-manager', 'product-manager'], + 7, false, true, 200, 100) +ON CONFLICT DO NOTHING; diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/002_cvss_receipts.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/002_cvss_receipts.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/002_cvss_receipts.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/002_cvss_receipts.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/003_snapshots_violations.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/003_snapshots_violations.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/003_snapshots_violations.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/003_snapshots_violations.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/004_epss_risk_scores.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/004_epss_risk_scores.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/004_epss_risk_scores.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/004_epss_risk_scores.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/005_cvss_multiversion.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/005_cvss_multiversion.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/005_cvss_multiversion.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/005_cvss_multiversion.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/006_enable_rls.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/006_enable_rls.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/006_enable_rls.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/006_enable_rls.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/007_unknowns_registry.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/007_unknowns_registry.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/007_unknowns_registry.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/007_unknowns_registry.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/008_exception_objects.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/008_exception_objects.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/008_exception_objects.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/008_exception_objects.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/009_exception_applications.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/009_exception_applications.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/009_exception_applications.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/009_exception_applications.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/010_recheck_evidence.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/010_recheck_evidence.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/010_recheck_evidence.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/010_recheck_evidence.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/010_unknowns_blast_radius_containment.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/010_unknowns_blast_radius_containment.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/010_unknowns_blast_radius_containment.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/010_unknowns_blast_radius_containment.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/011_unknowns_reason_codes.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/011_unknowns_reason_codes.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/011_unknowns_reason_codes.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/011_unknowns_reason_codes.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/012_budget_ledger.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/012_budget_ledger.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/012_budget_ledger.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/012_budget_ledger.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/013_exception_approval.sql b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/013_exception_approval.sql similarity index 100% rename from src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/013_exception_approval.sql rename to src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/013_exception_approval.sql diff --git a/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/README.md b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/README.md new file mode 100644 index 000000000..03975fd7d --- /dev/null +++ b/src/Policy/__Libraries/StellaOps.Policy.Storage.Postgres/Migrations/_archived/pre_1.0/README.md @@ -0,0 +1,34 @@ +# Archived Pre-1.0 Migrations + +This directory contains the original migrations that were compacted into `001_initial_schema.sql` +for the 1.0.0 release. + +## Original Files +- `001_initial_schema.sql` - Packs, rules, risk profiles, evaluation runs +- `002_cvss_receipts.sql` - CVSS scoring receipts +- `003_snapshots_violations.sql` - Policy snapshots, violation events +- `004_epss_risk_scores.sql` - EPSS scores, combined risk scoring +- `005_cvss_multiversion.sql` - CVSS v2/v3/v4 support +- `006_enable_rls.sql` - Row-Level Security +- `007_unknowns_registry.sql` - Unknowns tracking +- `008_exception_objects.sql` - Exception enhancements +- `009_exception_applications.sql` - Exception application records +- `010_recheck_evidence.sql` - Recheck policies, evidence hooks +- `010_unknowns_blast_radius_containment.sql` - Containment columns (duplicate prefix) +- `011_unknowns_reason_codes.sql` - Reason codes and hints +- `012_budget_ledger.sql` - Risk budget tracking +- `013_exception_approval.sql` - Approval workflow + +## Why Archived +Pre-1.0, the schema evolved incrementally. For 1.0.0, migrations were compacted into a single +initial schema to: +- Simplify new deployments +- Reduce startup time +- Provide cleaner upgrade path + +## For Existing Deployments +If upgrading from pre-1.0, run the reset script directly with psql: +```bash +psql -h -U -d -f devops/scripts/migrations-reset-pre-1.0.sql +``` +This updates `schema_migrations` to recognize the compacted schema. diff --git a/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/GatewayActivationTests.cs b/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/GatewayActivationTests.cs index 69283c171..76d557c7a 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/GatewayActivationTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/GatewayActivationTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Net; using System.Net.Http.Headers; @@ -360,7 +360,6 @@ public sealed class GatewayActivationTests using var client = factory.CreateClient(); -using StellaOps.TestKit; try { var response = await client.PostAsJsonAsync( diff --git a/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyEngineClientTests.cs b/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyEngineClientTests.cs index 1040a05c1..3dd3492d0 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyEngineClientTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyEngineClientTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Net; @@ -70,7 +70,6 @@ public class PolicyEngineClientTests { using var metrics = new PolicyGatewayMetrics(); using var listener = new MeterListener(); -using StellaOps.TestKit; var measurements = new List<(long Value, string Outcome, string Source)>(); var latencies = new List<(double Value, string Outcome, string Source)>(); diff --git a/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyGatewayDpopProofGeneratorTests.cs b/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyGatewayDpopProofGeneratorTests.cs index a764db831..c26fbdd2c 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyGatewayDpopProofGeneratorTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Gateway.Tests/PolicyGatewayDpopProofGeneratorTests.cs @@ -1,4 +1,4 @@ -using System.Globalization; +using System.Globalization; using System.IdentityModel.Tokens.Jwt; using System.Net.Http; using System.Security.Cryptography; @@ -125,7 +125,6 @@ public sealed class PolicyGatewayDpopProofGeneratorTests private static string CreateEcKey(DirectoryInfo directory, ECCurve curve) { using var ecdsa = ECDsa.Create(curve); -using StellaOps.TestKit; var privateKey = ecdsa.ExportPkcs8PrivateKey(); var pem = PemEncoding.Write("PRIVATE KEY", privateKey); var path = Path.Combine(directory.FullName, "policy-gateway-dpop.pem"); diff --git a/src/Policy/__Tests/StellaOps.Policy.RiskProfile.Tests/RiskProfileCanonicalizerTests.cs b/src/Policy/__Tests/StellaOps.Policy.RiskProfile.Tests/RiskProfileCanonicalizerTests.cs index 1a931280f..2f9e105e8 100644 --- a/src/Policy/__Tests/StellaOps.Policy.RiskProfile.Tests/RiskProfileCanonicalizerTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.RiskProfile.Tests/RiskProfileCanonicalizerTests.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Text.Json; using StellaOps.Policy.RiskProfile.Canonicalization; using Xunit; @@ -73,7 +73,6 @@ public class RiskProfileCanonicalizerTests var merged = RiskProfileCanonicalizer.Merge(baseProfile, overlay); using var doc = JsonDocument.Parse(merged); -using StellaOps.TestKit; var root = doc.RootElement; Assert.Equal(2, root.GetProperty("signals").GetArrayLength()); diff --git a/src/Policy/__Tests/StellaOps.Policy.Scoring.Tests/CvssPolicyLoaderTests.cs b/src/Policy/__Tests/StellaOps.Policy.Scoring.Tests/CvssPolicyLoaderTests.cs index ec957ad56..c6c85b212 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Scoring.Tests/CvssPolicyLoaderTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Scoring.Tests/CvssPolicyLoaderTests.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using System.Text.Json; using FluentAssertions; using StellaOps.Policy.Scoring.Policies; @@ -80,7 +80,6 @@ public sealed class CvssPolicyLoaderTests stream.Seek(0, SeekOrigin.Begin); using var finalDoc = JsonDocument.Parse(stream); -using StellaOps.TestKit; return finalDoc.RootElement.Clone(); } } diff --git a/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/PostgresExceptionApplicationRepositoryTests.cs b/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/PostgresExceptionApplicationRepositoryTests.cs index c247a9f22..d9167dabd 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/PostgresExceptionApplicationRepositoryTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/PostgresExceptionApplicationRepositoryTests.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) StellaOps. All rights reserved. // Licensed under the AGPL-3.0-or-later license. // @@ -42,7 +42,6 @@ public sealed class PostgresExceptionApplicationRepositoryTests : IAsyncLifetime // Set search path to include the test schema await using var conn = await _dataSource.OpenConnectionAsync(); -using StellaOps.TestKit; await using var cmd = new NpgsqlCommand($"SET search_path TO {_fixture.SchemaName}, public;", conn); await cmd.ExecuteNonQueryAsync(); } @@ -175,4 +174,4 @@ using StellaOps.TestKit; string? vulnId = null, string eff = "suppress") => ExceptionApplication.Create(_tenantId, excId, findId, "affected", "not_affected", "test", eff, vulnId); -} \ No newline at end of file +} diff --git a/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/RecheckEvidenceMigrationTests.cs b/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/RecheckEvidenceMigrationTests.cs index f2d0448c6..e1ca20ae4 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/RecheckEvidenceMigrationTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/RecheckEvidenceMigrationTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Npgsql; @@ -42,7 +42,6 @@ public sealed class RecheckEvidenceMigrationTests : IAsyncLifetime private static async Task AssertTableExistsAsync(NpgsqlConnection connection, string tableName) { await using var command = new NpgsqlCommand("SELECT to_regclass(@name)", connection); -using StellaOps.TestKit; command.Parameters.AddWithValue("name", tableName); var result = await command.ExecuteScalarAsync(); result.Should().NotBeNull($"{tableName} should exist after migrations"); diff --git a/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/UnknownsRepositoryTests.cs b/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/UnknownsRepositoryTests.cs index 6711f7bfe..4ff8ed4b8 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/UnknownsRepositoryTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Storage.Postgres.Tests/UnknownsRepositoryTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.Policy.Storage.Postgres; @@ -64,7 +64,6 @@ public sealed class UnknownsRepositoryTests : IAsyncLifetime public async Task UpdateAsync_PersistsReasonCodeAndAssumptions() { await using var connection = await _dataSource.OpenConnectionAsync(_tenantId.ToString()); -using StellaOps.TestKit; var repository = new UnknownsRepository(connection); var now = new DateTimeOffset(2025, 2, 3, 4, 5, 6, TimeSpan.Zero); diff --git a/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyBinderTests.cs b/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyBinderTests.cs index 3593a86eb..c7d165961 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyBinderTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyBinderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Threading; @@ -141,7 +141,6 @@ public sealed class PolicyBinderTests { using var output = new StringWriter(); using var error = new StringWriter(); -using StellaOps.TestKit; var cli = new PolicyValidationCli(output, error); var options = new PolicyValidationCliOptions { diff --git a/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyScoringConfigTests.cs b/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyScoringConfigTests.cs index ebfc4a46a..e09976a82 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyScoringConfigTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyScoringConfigTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using Xunit; @@ -60,7 +60,6 @@ public sealed class PolicyScoringConfigTests using var stream = assembly.GetManifestResourceStream("StellaOps.Policy.Schemas.policy-scoring-default.json") ?? throw new InvalidOperationException("Unable to locate embedded scoring default resource."); using var reader = new StreamReader(stream); -using StellaOps.TestKit; var json = reader.ReadToEnd(); var binding = PolicyScoringConfigBinder.Bind(json, PolicyDocumentFormat.Json); diff --git a/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyValidationCliTests.cs b/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyValidationCliTests.cs index e517b80a5..74db9e38d 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyValidationCliTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Tests/PolicyValidationCliTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using StellaOps.Policy; @@ -44,7 +44,6 @@ public class PolicyValidationCliTests using var output = new StringWriter(); using var error = new StringWriter(); -using StellaOps.TestKit; var cli = new PolicyValidationCli(output, error); var exit = await cli.RunAsync(options); diff --git a/src/Policy/__Tests/StellaOps.Policy.Tests/SplLayeringEngineTests.cs b/src/Policy/__Tests/StellaOps.Policy.Tests/SplLayeringEngineTests.cs index dc0b89fe8..045206b35 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Tests/SplLayeringEngineTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Tests/SplLayeringEngineTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Policy; using Xunit; @@ -61,7 +61,6 @@ public class SplLayeringEngineTests var merged = SplLayeringEngine.Merge(baseDoc, overlay); using var doc = JsonDocument.Parse(merged); -using StellaOps.TestKit; var root = doc.RootElement; Assert.True(root.TryGetProperty("extras", out var extras) && extras.TryGetProperty("foo", out var foo) && foo.GetInt32() == 1); diff --git a/src/Policy/__Tests/StellaOps.Policy.Tests/SplSchemaResourceTests.cs b/src/Policy/__Tests/StellaOps.Policy.Tests/SplSchemaResourceTests.cs index 79afb8075..2e3ecd4f0 100644 --- a/src/Policy/__Tests/StellaOps.Policy.Tests/SplSchemaResourceTests.cs +++ b/src/Policy/__Tests/StellaOps.Policy.Tests/SplSchemaResourceTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Policy; using Xunit; @@ -14,7 +14,6 @@ public class SplSchemaResourceTests { var schema = SplSchemaResource.GetSchema(); using var doc = JsonDocument.Parse(schema); -using StellaOps.TestKit; var match = doc.RootElement .GetProperty("properties") .GetProperty("spec") diff --git a/src/Registry/__Tests/StellaOps.Registry.TokenService.Tests/RegistryTokenIssuerTests.cs b/src/Registry/__Tests/StellaOps.Registry.TokenService.Tests/RegistryTokenIssuerTests.cs index 7496c4c25..7253d41a3 100644 --- a/src/Registry/__Tests/StellaOps.Registry.TokenService.Tests/RegistryTokenIssuerTests.cs +++ b/src/Registry/__Tests/StellaOps.Registry.TokenService.Tests/RegistryTokenIssuerTests.cs @@ -1,4 +1,4 @@ -using System.IdentityModel.Tokens.Jwt; +using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Security.Cryptography; using Microsoft.Extensions.Options; @@ -85,7 +85,6 @@ public sealed class RegistryTokenIssuerTests : IDisposable private string CreatePemKey() { using var rsa = RSA.Create(2048); -using StellaOps.TestKit; var builder = new StringWriter(); builder.WriteLine("-----BEGIN PRIVATE KEY-----"); builder.WriteLine(Convert.ToBase64String(rsa.ExportPkcs8PrivateKey(), Base64FormattingOptions.InsertLineBreaks)); diff --git a/src/SbomService/StellaOps.SbomService.Tests/SbomLedgerEndpointsTests.cs b/src/SbomService/StellaOps.SbomService.Tests/SbomLedgerEndpointsTests.cs index 1aaa11d7a..d10299f6d 100644 --- a/src/SbomService/StellaOps.SbomService.Tests/SbomLedgerEndpointsTests.cs +++ b/src/SbomService/StellaOps.SbomService.Tests/SbomLedgerEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text.Json; using FluentAssertions; @@ -93,7 +93,6 @@ public sealed class SbomLedgerEndpointsTests : IClassFixture= CURRENT_DATE - INTERVAL '30 days' +GROUP BY tenant_id; + +-- ============================================================================ +-- SCAN METRICS TABLES (In scanner schema) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS scanner.scan_metrics ( + metrics_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scan_id UUID NOT NULL UNIQUE, + tenant_id UUID NOT NULL, + surface_id UUID, + artifact_digest TEXT NOT NULL, + artifact_type TEXT NOT NULL, + replay_manifest_hash TEXT, + findings_sha256 TEXT NOT NULL, + vex_bundle_sha256 TEXT, + proof_bundle_sha256 TEXT, + sbom_sha256 TEXT, + policy_digest TEXT, + feed_snapshot_id TEXT, + started_at TIMESTAMPTZ NOT NULL, + finished_at TIMESTAMPTZ NOT NULL, + total_duration_ms INT NOT NULL GENERATED ALWAYS AS (EXTRACT(EPOCH FROM (finished_at - started_at)) * 1000) STORED, + t_ingest_ms INT NOT NULL DEFAULT 0, + t_analyze_ms INT NOT NULL DEFAULT 0, + t_reachability_ms INT NOT NULL DEFAULT 0, + t_vex_ms INT NOT NULL DEFAULT 0, + t_sign_ms INT NOT NULL DEFAULT 0, + t_publish_ms INT NOT NULL DEFAULT 0, + package_count INT, + finding_count INT, + vex_decision_count INT, + scanner_version TEXT NOT NULL, + scanner_image_digest TEXT, + is_replay BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT valid_timings CHECK ( + t_ingest_ms >= 0 AND t_analyze_ms >= 0 AND t_reachability_ms >= 0 AND + t_vex_ms >= 0 AND t_sign_ms >= 0 AND t_publish_ms >= 0 + ), + CONSTRAINT valid_artifact_type CHECK (artifact_type IN ('oci_image', 'tarball', 'directory', 'other')) +); + +CREATE INDEX IF NOT EXISTS idx_scan_metrics_tenant ON scanner.scan_metrics(tenant_id); +CREATE INDEX IF NOT EXISTS idx_scan_metrics_artifact ON scanner.scan_metrics(artifact_digest); +CREATE INDEX IF NOT EXISTS idx_scan_metrics_started ON scanner.scan_metrics(started_at); +CREATE INDEX IF NOT EXISTS idx_scan_metrics_surface ON scanner.scan_metrics(surface_id); +CREATE INDEX IF NOT EXISTS idx_scan_metrics_replay ON scanner.scan_metrics(is_replay); +CREATE INDEX IF NOT EXISTS idx_scan_metrics_tenant_started ON scanner.scan_metrics(tenant_id, started_at); + +CREATE TABLE IF NOT EXISTS scanner.execution_phases ( + id BIGSERIAL PRIMARY KEY, + metrics_id UUID NOT NULL REFERENCES scanner.scan_metrics(metrics_id) ON DELETE CASCADE, + phase_name TEXT NOT NULL, + phase_order INT NOT NULL, + started_at TIMESTAMPTZ NOT NULL, + finished_at TIMESTAMPTZ NOT NULL, + duration_ms INT NOT NULL GENERATED ALWAYS AS (EXTRACT(EPOCH FROM (finished_at - started_at)) * 1000) STORED, + success BOOLEAN NOT NULL, + error_code TEXT, + error_message TEXT, + phase_metrics JSONB, + CONSTRAINT valid_phase_name CHECK (phase_name IN ('ingest', 'analyze', 'reachability', 'vex', 'sign', 'publish', 'other')) +); + +CREATE INDEX IF NOT EXISTS idx_execution_phases_metrics ON scanner.execution_phases(metrics_id); +CREATE INDEX IF NOT EXISTS idx_execution_phases_name ON scanner.execution_phases(phase_name); + +-- ============================================================================ +-- SMART-DIFF TABLES (scanner schema) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS scanner.risk_state_snapshots ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + vuln_id TEXT NOT NULL, + purl TEXT NOT NULL, + scan_id TEXT NOT NULL, + captured_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + reachable BOOLEAN, + lattice_state TEXT, + vex_status scanner.vex_status_type NOT NULL DEFAULT 'unknown', + in_affected_range BOOLEAN, + kev BOOLEAN NOT NULL DEFAULT FALSE, + epss_score NUMERIC(5, 4), + policy_flags TEXT[] DEFAULT '{}', + policy_decision scanner.policy_decision_type, + state_hash TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT risk_state_unique_per_scan UNIQUE (tenant_id, scan_id, vuln_id, purl) +); + +CREATE INDEX IF NOT EXISTS idx_risk_state_tenant_finding ON scanner.risk_state_snapshots (tenant_id, vuln_id, purl); +CREATE INDEX IF NOT EXISTS idx_risk_state_scan ON scanner.risk_state_snapshots (scan_id); +CREATE INDEX IF NOT EXISTS idx_risk_state_captured_at ON scanner.risk_state_snapshots USING BRIN (captured_at); +CREATE INDEX IF NOT EXISTS idx_risk_state_hash ON scanner.risk_state_snapshots (state_hash); + +ALTER TABLE scanner.risk_state_snapshots ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS scanner.material_risk_changes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + vuln_id TEXT NOT NULL, + purl TEXT NOT NULL, + scan_id TEXT NOT NULL, + has_material_change BOOLEAN NOT NULL DEFAULT FALSE, + priority_score NUMERIC(12, 4) NOT NULL DEFAULT 0, + previous_state_hash TEXT NOT NULL, + current_state_hash TEXT NOT NULL, + changes JSONB NOT NULL DEFAULT '[]', + detected_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + base_scan_id TEXT, + cause TEXT, + cause_kind TEXT, + path_nodes JSONB, + associated_vulns JSONB, + CONSTRAINT material_change_unique_per_scan UNIQUE (tenant_id, scan_id, vuln_id, purl) +); + +CREATE INDEX IF NOT EXISTS idx_material_changes_tenant_scan ON scanner.material_risk_changes (tenant_id, scan_id); +CREATE INDEX IF NOT EXISTS idx_material_changes_priority ON scanner.material_risk_changes (priority_score DESC) WHERE has_material_change = TRUE; +CREATE INDEX IF NOT EXISTS idx_material_changes_detected_at ON scanner.material_risk_changes USING BRIN (detected_at); +CREATE INDEX IF NOT EXISTS idx_material_changes_changes_gin ON scanner.material_risk_changes USING GIN (changes); +CREATE INDEX IF NOT EXISTS idx_material_risk_changes_cause_kind ON scanner.material_risk_changes(cause_kind) WHERE cause_kind IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_material_risk_changes_base_scan ON scanner.material_risk_changes(base_scan_id) WHERE base_scan_id IS NOT NULL; + +ALTER TABLE scanner.material_risk_changes ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS scanner.vex_candidates ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + candidate_id TEXT NOT NULL UNIQUE, + tenant_id UUID NOT NULL, + vuln_id TEXT NOT NULL, + purl TEXT NOT NULL, + image_digest TEXT NOT NULL, + suggested_status scanner.vex_status_type NOT NULL, + justification scanner.vex_justification NOT NULL, + rationale TEXT NOT NULL, + evidence_links JSONB NOT NULL DEFAULT '[]', + confidence NUMERIC(4, 3) NOT NULL, + generated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ NOT NULL, + requires_review BOOLEAN NOT NULL DEFAULT TRUE, + review_action scanner.vex_review_action, + reviewed_by TEXT, + reviewed_at TIMESTAMPTZ, + review_comment TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_vex_candidates_tenant_image ON scanner.vex_candidates (tenant_id, image_digest); +CREATE INDEX IF NOT EXISTS idx_vex_candidates_pending_review ON scanner.vex_candidates (tenant_id, requires_review, confidence DESC) WHERE requires_review = TRUE; +CREATE INDEX IF NOT EXISTS idx_vex_candidates_expires ON scanner.vex_candidates (expires_at); +CREATE INDEX IF NOT EXISTS idx_vex_candidates_candidate_id ON scanner.vex_candidates (candidate_id); +CREATE INDEX IF NOT EXISTS idx_vex_candidates_evidence_gin ON scanner.vex_candidates USING GIN (evidence_links); + +ALTER TABLE scanner.vex_candidates ENABLE ROW LEVEL SECURITY; + +-- ============================================================================ +-- SMART-DIFF TABLES (Active schema for isolation) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS risk_state_snapshots ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + vuln_id TEXT NOT NULL, + purl TEXT NOT NULL, + scan_id TEXT NOT NULL, + captured_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + reachable BOOLEAN, + lattice_state TEXT, + vex_status vex_status_type NOT NULL DEFAULT 'unknown', + in_affected_range BOOLEAN, + kev BOOLEAN NOT NULL DEFAULT FALSE, + epss_score NUMERIC(5, 4), + policy_flags TEXT[] DEFAULT '{}', + policy_decision policy_decision_type, + state_hash TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT risk_state_unique_per_scan UNIQUE (tenant_id, scan_id, vuln_id, purl) +); + +CREATE INDEX IF NOT EXISTS idx_risk_state_tenant_finding ON risk_state_snapshots (tenant_id, vuln_id, purl); +CREATE INDEX IF NOT EXISTS idx_risk_state_scan ON risk_state_snapshots (scan_id); +CREATE INDEX IF NOT EXISTS idx_risk_state_captured_at ON risk_state_snapshots USING BRIN (captured_at); +CREATE INDEX IF NOT EXISTS idx_risk_state_hash ON risk_state_snapshots (state_hash); + +ALTER TABLE risk_state_snapshots ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS material_risk_changes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + vuln_id TEXT NOT NULL, + purl TEXT NOT NULL, + scan_id TEXT NOT NULL, + has_material_change BOOLEAN NOT NULL DEFAULT FALSE, + priority_score NUMERIC(12, 4) NOT NULL DEFAULT 0, + previous_state_hash TEXT NOT NULL, + current_state_hash TEXT NOT NULL, + changes JSONB NOT NULL DEFAULT '[]', + detected_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + base_scan_id TEXT, + cause TEXT, + cause_kind TEXT, + path_nodes JSONB, + associated_vulns JSONB, + CONSTRAINT material_change_unique_per_scan UNIQUE (tenant_id, scan_id, vuln_id, purl) +); + +CREATE INDEX IF NOT EXISTS idx_material_changes_tenant_scan ON material_risk_changes (tenant_id, scan_id); +CREATE INDEX IF NOT EXISTS idx_material_changes_priority ON material_risk_changes (priority_score DESC) WHERE has_material_change = TRUE; +CREATE INDEX IF NOT EXISTS idx_material_changes_detected_at ON material_risk_changes USING BRIN (detected_at); +CREATE INDEX IF NOT EXISTS idx_material_changes_changes_gin ON material_risk_changes USING GIN (changes); + +ALTER TABLE material_risk_changes ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS vex_candidates ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + candidate_id TEXT NOT NULL UNIQUE, + tenant_id UUID NOT NULL, + vuln_id TEXT NOT NULL, + purl TEXT NOT NULL, + image_digest TEXT NOT NULL, + suggested_status vex_status_type NOT NULL, + justification vex_justification NOT NULL, + rationale TEXT NOT NULL, + evidence_links JSONB NOT NULL DEFAULT '[]', + confidence NUMERIC(4, 3) NOT NULL, + generated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ NOT NULL, + requires_review BOOLEAN NOT NULL DEFAULT TRUE, + review_action vex_review_action, + reviewed_by TEXT, + reviewed_at TIMESTAMPTZ, + review_comment TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_vex_candidates_tenant_image ON vex_candidates (tenant_id, image_digest); +CREATE INDEX IF NOT EXISTS idx_vex_candidates_pending_review ON vex_candidates (tenant_id, requires_review, confidence DESC) WHERE requires_review = TRUE; +CREATE INDEX IF NOT EXISTS idx_vex_candidates_expires ON vex_candidates (expires_at); +CREATE INDEX IF NOT EXISTS idx_vex_candidates_candidate_id ON vex_candidates (candidate_id); +CREATE INDEX IF NOT EXISTS idx_vex_candidates_evidence_gin ON vex_candidates USING GIN (evidence_links); + +ALTER TABLE vex_candidates ENABLE ROW LEVEL SECURITY; + +-- ============================================================================ +-- SCORE REPLAY TABLES +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS scan_manifest ( + manifest_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scan_id UUID NOT NULL REFERENCES scans(scan_id) ON DELETE CASCADE, + manifest_hash VARCHAR(128) NOT NULL, + sbom_hash VARCHAR(128) NOT NULL, + rules_hash VARCHAR(128) NOT NULL, + feed_hash VARCHAR(128) NOT NULL, + policy_hash VARCHAR(128) NOT NULL, + scan_started_at TIMESTAMPTZ NOT NULL, + scan_completed_at TIMESTAMPTZ, + manifest_content JSONB NOT NULL, + scanner_version VARCHAR(64) NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_scan_manifest_hash ON scan_manifest(manifest_hash); +CREATE INDEX IF NOT EXISTS idx_scan_manifest_scan_id ON scan_manifest(scan_id); +CREATE INDEX IF NOT EXISTS idx_scan_manifest_created_at ON scan_manifest(created_at DESC); + +CREATE TABLE IF NOT EXISTS proof_bundle ( + scan_id UUID NOT NULL REFERENCES scans(scan_id) ON DELETE CASCADE, + root_hash VARCHAR(128) NOT NULL, + bundle_type VARCHAR(32) NOT NULL DEFAULT 'standard', + dsse_envelope JSONB, + signature_keyid VARCHAR(256), + signature_algorithm VARCHAR(64), + bundle_content BYTEA, + bundle_hash VARCHAR(128) NOT NULL, + ledger_hash VARCHAR(128), + manifest_hash VARCHAR(128), + sbom_hash VARCHAR(128), + vex_hash VARCHAR(128), + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + expires_at TIMESTAMPTZ, + PRIMARY KEY (scan_id, root_hash) +); + +CREATE INDEX IF NOT EXISTS idx_proof_bundle_root_hash ON proof_bundle(root_hash); +CREATE INDEX IF NOT EXISTS idx_proof_bundle_created_at ON proof_bundle(created_at DESC); +CREATE INDEX IF NOT EXISTS idx_proof_bundle_expires_at ON proof_bundle(expires_at) WHERE expires_at IS NOT NULL; + +CREATE TABLE IF NOT EXISTS score_replay_history ( + replay_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scan_id UUID NOT NULL REFERENCES scans(scan_id) ON DELETE CASCADE, + trigger_type VARCHAR(32) NOT NULL, + trigger_reference VARCHAR(256), + original_manifest_hash VARCHAR(128), + replayed_manifest_hash VARCHAR(128), + score_delta_json JSONB, + findings_added INT DEFAULT 0, + findings_removed INT DEFAULT 0, + findings_rescored INT DEFAULT 0, + replayed_at TIMESTAMPTZ NOT NULL DEFAULT now(), + duration_ms INT +); + +CREATE INDEX IF NOT EXISTS idx_score_replay_scan_id ON score_replay_history(scan_id); +CREATE INDEX IF NOT EXISTS idx_score_replay_replayed_at ON score_replay_history(replayed_at DESC); + +-- ============================================================================ +-- UNKNOWNS TABLE WITH ENRICHMENT +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS unknowns ( + unknown_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + artifact_digest TEXT NOT NULL, + vuln_id TEXT NOT NULL, + package_purl TEXT NOT NULL, + score DOUBLE PRECISION NOT NULL DEFAULT 0, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW(), + blast_dependents INT DEFAULT 0, + blast_net_facing BOOLEAN DEFAULT false, + blast_privilege TEXT DEFAULT 'user', + epss DOUBLE PRECISION, + kev BOOLEAN DEFAULT false, + containment_seccomp TEXT DEFAULT 'unknown', + containment_fs TEXT DEFAULT 'unknown', + proof_ref TEXT, + evidence_scarcity DOUBLE PRECISION DEFAULT 0.5, + CONSTRAINT chk_unknowns_privilege CHECK (blast_privilege IN ('root', 'user', 'unprivileged')), + CONSTRAINT chk_unknowns_seccomp CHECK (containment_seccomp IN ('enforced', 'permissive', 'unknown')), + CONSTRAINT chk_unknowns_fs CHECK (containment_fs IN ('ro', 'rw', 'unknown')) +); + +CREATE INDEX IF NOT EXISTS ix_unknowns_tenant_artifact ON unknowns(tenant_id, artifact_digest); +CREATE INDEX IF NOT EXISTS ix_unknowns_created_at ON unknowns(created_at_utc DESC); +CREATE INDEX IF NOT EXISTS ix_unknowns_score_desc ON unknowns(score DESC); +CREATE INDEX IF NOT EXISTS ix_unknowns_artifact_score ON unknowns(artifact_digest, score DESC); +CREATE INDEX IF NOT EXISTS ix_unknowns_containment ON unknowns(containment_seccomp, containment_fs); +CREATE INDEX IF NOT EXISTS ix_unknowns_kev ON unknowns(kev) WHERE kev = true; + +-- ============================================================================ +-- SCAN FINDINGS TABLE +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS scan_findings ( + finding_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scan_id UUID NOT NULL, + tenant_id UUID NOT NULL, + vuln_id TEXT NOT NULL, + package_purl TEXT NOT NULL, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW(), + epss_score_at_scan DOUBLE PRECISION, + epss_percentile_at_scan DOUBLE PRECISION, + epss_model_date_at_scan DATE, + epss_import_run_id_at_scan UUID +); + +CREATE INDEX IF NOT EXISTS ix_scan_findings_scan_id ON scan_findings(scan_id); +CREATE INDEX IF NOT EXISTS ix_scan_findings_tenant_vuln ON scan_findings(tenant_id, vuln_id); + +-- ============================================================================ +-- EPSS TABLES (Partitioned) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS epss_import_runs ( + import_run_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + model_date DATE NOT NULL, + source_uri TEXT NOT NULL, + retrieved_at TIMESTAMPTZ NOT NULL DEFAULT now(), + file_sha256 TEXT NOT NULL, + decompressed_sha256 TEXT, + row_count INT NOT NULL, + model_version_tag TEXT, + published_date DATE, + status TEXT NOT NULL CHECK (status IN ('PENDING', 'SUCCEEDED', 'FAILED')), + error TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + CONSTRAINT epss_import_runs_model_date_unique UNIQUE (model_date) +); + +CREATE INDEX IF NOT EXISTS idx_epss_import_runs_model_date ON epss_import_runs (model_date DESC); +CREATE INDEX IF NOT EXISTS idx_epss_import_runs_status ON epss_import_runs (status); + +CREATE TABLE IF NOT EXISTS epss_scores ( + model_date DATE NOT NULL, + cve_id TEXT NOT NULL, + epss_score DOUBLE PRECISION NOT NULL CHECK (epss_score >= 0 AND epss_score <= 1), + percentile DOUBLE PRECISION NOT NULL CHECK (percentile >= 0 AND percentile <= 1), + import_run_id UUID NOT NULL REFERENCES epss_import_runs(import_run_id), + PRIMARY KEY (model_date, cve_id) +) PARTITION BY RANGE (model_date); + +CREATE TABLE IF NOT EXISTS epss_scores_default PARTITION OF epss_scores DEFAULT; + +CREATE INDEX IF NOT EXISTS idx_epss_scores_cve_id ON epss_scores (cve_id); +CREATE INDEX IF NOT EXISTS idx_epss_scores_score_desc ON epss_scores (epss_score DESC); +CREATE INDEX IF NOT EXISTS idx_epss_scores_cve_date ON epss_scores (cve_id, model_date DESC); + +CREATE TABLE IF NOT EXISTS epss_current ( + cve_id TEXT PRIMARY KEY, + epss_score DOUBLE PRECISION NOT NULL CHECK (epss_score >= 0 AND epss_score <= 1), + percentile DOUBLE PRECISION NOT NULL CHECK (percentile >= 0 AND percentile <= 1), + model_date DATE NOT NULL, + import_run_id UUID NOT NULL REFERENCES epss_import_runs(import_run_id), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_epss_current_score_desc ON epss_current (epss_score DESC); +CREATE INDEX IF NOT EXISTS idx_epss_current_percentile_desc ON epss_current (percentile DESC); +CREATE INDEX IF NOT EXISTS idx_epss_current_model_date ON epss_current (model_date); + +CREATE TABLE IF NOT EXISTS epss_changes ( + model_date DATE NOT NULL, + cve_id TEXT NOT NULL, + old_score DOUBLE PRECISION, + new_score DOUBLE PRECISION NOT NULL, + delta_score DOUBLE PRECISION, + old_percentile DOUBLE PRECISION, + new_percentile DOUBLE PRECISION NOT NULL, + delta_percentile DOUBLE PRECISION, + flags INT NOT NULL DEFAULT 0, + import_run_id UUID NOT NULL REFERENCES epss_import_runs(import_run_id), + PRIMARY KEY (model_date, cve_id) +) PARTITION BY RANGE (model_date); + +CREATE TABLE IF NOT EXISTS epss_changes_default PARTITION OF epss_changes DEFAULT; + +CREATE INDEX IF NOT EXISTS idx_epss_changes_flags ON epss_changes (flags) WHERE flags > 0; +CREATE INDEX IF NOT EXISTS idx_epss_changes_delta ON epss_changes (ABS(delta_score) DESC) WHERE delta_score IS NOT NULL; + +-- ============================================================================ +-- EPSS RAW LAYER +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS epss_raw ( + raw_id BIGSERIAL PRIMARY KEY, + source_uri TEXT NOT NULL, + asof_date DATE NOT NULL, + ingestion_ts TIMESTAMPTZ NOT NULL DEFAULT now(), + payload JSONB NOT NULL, + payload_sha256 BYTEA NOT NULL, + header_comment TEXT, + model_version TEXT, + published_date DATE, + row_count INT NOT NULL, + compressed_size BIGINT, + decompressed_size BIGINT, + import_run_id UUID REFERENCES epss_import_runs(import_run_id), + CONSTRAINT epss_raw_unique UNIQUE (source_uri, asof_date, payload_sha256) +); + +CREATE INDEX IF NOT EXISTS idx_epss_raw_asof ON epss_raw (asof_date DESC); +CREATE INDEX IF NOT EXISTS idx_epss_raw_model ON epss_raw (model_version); +CREATE INDEX IF NOT EXISTS idx_epss_raw_import_run ON epss_raw (import_run_id); + +-- ============================================================================ +-- EPSS SIGNAL LAYER +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS epss_signal ( + signal_id BIGSERIAL PRIMARY KEY, + tenant_id UUID NOT NULL, + model_date DATE NOT NULL, + cve_id TEXT NOT NULL, + event_type TEXT NOT NULL, + risk_band TEXT, + epss_score DOUBLE PRECISION, + epss_delta DOUBLE PRECISION, + percentile DOUBLE PRECISION, + percentile_delta DOUBLE PRECISION, + is_model_change BOOLEAN NOT NULL DEFAULT false, + model_version TEXT, + dedupe_key TEXT NOT NULL, + explain_hash BYTEA NOT NULL, + payload JSONB NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + CONSTRAINT epss_signal_dedupe UNIQUE (tenant_id, dedupe_key) +); + +CREATE INDEX IF NOT EXISTS idx_epss_signal_tenant_date ON epss_signal (tenant_id, model_date DESC); +CREATE INDEX IF NOT EXISTS idx_epss_signal_tenant_cve ON epss_signal (tenant_id, cve_id, model_date DESC); +CREATE INDEX IF NOT EXISTS idx_epss_signal_event_type ON epss_signal (tenant_id, event_type, model_date DESC); +CREATE INDEX IF NOT EXISTS idx_epss_signal_risk_band ON epss_signal (tenant_id, risk_band, model_date DESC) WHERE risk_band IN ('CRITICAL', 'HIGH'); +CREATE INDEX IF NOT EXISTS idx_epss_signal_model_change ON epss_signal (model_date) WHERE is_model_change = true; + +CREATE TABLE IF NOT EXISTS epss_signal_config ( + config_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + critical_percentile DOUBLE PRECISION NOT NULL DEFAULT 0.995, + high_percentile DOUBLE PRECISION NOT NULL DEFAULT 0.99, + medium_percentile DOUBLE PRECISION NOT NULL DEFAULT 0.90, + big_jump_delta DOUBLE PRECISION NOT NULL DEFAULT 0.10, + suppress_on_model_change BOOLEAN NOT NULL DEFAULT true, + enabled_event_types TEXT[] NOT NULL DEFAULT ARRAY['RISK_SPIKE', 'BAND_CHANGE', 'NEW_HIGH'], + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), + CONSTRAINT epss_signal_config_tenant_unique UNIQUE (tenant_id) +); + +-- ============================================================================ +-- CALL GRAPH & REACHABILITY TABLES +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS call_graph_snapshots ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + scan_id TEXT NOT NULL, + language TEXT NOT NULL, + graph_digest TEXT NOT NULL, + extracted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + node_count INT NOT NULL, + edge_count INT NOT NULL, + entrypoint_count INT NOT NULL, + sink_count INT NOT NULL, + snapshot_json JSONB NOT NULL, + CONSTRAINT call_graph_snapshot_unique_per_scan UNIQUE (tenant_id, scan_id, language, graph_digest) +); + +CREATE INDEX IF NOT EXISTS idx_call_graph_snapshots_tenant_scan ON call_graph_snapshots (tenant_id, scan_id, language); +CREATE INDEX IF NOT EXISTS idx_call_graph_snapshots_graph_digest ON call_graph_snapshots (graph_digest); +CREATE INDEX IF NOT EXISTS idx_call_graph_snapshots_extracted_at ON call_graph_snapshots USING BRIN (extracted_at); + +ALTER TABLE call_graph_snapshots ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS reachability_results ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + scan_id TEXT NOT NULL, + language TEXT NOT NULL, + graph_digest TEXT NOT NULL, + result_digest TEXT NOT NULL, + computed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + reachable_node_count INT NOT NULL, + reachable_sink_count INT NOT NULL, + result_json JSONB NOT NULL, + CONSTRAINT reachability_result_unique_per_scan UNIQUE (tenant_id, scan_id, language, graph_digest, result_digest) +); + +CREATE INDEX IF NOT EXISTS idx_reachability_results_tenant_scan ON reachability_results (tenant_id, scan_id, language); +CREATE INDEX IF NOT EXISTS idx_reachability_results_graph_digest ON reachability_results (graph_digest); +CREATE INDEX IF NOT EXISTS idx_reachability_results_computed_at ON reachability_results USING BRIN (computed_at); + +ALTER TABLE reachability_results ENABLE ROW LEVEL SECURITY; + +-- ============================================================================ +-- REACHABILITY DRIFT TABLES +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS code_changes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + scan_id TEXT NOT NULL, + base_scan_id TEXT NOT NULL, + language TEXT NOT NULL, + node_id TEXT, + file TEXT NOT NULL, + symbol TEXT NOT NULL, + change_kind TEXT NOT NULL, + details JSONB, + detected_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT code_changes_unique UNIQUE (tenant_id, scan_id, base_scan_id, language, symbol, change_kind) +); + +CREATE INDEX IF NOT EXISTS idx_code_changes_tenant_scan ON code_changes (tenant_id, scan_id, base_scan_id, language); +CREATE INDEX IF NOT EXISTS idx_code_changes_symbol ON code_changes (symbol); +CREATE INDEX IF NOT EXISTS idx_code_changes_kind ON code_changes (change_kind); +CREATE INDEX IF NOT EXISTS idx_code_changes_detected_at ON code_changes USING BRIN (detected_at); + +ALTER TABLE code_changes ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS reachability_drift_results ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + base_scan_id TEXT NOT NULL, + head_scan_id TEXT NOT NULL, + language TEXT NOT NULL, + newly_reachable_count INT NOT NULL DEFAULT 0, + newly_unreachable_count INT NOT NULL DEFAULT 0, + detected_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + result_digest TEXT NOT NULL, + CONSTRAINT reachability_drift_unique UNIQUE (tenant_id, base_scan_id, head_scan_id, language, result_digest) +); + +CREATE INDEX IF NOT EXISTS idx_reachability_drift_head ON reachability_drift_results (tenant_id, head_scan_id, language); +CREATE INDEX IF NOT EXISTS idx_reachability_drift_detected_at ON reachability_drift_results USING BRIN (detected_at); + +ALTER TABLE reachability_drift_results ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS drifted_sinks ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + drift_result_id UUID NOT NULL REFERENCES reachability_drift_results(id) ON DELETE CASCADE, + sink_node_id TEXT NOT NULL, + symbol TEXT NOT NULL, + sink_category TEXT NOT NULL, + direction TEXT NOT NULL, + cause_kind TEXT NOT NULL, + cause_description TEXT NOT NULL, + cause_symbol TEXT, + cause_file TEXT, + cause_line INT, + code_change_id UUID REFERENCES code_changes(id), + compressed_path JSONB NOT NULL, + associated_vulns JSONB, + CONSTRAINT drifted_sinks_unique UNIQUE (drift_result_id, sink_node_id) +); + +CREATE INDEX IF NOT EXISTS idx_drifted_sinks_drift ON drifted_sinks (drift_result_id); +CREATE INDEX IF NOT EXISTS idx_drifted_sinks_direction ON drifted_sinks (direction); +CREATE INDEX IF NOT EXISTS idx_drifted_sinks_category ON drifted_sinks (sink_category); + +ALTER TABLE drifted_sinks ENABLE ROW LEVEL SECURITY; + +-- ============================================================================ +-- CALL GRAPH INGESTION (API Idempotency) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS callgraph_ingestions ( + id TEXT PRIMARY KEY, + tenant_id UUID NOT NULL, + scan_id TEXT NOT NULL, + content_digest TEXT NOT NULL, + language TEXT NOT NULL, + node_count INT NOT NULL, + edge_count INT NOT NULL, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW(), + callgraph_json JSONB NOT NULL, + CONSTRAINT callgraph_ingestions_unique_per_scan UNIQUE (tenant_id, scan_id, content_digest) +); + +CREATE INDEX IF NOT EXISTS ix_callgraph_ingestions_scan ON callgraph_ingestions (tenant_id, scan_id, created_at_utc DESC, id); +CREATE INDEX IF NOT EXISTS ix_callgraph_ingestions_digest ON callgraph_ingestions (tenant_id, content_digest); + +-- ============================================================================ +-- WITNESS STORAGE (DSSE Path Proofs) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS scanner.witnesses ( + witness_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + witness_hash TEXT NOT NULL, + schema_version TEXT NOT NULL DEFAULT 'stellaops.witness.v1', + witness_type TEXT NOT NULL, + graph_hash TEXT NOT NULL, + scan_id UUID, + run_id UUID, + payload_json JSONB NOT NULL, + dsse_envelope JSONB, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + signed_at TIMESTAMPTZ, + signer_key_id TEXT, + entrypoint_fqn TEXT, + sink_cve TEXT, + CONSTRAINT uk_witness_hash UNIQUE (witness_hash) +); + +CREATE INDEX IF NOT EXISTS ix_witnesses_graph_hash ON scanner.witnesses (graph_hash); +CREATE INDEX IF NOT EXISTS ix_witnesses_scan_id ON scanner.witnesses (scan_id) WHERE scan_id IS NOT NULL; +CREATE INDEX IF NOT EXISTS ix_witnesses_sink_cve ON scanner.witnesses (sink_cve) WHERE sink_cve IS NOT NULL; +CREATE INDEX IF NOT EXISTS ix_witnesses_entrypoint ON scanner.witnesses (entrypoint_fqn) WHERE entrypoint_fqn IS NOT NULL; +CREATE INDEX IF NOT EXISTS ix_witnesses_created_at ON scanner.witnesses (created_at DESC); +CREATE INDEX IF NOT EXISTS ix_witnesses_payload_gin ON scanner.witnesses USING gin (payload_json jsonb_path_ops); + +CREATE TABLE IF NOT EXISTS scanner.witness_verifications ( + verification_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + witness_id UUID NOT NULL REFERENCES scanner.witnesses(witness_id), + verified_at TIMESTAMPTZ NOT NULL DEFAULT now(), + verified_by TEXT, + verification_status TEXT NOT NULL, + verification_error TEXT, + verifier_key_id TEXT +); + +CREATE INDEX IF NOT EXISTS ix_witness_verifications_witness_id ON scanner.witness_verifications (witness_id); + +-- ============================================================================ +-- VULNERABILITY SURFACES & TRIGGERS +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS vuln_surfaces ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL, + cve_id TEXT NOT NULL, + package_ecosystem TEXT NOT NULL, + package_name TEXT NOT NULL, + vuln_version TEXT NOT NULL, + fixed_version TEXT, + computed_at TIMESTAMPTZ NOT NULL DEFAULT now(), + computation_duration_ms INTEGER, + fingerprint_method TEXT NOT NULL, + total_methods_vuln INTEGER NOT NULL DEFAULT 0, + total_methods_fixed INTEGER NOT NULL DEFAULT 0, + changed_method_count INTEGER NOT NULL DEFAULT 0, + attestation_digest TEXT, + trigger_count INTEGER NOT NULL DEFAULT 0, + CONSTRAINT uq_vuln_surface_key UNIQUE (tenant_id, cve_id, package_ecosystem, package_name, vuln_version) +); + +CREATE INDEX IF NOT EXISTS idx_vuln_surfaces_cve ON vuln_surfaces(tenant_id, cve_id); +CREATE INDEX IF NOT EXISTS idx_vuln_surfaces_package ON vuln_surfaces(tenant_id, package_ecosystem, package_name); +CREATE INDEX IF NOT EXISTS idx_vuln_surfaces_computed_at ON vuln_surfaces(computed_at DESC); + +ALTER TABLE vuln_surfaces ENABLE ROW LEVEL SECURITY; + +CREATE TABLE IF NOT EXISTS vuln_surface_sinks ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + surface_id UUID NOT NULL REFERENCES vuln_surfaces(id) ON DELETE CASCADE, + method_key TEXT NOT NULL, + method_name TEXT NOT NULL, + declaring_type TEXT NOT NULL, + namespace TEXT, + change_type TEXT NOT NULL CHECK (change_type IN ('added', 'removed', 'modified')), + vuln_fingerprint TEXT, + fixed_fingerprint TEXT, + is_public BOOLEAN NOT NULL DEFAULT true, + parameter_count INTEGER, + return_type TEXT, + source_file TEXT, + start_line INTEGER, + end_line INTEGER, + CONSTRAINT uq_surface_sink_key UNIQUE (surface_id, method_key) +); + +CREATE INDEX IF NOT EXISTS idx_vuln_surface_sinks_surface ON vuln_surface_sinks(surface_id); +CREATE INDEX IF NOT EXISTS idx_vuln_surface_sinks_method ON vuln_surface_sinks(method_name); +CREATE INDEX IF NOT EXISTS idx_vuln_surface_sinks_type ON vuln_surface_sinks(declaring_type); + +CREATE TABLE IF NOT EXISTS vuln_surface_triggers ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + sink_id UUID NOT NULL REFERENCES vuln_surface_sinks(id) ON DELETE CASCADE, + scan_id UUID NOT NULL, + caller_node_id TEXT NOT NULL, + caller_method_key TEXT NOT NULL, + caller_file TEXT, + caller_line INTEGER, + reachability_bucket TEXT NOT NULL DEFAULT 'unknown', + path_length INTEGER, + confidence REAL NOT NULL DEFAULT 0.5, + call_type TEXT NOT NULL DEFAULT 'direct', + is_conditional BOOLEAN NOT NULL DEFAULT false, + CONSTRAINT uq_trigger_key UNIQUE (sink_id, scan_id, caller_node_id) +); + +CREATE INDEX IF NOT EXISTS idx_vuln_surface_triggers_sink ON vuln_surface_triggers(sink_id); +CREATE INDEX IF NOT EXISTS idx_vuln_surface_triggers_scan ON vuln_surface_triggers(scan_id); +CREATE INDEX IF NOT EXISTS idx_vuln_surface_triggers_bucket ON vuln_surface_triggers(reachability_bucket); + +CREATE TABLE IF NOT EXISTS vuln_surface_trigger_paths ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + surface_id UUID NOT NULL REFERENCES vuln_surfaces(id) ON DELETE CASCADE, + trigger_method_key TEXT NOT NULL, + trigger_method_name TEXT NOT NULL, + trigger_declaring_type TEXT NOT NULL, + sink_method_key TEXT NOT NULL, + path_length INTEGER NOT NULL, + path_methods TEXT[] NOT NULL, + is_interface_trigger BOOLEAN NOT NULL DEFAULT false, + is_virtual_trigger BOOLEAN NOT NULL DEFAULT false, + computed_at TIMESTAMPTZ NOT NULL DEFAULT now(), + CONSTRAINT uq_trigger_path_key UNIQUE (surface_id, trigger_method_key, sink_method_key) +); + +CREATE INDEX IF NOT EXISTS idx_vuln_surface_trigger_paths_surface ON vuln_surface_trigger_paths(surface_id); +CREATE INDEX IF NOT EXISTS idx_vuln_surface_trigger_paths_trigger ON vuln_surface_trigger_paths(trigger_method_key); +CREATE INDEX IF NOT EXISTS idx_vuln_surface_trigger_paths_sink ON vuln_surface_trigger_paths(sink_method_key); + +-- ============================================================================ +-- REACHABILITY CACHE +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS reach_cache_entries ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + service_id TEXT NOT NULL, + graph_hash TEXT NOT NULL, + sbom_hash TEXT, + entry_point_count INTEGER NOT NULL DEFAULT 0, + sink_count INTEGER NOT NULL DEFAULT 0, + pair_count INTEGER NOT NULL DEFAULT 0, + reachable_count INTEGER NOT NULL DEFAULT 0, + unreachable_count INTEGER NOT NULL DEFAULT 0, + cached_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT uq_reach_cache_service_graph UNIQUE (service_id, graph_hash) +); + +CREATE INDEX IF NOT EXISTS idx_reach_cache_service_id ON reach_cache_entries (service_id); +CREATE INDEX IF NOT EXISTS idx_reach_cache_expires ON reach_cache_entries (expires_at) WHERE expires_at IS NOT NULL; + +CREATE TABLE IF NOT EXISTS reach_cache_pairs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + cache_entry_id UUID NOT NULL REFERENCES reach_cache_entries(id) ON DELETE CASCADE, + entry_method_key TEXT NOT NULL, + sink_method_key TEXT NOT NULL, + is_reachable BOOLEAN NOT NULL, + path_length INTEGER, + confidence DOUBLE PRECISION NOT NULL DEFAULT 1.0, + computed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT uq_reach_pair UNIQUE (cache_entry_id, entry_method_key, sink_method_key) +); + +CREATE INDEX IF NOT EXISTS idx_reach_cache_pairs_entry ON reach_cache_pairs (cache_entry_id); +CREATE INDEX IF NOT EXISTS idx_reach_cache_pairs_reachable ON reach_cache_pairs (cache_entry_id, is_reachable); + +CREATE TABLE IF NOT EXISTS reach_graph_snapshots ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + service_id TEXT NOT NULL, + graph_hash TEXT NOT NULL, + node_count INTEGER NOT NULL DEFAULT 0, + edge_count INTEGER NOT NULL DEFAULT 0, + entry_point_count INTEGER NOT NULL DEFAULT 0, + snapshot_data BYTEA, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT uq_graph_snapshot UNIQUE (service_id, graph_hash) +); + +CREATE TABLE IF NOT EXISTS reach_cache_stats ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + service_id TEXT NOT NULL UNIQUE, + total_hits BIGINT NOT NULL DEFAULT 0, + total_misses BIGINT NOT NULL DEFAULT 0, + full_recomputes BIGINT NOT NULL DEFAULT 0, + incremental_computes BIGINT NOT NULL DEFAULT 0, + current_graph_hash TEXT, + last_populated_at TIMESTAMPTZ, + last_invalidated_at TIMESTAMPTZ, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS reach_state_flips ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + service_id TEXT NOT NULL, + scan_id UUID, + entry_method_key TEXT NOT NULL, + sink_method_key TEXT NOT NULL, + flip_type TEXT NOT NULL CHECK (flip_type IN ('became_reachable', 'became_unreachable')), + cve_id TEXT, + package_name TEXT, + detected_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_state_flips_service ON reach_state_flips (service_id, detected_at DESC); +CREATE INDEX IF NOT EXISTS idx_state_flips_scan ON reach_state_flips (scan_id) WHERE scan_id IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_state_flips_type ON reach_state_flips (flip_type); + +-- ============================================================================ +-- IDEMPOTENCY KEYS (API) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS scanner.idempotency_keys ( + key_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + content_digest TEXT NOT NULL, + endpoint_path TEXT NOT NULL, + response_status INTEGER NOT NULL, + response_body JSONB, + response_headers JSONB, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + expires_at TIMESTAMPTZ NOT NULL DEFAULT (now() + interval '24 hours'), + CONSTRAINT uk_idempotency_tenant_digest_path UNIQUE (tenant_id, content_digest, endpoint_path) +); + +CREATE INDEX IF NOT EXISTS ix_idempotency_keys_tenant_digest ON scanner.idempotency_keys (tenant_id, content_digest); +CREATE INDEX IF NOT EXISTS ix_idempotency_keys_expires_at ON scanner.idempotency_keys (expires_at); + +-- ============================================================================ +-- BINARY EVIDENCE TABLES +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS binary_identity ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scan_id UUID NOT NULL REFERENCES scans(scan_id) ON DELETE CASCADE, + file_path VARCHAR(1024) NOT NULL, + file_sha256 VARCHAR(64) NOT NULL, + text_sha256 VARCHAR(64), + build_id VARCHAR(128), + build_id_type VARCHAR(32), + architecture VARCHAR(32) NOT NULL, + binary_format VARCHAR(16) NOT NULL, + file_size BIGINT NOT NULL, + is_stripped BOOLEAN NOT NULL DEFAULT FALSE, + has_debug_info BOOLEAN NOT NULL DEFAULT FALSE, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_binary_identity_build_id ON binary_identity(build_id); +CREATE INDEX IF NOT EXISTS idx_binary_identity_file_sha256 ON binary_identity(file_sha256); +CREATE INDEX IF NOT EXISTS idx_binary_identity_text_sha256 ON binary_identity(text_sha256); +CREATE INDEX IF NOT EXISTS idx_binary_identity_scan_id ON binary_identity(scan_id); + +CREATE TABLE IF NOT EXISTS binary_package_map ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + binary_identity_id UUID NOT NULL REFERENCES binary_identity(id) ON DELETE CASCADE, + purl VARCHAR(512) NOT NULL, + match_type VARCHAR(32) NOT NULL, + confidence NUMERIC(3,2) NOT NULL, + match_source VARCHAR(64) NOT NULL, + evidence_json JSONB, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CONSTRAINT uq_binary_package_map UNIQUE (binary_identity_id, purl) +); + +CREATE INDEX IF NOT EXISTS idx_binary_package_map_purl ON binary_package_map(purl); +CREATE INDEX IF NOT EXISTS idx_binary_package_map_binary_id ON binary_package_map(binary_identity_id); + +CREATE TABLE IF NOT EXISTS binary_vuln_assertion ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + binary_identity_id UUID NOT NULL REFERENCES binary_identity(id) ON DELETE CASCADE, + vuln_id VARCHAR(64) NOT NULL, + status VARCHAR(32) NOT NULL, + source VARCHAR(64) NOT NULL, + assertion_type VARCHAR(32) NOT NULL, + confidence NUMERIC(3,2) NOT NULL, + evidence_json JSONB, + valid_from TIMESTAMPTZ NOT NULL, + valid_until TIMESTAMPTZ, + signature_ref VARCHAR(256), + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_binary_vuln_assertion_vuln_id ON binary_vuln_assertion(vuln_id); +CREATE INDEX IF NOT EXISTS idx_binary_vuln_assertion_binary_id ON binary_vuln_assertion(binary_identity_id); +CREATE INDEX IF NOT EXISTS idx_binary_vuln_assertion_status ON binary_vuln_assertion(status); + +-- ============================================================================ +-- FUNCTION-LEVEL PROOF TABLES +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS scanner.func_proof ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scan_id UUID NOT NULL, + proof_id TEXT NOT NULL, + build_id TEXT NOT NULL, + build_id_type TEXT NOT NULL, + file_sha256 TEXT NOT NULL, + binary_format TEXT NOT NULL, + architecture TEXT NOT NULL, + is_stripped BOOLEAN NOT NULL DEFAULT FALSE, + function_count INTEGER NOT NULL DEFAULT 0, + trace_count INTEGER NOT NULL DEFAULT 0, + proof_content JSONB NOT NULL, + compressed_content BYTEA, + dsse_envelope_id TEXT, + oci_artifact_digest TEXT, + rekor_entry_id TEXT, + generator_version TEXT NOT NULL, + generated_at_utc TIMESTAMPTZ NOT NULL, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at_utc TIMESTAMPTZ +); + +CREATE INDEX IF NOT EXISTS idx_func_proof_build_id ON scanner.func_proof(build_id); +CREATE INDEX IF NOT EXISTS idx_func_proof_file_sha256 ON scanner.func_proof(file_sha256); +CREATE INDEX IF NOT EXISTS idx_func_proof_scan_id ON scanner.func_proof(scan_id); +CREATE UNIQUE INDEX IF NOT EXISTS idx_func_proof_proof_id ON scanner.func_proof(proof_id); +CREATE INDEX IF NOT EXISTS idx_func_proof_build_arch ON scanner.func_proof(build_id, architecture); +CREATE INDEX IF NOT EXISTS idx_func_proof_content_gin ON scanner.func_proof USING GIN (proof_content jsonb_path_ops); + +CREATE TABLE IF NOT EXISTS scanner.func_node ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + func_proof_id UUID NOT NULL REFERENCES scanner.func_proof(id) ON DELETE CASCADE, + symbol TEXT NOT NULL, + symbol_digest TEXT NOT NULL, + start_address BIGINT NOT NULL, + end_address BIGINT NOT NULL, + function_hash TEXT NOT NULL, + confidence DOUBLE PRECISION NOT NULL DEFAULT 1.0, + is_entrypoint BOOLEAN NOT NULL DEFAULT FALSE, + entrypoint_type TEXT, + is_sink BOOLEAN NOT NULL DEFAULT FALSE, + sink_vuln_id TEXT, + source_file TEXT, + source_line INTEGER, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_func_node_symbol_digest ON scanner.func_node(symbol_digest); +CREATE INDEX IF NOT EXISTS idx_func_node_proof_id ON scanner.func_node(func_proof_id); +CREATE INDEX IF NOT EXISTS idx_func_node_symbol ON scanner.func_node(symbol); +CREATE INDEX IF NOT EXISTS idx_func_node_sinks ON scanner.func_node(is_sink, sink_vuln_id) WHERE is_sink = TRUE; +CREATE INDEX IF NOT EXISTS idx_func_node_entrypoints ON scanner.func_node(is_entrypoint, entrypoint_type) WHERE is_entrypoint = TRUE; + +CREATE TABLE IF NOT EXISTS scanner.func_trace ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + func_proof_id UUID NOT NULL REFERENCES scanner.func_proof(id) ON DELETE CASCADE, + trace_id TEXT NOT NULL, + edge_list_hash TEXT NOT NULL, + hop_count INTEGER NOT NULL, + entry_symbol_digest TEXT NOT NULL, + sink_symbol_digest TEXT NOT NULL, + path TEXT[] NOT NULL, + truncated BOOLEAN NOT NULL DEFAULT FALSE, + created_at_utc TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_func_trace_proof_id ON scanner.func_trace(func_proof_id); +CREATE INDEX IF NOT EXISTS idx_func_trace_entry_digest ON scanner.func_trace(entry_symbol_digest); +CREATE INDEX IF NOT EXISTS idx_func_trace_sink_digest ON scanner.func_trace(sink_symbol_digest); +CREATE INDEX IF NOT EXISTS idx_func_trace_edge_hash ON scanner.func_trace(edge_list_hash); + +-- ============================================================================ +-- RLS HELPER FUNCTION +-- ============================================================================ + +CREATE OR REPLACE FUNCTION current_tenant_id() +RETURNS UUID AS $$ +BEGIN + RETURN NULLIF(current_setting('app.tenant_id', TRUE), '')::UUID; +END; +$$ LANGUAGE plpgsql STABLE; + +-- ============================================================================ +-- RLS POLICIES +-- ============================================================================ + +DROP POLICY IF EXISTS risk_state_tenant_isolation ON risk_state_snapshots; +CREATE POLICY risk_state_tenant_isolation ON risk_state_snapshots + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS material_changes_tenant_isolation ON material_risk_changes; +CREATE POLICY material_changes_tenant_isolation ON material_risk_changes + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS vex_candidates_tenant_isolation ON vex_candidates; +CREATE POLICY vex_candidates_tenant_isolation ON vex_candidates + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS call_graph_snapshots_tenant_isolation ON call_graph_snapshots; +CREATE POLICY call_graph_snapshots_tenant_isolation ON call_graph_snapshots + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS reachability_results_tenant_isolation ON reachability_results; +CREATE POLICY reachability_results_tenant_isolation ON reachability_results + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS code_changes_tenant_isolation ON code_changes; +CREATE POLICY code_changes_tenant_isolation ON code_changes + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS drift_results_tenant_isolation ON reachability_drift_results; +CREATE POLICY drift_results_tenant_isolation ON reachability_drift_results + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS drifted_sinks_tenant_isolation ON drifted_sinks; +CREATE POLICY drifted_sinks_tenant_isolation ON drifted_sinks + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +DROP POLICY IF EXISTS vuln_surfaces_tenant_isolation ON vuln_surfaces; +CREATE POLICY vuln_surfaces_tenant_isolation ON vuln_surfaces + FOR ALL USING (tenant_id = current_tenant_id()) WITH CHECK (tenant_id = current_tenant_id()); + +-- ============================================================================ +-- HELPER FUNCTIONS +-- ============================================================================ + +CREATE OR REPLACE FUNCTION get_material_changes_for_scan( + p_scan_id TEXT, + p_min_priority NUMERIC DEFAULT NULL +) +RETURNS TABLE (vuln_id TEXT, purl TEXT, priority_score NUMERIC, changes JSONB) AS $$ +BEGIN + RETURN QUERY + SELECT mc.vuln_id, mc.purl, mc.priority_score, mc.changes + FROM material_risk_changes mc + WHERE mc.scan_id = p_scan_id AND mc.has_material_change = TRUE + AND (p_min_priority IS NULL OR mc.priority_score >= p_min_priority) + ORDER BY mc.priority_score DESC; +END; +$$ LANGUAGE plpgsql STABLE; + +CREATE OR REPLACE FUNCTION get_pending_vex_candidates( + p_image_digest TEXT DEFAULT NULL, + p_min_confidence NUMERIC DEFAULT 0.7, + p_limit INT DEFAULT 50 +) +RETURNS TABLE ( + candidate_id TEXT, vuln_id TEXT, purl TEXT, image_digest TEXT, + suggested_status vex_status_type, justification vex_justification, rationale TEXT, + confidence NUMERIC, evidence_links JSONB +) AS $$ +BEGIN + RETURN QUERY + SELECT vc.candidate_id, vc.vuln_id, vc.purl, vc.image_digest, + vc.suggested_status, vc.justification, vc.rationale, + vc.confidence, vc.evidence_links + FROM vex_candidates vc + WHERE vc.requires_review = TRUE AND vc.expires_at > NOW() + AND vc.confidence >= p_min_confidence + AND (p_image_digest IS NULL OR vc.image_digest = p_image_digest) + ORDER BY vc.confidence DESC LIMIT p_limit; +END; +$$ LANGUAGE plpgsql STABLE; + +CREATE OR REPLACE FUNCTION compute_epss_change_flags( + p_old_score DOUBLE PRECISION, p_new_score DOUBLE PRECISION, + p_old_percentile DOUBLE PRECISION, p_new_percentile DOUBLE PRECISION, + p_high_score DOUBLE PRECISION DEFAULT 0.50, p_high_percentile DOUBLE PRECISION DEFAULT 0.95, + p_big_jump DOUBLE PRECISION DEFAULT 0.10 +) RETURNS INT AS $$ +DECLARE v_flags INT := 0; v_delta DOUBLE PRECISION; +BEGIN + IF p_old_score IS NULL THEN v_flags := v_flags | 1; END IF; + IF p_old_score IS NOT NULL AND p_old_score < p_high_score AND p_new_score >= p_high_score THEN v_flags := v_flags | 2; END IF; + IF p_old_score IS NOT NULL AND p_old_score >= p_high_score AND p_new_score < p_high_score THEN v_flags := v_flags | 4; END IF; + IF p_old_score IS NOT NULL THEN + v_delta := p_new_score - p_old_score; + IF v_delta > p_big_jump THEN v_flags := v_flags | 8; END IF; + IF v_delta < -p_big_jump THEN v_flags := v_flags | 16; END IF; + END IF; + IF (p_old_percentile IS NULL OR p_old_percentile < p_high_percentile) AND p_new_percentile >= p_high_percentile THEN v_flags := v_flags | 32; END IF; + IF p_old_percentile IS NOT NULL AND p_old_percentile >= p_high_percentile AND p_new_percentile < p_high_percentile THEN v_flags := v_flags | 64; END IF; + RETURN v_flags; +END; +$$ LANGUAGE plpgsql IMMUTABLE; + +CREATE OR REPLACE FUNCTION create_epss_partition(p_year INT, p_month INT) +RETURNS VOID AS $$ +DECLARE v_start DATE; v_end DATE; v_partition_name TEXT; +BEGIN + v_start := make_date(p_year, p_month, 1); + v_end := v_start + INTERVAL '1 month'; + v_partition_name := format('epss_scores_%s_%s', p_year, LPAD(p_month::TEXT, 2, '0')); + EXECUTE format('CREATE TABLE IF NOT EXISTS %I PARTITION OF epss_scores FOR VALUES FROM (%L) TO (%L)', v_partition_name, v_start, v_end); + v_partition_name := format('epss_changes_%s_%s', p_year, LPAD(p_month::TEXT, 2, '0')); + EXECUTE format('CREATE TABLE IF NOT EXISTS %I PARTITION OF epss_changes FOR VALUES FROM (%L) TO (%L)', v_partition_name, v_start, v_end); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION prune_epss_raw(retention_days INT DEFAULT 365) +RETURNS INT AS $$ +DECLARE deleted_count INT; +BEGIN + DELETE FROM epss_raw WHERE asof_date < CURRENT_DATE - retention_days::INTERVAL; + GET DIAGNOSTICS deleted_count = ROW_COUNT; + RETURN deleted_count; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION prune_epss_signals(retention_days INT DEFAULT 90) +RETURNS INT AS $$ +DECLARE deleted_count INT; +BEGIN + DELETE FROM epss_signal WHERE model_date < CURRENT_DATE - retention_days::INTERVAL; + GET DIAGNOSTICS deleted_count = ROW_COUNT; + RETURN deleted_count; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION cleanup_expired_reach_cache() +RETURNS INTEGER AS $$ +DECLARE deleted_count INTEGER; +BEGIN + DELETE FROM reach_cache_entries WHERE expires_at < NOW(); + GET DIAGNOSTICS deleted_count = ROW_COUNT; + RETURN deleted_count; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION scanner.cleanup_expired_idempotency_keys() +RETURNS INTEGER AS $$ +DECLARE deleted_count INTEGER; +BEGIN + DELETE FROM scanner.idempotency_keys WHERE expires_at < now(); + GET DIAGNOSTICS deleted_count = ROW_COUNT; + RETURN deleted_count; +END; +$$ LANGUAGE plpgsql; + +-- ============================================================================ +-- VIEWS +-- ============================================================================ + +CREATE OR REPLACE VIEW scanner.scan_tte AS +SELECT + metrics_id, scan_id, tenant_id, surface_id, artifact_digest, + total_duration_ms AS tte_ms, + (total_duration_ms / 1000.0) AS tte_seconds, + (finished_at - started_at) AS tte_interval, + t_ingest_ms, t_analyze_ms, t_reachability_ms, t_vex_ms, t_sign_ms, t_publish_ms, + ROUND((t_ingest_ms::numeric / NULLIF(total_duration_ms, 0)) * 100, 2) AS ingest_percent, + ROUND((t_analyze_ms::numeric / NULLIF(total_duration_ms, 0)) * 100, 2) AS analyze_percent, + ROUND((t_reachability_ms::numeric / NULLIF(total_duration_ms, 0)) * 100, 2) AS reachability_percent, + ROUND((t_vex_ms::numeric / NULLIF(total_duration_ms, 0)) * 100, 2) AS vex_percent, + ROUND((t_sign_ms::numeric / NULLIF(total_duration_ms, 0)) * 100, 2) AS sign_percent, + ROUND((t_publish_ms::numeric / NULLIF(total_duration_ms, 0)) * 100, 2) AS publish_percent, + package_count, finding_count, is_replay, scanner_version, started_at, finished_at +FROM scanner.scan_metrics; + +CREATE OR REPLACE VIEW scanner.tte_stats AS +SELECT + tenant_id, + date_trunc('hour', started_at) AS hour_bucket, + COUNT(*) AS scan_count, + AVG(tte_ms)::INT AS tte_avg_ms, + PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY tte_ms)::INT AS tte_p50_ms, + PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY tte_ms)::INT AS tte_p95_ms, + MAX(tte_ms) AS tte_max_ms, + ROUND((COUNT(*) FILTER (WHERE tte_ms < 120000)::numeric / COUNT(*)) * 100, 2) AS slo_p50_compliance_percent, + ROUND((COUNT(*) FILTER (WHERE tte_ms < 300000)::numeric / COUNT(*)) * 100, 2) AS slo_p95_compliance_percent +FROM scanner.scan_tte +WHERE NOT is_replay +GROUP BY tenant_id, date_trunc('hour', started_at); + +CREATE OR REPLACE FUNCTION scanner.tte_percentile( + p_tenant_id UUID, p_percentile NUMERIC, + p_since TIMESTAMPTZ DEFAULT (NOW() - INTERVAL '7 days') +) +RETURNS NUMERIC AS $$ + SELECT PERCENTILE_CONT(p_percentile) WITHIN GROUP (ORDER BY tte_ms) + FROM scanner.scan_tte WHERE tenant_id = p_tenant_id AND started_at >= p_since AND NOT is_replay; +$$ LANGUAGE SQL STABLE; + +-- ============================================================================ +-- SCHEMA DOCUMENTATION +-- ============================================================================ + +COMMENT ON SCHEMA scanner IS 'Scanner module - SBOM, reachability, vulnerability scanning'; +COMMENT ON TABLE artifacts IS 'Artifact storage with content-addressable identity'; +COMMENT ON TABLE scans IS 'Scan execution registry'; +COMMENT ON TABLE proof_spines IS 'Proof spine chain for reproducible decisions'; +COMMENT ON TABLE scanner.scan_metrics IS 'Time-to-exploit (TTE) scan metrics'; +COMMENT ON TABLE scanner.witnesses IS 'DSSE-signed path witnesses for evidence'; +COMMENT ON TABLE vuln_surfaces IS 'Vulnerability attack surfaces with method-level analysis'; +COMMENT ON TABLE reach_cache_entries IS 'Reachability computation cache'; +COMMENT ON TABLE scanner.func_proof IS 'Function-level proof documents for binary analysis'; diff --git a/src/Scanner/__Libraries/StellaOps.Scanner.Storage/Postgres/Migrations/_archived/pre_1.0/README.md b/src/Scanner/__Libraries/StellaOps.Scanner.Storage/Postgres/Migrations/_archived/pre_1.0/README.md new file mode 100644 index 000000000..8fcdc6d1a --- /dev/null +++ b/src/Scanner/__Libraries/StellaOps.Scanner.Storage/Postgres/Migrations/_archived/pre_1.0/README.md @@ -0,0 +1,47 @@ +# Archived Pre-1.0 Migrations + +This directory contains the original migrations that were compacted into `001_initial_schema.sql` +for the 1.0.0 release. + +## Original Files +- `001_create_tables.sql` - Baseline schema (artifacts, images, layers, jobs) +- `002_proof_spine_tables.sql` - Proof spine storage +- `003_classification_history.sql` - FN-Drift tracking +- `004_scan_metrics.sql` - TTE metrics and execution phases +- `005_smart_diff_tables.sql` - Smart-Diff detection tables +- `006_score_replay_tables.sql` - Score replay, scan manifests +- `007_unknowns_ranking_containment.sql` - Unknowns enrichment +- `008_epss_integration.sql` - EPSS partitioned tables +- `0059_scans_table.sql` - Scans table (prerequisite) +- `0065_unknowns_table.sql` - Unknowns table (prerequisite) +- `0075_scan_findings_table.sql` - Scan findings (prerequisite) +- `020_call_graph_tables.sql` - Call graph snapshots and reachability +- `021_smart_diff_tables_search_path.sql` - Smart-Diff schema alignment +- `022_reachability_drift_tables.sql` - Code changes and drift detection +- `023_scanner_api_ingestion.sql` - Call graph ingestion idempotency +- `024_smart_diff_priority_score_widen.sql` - Priority score column widening +- `025_epss_raw_layer.sql` - EPSS raw payload storage +- `026_epss_signal_layer.sql` - EPSS signal-ready events +- `027_witness_storage.sql` - DSSE-signed path witnesses +- `028_epss_triage_columns.sql` - EPSS enrichment columns +- `029_vuln_surfaces.sql` - Vulnerability surfaces +- `030_vuln_surface_triggers_update.sql` - Trigger path storage +- `031_reach_cache.sql` - Reachability cache +- `032_idempotency_keys.sql` - RFC 9530 idempotency keys +- `033_binary_evidence.sql` - Binary identity and evidence +- `034_func_proof_tables.sql` - Function-level proof documents +- `DM001_rename_scanner_migrations.sql` - Migration table updates + +## Why Archived +Pre-1.0, the schema evolved incrementally. For 1.0.0, migrations were compacted into a single +initial schema to: +- Simplify new deployments +- Reduce startup time +- Provide cleaner upgrade path + +## For Existing Deployments +If upgrading from pre-1.0, run the reset script directly with psql: +```bash +psql -h -U -d -f devops/scripts/migrations-reset-pre-1.0.sql +``` +This updates `schema_migrations` to recognize the compacted schema. diff --git a/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/CecilMethodFingerprinterTests.cs b/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/CecilMethodFingerprinterTests.cs index 38e196b85..f0519ca9d 100644 --- a/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/CecilMethodFingerprinterTests.cs +++ b/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/CecilMethodFingerprinterTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // CecilMethodFingerprinterTests.cs // Sprint: SPRINT_3700_0002_0001_vuln_surfaces_core // Description: Unit tests for CecilMethodFingerprinter. @@ -122,7 +122,6 @@ public class CecilMethodFingerprinterTests { // Arrange using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; cts.Cancel(); var testAssemblyPath = typeof(CecilMethodFingerprinterTests).Assembly.Location; diff --git a/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/NuGetPackageDownloaderTests.cs b/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/NuGetPackageDownloaderTests.cs index 00b33f579..854be89c6 100644 --- a/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/NuGetPackageDownloaderTests.cs +++ b/src/Scanner/__Libraries/StellaOps.Scanner.VulnSurfaces.Tests/NuGetPackageDownloaderTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // NuGetPackageDownloaderTests.cs // Sprint: SPRINT_3700_0002_0001_vuln_surfaces_core // Task: SURF-020 @@ -355,7 +355,6 @@ public class NuGetPackageDownloaderTests : IDisposable // Add a minimal .nuspec file var nuspecEntry = archive.CreateEntry("test.nuspec"); using var writer = new StreamWriter(nuspecEntry.Open()); -using StellaOps.TestKit; writer.Write(""" diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Advisory.Tests/AdvisoryClientTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Advisory.Tests/AdvisoryClientTests.cs index ea9278888..18c083ca6 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Advisory.Tests/AdvisoryClientTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Advisory.Tests/AdvisoryClientTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text.Json; using Microsoft.Extensions.Caching.Memory; @@ -74,7 +74,6 @@ public sealed class AdvisoryClientTests }); using var temp = new TempFile(); -using StellaOps.TestKit; var bundle = new { items = new[] diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Lang.Ruby.Tests/RubyLanguageAnalyzerTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Lang.Ruby.Tests/RubyLanguageAnalyzerTests.cs index 550aac5e2..1a2a34c20 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Lang.Ruby.Tests/RubyLanguageAnalyzerTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Lang.Ruby.Tests/RubyLanguageAnalyzerTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Scanner.Analyzers.Lang; using StellaOps.Scanner.Analyzers.Lang.Ruby; using StellaOps.Scanner.Analyzers.Lang.Tests.Harness; @@ -183,7 +183,6 @@ public sealed class RubyLanguageAnalyzerTests Assert.True(store.TryGet(ScanAnalysisKeys.RubyObservationPayload, out AnalyzerObservationPayload payload)); using var document = JsonDocument.Parse(payload.Content.ToArray()); -using StellaOps.TestKit; var root = document.RootElement; var environment = root.GetProperty("environment"); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/ElfDynamicSectionParserTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/ElfDynamicSectionParserTests.cs index 9ecd3b345..776dbe6d1 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/ElfDynamicSectionParserTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/ElfDynamicSectionParserTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using StellaOps.Scanner.Analyzers.Native; using StellaOps.Scanner.Analyzers.Native.Tests.Fixtures; using StellaOps.Scanner.Analyzers.Native.Tests.TestUtilities; @@ -113,7 +113,6 @@ public class ElfDynamicSectionParserTests : NativeTestBase buffer[1] = (byte)'Z'; using var stream = new MemoryStream(buffer); -using StellaOps.TestKit; var result = ElfDynamicSectionParser.TryParse(stream, out var info); result.Should().BeFalse(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/HeuristicScannerTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/HeuristicScannerTests.cs index b7c7a36ed..9cc6e54bb 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/HeuristicScannerTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/HeuristicScannerTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using FluentAssertions; using Xunit; @@ -277,7 +277,6 @@ public class HeuristicScannerTests // Act using var stream = new MemoryStream(data); -using StellaOps.TestKit; var result = HeuristicScanner.Scan(stream, NativeFormat.Elf); // Assert diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/MachOReaderTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/MachOReaderTests.cs index 29359870b..7019e6c42 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/MachOReaderTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/MachOReaderTests.cs @@ -1,4 +1,4 @@ -using System.Buffers.Binary; +using System.Buffers.Binary; using System.Security.Cryptography; using System.Text; using Xunit; @@ -747,7 +747,6 @@ public sealed class MachOReaderTests { var data = BuildMachO64(); using var stream = new MemoryStream(data); -using StellaOps.TestKit; var result = MachOReader.Parse(stream, "/usr/bin/myapp", "sha256:abc123"); Assert.NotNull(result); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeFormatDetectorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeFormatDetectorTests.cs index 7c2451fb0..1055a139b 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeFormatDetectorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeFormatDetectorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using StellaOps.Scanner.Analyzers.Native; @@ -175,7 +175,6 @@ public class NativeFormatDetectorTests var bytes = new byte[] { 0x00, 0x01, 0x02, 0x03 }; using var stream = new MemoryStream(bytes); -using StellaOps.TestKit; var detected = NativeFormatDetector.TryDetect(stream, out var id); Assert.False(detected); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeObservationTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeObservationTests.cs index e2ca10dcf..b0d41b142 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeObservationTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/NativeObservationTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using FluentAssertions; using StellaOps.Scanner.Analyzers.Native.Observations; using Xunit; @@ -134,7 +134,6 @@ public class NativeObservationSerializerTests var json = NativeObservationSerializer.Serialize(original); using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)); -using StellaOps.TestKit; // Act var doc = await NativeObservationSerializer.ReadAsync(stream); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PeReaderTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PeReaderTests.cs index eb10e17ca..475eb3ec4 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PeReaderTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PeReaderTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using StellaOps.Scanner.Analyzers.Native; using StellaOps.Scanner.Analyzers.Native.Tests.Fixtures; using StellaOps.Scanner.Analyzers.Native.Tests.TestUtilities; @@ -145,7 +145,6 @@ public class PeReaderTests : NativeTestBase var invalidData = new byte[] { 0x00, 0x01, 0x02, 0x03 }; using var stream = new MemoryStream(invalidData); -using StellaOps.TestKit; // Act var result = PeReader.Parse(stream, "invalid.exe"); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PluginPackagingTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PluginPackagingTests.cs index 594347b52..f9dda92ec 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PluginPackagingTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.Native.Tests/PluginPackagingTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -330,7 +330,6 @@ public sealed class PluginPackagingTests var elfHeader = CreateMinimalElfHeader(); using var stream = new MemoryStream(elfHeader); -using StellaOps.TestKit; var result = await analyzer.AnalyzeAsync("/test/binary.so", stream, options); result.Should().NotBeNull(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Homebrew.Tests/HomebrewReceiptParserTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Homebrew.Tests/HomebrewReceiptParserTests.cs index 634b2dbcb..5705fa8e1 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Homebrew.Tests/HomebrewReceiptParserTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Homebrew.Tests/HomebrewReceiptParserTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using StellaOps.Scanner.Analyzers.OS.Homebrew; using Xunit; @@ -272,7 +272,6 @@ public sealed class HomebrewReceiptParserTests """; using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); -using StellaOps.TestKit; // Act var receipt = _parser.Parse(stream); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Tests/OsAnalyzerDeterminismTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Tests/OsAnalyzerDeterminismTests.cs index 1325870b5..59d352f1a 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Tests/OsAnalyzerDeterminismTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Tests/OsAnalyzerDeterminismTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -36,7 +36,6 @@ public sealed class OsAnalyzerDeterminismTests public async Task DpkgAnalyzerMatchesGolden() { using var fixture = FixtureManager.UseFixture("dpkg", out var rootPath); -using StellaOps.TestKit; var analyzer = new DpkgPackageAnalyzer(NullLogger.Instance); var context = CreateContext(rootPath); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests/ChocolateyPackageAnalyzerTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests/ChocolateyPackageAnalyzerTests.cs index 7aa9aa66e..f0c70d296 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests/ChocolateyPackageAnalyzerTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests/ChocolateyPackageAnalyzerTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey; using Xunit; @@ -468,7 +468,6 @@ public class ChocolateyPackageAnalyzerTests CreateNuspecFile(packageDir, "git", "2.42.0", "Git", "Author", "Git"); using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; cts.Cancel(); try diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Cache.Tests/LayerCacheRoundTripTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Cache.Tests/LayerCacheRoundTripTests.cs index cb306a598..80e0b6023 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Cache.Tests/LayerCacheRoundTripTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Cache.Tests/LayerCacheRoundTripTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -112,7 +112,6 @@ public sealed class LayerCacheRoundTripTests : IAsyncLifetime // Compaction removes CAS entry once over threshold. // Force compaction by writing a large entry. using var largeStream = CreateStream(new string('x', 400_000)); -using StellaOps.TestKit; var largeHash = "sha256:" + new string('e', 64); await _fileCas.PutAsync(new FileCasPutRequest(largeHash, largeStream), CancellationToken.None); _timeProvider.Advance(TimeSpan.FromMinutes(1)); @@ -133,7 +132,7 @@ using StellaOps.TestKit; } catch { - // Ignored – best effort cleanup. + // Ignored – best effort cleanup. } return Task.CompletedTask; diff --git a/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/DotNetCallGraphExtractorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/DotNetCallGraphExtractorTests.cs index 344b90e61..dee06c16a 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/DotNetCallGraphExtractorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/DotNetCallGraphExtractorTests.cs @@ -1,4 +1,4 @@ -using StellaOps.Scanner.CallGraph; +using StellaOps.Scanner.CallGraph; using StellaOps.Scanner.CallGraph.DotNet; using Xunit; @@ -80,7 +80,6 @@ public class DotNetCallGraphExtractorTests { await using var temp = await TempDirectory.CreateAsync(); -using StellaOps.TestKit; var csprojPath = Path.Combine(temp.Path, "App.csproj"); await File.WriteAllTextAsync(csprojPath, """ diff --git a/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaCallGraphExtractorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaCallGraphExtractorTests.cs index 5a7652009..7f16deb9a 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaCallGraphExtractorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaCallGraphExtractorTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // JavaCallGraphExtractorTests.cs // Sprint: SPRINT_3610_0001_0001_java_callgraph (JCG-018) // Description: Unit tests for the Java bytecode call graph extractor. @@ -531,7 +531,6 @@ public class JavaCallGraphExtractorTests // Arrange: Create a temp directory await using var temp = await TempDirectory.CreateAsync(); -using StellaOps.TestKit; var request1 = new CallGraphExtractionRequest( ScanId: "scan-a", Language: "java", diff --git a/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaScriptCallGraphExtractorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaScriptCallGraphExtractorTests.cs index ef421cb44..3ec489527 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaScriptCallGraphExtractorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.CallGraph.Tests/JavaScriptCallGraphExtractorTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // JavaScriptCallGraphExtractorTests.cs // Sprint: SPRINT_3610_0003_0001_nodejs_callgraph (NCG-012) // Description: Unit tests for JavaScriptCallGraphExtractor. @@ -484,7 +484,6 @@ public sealed class JavaScriptCallGraphExtractorTests : IAsyncLifetime { await using var temp = await TempDirectory.CreateAsync(); -using StellaOps.TestKit; var packageJson = """ { "name": "test-app", diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityGraphBuilderUnionTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityGraphBuilderUnionTests.cs index ce3decb8c..c8135715b 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityGraphBuilderUnionTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityGraphBuilderUnionTests.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using StellaOps.Scanner.Reachability; using Xunit; @@ -21,7 +21,6 @@ public class ReachabilityGraphBuilderUnionTests var writer = new ReachabilityUnionWriter(); using var temp = new TempDir(); -using StellaOps.TestKit; var result = await writer.WriteAsync(graph, temp.Path, "analysis-graph-1"); Assert.Equal(2, result.Nodes.RecordCount); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityUnionPublisherTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityUnionPublisherTests.cs index 0aa8ec01e..3a72155b0 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityUnionPublisherTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/ReachabilityUnionPublisherTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using StellaOps.Scanner.Core.Tests.Fakes; using StellaOps.Scanner.Reachability; @@ -20,7 +20,6 @@ public class ReachabilityUnionPublisherTests var cas = new FakeFileContentAddressableStore(); using var temp = new TempDir(); -using StellaOps.TestKit; var publisher = new ReachabilityUnionPublisher(new ReachabilityUnionWriter()); var result = await publisher.PublishAsync(graph, cas, temp.Path, "analysis-pub-1"); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Diff.Tests/ComponentDifferTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Diff.Tests/ComponentDifferTests.cs index b60ddbaee..762c17e3f 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Diff.Tests/ComponentDifferTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Diff.Tests/ComponentDifferTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -339,7 +339,6 @@ public sealed class ComponentDifferTests var json = DiffJsonSerializer.Serialize(document); using var parsed = JsonDocument.Parse(json); -using StellaOps.TestKit; var changeJson = parsed.RootElement .GetProperty("layers")[0] .GetProperty("changes")[0]; diff --git a/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceAnalyzerTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceAnalyzerTests.cs index ea12a8e9e..98b6f0c98 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceAnalyzerTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceAnalyzerTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.IO; using System.IO.Compression; using System.Text; @@ -830,7 +830,6 @@ public sealed class EntryTraceAnalyzerTests { var manifest = archive.CreateEntry("META-INF/MANIFEST.MF"); using var writer = new StreamWriter(manifest.Open(), Encoding.UTF8); -using StellaOps.TestKit; writer.WriteLine("Manifest-Version: 1.0"); writer.WriteLine($"Main-Class: {mainClass}"); writer.Flush(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceNdjsonWriterTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceNdjsonWriterTests.cs index 8ec35b91a..03d8a9511 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceNdjsonWriterTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/EntryTraceNdjsonWriterTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Buffers; using System.Collections.Immutable; using System.Globalization; @@ -151,7 +151,6 @@ public sealed class EntryTraceNdjsonWriterTests Assert.EndsWith("\n", ndjsonLine, StringComparison.Ordinal); var json = ndjsonLine.TrimEnd('\n'); using var document = JsonDocument.Parse(json); -using StellaOps.TestKit; return document.RootElement.Clone(); } } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/LayeredRootFileSystemTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/LayeredRootFileSystemTests.cs index f8aaf6a2f..216815b1b 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/LayeredRootFileSystemTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.EntryTrace.Tests/LayeredRootFileSystemTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Formats.Tar; using System.IO; using System.Text; @@ -191,7 +191,6 @@ public sealed class LayeredRootFileSystemTests : IDisposable { using var stream = File.Create(path); using var writer = new TarWriter(stream, leaveOpen: false); -using StellaOps.TestKit; writerAction(writer); } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Integration.Tests/PoEPipelineTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Integration.Tests/PoEPipelineTests.cs index 47a9b69c6..200f14110 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Integration.Tests/PoEPipelineTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Integration.Tests/PoEPipelineTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) StellaOps. Licensed under AGPL-3.0-or-later. +// Copyright (c) StellaOps. Licensed under AGPL-3.0-or-later. using System.Security.Cryptography; using Microsoft.Extensions.Logging.Abstractions; @@ -17,7 +17,7 @@ namespace StellaOps.Scanner.Integration.Tests; /// /// Integration tests for end-to-end PoE generation pipeline. -/// Tests the full workflow from scan → subgraph extraction → PoE generation → storage. +/// Tests the full workflow from scan → subgraph extraction → PoE generation → storage. /// public class PoEPipelineTests : IDisposable { @@ -207,7 +207,6 @@ public class PoEPipelineTests : IDisposable { // Using SHA256 as BLAKE3 placeholder using var sha = SHA256.Create(); -using StellaOps.TestKit; var hashBytes = sha.ComputeHash(data); var hashHex = Convert.ToHexString(hashBytes).ToLowerInvariant(); return $"blake3:{hashHex}"; diff --git a/src/Scanner/__Tests/StellaOps.Scanner.ProofSpine.Tests/PostgresProofSpineRepositoryTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.ProofSpine.Tests/PostgresProofSpineRepositoryTests.cs index 2d5600c74..bdd6e6a2d 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.ProofSpine.Tests/PostgresProofSpineRepositoryTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.ProofSpine.Tests/PostgresProofSpineRepositoryTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.Cryptography; @@ -40,7 +40,6 @@ public sealed class PostgresProofSpineRepositoryTests }; await using var dataSource = new ScannerDataSource(Options.Create(options), NullLogger.Instance); -using StellaOps.TestKit; var repository = new PostgresProofSpineRepository( dataSource, NullLogger.Instance, diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/AttestingRichGraphWriterTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/AttestingRichGraphWriterTests.cs index 8a2b0ac9b..e5490c781 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/AttestingRichGraphWriterTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/AttestingRichGraphWriterTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // AttestingRichGraphWriterTests.cs // Sprint: SPRINT_3620_0001_0001_reachability_witness_dsse // Description: Tests for AttestingRichGraphWriter integration. @@ -275,7 +275,6 @@ public class AttestingRichGraphWriterTests : IAsyncLifetime public async ValueTask ComputeHashAsync(Stream stream, string? algorithmId = null, CancellationToken cancellationToken = default) { using var buffer = new MemoryStream(); -using StellaOps.TestKit; await stream.CopyToAsync(buffer, cancellationToken).ConfigureAwait(false); return System.Security.Cryptography.SHA256.HashData(buffer.ToArray()); } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/BinaryReachabilityLifterTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/BinaryReachabilityLifterTests.cs index 06c5aad59..7c34fc872 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/BinaryReachabilityLifterTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/BinaryReachabilityLifterTests.cs @@ -1,4 +1,4 @@ -using System.Buffers.Binary; +using System.Buffers.Binary; using System.Security.Cryptography; using System.Text; using System.Threading; @@ -383,7 +383,6 @@ public class BinaryReachabilityLifterTests using var ms = new MemoryStream(); using var writer = new BinaryWriter(ms); -using StellaOps.TestKit; var stringTable = new StringBuilder(); stringTable.Append('\0'); var stringOffsets = new Dictionary(StringComparer.Ordinal); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionPublisherTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionPublisherTests.cs index 5d306afc8..cbd25deec 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionPublisherTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionPublisherTests.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using StellaOps.Scanner.Reachability; using Xunit; @@ -17,7 +17,6 @@ public class ReachabilityUnionPublisherTests Edges: new ReachabilityUnionEdge[0]); using var temp = new TempDir(); -using StellaOps.TestKit; var cas = new FakeFileContentAddressableStore(); var publisher = new ReachabilityUnionPublisher(new ReachabilityUnionWriter()); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionWriterTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionWriterTests.cs index 477cc2ea5..f43bea8f0 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionWriterTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/ReachabilityUnionWriterTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -180,7 +180,6 @@ public class ReachabilityUnionWriterTests var writer = new ReachabilityUnionWriter(); using var temp = new TempDir(); -using StellaOps.TestKit; var graph = new ReachabilityUnionGraph( Nodes: new[] { diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphPublisherTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphPublisherTests.cs index c749f93bf..424a26a20 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphPublisherTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphPublisherTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using StellaOps.Cryptography; @@ -49,7 +49,6 @@ public class RichGraphPublisherTests var payloadBytes = Base64UrlDecode(payloadBase64Url!); using var payloadDoc = JsonDocument.Parse(payloadBytes); -using StellaOps.TestKit; Assert.Equal( result.GraphHash, payloadDoc.RootElement.GetProperty("hashes").GetProperty("graphHash").GetString()); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphWriterTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphWriterTests.cs index c9a35da96..ed12a4b4b 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphWriterTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Reachability.Tests/RichGraphWriterTests.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using System.Threading.Tasks; using StellaOps.Cryptography; using StellaOps.Scanner.Reachability; @@ -122,7 +122,6 @@ public class RichGraphWriterTests var writer = new RichGraphWriter(CryptoHashFactory.CreateDefault()); using var temp = new TempDir(); -using StellaOps.TestKit; var union = new ReachabilityUnionGraph( Nodes: new[] { diff --git a/src/Scanner/__Tests/StellaOps.Scanner.ReachabilityDrift.Tests/StellaOps.Scanner.ReachabilityDrift.Tests.csproj b/src/Scanner/__Tests/StellaOps.Scanner.ReachabilityDrift.Tests/StellaOps.Scanner.ReachabilityDrift.Tests.csproj index be0b5ec03..9f31365f7 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.ReachabilityDrift.Tests/StellaOps.Scanner.ReachabilityDrift.Tests.csproj +++ b/src/Scanner/__Tests/StellaOps.Scanner.ReachabilityDrift.Tests/StellaOps.Scanner.ReachabilityDrift.Tests.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/PredicateGoldenFixtureTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/PredicateGoldenFixtureTests.cs index bc34749bb..1f282b56c 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/PredicateGoldenFixtureTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/PredicateGoldenFixtureTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.IO; @@ -79,7 +79,6 @@ public sealed class PredicateGoldenFixtureTests }); using var parsed = JsonDocument.Parse(json); -using StellaOps.TestKit; Assert.Equal("reachability_flip", parsed.RootElement.GetProperty("changeType").GetString()); } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/ReachabilityGateTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/ReachabilityGateTests.cs index 5173fa8ea..4beff9721 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/ReachabilityGateTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.SmartDiff.Tests/ReachabilityGateTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Scanner.SmartDiff; using Xunit; @@ -50,7 +50,6 @@ public sealed class ReachabilityGateTests var json = JsonSerializer.Serialize(gate); using var parsed = JsonDocument.Parse(json); -using StellaOps.TestKit; var root = parsed.RootElement; Assert.True(root.TryGetProperty("reachable", out _)); Assert.True(root.TryGetProperty("configActivated", out _)); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/OciArtifactPusherTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/OciArtifactPusherTests.cs index 4379ef62a..8c1034c52 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/OciArtifactPusherTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/OciArtifactPusherTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http; using System.Text.Json; using Microsoft.Extensions.Logging.Abstractions; @@ -50,7 +50,6 @@ public sealed class OciArtifactPusherTests Assert.NotNull(handler.ManifestBytes); using var doc = JsonDocument.Parse(handler.ManifestBytes!); -using StellaOps.TestKit; Assert.True(doc.RootElement.TryGetProperty("annotations", out var annotations)); Assert.True(annotations.TryGetProperty("org.opencontainers.image.created", out _)); } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/VerdictOciPublisherTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/VerdictOciPublisherTests.cs index e36083cd9..1e1779266 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/VerdictOciPublisherTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Oci.Tests/VerdictOciPublisherTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // VerdictOciPublisherTests.cs // Sprint: SPRINT_4300_0001_0001_oci_verdict_attestation_push // Description: Tests for VerdictOciPublisher service. @@ -279,7 +279,6 @@ public sealed class VerdictOciPublisherTests Assert.NotNull(handler.ManifestBytes); using var doc = JsonDocument.Parse(handler.ManifestBytes!); -using StellaOps.TestKit; Assert.True(doc.RootElement.TryGetProperty("layers", out var layers)); Assert.Equal(1, layers.GetArrayLength()); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/BinaryEvidenceServiceTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/BinaryEvidenceServiceTests.cs index e9ace5eb7..67e21887f 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/BinaryEvidenceServiceTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/BinaryEvidenceServiceTests.cs @@ -1,4 +1,4 @@ -using Dapper; +using Dapper; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.Scanner.Storage.Entities; @@ -180,7 +180,6 @@ public sealed class BinaryEvidenceServiceTests : IAsyncLifetime var table = $"{_schemaName}.scans"; await using var connection = await _dataSource.OpenSystemConnectionAsync().ConfigureAwait(false); -using StellaOps.TestKit; await connection.ExecuteAsync( $"INSERT INTO {table} (scan_id) VALUES (@ScanId)", new { ScanId = scanId }).ConfigureAwait(false); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/EpssRepositoryIntegrationTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/EpssRepositoryIntegrationTests.cs index 23d3be271..a817f24cc 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/EpssRepositoryIntegrationTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/EpssRepositoryIntegrationTests.cs @@ -1,4 +1,4 @@ -using Dapper; +using Dapper; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -80,7 +80,6 @@ public sealed class EpssRepositoryIntegrationTests : IAsyncLifetime Assert.Equal(day2, current["CVE-2024-0001"].ModelDate); await using var connection = await _dataSource.OpenSystemConnectionAsync(); -using StellaOps.TestKit; var changes = (await connection.QueryAsync( """ SELECT cve_id, old_score, new_score, old_percentile, new_percentile, flags diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/StorageDualWriteFixture.cs b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/StorageDualWriteFixture.cs index 83871d18e..af32fbc71 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/StorageDualWriteFixture.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Storage.Tests/StorageDualWriteFixture.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; @@ -91,7 +91,6 @@ public sealed class StorageDualWriteFixture await _fixture.TruncateAllTablesAsync(); await using var connection = new Npgsql.NpgsqlConnection(_fixture.ConnectionString); -using StellaOps.TestKit; await connection.OpenAsync(); await using var command = new Npgsql.NpgsqlCommand( "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = @schema AND table_name = 'artifacts');", diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Surface.FS.Tests/FileSurfaceManifestStoreTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Surface.FS.Tests/FileSurfaceManifestStoreTests.cs index e54a4e44b..e8b4aa2f8 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Surface.FS.Tests/FileSurfaceManifestStoreTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Surface.FS.Tests/FileSurfaceManifestStoreTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -225,7 +225,6 @@ public sealed class FileSurfaceManifestStoreTests : IAsyncDisposable public async ValueTask ComputeHashAsync(Stream stream, string? algorithmId = null, CancellationToken cancellationToken = default) { await using var buffer = new MemoryStream(); -using StellaOps.TestKit; await stream.CopyToAsync(buffer, cancellationToken).ConfigureAwait(false); return SHA256.HashData(buffer.ToArray()); } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/CasAccessSecretParserTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/CasAccessSecretParserTests.cs index 7626ca4fb..e11450ee1 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/CasAccessSecretParserTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/CasAccessSecretParserTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Text; using StellaOps.Scanner.Surface.Secrets; using Xunit; @@ -58,7 +58,6 @@ public sealed class CasAccessSecretParserTests }; using var handle = SurfaceSecretHandle.FromBytes(Encoding.UTF8.GetBytes(json), metadata); -using StellaOps.TestKit; var secret = SurfaceSecretParser.ParseCasAccessSecret(handle); Assert.Equal("s3", secret.Driver); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/RegistryAccessSecretParserTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/RegistryAccessSecretParserTests.cs index 997829eee..06907a1b9 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/RegistryAccessSecretParserTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/RegistryAccessSecretParserTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text; using StellaOps.Scanner.Surface.Secrets; @@ -103,7 +103,6 @@ public sealed class RegistryAccessSecretParserTests }; using var handle = SurfaceSecretHandle.FromBytes(ReadOnlySpan.Empty, metadata); -using StellaOps.TestKit; var secret = SurfaceSecretParser.ParseRegistryAccessSecret(handle); var entry = Assert.Single(secret.Entries); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/SurfaceSecretsServiceCollectionExtensionsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/SurfaceSecretsServiceCollectionExtensionsTests.cs index 57ffa56fb..2fad65ea7 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/SurfaceSecretsServiceCollectionExtensionsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Surface.Secrets.Tests/SurfaceSecretsServiceCollectionExtensionsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; @@ -40,7 +40,6 @@ namespace StellaOps.Scanner.Surface.Secrets.Tests services.AddSurfaceSecrets(); await using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var secretProvider = provider.GetRequiredService(); var handle = await secretProvider.GetAsync(new SurfaceSecretRequest("tenant", "component", "registry")); try diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ActionablesEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ActionablesEndpointsTests.cs index 79f1bf7b8..1d0ef23bf 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ActionablesEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ActionablesEndpointsTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // ActionablesEndpointsTests.cs // Sprint: SPRINT_4200_0002_0006_delta_compare_api // Description: Integration tests for actionables engine endpoints. @@ -128,7 +128,6 @@ public sealed class ActionablesEndpointsTests using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var response = await client.GetAsync("/api/v1/actionables/delta/delta-12345678"); var result = await response.Content.ReadFromJsonAsync(SerializerOptions); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/AuthorizationTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/AuthorizationTests.cs index d74f24db5..8f313b766 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/AuthorizationTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/AuthorizationTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using StellaOps.TestKit; @@ -21,7 +21,6 @@ public sealed class AuthorizationTests }); using var client = factory.CreateClient(); -using StellaOps.TestKit; var response = await client.GetAsync("/api/v1/__auth-probe"); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/BaselineEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/BaselineEndpointsTests.cs index da965629b..2c7bac34c 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/BaselineEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/BaselineEndpointsTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // BaselineEndpointsTests.cs // Sprint: SPRINT_4200_0002_0006_delta_compare_api // Description: Integration tests for baseline selection endpoints. @@ -112,7 +112,6 @@ public sealed class BaselineEndpointsTests using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var response = await client.GetAsync("/api/v1/baselines/recommendations/sha256:artifact123"); var result = await response.Content.ReadFromJsonAsync(SerializerOptions); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CallGraphEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CallGraphEndpointsTests.cs index a73697f77..4b587a274 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CallGraphEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CallGraphEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using StellaOps.Scanner.WebService.Contracts; using Xunit; @@ -63,7 +63,6 @@ public sealed class CallGraphEndpointsTests { Content = JsonContent.Create(request) }; -using StellaOps.TestKit; secondRequest.Headers.TryAddWithoutValidation("Content-Digest", "sha256:deadbeef"); var second = await client.SendAsync(secondRequest); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CounterfactualEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CounterfactualEndpointsTests.cs index eeb1838fd..14e670f92 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CounterfactualEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/CounterfactualEndpointsTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // CounterfactualEndpointsTests.cs // Sprint: SPRINT_4200_0002_0005_counterfactuals // Description: Integration tests for counterfactual analysis endpoints. @@ -205,7 +205,6 @@ public sealed class CounterfactualEndpointsTests using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var request = new CounterfactualRequestDto { FindingId = "finding-123", diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/DeltaCompareEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/DeltaCompareEndpointsTests.cs index ce9c86bd4..d9fd5c703 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/DeltaCompareEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/DeltaCompareEndpointsTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // DeltaCompareEndpointsTests.cs // Sprint: SPRINT_4200_0002_0006_delta_compare_api // Description: Integration tests for delta compare endpoints. @@ -130,7 +130,6 @@ public sealed class DeltaCompareEndpointsTests using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var request = new DeltaCompareRequestDto { BaseDigest = "sha256:base123", diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/EvidenceCompositionServiceTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/EvidenceCompositionServiceTests.cs index 667466da1..3728dba8e 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/EvidenceCompositionServiceTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/EvidenceCompositionServiceTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // EvidenceCompositionServiceTests.cs // Sprint: SPRINT_3800_0003_0001_evidence_api_endpoint // Description: Integration tests for Evidence API endpoints. @@ -112,7 +112,6 @@ public sealed class EvidenceEndpointsTests }); using var client = factory.CreateClient(); -using StellaOps.TestKit; var response = await client.GetAsync("/api/v1/scans/nonexistent-scan/evidence"); // Current behavior: returns empty list (200 OK) for non-existent scans diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/FindingsEvidenceControllerTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/FindingsEvidenceControllerTests.cs index 29e4b5bab..ec23d2af8 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/FindingsEvidenceControllerTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/FindingsEvidenceControllerTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text.Json; using Microsoft.EntityFrameworkCore; @@ -123,7 +123,6 @@ public sealed class FindingsEvidenceControllerTests private static async Task SeedFindingAsync(ScannerApplicationFactory factory) { using var scope = factory.Services.CreateScope(); -using StellaOps.TestKit; var db = scope.ServiceProvider.GetRequiredService(); await db.Database.MigrateAsync(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/HealthEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/HealthEndpointsTests.cs index d7f7919c6..c64c30f44 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/HealthEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/HealthEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Net.Http.Json; +using System.Net.Http.Json; using StellaOps.TestKit; @@ -13,7 +13,6 @@ public sealed class HealthEndpointsTests using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var healthResponse = await client.GetAsync("/healthz"); Assert.True(healthResponse.IsSuccessStatusCode, $"Expected 200 from /healthz, received {(int)healthResponse.StatusCode}."); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/IdempotencyMiddlewareTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/IdempotencyMiddlewareTests.cs index 2193ec405..ee4552c90 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/IdempotencyMiddlewareTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/IdempotencyMiddlewareTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // IdempotencyMiddlewareTests.cs // Sprint: SPRINT_3500_0002_0003_proof_replay_api // Task: T6 - Unit Tests for Idempotency Middleware @@ -128,7 +128,6 @@ public sealed class IdempotencyMiddlewareTests await using var factory = CreateFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var content = new StringContent("""{"test":"nodigest"}""", Encoding.UTF8, "application/json"); // Not adding Content-Digest header - middleware should compute it diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ManifestEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ManifestEndpointsTests.cs index 4c07c9e99..62e0ca211 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ManifestEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ManifestEndpointsTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // ManifestEndpointsTests.cs // Sprint: SPRINT_3500_0002_0003_proof_replay_api // Task: T6 - Unit Tests for Manifest and Proof Bundle Endpoints @@ -420,7 +420,6 @@ public sealed class ManifestEndpointsTests // Arrange await using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var scanId = Guid.NewGuid(); // Act - Trailing slash with empty root hash diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/OfflineKitEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/OfflineKitEndpointsTests.cs index ebdcbf66a..b50ad866c 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/OfflineKitEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/OfflineKitEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Headers; using System.Security.Cryptography; using System.Text; @@ -239,7 +239,6 @@ public sealed class OfflineKitEndpointsTests private static (string KeyId, string PublicKeyPem, string DsseJson) CreateSignedDsse(byte[] bundleBytes) { using var rsa = RSA.Create(2048); -using StellaOps.TestKit; var publicKeyDer = rsa.ExportSubjectPublicKeyInfo(); var fingerprint = ComputeSha256Hex(publicKeyDer); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PlatformEventPublisherRegistrationTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PlatformEventPublisherRegistrationTests.cs index 47bb91dd0..1306bdfbd 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PlatformEventPublisherRegistrationTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PlatformEventPublisherRegistrationTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using StellaOps.Scanner.WebService.Options; using StellaOps.Scanner.WebService.Services; @@ -55,7 +55,6 @@ public sealed class PlatformEventPublisherRegistrationTests }); using var scope = factory.Services.CreateScope(); -using StellaOps.TestKit; var options = scope.ServiceProvider.GetRequiredService>().Value; Assert.True(options.Events.Enabled); Assert.Equal("redis", options.Events.Driver); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PolicyEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PolicyEndpointsTests.cs index ef167b0cc..f9f477cd8 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PolicyEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/PolicyEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text.Json; using System.Threading.Tasks; @@ -64,7 +64,6 @@ public sealed class PolicyEndpointsTests using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; const string policyYaml = """ version: "1.0" rules: diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ProofSpineEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ProofSpineEndpointsTests.cs index 1022ccbdd..3d2626df6 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ProofSpineEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ProofSpineEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Formats.Cbor; using System.Net; using System.Net.Http; @@ -179,7 +179,6 @@ public sealed class ProofSpineEndpointsTests await using var factory = new ScannerApplicationFactory(); using var scope = factory.Services.CreateScope(); -using StellaOps.TestKit; var builder = scope.ServiceProvider.GetRequiredService(); var repository = scope.ServiceProvider.GetRequiredService(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RateLimitingTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RateLimitingTests.cs index d54ef045f..385ab1c58 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RateLimitingTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RateLimitingTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // RateLimitingTests.cs // Sprint: SPRINT_3500_0002_0003_proof_replay_api // Task: T6 - Unit Tests for Rate Limiting @@ -175,7 +175,6 @@ public sealed class RateLimitingTests // Arrange await using var factory = CreateFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var scanId = Guid.NewGuid(); // Act - Requests from "anonymous" tenant diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReachabilityDriftEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReachabilityDriftEndpointsTests.cs index f7eb5956a..6121617ca 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReachabilityDriftEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReachabilityDriftEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Immutable; using System.Net; using System.Net.Http.Json; @@ -87,7 +87,6 @@ public sealed class ReachabilityDriftEndpointsTests private static async Task SeedCallGraphSnapshotsAsync(IServiceProvider services, string baseScanId, string headScanId) { using var scope = services.CreateScope(); -using StellaOps.TestKit; var repo = scope.ServiceProvider.GetRequiredService(); var baseSnapshot = CreateSnapshot( diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportSamplesTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportSamplesTests.cs index 0a2f554ff..11a9b0b4e 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportSamplesTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportSamplesTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text.Json; using System.Text.Json.Serialization; @@ -26,7 +26,6 @@ public sealed class ReportSamplesTests var path = Path.Combine(repoRoot, "samples", "api", "reports", "report-sample.dsse.json"); Assert.True(File.Exists(path), $"Sample file not found at {path}."); await using var stream = File.OpenRead(path); -using StellaOps.TestKit; var response = await JsonSerializer.DeserializeAsync(stream, SerializerOptions); Assert.NotNull(response); Assert.NotNull(response!.Report); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportsEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportsEndpointsTests.cs index 9bd3fcce5..085c10a8a 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportsEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ReportsEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text; using System.Text.Json; @@ -186,7 +186,6 @@ rules: using var client = factory.CreateClient(); -using StellaOps.TestKit; var request = new ReportRequestDto { ImageDigest = "sha256:cafebabe", diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RubyPackagesEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RubyPackagesEndpointsTests.cs index 8cde7e9bb..3b3968cc6 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RubyPackagesEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RubyPackagesEndpointsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; @@ -270,7 +270,6 @@ public sealed class RubyPackagesEndpointsTests } using var client = factory.CreateClient(); -using StellaOps.TestKit; var encodedDigest = Uri.EscapeDataString(digest); var response = await client.GetAsync($"/api/v1/scans/{encodedDigest}/entrytrace"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeEndpointsTests.cs index 8be16f439..09045669a 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeEndpointsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net; @@ -301,7 +301,6 @@ rules: [] using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var request = new RuntimePolicyRequestDto { Images = Array.Empty() diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeReconciliationTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeReconciliationTests.cs index 4aa9c229d..2d6b1f4a2 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeReconciliationTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/RuntimeReconciliationTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Net; @@ -597,7 +597,6 @@ public sealed class RuntimeReconciliationTests public Task PutAsync(ArtifactObjectDescriptor descriptor, Stream content, CancellationToken cancellationToken) { using var ms = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(ms); _store[$"{descriptor.Bucket}/{descriptor.Key}"] = ms.ToArray(); return Task.CompletedTask; diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomEndpointsTests.cs index 2df32961e..6e2ad05c2 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Net; using System.Net.Http.Json; using System.Text; @@ -85,7 +85,6 @@ public sealed class SbomEndpointsTests ArgumentNullException.ThrowIfNull(content); using var buffer = new MemoryStream(); -using StellaOps.TestKit; await content.CopyToAsync(buffer, cancellationToken).ConfigureAwait(false); var key = $"{descriptor.Bucket}:{descriptor.Key}"; diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomUploadEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomUploadEndpointsTests.cs index 1059b32d1..99c70a341 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomUploadEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SbomUploadEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Net; using System.Net.Http.Json; using Microsoft.Extensions.DependencyInjection; @@ -143,7 +143,6 @@ public sealed class SbomUploadEndpointsTests ArgumentNullException.ThrowIfNull(content); using var buffer = new MemoryStream(); -using StellaOps.TestKit; await content.CopyToAsync(buffer, cancellationToken).ConfigureAwait(false); var key = $"{descriptor.Bucket}:{descriptor.Key}"; diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScannerSurfaceSecretConfiguratorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScannerSurfaceSecretConfiguratorTests.cs index 31f66d706..1c30865dd 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScannerSurfaceSecretConfiguratorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScannerSurfaceSecretConfiguratorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Text; @@ -143,7 +143,6 @@ public sealed class ScannerSurfaceSecretConfiguratorTests """; using var handle = SurfaceSecretHandle.FromBytes(Encoding.UTF8.GetBytes(json)); -using StellaOps.TestKit; var secretProvider = new StubSecretProvider(new Dictionary(StringComparer.OrdinalIgnoreCase) { ["registry"] = handle diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Entropy.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Entropy.cs index bd16220fe..1cb7570be 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Entropy.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Entropy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Net.Http.Json; using System.Threading.Tasks; @@ -24,7 +24,6 @@ public sealed partial class ScansEndpointsTests using var client = factory.CreateClient(); -using StellaOps.TestKit; var submitResponse = await client.PostAsJsonAsync("/api/v1/scans", new { image = new { digest = "sha256:image-demo" } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.RecordMode.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.RecordMode.cs index b30398639..ddc01cca4 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.RecordMode.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.RecordMode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Net.Http.Json; @@ -100,7 +100,6 @@ public sealed partial class ScansEndpointsTests public Task PutAsync(ArtifactObjectDescriptor descriptor, Stream content, CancellationToken cancellationToken) { using var buffer = new MemoryStream(); -using StellaOps.TestKit; content.CopyTo(buffer); Objects[descriptor.Key] = buffer.ToArray(); return Task.CompletedTask; diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Replay.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Replay.cs index cd18d626a..cf80f850d 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Replay.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.Replay.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net.Http.Json; using System.Threading.Tasks; @@ -38,7 +38,6 @@ public sealed partial class ScansEndpointsTests var scanId = submitPayload!.ScanId; using var scope = factory.Services.CreateScope(); -using StellaOps.TestKit; var coordinator = scope.ServiceProvider.GetRequiredService(); var recordMode = scope.ServiceProvider.GetRequiredService(); var timeProvider = scope.ServiceProvider.GetRequiredService(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.cs index eea879913..49ec3d618 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/ScansEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Immutable; using System.Net; using System.Net.Http.Json; @@ -182,7 +182,6 @@ public sealed partial class ScansEndpointsTests }); using var client = factory.CreateClient(); -using StellaOps.TestKit; var response = await client.GetAsync("/api/v1/scans/scan-missing/entrytrace"); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SliceEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SliceEndpointsTests.cs index af1faf92b..a1df29326 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SliceEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/SliceEndpointsTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Net; using System.Net.Http.Json; using System.Text.Json; @@ -477,7 +477,6 @@ public sealed class SliceCacheTests // Arrange var options = Microsoft.Extensions.Options.Options.Create(new SliceCacheOptions { Enabled = false }); using var cache = new SliceCache(options); -using StellaOps.TestKit; var cacheResult = CreateTestCacheResult(); // Act diff --git a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/TriageStatusEndpointsTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/TriageStatusEndpointsTests.cs index 4bfb838ca..92c43c79e 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/TriageStatusEndpointsTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.WebService.Tests/TriageStatusEndpointsTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // TriageStatusEndpointsTests.cs // Sprint: SPRINT_4200_0001_0001_triage_rest_api // Description: Integration tests for triage status endpoints. @@ -189,7 +189,6 @@ public sealed class TriageStatusEndpointsTests using var factory = new ScannerApplicationFactory(); using var client = factory.CreateClient(); -using StellaOps.TestKit; var request = new BulkTriageQueryRequestDto { Limit = 10 diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/CompositeScanAnalyzerDispatcherTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/CompositeScanAnalyzerDispatcherTests.cs index 5b00c4ed7..7211d576f 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/CompositeScanAnalyzerDispatcherTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/CompositeScanAnalyzerDispatcherTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Collections.ObjectModel; @@ -317,7 +317,6 @@ public sealed class CompositeScanAnalyzerDispatcherTests await using var services = serviceCollection.BuildServiceProvider(); -using StellaOps.TestKit; var scopeFactory = services.GetRequiredService(); var loggerFactory = services.GetRequiredService(); var metrics = services.GetRequiredService(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/HmacDsseEnvelopeSignerTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/HmacDsseEnvelopeSignerTests.cs index a64e9fd81..6e06319d5 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/HmacDsseEnvelopeSignerTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/HmacDsseEnvelopeSignerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text; using System.Text.Json; using System.Threading; @@ -86,7 +86,6 @@ public sealed class HmacDsseEnvelopeSignerTests { var secret = Convert.FromBase64String(base64Secret); using var hmac = new System.Security.Cryptography.HMACSHA256(secret); -using StellaOps.TestKit; var pae = BuildPae(payloadType, payload); var signature = hmac.ComputeHash(pae); return Base64UrlEncode(signature); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/LeaseHeartbeatServiceTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/LeaseHeartbeatServiceTests.cs index d4b56a329..2ff44bbf3 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/LeaseHeartbeatServiceTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/LeaseHeartbeatServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -31,7 +31,6 @@ public sealed class LeaseHeartbeatServiceTests var optionsMonitor = new StaticOptionsMonitor(options); using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; var scheduler = new RecordingDelayScheduler(cts); var lease = new TestJobLease(TimeSpan.FromSeconds(90)); var randomProvider = new DeterministicRandomProvider(seed: 1337); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RedisWorkerSmokeTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RedisWorkerSmokeTests.cs index de5ee791c..091bd326e 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RedisWorkerSmokeTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RedisWorkerSmokeTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text; using System.Threading; @@ -91,7 +91,6 @@ public sealed class RedisWorkerSmokeTests var hostedService = provider.GetRequiredService(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); -using StellaOps.TestKit; await hostedService.StartAsync(cts.Token); var smokeObserver = provider.GetRequiredService(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RegistrySecretStageExecutorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RegistrySecretStageExecutorTests.cs index 0465d4f3d..3c7a7de1a 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RegistrySecretStageExecutorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/RegistrySecretStageExecutorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Metrics; using System.IO; @@ -94,7 +94,6 @@ public sealed class RegistrySecretStageExecutorTests var measurements = new List<(long Value, KeyValuePair[] Tags)>(); using var listener = CreateCounterListener("scanner_worker_registry_secret_requests_total", measurements); -using StellaOps.TestKit; await executor.ExecuteAsync(context, CancellationToken.None); listener.RecordObservableInstruments(); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/ScannerStorageSurfaceSecretConfiguratorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/ScannerStorageSurfaceSecretConfiguratorTests.cs index d2a7e943f..d6b5a421e 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/ScannerStorageSurfaceSecretConfiguratorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/ScannerStorageSurfaceSecretConfiguratorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Text; @@ -34,7 +34,6 @@ public sealed class ScannerStorageSurfaceSecretConfiguratorTests """; using var handle = SurfaceSecretHandle.FromBytes(Encoding.UTF8.GetBytes(json)); -using StellaOps.TestKit; var secretProvider = new StubSecretProvider(handle); var environment = new StubSurfaceEnvironment("tenant-eu"); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/SurfaceManifestStageExecutorTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/SurfaceManifestStageExecutorTests.cs index 0f9ec543b..5cb5bb692 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/SurfaceManifestStageExecutorTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/SurfaceManifestStageExecutorTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Collections.ObjectModel; @@ -526,7 +526,6 @@ public sealed class SurfaceManifestStageExecutorTests var determinismPayload = Assert.Single(publisher.LastRequest!.Payloads, p => p.Kind == "determinism.json"); using var document = JsonDocument.Parse(determinismPayload.Content); -using StellaOps.TestKit; var root = document.RootElement; Assert.True(root.GetProperty("fixedClock").GetBoolean()); diff --git a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/WorkerBasicScanScenarioTests.cs b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/WorkerBasicScanScenarioTests.cs index 950fc9fb1..9905ff856 100644 --- a/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/WorkerBasicScanScenarioTests.cs +++ b/src/Scanner/__Tests/StellaOps.Scanner.Worker.Tests/WorkerBasicScanScenarioTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; @@ -67,7 +67,6 @@ public sealed class WorkerBasicScanScenarioTests .AddLogging(builder => { builder.ClearProviders(); -using StellaOps.TestKit; builder.AddProvider(testLoggerProvider); builder.SetMinimumLevel(LogLevel.Debug); }) diff --git a/src/Scheduler/__Libraries/StellaOps.Scheduler.Storage.Postgres/Migrations/_archived/pre_1.0/README.md b/src/Scheduler/__Libraries/StellaOps.Scheduler.Storage.Postgres/Migrations/_archived/pre_1.0/README.md new file mode 100644 index 000000000..bdd936a11 --- /dev/null +++ b/src/Scheduler/__Libraries/StellaOps.Scheduler.Storage.Postgres/Migrations/_archived/pre_1.0/README.md @@ -0,0 +1,27 @@ +# Archived Pre-1.0 Migrations + +This directory contains the original migrations that were compacted into `001_initial_schema.sql` +for the 1.0.0 release. + +## Original Files +- `001_initial_schema.sql` - Initial schema (jobs, triggers, workers, schedules, runs) +- `002_graph_jobs.sql` - Graph jobs v2 schema with events table +- `003_runs_policy.sql` - Policy run jobs and impact snapshots +- `010_generated_columns_runs.sql` - Generated columns for runs stats +- `011_enable_rls.sql` - Row-Level Security for tenant isolation +- `012_partition_audit.sql` - Partitioned audit table (monthly) +- `012b_migrate_audit_data.sql` - Data migration for partitioned audit + +## Why Archived +Pre-1.0, the schema evolved incrementally. For 1.0.0, migrations were compacted into a single +initial schema to: +- Simplify new deployments +- Reduce startup time +- Provide cleaner upgrade path + +## For Existing Deployments +If upgrading from pre-1.0, run the reset script directly with psql: +```bash +psql -h -U -d -f devops/scripts/migrations-reset-pre-1.0.sql +``` +This updates `schema_migrations` to recognize the compacted schema. diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.ImpactIndex.Tests/FixtureImpactIndexTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.ImpactIndex.Tests/FixtureImpactIndexTests.cs index ef00817ca..2c713d64f 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.ImpactIndex.Tests/FixtureImpactIndexTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.ImpactIndex.Tests/FixtureImpactIndexTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -111,7 +111,6 @@ public sealed class FixtureImpactIndexTests }); using var _ = loggerFactory; -using StellaOps.TestKit; var result = await impactIndex.ResolveAllAsync(selector, usageOnly: false); result.Images.Should().HaveCount(6); diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/SamplePayloadTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/SamplePayloadTests.cs index 40acf9f16..a339e4099 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/SamplePayloadTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/SamplePayloadTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Immutable; using System.Text.Json; @@ -250,7 +250,6 @@ public sealed class SamplePayloadTests private static string NormalizeJson(string json) { using var document = JsonDocument.Parse(json); -using StellaOps.TestKit; return JsonSerializer.Serialize(document.RootElement, new JsonSerializerOptions { WriteIndented = false diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/ScheduleSerializationTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/ScheduleSerializationTests.cs index 0ddfbf1cc..0a4b46865 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/ScheduleSerializationTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.Models.Tests/ScheduleSerializationTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.Scheduler.Models; @@ -80,7 +80,6 @@ public sealed class ScheduleSerializationTests Assert.Equal(jsonA, jsonB); using var doc = JsonDocument.Parse(jsonA); -using StellaOps.TestKit; var root = doc.RootElement; Assert.Equal(SchedulerSchemaVersions.Schedule, root.GetProperty("schemaVersion").GetString()); Assert.Equal("analysis-only", root.GetProperty("mode").GetString()); diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/RedisSchedulerQueueTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/RedisSchedulerQueueTests.cs index 16b6349e9..070183f82 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/RedisSchedulerQueueTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/RedisSchedulerQueueTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -210,7 +210,6 @@ public sealed class RedisSchedulerQueueTests : IAsyncLifetime TimeProvider.System, async config => (IConnectionMultiplexer)await ConnectionMultiplexer.ConnectAsync(config).ConfigureAwait(false)); -using StellaOps.TestKit; var message = TestData.CreateRunnerMessage(); await queue.EnqueueAsync(message); diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/SchedulerQueueServiceCollectionExtensionsTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/SchedulerQueueServiceCollectionExtensionsTests.cs index 23d5eec94..a0266a469 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/SchedulerQueueServiceCollectionExtensionsTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.Queue.Tests/SchedulerQueueServiceCollectionExtensionsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -35,7 +35,6 @@ public sealed class SchedulerQueueServiceCollectionExtensionsTests await using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var plannerQueue = provider.GetRequiredService(); var runnerQueue = provider.GetRequiredService(); diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/CartographerWebhookClientTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/CartographerWebhookClientTests.cs index a8b07dbbc..311d37998 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/CartographerWebhookClientTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/CartographerWebhookClientTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; @@ -79,7 +79,6 @@ public sealed class CartographerWebhookClientTests var httpClient = new HttpClient(handler); var options = Microsoft.Extensions.Options.Options.Create(new SchedulerCartographerOptions()); using var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug()); -using StellaOps.TestKit; var client = new CartographerWebhookClient(httpClient, new OptionsMonitorStub(options), loggerFactory.CreateLogger()); var job = new GraphOverlayJob( diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/EventWebhookEndpointTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/EventWebhookEndpointTests.cs index 5ebbcc648..279da06d2 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/EventWebhookEndpointTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/EventWebhookEndpointTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using System.Security.Cryptography; @@ -127,7 +127,6 @@ public sealed class EventWebhookEndpointTests : IClassFixture= 1); diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobEventPublisherTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobEventPublisherTests.cs index 40622ce25..22fc802a5 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobEventPublisherTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobEventPublisherTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using StellaOps.Auth.Abstractions; using StellaOps.Scheduler.Models; @@ -73,7 +73,6 @@ public sealed class GraphJobEventPublisherTests var options = Microsoft.Extensions.Options.Options.Create(new SchedulerEventsOptions()); var loggerProvider = new ListLoggerProvider(); using var loggerFactory = LoggerFactory.Create(builder => builder.AddProvider(loggerProvider)); -using StellaOps.TestKit; var publisher = new GraphJobEventPublisher(new OptionsMonitorStub(options), new ThrowingRedisConnectionFactory(), loggerFactory.CreateLogger()); var overlayJob = new GraphOverlayJob( diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/PolicyRunEndpointTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/PolicyRunEndpointTests.cs index ed830146c..fa2b592cb 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/PolicyRunEndpointTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/PolicyRunEndpointTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.TestKit; @@ -66,7 +66,6 @@ public sealed class PolicyRunEndpointTests : IClassFixture> @@ -58,7 +58,6 @@ public sealed class ScheduleEndpointTests : IClassFixture PolicyRunTargetingResult.NoWork(job, "empty") diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/PolicySimulationWebhookClientTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/PolicySimulationWebhookClientTests.cs index d3788e43e..167d01944 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/PolicySimulationWebhookClientTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/PolicySimulationWebhookClientTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Net; using System.Net.Http; @@ -38,7 +38,6 @@ public sealed class PolicySimulationWebhookClientTests { var handler = new RecordingHandler(new HttpResponseMessage(HttpStatusCode.Accepted)); using var httpClient = new HttpClient(handler); -using StellaOps.TestKit; var options = CreateOptions(o => { o.Policy.Webhook.Enabled = true; diff --git a/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/RunnerExecutionServiceTests.cs b/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/RunnerExecutionServiceTests.cs index 4bbe95019..fa87b3d8d 100644 --- a/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/RunnerExecutionServiceTests.cs +++ b/src/Scheduler/__Tests/StellaOps.Scheduler.Worker.Tests/RunnerExecutionServiceTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -114,7 +114,6 @@ public sealed class RunnerExecutionServiceTests var eventPublisher = new RecordingSchedulerEventPublisher(); using var metrics = new SchedulerWorkerMetrics(); -using StellaOps.TestKit; var service = new RunnerExecutionService( repository, new RecordingRunSummaryService(), diff --git a/src/Signals/__Tests/StellaOps.Signals.Tests/CallgraphIngestionServiceTests.cs b/src/Signals/__Tests/StellaOps.Signals.Tests/CallgraphIngestionServiceTests.cs index 5e0e36525..d8043c072 100644 --- a/src/Signals/__Tests/StellaOps.Signals.Tests/CallgraphIngestionServiceTests.cs +++ b/src/Signals/__Tests/StellaOps.Signals.Tests/CallgraphIngestionServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Text; @@ -136,7 +136,6 @@ public class CallgraphIngestionServiceTests if (request.ManifestContent is not null) { using var manifestMs = new MemoryStream(); -using StellaOps.TestKit; request.ManifestContent.CopyTo(manifestMs); manifests[request.Hash] = manifestMs.ToArray(); } diff --git a/src/Signals/__Tests/StellaOps.Signals.Tests/EdgeBundleIngestionServiceTests.cs b/src/Signals/__Tests/StellaOps.Signals.Tests/EdgeBundleIngestionServiceTests.cs index 570bfd682..d21421cce 100644 --- a/src/Signals/__Tests/StellaOps.Signals.Tests/EdgeBundleIngestionServiceTests.cs +++ b/src/Signals/__Tests/StellaOps.Signals.Tests/EdgeBundleIngestionServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text; using System.Text.Json; @@ -244,7 +244,6 @@ public class EdgeBundleIngestionServiceTests using var stream1 = new MemoryStream(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(bundle1))); using var stream2 = new MemoryStream(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(bundle2))); -using StellaOps.TestKit; // Act await _service.IngestAsync(TestTenantId, stream1, null); await _service.IngestAsync(TestTenantId, stream2, null); diff --git a/src/Signals/__Tests/StellaOps.Signals.Tests/ReachabilityUnionIngestionServiceTests.cs b/src/Signals/__Tests/StellaOps.Signals.Tests/ReachabilityUnionIngestionServiceTests.cs index fdf451fe4..3e683ffc4 100644 --- a/src/Signals/__Tests/StellaOps.Signals.Tests/ReachabilityUnionIngestionServiceTests.cs +++ b/src/Signals/__Tests/StellaOps.Signals.Tests/ReachabilityUnionIngestionServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.IO.Compression; using System.Text.Json; @@ -88,7 +88,6 @@ public class ReachabilityUnionIngestionServiceTests private static string ComputeSha(string content) { using var sha = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; var bytes = System.Text.Encoding.UTF8.GetBytes(content); return Convert.ToHexString(sha.ComputeHash(bytes)).ToLowerInvariant(); } diff --git a/src/Signals/__Tests/StellaOps.Signals.Tests/RouterEventsPublisherTests.cs b/src/Signals/__Tests/StellaOps.Signals.Tests/RouterEventsPublisherTests.cs index 45fc65008..1e4105d12 100644 --- a/src/Signals/__Tests/StellaOps.Signals.Tests/RouterEventsPublisherTests.cs +++ b/src/Signals/__Tests/StellaOps.Signals.Tests/RouterEventsPublisherTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Linq; @@ -48,7 +48,6 @@ public class RouterEventsPublisherTests var options = CreateOptions(); var handler = new StubHandler(HttpStatusCode.InternalServerError, "boom"); using var httpClient = new HttpClient(handler) { BaseAddress = new Uri(options.Events.Router.BaseUrl) }; -using StellaOps.TestKit; var logger = new ListLogger(); var builder = new ReachabilityFactEventBuilder(options, TimeProvider.System); var publisher = new RouterEventsPublisher(builder, options, httpClient, logger); diff --git a/src/Signals/__Tests/StellaOps.Signals.Tests/RuntimeFactsBatchIngestionTests.cs b/src/Signals/__Tests/StellaOps.Signals.Tests/RuntimeFactsBatchIngestionTests.cs index 721e5b440..0ce06ecb8 100644 --- a/src/Signals/__Tests/StellaOps.Signals.Tests/RuntimeFactsBatchIngestionTests.cs +++ b/src/Signals/__Tests/StellaOps.Signals.Tests/RuntimeFactsBatchIngestionTests.cs @@ -1,4 +1,4 @@ -using System.IO.Compression; +using System.IO.Compression; using System.Text; using System.Text.Json; using Microsoft.Extensions.Logging.Abstractions; @@ -252,7 +252,6 @@ public class RuntimeFactsBatchIngestionTests public async Task SaveAsync(RuntimeFactsArtifactSaveRequest request, Stream content, CancellationToken cancellationToken) { using var ms = new MemoryStream(); -using StellaOps.TestKit; await content.CopyToAsync(ms, cancellationToken); var artifact = new StoredRuntimeFactsArtifact( diff --git a/src/Signals/__Tests/StellaOps.Signals.Tests/SimpleJsonCallgraphParserGateTests.cs b/src/Signals/__Tests/StellaOps.Signals.Tests/SimpleJsonCallgraphParserGateTests.cs index 747df98fc..a4909c2c4 100644 --- a/src/Signals/__Tests/StellaOps.Signals.Tests/SimpleJsonCallgraphParserGateTests.cs +++ b/src/Signals/__Tests/StellaOps.Signals.Tests/SimpleJsonCallgraphParserGateTests.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -48,7 +48,6 @@ public sealed class SimpleJsonCallgraphParserGateTests var parser = new SimpleJsonCallgraphParser("csharp"); await using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json), writable: false); -using StellaOps.TestKit; var parsed = await parser.ParseAsync(stream, CancellationToken.None); parsed.Edges.Should().ContainSingle(); diff --git a/src/Signals/__Tests/StellaOps.Signals.Tests/UnknownsDecayServiceTests.cs b/src/Signals/__Tests/StellaOps.Signals.Tests/UnknownsDecayServiceTests.cs index 591729504..db0349578 100644 --- a/src/Signals/__Tests/StellaOps.Signals.Tests/UnknownsDecayServiceTests.cs +++ b/src/Signals/__Tests/StellaOps.Signals.Tests/UnknownsDecayServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -310,7 +310,6 @@ public class UnknownsDecayServiceTests } using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; cts.Cancel(); await Assert.ThrowsAsync(() => diff --git a/src/StellaOps.Events.Provenance.Tests/StellaOps.Events.Provenance.Tests.csproj b/src/StellaOps.Events.Provenance.Tests/StellaOps.Events.Provenance.Tests.csproj deleted file mode 100644 index 1d9e29a60..000000000 --- a/src/StellaOps.Events.Provenance.Tests/StellaOps.Events.Provenance.Tests.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - net10.0 - enable - enable - false - true - - - - - - - - - - - - - - diff --git a/src/StellaOps.Infrastructure.sln b/src/StellaOps.Infrastructure.sln index d5d9e0c7f..a1a8ccd41 100644 --- a/src/StellaOps.Infrastructure.sln +++ b/src/StellaOps.Infrastructure.sln @@ -243,7 +243,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Registry.TokenSer EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Tests", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Tests\StellaOps.RiskEngine.Tests.csproj", "{0DCAB8B4-4D58-521B-B7CE-F931660BC02D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Events.Provenance.Tests", "src\StellaOps.Events.Provenance.Tests\StellaOps.Events.Provenance.Tests.csproj", "{8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Tests", "src\__Libraries\__Tests\StellaOps.Provenance.Tests\StellaOps.Provenance.Tests.csproj", "{8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Tests", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Tests\StellaOps.TimelineIndexer.Tests.csproj", "{928428D2-2BD5-59AB-8E56-7969B8A75B85}" EndProject diff --git a/src/StellaOps.Tests.sln b/src/StellaOps.Tests.sln index 75cc258a8..4c761cbfb 100644 --- a/src/StellaOps.Tests.sln +++ b/src/StellaOps.Tests.sln @@ -1191,7 +1191,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.KeyManagem EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Keyless", "Signer\__Libraries\StellaOps.Signer.Keyless\StellaOps.Signer.Keyless.csproj", "{3A4F8014-D187-4E50-9E10-C74ACEA328EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Events.Provenance.Tests", "StellaOps.Events.Provenance.Tests\StellaOps.Events.Provenance.Tests.csproj", "{A8046C0B-155F-49B5-B245-3831A46328DD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Tests", "__Libraries\__Tests\StellaOps.Provenance.Tests\StellaOps.Provenance.Tests.csproj", "{A8046C0B-155F-49B5-B245-3831A46328DD}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskRunner", "TaskRunner", "{BA975CA4-355E-F97E-9EA1-1FED130BDB21}" EndProject diff --git a/src/StellaOps.sln b/src/StellaOps.sln index d32a381e8..314fe93e0 100644 --- a/src/StellaOps.sln +++ b/src/StellaOps.sln @@ -1,1747 +1,1317 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 - Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AdvisoryAI", "AdvisoryAI", "{C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{8B8EE856-DA24-5594-8E25-C9D70E26C011}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI", "src\AdvisoryAI\StellaOps.AdvisoryAI\StellaOps.AdvisoryAI.csproj", "{B7141C87-33DB-5F99-8B8B-0C61725C2D6F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI", "AdvisoryAI\StellaOps.AdvisoryAI\StellaOps.AdvisoryAI.csproj", "{B7141C87-33DB-5F99-8B8B-0C61725C2D6F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Hosting", "src\AdvisoryAI\StellaOps.AdvisoryAI.Hosting\StellaOps.AdvisoryAI.Hosting.csproj", "{6C186BD5-9A4D-5318-8AF8-F1B7AE48D812}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Hosting", "AdvisoryAI\StellaOps.AdvisoryAI.Hosting\StellaOps.AdvisoryAI.Hosting.csproj", "{6C186BD5-9A4D-5318-8AF8-F1B7AE48D812}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{808A70AA-83E2-5AD8-8519-CB6E27E99E66}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Tests", "src\AdvisoryAI\__Tests\StellaOps.AdvisoryAI.Tests\StellaOps.AdvisoryAI.Tests.csproj", "{B7FBC156-D7DE-5962-BFC8-40F94D6C00F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Tests", "AdvisoryAI\__Tests\StellaOps.AdvisoryAI.Tests\StellaOps.AdvisoryAI.Tests.csproj", "{B7FBC156-D7DE-5962-BFC8-40F94D6C00F9}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{D86F0DB2-577A-5B46-8B4A-4D492CAB32D7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.WebService", "src\AdvisoryAI\StellaOps.AdvisoryAI.WebService\StellaOps.AdvisoryAI.WebService.csproj", "{112CFB30-3731-54C5-8E9F-7C2CC75C9B67}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.WebService", "AdvisoryAI\StellaOps.AdvisoryAI.WebService\StellaOps.AdvisoryAI.WebService.csproj", "{112CFB30-3731-54C5-8E9F-7C2CC75C9B67}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{D0FCFD53-225B-57FA-9073-6A88970B3E4F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Worker", "src\AdvisoryAI\StellaOps.AdvisoryAI.Worker\StellaOps.AdvisoryAI.Worker.csproj", "{51BA43C0-6861-5B57-A837-B6CECF8D0257}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Worker", "AdvisoryAI\StellaOps.AdvisoryAI.Worker\StellaOps.AdvisoryAI.Worker.csproj", "{51BA43C0-6861-5B57-A837-B6CECF8D0257}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AirGap", "AirGap", "{B30F10B5-2A8C-56C8-9D19-38190F2EC627}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{2E4D25DA-6B5D-5A5F-9F61-CDBF1DBB311D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Analyzers", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Analyzers\StellaOps.AirGap.Policy.Analyzers.csproj", "{7002B619-1F2A-5393-B348-70CDAC639748}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Analyzers", "AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Analyzers\StellaOps.AirGap.Policy.Analyzers.csproj", "{7002B619-1F2A-5393-B348-70CDAC639748}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{12FC57D8-ADE7-5756-85D4-AAABC06FAA0A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Controller", "AirGap\StellaOps.AirGap.Controller\StellaOps.AirGap.Controller.csproj", "{6D955BD2-7D9B-5495-9153-509864CF7096}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Controller", "src\AirGap\StellaOps.AirGap.Controller\StellaOps.AirGap.Controller.csproj", "{6D955BD2-7D9B-5495-9153-509864CF7096}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Importer", "AirGap\StellaOps.AirGap.Importer\StellaOps.AirGap.Importer.csproj", "{0EB72CBF-4405-5B0C-AF18-26764A0DB489}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Importer", "src\AirGap\StellaOps.AirGap.Importer\StellaOps.AirGap.Importer.csproj", "{0EB72CBF-4405-5B0C-AF18-26764A0DB489}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy", "AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.csproj", "{45DE9CF0-B55D-550D-8005-504FBF0F3CDF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.csproj", "{45DE9CF0-B55D-550D-8005-504FBF0F3CDF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Storage.Postgres", "AirGap\StellaOps.AirGap.Storage.Postgres\StellaOps.AirGap.Storage.Postgres.csproj", "{FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Storage.Postgres", "src\AirGap\StellaOps.AirGap.Storage.Postgres\StellaOps.AirGap.Storage.Postgres.csproj", "{FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Time", "src\AirGap\StellaOps.AirGap.Time\StellaOps.AirGap.Time.csproj", "{06AE06C1-E499-590D-88C0-E860AD7A7A32}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Time", "AirGap\StellaOps.AirGap.Time\StellaOps.AirGap.Time.csproj", "{06AE06C1-E499-590D-88C0-E860AD7A7A32}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{A80991C3-5D9B-5C12-92DE-691A7399F660}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Bundle", "src\AirGap\__Libraries\StellaOps.AirGap.Bundle\StellaOps.AirGap.Bundle.csproj", "{F07AE928-89B5-57F0-921C-3B97A376FF95}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Bundle", "AirGap\__Libraries\StellaOps.AirGap.Bundle\StellaOps.AirGap.Bundle.csproj", "{F07AE928-89B5-57F0-921C-3B97A376FF95}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{FC47E687-717F-5EF5-AE4E-EEB1B86E46FF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Bundle.Tests", "AirGap\__Libraries\__Tests\StellaOps.AirGap.Bundle.Tests\StellaOps.AirGap.Bundle.Tests.csproj", "{9FA8DD10-9178-588E-AC7E-F423FB235DA0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Controller.Tests", "src\__Tests\AirGap\StellaOps.AirGap.Controller.Tests\StellaOps.AirGap.Controller.Tests.csproj", "{DF2C5848-16B4-54E1-A976-9C548AAF3077}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Analyzers.Tests", "AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Analyzers.Tests\StellaOps.AirGap.Policy.Analyzers.Tests.csproj", "{452CFFEA-8914-5128-AC23-65C969E53523}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Importer.Tests", "src\__Tests\AirGap\StellaOps.AirGap.Importer.Tests\StellaOps.AirGap.Importer.Tests.csproj", "{6B905D2C-43E2-5637-9E98-393E5A3A1903}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Tests", "AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Tests\StellaOps.AirGap.Policy.Tests.csproj", "{343BB1E8-DB77-52DA-B2E2-406C72088E34}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Time.Tests", "src\__Tests\AirGap\StellaOps.AirGap.Time.Tests\StellaOps.AirGap.Time.Tests.csproj", "{9477476B-34BB-5A40-BAB2-ABA6DBFD9733}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Storage.Postgres.Tests", "AirGap\StellaOps.AirGap.Storage.Postgres.Tests\StellaOps.AirGap.Storage.Postgres.Tests.csproj", "{6E0B7B8D-58FF-5297-9497-5286822D5483}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Bundle.Tests", "src\AirGap\__Libraries\__Tests\StellaOps.AirGap.Bundle.Tests\StellaOps.AirGap.Bundle.Tests.csproj", "{9FA8DD10-9178-588E-AC7E-F423FB235DA0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Analyzers", "Aoc\__Analyzers\StellaOps.Aoc.Analyzers\StellaOps.Aoc.Analyzers.csproj", "{E2189FEA-63C0-5828-A60E-6F4D2B4DC724}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Importer.Tests", "src\AirGap\__Tests\StellaOps.AirGap.Importer.Tests\StellaOps.AirGap.Importer.Tests.csproj", "{58243870-C97F-5F26-B86F-BF1C0863BA0B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc", "Aoc\__Libraries\StellaOps.Aoc\StellaOps.Aoc.csproj", "{8609324D-8A33-5C72-843C-C9CDF861F6B0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Analyzers.Tests", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Analyzers.Tests\StellaOps.AirGap.Policy.Analyzers.Tests.csproj", "{452CFFEA-8914-5128-AC23-65C969E53523}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.AspNetCore", "Aoc\__Libraries\StellaOps.Aoc.AspNetCore\StellaOps.Aoc.AspNetCore.csproj", "{15346A13-8152-5B25-AA03-37AF5A883B94}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Tests", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Tests\StellaOps.AirGap.Policy.Tests.csproj", "{343BB1E8-DB77-52DA-B2E2-406C72088E34}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Analyzers.Tests", "Aoc\__Tests\StellaOps.Aoc.Analyzers.Tests\StellaOps.Aoc.Analyzers.Tests.csproj", "{A44B07A2-3C46-5AEF-9278-FC35BF3D020F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Storage.Postgres.Tests", "src\AirGap\StellaOps.AirGap.Storage.Postgres.Tests\StellaOps.AirGap.Storage.Postgres.Tests.csproj", "{6E0B7B8D-58FF-5297-9497-5286822D5483}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.AspNetCore.Tests", "Aoc\__Tests\StellaOps.Aoc.AspNetCore.Tests\StellaOps.Aoc.AspNetCore.Tests.csproj", "{AC5584D7-5085-5ED3-840C-0B82D7D2606A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aoc", "Aoc", "{7BDA5071-6A44-50AC-B3BF-075FA2B28DFD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Tests", "Aoc\__Tests\StellaOps.Aoc.Tests\StellaOps.Aoc.Tests.csproj", "{EEFF9AAC-ED84-55BF-8963-F5422023E379}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{EBE264E0-5321-50D4-97D7-27D2068685AA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestation", "Attestor\StellaOps.Attestation\StellaOps.Attestation.csproj", "{C011DDAB-DD11-5213-8857-437320BE11C2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Analyzers", "src\Aoc\__Analyzers\StellaOps.Aoc.Analyzers\StellaOps.Aoc.Analyzers.csproj", "{E2189FEA-63C0-5828-A60E-6F4D2B4DC724}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Core", "Attestor\StellaOps.Attestor\StellaOps.Attestor.Core\StellaOps.Attestor.Core.csproj", "{8ECC05DA-F183-5849-8840-D7DCD7E80819}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{CEA98078-2A40-5BD7-A10B-D41932877106}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Infrastructure", "Attestor\StellaOps.Attestor\StellaOps.Attestor.Infrastructure\StellaOps.Attestor.Infrastructure.csproj", "{2A7DBD4D-B339-5CBA-889F-358076B03D58}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc", "src\Aoc\__Libraries\StellaOps.Aoc\StellaOps.Aoc.csproj", "{8609324D-8A33-5C72-843C-C9CDF861F6B0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope", "Attestor\StellaOps.Attestor.Envelope\StellaOps.Attestor.Envelope.csproj", "{4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.AspNetCore", "src\Aoc\__Libraries\StellaOps.Aoc.AspNetCore\StellaOps.Aoc.AspNetCore.csproj", "{15346A13-8152-5B25-AA03-37AF5A883B94}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Types.Generator", "Attestor\StellaOps.Attestor.Types\Tools\StellaOps.Attestor.Types.Generator\StellaOps.Attestor.Types.Generator.csproj", "{ECC3FD89-64D0-5048-A6E8-44470269D172}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{093AF0FF-6681-598B-8B09-AB6DD8FEC4A5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Verify", "Attestor\StellaOps.Attestor.Verify\StellaOps.Attestor.Verify.csproj", "{7200949F-B6B8-5857-9ECC-F43FA9C03A44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Analyzers.Tests", "src\Aoc\__Tests\StellaOps.Aoc.Analyzers.Tests\StellaOps.Aoc.Analyzers.Tests.csproj", "{A44B07A2-3C46-5AEF-9278-FC35BF3D020F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundle", "Attestor\__Libraries\StellaOps.Attestor.Bundle\StellaOps.Attestor.Bundle.csproj", "{D367AE34-6CDE-5367-AE59-D9D037149B00}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.AspNetCore.Tests", "src\Aoc\__Tests\StellaOps.Aoc.AspNetCore.Tests\StellaOps.Aoc.AspNetCore.Tests.csproj", "{AC5584D7-5085-5ED3-840C-0B82D7D2606A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundling", "Attestor\__Libraries\StellaOps.Attestor.Bundling\StellaOps.Attestor.Bundling.csproj", "{147ED816-086E-5914-ACF0-4E30516BF50C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Tests", "src\Aoc\__Tests\StellaOps.Aoc.Tests\StellaOps.Aoc.Tests.csproj", "{EEFF9AAC-ED84-55BF-8963-F5422023E379}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.GraphRoot", "Attestor\__Libraries\StellaOps.Attestor.GraphRoot\StellaOps.Attestor.GraphRoot.csproj", "{80561E59-C6A9-5F30-8BD2-053866ADBEE9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Attestor", "Attestor", "{9682BDC3-495E-5D69-AEF6-08F675D6896B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Offline", "Attestor\__Libraries\StellaOps.Attestor.Offline\StellaOps.Attestor.Offline.csproj", "{4149C8AA-1BE2-5722-8114-8F1928B8B3F0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{F28A412B-CA0F-515B-BFF5-A258C78E41D4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Persistence", "Attestor\__Libraries\StellaOps.Attestor.Persistence\StellaOps.Attestor.Persistence.csproj", "{27982DF8-303D-5C8C-8595-FEFA9033F98A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestation", "src\Attestor\StellaOps.Attestation\StellaOps.Attestation.csproj", "{C011DDAB-DD11-5213-8857-437320BE11C2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.ProofChain", "Attestor\__Libraries\StellaOps.Attestor.ProofChain\StellaOps.Attestor.ProofChain.csproj", "{0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Core", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Core\StellaOps.Attestor.Core.csproj", "{8ECC05DA-F183-5849-8840-D7DCD7E80819}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.StandardPredicates", "Attestor\__Libraries\StellaOps.Attestor.StandardPredicates\StellaOps.Attestor.StandardPredicates.csproj", "{E41F4F80-1D92-59D8-9F97-48BF0BBAD093}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Infrastructure", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Infrastructure\StellaOps.Attestor.Infrastructure.csproj", "{2A7DBD4D-B339-5CBA-889F-358076B03D58}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.GraphRoot.Tests", "Attestor\__Libraries\__Tests\StellaOps.Attestor.GraphRoot.Tests\StellaOps.Attestor.GraphRoot.Tests.csproj", "{E71D7DB0-F816-5D1F-B86A-E01E806D7B12}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope", "src\Attestor\StellaOps.Attestor.Envelope\StellaOps.Attestor.Envelope.csproj", "{4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundle.Tests", "Attestor\__Tests\StellaOps.Attestor.Bundle.Tests\StellaOps.Attestor.Bundle.Tests.csproj", "{EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Types.Generator", "src\Attestor\StellaOps.Attestor.Types\Tools\StellaOps.Attestor.Types.Generator\StellaOps.Attestor.Types.Generator.csproj", "{ECC3FD89-64D0-5048-A6E8-44470269D172}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundling.Tests", "Attestor\__Tests\StellaOps.Attestor.Bundling.Tests\StellaOps.Attestor.Bundling.Tests.csproj", "{EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Verify", "src\Attestor\StellaOps.Attestor.Verify\StellaOps.Attestor.Verify.csproj", "{7200949F-B6B8-5857-9ECC-F43FA9C03A44}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Offline.Tests", "Attestor\__Tests\StellaOps.Attestor.Offline.Tests\StellaOps.Attestor.Offline.Tests.csproj", "{B318A6FB-EBF7-5061-85B2-7542D71D226B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{CA93333F-B07B-5C2F-BB5A-B02A27EC6C99}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Persistence.Tests", "Attestor\__Tests\StellaOps.Attestor.Persistence.Tests\StellaOps.Attestor.Persistence.Tests.csproj", "{5671223D-C370-5DD1-98D6-D27C3CA6A602}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundle", "src\Attestor\__Libraries\StellaOps.Attestor.Bundle\StellaOps.Attestor.Bundle.csproj", "{D367AE34-6CDE-5367-AE59-D9D037149B00}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.ProofChain.Tests", "Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\StellaOps.Attestor.ProofChain.Tests.csproj", "{EE2D63D4-B7CA-5933-BE1F-05AABF69703E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundling", "src\Attestor\__Libraries\StellaOps.Attestor.Bundling\StellaOps.Attestor.Bundling.csproj", "{147ED816-086E-5914-ACF0-4E30516BF50C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.StandardPredicates.Tests", "Attestor\__Tests\StellaOps.Attestor.StandardPredicates.Tests\StellaOps.Attestor.StandardPredicates.Tests.csproj", "{A83FA14F-39A9-57EF-A49D-3EC86731F56E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.GraphRoot", "src\Attestor\__Libraries\StellaOps.Attestor.GraphRoot\StellaOps.Attestor.GraphRoot.csproj", "{80561E59-C6A9-5F30-8BD2-053866ADBEE9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Types.Tests", "Attestor\__Tests\StellaOps.Attestor.Types.Tests\StellaOps.Attestor.Types.Tests.csproj", "{AB83BC75-CF32-506D-9B8A-EBBDD2C28A56}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Offline", "src\Attestor\__Libraries\StellaOps.Attestor.Offline\StellaOps.Attestor.Offline.csproj", "{4149C8AA-1BE2-5722-8114-8F1928B8B3F0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestation.Tests", "Attestor\StellaOps.Attestation.Tests\StellaOps.Attestation.Tests.csproj", "{3E514FD3-4036-51D5-976B-CD18121684BD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Persistence", "src\Attestor\__Libraries\StellaOps.Attestor.Persistence\StellaOps.Attestor.Persistence.csproj", "{27982DF8-303D-5C8C-8595-FEFA9033F98A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Core.Tests", "Attestor\StellaOps.Attestor\StellaOps.Attestor.Core.Tests\StellaOps.Attestor.Core.Tests.csproj", "{C10EF177-5C79-5A55-AE28-360DAB3D252C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.ProofChain", "src\Attestor\__Libraries\StellaOps.Attestor.ProofChain\StellaOps.Attestor.ProofChain.csproj", "{0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Tests", "Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\StellaOps.Attestor.Tests.csproj", "{07FD7BF7-7756-5854-8DDB-41478A34BB64}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.StandardPredicates", "src\Attestor\__Libraries\StellaOps.Attestor.StandardPredicates\StellaOps.Attestor.StandardPredicates.csproj", "{E41F4F80-1D92-59D8-9F97-48BF0BBAD093}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope.Tests", "Attestor\StellaOps.Attestor.Envelope\__Tests\StellaOps.Attestor.Envelope.Tests\StellaOps.Attestor.Envelope.Tests.csproj", "{508E13BB-305B-58B8-9F2E-E9759874DF0A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F8F38682-4EB1-59F7-86C3-5464582178A1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.GraphRoot.Tests", "src\Attestor\__Libraries\__Tests\StellaOps.Attestor.GraphRoot.Tests\StellaOps.Attestor.GraphRoot.Tests.csproj", "{E71D7DB0-F816-5D1F-B86A-E01E806D7B12}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundle.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Bundle.Tests\StellaOps.Attestor.Bundle.Tests.csproj", "{EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundling.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Bundling.Tests\StellaOps.Attestor.Bundling.Tests.csproj", "{EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Offline.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Offline.Tests\StellaOps.Attestor.Offline.Tests.csproj", "{B318A6FB-EBF7-5061-85B2-7542D71D226B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Persistence.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Persistence.Tests\StellaOps.Attestor.Persistence.Tests.csproj", "{5671223D-C370-5DD1-98D6-D27C3CA6A602}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.ProofChain.Tests", "src\Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\StellaOps.Attestor.ProofChain.Tests.csproj", "{EE2D63D4-B7CA-5933-BE1F-05AABF69703E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.StandardPredicates.Tests", "src\Attestor\__Tests\StellaOps.Attestor.StandardPredicates.Tests\StellaOps.Attestor.StandardPredicates.Tests.csproj", "{A83FA14F-39A9-57EF-A49D-3EC86731F56E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Types.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Types.Tests\StellaOps.Attestor.Types.Tests.csproj", "{AB83BC75-CF32-506D-9B8A-EBBDD2C28A56}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestation.Tests", "src\Attestor\StellaOps.Attestation.Tests\StellaOps.Attestation.Tests.csproj", "{3E514FD3-4036-51D5-976B-CD18121684BD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Core.Tests", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Core.Tests\StellaOps.Attestor.Core.Tests.csproj", "{C10EF177-5C79-5A55-AE28-360DAB3D252C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Tests", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\StellaOps.Attestor.Tests.csproj", "{07FD7BF7-7756-5854-8DDB-41478A34BB64}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope.Tests", "src\Attestor\StellaOps.Attestor.Envelope\__Tests\StellaOps.Attestor.Envelope.Tests\StellaOps.Attestor.Envelope.Tests.csproj", "{508E13BB-305B-58B8-9F2E-E9759874DF0A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope.Tests", "src\Attestor\StellaOps.Attestor.Envelope\StellaOps.Attestor.Envelope.Tests\StellaOps.Attestor.Envelope.Tests.csproj", "{6778FAEB-4621-54D3-BF75-0FDB99C6751D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CC9FE15F-1FAB-5208-8565-F3811229EC86}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.WebService", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.WebService\StellaOps.Attestor.WebService.csproj", "{8DCF30E6-164B-55D5-A003-0A4D890A4492}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.WebService", "Attestor\StellaOps.Attestor\StellaOps.Attestor.WebService\StellaOps.Attestor.WebService.csproj", "{8DCF30E6-164B-55D5-A003-0A4D890A4492}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authority", "Authority", "{13FB3AA9-46DD-52F5-B76A-60A506410DCF}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{622E0872-E547-5108-92BB-AE38EFB35E5A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions", "Authority\StellaOps.Authority\StellaOps.Auth.Abstractions\StellaOps.Auth.Abstractions.csproj", "{38E42693-FC3C-569F-909A-B24AD24AD1DA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions", "src\Authority\StellaOps.Authority\StellaOps.Auth.Abstractions\StellaOps.Auth.Abstractions.csproj", "{38E42693-FC3C-569F-909A-B24AD24AD1DA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client", "Authority\StellaOps.Authority\StellaOps.Auth.Client\StellaOps.Auth.Client.csproj", "{0192EA27-7AE0-5952-B74A-32CF87973F79}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client", "src\Authority\StellaOps.Authority\StellaOps.Auth.Client\StellaOps.Auth.Client.csproj", "{0192EA27-7AE0-5952-B74A-32CF87973F79}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration", "Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration\StellaOps.Auth.ServerIntegration.csproj", "{E8A66716-1110-5DB7-81B3-8D2F403419D1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration", "src\Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration\StellaOps.Auth.ServerIntegration.csproj", "{E8A66716-1110-5DB7-81B3-8D2F403419D1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority", "Authority\StellaOps.Authority\StellaOps.Authority\StellaOps.Authority.csproj", "{980E3CD4-3D1E-55B0-9D46-3944D82B1506}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority", "src\Authority\StellaOps.Authority\StellaOps.Authority\StellaOps.Authority.csproj", "{980E3CD4-3D1E-55B0-9D46-3944D82B1506}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.InMemory", "Authority\StellaOps.Authority\StellaOps.Authority.Storage.InMemory\StellaOps.Authority.Storage.InMemory.csproj", "{0C89A31F-44DE-59E0-843E-6608861D032B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.InMemory", "src\Authority\StellaOps.Authority\StellaOps.Authority.Storage.InMemory\StellaOps.Authority.Storage.InMemory.csproj", "{0C89A31F-44DE-59E0-843E-6608861D032B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Core", "Authority\__Libraries\StellaOps.Authority.Core\StellaOps.Authority.Core.csproj", "{72F73293-EFAC-5D27-911E-E6752D9E96FB}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Core", "src\Authority\__Libraries\StellaOps.Authority.Core\StellaOps.Authority.Core.csproj", "{72F73293-EFAC-5D27-911E-E6752D9E96FB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.Postgres", "src\Authority\__Libraries\StellaOps.Authority.Storage.Postgres\StellaOps.Authority.Storage.Postgres.csproj", "{0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.Postgres", "Authority\__Libraries\StellaOps.Authority.Storage.Postgres\StellaOps.Authority.Storage.Postgres.csproj", "{0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{66839ADE-60D3-54EB-8BAB-304B9B423C25}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Ldap", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Ldap\StellaOps.Authority.Plugin.Ldap.csproj", "{F0011F9C-EF86-578B-B25C-DFBFD8B2D137}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Ldap", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Ldap\StellaOps.Authority.Plugin.Ldap.csproj", "{F0011F9C-EF86-578B-B25C-DFBFD8B2D137}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Oidc", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Oidc\StellaOps.Authority.Plugin.Oidc.csproj", "{18566A49-CB0D-5662-AB0E-22DE76024FE9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Oidc", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Oidc\StellaOps.Authority.Plugin.Oidc.csproj", "{18566A49-CB0D-5662-AB0E-22DE76024FE9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Saml", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Saml\StellaOps.Authority.Plugin.Saml.csproj", "{68D84C0C-5272-5673-B8BF-1D5424885EC8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Saml", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Saml\StellaOps.Authority.Plugin.Saml.csproj", "{68D84C0C-5272-5673-B8BF-1D5424885EC8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Standard", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Standard\StellaOps.Authority.Plugin.Standard.csproj", "{D36617C5-65AC-578F-8139-DF3D0BD91E55}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Standard", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Standard\StellaOps.Authority.Plugin.Standard.csproj", "{D36617C5-65AC-578F-8139-DF3D0BD91E55}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions\StellaOps.Authority.Plugins.Abstractions.csproj", "{731333C9-6F41-5AD4-9B59-C3FAEE2A31A0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions", "Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions\StellaOps.Authority.Plugins.Abstractions.csproj", "{731333C9-6F41-5AD4-9B59-C3FAEE2A31A0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A9571EDE-BA3F-5E26-84E9-649A5EA02C55}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Core.Tests", "Authority\__Tests\StellaOps.Authority.Core.Tests\StellaOps.Authority.Core.Tests.csproj", "{4C4A8491-4950-51C3-A134-89DEA080AFCF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Core.Tests", "src\Authority\__Tests\StellaOps.Authority.Core.Tests\StellaOps.Authority.Core.Tests.csproj", "{4C4A8491-4950-51C3-A134-89DEA080AFCF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.Postgres.Tests", "Authority\__Tests\StellaOps.Authority.Storage.Postgres.Tests\StellaOps.Authority.Storage.Postgres.Tests.csproj", "{EF039F88-3A55-5F6F-A7F7-DC91AAF85B82}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.Postgres.Tests", "src\Authority\__Tests\StellaOps.Authority.Storage.Postgres.Tests\StellaOps.Authority.Storage.Postgres.Tests.csproj", "{EF039F88-3A55-5F6F-A7F7-DC91AAF85B82}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions.Tests", "Authority\StellaOps.Authority\StellaOps.Auth.Abstractions.Tests\StellaOps.Auth.Abstractions.Tests.csproj", "{841F79A2-944F-5807-AB6A-1BFF74278DB4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions.Tests", "src\Authority\StellaOps.Authority\StellaOps.Auth.Abstractions.Tests\StellaOps.Auth.Abstractions.Tests.csproj", "{841F79A2-944F-5807-AB6A-1BFF74278DB4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client.Tests", "Authority\StellaOps.Authority\StellaOps.Auth.Client.Tests\StellaOps.Auth.Client.Tests.csproj", "{501C9952-398B-503E-8C13-B67848D9DBB1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client.Tests", "src\Authority\StellaOps.Authority\StellaOps.Auth.Client.Tests\StellaOps.Auth.Client.Tests.csproj", "{501C9952-398B-503E-8C13-B67848D9DBB1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration.Tests", "Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration.Tests\StellaOps.Auth.ServerIntegration.Tests.csproj", "{30593F8A-492A-5484-BE89-858A29FE5A58}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration.Tests", "src\Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration.Tests\StellaOps.Auth.ServerIntegration.Tests.csproj", "{30593F8A-492A-5484-BE89-858A29FE5A58}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Ldap.Tests", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Ldap.Tests\StellaOps.Authority.Plugin.Ldap.Tests.csproj", "{80590588-9B02-52C7-B783-F3C6B0A2C023}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Ldap.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Ldap.Tests\StellaOps.Authority.Plugin.Ldap.Tests.csproj", "{80590588-9B02-52C7-B783-F3C6B0A2C023}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Oidc.Tests", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Oidc.Tests\StellaOps.Authority.Plugin.Oidc.Tests.csproj", "{3611A8A7-BCBA-58AC-905C-420D1018D814}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Oidc.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Oidc.Tests\StellaOps.Authority.Plugin.Oidc.Tests.csproj", "{3611A8A7-BCBA-58AC-905C-420D1018D814}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Saml.Tests", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Saml.Tests\StellaOps.Authority.Plugin.Saml.Tests.csproj", "{E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Saml.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Saml.Tests\StellaOps.Authority.Plugin.Saml.Tests.csproj", "{E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Standard.Tests", "Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Standard.Tests\StellaOps.Authority.Plugin.Standard.Tests.csproj", "{82ACA55C-69E9-5488-9383-26C6C2FEE1B0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Standard.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Standard.Tests\StellaOps.Authority.Plugin.Standard.Tests.csproj", "{82ACA55C-69E9-5488-9383-26C6C2FEE1B0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions.Tests", "Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions.Tests\StellaOps.Authority.Plugins.Abstractions.Tests.csproj", "{5CE0902E-68CA-536E-AAC5-58041DDA1730}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions.Tests\StellaOps.Authority.Plugins.Abstractions.Tests.csproj", "{5CE0902E-68CA-536E-AAC5-58041DDA1730}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Tests\StellaOps.Authority.Tests.csproj", "{869157C1-588F-531E-BFD3-5D78FD91BC99}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Tests", "Authority\StellaOps.Authority\StellaOps.Authority.Tests\StellaOps.Authority.Tests.csproj", "{869157C1-588F-531E-BFD3-5D78FD91BC99}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bench", "Bench", "{9E7391C6-F886-5F94-A0DF-3D42C0688136}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{BF6F75A1-C290-5F91-9E7E-427932080486}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge", "src\Bench\StellaOps.Bench\LinkNotMerge\StellaOps.Bench.LinkNotMerge\StellaOps.Bench.LinkNotMerge.csproj", "{B330A47C-BCA1-5406-B432-56115A665839}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge", "Bench\StellaOps.Bench\LinkNotMerge\StellaOps.Bench.LinkNotMerge\StellaOps.Bench.LinkNotMerge.csproj", "{B330A47C-BCA1-5406-B432-56115A665839}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Vex", "src\Bench\StellaOps.Bench\LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex.csproj", "{689E3E97-E53C-5A3D-8938-0587D6B21CD1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Vex", "Bench\StellaOps.Bench\LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex.csproj", "{689E3E97-E53C-5A3D-8938-0587D6B21CD1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.Notify", "src\Bench\StellaOps.Bench\Notify\StellaOps.Bench.Notify\StellaOps.Bench.Notify.csproj", "{7AA23462-E017-562D-9463-8C5B750E9496}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.Notify", "Bench\StellaOps.Bench\Notify\StellaOps.Bench.Notify\StellaOps.Bench.Notify.csproj", "{7AA23462-E017-562D-9463-8C5B750E9496}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.PolicyEngine", "src\Bench\StellaOps.Bench\PolicyEngine\StellaOps.Bench.PolicyEngine\StellaOps.Bench.PolicyEngine.csproj", "{08D3BB86-4F4B-5C8B-B343-2207C0FA03CE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.PolicyEngine", "Bench\StellaOps.Bench\PolicyEngine\StellaOps.Bench.PolicyEngine\StellaOps.Bench.PolicyEngine.csproj", "{08D3BB86-4F4B-5C8B-B343-2207C0FA03CE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ScannerAnalyzers", "src\Bench\StellaOps.Bench\Scanner.Analyzers\StellaOps.Bench.ScannerAnalyzers\StellaOps.Bench.ScannerAnalyzers.csproj", "{CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ScannerAnalyzers", "Bench\StellaOps.Bench\Scanner.Analyzers\StellaOps.Bench.ScannerAnalyzers\StellaOps.Bench.ScannerAnalyzers.csproj", "{CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{05EC3129-9EDA-58C4-964B-E263C0D2F2C4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.BinaryLookup", "__Tests\__Benchmarks\binary-lookup\StellaOps.Bench.BinaryLookup.csproj", "{2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.BinaryLookup", "src\__Tests\__Benchmarks\binary-lookup\StellaOps.Bench.BinaryLookup.csproj", "{2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ProofChain", "__Tests\__Benchmarks\proof-chain\StellaOps.Bench.ProofChain.csproj", "{0FAB272B-4502-5AE8-8B93-828EA37BE954}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ProofChain", "src\__Tests\__Benchmarks\proof-chain\StellaOps.Bench.ProofChain.csproj", "{0FAB272B-4502-5AE8-8B93-828EA37BE954}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Tests", "Bench\StellaOps.Bench\LinkNotMerge\StellaOps.Bench.LinkNotMerge.Tests\StellaOps.Bench.LinkNotMerge.Tests.csproj", "{EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Tests", "src\Bench\StellaOps.Bench\LinkNotMerge\StellaOps.Bench.LinkNotMerge.Tests\StellaOps.Bench.LinkNotMerge.Tests.csproj", "{EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Vex.Tests", "Bench\StellaOps.Bench\LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex.Tests\StellaOps.Bench.LinkNotMerge.Vex.Tests.csproj", "{B11C615A-8910-5102-8841-D3AC7BF7D63D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Vex.Tests", "src\Bench\StellaOps.Bench\LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex.Tests\StellaOps.Bench.LinkNotMerge.Vex.Tests.csproj", "{B11C615A-8910-5102-8841-D3AC7BF7D63D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.Notify.Tests", "Bench\StellaOps.Bench\Notify\StellaOps.Bench.Notify.Tests\StellaOps.Bench.Notify.Tests.csproj", "{ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.Notify.Tests", "src\Bench\StellaOps.Bench\Notify\StellaOps.Bench.Notify.Tests\StellaOps.Bench.Notify.Tests.csproj", "{ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ScannerAnalyzers.Tests", "Bench\StellaOps.Bench\Scanner.Analyzers\StellaOps.Bench.ScannerAnalyzers.Tests\StellaOps.Bench.ScannerAnalyzers.Tests.csproj", "{5E92A1DF-1B82-5B8D-B6A0-40B362A7230F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ScannerAnalyzers.Tests", "src\Bench\StellaOps.Bench\Scanner.Analyzers\StellaOps.Bench.ScannerAnalyzers.Tests\StellaOps.Bench.ScannerAnalyzers.Tests.csproj", "{5E92A1DF-1B82-5B8D-B6A0-40B362A7230F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Cache", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Cache\StellaOps.BinaryIndex.Cache.csproj", "{6FFD945A-2042-5A65-9021-BF77FB66C3A9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BinaryIndex", "BinaryIndex", "{A88F9635-0E95-506D-8AE1-670D45B847BD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Core", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Core\StellaOps.BinaryIndex.Core.csproj", "{C41CA6D1-6D61-5210-B33C-4ED58D96C319}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{253E1793-19BF-56D0-8F84-D3B3B3F88BFD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus\StellaOps.BinaryIndex.Corpus.csproj", "{28467D65-21AF-5711-8DA3-7EB8C258E8F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Cache", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Cache\StellaOps.BinaryIndex.Cache.csproj", "{6FFD945A-2042-5A65-9021-BF77FB66C3A9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Alpine", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Alpine\StellaOps.BinaryIndex.Corpus.Alpine.csproj", "{A4A8CF8E-6CE7-5384-8756-71838B0DD5E0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Core", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Core\StellaOps.BinaryIndex.Core.csproj", "{C41CA6D1-6D61-5210-B33C-4ED58D96C319}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Debian", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Debian\StellaOps.BinaryIndex.Corpus.Debian.csproj", "{7E648DEF-9BFA-5E59-B4BD-3518CD63C833}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus\StellaOps.BinaryIndex.Corpus.csproj", "{28467D65-21AF-5711-8DA3-7EB8C258E8F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Rpm", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Rpm\StellaOps.BinaryIndex.Corpus.Rpm.csproj", "{EA34E87C-D188-5ED7-A221-01D1677F8657}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Alpine", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Alpine\StellaOps.BinaryIndex.Corpus.Alpine.csproj", "{A4A8CF8E-6CE7-5384-8756-71838B0DD5E0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Fingerprints", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Fingerprints\StellaOps.BinaryIndex.Fingerprints.csproj", "{6BD4B5F7-8974-5010-B9F6-53CB24DE6C06}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Debian", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Debian\StellaOps.BinaryIndex.Corpus.Debian.csproj", "{7E648DEF-9BFA-5E59-B4BD-3518CD63C833}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.FixIndex", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.FixIndex\StellaOps.BinaryIndex.FixIndex.csproj", "{95AD2F0E-8D9D-541C-9E08-4DE9C89B867F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Rpm", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Rpm\StellaOps.BinaryIndex.Corpus.Rpm.csproj", "{EA34E87C-D188-5ED7-A221-01D1677F8657}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Persistence", "BinaryIndex\__Libraries\StellaOps.BinaryIndex.Persistence\StellaOps.BinaryIndex.Persistence.csproj", "{EA4F9B01-0644-534A-AA8D-81B5E2BD3A31}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Fingerprints", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Fingerprints\StellaOps.BinaryIndex.Fingerprints.csproj", "{6BD4B5F7-8974-5010-B9F6-53CB24DE6C06}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Core.Tests", "BinaryIndex\__Tests\StellaOps.BinaryIndex.Core.Tests\StellaOps.BinaryIndex.Core.Tests.csproj", "{82362C0E-5A23-51EC-A539-38DC2C8B18C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.FixIndex", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.FixIndex\StellaOps.BinaryIndex.FixIndex.csproj", "{95AD2F0E-8D9D-541C-9E08-4DE9C89B867F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Fingerprints.Tests", "BinaryIndex\__Tests\StellaOps.BinaryIndex.Fingerprints.Tests\StellaOps.BinaryIndex.Fingerprints.Tests.csproj", "{E8A4DA95-0028-56E3-876D-964AB6285B86}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Persistence", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Persistence\StellaOps.BinaryIndex.Persistence.csproj", "{EA4F9B01-0644-534A-AA8D-81B5E2BD3A31}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Persistence.Tests", "BinaryIndex\__Tests\StellaOps.BinaryIndex.Persistence.Tests\StellaOps.BinaryIndex.Persistence.Tests.csproj", "{E85B9476-FCE0-557B-9598-FD46D59F7846}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{50708606-307A-5BED-AF2D-8FDCB9C05220}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cartographer", "Cartographer\StellaOps.Cartographer\StellaOps.Cartographer.csproj", "{717BBC3C-0048-5728-9246-E54BCF73FDA0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Core.Tests", "src\BinaryIndex\__Tests\StellaOps.BinaryIndex.Core.Tests\StellaOps.BinaryIndex.Core.Tests.csproj", "{82362C0E-5A23-51EC-A539-38DC2C8B18C6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cartographer.Tests", "Cartographer\__Tests\StellaOps.Cartographer.Tests\StellaOps.Cartographer.Tests.csproj", "{97284EB9-3307-5358-9D53-516135B9B67E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Fingerprints.Tests", "src\BinaryIndex\__Tests\StellaOps.BinaryIndex.Fingerprints.Tests\StellaOps.BinaryIndex.Fingerprints.Tests.csproj", "{E8A4DA95-0028-56E3-876D-964AB6285B86}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli", "Cli\StellaOps.Cli\StellaOps.Cli.csproj", "{333F32BE-6053-51D0-8E43-6D4DABA6D01F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Persistence.Tests", "src\BinaryIndex\__Tests\StellaOps.BinaryIndex.Persistence.Tests\StellaOps.BinaryIndex.Persistence.Tests.csproj", "{E85B9476-FCE0-557B-9598-FD46D59F7846}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Aoc", "Cli\__Libraries\StellaOps.Cli.Plugins.Aoc\StellaOps.Cli.Plugins.Aoc.csproj", "{533F1413-079E-537A-B336-90543B6A8A6D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cartographer", "Cartographer", "{E141BA2D-1051-5995-91A7-7825ACB7513B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.NonCore", "Cli\__Libraries\StellaOps.Cli.Plugins.NonCore\StellaOps.Cli.Plugins.NonCore.csproj", "{CBBFDF59-D233-5847-B08D-590AAC7D0062}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{92253993-2566-5A11-AD3D-4E9E4DFCA693}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Symbols", "Cli\__Libraries\StellaOps.Cli.Plugins.Symbols\StellaOps.Cli.Plugins.Symbols.csproj", "{F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cartographer", "src\Cartographer\StellaOps.Cartographer\StellaOps.Cartographer.csproj", "{717BBC3C-0048-5728-9246-E54BCF73FDA0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Vex", "Cli\__Libraries\StellaOps.Cli.Plugins.Vex\StellaOps.Cli.Plugins.Vex.csproj", "{E9ABE946-C645-5359-B25E-8BAA18689C44}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{99D0800D-C3E6-59C7-8E14-7307D9D19FEE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Tests", "Cli\__Tests\StellaOps.Cli.Tests\StellaOps.Cli.Tests.csproj", "{B2CCA353-DF3F-57B7-8108-C7BFA1F6553B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cartographer.Tests", "src\Cartographer\__Tests\StellaOps.Cartographer.Tests\StellaOps.Cartographer.Tests.csproj", "{97284EB9-3307-5358-9D53-516135B9B67E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Analyzers", "Concelier\__Analyzers\StellaOps.Concelier.Analyzers\StellaOps.Concelier.Analyzers.csproj", "{C1FCD683-A858-5864-8FFC-71F10EBB037C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cli", "Cli", "{6FB093EE-13F2-598F-B637-317D30E2418C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Analyzers", "Concelier\__Analyzers\StellaOps.Concelier.Merge.Analyzers\StellaOps.Concelier.Merge.Analyzers.csproj", "{533E7642-7A19-5148-9961-7AD1C129F6A3}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{20D928CF-6F8E-537C-B614-1344AF5F9BBF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Cache.Valkey", "Concelier\__Libraries\StellaOps.Concelier.Cache.Valkey\StellaOps.Concelier.Cache.Valkey.csproj", "{69E38AB5-4754-5EE1-A4F6-4066121380E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli", "src\Cli\StellaOps.Cli\StellaOps.Cli.csproj", "{333F32BE-6053-51D0-8E43-6D4DABA6D01F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core", "Concelier\__Libraries\StellaOps.Concelier.Core\StellaOps.Concelier.Core.csproj", "{C0D3B371-0629-51A6-977E-109DD8C75193}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{28D4DF1E-10B2-50EB-B993-0C51781DC4CA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json", "Concelier\__Libraries\StellaOps.Concelier.Exporter.Json\StellaOps.Concelier.Exporter.Json.csproj", "{ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Aoc", "src\Cli\__Libraries\StellaOps.Cli.Plugins.Aoc\StellaOps.Cli.Plugins.Aoc.csproj", "{533F1413-079E-537A-B336-90543B6A8A6D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb", "Concelier\__Libraries\StellaOps.Concelier.Exporter.TrivyDb\StellaOps.Concelier.Exporter.TrivyDb.csproj", "{0260AD37-54DA-5800-B7D5-1C87AD53DA5E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.NonCore", "src\Cli\__Libraries\StellaOps.Cli.Plugins.NonCore\StellaOps.Cli.Plugins.NonCore.csproj", "{CBBFDF59-D233-5847-B08D-590AAC7D0062}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Federation", "Concelier\__Libraries\StellaOps.Concelier.Federation\StellaOps.Concelier.Federation.csproj", "{523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Symbols", "src\Cli\__Libraries\StellaOps.Cli.Plugins.Symbols\StellaOps.Cli.Plugins.Symbols.csproj", "{F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Interest", "Concelier\__Libraries\StellaOps.Concelier.Interest\StellaOps.Concelier.Interest.csproj", "{FD6169A5-BA05-532F-9F9C-CA706278E422}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Vex", "src\Cli\__Libraries\StellaOps.Cli.Plugins.Vex\StellaOps.Cli.Plugins.Vex.csproj", "{E9ABE946-C645-5359-B25E-8BAA18689C44}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge", "Concelier\__Libraries\StellaOps.Concelier.Merge\StellaOps.Concelier.Merge.csproj", "{2A280282-543C-56B1-ABEA-0E104874FAB2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A7D8953B-C099-5CF8-BB7F-567171FBE654}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models", "Concelier\__Libraries\StellaOps.Concelier.Models\StellaOps.Concelier.Models.csproj", "{898AEFFF-4499-5223-9E5A-51D23E359283}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Tests", "src\Cli\__Tests\StellaOps.Cli.Tests\StellaOps.Cli.Tests.csproj", "{B2CCA353-DF3F-57B7-8108-C7BFA1F6553B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization", "Concelier\__Libraries\StellaOps.Concelier.Normalization\StellaOps.Concelier.Normalization.csproj", "{B65C2C6B-14A5-59FC-9864-0ACBCA225905}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Concelier", "Concelier", "{F8412DF3-0892-5D8E-88D2-2103807C2F01}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService", "Concelier\__Libraries\StellaOps.Concelier.ProofService\StellaOps.Concelier.ProofService.csproj", "{518349EC-22EA-5C63-82C9-B62C355ECF06}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{636012BB-3DED-56DD-90FB-4F280DA764BF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService.Postgres", "Concelier\__Libraries\StellaOps.Concelier.ProofService.Postgres\StellaOps.Concelier.ProofService.Postgres.csproj", "{978E57C9-6329-53E6-BCFB-25B61900FF56}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Analyzers", "src\Concelier\__Analyzers\StellaOps.Concelier.Analyzers\StellaOps.Concelier.Analyzers.csproj", "{C1FCD683-A858-5864-8FFC-71F10EBB037C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.RawModels", "Concelier\__Libraries\StellaOps.Concelier.RawModels\StellaOps.Concelier.RawModels.csproj", "{A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Analyzers", "src\Concelier\__Analyzers\StellaOps.Concelier.Merge.Analyzers\StellaOps.Concelier.Merge.Analyzers.csproj", "{533E7642-7A19-5148-9961-7AD1C129F6A3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SbomIntegration", "Concelier\__Libraries\StellaOps.Concelier.SbomIntegration\StellaOps.Concelier.SbomIntegration.csproj", "{67D45094-106D-5A42-8908-EE0ED693C316}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{C98C2683-712C-500D-891A-D685874A0600}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SourceIntel", "Concelier\__Libraries\StellaOps.Concelier.SourceIntel\StellaOps.Concelier.SourceIntel.csproj", "{DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Cache.Valkey", "src\Concelier\__Libraries\StellaOps.Concelier.Cache.Valkey\StellaOps.Concelier.Cache.Valkey.csproj", "{69E38AB5-4754-5EE1-A4F6-4066121380E8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Postgres", "Concelier\__Libraries\StellaOps.Concelier.Storage.Postgres\StellaOps.Concelier.Storage.Postgres.csproj", "{42C7E32A-4A4F-5E14-9A1C-CB6888F42911}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core", "src\Concelier\__Libraries\StellaOps.Concelier.Core\StellaOps.Concelier.Core.csproj", "{C0D3B371-0629-51A6-977E-109DD8C75193}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Acsc", "Concelier\__Libraries\StellaOps.Concelier.Connector.Acsc\StellaOps.Concelier.Connector.Acsc.csproj", "{ECDA362C-2331-5E2A-9004-158FEFC09558}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json", "src\Concelier\__Libraries\StellaOps.Concelier.Exporter.Json\StellaOps.Concelier.Exporter.Json.csproj", "{ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cccs", "Concelier\__Libraries\StellaOps.Concelier.Connector.Cccs\StellaOps.Concelier.Connector.Cccs.csproj", "{54692AE8-46FE-597C-9804-B85115C8D78E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb", "src\Concelier\__Libraries\StellaOps.Concelier.Exporter.TrivyDb\StellaOps.Concelier.Exporter.TrivyDb.csproj", "{0260AD37-54DA-5800-B7D5-1C87AD53DA5E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertBund", "Concelier\__Libraries\StellaOps.Concelier.Connector.CertBund\StellaOps.Concelier.Connector.CertBund.csproj", "{A8FFCABE-523B-52AC-B649-F728A13F7809}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Federation", "src\Concelier\__Libraries\StellaOps.Concelier.Federation\StellaOps.Concelier.Federation.csproj", "{523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertCc", "Concelier\__Libraries\StellaOps.Concelier.Connector.CertCc\StellaOps.Concelier.Connector.CertCc.csproj", "{447BFD00-4629-5040-947F-3823CE6F1623}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Interest", "src\Concelier\__Libraries\StellaOps.Concelier.Interest\StellaOps.Concelier.Interest.csproj", "{FD6169A5-BA05-532F-9F9C-CA706278E422}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertFr", "Concelier\__Libraries\StellaOps.Concelier.Connector.CertFr\StellaOps.Concelier.Connector.CertFr.csproj", "{FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge", "src\Concelier\__Libraries\StellaOps.Concelier.Merge\StellaOps.Concelier.Merge.csproj", "{2A280282-543C-56B1-ABEA-0E104874FAB2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertIn", "Concelier\__Libraries\StellaOps.Concelier.Connector.CertIn\StellaOps.Concelier.Connector.CertIn.csproj", "{B5FDDDD2-F649-5A1E-9D58-79C1B4880129}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models", "src\Concelier\__Libraries\StellaOps.Concelier.Models\StellaOps.Concelier.Models.csproj", "{898AEFFF-4499-5223-9E5A-51D23E359283}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common", "Concelier\__Libraries\StellaOps.Concelier.Connector.Common\StellaOps.Concelier.Connector.Common.csproj", "{414164E1-1D79-561F-84C8-AF13D2479467}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization", "src\Concelier\__Libraries\StellaOps.Concelier.Normalization\StellaOps.Concelier.Normalization.csproj", "{B65C2C6B-14A5-59FC-9864-0ACBCA225905}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cve", "Concelier\__Libraries\StellaOps.Concelier.Connector.Cve\StellaOps.Concelier.Connector.Cve.csproj", "{0245DE31-CCD7-570B-A349-4A94B6747E7F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService", "src\Concelier\__Libraries\StellaOps.Concelier.ProofService\StellaOps.Concelier.ProofService.csproj", "{518349EC-22EA-5C63-82C9-B62C355ECF06}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Alpine", "Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Alpine\StellaOps.Concelier.Connector.Distro.Alpine.csproj", "{52A514C6-1F14-57DB-8040-8BD90724DF97}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService.Postgres", "src\Concelier\__Libraries\StellaOps.Concelier.ProofService.Postgres\StellaOps.Concelier.ProofService.Postgres.csproj", "{978E57C9-6329-53E6-BCFB-25B61900FF56}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Debian", "Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Debian\StellaOps.Concelier.Connector.Distro.Debian.csproj", "{ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.RawModels", "src\Concelier\__Libraries\StellaOps.Concelier.RawModels\StellaOps.Concelier.RawModels.csproj", "{A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.RedHat", "Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.RedHat\StellaOps.Concelier.Connector.Distro.RedHat.csproj", "{D57A3684-6938-52E3-A775-A05D1BC55BD9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SbomIntegration", "src\Concelier\__Libraries\StellaOps.Concelier.SbomIntegration\StellaOps.Concelier.SbomIntegration.csproj", "{67D45094-106D-5A42-8908-EE0ED693C316}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Suse", "Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Suse\StellaOps.Concelier.Connector.Distro.Suse.csproj", "{F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SourceIntel", "src\Concelier\__Libraries\StellaOps.Concelier.SourceIntel\StellaOps.Concelier.SourceIntel.csproj", "{DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Ubuntu", "Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Ubuntu\StellaOps.Concelier.Connector.Distro.Ubuntu.csproj", "{4D19D7C7-33D5-5E40-BD37-F033F6514F8F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Postgres", "src\Concelier\__Libraries\StellaOps.Concelier.Storage.Postgres\StellaOps.Concelier.Storage.Postgres.csproj", "{42C7E32A-4A4F-5E14-9A1C-CB6888F42911}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Epss", "Concelier\__Libraries\StellaOps.Concelier.Connector.Epss\StellaOps.Concelier.Connector.Epss.csproj", "{579B038A-DA40-568D-8D94-1819A61A77E4}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ghsa", "Concelier\__Libraries\StellaOps.Concelier.Connector.Ghsa\StellaOps.Concelier.Connector.Ghsa.csproj", "{D1CD0F74-629F-5E39-AB12-D0E873B176DF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Acsc", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Acsc\StellaOps.Concelier.Connector.Acsc.csproj", "{ECDA362C-2331-5E2A-9004-158FEFC09558}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Cisa", "Concelier\__Libraries\StellaOps.Concelier.Connector.Ics.Cisa\StellaOps.Concelier.Connector.Ics.Cisa.csproj", "{A39CCE1C-8779-5417-AAB7-F7F662947EF7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cccs", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Cccs\StellaOps.Concelier.Connector.Cccs.csproj", "{54692AE8-46FE-597C-9804-B85115C8D78E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Kaspersky", "Concelier\__Libraries\StellaOps.Concelier.Connector.Ics.Kaspersky\StellaOps.Concelier.Connector.Ics.Kaspersky.csproj", "{8B0CB7F1-D942-5256-9345-814D7613FB8D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertBund", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertBund\StellaOps.Concelier.Connector.CertBund.csproj", "{A8FFCABE-523B-52AC-B649-F728A13F7809}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Jvn", "Concelier\__Libraries\StellaOps.Concelier.Connector.Jvn\StellaOps.Concelier.Connector.Jvn.csproj", "{8ADF03A1-5837-5C33-80D5-593F684B5D52}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertCc", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertCc\StellaOps.Concelier.Connector.CertCc.csproj", "{447BFD00-4629-5040-947F-3823CE6F1623}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kev", "Concelier\__Libraries\StellaOps.Concelier.Connector.Kev\StellaOps.Concelier.Connector.Kev.csproj", "{DCB28552-B244-5382-A01A-7FF9623D5D8F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertFr", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertFr\StellaOps.Concelier.Connector.CertFr.csproj", "{FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kisa", "Concelier\__Libraries\StellaOps.Concelier.Connector.Kisa\StellaOps.Concelier.Connector.Kisa.csproj", "{4E932374-54C6-5618-B9D0-C9F9586AF142}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertIn", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertIn\StellaOps.Concelier.Connector.CertIn.csproj", "{B5FDDDD2-F649-5A1E-9D58-79C1B4880129}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Nvd", "Concelier\__Libraries\StellaOps.Concelier.Connector.Nvd\StellaOps.Concelier.Connector.Nvd.csproj", "{52F0C68B-4733-5B5A-94BC-8610E0044FB5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Common\StellaOps.Concelier.Connector.Common.csproj", "{414164E1-1D79-561F-84C8-AF13D2479467}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Osv", "Concelier\__Libraries\StellaOps.Concelier.Connector.Osv\StellaOps.Concelier.Connector.Osv.csproj", "{C7849419-3632-5210-B29D-AE643ADF7614}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cve", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Cve\StellaOps.Concelier.Connector.Cve.csproj", "{0245DE31-CCD7-570B-A349-4A94B6747E7F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Bdu", "Concelier\__Libraries\StellaOps.Concelier.Connector.Ru.Bdu\StellaOps.Concelier.Connector.Ru.Bdu.csproj", "{0A8F72E8-0678-5DC6-A529-6051825248A2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Alpine", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Alpine\StellaOps.Concelier.Connector.Distro.Alpine.csproj", "{52A514C6-1F14-57DB-8040-8BD90724DF97}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Nkcki", "Concelier\__Libraries\StellaOps.Concelier.Connector.Ru.Nkcki\StellaOps.Concelier.Connector.Ru.Nkcki.csproj", "{3C0189B8-5C01-5CAF-921B-14534E5AD8F3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Debian", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Debian\StellaOps.Concelier.Connector.Distro.Debian.csproj", "{ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.StellaOpsMirror", "Concelier\__Libraries\StellaOps.Concelier.Connector.StellaOpsMirror\StellaOps.Concelier.Connector.StellaOpsMirror.csproj", "{F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.RedHat", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.RedHat\StellaOps.Concelier.Connector.Distro.RedHat.csproj", "{D57A3684-6938-52E3-A775-A05D1BC55BD9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Adobe", "Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Adobe\StellaOps.Concelier.Connector.Vndr.Adobe.csproj", "{399C398F-37AC-5E5E-A071-7856B28E2F91}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Suse", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Suse\StellaOps.Concelier.Connector.Distro.Suse.csproj", "{F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Apple", "Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Apple\StellaOps.Concelier.Connector.Vndr.Apple.csproj", "{FB31FD4A-6D32-5F44-A765-BF97D0992416}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Ubuntu", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Ubuntu\StellaOps.Concelier.Connector.Distro.Ubuntu.csproj", "{4D19D7C7-33D5-5E40-BD37-F033F6514F8F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Chromium", "Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Chromium\StellaOps.Concelier.Connector.Vndr.Chromium.csproj", "{2E5136AC-787A-5395-9E34-6DF39AD968A7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Epss", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Epss\StellaOps.Concelier.Connector.Epss.csproj", "{579B038A-DA40-568D-8D94-1819A61A77E4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Cisco", "Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Cisco\StellaOps.Concelier.Connector.Vndr.Cisco.csproj", "{271FC73D-0A74-5833-9710-095BB48BDE36}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ghsa", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ghsa\StellaOps.Concelier.Connector.Ghsa.csproj", "{D1CD0F74-629F-5E39-AB12-D0E873B176DF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Msrc", "Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Msrc\StellaOps.Concelier.Connector.Vndr.Msrc.csproj", "{CCD04E7B-4971-5471-B3C3-F1EB37211477}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Cisa", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ics.Cisa\StellaOps.Concelier.Connector.Ics.Cisa.csproj", "{A39CCE1C-8779-5417-AAB7-F7F662947EF7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Oracle", "Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Oracle\StellaOps.Concelier.Connector.Vndr.Oracle.csproj", "{6A3E0408-E974-5B1E-8944-9745294CA34F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Kaspersky", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ics.Kaspersky\StellaOps.Concelier.Connector.Ics.Kaspersky.csproj", "{8B0CB7F1-D942-5256-9345-814D7613FB8D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Vmware", "Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Vmware\StellaOps.Concelier.Connector.Vndr.Vmware.csproj", "{BC02D193-613F-532F-98A3-C09FF0CC8116}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Jvn", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Jvn\StellaOps.Concelier.Connector.Jvn.csproj", "{8ADF03A1-5837-5C33-80D5-593F684B5D52}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "__Tests\__Libraries\StellaOps.Concelier.Testing\StellaOps.Concelier.Testing.csproj", "{42D599AE-EE37-55F8-926D-2918FE8C2FF1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kev", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Kev\StellaOps.Concelier.Connector.Kev.csproj", "{DCB28552-B244-5382-A01A-7FF9623D5D8F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Cache.Valkey.Tests", "Concelier\__Tests\StellaOps.Concelier.Cache.Valkey.Tests\StellaOps.Concelier.Cache.Valkey.Tests.csproj", "{9365CC66-A669-5ACD-AA12-4991D1DBCD10}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kisa", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Kisa\StellaOps.Concelier.Connector.Kisa.csproj", "{4E932374-54C6-5618-B9D0-C9F9586AF142}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Acsc.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Acsc.Tests\StellaOps.Concelier.Connector.Acsc.Tests.csproj", "{C3141611-E90D-55A2-819B-A65AEF921787}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Nvd", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Nvd\StellaOps.Concelier.Connector.Nvd.csproj", "{52F0C68B-4733-5B5A-94BC-8610E0044FB5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cccs.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Cccs.Tests\StellaOps.Concelier.Connector.Cccs.Tests.csproj", "{B62F97B5-73F5-5F9C-90F5-F156C52E6424}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Osv", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Osv\StellaOps.Concelier.Connector.Osv.csproj", "{C7849419-3632-5210-B29D-AE643ADF7614}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertBund.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.CertBund.Tests\StellaOps.Concelier.Connector.CertBund.Tests.csproj", "{48090851-C268-5625-9967-7E1B364AE5BB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Bdu", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ru.Bdu\StellaOps.Concelier.Connector.Ru.Bdu.csproj", "{0A8F72E8-0678-5DC6-A529-6051825248A2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertCc.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.CertCc.Tests\StellaOps.Concelier.Connector.CertCc.Tests.csproj", "{A2FA5C54-A698-51F4-BE96-DA5080CA10D1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Nkcki", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ru.Nkcki\StellaOps.Concelier.Connector.Ru.Nkcki.csproj", "{3C0189B8-5C01-5CAF-921B-14534E5AD8F3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertFr.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.CertFr.Tests\StellaOps.Concelier.Connector.CertFr.Tests.csproj", "{E76711C3-B30E-5E2F-8532-0885F4E4992E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.StellaOpsMirror", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.StellaOpsMirror\StellaOps.Concelier.Connector.StellaOpsMirror.csproj", "{F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertIn.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.CertIn.Tests\StellaOps.Concelier.Connector.CertIn.Tests.csproj", "{D8D2C86C-A8D2-597F-B9CB-92C6D412752E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Adobe", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Adobe\StellaOps.Concelier.Connector.Vndr.Adobe.csproj", "{399C398F-37AC-5E5E-A071-7856B28E2F91}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Common.Tests\StellaOps.Concelier.Connector.Common.Tests.csproj", "{9326B135-DEF9-52CD-B1E9-F90EEEAA40FB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Apple", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Apple\StellaOps.Concelier.Connector.Vndr.Apple.csproj", "{FB31FD4A-6D32-5F44-A765-BF97D0992416}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cve.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Cve.Tests\StellaOps.Concelier.Connector.Cve.Tests.csproj", "{823042FD-8786-5959-AA1E-8E225497A91D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Chromium", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Chromium\StellaOps.Concelier.Connector.Vndr.Chromium.csproj", "{2E5136AC-787A-5395-9E34-6DF39AD968A7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Alpine.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Alpine.Tests\StellaOps.Concelier.Connector.Distro.Alpine.Tests.csproj", "{A182BBDA-2794-538D-87BC-5C9F1A52EC9C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Cisco", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Cisco\StellaOps.Concelier.Connector.Vndr.Cisco.csproj", "{271FC73D-0A74-5833-9710-095BB48BDE36}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Debian.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Debian.Tests\StellaOps.Concelier.Connector.Distro.Debian.Tests.csproj", "{49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Msrc", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Msrc\StellaOps.Concelier.Connector.Vndr.Msrc.csproj", "{CCD04E7B-4971-5471-B3C3-F1EB37211477}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.RedHat.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Distro.RedHat.Tests\StellaOps.Concelier.Connector.Distro.RedHat.Tests.csproj", "{E6AD0F88-58A6-591B-B81F-55D76970AAC6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Oracle", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Oracle\StellaOps.Concelier.Connector.Vndr.Oracle.csproj", "{6A3E0408-E974-5B1E-8944-9745294CA34F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Suse.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Suse.Tests\StellaOps.Concelier.Connector.Distro.Suse.Tests.csproj", "{64ED47CD-60F8-50B0-ABF1-BD3624D3876B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Vmware", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Vmware\StellaOps.Concelier.Connector.Vndr.Vmware.csproj", "{BC02D193-613F-532F-98A3-C09FF0CC8116}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Ubuntu.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Ubuntu.Tests\StellaOps.Concelier.Connector.Distro.Ubuntu.Tests.csproj", "{86FE95FB-6E35-599C-AD1F-CCA00200BAD2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{BC7E9C1F-1451-5098-8839-C440DB51E8F7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Epss.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Epss.Tests\StellaOps.Concelier.Connector.Epss.Tests.csproj", "{E048277B-0B7F-5912-8190-871D57D0CB36}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "src\__Tests\__Libraries\StellaOps.Concelier.Testing\StellaOps.Concelier.Testing.csproj", "{42D599AE-EE37-55F8-926D-2918FE8C2FF1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ghsa.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Ghsa.Tests\StellaOps.Concelier.Connector.Ghsa.Tests.csproj", "{8637D2D5-FCFA-592E-AB09-1134DD444F51}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Cache.Valkey.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Cache.Valkey.Tests\StellaOps.Concelier.Cache.Valkey.Tests.csproj", "{9365CC66-A669-5ACD-AA12-4991D1DBCD10}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Cisa.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Ics.Cisa.Tests\StellaOps.Concelier.Connector.Ics.Cisa.Tests.csproj", "{6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Acsc.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Acsc.Tests\StellaOps.Concelier.Connector.Acsc.Tests.csproj", "{C3141611-E90D-55A2-819B-A65AEF921787}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Kaspersky.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Ics.Kaspersky.Tests\StellaOps.Concelier.Connector.Ics.Kaspersky.Tests.csproj", "{6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cccs.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Cccs.Tests\StellaOps.Concelier.Connector.Cccs.Tests.csproj", "{B62F97B5-73F5-5F9C-90F5-F156C52E6424}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Jvn.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Jvn.Tests\StellaOps.Concelier.Connector.Jvn.Tests.csproj", "{FB3C53E3-B728-5E37-9095-E8A62235C779}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertBund.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertBund.Tests\StellaOps.Concelier.Connector.CertBund.Tests.csproj", "{48090851-C268-5625-9967-7E1B364AE5BB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kev.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Kev.Tests\StellaOps.Concelier.Connector.Kev.Tests.csproj", "{BAE0F14F-67B0-52A8-8A37-DAB9117CAB92}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertCc.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertCc.Tests\StellaOps.Concelier.Connector.CertCc.Tests.csproj", "{A2FA5C54-A698-51F4-BE96-DA5080CA10D1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kisa.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Kisa.Tests\StellaOps.Concelier.Connector.Kisa.Tests.csproj", "{BBD9FB80-1740-52D1-8D4A-CBCC23458967}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertFr.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertFr.Tests\StellaOps.Concelier.Connector.CertFr.Tests.csproj", "{E76711C3-B30E-5E2F-8532-0885F4E4992E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Nvd.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Nvd.Tests\StellaOps.Concelier.Connector.Nvd.Tests.csproj", "{6B728CF0-08D7-5495-AF3B-80E03D8E3085}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertIn.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertIn.Tests\StellaOps.Concelier.Connector.CertIn.Tests.csproj", "{D8D2C86C-A8D2-597F-B9CB-92C6D412752E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Osv.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Osv.Tests\StellaOps.Concelier.Connector.Osv.Tests.csproj", "{A65C327F-9D4B-57DF-A94E-456215B00102}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Common.Tests\StellaOps.Concelier.Connector.Common.Tests.csproj", "{9326B135-DEF9-52CD-B1E9-F90EEEAA40FB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Bdu.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Ru.Bdu.Tests\StellaOps.Concelier.Connector.Ru.Bdu.Tests.csproj", "{8F9AB893-1069-58DE-9213-58FFD149AEE1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cve.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Cve.Tests\StellaOps.Concelier.Connector.Cve.Tests.csproj", "{823042FD-8786-5959-AA1E-8E225497A91D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Nkcki.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Ru.Nkcki.Tests\StellaOps.Concelier.Connector.Ru.Nkcki.Tests.csproj", "{AE390E3E-F95E-54E2-8ED8-ACF460F30C32}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Alpine.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Alpine.Tests\StellaOps.Concelier.Connector.Distro.Alpine.Tests.csproj", "{A182BBDA-2794-538D-87BC-5C9F1A52EC9C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.StellaOpsMirror.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.StellaOpsMirror.Tests\StellaOps.Concelier.Connector.StellaOpsMirror.Tests.csproj", "{C11D8D60-CA38-5F92-A741-EB8C8D99C5D2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Debian.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Debian.Tests\StellaOps.Concelier.Connector.Distro.Debian.Tests.csproj", "{49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Adobe.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Adobe.Tests\StellaOps.Concelier.Connector.Vndr.Adobe.Tests.csproj", "{C2903B94-B7B4-525C-AC6A-DE5FBCADE029}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.RedHat.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.RedHat.Tests\StellaOps.Concelier.Connector.Distro.RedHat.Tests.csproj", "{E6AD0F88-58A6-591B-B81F-55D76970AAC6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Apple.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Apple.Tests\StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj", "{0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Suse.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Suse.Tests\StellaOps.Concelier.Connector.Distro.Suse.Tests.csproj", "{64ED47CD-60F8-50B0-ABF1-BD3624D3876B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Chromium.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Chromium.Tests\StellaOps.Concelier.Connector.Vndr.Chromium.Tests.csproj", "{7581D3D4-8C62-59F8-A085-143AA9DAFCB7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Ubuntu.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Ubuntu.Tests\StellaOps.Concelier.Connector.Distro.Ubuntu.Tests.csproj", "{86FE95FB-6E35-599C-AD1F-CCA00200BAD2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Cisco.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Cisco.Tests\StellaOps.Concelier.Connector.Vndr.Cisco.Tests.csproj", "{FB660FD7-F8C1-5FE1-85E7-066B22F23381}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Epss.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Epss.Tests\StellaOps.Concelier.Connector.Epss.Tests.csproj", "{E048277B-0B7F-5912-8190-871D57D0CB36}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Msrc.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Msrc.Tests\StellaOps.Concelier.Connector.Vndr.Msrc.Tests.csproj", "{8A7FC726-0271-514B-ABA4-EA48DDE93B8C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ghsa.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ghsa.Tests\StellaOps.Concelier.Connector.Ghsa.Tests.csproj", "{8637D2D5-FCFA-592E-AB09-1134DD444F51}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Oracle.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Oracle.Tests\StellaOps.Concelier.Connector.Vndr.Oracle.Tests.csproj", "{1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Cisa.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ics.Cisa.Tests\StellaOps.Concelier.Connector.Ics.Cisa.Tests.csproj", "{6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Vmware.Tests", "Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Vmware.Tests\StellaOps.Concelier.Connector.Vndr.Vmware.Tests.csproj", "{01D6CF66-7B69-5772-9811-C3BF554793C9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Kaspersky.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ics.Kaspersky.Tests\StellaOps.Concelier.Connector.Ics.Kaspersky.Tests.csproj", "{6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core.Tests", "Concelier\__Tests\StellaOps.Concelier.Core.Tests\StellaOps.Concelier.Core.Tests.csproj", "{1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Jvn.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Jvn.Tests\StellaOps.Concelier.Connector.Jvn.Tests.csproj", "{FB3C53E3-B728-5E37-9095-E8A62235C779}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json.Tests", "Concelier\__Tests\StellaOps.Concelier.Exporter.Json.Tests\StellaOps.Concelier.Exporter.Json.Tests.csproj", "{C4E024A9-91DE-5071-86FB-25B350B6D78E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kev.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Kev.Tests\StellaOps.Concelier.Connector.Kev.Tests.csproj", "{BAE0F14F-67B0-52A8-8A37-DAB9117CAB92}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb.Tests", "Concelier\__Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj", "{58C665E2-C3A7-5E69-873D-B6FEC96FAB8C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kisa.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Kisa.Tests\StellaOps.Concelier.Connector.Kisa.Tests.csproj", "{BBD9FB80-1740-52D1-8D4A-CBCC23458967}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Federation.Tests", "Concelier\__Tests\StellaOps.Concelier.Federation.Tests\StellaOps.Concelier.Federation.Tests.csproj", "{AF70972B-54C3-5DEC-B005-B1CF4B84E14D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Nvd.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Nvd.Tests\StellaOps.Concelier.Connector.Nvd.Tests.csproj", "{6B728CF0-08D7-5495-AF3B-80E03D8E3085}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Integration.Tests", "Concelier\__Tests\StellaOps.Concelier.Integration.Tests\StellaOps.Concelier.Integration.Tests.csproj", "{A284375A-B4E0-50C5-B3C0-766ECBF70CD1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Osv.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Osv.Tests\StellaOps.Concelier.Connector.Osv.Tests.csproj", "{A65C327F-9D4B-57DF-A94E-456215B00102}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Interest.Tests", "Concelier\__Tests\StellaOps.Concelier.Interest.Tests\StellaOps.Concelier.Interest.Tests.csproj", "{CBEC642B-A4B3-5B3E-A5EF-64993811FDC9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Bdu.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ru.Bdu.Tests\StellaOps.Concelier.Connector.Ru.Bdu.Tests.csproj", "{8F9AB893-1069-58DE-9213-58FFD149AEE1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Analyzers.Tests", "Concelier\__Tests\StellaOps.Concelier.Merge.Analyzers.Tests\StellaOps.Concelier.Merge.Analyzers.Tests.csproj", "{C6BBD0A5-C811-50A3-A614-C535E7D0AF50}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Nkcki.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ru.Nkcki.Tests\StellaOps.Concelier.Connector.Ru.Nkcki.Tests.csproj", "{AE390E3E-F95E-54E2-8ED8-ACF460F30C32}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Tests", "Concelier\__Tests\StellaOps.Concelier.Merge.Tests\StellaOps.Concelier.Merge.Tests.csproj", "{48256054-736E-5597-995F-BAF166998337}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.StellaOpsMirror.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.StellaOpsMirror.Tests\StellaOps.Concelier.Connector.StellaOpsMirror.Tests.csproj", "{C11D8D60-CA38-5F92-A741-EB8C8D99C5D2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models.Tests", "Concelier\__Tests\StellaOps.Concelier.Models.Tests\StellaOps.Concelier.Models.Tests.csproj", "{B4C782D3-CF67-5A0F-9E60-757405CF4BEB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Adobe.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Adobe.Tests\StellaOps.Concelier.Connector.Vndr.Adobe.Tests.csproj", "{C2903B94-B7B4-525C-AC6A-DE5FBCADE029}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization.Tests", "Concelier\__Tests\StellaOps.Concelier.Normalization.Tests\StellaOps.Concelier.Normalization.Tests.csproj", "{64756370-8E80-5638-B0F3-5EACFBB8FD64}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Apple.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Apple.Tests\StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj", "{0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService.Postgres.Tests", "Concelier\__Tests\StellaOps.Concelier.ProofService.Postgres.Tests\StellaOps.Concelier.ProofService.Postgres.Tests.csproj", "{251DA02D-00DA-5211-BD79-AC28E18F326C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Chromium.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Chromium.Tests\StellaOps.Concelier.Connector.Vndr.Chromium.Tests.csproj", "{7581D3D4-8C62-59F8-A085-143AA9DAFCB7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.RawModels.Tests", "Concelier\__Tests\StellaOps.Concelier.RawModels.Tests\StellaOps.Concelier.RawModels.Tests.csproj", "{E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Cisco.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Cisco.Tests\StellaOps.Concelier.Connector.Vndr.Cisco.Tests.csproj", "{FB660FD7-F8C1-5FE1-85E7-066B22F23381}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SbomIntegration.Tests", "Concelier\__Tests\StellaOps.Concelier.SbomIntegration.Tests\StellaOps.Concelier.SbomIntegration.Tests.csproj", "{C7551073-07A8-58AA-BCB0-5CB79FC2D109}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Msrc.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Msrc.Tests\StellaOps.Concelier.Connector.Vndr.Msrc.Tests.csproj", "{8A7FC726-0271-514B-ABA4-EA48DDE93B8C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SourceIntel.Tests", "Concelier\__Tests\StellaOps.Concelier.SourceIntel.Tests\StellaOps.Concelier.SourceIntel.Tests.csproj", "{06187BD6-754B-529E-BFF1-CA5D0FA4D5D1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Oracle.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Oracle.Tests\StellaOps.Concelier.Connector.Vndr.Oracle.Tests.csproj", "{1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Postgres.Tests", "Concelier\__Tests\StellaOps.Concelier.Storage.Postgres.Tests\StellaOps.Concelier.Storage.Postgres.Tests.csproj", "{17508C6F-FADD-5BCE-B47B-0A78F4AA437E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Vmware.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Vmware.Tests\StellaOps.Concelier.Connector.Vndr.Vmware.Tests.csproj", "{01D6CF66-7B69-5772-9811-C3BF554793C9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService.Tests", "Concelier\__Tests\StellaOps.Concelier.WebService.Tests\StellaOps.Concelier.WebService.Tests.csproj", "{5545C1F3-B963-5FAA-ACD7-9F57D4470F19}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Core.Tests\StellaOps.Concelier.Core.Tests.csproj", "{1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService", "Concelier\StellaOps.Concelier.WebService\StellaOps.Concelier.WebService.csproj", "{492926FA-134A-5BF8-9148-97D9A291E3C5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Exporter.Json.Tests\StellaOps.Concelier.Exporter.Json.Tests.csproj", "{C4E024A9-91DE-5071-86FB-25B350B6D78E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "Cryptography\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{F82ACF7C-966D-5C85-AB8C-637206C2495D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj", "{58C665E2-C3A7-5E69-873D-B6FEC96FAB8C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Profiles.Ecdsa", "Cryptography\StellaOps.Cryptography.Profiles.Ecdsa\StellaOps.Cryptography.Profiles.Ecdsa.csproj", "{C0BA2B16-7593-55EF-9368-CF06C1F94379}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Federation.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Federation.Tests\StellaOps.Concelier.Federation.Tests.csproj", "{AF70972B-54C3-5DEC-B005-B1CF4B84E14D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Profiles.EdDsa", "Cryptography\StellaOps.Cryptography.Profiles.EdDsa\StellaOps.Cryptography.Profiles.EdDsa.csproj", "{CE252920-E8A0-5175-B211-CD71EABCFC75}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Integration.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Integration.Tests\StellaOps.Concelier.Integration.Tests.csproj", "{A284375A-B4E0-50C5-B3C0-766ECBF70CD1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Kms.Tests", "__Libraries\__Tests\StellaOps.Cryptography.Kms.Tests\StellaOps.Cryptography.Kms.Tests.csproj", "{38127116-0764-53E6-B5B5-2BA0CA0B7F91}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Interest.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Interest.Tests\StellaOps.Concelier.Interest.Tests.csproj", "{CBEC642B-A4B3-5B3E-A5EF-64993811FDC9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OfflineVerification.Tests", "__Libraries\__Tests\StellaOps.Cryptography.Plugin.OfflineVerification.Tests\StellaOps.Cryptography.Plugin.OfflineVerification.Tests.csproj", "{7701FD94-6296-5CD5-8E7B-F7CAEA02052C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Analyzers.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Merge.Analyzers.Tests\StellaOps.Concelier.Merge.Analyzers.Tests.csproj", "{C6BBD0A5-C811-50A3-A614-C535E7D0AF50}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Tests", "__Libraries\__Tests\StellaOps.Cryptography.Tests\StellaOps.Cryptography.Tests.csproj", "{8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Merge.Tests\StellaOps.Concelier.Merge.Tests.csproj", "{48256054-736E-5597-995F-BAF166998337}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Core", "EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Core\StellaOps.EvidenceLocker.Core.csproj", "{69A89A48-4FF1-56DD-95F4-B81DBAADACDA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Models.Tests\StellaOps.Concelier.Models.Tests.csproj", "{B4C782D3-CF67-5A0F-9E60-757405CF4BEB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker", "EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.csproj", "{22C6842B-7851-510C-9DBB-675188E2B020}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Normalization.Tests\StellaOps.Concelier.Normalization.Tests.csproj", "{64756370-8E80-5638-B0F3-5EACFBB8FD64}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Infrastructure", "EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Infrastructure\StellaOps.EvidenceLocker.Infrastructure.csproj", "{D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService.Postgres.Tests", "src\Concelier\__Tests\StellaOps.Concelier.ProofService.Postgres.Tests\StellaOps.Concelier.ProofService.Postgres.Tests.csproj", "{251DA02D-00DA-5211-BD79-AC28E18F326C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Tests", "EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Tests\StellaOps.EvidenceLocker.Tests.csproj", "{5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.RawModels.Tests", "src\Concelier\__Tests\StellaOps.Concelier.RawModels.Tests\StellaOps.Concelier.RawModels.Tests.csproj", "{E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.WebService", "EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.WebService\StellaOps.EvidenceLocker.WebService.csproj", "{027F58E2-96C8-55C3-B22B-1EC5B0621106}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SbomIntegration.Tests", "src\Concelier\__Tests\StellaOps.Concelier.SbomIntegration.Tests\StellaOps.Concelier.SbomIntegration.Tests.csproj", "{C7551073-07A8-58AA-BCB0-5CB79FC2D109}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Worker", "EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Worker\StellaOps.EvidenceLocker.Worker.csproj", "{A973EE14-705D-555F-B115-B97D5ADAEA8D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SourceIntel.Tests", "src\Concelier\__Tests\StellaOps.Concelier.SourceIntel.Tests\StellaOps.Concelier.SourceIntel.Tests.csproj", "{06187BD6-754B-529E-BFF1-CA5D0FA4D5D1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.ArtifactStores.S3", "Excititor\__Libraries\StellaOps.Excititor.ArtifactStores.S3\StellaOps.Excititor.ArtifactStores.S3.csproj", "{88C1DF3F-74F3-507F-B63C-EA54EA56C95C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Postgres.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Storage.Postgres.Tests\StellaOps.Concelier.Storage.Postgres.Tests.csproj", "{17508C6F-FADD-5BCE-B47B-0A78F4AA437E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Attestation", "Excititor\__Libraries\StellaOps.Excititor.Attestation\StellaOps.Excititor.Attestation.csproj", "{F931F697-CC40-55BB-999E-BAA4302595E5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService.Tests", "src\Concelier\__Tests\StellaOps.Concelier.WebService.Tests\StellaOps.Concelier.WebService.Tests.csproj", "{5545C1F3-B963-5FAA-ACD7-9F57D4470F19}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core", "Excititor\__Libraries\StellaOps.Excititor.Core\StellaOps.Excititor.Core.csproj", "{BD92B2EA-2C70-514D-B74F-76AD834A0AA4}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CC66F815-F123-53D0-83A3-83137F66DA87}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Export", "Excititor\__Libraries\StellaOps.Excititor.Export\StellaOps.Excititor.Export.csproj", "{309B5313-C885-5629-B9A9-674A532CC498}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService", "src\Concelier\StellaOps.Concelier.WebService\StellaOps.Concelier.WebService.csproj", "{492926FA-134A-5BF8-9148-97D9A291E3C5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CSAF", "Excititor\__Libraries\StellaOps.Excititor.Formats.CSAF\StellaOps.Excititor.Formats.CSAF.csproj", "{AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cryptography", "Cryptography", "{33AD4C5F-D4B9-5820-999F-D733192BB68A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CycloneDX", "Excititor\__Libraries\StellaOps.Excititor.Formats.CycloneDX\StellaOps.Excititor.Formats.CycloneDX.csproj", "{C0D986EF-15F8-588D-86C8-574B9978D0D1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{7D8AF489-7371-52B5-ACD5-53CC2E862A1D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.OpenVEX", "Excititor\__Libraries\StellaOps.Excititor.Formats.OpenVEX\StellaOps.Excititor.Formats.OpenVEX.csproj", "{80686466-E848-57CD-99D9-644EEA055741}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "src\Cryptography\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{F82ACF7C-966D-5C85-AB8C-637206C2495D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Policy", "Excititor\__Libraries\StellaOps.Excititor.Policy\StellaOps.Excititor.Policy.csproj", "{D906F4BC-54A4-567F-8DD9-4A00C6DC3F75}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Profiles.Ecdsa", "src\Cryptography\StellaOps.Cryptography.Profiles.Ecdsa\StellaOps.Cryptography.Profiles.Ecdsa.csproj", "{C0BA2B16-7593-55EF-9368-CF06C1F94379}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Storage.Postgres", "Excititor\__Libraries\StellaOps.Excititor.Storage.Postgres\StellaOps.Excititor.Storage.Postgres.csproj", "{48EAC4C2-5B05-5350-83C8-5F25DC7632D5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Profiles.EdDsa", "src\Cryptography\StellaOps.Cryptography.Profiles.EdDsa\StellaOps.Cryptography.Profiles.EdDsa.csproj", "{CE252920-E8A0-5175-B211-CD71EABCFC75}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Abstractions", "Excititor\__Libraries\StellaOps.Excititor.Connectors.Abstractions\StellaOps.Excititor.Connectors.Abstractions.csproj", "{41F6B7F1-7767-5A85-B9B5-C70D69F80000}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{1BB68895-DA5E-5335-AB62-7C7C7F599205}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Cisco.CSAF", "Excititor\__Libraries\StellaOps.Excititor.Connectors.Cisco.CSAF\StellaOps.Excititor.Connectors.Cisco.CSAF.csproj", "{BA5C61B1-EFF0-5FD7-A92F-4E464C16056B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "src\__Libraries\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{5970CA22-EC4F-5D2F-906D-8B5B934E2547}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.MSRC.CSAF", "Excititor\__Libraries\StellaOps.Excititor.Connectors.MSRC.CSAF\StellaOps.Excititor.Connectors.MSRC.CSAF.csproj", "{1CC50534-78D2-5DC6-9DCF-8D64532260F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.DependencyInjection", "src\__Libraries\StellaOps.Cryptography.DependencyInjection\StellaOps.Cryptography.DependencyInjection.csproj", "{2F6D6D31-28AC-5022-BD72-61F153062B6C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest", "Excititor\__Libraries\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.csproj", "{7DED5634-FD01-5854-96BA-C3F636FB6B10}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Kms", "src\__Libraries\StellaOps.Cryptography.Kms\StellaOps.Cryptography.Kms.csproj", "{E7CD5254-7D73-585E-94B8-E70C281423F1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Oracle.CSAF", "Excititor\__Libraries\StellaOps.Excititor.Connectors.Oracle.CSAF\StellaOps.Excititor.Connectors.Oracle.CSAF.csproj", "{3083A5E6-84E0-57FA-8F5F-ECA046992707}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Providers.OfflineVerification", "src\__Libraries\StellaOps.Cryptography.Providers.OfflineVerification\StellaOps.Cryptography.Providers.OfflineVerification.csproj", "{BB1F45C7-44CB-516D-A888-4E1EAEABF44B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.RedHat.CSAF", "Excititor\__Libraries\StellaOps.Excititor.Connectors.RedHat.CSAF\StellaOps.Excititor.Connectors.RedHat.CSAF.csproj", "{B70F4C3D-0BF7-59B7-9627-4EF8E7247A17}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.SUSE.RancherVEXHub", "Excititor\__Libraries\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.csproj", "{FD121908-49E7-5B7B-B8E6-A4FEB65D59DA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.BouncyCastle", "src\__Libraries\StellaOps.Cryptography.Plugin.BouncyCastle\StellaOps.Cryptography.Plugin.BouncyCastle.csproj", "{D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Ubuntu.CSAF", "Excititor\__Libraries\StellaOps.Excititor.Connectors.Ubuntu.CSAF\StellaOps.Excititor.Connectors.Ubuntu.CSAF.csproj", "{8929D374-4010-5CAC-8EC0-693194B7216E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.CryptoPro", "src\__Libraries\StellaOps.Cryptography.Plugin.CryptoPro\StellaOps.Cryptography.Plugin.CryptoPro.csproj", "{769E6552-E895-5951-8C67-86B251A6036B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.ArtifactStores.S3.Tests", "Excititor\__Tests\StellaOps.Excititor.ArtifactStores.S3.Tests\StellaOps.Excititor.ArtifactStores.S3.Tests.csproj", "{21342480-FC88-5789-B7B2-5D9AC7ED18F6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.EIDAS", "src\__Libraries\StellaOps.Cryptography.Plugin.EIDAS\StellaOps.Cryptography.Plugin.EIDAS.csproj", "{92336BE4-5E46-5C13-B200-69A80999182B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Attestation.Tests", "Excititor\__Tests\StellaOps.Excititor.Attestation.Tests\StellaOps.Excititor.Attestation.Tests.csproj", "{34D26AF7-F7C3-5D31-8E45-D545DE7B56A9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OfflineVerification", "src\__Libraries\StellaOps.Cryptography.Plugin.OfflineVerification\StellaOps.Cryptography.Plugin.OfflineVerification.csproj", "{7531EC3D-6ADD-5551-ADC2-A283A56028FF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Cisco.CSAF.Tests", "Excititor\__Tests\StellaOps.Excititor.Connectors.Cisco.CSAF.Tests\StellaOps.Excititor.Connectors.Cisco.CSAF.Tests.csproj", "{56414F70-A7F6-55C1-B219-DABC8345E9EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OpenSslGost", "src\__Libraries\StellaOps.Cryptography.Plugin.OpenSslGost\StellaOps.Cryptography.Plugin.OpenSslGost.csproj", "{C270C125-2FCB-5F43-A1B0-EE27079662BB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.MSRC.CSAF.Tests", "Excititor\__Tests\StellaOps.Excititor.Connectors.MSRC.CSAF.Tests\StellaOps.Excititor.Connectors.MSRC.CSAF.Tests.csproj", "{486EA70D-9F0F-5259-B908-580A60863C5A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.Pkcs11Gost", "src\__Libraries\StellaOps.Cryptography.Plugin.Pkcs11Gost\StellaOps.Cryptography.Plugin.Pkcs11Gost.csproj", "{AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests", "Excititor\__Tests\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests.csproj", "{21950636-1E41-520C-978D-6C52417F49CB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.PqSoft", "src\__Libraries\StellaOps.Cryptography.Plugin.PqSoft\StellaOps.Cryptography.Plugin.PqSoft.csproj", "{3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Oracle.CSAF.Tests", "Excititor\__Tests\StellaOps.Excititor.Connectors.Oracle.CSAF.Tests\StellaOps.Excititor.Connectors.Oracle.CSAF.Tests.csproj", "{A3045438-648F-5E60-974C-8A6593165CD7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SimRemote", "src\__Libraries\StellaOps.Cryptography.Plugin.SimRemote\StellaOps.Cryptography.Plugin.SimRemote.csproj", "{23A27A2A-2C8E-5C38-9F17-06FCDD87C147}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.RedHat.CSAF.Tests", "Excititor\__Tests\StellaOps.Excititor.Connectors.RedHat.CSAF.Tests\StellaOps.Excititor.Connectors.RedHat.CSAF.Tests.csproj", "{393B31FC-1469-5DB5-8B89-C6E9AC69A058}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmRemote", "src\__Libraries\StellaOps.Cryptography.Plugin.SmRemote\StellaOps.Cryptography.Plugin.SmRemote.csproj", "{E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests", "Excititor\__Tests\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests.csproj", "{3E4B26B0-B184-5184-B086-618F362D3EA8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmSoft", "src\__Libraries\StellaOps.Cryptography.Plugin.SmSoft\StellaOps.Cryptography.Plugin.SmSoft.csproj", "{BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests", "Excititor\__Tests\StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests\StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests.csproj", "{74961AF8-0434-5863-B516-179CBD4DD354}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.WineCsp", "src\__Libraries\StellaOps.Cryptography.Plugin.WineCsp\StellaOps.Cryptography.Plugin.WineCsp.csproj", "{FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core.Tests", "Excititor\__Tests\StellaOps.Excititor.Core.Tests\StellaOps.Excititor.Core.Tests.csproj", "{D2C87350-D8EE-5774-9D07-5DB161C1CAFA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.PluginLoader", "src\__Libraries\StellaOps.Cryptography.PluginLoader\StellaOps.Cryptography.PluginLoader.csproj", "{E2AC4478-3191-5B4E-A0EB-222156F9C2F0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core.UnitTests", "Excititor\__Tests\StellaOps.Excititor.Core.UnitTests\StellaOps.Excititor.Core.UnitTests.csproj", "{46F08BCB-C218-5A58-8949-E7CD119BCAB6}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{2DD3A51E-C54C-5B89-9E80-6725631D7C98}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Export.Tests", "Excititor\__Tests\StellaOps.Excititor.Export.Tests\StellaOps.Excititor.Export.Tests.csproj", "{9654C643-AD78-586B-819D-8C081576D60C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Kms.Tests", "src\__Libraries\__Tests\StellaOps.Cryptography.Kms.Tests\StellaOps.Cryptography.Kms.Tests.csproj", "{38127116-0764-53E6-B5B5-2BA0CA0B7F91}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CSAF.Tests", "Excititor\__Tests\StellaOps.Excititor.Formats.CSAF.Tests\StellaOps.Excititor.Formats.CSAF.Tests.csproj", "{ADF02308-4349-5280-9E05-75A6C619E0EC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OfflineVerification.Tests", "src\__Libraries\__Tests\StellaOps.Cryptography.Plugin.OfflineVerification.Tests\StellaOps.Cryptography.Plugin.OfflineVerification.Tests.csproj", "{7701FD94-6296-5CD5-8E7B-F7CAEA02052C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CycloneDX.Tests", "Excititor\__Tests\StellaOps.Excititor.Formats.CycloneDX.Tests\StellaOps.Excititor.Formats.CycloneDX.Tests.csproj", "{3B4D6BEF-0934-5981-B776-AA13BE7FD25E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Tests", "src\__Libraries\__Tests\StellaOps.Cryptography.Tests\StellaOps.Cryptography.Tests.csproj", "{8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.OpenVEX.Tests", "Excititor\__Tests\StellaOps.Excititor.Formats.OpenVEX.Tests\StellaOps.Excititor.Formats.OpenVEX.Tests.csproj", "{B335DFD5-EAF4-5083-9B37-0435F93396B3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.EIDAS.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.EIDAS.Tests\StellaOps.Cryptography.Plugin.EIDAS.Tests.csproj", "{A07964A7-387D-587F-9507-5E89354A965A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Policy.Tests", "Excititor\__Tests\StellaOps.Excititor.Policy.Tests\StellaOps.Excititor.Policy.Tests.csproj", "{986F3041-3E8A-52E0-A965-92243093D1C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmRemote.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.SmRemote.Tests\StellaOps.Cryptography.Plugin.SmRemote.Tests.csproj", "{69247914-5C25-5B86-8DA2-93F0C41EC3D2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Storage.Postgres.Tests", "Excititor\__Tests\StellaOps.Excititor.Storage.Postgres.Tests\StellaOps.Excititor.Storage.Postgres.Tests.csproj", "{8BD98D23-C7B0-566E-8843-17BE8E005B6F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmSoft.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.SmSoft.Tests\StellaOps.Cryptography.Plugin.SmSoft.Tests.csproj", "{67F2A597-9CF3-554A-89AF-A527D41D8831}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.WebService.Tests", "Excititor\__Tests\StellaOps.Excititor.WebService.Tests\StellaOps.Excititor.WebService.Tests.csproj", "{89B612AB-821C-5707-831E-CF01A24E0FBA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.PluginLoader.Tests", "src\__Libraries\StellaOps.Cryptography.PluginLoader.Tests\StellaOps.Cryptography.PluginLoader.Tests.csproj", "{CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Worker.Tests", "Excititor\__Tests\StellaOps.Excititor.Worker.Tests\StellaOps.Excititor.Worker.Tests.csproj", "{D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Tests", "src\__Libraries\StellaOps.Cryptography.Tests\StellaOps.Cryptography.Tests.csproj", "{180A6CFD-B8CE-56A1-AFE8-030C06C67438}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.WebService", "Excititor\StellaOps.Excititor.WebService\StellaOps.Excititor.WebService.csproj", "{B79F5D06-CC07-50E0-9916-CD91E53BCE4F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EvidenceLocker", "EvidenceLocker", "{75A135A6-2344-5F0A-9314-4DF08380E567}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Worker", "Excititor\StellaOps.Excititor.Worker\StellaOps.Excititor.Worker.csproj", "{D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{6853411B-3FF4-5446-805B-D24664BF9822}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Client", "ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Client\StellaOps.ExportCenter.Client.csproj", "{8CE426C9-853D-5FE0-A939-954D7787890A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Core", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Core\StellaOps.EvidenceLocker.Core.csproj", "{69A89A48-4FF1-56DD-95F4-B81DBAADACDA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Core", "ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Core\StellaOps.ExportCenter.Core.csproj", "{DF324128-78D3-54C8-AAE0-852EA18A4175}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.csproj", "{22C6842B-7851-510C-9DBB-675188E2B020}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Infrastructure", "ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Infrastructure\StellaOps.ExportCenter.Infrastructure.csproj", "{3B0B6785-6E80-5615-9076-F10DD4ED79FC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Infrastructure", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Infrastructure\StellaOps.EvidenceLocker.Infrastructure.csproj", "{D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.RiskBundles", "ExportCenter\StellaOps.ExportCenter.RiskBundles\StellaOps.ExportCenter.RiskBundles.csproj", "{9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{ECFC702B-9395-5F70-A935-FFA7CD63F36D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Client.Tests", "ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Client.Tests\StellaOps.ExportCenter.Client.Tests.csproj", "{F11FF9FF-2A02-5470-93B8-75A8AB307992}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Tests", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Tests\StellaOps.EvidenceLocker.Tests.csproj", "{5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Tests", "ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Tests\StellaOps.ExportCenter.Tests.csproj", "{14E66575-1C2C-5223-9286-BE65FD8FCD6E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{AEAA70CB-616D-57FA-BB16-65807FA8D160}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.WebService", "ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.WebService\StellaOps.ExportCenter.WebService.csproj", "{17161A8D-0F28-5998-9C38-A09E8A0DFECD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.WebService", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.WebService\StellaOps.EvidenceLocker.WebService.csproj", "{027F58E2-96C8-55C3-B22B-1EC5B0621106}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Worker", "ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Worker\StellaOps.ExportCenter.Worker.csproj", "{7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{DB13510A-AFA8-55AA-9918-99B7BCF13AA9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Gateway.WebService", "Gateway\StellaOps.Gateway.WebService\StellaOps.Gateway.WebService.csproj", "{2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Worker", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Worker\StellaOps.EvidenceLocker.Worker.csproj", "{A973EE14-705D-555F-B115-B97D5ADAEA8D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Api", "Graph\StellaOps.Graph.Api\StellaOps.Graph.Api.csproj", "{E04423CA-6046-55AF-92F1-C8492E44A1F4}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Excititor", "Excititor", "{71B4078C-ED75-5332-876E-9B3AD5B6A435}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer", "Graph\StellaOps.Graph.Indexer\StellaOps.Graph.Indexer.csproj", "{500252B3-468C-5303-B06E-C961A475C519}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{166419DF-16BC-5CC6-9634-6AD9517AA816}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Storage.Postgres", "Graph\StellaOps.Graph.Indexer.Storage.Postgres\StellaOps.Graph.Indexer.Storage.Postgres.csproj", "{2004E176-092C-5C14-A7F0-11CC8E383B5C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.ArtifactStores.S3", "src\Excititor\__Libraries\StellaOps.Excititor.ArtifactStores.S3\StellaOps.Excititor.ArtifactStores.S3.csproj", "{88C1DF3F-74F3-507F-B63C-EA54EA56C95C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Api.Tests", "Graph\__Tests\StellaOps.Graph.Api.Tests\StellaOps.Graph.Api.Tests.csproj", "{5618B67A-A525-5958-8001-9AB7A7EB6412}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Attestation", "src\Excititor\__Libraries\StellaOps.Excititor.Attestation\StellaOps.Excititor.Attestation.csproj", "{F931F697-CC40-55BB-999E-BAA4302595E5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Storage.Postgres.Tests", "Graph\StellaOps.Graph.Indexer.Storage.Postgres.Tests\StellaOps.Graph.Indexer.Storage.Postgres.Tests.csproj", "{C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core", "src\Excititor\__Libraries\StellaOps.Excititor.Core\StellaOps.Excititor.Core.csproj", "{BD92B2EA-2C70-514D-B74F-76AD834A0AA4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Analyzers", "__Analyzers\StellaOps.Determinism.Analyzers\StellaOps.Determinism.Analyzers.csproj", "{DA8F7D8C-2022-51C1-9235-1B3613EB703D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Export", "src\Excititor\__Libraries\StellaOps.Excititor.Export\StellaOps.Excititor.Export.csproj", "{309B5313-C885-5629-B9A9-674A532CC498}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LanguageAnalyzerSmoke", "Tools\LanguageAnalyzerSmoke\LanguageAnalyzerSmoke.csproj", "{D2B3DDE0-F44F-5B57-9D3E-679E18FC1032}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Formats.CSAF\StellaOps.Excititor.Formats.CSAF.csproj", "{AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.BinaryAnalysis", "Feedser\StellaOps.Feedser.BinaryAnalysis\StellaOps.Feedser.BinaryAnalysis.csproj", "{600F0F8D-D86F-5CA6-B4E6-7DFB6860981E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CycloneDX", "src\Excititor\__Libraries\StellaOps.Excititor.Formats.CycloneDX\StellaOps.Excititor.Formats.CycloneDX.csproj", "{C0D986EF-15F8-588D-86C8-574B9978D0D1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core", "Feedser\StellaOps.Feedser.Core\StellaOps.Feedser.Core.csproj", "{9A62D7DD-B9F1-5CDD-96D3-07573296F939}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.OpenVEX", "src\Excititor\__Libraries\StellaOps.Excititor.Formats.OpenVEX\StellaOps.Excititor.Formats.OpenVEX.csproj", "{80686466-E848-57CD-99D9-644EEA055741}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger", "Findings\StellaOps.Findings.Ledger\StellaOps.Findings.Ledger.csproj", "{B9B66624-23D7-53C7-B1F5-B1476F5435F2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Policy", "src\Excititor\__Libraries\StellaOps.Excititor.Policy\StellaOps.Excititor.Policy.csproj", "{D906F4BC-54A4-567F-8DD9-4A00C6DC3F75}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LedgerReplayHarness", "Findings\StellaOps.Findings.Ledger\tools\LedgerReplayHarness\LedgerReplayHarness.csproj", "{36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Storage.Postgres", "src\Excititor\__Libraries\StellaOps.Excititor.Storage.Postgres\StellaOps.Excititor.Storage.Postgres.csproj", "{48EAC4C2-5B05-5350-83C8-5F25DC7632D5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Core", "PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Core\StellaOps.PacksRegistry.Core.csproj", "{07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Infrastructure", "PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Infrastructure\StellaOps.PacksRegistry.Infrastructure.csproj", "{394D1A61-BA24-529C-B049-B377DAB866CF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Abstractions", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Abstractions\StellaOps.Excititor.Connectors.Abstractions.csproj", "{41F6B7F1-7767-5A85-B9B5-C70D69F80000}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Storage.Postgres", "PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Storage.Postgres\StellaOps.PacksRegistry.Storage.Postgres.csproj", "{5B598FA9-5AE8-566D-B6D8-C87792622114}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Cisco.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Cisco.CSAF\StellaOps.Excititor.Connectors.Cisco.CSAF.csproj", "{BA5C61B1-EFF0-5FD7-A92F-4E464C16056B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation", "Provenance\StellaOps.Provenance.Attestation\StellaOps.Provenance.Attestation.csproj", "{5C964413-BA49-5580-A781-A020335C9301}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.MSRC.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.MSRC.CSAF\StellaOps.Excititor.Connectors.MSRC.CSAF.csproj", "{1CC50534-78D2-5DC6-9DCF-8D64532260F8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tool", "Provenance\StellaOps.Provenance.Attestation.Tool\StellaOps.Provenance.Attestation.Tool.csproj", "{FF74E087-9D87-5321-B99B-70FE364B9422}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.csproj", "{7DED5634-FD01-5854-96BA-C3F636FB6B10}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Registry.TokenService", "Registry\StellaOps.Registry.TokenService\StellaOps.Registry.TokenService.csproj", "{8CC218FA-816B-5D5F-9BDD-19F88444B22B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Oracle.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Oracle.CSAF\StellaOps.Excititor.Connectors.Oracle.CSAF.csproj", "{3083A5E6-84E0-57FA-8F5F-ECA046992707}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Core", "RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Core\StellaOps.RiskEngine.Core.csproj", "{6B99DEB6-D5DF-5BF1-A9A4-228A757D4836}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.RedHat.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.RedHat.CSAF\StellaOps.Excititor.Connectors.RedHat.CSAF.csproj", "{B70F4C3D-0BF7-59B7-9627-4EF8E7247A17}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Infrastructure", "RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Infrastructure\StellaOps.RiskEngine.Infrastructure.csproj", "{CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.SUSE.RancherVEXHub", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.csproj", "{FD121908-49E7-5B7B-B8E6-A4FEB65D59DA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SmRemote.Service", "SmRemote\StellaOps.SmRemote.Service\StellaOps.SmRemote.Service.csproj", "{3E780079-10D2-5AD2-95FC-98E46718B231}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Ubuntu.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Ubuntu.CSAF\StellaOps.Excititor.Connectors.Ubuntu.CSAF.csproj", "{8929D374-4010-5CAC-8EC0-693194B7216E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Bundle", "Symbols\StellaOps.Symbols.Bundle\StellaOps.Symbols.Bundle.csproj", "{C3B48707-75F7-56DD-9FBD-65DE8D53353B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Client", "Symbols\StellaOps.Symbols.Client\StellaOps.Symbols.Client.csproj", "{A2A04CF8-28FC-51DB-8BC4-00440822348F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.ArtifactStores.S3.Tests", "src\Excititor\__Tests\StellaOps.Excititor.ArtifactStores.S3.Tests\StellaOps.Excititor.ArtifactStores.S3.Tests.csproj", "{21342480-FC88-5789-B7B2-5D9AC7ED18F6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Core", "Symbols\StellaOps.Symbols.Core\StellaOps.Symbols.Core.csproj", "{3F03AECF-1508-5F69-97C3-C2DF3A01B7E1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Attestation.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Attestation.Tests\StellaOps.Excititor.Attestation.Tests.csproj", "{34D26AF7-F7C3-5D31-8E45-D545DE7B56A9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Infrastructure", "Symbols\StellaOps.Symbols.Infrastructure\StellaOps.Symbols.Infrastructure.csproj", "{68D37855-2734-5614-AFF7-39D2FAD17795}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Cisco.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.Cisco.CSAF.Tests\StellaOps.Excititor.Connectors.Cisco.CSAF.Tests.csproj", "{56414F70-A7F6-55C1-B219-DABC8345E9EE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Server", "Symbols\StellaOps.Symbols.Server\StellaOps.Symbols.Server.csproj", "{772A91FD-98F3-5EA2-9CB4-E3088C839D32}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.MSRC.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.MSRC.CSAF.Tests\StellaOps.Excititor.Connectors.MSRC.CSAF.Tests.csproj", "{486EA70D-9F0F-5259-B908-580A60863C5A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Core", "TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Core\StellaOps.TimelineIndexer.Core.csproj", "{B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests.csproj", "{21950636-1E41-520C-978D-6C52417F49CB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Infrastructure", "TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Infrastructure\StellaOps.TimelineIndexer.Infrastructure.csproj", "{1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Oracle.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.Oracle.CSAF.Tests\StellaOps.Excititor.Connectors.Oracle.CSAF.Tests.csproj", "{A3045438-648F-5E60-974C-8A6593165CD7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FixtureUpdater", "Tools\FixtureUpdater\FixtureUpdater.csproj", "{9B85AD15-32BB-5A24-8243-52FD11033E1B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.RedHat.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.RedHat.CSAF.Tests\StellaOps.Excititor.Connectors.RedHat.CSAF.Tests.csproj", "{393B31FC-1469-5DB5-8B89-C6E9AC69A058}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotifySmokeCheck", "Tools\NotifySmokeCheck\NotifySmokeCheck.csproj", "{1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests.csproj", "{3E4B26B0-B184-5184-B086-618F362D3EA8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicyDslValidator", "Tools\PolicyDslValidator\PolicyDslValidator.csproj", "{222C4ED7-2DD8-5F51-A249-323B1F414AE6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests\StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests.csproj", "{74961AF8-0434-5863-B516-179CBD4DD354}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicySchemaExporter", "Tools\PolicySchemaExporter\PolicySchemaExporter.csproj", "{A3D24CDD-0855-5F57-989B-5D8C6CF3570D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Core.Tests\StellaOps.Excititor.Core.Tests.csproj", "{D2C87350-D8EE-5774-9D07-5DB161C1CAFA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicySimulationSmoke", "Tools\PolicySimulationSmoke\PolicySimulationSmoke.csproj", "{4A1395E2-E03E-542C-B190-BDAA205A0E1F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core.UnitTests", "src\Excititor\__Tests\StellaOps.Excititor.Core.UnitTests\StellaOps.Excititor.Core.UnitTests.csproj", "{46F08BCB-C218-5A58-8949-E7CD119BCAB6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RustFsMigrator", "Tools\RustFsMigrator\RustFsMigrator.csproj", "{3C4B8D17-0B69-571F-9B6C-6E945937A3B3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Export.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Export.Tests\StellaOps.Excititor.Export.Tests.csproj", "{9654C643-AD78-586B-819D-8C081576D60C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Audit.ReplayToken", "__Libraries\StellaOps.Audit.ReplayToken\StellaOps.Audit.ReplayToken.csproj", "{E648086E-E39B-5B18-BFDA-E597D04C536A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Formats.CSAF.Tests\StellaOps.Excititor.Formats.CSAF.Tests.csproj", "{ADF02308-4349-5280-9E05-75A6C619E0EC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack", "__Libraries\StellaOps.AuditPack\StellaOps.AuditPack.csproj", "{1D75EF57-0B94-54F5-9FCB-16A888141420}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CycloneDX.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Formats.CycloneDX.Tests\StellaOps.Excititor.Formats.CycloneDX.Tests.csproj", "{3B4D6BEF-0934-5981-B776-AA13BE7FD25E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Security", "__Libraries\StellaOps.Auth.Security\StellaOps.Auth.Security.csproj", "{8A42C228-E80F-5DA1-A752-29F9C7D7FDDC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.OpenVEX.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Formats.OpenVEX.Tests\StellaOps.Excititor.Formats.OpenVEX.Tests.csproj", "{B335DFD5-EAF4-5083-9B37-0435F93396B3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonical.Json", "__Libraries\StellaOps.Canonical.Json\StellaOps.Canonical.Json.csproj", "{683D176E-ECB8-5F5D-AC6E-E2E3E33526DB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Policy.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Policy.Tests\StellaOps.Excititor.Policy.Tests.csproj", "{986F3041-3E8A-52E0-A965-92243093D1C6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonicalization", "__Libraries\StellaOps.Canonicalization\StellaOps.Canonicalization.csproj", "{5C0BB750-025E-5E1D-B717-B871883AAFDE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Storage.Postgres.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Storage.Postgres.Tests\StellaOps.Excititor.Storage.Postgres.Tests.csproj", "{8BD98D23-C7B0-566E-8843-17BE8E005B6F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", "__Libraries\StellaOps.Configuration\StellaOps.Configuration.csproj", "{F03873D8-5506-5461-AF91-247DEF04D700}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.WebService.Tests", "src\Excititor\__Tests\StellaOps.Excititor.WebService.Tests\StellaOps.Excititor.WebService.Tests.csproj", "{89B612AB-821C-5707-831E-CF01A24E0FBA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DeltaVerdict", "__Libraries\StellaOps.DeltaVerdict\StellaOps.DeltaVerdict.csproj", "{02D3276B-BB16-536D-BF6C-CD9067EE2F27}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Worker.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Worker.Tests\StellaOps.Excititor.Worker.Tests.csproj", "{D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DependencyInjection", "__Libraries\StellaOps.DependencyInjection\StellaOps.DependencyInjection.csproj", "{A8F451BE-6076-5D9D-BDF9-FF270ED0391B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{BBEB3971-7F5F-5733-A5B6-4BFDE6D8FD39}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Abstractions", "__Libraries\StellaOps.Determinism.Abstractions\StellaOps.Determinism.Abstractions.csproj", "{65906110-4508-5D7A-A870-2225135CA2AB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.WebService", "src\Excititor\StellaOps.Excititor.WebService\StellaOps.Excititor.WebService.csproj", "{B79F5D06-CC07-50E0-9916-CD91E53BCE4F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence", "__Libraries\StellaOps.Evidence\StellaOps.Evidence.csproj", "{836920D9-3DC3-5926-8ACF-CF41CD59EDB1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{3662068D-D45B-5BB0-8547-E431434F6A31}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Bundle", "__Libraries\StellaOps.Evidence.Bundle\StellaOps.Evidence.Bundle.csproj", "{48BCAF76-EDC4-570D-98C2-032DB39D8662}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Worker", "src\Excititor\StellaOps.Excititor.Worker\StellaOps.Excititor.Worker.csproj", "{D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Core", "__Libraries\StellaOps.Evidence.Core\StellaOps.Evidence.Core.csproj", "{02568C86-83B4-588D-9EA2-58ABAD29DE27}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ExportCenter", "ExportCenter", "{A56334DF-E16C-5CA1-A53B-B2463BE1285C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Storage.Postgres", "__Libraries\StellaOps.Evidence.Storage.Postgres\StellaOps.Evidence.Storage.Postgres.csproj", "{034AD4BC-E7E5-5F87-8A30-12D71BFF63E8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres", "__Libraries\StellaOps.Infrastructure.Postgres\StellaOps.Infrastructure.Postgres.csproj", "{32CD344F-484F-59C3-AC24-3FD9806DD3D6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Client", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Client\StellaOps.ExportCenter.Client.csproj", "{8CE426C9-853D-5FE0-A939-954D7787890A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Ingestion.Telemetry", "__Libraries\StellaOps.Ingestion.Telemetry\StellaOps.Ingestion.Telemetry.csproj", "{E8B300BA-17CC-5884-97DB-C53176BD92FA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Core", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Core\StellaOps.ExportCenter.Core.csproj", "{DF324128-78D3-54C8-AAE0-852EA18A4175}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Interop", "__Libraries\StellaOps.Interop\StellaOps.Interop.csproj", "{B53D2725-B209-56C2-854A-733AA23791BA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Infrastructure", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Infrastructure\StellaOps.ExportCenter.Infrastructure.csproj", "{3B0B6785-6E80-5615-9076-F10DD4ED79FC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging", "__Libraries\StellaOps.Messaging\StellaOps.Messaging.csproj", "{2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.RiskBundles", "src\ExportCenter\StellaOps.ExportCenter.RiskBundles\StellaOps.ExportCenter.RiskBundles.csproj", "{9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.InMemory", "__Libraries\StellaOps.Messaging.Transport.InMemory\StellaOps.Messaging.Transport.InMemory.csproj", "{303C5589-5F40-5AB6-AC14-B74330F4ABCD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{80B4238D-14D4-53B9-8DDE-5AAF6963B6D0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Postgres", "__Libraries\StellaOps.Messaging.Transport.Postgres\StellaOps.Messaging.Transport.Postgres.csproj", "{ACC984E9-DD35-50E3-9DEE-4D31E3905798}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Client.Tests", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Client.Tests\StellaOps.ExportCenter.Client.Tests.csproj", "{F11FF9FF-2A02-5470-93B8-75A8AB307992}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Valkey", "__Libraries\StellaOps.Messaging.Transport.Valkey\StellaOps.Messaging.Transport.Valkey.csproj", "{B0455206-6836-5CCC-981F-DE01652F719E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Tests", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Tests\StellaOps.ExportCenter.Tests.csproj", "{14E66575-1C2C-5223-9286-BE65FD8FCD6E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Metrics", "__Libraries\StellaOps.Metrics\StellaOps.Metrics.csproj", "{378D4FEB-0052-5910-A0C6-F23FFAFF9622}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CA8130F6-DB6A-55F8-A656-DDDEA0B1555A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice", "__Libraries\StellaOps.Microservice\StellaOps.Microservice.csproj", "{D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.WebService", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.WebService\StellaOps.ExportCenter.WebService.csproj", "{17161A8D-0F28-5998-9C38-A09E8A0DFECD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.AspNetCore", "__Libraries\StellaOps.Microservice.AspNetCore\StellaOps.Microservice.AspNetCore.csproj", "{1772BDC5-1285-5297-A93D-F57692363BB2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{ABFB61E3-5DEC-5E1A-BAAC-D5BF448B7C65}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.SourceGen", "__Libraries\StellaOps.Microservice.SourceGen\StellaOps.Microservice.SourceGen.csproj", "{20030AD8-C9FC-5CDA-BA0E-DE13E792A314}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Worker", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Worker\StellaOps.ExportCenter.Worker.csproj", "{7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache", "__Libraries\StellaOps.Provcache\StellaOps.Provcache.csproj", "{1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gateway", "Gateway", "{11942B47-88E5-5886-AAAD-FA4DCC461D2A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Api", "__Libraries\StellaOps.Provcache.Api\StellaOps.Provcache.Api.csproj", "{787405E2-7F5B-5CC2-821E-A54AF8CE3843}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D613FC8A-C7D0-5159-BD5E-DD2A912D4430}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Postgres", "__Libraries\StellaOps.Provcache.Postgres\StellaOps.Provcache.Postgres.csproj", "{468F9192-74B5-5791-807B-A0507E99AE1F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Gateway.WebService.Tests", "src\__Tests\StellaOps.Gateway.WebService.Tests\StellaOps.Gateway.WebService.Tests.csproj", "{85B39AEB-D264-59E3-AE46-C6E09D60816F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Valkey", "__Libraries\StellaOps.Provcache.Valkey\StellaOps.Provcache.Valkey.csproj", "{AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Gateway.WebService.Tests", "src\Gateway\__Tests\StellaOps.Gateway.WebService.Tests\StellaOps.Gateway.WebService.Tests.csproj", "{B22104F2-C574-5E22-ACE9-5E218FCF4ED6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance", "__Libraries\StellaOps.Provenance\StellaOps.Provenance.csproj", "{02A180E2-6690-5EA6-9AD4-4A9616DC1489}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{779F3EC3-3CCC-5B43-87B9-5C67C5B9FBAD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Resolver", "__Libraries\StellaOps.Resolver\StellaOps.Resolver.csproj", "{98DBA04A-9F13-5740-8713-48A21F41D158}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Gateway.WebService", "src\Gateway\StellaOps.Gateway.WebService\StellaOps.Gateway.WebService.csproj", "{2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.AspNet", "__Libraries\StellaOps.Router.AspNet\StellaOps.Router.AspNet.csproj", "{059A8E08-8A8E-5766-9556-C3E18707A316}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Graph", "Graph", "{FD98BA86-C18F-5E6F-BDF5-47D53892B0E4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common", "__Libraries\StellaOps.Router.Common\StellaOps.Router.Common.csproj", "{A0EF31BA-A294-5B97-BAAA-84737FFB0441}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{345A6909-395A-5FAB-8832-2941AFB684FE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config", "__Libraries\StellaOps.Router.Config\StellaOps.Router.Config.csproj", "{49F92D69-4B38-5502-8856-FFD90DEB4ED9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Api", "src\Graph\StellaOps.Graph.Api\StellaOps.Graph.Api.csproj", "{E04423CA-6046-55AF-92F1-C8492E44A1F4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Gateway", "__Libraries\StellaOps.Router.Gateway\StellaOps.Router.Gateway.csproj", "{BA04E8CF-051D-5A9C-B866-AB9470319426}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer", "src\Graph\StellaOps.Graph.Indexer\StellaOps.Graph.Indexer.csproj", "{500252B3-468C-5303-B06E-C961A475C519}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory", "__Libraries\StellaOps.Router.Transport.InMemory\StellaOps.Router.Transport.InMemory.csproj", "{3FBC55A5-8773-5BDC-BF58-45FAC2950D89}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Storage.Postgres", "src\Graph\StellaOps.Graph.Indexer.Storage.Postgres\StellaOps.Graph.Indexer.Storage.Postgres.csproj", "{2004E176-092C-5C14-A7F0-11CC8E383B5C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Messaging", "__Libraries\StellaOps.Router.Transport.Messaging\StellaOps.Router.Transport.Messaging.csproj", "{33BBE42C-6D04-56C2-8A5D-736F670198CE}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9F34C945-1CBF-5F89-B0B6-9B38E74A7718}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.RabbitMq", "__Libraries\StellaOps.Router.Transport.RabbitMq\StellaOps.Router.Transport.RabbitMq.csproj", "{ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Tests", "src\__Tests\Graph\StellaOps.Graph.Indexer.Tests\StellaOps.Graph.Indexer.Tests.csproj", "{F064B0DB-FE3A-58F4-8E8C-904C04749A55}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tcp", "__Libraries\StellaOps.Router.Transport.Tcp\StellaOps.Router.Transport.Tcp.csproj", "{B3A40257-0096-553A-BDDB-ECD222F47D98}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Api.Tests", "src\Graph\__Tests\StellaOps.Graph.Api.Tests\StellaOps.Graph.Api.Tests.csproj", "{5618B67A-A525-5958-8001-9AB7A7EB6412}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tls", "__Libraries\StellaOps.Router.Transport.Tls\StellaOps.Router.Transport.Tls.csproj", "{6CEE9751-CA80-5B25-B7D3-DCB24085450D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Tests", "src\Graph\__Tests\StellaOps.Graph.Indexer.Tests\StellaOps.Graph.Indexer.Tests.csproj", "{D382EF88-1144-5CF4-B768-5A124EB8CF0A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp", "__Libraries\StellaOps.Router.Transport.Udp\StellaOps.Router.Transport.Udp.csproj", "{19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Storage.Postgres.Tests", "src\Graph\StellaOps.Graph.Indexer.Storage.Postgres.Tests\StellaOps.Graph.Indexer.Storage.Postgres.Tests.csproj", "{C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TestKit", "__Libraries\StellaOps.TestKit\StellaOps.TestKit.csproj", "{D1504F57-82C2-5BE5-9524-B3371BC26F82}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VersionComparison", "__Libraries\StellaOps.VersionComparison\StellaOps.VersionComparison.csproj", "{9B29BB87-FEF3-5EF9-8D64-D005408705EC}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{9959D246-3C94-5F38-9D11-E30E754AFDDB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Core", "Unknowns\__Libraries\StellaOps.Unknowns.Core\StellaOps.Unknowns.Core.csproj", "{D67441E5-0211-563B-A29E-7C1A0C815A7C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Analyzers", "src\__Analyzers\StellaOps.Determinism.Analyzers\StellaOps.Determinism.Analyzers.csproj", "{DA8F7D8C-2022-51C1-9235-1B3613EB703D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Storage.Postgres", "Unknowns\__Libraries\StellaOps.Unknowns.Storage.Postgres\StellaOps.Unknowns.Storage.Postgres.csproj", "{A5516E04-C25E-574B-BDA9-25F17B89EA72}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LanguageAnalyzerSmoke", "src\Tools\LanguageAnalyzerSmoke\LanguageAnalyzerSmoke.csproj", "{D2B3DDE0-F44F-5B57-9D3E-679E18FC1032}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin", "__Libraries\StellaOps.Plugin\StellaOps.Plugin.csproj", "{85D772C5-941E-54D2-A07F-CCD85DE0F37F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{303F85EF-F67E-57CC-9BDD-2381265243FE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Analyzers.Tests", "__Analyzers\StellaOps.Determinism.Analyzers.Tests\StellaOps.Determinism.Analyzers.Tests.csproj", "{046A3473-60D2-5BD4-ACFC-5051CAC08296}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.BinaryAnalysis", "src\Feedser\StellaOps.Feedser.BinaryAnalysis\StellaOps.Feedser.BinaryAnalysis.csproj", "{600F0F8D-D86F-5CA6-B4E6-7DFB6860981E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack.Tests", "__Libraries\__Tests\StellaOps.AuditPack.Tests\StellaOps.AuditPack.Tests.csproj", "{690D6500-40C1-57CF-80DF-BCC788C0F09D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core", "src\Feedser\StellaOps.Feedser.Core\StellaOps.Feedser.Core.csproj", "{9A62D7DD-B9F1-5CDD-96D3-07573296F939}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonicalization.Tests", "__Libraries\__Tests\StellaOps.Canonicalization.Tests\StellaOps.Canonicalization.Tests.csproj", "{B631B34A-610F-5F25-A68B-8E2EB93D813F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger", "src\Findings\StellaOps.Findings.Ledger\StellaOps.Findings.Ledger.csproj", "{B9B66624-23D7-53C7-B1F5-B1476F5435F2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration.Tests", "__Libraries\__Tests\StellaOps.Configuration.Tests\StellaOps.Configuration.Tests.csproj", "{A89D579D-119A-512E-ACEB-00C66A99E871}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LedgerReplayHarness", "src\Findings\StellaOps.Findings.Ledger\tools\LedgerReplayHarness\LedgerReplayHarness.csproj", "{36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DeltaVerdict.Tests", "__Libraries\__Tests\StellaOps.DeltaVerdict.Tests\StellaOps.DeltaVerdict.Tests.csproj", "{C0D1E717-51E3-578B-BEDB-F9A02F54042C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LedgerReplayHarness", "src\Findings\tools\LedgerReplayHarness\LedgerReplayHarness.csproj", "{087B1096-EE56-5337-81C4-3655FEC38AAB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Storage.Postgres.Tests", "__Libraries\__Tests\StellaOps.Evidence.Storage.Postgres.Tests\StellaOps.Evidence.Storage.Postgres.Tests.csproj", "{04CEAD38-EF61-56A0-A507-72B12606767F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Core", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Core\StellaOps.PacksRegistry.Core.csproj", "{07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Tests", "__Libraries\__Tests\StellaOps.Evidence.Tests\StellaOps.Evidence.Tests.csproj", "{CC86C30A-0EEB-594F-9680-DB32F10ED128}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Infrastructure", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Infrastructure\StellaOps.PacksRegistry.Infrastructure.csproj", "{394D1A61-BA24-529C-B049-B377DAB866CF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres.Tests", "__Libraries\__Tests\StellaOps.Infrastructure.Postgres.Tests\StellaOps.Infrastructure.Postgres.Tests.csproj", "{931FAFFC-095E-59B7-9E93-EFAA06CD10EB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Storage.Postgres", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Storage.Postgres\StellaOps.PacksRegistry.Storage.Postgres.csproj", "{5B598FA9-5AE8-566D-B6D8-C87792622114}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Valkey.Tests", "__Libraries\__Tests\StellaOps.Messaging.Transport.Valkey.Tests\StellaOps.Messaging.Transport.Valkey.Tests.csproj", "{55593DA0-334B-58C8-BD12-32BD2362A384}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation", "src\Provenance\StellaOps.Provenance.Attestation\StellaOps.Provenance.Attestation.csproj", "{5C964413-BA49-5580-A781-A020335C9301}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Metrics.Tests", "__Libraries\__Tests\StellaOps.Metrics.Tests\StellaOps.Metrics.Tests.csproj", "{34A4AD39-111F-5D02-83ED-6FB0B71B3539}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tool", "src\Provenance\StellaOps.Provenance.Attestation.Tool\StellaOps.Provenance.Attestation.Tool.csproj", "{FF74E087-9D87-5321-B99B-70FE364B9422}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.AspNetCore.Tests", "__Libraries\__Tests\StellaOps.Microservice.AspNetCore.Tests\StellaOps.Microservice.AspNetCore.Tests.csproj", "{3A446391-6537-5C7E-885D-A60B8C6402AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Registry.TokenService", "src\Registry\StellaOps.Registry.TokenService\StellaOps.Registry.TokenService.csproj", "{8CC218FA-816B-5D5F-9BDD-19F88444B22B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.SourceGen.Tests", "__Libraries\__Tests\StellaOps.Microservice.SourceGen.Tests\StellaOps.Microservice.SourceGen.Tests.csproj", "{0A18583B-3913-5C71-900C-8BDB320D6461}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Core", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Core\StellaOps.RiskEngine.Core.csproj", "{6B99DEB6-D5DF-5BF1-A9A4-228A757D4836}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.Tests", "__Libraries\__Tests\StellaOps.Microservice.Tests\StellaOps.Microservice.Tests.csproj", "{6064B3DA-2322-5B7E-B27D-4D0E976114A7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Infrastructure", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Infrastructure\StellaOps.RiskEngine.Infrastructure.csproj", "{CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin.Tests", "__Libraries\__Tests\StellaOps.Plugin.Tests\StellaOps.Plugin.Tests.csproj", "{254361C7-78CF-5510-8D5B-DC1AD1370726}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SmRemote.Service", "src\SmRemote\StellaOps.SmRemote.Service\StellaOps.SmRemote.Service.csproj", "{3E780079-10D2-5AD2-95FC-98E46718B231}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Tests", "__Libraries\__Tests\StellaOps.Provcache.Tests\StellaOps.Provcache.Tests.csproj", "{4990948A-CB1D-54FE-8C2E-AA1D0D275B22}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Bundle", "src\Symbols\StellaOps.Symbols.Bundle\StellaOps.Symbols.Bundle.csproj", "{C3B48707-75F7-56DD-9FBD-65DE8D53353B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common.Tests", "__Libraries\__Tests\StellaOps.Router.Common.Tests\StellaOps.Router.Common.Tests.csproj", "{9D1A020C-0800-5A7C-85DF-4C04A922894B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Client", "src\Symbols\StellaOps.Symbols.Client\StellaOps.Symbols.Client.csproj", "{A2A04CF8-28FC-51DB-8BC4-00440822348F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config.Tests", "__Libraries\__Tests\StellaOps.Router.Config.Tests\StellaOps.Router.Config.Tests.csproj", "{8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Core", "src\Symbols\StellaOps.Symbols.Core\StellaOps.Symbols.Core.csproj", "{3F03AECF-1508-5F69-97C3-C2DF3A01B7E1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Integration.Tests", "__Libraries\__Tests\StellaOps.Router.Integration.Tests\StellaOps.Router.Integration.Tests.csproj", "{E0341225-8AC0-5A3D-90FA-253A39188C59}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Infrastructure", "src\Symbols\StellaOps.Symbols.Infrastructure\StellaOps.Symbols.Infrastructure.csproj", "{68D37855-2734-5614-AFF7-39D2FAD17795}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory.Tests", "__Libraries\__Tests\StellaOps.Router.Transport.InMemory.Tests\StellaOps.Router.Transport.InMemory.Tests.csproj", "{63AA5DD3-66EC-5770-A2AF-73214634BE74}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Server", "src\Symbols\StellaOps.Symbols.Server\StellaOps.Symbols.Server.csproj", "{772A91FD-98F3-5EA2-9CB4-E3088C839D32}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.RabbitMq.Tests", "__Libraries\__Tests\StellaOps.Router.Transport.RabbitMq.Tests\StellaOps.Router.Transport.RabbitMq.Tests.csproj", "{5422FC92-32F8-5B7C-8808-F9F3B01096BA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Core", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Core\StellaOps.TimelineIndexer.Core.csproj", "{B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tcp.Tests", "__Libraries\__Tests\StellaOps.Router.Transport.Tcp.Tests\StellaOps.Router.Transport.Tcp.Tests.csproj", "{239AEE8E-4762-5DC0-AE89-99C559DC3C0C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Infrastructure", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Infrastructure\StellaOps.TimelineIndexer.Infrastructure.csproj", "{1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tls.Tests", "__Libraries\__Tests\StellaOps.Router.Transport.Tls.Tests\StellaOps.Router.Transport.Tls.Tests.csproj", "{940ADFE2-7115-5A6B-8083-E6E9959C5126}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FixtureUpdater", "src\Tools\FixtureUpdater\FixtureUpdater.csproj", "{9B85AD15-32BB-5A24-8243-52FD11033E1B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp.Tests", "__Libraries\__Tests\StellaOps.Router.Transport.Udp.Tests\StellaOps.Router.Transport.Udp.Tests.csproj", "{C2F4CEBC-0FD0-5711-977B-D15B63B6283F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotifySmokeCheck", "src\Tools\NotifySmokeCheck\NotifySmokeCheck.csproj", "{1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism.Tests", "__Libraries\__Tests\StellaOps.Testing.Determinism.Tests\StellaOps.Testing.Determinism.Tests.csproj", "{D6C8C992-6C92-5B42-8C16-DD8579A33A50}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicyDslValidator", "src\Tools\PolicyDslValidator\PolicyDslValidator.csproj", "{222C4ED7-2DD8-5F51-A249-323B1F414AE6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Manifests.Tests", "__Libraries\__Tests\StellaOps.Testing.Manifests.Tests\StellaOps.Testing.Manifests.Tests.csproj", "{914E3DA8-3A2A-541B-B212-E54E5B9E5FF9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicySchemaExporter", "src\Tools\PolicySchemaExporter\PolicySchemaExporter.csproj", "{A3D24CDD-0855-5F57-989B-5D8C6CF3570D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TestKit.Tests", "__Libraries\__Tests\StellaOps.TestKit.Tests\StellaOps.TestKit.Tests.csproj", "{538897D7-98D3-5E80-BB85-2ADD354A6DAD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicySimulationSmoke", "src\Tools\PolicySimulationSmoke\PolicySimulationSmoke.csproj", "{4A1395E2-E03E-542C-B190-BDAA205A0E1F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VersionComparison.Tests", "__Libraries\__Tests\StellaOps.VersionComparison.Tests\StellaOps.VersionComparison.Tests.csproj", "{D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RustFsMigrator", "src\Tools\RustFsMigrator\RustFsMigrator.csproj", "{3C4B8D17-0B69-571F-9B6C-6E945937A3B3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonical.Json.Tests", "__Libraries\StellaOps.Canonical.Json.Tests\StellaOps.Canonical.Json.Tests.csproj", "{0735AB65-C84E-5173-AA33-34D053A2206F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{6F0F4397-95CB-56A9-939E-6731390C383E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Core.Tests", "__Libraries\StellaOps.Evidence.Core.Tests\StellaOps.Evidence.Core.Tests.csproj", "{144905E9-FB74-5478-858D-214E98611302}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Audit.ReplayToken", "src\__Libraries\StellaOps.Audit.ReplayToken\StellaOps.Audit.ReplayToken.csproj", "{E648086E-E39B-5B18-BFDA-E597D04C536A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Resolver.Tests", "__Libraries\StellaOps.Resolver.Tests\StellaOps.Resolver.Tests.csproj", "{138E4BA5-CB08-5034-81E8-77CE875D2338}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack", "src\__Libraries\StellaOps.AuditPack\StellaOps.AuditPack.csproj", "{1D75EF57-0B94-54F5-9FCB-16A888141420}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core.Tests", "Feedser\__Tests\StellaOps.Feedser.Core.Tests\StellaOps.Feedser.Core.Tests.csproj", "{7E440D5A-47CC-5DEA-B24F-74FCEA985B4A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Security", "src\__Libraries\StellaOps.Auth.Security\StellaOps.Auth.Security.csproj", "{8A42C228-E80F-5DA1-A752-29F9C7D7FDDC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.Tests", "Findings\__Tests\StellaOps.Findings.Ledger.Tests\StellaOps.Findings.Ledger.Tests.csproj", "{E6BAF476-7A8E-5D90-85E5-40C6F3381750}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonical.Json", "src\__Libraries\StellaOps.Canonical.Json\StellaOps.Canonical.Json.csproj", "{683D176E-ECB8-5F5D-AC6E-E2E3E33526DB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.Tests", "Notifier\StellaOps.Notifier\StellaOps.Notifier.Tests\StellaOps.Notifier.Tests.csproj", "{0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonicalization", "src\__Libraries\StellaOps.Canonicalization\StellaOps.Canonicalization.csproj", "{5C0BB750-025E-5E1D-B717-B871883AAFDE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Storage.Postgres.Tests", "PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Storage.Postgres.Tests\StellaOps.PacksRegistry.Storage.Postgres.Tests.csproj", "{FF70148A-101D-5C79-8A6B-C82FEB1D0F2A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", "src\__Libraries\StellaOps.Configuration\StellaOps.Configuration.csproj", "{F03873D8-5506-5461-AF91-247DEF04D700}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Tests", "PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Tests\StellaOps.PacksRegistry.Tests.csproj", "{92FB53E1-32EB-5F4E-833E-35A1CD62B32D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GostCryptography", "src\__Libraries\StellaOps.Cryptography.Plugin.CryptoPro\third_party\AlexMAS.GostCryptography\Source\GostCryptography\GostCryptography.csproj", "{76D66413-B838-5648-BF18-B87DD5084BFC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tests", "Provenance\__Tests\StellaOps.Provenance.Attestation.Tests\StellaOps.Provenance.Attestation.Tests.csproj", "{BCC4F860-588E-5D77-8632-FD3F433875BA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DeltaVerdict", "src\__Libraries\StellaOps.DeltaVerdict\StellaOps.DeltaVerdict.csproj", "{02D3276B-BB16-536D-BF6C-CD9067EE2F27}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Registry.TokenService.Tests", "Registry\__Tests\StellaOps.Registry.TokenService.Tests\StellaOps.Registry.TokenService.Tests.csproj", "{611D6EF5-47DD-5683-80D1-D127FE684FBE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DependencyInjection", "src\__Libraries\StellaOps.DependencyInjection\StellaOps.DependencyInjection.csproj", "{A8F451BE-6076-5D9D-BDF9-FF270ED0391B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Tests", "RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Tests\StellaOps.RiskEngine.Tests.csproj", "{0DCAB8B4-4D58-521B-B7CE-F931660BC02D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Abstractions", "src\__Libraries\StellaOps.Determinism.Abstractions\StellaOps.Determinism.Abstractions.csproj", "{65906110-4508-5D7A-A870-2225135CA2AB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Tests", "__Libraries\__Tests\StellaOps.Provenance.Tests\StellaOps.Provenance.Tests.csproj", "{8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence", "src\__Libraries\StellaOps.Evidence\StellaOps.Evidence.csproj", "{836920D9-3DC3-5926-8ACF-CF41CD59EDB1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Tests", "TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Tests\StellaOps.TimelineIndexer.Tests.csproj", "{928428D2-2BD5-59AB-8E56-7969B8A75B85}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Bundle", "src\__Libraries\StellaOps.Evidence.Bundle\StellaOps.Evidence.Bundle.csproj", "{48BCAF76-EDC4-570D-98C2-032DB39D8662}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Core.Tests", "Unknowns\__Tests\StellaOps.Unknowns.Core.Tests\StellaOps.Unknowns.Core.Tests.csproj", "{96C669DB-9F4A-5302-85BE-5D9EF48D64AA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Core", "src\__Libraries\StellaOps.Evidence.Core\StellaOps.Evidence.Core.csproj", "{02568C86-83B4-588D-9EA2-58ABAD29DE27}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Storage.Postgres.Tests", "Unknowns\__Tests\StellaOps.Unknowns.Storage.Postgres.Tests\StellaOps.Unknowns.Storage.Postgres.Tests.csproj", "{47513358-7F52-52B0-8A3A-F6F7083A1357}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Storage.Postgres", "src\__Libraries\StellaOps.Evidence.Storage.Postgres\StellaOps.Evidence.Storage.Postgres.csproj", "{034AD4BC-E7E5-5F87-8A30-12D71BFF63E8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.WebService", "Findings\StellaOps.Findings.Ledger.WebService\StellaOps.Findings.Ledger.WebService.csproj", "{3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres", "src\__Libraries\StellaOps.Infrastructure.Postgres\StellaOps.Infrastructure.Postgres.csproj", "{32CD344F-484F-59C3-AC24-3FD9806DD3D6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.WebService", "Notifier\StellaOps.Notifier\StellaOps.Notifier.WebService\StellaOps.Notifier.WebService.csproj", "{41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Ingestion.Telemetry", "src\__Libraries\StellaOps.Ingestion.Telemetry\StellaOps.Ingestion.Telemetry.csproj", "{E8B300BA-17CC-5884-97DB-C53176BD92FA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.WebService", "PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.WebService\StellaOps.PacksRegistry.WebService.csproj", "{865BED4F-1D52-5ECE-B19E-A4EA8177C690}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Interop", "src\__Libraries\StellaOps.Interop\StellaOps.Interop.csproj", "{B53D2725-B209-56C2-854A-733AA23791BA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.WebService", "RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.WebService\StellaOps.RiskEngine.WebService.csproj", "{0C29ECF8-B816-58C1-8A0E-D2663C91D259}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging", "src\__Libraries\StellaOps.Messaging\StellaOps.Messaging.csproj", "{2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.WebService", "TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.WebService\StellaOps.TimelineIndexer.WebService.csproj", "{A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.InMemory", "src\__Libraries\StellaOps.Messaging.Transport.InMemory\StellaOps.Messaging.Transport.InMemory.csproj", "{303C5589-5F40-5AB6-AC14-B74330F4ABCD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.Worker", "Notifier\StellaOps.Notifier\StellaOps.Notifier.Worker\StellaOps.Notifier.Worker.csproj", "{79CFA9D7-7759-5EA5-9A68-735E4CF304FF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Postgres", "src\__Libraries\StellaOps.Messaging.Transport.Postgres\StellaOps.Messaging.Transport.Postgres.csproj", "{ACC984E9-DD35-50E3-9DEE-4D31E3905798}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Worker", "PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Worker\StellaOps.PacksRegistry.Worker.csproj", "{A43B40D5-0F1B-544B-B621-C2A1D4292D05}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Valkey", "src\__Libraries\StellaOps.Messaging.Transport.Valkey\StellaOps.Messaging.Transport.Valkey.csproj", "{B0455206-6836-5CCC-981F-DE01652F719E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Worker", "RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Worker\StellaOps.RiskEngine.Worker.csproj", "{4B422E10-2700-5740-8507-A9BA717DFF7E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Metrics", "src\__Libraries\StellaOps.Metrics\StellaOps.Metrics.csproj", "{378D4FEB-0052-5910-A0C6-F23FFAFF9622}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Worker", "TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Worker\StellaOps.TimelineIndexer.Worker.csproj", "{693FBCDA-F357-5B46-93E4-1203E1912FEA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice", "src\__Libraries\StellaOps.Microservice\StellaOps.Microservice.csproj", "{D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Core", "IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Core\StellaOps.IssuerDirectory.Core.csproj", "{9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.AspNetCore", "src\__Libraries\StellaOps.Microservice.AspNetCore\StellaOps.Microservice.AspNetCore.csproj", "{1772BDC5-1285-5297-A93D-F57692363BB2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Infrastructure", "IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Infrastructure\StellaOps.IssuerDirectory.Infrastructure.csproj", "{FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.SourceGen", "src\__Libraries\StellaOps.Microservice.SourceGen\StellaOps.Microservice.SourceGen.csproj", "{20030AD8-C9FC-5CDA-BA0E-DE13E792A314}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres", "IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Storage.Postgres\StellaOps.IssuerDirectory.Storage.Postgres.csproj", "{245C2445-685D-5F18-8557-0C3266C41358}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache", "src\__Libraries\StellaOps.Provcache\StellaOps.Provcache.csproj", "{1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Client", "__Libraries\StellaOps.IssuerDirectory.Client\StellaOps.IssuerDirectory.Client.csproj", "{8AE5CA1F-85CD-5BCF-A406-15F68FDDA875}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Api", "src\__Libraries\StellaOps.Provcache.Api\StellaOps.Provcache.Api.csproj", "{787405E2-7F5B-5CC2-821E-A54AF8CE3843}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres.Tests", "IssuerDirectory\__Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests.csproj", "{D7A538CE-DDAB-5F29-A55D-204C9BD1A157}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Postgres", "src\__Libraries\StellaOps.Provcache.Postgres\StellaOps.Provcache.Postgres.csproj", "{468F9192-74B5-5791-807B-A0507E99AE1F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Core.Tests", "IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Core.Tests\StellaOps.IssuerDirectory.Core.Tests.csproj", "{3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Valkey", "src\__Libraries\StellaOps.Provcache.Valkey\StellaOps.Provcache.Valkey.csproj", "{AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.WebService", "IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.WebService\StellaOps.IssuerDirectory.WebService.csproj", "{59DCF5F1-F87C-5A73-A251-45C4D98D8F34}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance", "src\__Libraries\StellaOps.Provenance\StellaOps.Provenance.csproj", "{02A180E2-6690-5EA6-9AD4-4A9616DC1489}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Engine", "Notify\__Libraries\StellaOps.Notify.Engine\StellaOps.Notify.Engine.csproj", "{640B22EB-F7DC-57AF-9E6E-1BDD18810064}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Resolver", "src\__Libraries\StellaOps.Resolver\StellaOps.Resolver.csproj", "{98DBA04A-9F13-5740-8713-48A21F41D158}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Models", "Notify\__Libraries\StellaOps.Notify.Models\StellaOps.Notify.Models.csproj", "{68B2E31B-A427-52C6-A3A6-8902A21A9D04}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.AspNet", "src\__Libraries\StellaOps.Router.AspNet\StellaOps.Router.AspNet.csproj", "{059A8E08-8A8E-5766-9556-C3E18707A316}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Queue", "Notify\__Libraries\StellaOps.Notify.Queue\StellaOps.Notify.Queue.csproj", "{6E26EDF7-C6C4-5B4D-A8D5-E69794986F58}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common", "src\__Libraries\StellaOps.Router.Common\StellaOps.Router.Common.csproj", "{A0EF31BA-A294-5B97-BAAA-84737FFB0441}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.InMemory", "Notify\__Libraries\StellaOps.Notify.Storage.InMemory\StellaOps.Notify.Storage.InMemory.csproj", "{1763B240-97A6-5710-A7A6-8A1F63311597}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config", "src\__Libraries\StellaOps.Router.Config\StellaOps.Router.Config.csproj", "{49F92D69-4B38-5502-8856-FFD90DEB4ED9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.Postgres", "Notify\__Libraries\StellaOps.Notify.Storage.Postgres\StellaOps.Notify.Storage.Postgres.csproj", "{F23B9764-280A-5720-8B5B-B227092A24A9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Gateway", "src\__Libraries\StellaOps.Router.Gateway\StellaOps.Router.Gateway.csproj", "{BA04E8CF-051D-5A9C-B866-AB9470319426}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Email", "Notify\__Libraries\StellaOps.Notify.Connectors.Email\StellaOps.Notify.Connectors.Email.csproj", "{40426D69-90A0-599F-8113-BAAA98714E62}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory", "src\__Libraries\StellaOps.Router.Transport.InMemory\StellaOps.Router.Transport.InMemory.csproj", "{3FBC55A5-8773-5BDC-BF58-45FAC2950D89}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Shared", "Notify\__Libraries\StellaOps.Notify.Connectors.Shared\StellaOps.Notify.Connectors.Shared.csproj", "{41671DFA-9B15-574B-9B82-45CA2A254269}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Messaging", "src\__Libraries\StellaOps.Router.Transport.Messaging\StellaOps.Router.Transport.Messaging.csproj", "{33BBE42C-6D04-56C2-8A5D-736F670198CE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Slack", "Notify\__Libraries\StellaOps.Notify.Connectors.Slack\StellaOps.Notify.Connectors.Slack.csproj", "{8119F319-6F44-51B0-893E-24B214690A37}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.RabbitMq", "src\__Libraries\StellaOps.Router.Transport.RabbitMq\StellaOps.Router.Transport.RabbitMq.csproj", "{ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Teams", "Notify\__Libraries\StellaOps.Notify.Connectors.Teams\StellaOps.Notify.Connectors.Teams.csproj", "{8581A797-6D1A-5605-B9C6-4EB8CC349425}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tcp", "src\__Libraries\StellaOps.Router.Transport.Tcp\StellaOps.Router.Transport.Tcp.csproj", "{B3A40257-0096-553A-BDDB-ECD222F47D98}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Webhook", "Notify\__Libraries\StellaOps.Notify.Connectors.Webhook\StellaOps.Notify.Connectors.Webhook.csproj", "{7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tls", "src\__Libraries\StellaOps.Router.Transport.Tls\StellaOps.Router.Transport.Tls.csproj", "{6CEE9751-CA80-5B25-B7D3-DCB24085450D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Email.Tests", "Notify\__Tests\StellaOps.Notify.Connectors.Email.Tests\StellaOps.Notify.Connectors.Email.Tests.csproj", "{97545321-6315-574C-94EA-C4D756A323EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp", "src\__Libraries\StellaOps.Router.Transport.Udp\StellaOps.Router.Transport.Udp.csproj", "{19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Slack.Tests", "Notify\__Tests\StellaOps.Notify.Connectors.Slack.Tests\StellaOps.Notify.Connectors.Slack.Tests.csproj", "{7F384D30-79DA-55EF-AA3F-5C433126B646}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TestKit", "src\__Libraries\StellaOps.TestKit\StellaOps.TestKit.csproj", "{D1504F57-82C2-5BE5-9524-B3371BC26F82}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Teams.Tests", "Notify\__Tests\StellaOps.Notify.Connectors.Teams.Tests\StellaOps.Notify.Connectors.Teams.Tests.csproj", "{BCD434BC-C9DE-5291-A5C8-AD32891A7401}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VersionComparison", "src\__Libraries\StellaOps.VersionComparison\StellaOps.VersionComparison.csproj", "{9B29BB87-FEF3-5EF9-8D64-D005408705EC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Webhook.Tests", "Notify\__Tests\StellaOps.Notify.Connectors.Webhook.Tests\StellaOps.Notify.Connectors.Webhook.Tests.csproj", "{95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Core", "src\Unknowns\__Libraries\StellaOps.Unknowns.Core\StellaOps.Unknowns.Core.csproj", "{D67441E5-0211-563B-A29E-7C1A0C815A7C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Core.Tests", "Notify\__Tests\StellaOps.Notify.Core.Tests\StellaOps.Notify.Core.Tests.csproj", "{5881D3BD-529E-5092-8640-1CE0844FE0FB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Storage.Postgres", "src\Unknowns\__Libraries\StellaOps.Unknowns.Storage.Postgres\StellaOps.Unknowns.Storage.Postgres.csproj", "{A5516E04-C25E-574B-BDA9-25F17B89EA72}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Engine.Tests", "Notify\__Tests\StellaOps.Notify.Engine.Tests\StellaOps.Notify.Engine.Tests.csproj", "{D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{A1795401-DAF5-5F44-B3F6-173F7DF8897F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Models.Tests", "Notify\__Tests\StellaOps.Notify.Models.Tests\StellaOps.Notify.Models.Tests.csproj", "{2512F361-2C0C-56B4-9D93-7DBBBF55815E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin", "src\__Libraries\StellaOps.Plugin\StellaOps.Plugin.csproj", "{85D772C5-941E-54D2-A07F-CCD85DE0F37F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Queue.Tests", "Notify\__Tests\StellaOps.Notify.Queue.Tests\StellaOps.Notify.Queue.Tests.csproj", "{78400F00-37A1-574C-8391-3CFA7E014B4D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C6EAF280-23DC-52B2-B52C-AB20ED55AB42}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.Postgres.Tests", "Notify\__Tests\StellaOps.Notify.Storage.Postgres.Tests\StellaOps.Notify.Storage.Postgres.Tests.csproj", "{75D9C1EF-60D4-51E9-A0F4-FBE6632AF791}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Analyzers.Tests", "src\__Analyzers\StellaOps.Determinism.Analyzers.Tests\StellaOps.Determinism.Analyzers.Tests.csproj", "{046A3473-60D2-5BD4-ACFC-5051CAC08296}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.WebService.Tests", "Notify\__Tests\StellaOps.Notify.WebService.Tests\StellaOps.Notify.WebService.Tests.csproj", "{4FB42ADD-4BAB-5C19-BD4E-E39F95348600}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack.Tests", "src\__Libraries\__Tests\StellaOps.AuditPack.Tests\StellaOps.AuditPack.Tests.csproj", "{690D6500-40C1-57CF-80DF-BCC788C0F09D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Worker.Tests", "Notify\__Tests\StellaOps.Notify.Worker.Tests\StellaOps.Notify.Worker.Tests.csproj", "{7EE3111E-53B5-5EE7-99FB-230A9B4EFD50}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonicalization.Tests", "src\__Libraries\__Tests\StellaOps.Canonicalization.Tests\StellaOps.Canonicalization.Tests.csproj", "{B631B34A-610F-5F25-A68B-8E2EB93D813F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.WebService", "Notify\StellaOps.Notify.WebService\StellaOps.Notify.WebService.csproj", "{A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration.Tests", "src\__Libraries\__Tests\StellaOps.Configuration.Tests\StellaOps.Configuration.Tests.csproj", "{A89D579D-119A-512E-ACEB-00C66A99E871}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Worker", "Notify\StellaOps.Notify.Worker\StellaOps.Notify.Worker.csproj", "{A15C2434-BBA5-540A-B863-20A347A3F160}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DeltaVerdict.Tests", "src\__Libraries\__Tests\StellaOps.DeltaVerdict.Tests\StellaOps.DeltaVerdict.Tests.csproj", "{C0D1E717-51E3-578B-BEDB-F9A02F54042C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Core", "Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Core\StellaOps.Orchestrator.Core.csproj", "{A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Storage.Postgres.Tests", "src\__Libraries\__Tests\StellaOps.Evidence.Storage.Postgres.Tests\StellaOps.Evidence.Storage.Postgres.Tests.csproj", "{04CEAD38-EF61-56A0-A507-72B12606767F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Infrastructure", "Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Infrastructure\StellaOps.Orchestrator.Infrastructure.csproj", "{F8564409-54F7-59AA-8E2A-E9022839ED4F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Tests", "src\__Libraries\__Tests\StellaOps.Evidence.Tests\StellaOps.Evidence.Tests.csproj", "{CC86C30A-0EEB-594F-9680-DB32F10ED128}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Schemas", "__Libraries\StellaOps.Orchestrator.Schemas\StellaOps.Orchestrator.Schemas.csproj", "{E6887A02-800D-5F8B-8623-C9C052F6A690}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres.Tests", "src\__Libraries\__Tests\StellaOps.Infrastructure.Postgres.Tests\StellaOps.Infrastructure.Postgres.Tests.csproj", "{931FAFFC-095E-59B7-9E93-EFAA06CD10EB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Tests", "Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Tests\StellaOps.Orchestrator.Tests.csproj", "{721DD473-5A17-5E0D-B0CA-B2F91A3333EB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Valkey.Tests", "src\__Libraries\__Tests\StellaOps.Messaging.Transport.Valkey.Tests\StellaOps.Messaging.Transport.Valkey.Tests.csproj", "{55593DA0-334B-58C8-BD12-32BD2362A384}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.WebService", "Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.WebService\StellaOps.Orchestrator.WebService.csproj", "{AA0D3C06-0E6C-5671-BBEF-C5594F869378}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Metrics.Tests", "src\__Libraries\__Tests\StellaOps.Metrics.Tests\StellaOps.Metrics.Tests.csproj", "{34A4AD39-111F-5D02-83ED-6FB0B71B3539}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Worker", "Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Worker\StellaOps.Orchestrator.Worker.csproj", "{6584A0EB-82AE-59E7-8023-3261AF88217D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.AspNetCore.Tests", "src\__Libraries\__Tests\StellaOps.Microservice.AspNetCore.Tests\StellaOps.Microservice.AspNetCore.Tests.csproj", "{3A446391-6537-5C7E-885D-A60B8C6402AD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine", "Policy\StellaOps.Policy.Engine\StellaOps.Policy.Engine.csproj", "{8010A35A-7CDE-5521-9D64-4C97F0DA3E93}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.SourceGen.Tests", "src\__Libraries\__Tests\StellaOps.Microservice.SourceGen.Tests\StellaOps.Microservice.SourceGen.Tests.csproj", "{0A18583B-3913-5C71-900C-8BDB320D6461}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Gateway", "Policy\StellaOps.Policy.Gateway\StellaOps.Policy.Gateway.csproj", "{E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.Tests", "src\__Libraries\__Tests\StellaOps.Microservice.Tests\StellaOps.Microservice.Tests.csproj", "{6064B3DA-2322-5B7E-B27D-4D0E976114A7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Registry", "Policy\StellaOps.Policy.Registry\StellaOps.Policy.Registry.csproj", "{2135DC08-5B28-591C-A43B-445D7BB98303}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin.Tests", "src\__Libraries\__Tests\StellaOps.Plugin.Tests\StellaOps.Plugin.Tests.csproj", "{254361C7-78CF-5510-8D5B-DC1AD1370726}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.RiskProfile", "Policy\StellaOps.Policy.RiskProfile\StellaOps.Policy.RiskProfile.csproj", "{E9610063-C8DB-589B-A817-CC06CE65ACC4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Tests", "src\__Libraries\__Tests\StellaOps.Provcache.Tests\StellaOps.Provcache.Tests.csproj", "{4990948A-CB1D-54FE-8C2E-AA1D0D275B22}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Scoring", "Policy\StellaOps.Policy.Scoring\StellaOps.Policy.Scoring.csproj", "{B81E7A3D-0F57-59A9-9EFF-E940745C9B90}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common.Tests", "src\__Libraries\__Tests\StellaOps.Router.Common.Tests\StellaOps.Router.Common.Tests.csproj", "{9D1A020C-0800-5A7C-85DF-4C04A922894B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyDsl", "Policy\StellaOps.PolicyDsl\StellaOps.PolicyDsl.csproj", "{41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config.Tests", "src\__Libraries\__Tests\StellaOps.Router.Config.Tests\StellaOps.Router.Config.Tests.csproj", "{8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyAuthoritySignals.Contracts", "__Libraries\StellaOps.PolicyAuthoritySignals.Contracts\StellaOps.PolicyAuthoritySignals.Contracts.csproj", "{BBA41FC3-A097-5751-9830-B028CB357E58}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Integration.Tests", "src\__Libraries\__Tests\StellaOps.Router.Integration.Tests\StellaOps.Router.Integration.Tests.csproj", "{E0341225-8AC0-5A3D-90FA-253A39188C59}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy", "Policy\__Libraries\StellaOps.Policy\StellaOps.Policy.csproj", "{F6AE6B49-960C-555C-90BF-38A2E03EF27A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.InMemory.Tests\StellaOps.Router.Transport.InMemory.Tests.csproj", "{63AA5DD3-66EC-5770-A2AF-73214634BE74}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.AuthSignals", "Policy\__Libraries\StellaOps.Policy.AuthSignals\StellaOps.Policy.AuthSignals.csproj", "{DEA58CAE-08AD-5376-BE6F-883B85760DD7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.RabbitMq.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.RabbitMq.Tests\StellaOps.Router.Transport.RabbitMq.Tests.csproj", "{5422FC92-32F8-5B7C-8808-F9F3B01096BA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Exceptions", "Policy\__Libraries\StellaOps.Policy.Exceptions\StellaOps.Policy.Exceptions.csproj", "{4B27536C-E23B-5808-ABAE-BC93F0F7B109}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tcp.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.Tcp.Tests\StellaOps.Router.Transport.Tcp.Tests.csproj", "{239AEE8E-4762-5DC0-AE89-99C559DC3C0C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Storage.Postgres", "Policy\__Libraries\StellaOps.Policy.Storage.Postgres\StellaOps.Policy.Storage.Postgres.csproj", "{4E87FA32-5495-54BA-B5FC-383F20ABA094}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tls.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.Tls.Tests\StellaOps.Router.Transport.Tls.Tests.csproj", "{940ADFE2-7115-5A6B-8083-E6E9959C5126}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Unknowns", "Policy\__Libraries\StellaOps.Policy.Unknowns\StellaOps.Policy.Unknowns.csproj", "{4EF8E25B-4A19-5D64-8F95-40D86B51E453}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.Udp.Tests\StellaOps.Router.Transport.Udp.Tests.csproj", "{C2F4CEBC-0FD0-5711-977B-D15B63B6283F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine.Contract.Tests", "Policy\__Tests\StellaOps.Policy.Engine.Contract.Tests\StellaOps.Policy.Engine.Contract.Tests.csproj", "{9ECD2194-4E14-5CCD-9AA0-5279B464EF4A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism.Tests", "src\__Libraries\__Tests\StellaOps.Testing.Determinism.Tests\StellaOps.Testing.Determinism.Tests.csproj", "{D6C8C992-6C92-5B42-8C16-DD8579A33A50}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine.Tests", "Policy\__Tests\StellaOps.Policy.Engine.Tests\StellaOps.Policy.Engine.Tests.csproj", "{B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Manifests.Tests", "src\__Libraries\__Tests\StellaOps.Testing.Manifests.Tests\StellaOps.Testing.Manifests.Tests.csproj", "{914E3DA8-3A2A-541B-B212-E54E5B9E5FF9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Exceptions.Tests", "Policy\__Tests\StellaOps.Policy.Exceptions.Tests\StellaOps.Policy.Exceptions.Tests.csproj", "{2EF64916-E58F-5155-8A3D-735E7A019BDF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TestKit.Tests", "src\__Libraries\__Tests\StellaOps.TestKit.Tests\StellaOps.TestKit.Tests.csproj", "{538897D7-98D3-5E80-BB85-2ADD354A6DAD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Gateway.Tests", "Policy\__Tests\StellaOps.Policy.Gateway.Tests\StellaOps.Policy.Gateway.Tests.csproj", "{9E95BC40-F0B0-5362-9694-5013FAFE83C5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VersionComparison.Tests", "src\__Libraries\__Tests\StellaOps.VersionComparison.Tests\StellaOps.VersionComparison.Tests.csproj", "{D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Pack.Tests", "Policy\__Tests\StellaOps.Policy.Pack.Tests\StellaOps.Policy.Pack.Tests.csproj", "{4767D489-E3AF-5C99-825F-6C90CE550264}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonical.Json.Tests", "src\__Libraries\StellaOps.Canonical.Json.Tests\StellaOps.Canonical.Json.Tests.csproj", "{0735AB65-C84E-5173-AA33-34D053A2206F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.RiskProfile.Tests", "Policy\__Tests\StellaOps.Policy.RiskProfile.Tests\StellaOps.Policy.RiskProfile.Tests.csproj", "{0EFA741A-DAB8-5C34-BCF6-86000CC31530}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GostCryptography.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.CryptoPro\third_party\AlexMAS.GostCryptography\Source\GostCryptography.Tests\GostCryptography.Tests.csproj", "{DC026D6C-B3C7-563C-9686-598397B646F0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Scoring.Tests", "Policy\__Tests\StellaOps.Policy.Scoring.Tests\StellaOps.Policy.Scoring.Tests.csproj", "{A4790683-9F0A-5B2A-806F-797619E2A98A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Core.Tests", "src\__Libraries\StellaOps.Evidence.Core.Tests\StellaOps.Evidence.Core.Tests.csproj", "{144905E9-FB74-5478-858D-214E98611302}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Storage.Postgres.Tests", "Policy\__Tests\StellaOps.Policy.Storage.Postgres.Tests\StellaOps.Policy.Storage.Postgres.Tests.csproj", "{1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Resolver.Tests", "src\__Libraries\StellaOps.Resolver.Tests\StellaOps.Resolver.Tests.csproj", "{138E4BA5-CB08-5034-81E8-77CE875D2338}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Tests", "Policy\__Tests\StellaOps.Policy.Tests\StellaOps.Policy.Tests.csproj", "{3B765847-031F-5291-AEB9-E8BB59EF1B53}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core.Tests", "src\Feedser\__Tests\StellaOps.Feedser.Core.Tests\StellaOps.Feedser.Core.Tests.csproj", "{7E440D5A-47CC-5DEA-B24F-74FCEA985B4A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Unknowns.Tests", "Policy\__Tests\StellaOps.Policy.Unknowns.Tests\StellaOps.Policy.Unknowns.Tests.csproj", "{F96E3D04-4D69-575F-9347-8AC47337D471}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.Tests", "src\Findings\__Tests\StellaOps.Findings.Ledger.Tests\StellaOps.Findings.Ledger.Tests.csproj", "{E6BAF476-7A8E-5D90-85E5-40C6F3381750}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyDsl.Tests", "Policy\__Tests\StellaOps.PolicyDsl.Tests\StellaOps.PolicyDsl.Tests.csproj", "{04A2ACE6-20E8-5707-87BD-F024FAD7DED0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.Tests", "src\Findings\StellaOps.Findings.Ledger.Tests\StellaOps.Findings.Ledger.Tests.csproj", "{39F576C5-7241-5E33-9F70-6A3AC310AA9A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay", "__Libraries\StellaOps.Replay\StellaOps.Replay.csproj", "{55C23781-1A56-59FF-9AF3-4BA07A0992CC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.Tests", "src\Notifier\StellaOps.Notifier\StellaOps.Notifier.Tests\StellaOps.Notifier.Tests.csproj", "{0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core", "__Libraries\StellaOps.Replay.Core\StellaOps.Replay.Core.csproj", "{9C2C091A-1607-5418-B5A5-20A86652835B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Storage.Postgres.Tests", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Storage.Postgres.Tests\StellaOps.PacksRegistry.Storage.Postgres.Tests.csproj", "{FF70148A-101D-5C79-8A6B-C82FEB1D0F2A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "__Libraries\__Tests\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{58C44599-F7B5-5911-8B0B-66C4FCB027A2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Tests", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Tests\StellaOps.PacksRegistry.Tests.csproj", "{92FB53E1-32EB-5F4E-833E-35A1CD62B32D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Tests", "__Libraries\__Tests\StellaOps.Replay.Tests\StellaOps.Replay.Tests.csproj", "{FA7943CD-23FC-58EE-BBFE-965758D362C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tests", "src\Provenance\__Tests\StellaOps.Provenance.Attestation.Tests\StellaOps.Provenance.Attestation.Tests.csproj", "{BCC4F860-588E-5D77-8632-FD3F433875BA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.WebService", "Replay\StellaOps.Replay.WebService\StellaOps.Replay.WebService.csproj", "{C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Registry.TokenService.Tests", "src\Registry\__Tests\StellaOps.Registry.TokenService.Tests\StellaOps.Registry.TokenService.Tests.csproj", "{611D6EF5-47DD-5683-80D1-D127FE684FBE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService", "SbomService\StellaOps.SbomService\StellaOps.SbomService.csproj", "{0661F0EE-F6A1-5305-86BD-42849137BDBF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Tests", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Tests\StellaOps.RiskEngine.Tests.csproj", "{0DCAB8B4-4D58-521B-B7CE-F931660BC02D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Storage.Postgres", "SbomService\StellaOps.SbomService.Storage.Postgres\StellaOps.SbomService.Storage.Postgres.csproj", "{A2D930E0-FCEC-5984-89FA-1B6D2046C7A7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Events.Provenance.Tests", "src\StellaOps.Events.Provenance.Tests\StellaOps.Events.Provenance.Tests.csproj", "{8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Storage.Postgres.Tests", "SbomService\StellaOps.SbomService.Storage.Postgres.Tests\StellaOps.SbomService.Storage.Postgres.Tests.csproj", "{FC7A23D5-6A5F-5274-B360-95393EAB244B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Tests", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Tests\StellaOps.TimelineIndexer.Tests.csproj", "{928428D2-2BD5-59AB-8E56-7969B8A75B85}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Tests", "SbomService\StellaOps.SbomService.Tests\StellaOps.SbomService.Tests.csproj", "{26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Core.Tests", "src\Unknowns\__Tests\StellaOps.Unknowns.Core.Tests\StellaOps.Unknowns.Core.Tests.csproj", "{96C669DB-9F4A-5302-85BE-5D9EF48D64AA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks", "Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks.csproj", "{F208351E-5372-53EF-ABBF-C349C32B33E4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Storage.Postgres.Tests", "src\Unknowns\__Tests\StellaOps.Unknowns.Storage.Postgres.Tests\StellaOps.Unknowns.Storage.Postgres.Tests.csproj", "{47513358-7F52-52B0-8A3A-F6F7083A1357}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks", "Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks.csproj", "{C061A376-5BF3-58B4-B301-28ABC6DE0A3B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{70543E0A-0F3A-5954-9C13-3972FA97737A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks", "Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks.csproj", "{BFCBC834-E9E7-5937-AC74-596459428D2C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.WebService", "src\Findings\StellaOps.Findings.Ledger.WebService\StellaOps.Findings.Ledger.WebService.csproj", "{3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmark", "Scanner\__Libraries\StellaOps.Scanner.Benchmark\StellaOps.Scanner.Benchmark.csproj", "{A9660377-E43A-5514-94B8-813B40D34E21}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.WebService", "src\Notifier\StellaOps.Notifier\StellaOps.Notifier.WebService\StellaOps.Notifier.WebService.csproj", "{41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmarks", "Scanner\__Libraries\StellaOps.Scanner.Benchmarks\StellaOps.Scanner.Benchmarks.csproj", "{5A8FFD16-30ED-55A8-A69E-37877E540442}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.WebService", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.WebService\StellaOps.PacksRegistry.WebService.csproj", "{865BED4F-1D52-5ECE-B19E-A4EA8177C690}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Epss.Perf", "Scanner\__Benchmarks\StellaOps.Scanner.Storage.Epss.Perf\StellaOps.Scanner.Storage.Epss.Perf.csproj", "{8C747A2A-F2D2-57C3-9777-C32EFB6BA17A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.WebService", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.WebService\StellaOps.RiskEngine.WebService.csproj", "{0C29ECF8-B816-58C1-8A0E-D2663C91D259}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Advisory", "Scanner\__Libraries\StellaOps.Scanner.Advisory\StellaOps.Scanner.Advisory.csproj", "{03D045E7-F7AB-59EE-B53D-6B890AF278FB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.WebService", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.WebService\StellaOps.TimelineIndexer.WebService.csproj", "{A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang\StellaOps.Scanner.Analyzers.Lang.csproj", "{174D2124-12A2-5620-964F-6D2737DA5DEA}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{922A7463-1237-5064-A5E6-4B583E2D53A8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Bun", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Bun\StellaOps.Scanner.Analyzers.Lang.Bun.csproj", "{9A6818AB-29A5-57B5-9958-B5F93B421964}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.Worker", "src\Notifier\StellaOps.Notifier\StellaOps.Notifier.Worker\StellaOps.Notifier.Worker.csproj", "{79CFA9D7-7759-5EA5-9A68-735E4CF304FF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Deno\StellaOps.Scanner.Analyzers.Lang.Deno.csproj", "{467C42CD-ED69-5E21-BFF3-F35BAE24E9AF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Worker", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Worker\StellaOps.PacksRegistry.Worker.csproj", "{A43B40D5-0F1B-544B-B621-C2A1D4292D05}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.DotNet", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.DotNet\StellaOps.Scanner.Analyzers.Lang.DotNet.csproj", "{03262415-2C11-5B62-84A7-33FC321D43AF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Worker", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Worker\StellaOps.RiskEngine.Worker.csproj", "{4B422E10-2700-5740-8507-A9BA717DFF7E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Go", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Go\StellaOps.Scanner.Analyzers.Lang.Go.csproj", "{75991E1E-7D74-53B5-927C-D639337202C4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Worker", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Worker\StellaOps.TimelineIndexer.Worker.csproj", "{693FBCDA-F357-5B46-93E4-1203E1912FEA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Java", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Java\StellaOps.Scanner.Analyzers.Lang.Java.csproj", "{D24D7552-BE3F-58CD-A458-9BFA2403C696}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IssuerDirectory", "IssuerDirectory", "{C088E3B4-FC6A-53D6-9E58-D880F15DF7DC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Node\StellaOps.Scanner.Analyzers.Lang.Node.csproj", "{2BC14382-5C69-528B-9FCE-488CE3F8143E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{1D421D62-76ED-5076-A4DD-48E3D13232C2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Php\StellaOps.Scanner.Analyzers.Lang.Php.csproj", "{E7802557-EEB2-53EB-98C3-62A1E0DCC4BC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Core", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Core\StellaOps.IssuerDirectory.Core.csproj", "{9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Python", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Python\StellaOps.Scanner.Analyzers.Lang.Python.csproj", "{FBF45F4E-D545-5897-8A02-428C51A3C4A0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Infrastructure", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Infrastructure\StellaOps.IssuerDirectory.Infrastructure.csproj", "{FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Ruby", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Ruby\StellaOps.Scanner.Analyzers.Lang.Ruby.csproj", "{D5C3A0AF-A331-5C5F-AC21-3982A3BD3066}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Storage.Postgres\StellaOps.IssuerDirectory.Storage.Postgres.csproj", "{245C2445-685D-5F18-8557-0C3266C41358}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Rust", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Rust\StellaOps.Scanner.Analyzers.Lang.Rust.csproj", "{69A56760-817A-5A9C-A52E-764FB0194071}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{47CA7D44-20AE-5238-AB1F-ED7382F2F034}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS\StellaOps.Scanner.Analyzers.OS.csproj", "{CF956202-62CB-5340-BED9-0AB42E99E48D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Client", "src\__Libraries\StellaOps.IssuerDirectory.Client\StellaOps.IssuerDirectory.Client.csproj", "{8AE5CA1F-85CD-5BCF-A406-15F68FDDA875}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Apk", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Apk\StellaOps.Scanner.Analyzers.OS.Apk.csproj", "{441BAC38-A865-559B-9310-02CB5D417209}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{32554071-B945-5653-85C6-007D3DD4E6AC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Dpkg", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Dpkg\StellaOps.Scanner.Analyzers.OS.Dpkg.csproj", "{BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres.Tests", "src\IssuerDirectory\__Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests.csproj", "{D7A538CE-DDAB-5F29-A55D-204C9BD1A157}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Homebrew", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Homebrew\StellaOps.Scanner.Analyzers.OS.Homebrew.csproj", "{36964679-F5CA-57C8-A7C7-98FF38998644}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres.Tests", "src\IssuerDirectory\StellaOps.IssuerDirectory\__Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests.csproj", "{ABE22056-D6B6-5B41-812A-8DCEC9812B8E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.MacOsBundle", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.MacOsBundle\StellaOps.Scanner.Analyzers.OS.MacOsBundle.csproj", "{DE8969D1-E305-54AD-A3B7-8AF897C19503}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Core.Tests", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Core.Tests\StellaOps.IssuerDirectory.Core.Tests.csproj", "{3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Pkgutil", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Pkgutil\StellaOps.Scanner.Analyzers.OS.Pkgutil.csproj", "{FF3858C2-487C-5056-9BE1-753096E3828C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{3016D8EA-2B83-581B-B0EE-30AB6CA8A1D5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Rpm", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Rpm\StellaOps.Scanner.Analyzers.OS.Rpm.csproj", "{284574B8-F4BF-5711-81F6-43A277F6E374}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.WebService", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.WebService\StellaOps.IssuerDirectory.WebService.csproj", "{59DCF5F1-F87C-5A73-A251-45C4D98D8F34}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.csproj", "{4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Notify", "Notify", "{F689A8D5-683B-5813-8857-AD0EE10504C0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Msi", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.Msi\StellaOps.Scanner.Analyzers.OS.Windows.Msi.csproj", "{C981E0FC-E546-5B95-8995-2296C4BCCC11}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{DCDABCC3-2699-5112-A042-7E2F0E9E4D43}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.WinSxS", "Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.csproj", "{B7303B10-C5BF-5710-9FB6-FCE79C270488}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Engine", "src\Notify\__Libraries\StellaOps.Notify.Engine\StellaOps.Notify.Engine.csproj", "{640B22EB-F7DC-57AF-9E6E-1BDD18810064}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Cache", "Scanner\__Libraries\StellaOps.Scanner.Cache\StellaOps.Scanner.Cache.csproj", "{40092818-83F9-54F5-9333-083731DC7DB4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Models", "src\Notify\__Libraries\StellaOps.Notify.Models\StellaOps.Notify.Models.csproj", "{68B2E31B-A427-52C6-A3A6-8902A21A9D04}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.CallGraph", "Scanner\__Libraries\StellaOps.Scanner.CallGraph\StellaOps.Scanner.CallGraph.csproj", "{5D2B450D-B34A-575D-BAFB-8DFA29CDCE74}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Queue", "src\Notify\__Libraries\StellaOps.Notify.Queue\StellaOps.Notify.Queue.csproj", "{6E26EDF7-C6C4-5B4D-A8D5-E69794986F58}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Core", "Scanner\__Libraries\StellaOps.Scanner.Core\StellaOps.Scanner.Core.csproj", "{FD53E7DE-2531-5E41-9D24-93D869813695}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.InMemory", "src\Notify\__Libraries\StellaOps.Notify.Storage.InMemory\StellaOps.Notify.Storage.InMemory.csproj", "{1763B240-97A6-5710-A7A6-8A1F63311597}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Diff", "Scanner\__Libraries\StellaOps.Scanner.Diff\StellaOps.Scanner.Diff.csproj", "{166B5460-FFAB-5469-B256-147CA8671861}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.Postgres", "src\Notify\__Libraries\StellaOps.Notify.Storage.Postgres\StellaOps.Notify.Storage.Postgres.csproj", "{F23B9764-280A-5720-8B5B-B227092A24A9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit", "Scanner\__Libraries\StellaOps.Scanner.Emit\StellaOps.Scanner.Emit.csproj", "{D7EB2001-6897-501F-BF6C-27F849B95430}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{00F48869-B5D8-53AE-8E2A-5CBBE28B7D67}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.EntryTrace", "Scanner\__Libraries\StellaOps.Scanner.EntryTrace\StellaOps.Scanner.EntryTrace.csproj", "{F01FB705-B831-5A3A-91A2-476EAE8EE65B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Email", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Email\StellaOps.Notify.Connectors.Email.csproj", "{40426D69-90A0-599F-8113-BAAA98714E62}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Evidence", "Scanner\__Libraries\StellaOps.Scanner.Evidence\StellaOps.Scanner.Evidence.csproj", "{029ADACB-AADD-5FF1-A1C6-42B2542E4877}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Shared", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Shared\StellaOps.Notify.Connectors.Shared.csproj", "{41671DFA-9B15-574B-9B82-45CA2A254269}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Explainability", "Scanner\__Libraries\StellaOps.Scanner.Explainability\StellaOps.Scanner.Explainability.csproj", "{9B1B44EA-214D-5749-88D7-28EC8649B233}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Slack", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Slack\StellaOps.Notify.Connectors.Slack.csproj", "{8119F319-6F44-51B0-893E-24B214690A37}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Orchestration", "Scanner\__Libraries\StellaOps.Scanner.Orchestration\StellaOps.Scanner.Orchestration.csproj", "{18DE5026-FED1-5636-8F78-7F1B3A2AFEFB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Teams", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Teams\StellaOps.Notify.Connectors.Teams.csproj", "{8581A797-6D1A-5605-B9C6-4EB8CC349425}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofIntegration", "Scanner\__Libraries\StellaOps.Scanner.ProofIntegration\StellaOps.Scanner.ProofIntegration.csproj", "{4C4DF88D-A249-58F2-B98D-00D5E2FC33BA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Webhook", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Webhook\StellaOps.Notify.Connectors.Webhook.csproj", "{7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofSpine", "Scanner\__Libraries\StellaOps.Scanner.ProofSpine\StellaOps.Scanner.ProofSpine.csproj", "{226B12A0-1EED-5CC5-974D-E9524E924794}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F6F2323B-DD8C-53AD-AE3E-2220B928BA24}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Queue", "Scanner\__Libraries\StellaOps.Scanner.Queue\StellaOps.Scanner.Queue.csproj", "{E31AD5B9-66BC-5217-91BE-C4030ADBA7EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Email.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Email.Tests\StellaOps.Notify.Connectors.Email.Tests.csproj", "{97545321-6315-574C-94EA-C4D756A323EE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability", "Scanner\__Libraries\StellaOps.Scanner.Reachability\StellaOps.Scanner.Reachability.csproj", "{4B5D871F-9EBA-5D7C-A9EE-065E22B95894}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Slack.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Slack.Tests\StellaOps.Notify.Connectors.Slack.Tests.csproj", "{7F384D30-79DA-55EF-AA3F-5C433126B646}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ReachabilityDrift", "Scanner\__Libraries\StellaOps.Scanner.ReachabilityDrift\StellaOps.Scanner.ReachabilityDrift.csproj", "{F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Teams.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Teams.Tests\StellaOps.Notify.Connectors.Teams.Tests.csproj", "{BCD434BC-C9DE-5291-A5C8-AD32891A7401}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.SmartDiff", "Scanner\__Libraries\StellaOps.Scanner.SmartDiff\StellaOps.Scanner.SmartDiff.csproj", "{6EB80E87-172B-5A81-A0E2-932E1AC9615C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Webhook.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Webhook.Tests\StellaOps.Notify.Connectors.Webhook.Tests.csproj", "{95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage", "Scanner\__Libraries\StellaOps.Scanner.Storage\StellaOps.Scanner.Storage.csproj", "{89B055A6-8ACA-5E86-94FB-0FD369790B47}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Core.Tests", "src\Notify\__Tests\StellaOps.Notify.Core.Tests\StellaOps.Notify.Core.Tests.csproj", "{5881D3BD-529E-5092-8640-1CE0844FE0FB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Oci", "Scanner\__Libraries\StellaOps.Scanner.Storage.Oci\StellaOps.Scanner.Storage.Oci.csproj", "{43E42CDA-84FC-5BB8-B211-4D3E1492D39A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Engine.Tests", "src\Notify\__Tests\StellaOps.Notify.Engine.Tests\StellaOps.Notify.Engine.Tests.csproj", "{D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface", "Scanner\__Libraries\StellaOps.Scanner.Surface\StellaOps.Scanner.Surface.csproj", "{230D7EA8-20DC-583F-8832-63E54E42E3D2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Models.Tests", "src\Notify\__Tests\StellaOps.Notify.Models.Tests\StellaOps.Notify.Models.Tests.csproj", "{2512F361-2C0C-56B4-9D93-7DBBBF55815E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Env", "Scanner\__Libraries\StellaOps.Scanner.Surface.Env\StellaOps.Scanner.Surface.Env.csproj", "{2BC11415-1862-50AC-8CBA-0BA29C69E6C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Queue.Tests", "src\Notify\__Tests\StellaOps.Notify.Queue.Tests\StellaOps.Notify.Queue.Tests.csproj", "{78400F00-37A1-574C-8391-3CFA7E014B4D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.FS", "Scanner\__Libraries\StellaOps.Scanner.Surface.FS\StellaOps.Scanner.Surface.FS.csproj", "{AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.Postgres.Tests", "src\Notify\__Tests\StellaOps.Notify.Storage.Postgres.Tests\StellaOps.Notify.Storage.Postgres.Tests.csproj", "{75D9C1EF-60D4-51E9-A0F4-FBE6632AF791}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Secrets", "Scanner\__Libraries\StellaOps.Scanner.Surface.Secrets\StellaOps.Scanner.Surface.Secrets.csproj", "{D37B67AE-68F6-5C6D-AD35-738F8C7D5851}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.WebService.Tests", "src\Notify\__Tests\StellaOps.Notify.WebService.Tests\StellaOps.Notify.WebService.Tests.csproj", "{4FB42ADD-4BAB-5C19-BD4E-E39F95348600}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Validation", "Scanner\__Libraries\StellaOps.Scanner.Surface.Validation\StellaOps.Scanner.Surface.Validation.csproj", "{4DF1E180-AA42-5F22-9664-F87FAEAD59C1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Worker.Tests", "src\Notify\__Tests\StellaOps.Notify.Worker.Tests\StellaOps.Notify.Worker.Tests.csproj", "{7EE3111E-53B5-5EE7-99FB-230A9B4EFD50}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Triage", "Scanner\__Libraries\StellaOps.Scanner.Triage\StellaOps.Scanner.Triage.csproj", "{B8BECE74-88A9-53B0-B457-3C2CF0FCEE01}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{3461BB68-1EB2-5BD8-9FA4-3217CC1E7394}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.VulnSurfaces", "Scanner\__Libraries\StellaOps.Scanner.VulnSurfaces\StellaOps.Scanner.VulnSurfaces.csproj", "{A81F1C23-6F7B-5AF1-BC61-312CF1881CFE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.WebService", "src\Notify\StellaOps.Notify.WebService\StellaOps.Notify.WebService.csproj", "{A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Sbomer.BuildXPlugin", "Scanner\StellaOps.Scanner.Sbomer.BuildXPlugin\StellaOps.Scanner.Sbomer.BuildXPlugin.csproj", "{CF6E60E9-000E-51D4-9C67-FE84E08AF277}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{999AFB4F-C686-5BBF-8CA0-38119694DB9D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ScannerSignals.IntegrationTests", "__Tests\reachability\StellaOps.ScannerSignals.IntegrationTests\StellaOps.ScannerSignals.IntegrationTests.csproj", "{9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Worker", "src\Notify\StellaOps.Notify.Worker\StellaOps.Notify.Worker.csproj", "{A15C2434-BBA5-540A-B863-20A347A3F160}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.VulnSurfaces.Tests", "Scanner\__Libraries\StellaOps.Scanner.VulnSurfaces.Tests\StellaOps.Scanner.VulnSurfaces.Tests.csproj", "{06B9914A-7331-579B-AD4F-82B3D95B5C4E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Orchestrator", "Orchestrator", "{82E5585F-AF53-50FD-8805-E8F196A74A69}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Advisory.Tests", "Scanner\__Tests\StellaOps.Scanner.Advisory.Tests\StellaOps.Scanner.Advisory.Tests.csproj", "{E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{75227D73-DF27-5598-903B-6EF26AF83090}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Bun.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests.csproj", "{542F28D0-D20F-5571-AE65-83CEA16B299D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Core", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Core\StellaOps.Orchestrator.Core.csproj", "{A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests.csproj", "{24A017D2-7BD5-5F4C-8B67-58B56129C4CB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Infrastructure", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Infrastructure\StellaOps.Orchestrator.Infrastructure.csproj", "{F8564409-54F7-59AA-8E2A-E9022839ED4F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.DotNet.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.DotNet.Tests\StellaOps.Scanner.Analyzers.Lang.DotNet.Tests.csproj", "{2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{AC257696-D6A2-51B5-A07B-195CC24F374C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Go.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests.csproj", "{4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Schemas", "src\__Libraries\StellaOps.Orchestrator.Schemas\StellaOps.Orchestrator.Schemas.csproj", "{E6887A02-800D-5F8B-8623-C9C052F6A690}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Java.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests.csproj", "{BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{FC7268F9-BC0E-5757-8509-3E7AC5DB26C6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests\StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests.csproj", "{48C8ED44-9E61-5C72-B912-987F6B4D3D4F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Tests", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Tests\StellaOps.Orchestrator.Tests.csproj", "{721DD473-5A17-5E0D-B0CA-B2F91A3333EB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests.csproj", "{C2D640E1-47EF-596C-A258-AE5E93A7578C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CDE07C59-073B-55DD-B462-67D0DCD6E4C8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests.csproj", "{D77582C2-0CEF-5ED8-8366-5A28492D3C88}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.WebService", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.WebService\StellaOps.Orchestrator.WebService.csproj", "{AA0D3C06-0E6C-5671-BBEF-C5594F869378}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Python.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests.csproj", "{CC4D16A5-AB4A-5877-B0E5-25928D627933}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{E11558C3-4D2D-5F2D-A9F0-16EE01291D2B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Ruby.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests.csproj", "{C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Worker", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Worker\StellaOps.Orchestrator.Worker.csproj", "{6584A0EB-82AE-59E7-8023-3261AF88217D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\StellaOps.Scanner.Analyzers.Lang.Tests.csproj", "{0D8AAAB2-669C-594E-8782-B105F7A3D076}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Policy", "Policy", "{9F9EC6D6-3A07-5F93-90E8-EA77393FEA02}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Native.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.Native.Tests\StellaOps.Scanner.Analyzers.Native.Tests.csproj", "{24A77816-86CF-5958-8005-511C82A5DE13}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{B03718E1-8606-5503-B4AC-DB966B39847B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Homebrew.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Homebrew.Tests\StellaOps.Scanner.Analyzers.OS.Homebrew.Tests.csproj", "{265D18F4-7D43-5989-BC89-06A0BCAA974F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine", "src\Policy\StellaOps.Policy.Engine\StellaOps.Policy.Engine.csproj", "{8010A35A-7CDE-5521-9D64-4C97F0DA3E93}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests\StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests.csproj", "{2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Gateway", "src\Policy\StellaOps.Policy.Gateway\StellaOps.Policy.Gateway.csproj", "{E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests\StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests.csproj", "{CF1DD579-8832-5D10-A776-BEA22477C9E9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Registry", "src\Policy\StellaOps.Policy.Registry\StellaOps.Policy.Registry.csproj", "{2135DC08-5B28-591C-A43B-445D7BB98303}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Tests\StellaOps.Scanner.Analyzers.OS.Tests.csproj", "{9DD2C1F3-D4B6-530E-907B-BFA80085311C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.RiskProfile", "src\Policy\StellaOps.Policy.RiskProfile\StellaOps.Policy.RiskProfile.csproj", "{E9610063-C8DB-589B-A817-CC06CE65ACC4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests.csproj", "{7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Scoring", "src\Policy\StellaOps.Policy.Scoring\StellaOps.Policy.Scoring.csproj", "{B81E7A3D-0F57-59A9-9EFF-E940745C9B90}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests\StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests.csproj", "{D2F4B045-45B9-573C-8EA7-F639FADF6518}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyDsl", "src\Policy\StellaOps.PolicyDsl\StellaOps.PolicyDsl.csproj", "{41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests", "Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests.csproj", "{FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{11468ECE-5AA1-5549-90C3-16833B9E9AFE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmarks.Tests", "Scanner\__Tests\StellaOps.Scanner.Benchmarks.Tests\StellaOps.Scanner.Benchmarks.Tests.csproj", "{891EDEAF-E530-5CB1-B459-E526E563AF44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyAuthoritySignals.Contracts", "src\__Libraries\StellaOps.PolicyAuthoritySignals.Contracts\StellaOps.PolicyAuthoritySignals.Contracts.csproj", "{BBA41FC3-A097-5751-9830-B028CB357E58}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Cache.Tests", "Scanner\__Tests\StellaOps.Scanner.Cache.Tests\StellaOps.Scanner.Cache.Tests.csproj", "{7D80E495-7DE6-5093-AC05-650991082D96}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy", "src\Policy\__Libraries\StellaOps.Policy\StellaOps.Policy.csproj", "{F6AE6B49-960C-555C-90BF-38A2E03EF27A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.CallGraph.Tests", "Scanner\__Tests\StellaOps.Scanner.CallGraph.Tests\StellaOps.Scanner.CallGraph.Tests.csproj", "{0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.AuthSignals", "src\Policy\__Libraries\StellaOps.Policy.AuthSignals\StellaOps.Policy.AuthSignals.csproj", "{DEA58CAE-08AD-5376-BE6F-883B85760DD7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Core.Tests", "Scanner\__Tests\StellaOps.Scanner.Core.Tests\StellaOps.Scanner.Core.Tests.csproj", "{434EB740-8EB9-56AA-B7C7-779322245497}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Exceptions", "src\Policy\__Libraries\StellaOps.Policy.Exceptions\StellaOps.Policy.Exceptions.csproj", "{4B27536C-E23B-5808-ABAE-BC93F0F7B109}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Diff.Tests", "Scanner\__Tests\StellaOps.Scanner.Diff.Tests\StellaOps.Scanner.Diff.Tests.csproj", "{BD4C1CC3-8493-5647-BDC9-9A9721595549}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Storage.Postgres", "src\Policy\__Libraries\StellaOps.Policy.Storage.Postgres\StellaOps.Policy.Storage.Postgres.csproj", "{4E87FA32-5495-54BA-B5FC-383F20ABA094}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit.Lineage.Tests", "Scanner\__Tests\StellaOps.Scanner.Emit.Lineage.Tests\StellaOps.Scanner.Emit.Lineage.Tests.csproj", "{F5D74715-01BD-530A-9234-2C8E8327CA7C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Unknowns", "src\Policy\__Libraries\StellaOps.Policy.Unknowns\StellaOps.Policy.Unknowns.csproj", "{4EF8E25B-4A19-5D64-8F95-40D86B51E453}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit.Tests", "Scanner\__Tests\StellaOps.Scanner.Emit.Tests\StellaOps.Scanner.Emit.Tests.csproj", "{5DB2DAD4-749D-5958-85A5-D416773EC7AD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{AFFB37C8-8080-57A0-A0F4-49A20FEC1694}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.EntryTrace.Tests", "Scanner\__Tests\StellaOps.Scanner.EntryTrace.Tests\StellaOps.Scanner.EntryTrace.Tests.csproj", "{2C644E8C-5731-566A-9208-25FF724E88CF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine.Contract.Tests", "src\Policy\__Tests\StellaOps.Policy.Engine.Contract.Tests\StellaOps.Policy.Engine.Contract.Tests.csproj", "{9ECD2194-4E14-5CCD-9AA0-5279B464EF4A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Evidence.Tests", "Scanner\__Tests\StellaOps.Scanner.Evidence.Tests\StellaOps.Scanner.Evidence.Tests.csproj", "{FBAA3D74-4A5F-5F10-877F-C4AEDDD69656}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine.Tests", "src\Policy\__Tests\StellaOps.Policy.Engine.Tests\StellaOps.Policy.Engine.Tests.csproj", "{B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Explainability.Tests", "Scanner\__Tests\StellaOps.Scanner.Explainability.Tests\StellaOps.Scanner.Explainability.Tests.csproj", "{D4DC4627-27B2-5162-BF64-821B7AD8837C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Exceptions.Tests", "src\Policy\__Tests\StellaOps.Policy.Exceptions.Tests\StellaOps.Policy.Exceptions.Tests.csproj", "{2EF64916-E58F-5155-8A3D-735E7A019BDF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Integration.Tests", "Scanner\__Tests\StellaOps.Scanner.Integration.Tests\StellaOps.Scanner.Integration.Tests.csproj", "{38C61566-48F9-5D8E-9FC1-A1E81E71E5E7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Gateway.Tests", "src\Policy\__Tests\StellaOps.Policy.Gateway.Tests\StellaOps.Policy.Gateway.Tests.csproj", "{9E95BC40-F0B0-5362-9694-5013FAFE83C5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofSpine.Tests", "Scanner\__Tests\StellaOps.Scanner.ProofSpine.Tests\StellaOps.Scanner.ProofSpine.Tests.csproj", "{6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Pack.Tests", "src\Policy\__Tests\StellaOps.Policy.Pack.Tests\StellaOps.Policy.Pack.Tests.csproj", "{4767D489-E3AF-5C99-825F-6C90CE550264}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Queue.Tests", "Scanner\__Tests\StellaOps.Scanner.Queue.Tests\StellaOps.Scanner.Queue.Tests.csproj", "{D9F26498-410D-5617-B810-BC58D172184D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.RiskProfile.Tests", "src\Policy\__Tests\StellaOps.Policy.RiskProfile.Tests\StellaOps.Policy.RiskProfile.Tests.csproj", "{0EFA741A-DAB8-5C34-BCF6-86000CC31530}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability.Stack.Tests", "Scanner\__Tests\StellaOps.Scanner.Reachability.Stack.Tests\StellaOps.Scanner.Reachability.Stack.Tests.csproj", "{6140569D-4784-53CE-98A2-54D8BD6D1745}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Scoring.Tests", "src\Policy\__Tests\StellaOps.Policy.Scoring.Tests\StellaOps.Policy.Scoring.Tests.csproj", "{A4790683-9F0A-5B2A-806F-797619E2A98A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability.Tests", "Scanner\__Tests\StellaOps.Scanner.Reachability.Tests\StellaOps.Scanner.Reachability.Tests.csproj", "{50274ADF-643D-5FEA-831C-2CB3DD2C6D30}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Storage.Postgres.Tests", "src\Policy\__Tests\StellaOps.Policy.Storage.Postgres.Tests\StellaOps.Policy.Storage.Postgres.Tests.csproj", "{1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ReachabilityDrift.Tests", "Scanner\__Tests\StellaOps.Scanner.ReachabilityDrift.Tests\StellaOps.Scanner.ReachabilityDrift.Tests.csproj", "{D60176B5-3B87-504D-BCAC-067BD9954A8F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Tests", "src\Policy\__Tests\StellaOps.Policy.Tests\StellaOps.Policy.Tests.csproj", "{3B765847-031F-5291-AEB9-E8BB59EF1B53}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Sbomer.BuildXPlugin.Tests", "Scanner\__Tests\StellaOps.Scanner.Sbomer.BuildXPlugin.Tests\StellaOps.Scanner.Sbomer.BuildXPlugin.Tests.csproj", "{3F743B8C-53C6-5520-B4AB-52C67179DD73}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Unknowns.Tests", "src\Policy\__Tests\StellaOps.Policy.Unknowns.Tests\StellaOps.Policy.Unknowns.Tests.csproj", "{F96E3D04-4D69-575F-9347-8AC47337D471}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.SmartDiff.Tests", "Scanner\__Tests\StellaOps.Scanner.SmartDiff.Tests\StellaOps.Scanner.SmartDiff.Tests.csproj", "{BD34A481-9816-51A7-BA6B-7272465F68C4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyDsl.Tests", "src\Policy\__Tests\StellaOps.PolicyDsl.Tests\StellaOps.PolicyDsl.Tests.csproj", "{04A2ACE6-20E8-5707-87BD-F024FAD7DED0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Oci.Tests", "Scanner\__Tests\StellaOps.Scanner.Storage.Oci.Tests\StellaOps.Scanner.Storage.Oci.Tests.csproj", "{EAA4DB81-CBAA-573C-9C40-19F9551BE98B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Replay", "Replay", "{2568E093-797A-5F9B-A22F-02FF7596A39C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Tests", "Scanner\__Tests\StellaOps.Scanner.Storage.Tests\StellaOps.Scanner.Storage.Tests.csproj", "{879D5965-6D83-529C-A2F7-41E85045A7F0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Env.Tests", "Scanner\__Tests\StellaOps.Scanner.Surface.Env.Tests\StellaOps.Scanner.Surface.Env.Tests.csproj", "{45E6A177-140E-5C2C-AAC6-A2D662BEA5BA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay", "src\__Libraries\StellaOps.Replay\StellaOps.Replay.csproj", "{55C23781-1A56-59FF-9AF3-4BA07A0992CC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.FS.Tests", "Scanner\__Tests\StellaOps.Scanner.Surface.FS.Tests\StellaOps.Scanner.Surface.FS.Tests.csproj", "{23CE30EB-406F-573D-BF3D-4281A6FE406F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core", "src\__Libraries\StellaOps.Replay.Core\StellaOps.Replay.Core.csproj", "{9C2C091A-1607-5418-B5A5-20A86652835B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Secrets.Tests", "Scanner\__Tests\StellaOps.Scanner.Surface.Secrets.Tests\StellaOps.Scanner.Surface.Secrets.Tests.csproj", "{FA284264-B63E-5DC4-B2A8-A8D347A554D1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{CFB5CB09-1260-59F2-8B88-9725F2EDF976}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Tests", "Scanner\__Tests\StellaOps.Scanner.Surface.Tests\StellaOps.Scanner.Surface.Tests.csproj", "{EAD55F0E-0895-5BE5-8273-216780F99C1B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Libraries\__Tests\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{58C44599-F7B5-5911-8B0B-66C4FCB027A2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Validation.Tests", "Scanner\__Tests\StellaOps.Scanner.Surface.Validation.Tests\StellaOps.Scanner.Surface.Validation.Tests.csproj", "{6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Tests", "src\__Libraries\__Tests\StellaOps.Replay.Tests\StellaOps.Replay.Tests.csproj", "{FA7943CD-23FC-58EE-BBFE-965758D362C6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Triage.Tests", "Scanner\__Tests\StellaOps.Scanner.Triage.Tests\StellaOps.Scanner.Triage.Tests.csproj", "{EF443847-D7D0-5457-85D8-4382BF34931F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Libraries\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{211A70CE-8B98-55B1-9D48-EADD5F34C513}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.WebService.Tests", "Scanner\__Tests\StellaOps.Scanner.WebService.Tests\StellaOps.Scanner.WebService.Tests.csproj", "{C2C3712D-B2E1-5F74-A3F9-0D912381A2CF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Tests\reachability\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{4144AED2-D212-5A1B-9849-97F97A8760E3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Worker.Tests", "Scanner\__Tests\StellaOps.Scanner.Worker.Tests\StellaOps.Scanner.Worker.Tests.csproj", "{F28F85B6-F4FD-5785-AF89-58F8159621E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Tests\Replay\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{77ABEF57-B941-5243-A695-AA8B499FE91F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.WebService", "Scanner\StellaOps.Scanner.WebService\StellaOps.Scanner.WebService.csproj", "{563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{AFB1DDA6-465A-5BFA-8794-07FCB8B73B2B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Worker", "Scanner\StellaOps.Scanner.Worker\StellaOps.Scanner.Worker.csproj", "{8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.WebService", "src\Replay\StellaOps.Replay.WebService\StellaOps.Replay.WebService.csproj", "{C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scheduler.Backfill", "Scheduler\Tools\Scheduler.Backfill\Scheduler.Backfill.csproj", "{D8858828-8495-5CBB-A7BB-97C058811A13}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SbomService", "SbomService", "{1EB7F9FA-F752-561D-AEAC-2E663F7F0C53}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.ImpactIndex", "Scheduler\__Libraries\StellaOps.Scheduler.ImpactIndex\StellaOps.Scheduler.ImpactIndex.csproj", "{671D8C13-26F5-52C1-80F1-EFB556E12B46}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Models", "Scheduler\__Libraries\StellaOps.Scheduler.Models\StellaOps.Scheduler.Models.csproj", "{335A63A0-01E4-5230-8741-5AE90F371B82}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService", "src\SbomService\StellaOps.SbomService\StellaOps.SbomService.csproj", "{0661F0EE-F6A1-5305-86BD-42849137BDBF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Queue", "Scheduler\__Libraries\StellaOps.Scheduler.Queue\StellaOps.Scheduler.Queue.csproj", "{79481E86-D2CA-5472-8EDD-D0219F5932AC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Storage.Postgres", "src\SbomService\StellaOps.SbomService.Storage.Postgres\StellaOps.SbomService.Storage.Postgres.csproj", "{A2D930E0-FCEC-5984-89FA-1B6D2046C7A7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Storage.Postgres", "Scheduler\__Libraries\StellaOps.Scheduler.Storage.Postgres\StellaOps.Scheduler.Storage.Postgres.csproj", "{69F7F8D4-6E7E-5EAA-B36A-273B223B3E30}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{BC5D3395-B74D-593F-82D4-6BA4D40F3A69}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker", "Scheduler\__Libraries\StellaOps.Scheduler.Worker\StellaOps.Scheduler.Worker.csproj", "{A649555C-AAE1-59A8-A7BA-C118366386DD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Storage.Postgres.Tests", "src\SbomService\StellaOps.SbomService.Storage.Postgres.Tests\StellaOps.SbomService.Storage.Postgres.Tests.csproj", "{FC7A23D5-6A5F-5274-B360-95393EAB244B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Backfill.Tests", "Scheduler\__Tests\StellaOps.Scheduler.Backfill.Tests\StellaOps.Scheduler.Backfill.Tests.csproj", "{22C216D9-2A03-5C40-9A18-E30C6FDF4D48}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Tests", "src\SbomService\StellaOps.SbomService.Tests\StellaOps.SbomService.Tests.csproj", "{26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.ImpactIndex.Tests", "Scheduler\__Tests\StellaOps.Scheduler.ImpactIndex.Tests\StellaOps.Scheduler.ImpactIndex.Tests.csproj", "{6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scanner", "Scanner", "{BBB6D30E-E84E-5C72-B258-8B71B4C0C37E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Models.Tests", "Scheduler\__Tests\StellaOps.Scheduler.Models.Tests\StellaOps.Scheduler.Models.Tests.csproj", "{91F25B73-0A0C-57B6-89C2-B13E15F1B281}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{9A4132EA-BE40-53D0-B17B-7EF2995867F0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Queue.Tests", "Scheduler\__Tests\StellaOps.Scheduler.Queue.Tests\StellaOps.Scheduler.Queue.Tests.csproj", "{F66F5DFE-3B8F-5B43-89DE-4A15B994290B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Native", "src\Scanner\StellaOps.Scanner.Analyzers.Native\StellaOps.Scanner.Analyzers.Native.csproj", "{12428388-51C9-5FEA-9EB5-ECF205FD1C90}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Storage.Postgres.Tests", "Scheduler\__Tests\StellaOps.Scheduler.Storage.Postgres.Tests\StellaOps.Scheduler.Storage.Postgres.Tests.csproj", "{C165A810-99AA-5C2E-99D9-950C4ABD5C63}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.WebService.Tests", "Scheduler\__Tests\StellaOps.Scheduler.WebService.Tests\StellaOps.Scheduler.WebService.Tests.csproj", "{F2436D73-0E94-50F0-9C02-28CE3910EB21}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks", "src\Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks.csproj", "{F208351E-5372-53EF-ABBF-C349C32B33E4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker.Tests", "Scheduler\__Tests\StellaOps.Scheduler.Worker.Tests\StellaOps.Scheduler.Worker.Tests.csproj", "{1D8E9087-584B-5341-BFAA-EEB046E530AF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks", "src\Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks.csproj", "{C061A376-5BF3-58B4-B301-28ABC6DE0A3B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.WebService", "Scheduler\StellaOps.Scheduler.WebService\StellaOps.Scheduler.WebService.csproj", "{0D72E841-4F53-5ED8-864B-53AA0DFA5978}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks", "src\Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks.csproj", "{BFCBC834-E9E7-5937-AC74-596459428D2C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker.Host", "Scheduler\StellaOps.Scheduler.Worker.Host\StellaOps.Scheduler.Worker.Host.csproj", "{E5B88985-0693-51FC-8AB9-7C3728722618}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmark", "src\Scanner\__Libraries\StellaOps.Scanner.Benchmark\StellaOps.Scanner.Benchmark.csproj", "{A9660377-E43A-5514-94B8-813B40D34E21}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals", "Signals\StellaOps.Signals\StellaOps.Signals.csproj", "{78353588-38CA-5CCC-86EB-1513FB86FB4B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmarks", "src\Scanner\__Libraries\StellaOps.Scanner.Benchmarks\StellaOps.Scanner.Benchmarks.csproj", "{5A8FFD16-30ED-55A8-A69E-37877E540442}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Scheduler", "Signals\StellaOps.Signals.Scheduler\StellaOps.Signals.Scheduler.csproj", "{8A43DF4F-CBD4-5481-A113-84EBE37CA375}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{26F61757-EF18-5045-947E-EA076772668A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Storage.Postgres", "Signals\StellaOps.Signals.Storage.Postgres\StellaOps.Signals.Storage.Postgres.csproj", "{37A03641-FA63-5896-B432-EF26DC11F6CB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Epss.Perf", "src\Scanner\__Benchmarks\StellaOps.Scanner.Storage.Epss.Perf\StellaOps.Scanner.Storage.Epss.Perf.csproj", "{8C747A2A-F2D2-57C3-9777-C32EFB6BA17A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Contracts", "__Libraries\StellaOps.Signals.Contracts\StellaOps.Signals.Contracts.csproj", "{16C1069D-EBC9-53F4-909E-6EAF374E7E8A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{20646475-6101-5739-AEAD-D3CB508D382C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Reachability.Tests", "__Tests\reachability\StellaOps.Signals.Reachability.Tests\StellaOps.Signals.Reachability.Tests.csproj", "{13D2C70F-86E5-52EB-9A53-F266E471A5DC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Advisory", "src\Scanner\__Libraries\StellaOps.Scanner.Advisory\StellaOps.Scanner.Advisory.csproj", "{03D045E7-F7AB-59EE-B53D-6B890AF278FB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Storage.Postgres.Tests", "Signals\StellaOps.Signals.Storage.Postgres.Tests\StellaOps.Signals.Storage.Postgres.Tests.csproj", "{05430EEB-6E1F-5396-A521-EE455630F730}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang\StellaOps.Scanner.Analyzers.Lang.csproj", "{174D2124-12A2-5620-964F-6D2737DA5DEA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Core", "Signer\StellaOps.Signer\StellaOps.Signer.Core\StellaOps.Signer.Core.csproj", "{13AAE009-19FD-5093-B154-6FFC4C34B72C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Bun", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Bun\StellaOps.Scanner.Analyzers.Lang.Bun.csproj", "{9A6818AB-29A5-57B5-9958-B5F93B421964}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Infrastructure", "Signer\StellaOps.Signer\StellaOps.Signer.Infrastructure\StellaOps.Signer.Infrastructure.csproj", "{056D1311-0882-5239-9D21-60FC186AB7F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Deno\StellaOps.Scanner.Analyzers.Lang.Deno.csproj", "{467C42CD-ED69-5E21-BFF3-F35BAE24E9AF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Keyless", "Signer\__Libraries\StellaOps.Signer.Keyless\StellaOps.Signer.Keyless.csproj", "{D99F972A-76D0-57CF-908D-FB28750FE989}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.DotNet", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.DotNet\StellaOps.Scanner.Analyzers.Lang.DotNet.csproj", "{03262415-2C11-5B62-84A7-33FC321D43AF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.KeyManagement", "Signer\__Libraries\StellaOps.Signer.KeyManagement\StellaOps.Signer.KeyManagement.csproj", "{66D435A0-4D37-50EA-AC48-F557BD794E8D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Go", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Go\StellaOps.Scanner.Analyzers.Lang.Go.csproj", "{75991E1E-7D74-53B5-927C-D639337202C4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Tests", "Signer\StellaOps.Signer\StellaOps.Signer.Tests\StellaOps.Signer.Tests.csproj", "{BA153C94-5786-5DFB-BF46-5456F314640D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Java", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Java\StellaOps.Scanner.Analyzers.Lang.Java.csproj", "{D24D7552-BE3F-58CD-A458-9BFA2403C696}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.WebService", "Signer\StellaOps.Signer\StellaOps.Signer.WebService\StellaOps.Signer.WebService.csproj", "{59194DA8-0065-5FA5-9E4C-9F1D1A141D0D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Node\StellaOps.Scanner.Analyzers.Lang.Node.csproj", "{2BC14382-5C69-528B-9FCE-488CE3F8143E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Client", "TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Client\StellaOps.TaskRunner.Client.csproj", "{174F6B92-7B4B-5364-9FFA-B0922315E394}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Php\StellaOps.Scanner.Analyzers.Lang.Php.csproj", "{E7802557-EEB2-53EB-98C3-62A1E0DCC4BC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Core", "TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Core\StellaOps.TaskRunner.Core.csproj", "{3D5B082E-6F16-5078-B163-57F545C6441D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Python", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Python\StellaOps.Scanner.Analyzers.Lang.Python.csproj", "{FBF45F4E-D545-5897-8A02-428C51A3C4A0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Infrastructure", "TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Infrastructure\StellaOps.TaskRunner.Infrastructure.csproj", "{D52682FC-295E-53A2-B101-0BC60D53BEF1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Ruby", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Ruby\StellaOps.Scanner.Analyzers.Lang.Ruby.csproj", "{D5C3A0AF-A331-5C5F-AC21-3982A3BD3066}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Storage.Postgres", "TaskRunner\StellaOps.TaskRunner.Storage.Postgres\StellaOps.TaskRunner.Storage.Postgres.csproj", "{A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Rust", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Rust\StellaOps.Scanner.Analyzers.Lang.Rust.csproj", "{69A56760-817A-5A9C-A52E-764FB0194071}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Tests", "TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Tests\StellaOps.TaskRunner.Tests.csproj", "{27C02428-144F-598E-A2B3-D74AB3A60BC2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Native", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Native\StellaOps.Scanner.Analyzers.Native.csproj", "{4A591A91-072D-5332-84B5-40C52406510D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Storage.Postgres.Tests", "TaskRunner\StellaOps.TaskRunner.Storage.Postgres.Tests\StellaOps.TaskRunner.Storage.Postgres.Tests.csproj", "{099EB392-DF89-5A9E-B1CC-7B60A16C61B5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS\StellaOps.Scanner.Analyzers.OS.csproj", "{CF956202-62CB-5340-BED9-0AB42E99E48D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.WebService", "TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.WebService\StellaOps.TaskRunner.WebService.csproj", "{B4897CA0-8501-586C-AFA3-502ECDCB58FD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Apk", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Apk\StellaOps.Scanner.Analyzers.OS.Apk.csproj", "{441BAC38-A865-559B-9310-02CB5D417209}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Worker", "TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Worker\StellaOps.TaskRunner.Worker.csproj", "{88F0AAA9-7AB4-5B38-9132-675E0CF0E032}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Dpkg", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Dpkg\StellaOps.Scanner.Analyzers.OS.Dpkg.csproj", "{BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Analyzers", "Telemetry\StellaOps.Telemetry.Analyzers\StellaOps.Telemetry.Analyzers.csproj", "{509995C7-1637-5E0A-8F11-0F5E54B77209}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Homebrew", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Homebrew\StellaOps.Scanner.Analyzers.OS.Homebrew.csproj", "{36964679-F5CA-57C8-A7C7-98FF38998644}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Core", "Telemetry\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core.csproj", "{DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.MacOsBundle", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.MacOsBundle\StellaOps.Scanner.Analyzers.OS.MacOsBundle.csproj", "{DE8969D1-E305-54AD-A3B7-8AF897C19503}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Analyzers.Tests", "Telemetry\StellaOps.Telemetry.Analyzers\StellaOps.Telemetry.Analyzers.Tests\StellaOps.Telemetry.Analyzers.Tests.csproj", "{5AA07819-E820-54D5-8A68-69F791EDC4E4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Pkgutil", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Pkgutil\StellaOps.Scanner.Analyzers.OS.Pkgutil.csproj", "{FF3858C2-487C-5056-9BE1-753096E3828C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Core.Tests", "Telemetry\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core.Tests\StellaOps.Telemetry.Core.Tests.csproj", "{BCB84E5F-2F49-53C9-8E91-EAA790F511B8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Rpm", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Rpm\StellaOps.Scanner.Analyzers.OS.Rpm.csproj", "{284574B8-F4BF-5711-81F6-43A277F6E374}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres.Testing", "__Tests\__Libraries\StellaOps.Infrastructure.Postgres.Testing\StellaOps.Infrastructure.Postgres.Testing.csproj", "{B7CA7A16-AAFB-5A8F-B598-0284ED7DF744}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.csproj", "{4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Testing", "__Tests\__Libraries\StellaOps.Messaging.Testing\StellaOps.Messaging.Testing.csproj", "{2E7B8D21-CAD8-5844-B59F-7A487E6594DD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Msi", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.Msi\StellaOps.Scanner.Analyzers.OS.Windows.Msi.csproj", "{C981E0FC-E546-5B95-8995-2296C4BCCC11}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Testing", "__Tests\__Libraries\StellaOps.Router.Testing\StellaOps.Router.Testing.csproj", "{F30EF61D-A7FC-5689-A06F-42A152CF7393}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.WinSxS", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.csproj", "{B7303B10-C5BF-5710-9FB6-FCE79C270488}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.AirGap", "__Tests\__Libraries\StellaOps.Testing.AirGap\StellaOps.Testing.AirGap.csproj", "{96610609-85C7-5F09-B765-A86463A8DBDE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Cache", "src\Scanner\__Libraries\StellaOps.Scanner.Cache\StellaOps.Scanner.Cache.csproj", "{40092818-83F9-54F5-9333-083731DC7DB4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism", "__Tests\__Libraries\StellaOps.Testing.Determinism\StellaOps.Testing.Determinism.csproj", "{E5A69860-1704-5FB1-BFA3-5872182D4829}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.CallGraph", "src\Scanner\__Libraries\StellaOps.Scanner.CallGraph\StellaOps.Scanner.CallGraph.csproj", "{5D2B450D-B34A-575D-BAFB-8DFA29CDCE74}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism.Properties", "__Tests\__Libraries\StellaOps.Testing.Determinism.Properties\StellaOps.Testing.Determinism.Properties.csproj", "{1F5FFF7C-AF58-5C3E-9981-EE5E978426E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Core", "src\Scanner\__Libraries\StellaOps.Scanner.Core\StellaOps.Scanner.Core.csproj", "{FD53E7DE-2531-5E41-9D24-93D869813695}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Manifests", "__Tests\__Libraries\StellaOps.Testing.Manifests\StellaOps.Testing.Manifests.csproj", "{51652C28-0583-5556-A941-D16D99F97B82}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Diff", "src\Scanner\__Libraries\StellaOps.Scanner.Diff\StellaOps.Scanner.Diff.csproj", "{166B5460-FFAB-5469-B256-147CA8671861}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Architecture.Tests", "__Tests\architecture\StellaOps.Architecture.Tests\StellaOps.Architecture.Tests.csproj", "{068138BD-177D-5359-B0DD-A369BB607E95}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit", "src\Scanner\__Libraries\StellaOps.Scanner.Emit\StellaOps.Scanner.Emit.csproj", "{D7EB2001-6897-501F-BF6C-27F849B95430}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Chaos.Router.Tests", "__Tests\chaos\StellaOps.Chaos.Router.Tests\StellaOps.Chaos.Router.Tests.csproj", "{91306E2D-A310-50D1-B64F-47A158D42085}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.EntryTrace", "src\Scanner\__Libraries\StellaOps.Scanner.EntryTrace\StellaOps.Scanner.EntryTrace.csproj", "{F01FB705-B831-5A3A-91A2-476EAE8EE65B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.AirGap", "__Tests\Integration\StellaOps.Integration.AirGap\StellaOps.Integration.AirGap.csproj", "{F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Evidence", "src\Scanner\__Libraries\StellaOps.Scanner.Evidence\StellaOps.Scanner.Evidence.csproj", "{029ADACB-AADD-5FF1-A1C6-42B2542E4877}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Determinism", "__Tests\Integration\StellaOps.Integration.Determinism\StellaOps.Integration.Determinism.csproj", "{59234A8C-D502-5965-AAFC-19739C833885}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Explainability", "src\Scanner\__Libraries\StellaOps.Scanner.Explainability\StellaOps.Scanner.Explainability.csproj", "{9B1B44EA-214D-5749-88D7-28EC8649B233}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.E2E", "__Tests\Integration\StellaOps.Integration.E2E\StellaOps.Integration.E2E.csproj", "{2CE72B3D-4D13-500A-A44D-76029069C773}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Orchestration", "src\Scanner\__Libraries\StellaOps.Scanner.Orchestration\StellaOps.Scanner.Orchestration.csproj", "{18DE5026-FED1-5636-8F78-7F1B3A2AFEFB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Performance", "__Tests\Integration\StellaOps.Integration.Performance\StellaOps.Integration.Performance.csproj", "{422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofIntegration", "src\Scanner\__Libraries\StellaOps.Scanner.ProofIntegration\StellaOps.Scanner.ProofIntegration.csproj", "{4C4DF88D-A249-58F2-B98D-00D5E2FC33BA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Platform", "__Tests\Integration\StellaOps.Integration.Platform\StellaOps.Integration.Platform.csproj", "{8F7505CD-473C-590A-8851-FA762AB5E214}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofSpine", "src\Scanner\__Libraries\StellaOps.Scanner.ProofSpine\StellaOps.Scanner.ProofSpine.csproj", "{226B12A0-1EED-5CC5-974D-E9524E924794}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.ProofChain", "__Tests\Integration\StellaOps.Integration.ProofChain\StellaOps.Integration.ProofChain.csproj", "{B2ABA214-83FB-5E9E-8AD4-2D54E579310A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Queue", "src\Scanner\__Libraries\StellaOps.Scanner.Queue\StellaOps.Scanner.Queue.csproj", "{E31AD5B9-66BC-5217-91BE-C4030ADBA7EF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Reachability", "__Tests\Integration\StellaOps.Integration.Reachability\StellaOps.Integration.Reachability.csproj", "{3EC6A343-75E8-511F-A767-8FAB9EC79A62}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability", "src\Scanner\__Libraries\StellaOps.Scanner.Reachability\StellaOps.Scanner.Reachability.csproj", "{4B5D871F-9EBA-5D7C-A9EE-065E22B95894}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Unknowns", "__Tests\Integration\StellaOps.Integration.Unknowns\StellaOps.Integration.Unknowns.csproj", "{37DF1BF6-AD9C-59A2-8F10-512ABE804ED3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ReachabilityDrift", "src\Scanner\__Libraries\StellaOps.Scanner.ReachabilityDrift\StellaOps.Scanner.ReachabilityDrift.csproj", "{F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Interop.Tests", "__Tests\interop\StellaOps.Interop.Tests\StellaOps.Interop.Tests.csproj", "{A93B89A8-E39D-560B-82E8-96EAEA545A28}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.SmartDiff", "src\Scanner\__Libraries\StellaOps.Scanner.SmartDiff\StellaOps.Scanner.SmartDiff.csproj", "{6EB80E87-172B-5A81-A0E2-932E1AC9615C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Offline.E2E.Tests", "__Tests\offline\StellaOps.Offline.E2E.Tests\StellaOps.Offline.E2E.Tests.csproj", "{DF5A6010-D88B-5327-8E1A-74F2A716D340}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage", "src\Scanner\__Libraries\StellaOps.Scanner.Storage\StellaOps.Scanner.Storage.csproj", "{89B055A6-8ACA-5E86-94FB-0FD369790B47}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Parity.Tests", "__Tests\parity\StellaOps.Parity.Tests\StellaOps.Parity.Tests.csproj", "{C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Oci", "src\Scanner\__Libraries\StellaOps.Scanner.Storage.Oci\StellaOps.Scanner.Storage.Oci.csproj", "{43E42CDA-84FC-5BB8-B211-4D3E1492D39A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Reachability.FixtureTests", "__Tests\reachability\StellaOps.Reachability.FixtureTests\StellaOps.Reachability.FixtureTests.csproj", "{53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface", "src\Scanner\__Libraries\StellaOps.Scanner.Surface\StellaOps.Scanner.Surface.csproj", "{230D7EA8-20DC-583F-8832-63E54E42E3D2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Security.Tests", "__Tests\security\StellaOps.Security.Tests\StellaOps.Security.Tests.csproj", "{96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Env", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.Env\StellaOps.Scanner.Surface.Env.csproj", "{2BC11415-1862-50AC-8CBA-0BA29C69E6C6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Bundle.Tests", "__Tests\StellaOps.Evidence.Bundle.Tests\StellaOps.Evidence.Bundle.Tests.csproj", "{2063D4CC-6C01-5693-B0B9-1376FB928E43}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.FS", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.FS\StellaOps.Scanner.Surface.FS.csproj", "{AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Core", "VexHub\__Libraries\StellaOps.VexHub.Core\StellaOps.VexHub.Core.csproj", "{3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Secrets", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.Secrets\StellaOps.Scanner.Surface.Secrets.csproj", "{D37B67AE-68F6-5C6D-AD35-738F8C7D5851}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Storage.Postgres", "VexHub\__Libraries\StellaOps.VexHub.Storage.Postgres\StellaOps.VexHub.Storage.Postgres.csproj", "{BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Validation", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.Validation\StellaOps.Scanner.Surface.Validation.csproj", "{4DF1E180-AA42-5F22-9664-F87FAEAD59C1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Core.Tests", "VexHub\__Tests\StellaOps.VexHub.Core.Tests\StellaOps.VexHub.Core.Tests.csproj", "{3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Triage", "src\Scanner\__Libraries\StellaOps.Scanner.Triage\StellaOps.Scanner.Triage.csproj", "{B8BECE74-88A9-53B0-B457-3C2CF0FCEE01}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Storage.Postgres.Tests", "VexHub\__Tests\StellaOps.VexHub.Storage.Postgres.Tests\StellaOps.VexHub.Storage.Postgres.Tests.csproj", "{5682D20E-74D9-50D6-B400-8EE39D2ADF42}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.VulnSurfaces", "src\Scanner\__Libraries\StellaOps.Scanner.VulnSurfaces\StellaOps.Scanner.VulnSurfaces.csproj", "{A81F1C23-6F7B-5AF1-BC61-312CF1881CFE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.WebService.Tests", "VexHub\__Tests\StellaOps.VexHub.WebService.Tests\StellaOps.VexHub.WebService.Tests.csproj", "{73F03316-B1CB-55DC-A3D6-9C9758CFFFEB}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{A2E3F297-D1D2-5283-81B5-7E83B6B297F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.WebService", "VexHub\StellaOps.VexHub.WebService\StellaOps.VexHub.WebService.csproj", "{ADDC25AD-9056-59DE-95EE-453A90D2D519}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Sbomer.BuildXPlugin", "src\Scanner\StellaOps.Scanner.Sbomer.BuildXPlugin\StellaOps.Scanner.Sbomer.BuildXPlugin.csproj", "{CF6E60E9-000E-51D4-9C67-FE84E08AF277}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens.Core", "VexLens\StellaOps.VexLens\StellaOps.VexLens.Core\StellaOps.VexLens.Core.csproj", "{A002946E-4486-51F0-A132-2654E3DDB4E9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A0A96F05-87B2-5B08-A6E4-3E685E49E50F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens", "VexLens\StellaOps.VexLens\StellaOps.VexLens.csproj", "{D84DFC26-3A6B-539F-822D-CE326F7DB9B4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ScannerSignals.IntegrationTests", "src\__Tests\reachability\StellaOps.ScannerSignals.IntegrationTests\StellaOps.ScannerSignals.IntegrationTests.csproj", "{9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens.Core.Tests", "VexLens\StellaOps.VexLens\__Tests\StellaOps.VexLens.Core.Tests\StellaOps.VexLens.Core.Tests.csproj", "{07CBEBEF-B614-5A84-BFEB-A8548E20F1E9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.VulnSurfaces.Tests", "src\Scanner\__Libraries\StellaOps.Scanner.VulnSurfaces.Tests\StellaOps.Scanner.VulnSurfaces.Tests.csproj", "{06B9914A-7331-579B-AD4F-82B3D95B5C4E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VulnExplorer.Api", "VulnExplorer\StellaOps.VulnExplorer.Api\StellaOps.VulnExplorer.Api.csproj", "{F3495690-6B86-5FEC-BBB4-DD899C2E419E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Advisory.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Advisory.Tests\StellaOps.Scanner.Advisory.Tests.csproj", "{E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VulnExplorer.Api.Tests", "__Tests\StellaOps.VulnExplorer.Api.Tests\StellaOps.VulnExplorer.Api.Tests.csproj", "{5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\declared-cpm-missing-version\App.csproj", "{64305515-BFD3-5627-A917-B45C4BFA08DD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Agent", "Zastava\StellaOps.Zastava.Agent\StellaOps.Zastava.Agent.csproj", "{D3BA9C21-1337-5091-AD41-ABD11C4B150D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\declared-cpm-project\App.csproj", "{87CF5359-648E-5F59-829B-4C61573D02DF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Observer", "Zastava\StellaOps.Zastava.Observer\StellaOps.Zastava.Observer.csproj", "{849DA55E-D3D1-5E35-A339-B1AC4590E0A3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\declared-property-placeholder\App.csproj", "{2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Webhook", "Zastava\StellaOps.Zastava.Webhook\StellaOps.Zastava.Webhook.csproj", "{CEE84738-20C1-5800-B982-E331652C3917}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyApp", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\MyApp.csproj", "{B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Core", "Zastava\__Libraries\StellaOps.Zastava.Core\StellaOps.Zastava.Core.csproj", "{B118588F-2F12-5CA8-8EED-426A7D34FF9A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Bun.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests.csproj", "{542F28D0-D20F-5571-AE65-83CEA16B299D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Core.Tests", "Zastava\__Tests\StellaOps.Zastava.Core.Tests\StellaOps.Zastava.Core.Tests.csproj", "{7D3BAFD9-4120-5A6A-B215-10AB461844EB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{545AD377-070A-5001-944C-76418FB7F3FF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Observer.Tests", "Zastava\__Tests\StellaOps.Zastava.Observer.Tests\StellaOps.Zastava.Observer.Tests.csproj", "{27196784-FFEA-59AB-8F26-3840EDF6C831}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{D24E78F3-72F2-5A01-A525-7D9A8F4826F4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests.csproj", "{24A017D2-7BD5-5F4C-8B67-58B56129C4CB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.DotNet.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.DotNet.Tests\StellaOps.Scanner.Analyzers.Lang.DotNet.Tests.csproj", "{2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{10FC6B5B-C9CE-5E8B-9648-D85098F70A62}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{71429279-82DC-51EC-834A-F3C52A19ECE6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Go.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests.csproj", "{4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{4B521542-1CC6-5546-9322-8FE869AC7904}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Java.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests.csproj", "{BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests\StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests.csproj", "{48C8ED44-9E61-5C72-B912-987F6B4D3D4F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{010D92FC-6304-5FA0-81CD-1AB19BA2F832}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{28923049-DC26-55D4-8E74-8DABCABB6518}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests.csproj", "{C2D640E1-47EF-596C-A258-AE5E93A7578C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{DF05A63F-D283-5C81-B7C7-D659CBED0695}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{047FADEF-DBAF-5D43-A2D6-5C68801894E6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests.csproj", "{D77582C2-0CEF-5ED8-8366-5A28492D3C88}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{436C0FB7-F3E3-518B-8F65-CF760E875DD5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Python.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests.csproj", "{CC4D16A5-AB4A-5877-B0E5-25928D627933}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{2ACE0837-E738-59B6-9728-1DA6D1A22B08}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Ruby.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests.csproj", "{C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{010E1EE1-EC22-55A0-B1E8-86B24B584B95}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{1848E192-CC0F-5736-B68C-D71E6D575301}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{CA77C3B9-4D34-506E-B823-D88353261C77}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\StellaOps.Scanner.Analyzers.Lang.Tests.csproj", "{0D8AAAB2-669C-594E-8782-B105F7A3D076}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Native.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Native.Tests\StellaOps.Scanner.Analyzers.Native.Tests.csproj", "{24A77816-86CF-5958-8005-511C82A5DE13}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Homebrew.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Homebrew.Tests\StellaOps.Scanner.Analyzers.OS.Homebrew.Tests.csproj", "{265D18F4-7D43-5989-BC89-06A0BCAA974F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests\StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests.csproj", "{2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests\StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests.csproj", "{CF1DD579-8832-5D10-A776-BEA22477C9E9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Tests\StellaOps.Scanner.Analyzers.OS.Tests.csproj", "{9DD2C1F3-D4B6-530E-907B-BFA80085311C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests.csproj", "{7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests\StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests.csproj", "{D2F4B045-45B9-573C-8EA7-F639FADF6518}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests.csproj", "{FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmarks.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Benchmarks.Tests\StellaOps.Scanner.Benchmarks.Tests.csproj", "{891EDEAF-E530-5CB1-B459-E526E563AF44}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Cache.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Cache.Tests\StellaOps.Scanner.Cache.Tests.csproj", "{7D80E495-7DE6-5093-AC05-650991082D96}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.CallGraph.Tests", "src\Scanner\__Tests\StellaOps.Scanner.CallGraph.Tests\StellaOps.Scanner.CallGraph.Tests.csproj", "{0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Core.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Core.Tests\StellaOps.Scanner.Core.Tests.csproj", "{434EB740-8EB9-56AA-B7C7-779322245497}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Diff.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Diff.Tests\StellaOps.Scanner.Diff.Tests.csproj", "{BD4C1CC3-8493-5647-BDC9-9A9721595549}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit.Lineage.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Emit.Lineage.Tests\StellaOps.Scanner.Emit.Lineage.Tests.csproj", "{F5D74715-01BD-530A-9234-2C8E8327CA7C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Emit.Tests\StellaOps.Scanner.Emit.Tests.csproj", "{5DB2DAD4-749D-5958-85A5-D416773EC7AD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.EntryTrace.Tests", "src\Scanner\__Tests\StellaOps.Scanner.EntryTrace.Tests\StellaOps.Scanner.EntryTrace.Tests.csproj", "{2C644E8C-5731-566A-9208-25FF724E88CF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Evidence.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Evidence.Tests\StellaOps.Scanner.Evidence.Tests.csproj", "{FBAA3D74-4A5F-5F10-877F-C4AEDDD69656}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Explainability.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Explainability.Tests\StellaOps.Scanner.Explainability.Tests.csproj", "{D4DC4627-27B2-5162-BF64-821B7AD8837C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Integration.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Integration.Tests\StellaOps.Scanner.Integration.Tests.csproj", "{38C61566-48F9-5D8E-9FC1-A1E81E71E5E7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofSpine.Tests", "src\Scanner\__Tests\StellaOps.Scanner.ProofSpine.Tests\StellaOps.Scanner.ProofSpine.Tests.csproj", "{6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Queue.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Queue.Tests\StellaOps.Scanner.Queue.Tests.csproj", "{D9F26498-410D-5617-B810-BC58D172184D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability.Stack.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Reachability.Stack.Tests\StellaOps.Scanner.Reachability.Stack.Tests.csproj", "{6140569D-4784-53CE-98A2-54D8BD6D1745}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Reachability.Tests\StellaOps.Scanner.Reachability.Tests.csproj", "{50274ADF-643D-5FEA-831C-2CB3DD2C6D30}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ReachabilityDrift.Tests", "src\Scanner\__Tests\StellaOps.Scanner.ReachabilityDrift.Tests\StellaOps.Scanner.ReachabilityDrift.Tests.csproj", "{D60176B5-3B87-504D-BCAC-067BD9954A8F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Sbomer.BuildXPlugin.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Sbomer.BuildXPlugin.Tests\StellaOps.Scanner.Sbomer.BuildXPlugin.Tests.csproj", "{3F743B8C-53C6-5520-B4AB-52C67179DD73}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.SmartDiff.Tests", "src\Scanner\__Tests\StellaOps.Scanner.SmartDiff.Tests\StellaOps.Scanner.SmartDiff.Tests.csproj", "{BD34A481-9816-51A7-BA6B-7272465F68C4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Oci.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Storage.Oci.Tests\StellaOps.Scanner.Storage.Oci.Tests.csproj", "{EAA4DB81-CBAA-573C-9C40-19F9551BE98B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Storage.Tests\StellaOps.Scanner.Storage.Tests.csproj", "{879D5965-6D83-529C-A2F7-41E85045A7F0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Env.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Env.Tests\StellaOps.Scanner.Surface.Env.Tests.csproj", "{45E6A177-140E-5C2C-AAC6-A2D662BEA5BA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.FS.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.FS.Tests\StellaOps.Scanner.Surface.FS.Tests.csproj", "{23CE30EB-406F-573D-BF3D-4281A6FE406F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Secrets.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Secrets.Tests\StellaOps.Scanner.Surface.Secrets.Tests.csproj", "{FA284264-B63E-5DC4-B2A8-A8D347A554D1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Tests\StellaOps.Scanner.Surface.Tests.csproj", "{EAD55F0E-0895-5BE5-8273-216780F99C1B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Validation.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Validation.Tests\StellaOps.Scanner.Surface.Validation.Tests.csproj", "{6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Triage.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Triage.Tests\StellaOps.Scanner.Triage.Tests.csproj", "{EF443847-D7D0-5457-85D8-4382BF34931F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.WebService.Tests", "src\Scanner\__Tests\StellaOps.Scanner.WebService.Tests\StellaOps.Scanner.WebService.Tests.csproj", "{C2C3712D-B2E1-5F74-A3F9-0D912381A2CF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Worker.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Worker.Tests\StellaOps.Scanner.Worker.Tests.csproj", "{F28F85B6-F4FD-5785-AF89-58F8159621E8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{8EDEFD20-4914-53A8-88B3-B5FEB7B9D7A0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.WebService", "src\Scanner\StellaOps.Scanner.WebService\StellaOps.Scanner.WebService.csproj", "{563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{85703812-08C9-50E6-B355-4F26ED7810F1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Worker", "src\Scanner\StellaOps.Scanner.Worker\StellaOps.Scanner.Worker.csproj", "{8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scheduler", "Scheduler", "{83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{D1E2B45E-632F-55A2-809F-C51E0F5975D1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scheduler.Backfill", "src\Scheduler\Tools\Scheduler.Backfill\Scheduler.Backfill.csproj", "{D8858828-8495-5CBB-A7BB-97C058811A13}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{065183CB-0CEB-5710-98AA-112036087960}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.ImpactIndex", "src\Scheduler\__Libraries\StellaOps.Scheduler.ImpactIndex\StellaOps.Scheduler.ImpactIndex.csproj", "{671D8C13-26F5-52C1-80F1-EFB556E12B46}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Models", "src\Scheduler\__Libraries\StellaOps.Scheduler.Models\StellaOps.Scheduler.Models.csproj", "{335A63A0-01E4-5230-8741-5AE90F371B82}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Queue", "src\Scheduler\__Libraries\StellaOps.Scheduler.Queue\StellaOps.Scheduler.Queue.csproj", "{79481E86-D2CA-5472-8EDD-D0219F5932AC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Storage.Postgres", "src\Scheduler\__Libraries\StellaOps.Scheduler.Storage.Postgres\StellaOps.Scheduler.Storage.Postgres.csproj", "{69F7F8D4-6E7E-5EAA-B36A-273B223B3E30}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker", "src\Scheduler\__Libraries\StellaOps.Scheduler.Worker\StellaOps.Scheduler.Worker.csproj", "{A649555C-AAE1-59A8-A7BA-C118366386DD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{78EF3724-4F6C-5873-A748-89FB753A6041}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Backfill.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Backfill.Tests\StellaOps.Scheduler.Backfill.Tests.csproj", "{22C216D9-2A03-5C40-9A18-E30C6FDF4D48}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.ImpactIndex.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.ImpactIndex.Tests\StellaOps.Scheduler.ImpactIndex.Tests.csproj", "{6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Models.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Models.Tests\StellaOps.Scheduler.Models.Tests.csproj", "{91F25B73-0A0C-57B6-89C2-B13E15F1B281}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Queue.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Queue.Tests\StellaOps.Scheduler.Queue.Tests.csproj", "{F66F5DFE-3B8F-5B43-89DE-4A15B994290B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Storage.Postgres.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Storage.Postgres.Tests\StellaOps.Scheduler.Storage.Postgres.Tests.csproj", "{C165A810-99AA-5C2E-99D9-950C4ABD5C63}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.WebService.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.WebService.Tests\StellaOps.Scheduler.WebService.Tests.csproj", "{F2436D73-0E94-50F0-9C02-28CE3910EB21}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Worker.Tests\StellaOps.Scheduler.Worker.Tests.csproj", "{1D8E9087-584B-5341-BFAA-EEB046E530AF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{DFF6FD34-2F01-50E2-B2E3-C13F4AFF70BC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.WebService", "src\Scheduler\StellaOps.Scheduler.WebService\StellaOps.Scheduler.WebService.csproj", "{0D72E841-4F53-5ED8-864B-53AA0DFA5978}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{0CF1F217-11C2-56BF-B2B0-4DFD474FE798}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker.Host", "src\Scheduler\StellaOps.Scheduler.Worker.Host\StellaOps.Scheduler.Worker.Host.csproj", "{E5B88985-0693-51FC-8AB9-7C3728722618}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Signals", "Signals", "{76802750-19B9-5E80-80BE-7ADC255ACE3D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{C521E5D8-709E-5061-9564-7D35400AF484}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals", "src\Signals\StellaOps.Signals\StellaOps.Signals.csproj", "{78353588-38CA-5CCC-86EB-1513FB86FB4B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Scheduler", "src\Signals\StellaOps.Signals.Scheduler\StellaOps.Signals.Scheduler.csproj", "{8A43DF4F-CBD4-5481-A113-84EBE37CA375}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Storage.Postgres", "src\Signals\StellaOps.Signals.Storage.Postgres\StellaOps.Signals.Storage.Postgres.csproj", "{37A03641-FA63-5896-B432-EF26DC11F6CB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{C4AAD073-8948-5497-B314-B2699A504B73}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Contracts", "src\__Libraries\StellaOps.Signals.Contracts\StellaOps.Signals.Contracts.csproj", "{16C1069D-EBC9-53F4-909E-6EAF374E7E8A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{5C08FB5F-37E6-59C6-B04B-ED32DB54F246}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Tests", "src\__Libraries\__Tests\StellaOps.Signals.Tests\StellaOps.Signals.Tests.csproj", "{EB39A5CF-2689-5002-8A70-CFB0F473CCDE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Reachability.Tests", "src\__Tests\reachability\StellaOps.Signals.Reachability.Tests\StellaOps.Signals.Reachability.Tests.csproj", "{13D2C70F-86E5-52EB-9A53-F266E471A5DC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Tests", "src\Signals\__Tests\StellaOps.Signals.Tests\StellaOps.Signals.Tests.csproj", "{DC957128-193A-58F3-B987-481370A43953}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Storage.Postgres.Tests", "src\Signals\StellaOps.Signals.Storage.Postgres.Tests\StellaOps.Signals.Storage.Postgres.Tests.csproj", "{05430EEB-6E1F-5396-A521-EE455630F730}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Signer", "Signer", "{2A2731AB-593C-5E81-BD4F-F16DBBDAA10F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{318F564F-76B2-50BF-B629-0EB154BAF41D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Core", "src\Signer\StellaOps.Signer\StellaOps.Signer.Core\StellaOps.Signer.Core.csproj", "{13AAE009-19FD-5093-B154-6FFC4C34B72C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Infrastructure", "src\Signer\StellaOps.Signer\StellaOps.Signer.Infrastructure\StellaOps.Signer.Infrastructure.csproj", "{056D1311-0882-5239-9D21-60FC186AB7F8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{ED97BD71-2A08-5826-8CD2-D90D2FA14B66}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Keyless", "src\Signer\__Libraries\StellaOps.Signer.Keyless\StellaOps.Signer.Keyless.csproj", "{D99F972A-76D0-57CF-908D-FB28750FE989}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.KeyManagement", "src\Signer\__Libraries\StellaOps.Signer.KeyManagement\StellaOps.Signer.KeyManagement.csproj", "{66D435A0-4D37-50EA-AC48-F557BD794E8D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F246CAA7-1A3C-5F2A-B6C4-ADF43C72EBC8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Tests", "src\Signer\StellaOps.Signer\StellaOps.Signer.Tests\StellaOps.Signer.Tests.csproj", "{BA153C94-5786-5DFB-BF46-5456F314640D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{69DD2687-443E-5E29-B334-E9409586F6B3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.WebService", "src\Signer\StellaOps.Signer\StellaOps.Signer.WebService\StellaOps.Signer.WebService.csproj", "{59194DA8-0065-5FA5-9E4C-9F1D1A141D0D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskRunner", "TaskRunner", "{01BBCE99-BB2B-5A62-96B2-8C5C94221492}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{85BFD986-36C4-5D47-9BD8-07211AEC3A03}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Client", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Client\StellaOps.TaskRunner.Client.csproj", "{174F6B92-7B4B-5364-9FFA-B0922315E394}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Core", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Core\StellaOps.TaskRunner.Core.csproj", "{3D5B082E-6F16-5078-B163-57F545C6441D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Infrastructure", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Infrastructure\StellaOps.TaskRunner.Infrastructure.csproj", "{D52682FC-295E-53A2-B101-0BC60D53BEF1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Storage.Postgres", "src\TaskRunner\StellaOps.TaskRunner.Storage.Postgres\StellaOps.TaskRunner.Storage.Postgres.csproj", "{A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Tests", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Tests\StellaOps.TaskRunner.Tests.csproj", "{27C02428-144F-598E-A2B3-D74AB3A60BC2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Storage.Postgres.Tests", "src\TaskRunner\StellaOps.TaskRunner.Storage.Postgres.Tests\StellaOps.TaskRunner.Storage.Postgres.Tests.csproj", "{099EB392-DF89-5A9E-B1CC-7B60A16C61B5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{671DB4E9-704C-515F-B954-4A11384AC422}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.WebService", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.WebService\StellaOps.TaskRunner.WebService.csproj", "{B4897CA0-8501-586C-AFA3-502ECDCB58FD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{620AF63F-D189-5EDE-92BB-F610F5DB878C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Worker", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Worker\StellaOps.TaskRunner.Worker.csproj", "{88F0AAA9-7AB4-5B38-9132-675E0CF0E032}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Telemetry", "Telemetry", "{DEAB797C-CFE8-568B-A47A-549B8F4838A6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{16CA4052-C32A-5EE4-A1E6-8DE81963D200}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Analyzers", "src\Telemetry\StellaOps.Telemetry.Analyzers\StellaOps.Telemetry.Analyzers.csproj", "{509995C7-1637-5E0A-8F11-0F5E54B77209}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{F82852B2-BCCB-5338-B6FC-DF7BE18CF99A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Core", "src\Telemetry\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core.csproj", "{DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{39D079A8-9BEC-5C96-9670-7FFCB16094D4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Analyzers.Tests", "src\Telemetry\StellaOps.Telemetry.Analyzers\StellaOps.Telemetry.Analyzers.Tests\StellaOps.Telemetry.Analyzers.Tests.csproj", "{5AA07819-E820-54D5-8A68-69F791EDC4E4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Core.Tests", "src\Telemetry\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core.Tests\StellaOps.Telemetry.Core.Tests.csproj", "{BCB84E5F-2F49-53C9-8E91-EAA790F511B8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F59ED1AE-6A2E-5465-81EB-52CFA175CBE6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A054E1EC-4757-5B74-83D2-BF7B0F163365}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres.Testing", "src\__Tests\__Libraries\StellaOps.Infrastructure.Postgres.Testing\StellaOps.Infrastructure.Postgres.Testing.csproj", "{B7CA7A16-AAFB-5A8F-B598-0284ED7DF744}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Testing", "src\__Tests\__Libraries\StellaOps.Messaging.Testing\StellaOps.Messaging.Testing.csproj", "{2E7B8D21-CAD8-5844-B59F-7A487E6594DD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Testing", "src\__Tests\__Libraries\StellaOps.Router.Testing\StellaOps.Router.Testing.csproj", "{F30EF61D-A7FC-5689-A06F-42A152CF7393}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.AirGap", "src\__Tests\__Libraries\StellaOps.Testing.AirGap\StellaOps.Testing.AirGap.csproj", "{96610609-85C7-5F09-B765-A86463A8DBDE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism", "src\__Tests\__Libraries\StellaOps.Testing.Determinism\StellaOps.Testing.Determinism.csproj", "{E5A69860-1704-5FB1-BFA3-5872182D4829}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism.Properties", "src\__Tests\__Libraries\StellaOps.Testing.Determinism.Properties\StellaOps.Testing.Determinism.Properties.csproj", "{1F5FFF7C-AF58-5C3E-9981-EE5E978426E8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Manifests", "src\__Tests\__Libraries\StellaOps.Testing.Manifests\StellaOps.Testing.Manifests.csproj", "{51652C28-0583-5556-A941-D16D99F97B82}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Architecture.Tests", "src\__Tests\architecture\StellaOps.Architecture.Tests\StellaOps.Architecture.Tests.csproj", "{068138BD-177D-5359-B0DD-A369BB607E95}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Chaos.Router.Tests", "src\__Tests\chaos\StellaOps.Chaos.Router.Tests\StellaOps.Chaos.Router.Tests.csproj", "{91306E2D-A310-50D1-B64F-47A158D42085}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.AirGap", "src\__Tests\Integration\StellaOps.Integration.AirGap\StellaOps.Integration.AirGap.csproj", "{F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Determinism", "src\__Tests\Integration\StellaOps.Integration.Determinism\StellaOps.Integration.Determinism.csproj", "{59234A8C-D502-5965-AAFC-19739C833885}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.E2E", "src\__Tests\Integration\StellaOps.Integration.E2E\StellaOps.Integration.E2E.csproj", "{2CE72B3D-4D13-500A-A44D-76029069C773}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Performance", "src\__Tests\Integration\StellaOps.Integration.Performance\StellaOps.Integration.Performance.csproj", "{422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Platform", "src\__Tests\Integration\StellaOps.Integration.Platform\StellaOps.Integration.Platform.csproj", "{8F7505CD-473C-590A-8851-FA762AB5E214}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.ProofChain", "src\__Tests\Integration\StellaOps.Integration.ProofChain\StellaOps.Integration.ProofChain.csproj", "{B2ABA214-83FB-5E9E-8AD4-2D54E579310A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Reachability", "src\__Tests\Integration\StellaOps.Integration.Reachability\StellaOps.Integration.Reachability.csproj", "{3EC6A343-75E8-511F-A767-8FAB9EC79A62}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Unknowns", "src\__Tests\Integration\StellaOps.Integration.Unknowns\StellaOps.Integration.Unknowns.csproj", "{37DF1BF6-AD9C-59A2-8F10-512ABE804ED3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Interop.Tests", "src\__Tests\interop\StellaOps.Interop.Tests\StellaOps.Interop.Tests.csproj", "{A93B89A8-E39D-560B-82E8-96EAEA545A28}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Offline.E2E.Tests", "src\__Tests\offline\StellaOps.Offline.E2E.Tests\StellaOps.Offline.E2E.Tests.csproj", "{DF5A6010-D88B-5327-8E1A-74F2A716D340}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Parity.Tests", "src\__Tests\parity\StellaOps.Parity.Tests\StellaOps.Parity.Tests.csproj", "{C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tests", "src\__Tests\Provenance\StellaOps.Provenance.Attestation.Tests\StellaOps.Provenance.Attestation.Tests.csproj", "{B143BD73-A4D7-51F3-804E-03CE8C6CF639}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Reachability.FixtureTests", "src\__Tests\reachability\StellaOps.Reachability.FixtureTests\StellaOps.Reachability.FixtureTests.csproj", "{53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Security.Tests", "src\__Tests\security\StellaOps.Security.Tests\StellaOps.Security.Tests.csproj", "{96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Audit.ReplayToken.Tests", "src\__Tests\StellaOps.Audit.ReplayToken.Tests\StellaOps.Audit.ReplayToken.Tests.csproj", "{FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Bundle.Tests", "src\__Tests\StellaOps.Evidence.Bundle.Tests\StellaOps.Evidence.Bundle.Tests.csproj", "{2063D4CC-6C01-5693-B0B9-1376FB928E43}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.Tests", "src\__Tests\StellaOps.Microservice.Tests\StellaOps.Microservice.Tests.csproj", "{B0A0E3D1-FF2E-5005-B619-4523C2A2C955}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common.Tests", "src\__Tests\StellaOps.Router.Common.Tests\StellaOps.Router.Common.Tests.csproj", "{004D507B-32A2-5704-8747-412E7B8EFAE4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config.Tests", "src\__Tests\StellaOps.Router.Config.Tests\StellaOps.Router.Config.Tests.csproj", "{FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Gateway.Tests", "src\__Tests\StellaOps.Router.Gateway.Tests\StellaOps.Router.Gateway.Tests.csproj", "{62186A00-3E04-51EF-9497-258A973D6E24}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory.Tests", "src\__Tests\StellaOps.Router.Transport.InMemory.Tests\StellaOps.Router.Transport.InMemory.Tests.csproj", "{81DADA98-669F-5B5B-8C31-EA3B5CF77380}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp.Tests", "src\__Tests\StellaOps.Router.Transport.Udp.Tests\StellaOps.Router.Transport.Udp.Tests.csproj", "{768155E4-8D91-5A02-A006-2B357C033E25}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack.Tests", "src\__Tests\unit\StellaOps.AuditPack.Tests\StellaOps.AuditPack.Tests.csproj", "{DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VexHub", "VexHub", "{7A6E52D8-29D2-5529-A394-BDF7AB0B84A0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{27148056-45FD-547F-9F8A-6A56C8487DCB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Core", "src\VexHub\__Libraries\StellaOps.VexHub.Core\StellaOps.VexHub.Core.csproj", "{3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Storage.Postgres", "src\VexHub\__Libraries\StellaOps.VexHub.Storage.Postgres\StellaOps.VexHub.Storage.Postgres.csproj", "{BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Core.Tests", "src\VexHub\__Tests\StellaOps.VexHub.Core.Tests\StellaOps.VexHub.Core.Tests.csproj", "{3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Storage.Postgres.Tests", "src\VexHub\__Tests\StellaOps.VexHub.Storage.Postgres.Tests\StellaOps.VexHub.Storage.Postgres.Tests.csproj", "{5682D20E-74D9-50D6-B400-8EE39D2ADF42}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.WebService.Tests", "src\VexHub\__Tests\StellaOps.VexHub.WebService.Tests\StellaOps.VexHub.WebService.Tests.csproj", "{73F03316-B1CB-55DC-A3D6-9C9758CFFFEB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{9D3B5FD2-1692-5817-89D3-2E5950F83EB7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.WebService", "src\VexHub\StellaOps.VexHub.WebService\StellaOps.VexHub.WebService.csproj", "{ADDC25AD-9056-59DE-95EE-453A90D2D519}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VexLens", "VexLens", "{F171E782-0A1A-586D-9349-7C69A2500836}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9FEBBFD8-3A0B-5249-89ED-239B8E9697CC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens.Core", "src\VexLens\StellaOps.VexLens\StellaOps.VexLens.Core\StellaOps.VexLens.Core.csproj", "{A002946E-4486-51F0-A132-2654E3DDB4E9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens", "src\VexLens\StellaOps.VexLens\StellaOps.VexLens.csproj", "{D84DFC26-3A6B-539F-822D-CE326F7DB9B4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{4430BC6C-9ACC-5034-8BE9-A39F8A5FC45E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens.Core.Tests", "src\VexLens\StellaOps.VexLens\__Tests\StellaOps.VexLens.Core.Tests\StellaOps.VexLens.Core.Tests.csproj", "{07CBEBEF-B614-5A84-BFEB-A8548E20F1E9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VulnExplorer", "VulnExplorer", "{C565F805-B835-571C-B5F4-136F31FCDF47}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{5EC80510-3F29-54FD-8848-05902F3B5063}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VulnExplorer.Api", "src\VulnExplorer\StellaOps.VulnExplorer.Api\StellaOps.VulnExplorer.Api.csproj", "{F3495690-6B86-5FEC-BBB4-DD899C2E419E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{0CB37973-516C-53DC-BD58-91B698F3B258}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VulnExplorer.Api.Tests", "src\__Tests\StellaOps.VulnExplorer.Api.Tests\StellaOps.VulnExplorer.Api.Tests.csproj", "{5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Zastava", "Zastava", "{E98E0B62-3DB3-518D-A10C-006A509713BC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{52051AD4-A4F5-53C2-905A-812A85994CCD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Agent", "src\Zastava\StellaOps.Zastava.Agent\StellaOps.Zastava.Agent.csproj", "{D3BA9C21-1337-5091-AD41-ABD11C4B150D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Observer", "src\Zastava\StellaOps.Zastava.Observer\StellaOps.Zastava.Observer.csproj", "{849DA55E-D3D1-5E35-A339-B1AC4590E0A3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Webhook", "src\Zastava\StellaOps.Zastava.Webhook\StellaOps.Zastava.Webhook.csproj", "{CEE84738-20C1-5800-B982-E331652C3917}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{64374268-E685-5130-B546-4FAFCF95CD2A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Core", "src\Zastava\__Libraries\StellaOps.Zastava.Core\StellaOps.Zastava.Core.csproj", "{B118588F-2F12-5CA8-8EED-426A7D34FF9A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{87C7FE69-A978-534E-8646-18D30C34F667}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Core.Tests", "src\Zastava\__Tests\StellaOps.Zastava.Core.Tests\StellaOps.Zastava.Core.Tests.csproj", "{7D3BAFD9-4120-5A6A-B215-10AB461844EB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Observer.Tests", "src\Zastava\__Tests\StellaOps.Zastava.Observer.Tests\StellaOps.Zastava.Observer.Tests.csproj", "{27196784-FFEA-59AB-8F26-3840EDF6C831}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Webhook.Tests", "src\Zastava\__Tests\StellaOps.Zastava.Webhook.Tests\StellaOps.Zastava.Webhook.Tests.csproj", "{69AE1332-70C7-501D-A64E-F769F52B2449}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Webhook.Tests", "Zastava\__Tests\StellaOps.Zastava.Webhook.Tests\StellaOps.Zastava.Webhook.Tests.csproj", "{69AE1332-70C7-501D-A64E-F769F52B2449}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1797,26 +1367,10 @@ Global {F07AE928-89B5-57F0-921C-3B97A376FF95}.Debug|Any CPU.Build.0 = Debug|Any CPU {F07AE928-89B5-57F0-921C-3B97A376FF95}.Release|Any CPU.ActiveCfg = Release|Any CPU {F07AE928-89B5-57F0-921C-3B97A376FF95}.Release|Any CPU.Build.0 = Release|Any CPU - {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Release|Any CPU.Build.0 = Release|Any CPU - {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Release|Any CPU.Build.0 = Release|Any CPU - {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Release|Any CPU.Build.0 = Release|Any CPU {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Debug|Any CPU.Build.0 = Debug|Any CPU {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Release|Any CPU.Build.0 = Release|Any CPU - {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Release|Any CPU.Build.0 = Release|Any CPU {452CFFEA-8914-5128-AC23-65C969E53523}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {452CFFEA-8914-5128-AC23-65C969E53523}.Debug|Any CPU.Build.0 = Debug|Any CPU {452CFFEA-8914-5128-AC23-65C969E53523}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -1953,10 +1507,6 @@ Global {508E13BB-305B-58B8-9F2E-E9759874DF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU {508E13BB-305B-58B8-9F2E-E9759874DF0A}.Release|Any CPU.ActiveCfg = Release|Any CPU {508E13BB-305B-58B8-9F2E-E9759874DF0A}.Release|Any CPU.Build.0 = Release|Any CPU - {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Release|Any CPU.Build.0 = Release|Any CPU {8DCF30E6-164B-55D5-A003-0A4D890A4492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8DCF30E6-164B-55D5-A003-0A4D890A4492}.Debug|Any CPU.Build.0 = Debug|Any CPU {8DCF30E6-164B-55D5-A003-0A4D890A4492}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -2589,70 +2139,6 @@ Global {CE252920-E8A0-5175-B211-CD71EABCFC75}.Debug|Any CPU.Build.0 = Debug|Any CPU {CE252920-E8A0-5175-B211-CD71EABCFC75}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE252920-E8A0-5175-B211-CD71EABCFC75}.Release|Any CPU.Build.0 = Release|Any CPU - {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Release|Any CPU.Build.0 = Release|Any CPU - {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Release|Any CPU.Build.0 = Release|Any CPU - {E7CD5254-7D73-585E-94B8-E70C281423F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7CD5254-7D73-585E-94B8-E70C281423F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7CD5254-7D73-585E-94B8-E70C281423F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7CD5254-7D73-585E-94B8-E70C281423F1}.Release|Any CPU.Build.0 = Release|Any CPU - {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Release|Any CPU.Build.0 = Release|Any CPU - {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Release|Any CPU.Build.0 = Release|Any CPU - {769E6552-E895-5951-8C67-86B251A6036B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {769E6552-E895-5951-8C67-86B251A6036B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {769E6552-E895-5951-8C67-86B251A6036B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {769E6552-E895-5951-8C67-86B251A6036B}.Release|Any CPU.Build.0 = Release|Any CPU - {92336BE4-5E46-5C13-B200-69A80999182B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {92336BE4-5E46-5C13-B200-69A80999182B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {92336BE4-5E46-5C13-B200-69A80999182B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {92336BE4-5E46-5C13-B200-69A80999182B}.Release|Any CPU.Build.0 = Release|Any CPU - {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Release|Any CPU.Build.0 = Release|Any CPU - {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Release|Any CPU.Build.0 = Release|Any CPU - {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Release|Any CPU.Build.0 = Release|Any CPU - {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Release|Any CPU.Build.0 = Release|Any CPU - {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Release|Any CPU.Build.0 = Release|Any CPU - {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Release|Any CPU.Build.0 = Release|Any CPU - {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Release|Any CPU.Build.0 = Release|Any CPU - {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Release|Any CPU.Build.0 = Release|Any CPU - {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Release|Any CPU.Build.0 = Release|Any CPU {38127116-0764-53E6-B5B5-2BA0CA0B7F91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {38127116-0764-53E6-B5B5-2BA0CA0B7F91}.Debug|Any CPU.Build.0 = Debug|Any CPU {38127116-0764-53E6-B5B5-2BA0CA0B7F91}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -2665,26 +2151,6 @@ Global {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}.Debug|Any CPU.Build.0 = Debug|Any CPU {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}.Release|Any CPU.Build.0 = Release|Any CPU - {A07964A7-387D-587F-9507-5E89354A965A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A07964A7-387D-587F-9507-5E89354A965A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A07964A7-387D-587F-9507-5E89354A965A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A07964A7-387D-587F-9507-5E89354A965A}.Release|Any CPU.Build.0 = Release|Any CPU - {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Release|Any CPU.Build.0 = Release|Any CPU - {67F2A597-9CF3-554A-89AF-A527D41D8831}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67F2A597-9CF3-554A-89AF-A527D41D8831}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67F2A597-9CF3-554A-89AF-A527D41D8831}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67F2A597-9CF3-554A-89AF-A527D41D8831}.Release|Any CPU.Build.0 = Release|Any CPU - {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Release|Any CPU.Build.0 = Release|Any CPU - {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Debug|Any CPU.Build.0 = Debug|Any CPU - {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Release|Any CPU.ActiveCfg = Release|Any CPU - {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Release|Any CPU.Build.0 = Release|Any CPU {69A89A48-4FF1-56DD-95F4-B81DBAADACDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69A89A48-4FF1-56DD-95F4-B81DBAADACDA}.Debug|Any CPU.Build.0 = Debug|Any CPU {69A89A48-4FF1-56DD-95F4-B81DBAADACDA}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -2893,14 +2359,6 @@ Global {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}.Debug|Any CPU.Build.0 = Debug|Any CPU {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}.Release|Any CPU.ActiveCfg = Release|Any CPU {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}.Release|Any CPU.Build.0 = Release|Any CPU - {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Release|Any CPU.Build.0 = Release|Any CPU - {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Release|Any CPU.Build.0 = Release|Any CPU {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -2917,18 +2375,10 @@ Global {2004E176-092C-5C14-A7F0-11CC8E383B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU {2004E176-092C-5C14-A7F0-11CC8E383B5C}.Release|Any CPU.ActiveCfg = Release|Any CPU {2004E176-092C-5C14-A7F0-11CC8E383B5C}.Release|Any CPU.Build.0 = Release|Any CPU - {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Release|Any CPU.Build.0 = Release|Any CPU {5618B67A-A525-5958-8001-9AB7A7EB6412}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5618B67A-A525-5958-8001-9AB7A7EB6412}.Debug|Any CPU.Build.0 = Debug|Any CPU {5618B67A-A525-5958-8001-9AB7A7EB6412}.Release|Any CPU.ActiveCfg = Release|Any CPU {5618B67A-A525-5958-8001-9AB7A7EB6412}.Release|Any CPU.Build.0 = Release|Any CPU - {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Release|Any CPU.Build.0 = Release|Any CPU {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}.Debug|Any CPU.Build.0 = Debug|Any CPU {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -2957,10 +2407,6 @@ Global {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}.Debug|Any CPU.Build.0 = Debug|Any CPU {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}.Release|Any CPU.ActiveCfg = Release|Any CPU {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}.Release|Any CPU.Build.0 = Release|Any CPU - {087B1096-EE56-5337-81C4-3655FEC38AAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {087B1096-EE56-5337-81C4-3655FEC38AAB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {087B1096-EE56-5337-81C4-3655FEC38AAB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {087B1096-EE56-5337-81C4-3655FEC38AAB}.Release|Any CPU.Build.0 = Release|Any CPU {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}.Debug|Any CPU.Build.0 = Debug|Any CPU {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3073,10 +2519,6 @@ Global {F03873D8-5506-5461-AF91-247DEF04D700}.Debug|Any CPU.Build.0 = Debug|Any CPU {F03873D8-5506-5461-AF91-247DEF04D700}.Release|Any CPU.ActiveCfg = Release|Any CPU {F03873D8-5506-5461-AF91-247DEF04D700}.Release|Any CPU.Build.0 = Release|Any CPU - {76D66413-B838-5648-BF18-B87DD5084BFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76D66413-B838-5648-BF18-B87DD5084BFC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76D66413-B838-5648-BF18-B87DD5084BFC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76D66413-B838-5648-BF18-B87DD5084BFC}.Release|Any CPU.Build.0 = Release|Any CPU {02D3276B-BB16-536D-BF6C-CD9067EE2F27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {02D3276B-BB16-536D-BF6C-CD9067EE2F27}.Debug|Any CPU.Build.0 = Debug|Any CPU {02D3276B-BB16-536D-BF6C-CD9067EE2F27}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3345,10 +2787,6 @@ Global {0735AB65-C84E-5173-AA33-34D053A2206F}.Debug|Any CPU.Build.0 = Debug|Any CPU {0735AB65-C84E-5173-AA33-34D053A2206F}.Release|Any CPU.ActiveCfg = Release|Any CPU {0735AB65-C84E-5173-AA33-34D053A2206F}.Release|Any CPU.Build.0 = Release|Any CPU - {DC026D6C-B3C7-563C-9686-598397B646F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC026D6C-B3C7-563C-9686-598397B646F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC026D6C-B3C7-563C-9686-598397B646F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC026D6C-B3C7-563C-9686-598397B646F0}.Release|Any CPU.Build.0 = Release|Any CPU {144905E9-FB74-5478-858D-214E98611302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {144905E9-FB74-5478-858D-214E98611302}.Debug|Any CPU.Build.0 = Debug|Any CPU {144905E9-FB74-5478-858D-214E98611302}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3365,10 +2803,6 @@ Global {E6BAF476-7A8E-5D90-85E5-40C6F3381750}.Debug|Any CPU.Build.0 = Debug|Any CPU {E6BAF476-7A8E-5D90-85E5-40C6F3381750}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6BAF476-7A8E-5D90-85E5-40C6F3381750}.Release|Any CPU.Build.0 = Release|Any CPU - {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Release|Any CPU.Build.0 = Release|Any CPU {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}.Debug|Any CPU.Build.0 = Debug|Any CPU {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3465,10 +2899,6 @@ Global {D7A538CE-DDAB-5F29-A55D-204C9BD1A157}.Debug|Any CPU.Build.0 = Debug|Any CPU {D7A538CE-DDAB-5F29-A55D-204C9BD1A157}.Release|Any CPU.ActiveCfg = Release|Any CPU {D7A538CE-DDAB-5F29-A55D-204C9BD1A157}.Release|Any CPU.Build.0 = Release|Any CPU - {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Release|Any CPU.Build.0 = Release|Any CPU {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3701,18 +3131,6 @@ Global {FA7943CD-23FC-58EE-BBFE-965758D362C6}.Debug|Any CPU.Build.0 = Debug|Any CPU {FA7943CD-23FC-58EE-BBFE-965758D362C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {FA7943CD-23FC-58EE-BBFE-965758D362C6}.Release|Any CPU.Build.0 = Release|Any CPU - {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Debug|Any CPU.Build.0 = Debug|Any CPU - {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Release|Any CPU.ActiveCfg = Release|Any CPU - {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Release|Any CPU.Build.0 = Release|Any CPU - {4144AED2-D212-5A1B-9849-97F97A8760E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4144AED2-D212-5A1B-9849-97F97A8760E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4144AED2-D212-5A1B-9849-97F97A8760E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4144AED2-D212-5A1B-9849-97F97A8760E3}.Release|Any CPU.Build.0 = Release|Any CPU - {77ABEF57-B941-5243-A695-AA8B499FE91F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {77ABEF57-B941-5243-A695-AA8B499FE91F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {77ABEF57-B941-5243-A695-AA8B499FE91F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {77ABEF57-B941-5243-A695-AA8B499FE91F}.Release|Any CPU.Build.0 = Release|Any CPU {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}.Debug|Any CPU.Build.0 = Debug|Any CPU {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3733,10 +3151,6 @@ Global {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}.Debug|Any CPU.Build.0 = Debug|Any CPU {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}.Release|Any CPU.ActiveCfg = Release|Any CPU {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}.Release|Any CPU.Build.0 = Release|Any CPU - {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Release|Any CPU.Build.0 = Release|Any CPU {F208351E-5372-53EF-ABBF-C349C32B33E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F208351E-5372-53EF-ABBF-C349C32B33E4}.Debug|Any CPU.Build.0 = Debug|Any CPU {F208351E-5372-53EF-ABBF-C349C32B33E4}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3809,10 +3223,6 @@ Global {69A56760-817A-5A9C-A52E-764FB0194071}.Debug|Any CPU.Build.0 = Debug|Any CPU {69A56760-817A-5A9C-A52E-764FB0194071}.Release|Any CPU.ActiveCfg = Release|Any CPU {69A56760-817A-5A9C-A52E-764FB0194071}.Release|Any CPU.Build.0 = Release|Any CPU - {4A591A91-072D-5332-84B5-40C52406510D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A591A91-072D-5332-84B5-40C52406510D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A591A91-072D-5332-84B5-40C52406510D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A591A91-072D-5332-84B5-40C52406510D}.Release|Any CPU.Build.0 = Release|Any CPU {CF956202-62CB-5340-BED9-0AB42E99E48D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF956202-62CB-5340-BED9-0AB42E99E48D}.Debug|Any CPU.Build.0 = Debug|Any CPU {CF956202-62CB-5340-BED9-0AB42E99E48D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3965,34 +3375,10 @@ Global {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}.Debug|Any CPU.Build.0 = Debug|Any CPU {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}.Release|Any CPU.Build.0 = Release|Any CPU - {64305515-BFD3-5627-A917-B45C4BFA08DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {64305515-BFD3-5627-A917-B45C4BFA08DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {64305515-BFD3-5627-A917-B45C4BFA08DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {64305515-BFD3-5627-A917-B45C4BFA08DD}.Release|Any CPU.Build.0 = Release|Any CPU - {87CF5359-648E-5F59-829B-4C61573D02DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87CF5359-648E-5F59-829B-4C61573D02DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87CF5359-648E-5F59-829B-4C61573D02DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87CF5359-648E-5F59-829B-4C61573D02DF}.Release|Any CPU.Build.0 = Release|Any CPU - {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Release|Any CPU.Build.0 = Release|Any CPU - {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Release|Any CPU.Build.0 = Release|Any CPU {542F28D0-D20F-5571-AE65-83CEA16B299D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {542F28D0-D20F-5571-AE65-83CEA16B299D}.Debug|Any CPU.Build.0 = Debug|Any CPU {542F28D0-D20F-5571-AE65-83CEA16B299D}.Release|Any CPU.ActiveCfg = Release|Any CPU {542F28D0-D20F-5571-AE65-83CEA16B299D}.Release|Any CPU.Build.0 = Release|Any CPU - {545AD377-070A-5001-944C-76418FB7F3FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {545AD377-070A-5001-944C-76418FB7F3FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {545AD377-070A-5001-944C-76418FB7F3FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {545AD377-070A-5001-944C-76418FB7F3FF}.Release|Any CPU.Build.0 = Release|Any CPU - {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Release|Any CPU.Build.0 = Release|Any CPU {24A017D2-7BD5-5F4C-8B67-58B56129C4CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {24A017D2-7BD5-5F4C-8B67-58B56129C4CB}.Debug|Any CPU.Build.0 = Debug|Any CPU {24A017D2-7BD5-5F4C-8B67-58B56129C4CB}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -4001,26 +3387,10 @@ Global {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}.Debug|Any CPU.Build.0 = Debug|Any CPU {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}.Release|Any CPU.Build.0 = Release|Any CPU - {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Release|Any CPU.ActiveCfg = Release|Any CPU - {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Release|Any CPU.Build.0 = Release|Any CPU - {71429279-82DC-51EC-834A-F3C52A19ECE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {71429279-82DC-51EC-834A-F3C52A19ECE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {71429279-82DC-51EC-834A-F3C52A19ECE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {71429279-82DC-51EC-834A-F3C52A19ECE6}.Release|Any CPU.Build.0 = Release|Any CPU {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Debug|Any CPU.Build.0 = Debug|Any CPU {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Release|Any CPU.ActiveCfg = Release|Any CPU {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Release|Any CPU.Build.0 = Release|Any CPU - {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Release|Any CPU.Build.0 = Release|Any CPU - {4B521542-1CC6-5546-9322-8FE869AC7904}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B521542-1CC6-5546-9322-8FE869AC7904}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B521542-1CC6-5546-9322-8FE869AC7904}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B521542-1CC6-5546-9322-8FE869AC7904}.Release|Any CPU.Build.0 = Release|Any CPU {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}.Debug|Any CPU.Build.0 = Debug|Any CPU {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -4029,66 +3399,22 @@ Global {48C8ED44-9E61-5C72-B912-987F6B4D3D4F}.Debug|Any CPU.Build.0 = Debug|Any CPU {48C8ED44-9E61-5C72-B912-987F6B4D3D4F}.Release|Any CPU.ActiveCfg = Release|Any CPU {48C8ED44-9E61-5C72-B912-987F6B4D3D4F}.Release|Any CPU.Build.0 = Release|Any CPU - {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Debug|Any CPU.Build.0 = Debug|Any CPU - {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Release|Any CPU.ActiveCfg = Release|Any CPU - {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Release|Any CPU.Build.0 = Release|Any CPU - {28923049-DC26-55D4-8E74-8DABCABB6518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28923049-DC26-55D4-8E74-8DABCABB6518}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28923049-DC26-55D4-8E74-8DABCABB6518}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28923049-DC26-55D4-8E74-8DABCABB6518}.Release|Any CPU.Build.0 = Release|Any CPU {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Debug|Any CPU.Build.0 = Debug|Any CPU {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Release|Any CPU.Build.0 = Release|Any CPU - {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Release|Any CPU.Build.0 = Release|Any CPU - {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Release|Any CPU.Build.0 = Release|Any CPU {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Debug|Any CPU.Build.0 = Debug|Any CPU {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Release|Any CPU.ActiveCfg = Release|Any CPU {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Release|Any CPU.Build.0 = Release|Any CPU - {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Release|Any CPU.Build.0 = Release|Any CPU - {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Release|Any CPU.Build.0 = Release|Any CPU {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Debug|Any CPU.Build.0 = Debug|Any CPU {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Release|Any CPU.ActiveCfg = Release|Any CPU {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Release|Any CPU.Build.0 = Release|Any CPU - {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Release|Any CPU.Build.0 = Release|Any CPU - {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Release|Any CPU.Build.0 = Release|Any CPU {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Debug|Any CPU.Build.0 = Debug|Any CPU {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Release|Any CPU.ActiveCfg = Release|Any CPU {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Release|Any CPU.Build.0 = Release|Any CPU - {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Debug|Any CPU.Build.0 = Debug|Any CPU - {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Release|Any CPU.ActiveCfg = Release|Any CPU - {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Release|Any CPU.Build.0 = Release|Any CPU - {1848E192-CC0F-5736-B68C-D71E6D575301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1848E192-CC0F-5736-B68C-D71E6D575301}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1848E192-CC0F-5736-B68C-D71E6D575301}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1848E192-CC0F-5736-B68C-D71E6D575301}.Release|Any CPU.Build.0 = Release|Any CPU - {CA77C3B9-4D34-506E-B823-D88353261C77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA77C3B9-4D34-506E-B823-D88353261C77}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA77C3B9-4D34-506E-B823-D88353261C77}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA77C3B9-4D34-506E-B823-D88353261C77}.Release|Any CPU.Build.0 = Release|Any CPU {0D8AAAB2-669C-594E-8782-B105F7A3D076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0D8AAAB2-669C-594E-8782-B105F7A3D076}.Debug|Any CPU.Build.0 = Debug|Any CPU {0D8AAAB2-669C-594E-8782-B105F7A3D076}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -4321,18 +3647,10 @@ Global {16C1069D-EBC9-53F4-909E-6EAF374E7E8A}.Debug|Any CPU.Build.0 = Debug|Any CPU {16C1069D-EBC9-53F4-909E-6EAF374E7E8A}.Release|Any CPU.ActiveCfg = Release|Any CPU {16C1069D-EBC9-53F4-909E-6EAF374E7E8A}.Release|Any CPU.Build.0 = Release|Any CPU - {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Release|Any CPU.Build.0 = Release|Any CPU {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Debug|Any CPU.Build.0 = Debug|Any CPU {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Release|Any CPU.ActiveCfg = Release|Any CPU {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Release|Any CPU.Build.0 = Release|Any CPU - {DC957128-193A-58F3-B987-481370A43953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC957128-193A-58F3-B987-481370A43953}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC957128-193A-58F3-B987-481370A43953}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC957128-193A-58F3-B987-481370A43953}.Release|Any CPU.Build.0 = Release|Any CPU {05430EEB-6E1F-5396-A521-EE455630F730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {05430EEB-6E1F-5396-A521-EE455630F730}.Debug|Any CPU.Build.0 = Debug|Any CPU {05430EEB-6E1F-5396-A521-EE455630F730}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -4489,10 +3807,6 @@ Global {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}.Debug|Any CPU.Build.0 = Debug|Any CPU {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}.Release|Any CPU.ActiveCfg = Release|Any CPU {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}.Release|Any CPU.Build.0 = Release|Any CPU - {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Release|Any CPU.Build.0 = Release|Any CPU {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}.Debug|Any CPU.Build.0 = Debug|Any CPU {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -4501,42 +3815,10 @@ Global {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}.Debug|Any CPU.Build.0 = Debug|Any CPU {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}.Release|Any CPU.ActiveCfg = Release|Any CPU {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}.Release|Any CPU.Build.0 = Release|Any CPU - {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Release|Any CPU.Build.0 = Release|Any CPU {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Debug|Any CPU.Build.0 = Debug|Any CPU {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Release|Any CPU.ActiveCfg = Release|Any CPU {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Release|Any CPU.Build.0 = Release|Any CPU - {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Release|Any CPU.Build.0 = Release|Any CPU - {004D507B-32A2-5704-8747-412E7B8EFAE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {004D507B-32A2-5704-8747-412E7B8EFAE4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {004D507B-32A2-5704-8747-412E7B8EFAE4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {004D507B-32A2-5704-8747-412E7B8EFAE4}.Release|Any CPU.Build.0 = Release|Any CPU - {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Release|Any CPU.Build.0 = Release|Any CPU - {62186A00-3E04-51EF-9497-258A973D6E24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {62186A00-3E04-51EF-9497-258A973D6E24}.Debug|Any CPU.Build.0 = Debug|Any CPU - {62186A00-3E04-51EF-9497-258A973D6E24}.Release|Any CPU.ActiveCfg = Release|Any CPU - {62186A00-3E04-51EF-9497-258A973D6E24}.Release|Any CPU.Build.0 = Release|Any CPU - {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Release|Any CPU.ActiveCfg = Release|Any CPU - {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Release|Any CPU.Build.0 = Release|Any CPU - {768155E4-8D91-5A02-A006-2B357C033E25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {768155E4-8D91-5A02-A006-2B357C033E25}.Debug|Any CPU.Build.0 = Debug|Any CPU - {768155E4-8D91-5A02-A006-2B357C033E25}.Release|Any CPU.ActiveCfg = Release|Any CPU - {768155E4-8D91-5A02-A006-2B357C033E25}.Release|Any CPU.Build.0 = Release|Any CPU - {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Release|Any CPU.Build.0 = Release|Any CPU {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}.Debug|Any CPU.Build.0 = Debug|Any CPU {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -4610,842 +3892,34 @@ Global {69AE1332-70C7-501D-A64E-F769F52B2449}.Release|Any CPU.ActiveCfg = Release|Any CPU {69AE1332-70C7-501D-A64E-F769F52B2449}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection GlobalSection(NestedProjects) = preSolution {8B8EE856-DA24-5594-8E25-C9D70E26C011} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} - {808A70AA-83E2-5AD8-8519-CB6E27E99E66} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} - {D86F0DB2-577A-5B46-8B4A-4D492CAB32D7} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} - {D0FCFD53-225B-57FA-9073-6A88970B3E4F} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} {B7141C87-33DB-5F99-8B8B-0C61725C2D6F} = {8B8EE856-DA24-5594-8E25-C9D70E26C011} {6C186BD5-9A4D-5318-8AF8-F1B7AE48D812} = {8B8EE856-DA24-5594-8E25-C9D70E26C011} + {808A70AA-83E2-5AD8-8519-CB6E27E99E66} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} {B7FBC156-D7DE-5962-BFC8-40F94D6C00F9} = {808A70AA-83E2-5AD8-8519-CB6E27E99E66} + {D86F0DB2-577A-5B46-8B4A-4D492CAB32D7} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} {112CFB30-3731-54C5-8E9F-7C2CC75C9B67} = {D86F0DB2-577A-5B46-8B4A-4D492CAB32D7} + {D0FCFD53-225B-57FA-9073-6A88970B3E4F} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} {51BA43C0-6861-5B57-A837-B6CECF8D0257} = {D0FCFD53-225B-57FA-9073-6A88970B3E4F} {2E4D25DA-6B5D-5A5F-9F61-CDBF1DBB311D} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} - {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} - {A80991C3-5D9B-5C12-92DE-691A7399F660} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} - {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} {7002B619-1F2A-5393-B348-70CDAC639748} = {2E4D25DA-6B5D-5A5F-9F61-CDBF1DBB311D} - {6D955BD2-7D9B-5495-9153-509864CF7096} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} - {0EB72CBF-4405-5B0C-AF18-26764A0DB489} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} - {45DE9CF0-B55D-550D-8005-504FBF0F3CDF} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} - {FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} - {06AE06C1-E499-590D-88C0-E860AD7A7A32} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} + {A80991C3-5D9B-5C12-92DE-691A7399F660} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} {F07AE928-89B5-57F0-921C-3B97A376FF95} = {A80991C3-5D9B-5C12-92DE-691A7399F660} - {DF2C5848-16B4-54E1-A976-9C548AAF3077} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {6B905D2C-43E2-5637-9E98-393E5A3A1903} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {9477476B-34BB-5A40-BAB2-ABA6DBFD9733} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {9FA8DD10-9178-588E-AC7E-F423FB235DA0} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {58243870-C97F-5F26-B86F-BF1C0863BA0B} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {452CFFEA-8914-5128-AC23-65C969E53523} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {343BB1E8-DB77-52DA-B2E2-406C72088E34} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {6E0B7B8D-58FF-5297-9497-5286822D5483} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} - {EBE264E0-5321-50D4-97D7-27D2068685AA} = {7BDA5071-6A44-50AC-B3BF-075FA2B28DFD} - {CEA98078-2A40-5BD7-A10B-D41932877106} = {7BDA5071-6A44-50AC-B3BF-075FA2B28DFD} - {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} = {7BDA5071-6A44-50AC-B3BF-075FA2B28DFD} - {E2189FEA-63C0-5828-A60E-6F4D2B4DC724} = {EBE264E0-5321-50D4-97D7-27D2068685AA} - {8609324D-8A33-5C72-843C-C9CDF861F6B0} = {CEA98078-2A40-5BD7-A10B-D41932877106} - {15346A13-8152-5B25-AA03-37AF5A883B94} = {CEA98078-2A40-5BD7-A10B-D41932877106} - {A44B07A2-3C46-5AEF-9278-FC35BF3D020F} = {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} - {AC5584D7-5085-5ED3-840C-0B82D7D2606A} = {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} - {EEFF9AAC-ED84-55BF-8963-F5422023E379} = {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} - {F28A412B-CA0F-515B-BFF5-A258C78E41D4} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} - {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} - {F8F38682-4EB1-59F7-86C3-5464582178A1} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} - {CC9FE15F-1FAB-5208-8565-F3811229EC86} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} - {C011DDAB-DD11-5213-8857-437320BE11C2} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} - {8ECC05DA-F183-5849-8840-D7DCD7E80819} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} - {2A7DBD4D-B339-5CBA-889F-358076B03D58} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} - {4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} - {ECC3FD89-64D0-5048-A6E8-44470269D172} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} - {7200949F-B6B8-5857-9ECC-F43FA9C03A44} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} - {D367AE34-6CDE-5367-AE59-D9D037149B00} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} - {147ED816-086E-5914-ACF0-4E30516BF50C} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} - {80561E59-C6A9-5F30-8BD2-053866ADBEE9} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} - {4149C8AA-1BE2-5722-8114-8F1928B8B3F0} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} - {27982DF8-303D-5C8C-8595-FEFA9033F98A} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} - {0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} - {E41F4F80-1D92-59D8-9F97-48BF0BBAD093} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} - {E71D7DB0-F816-5D1F-B86A-E01E806D7B12} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {B318A6FB-EBF7-5061-85B2-7542D71D226B} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {5671223D-C370-5DD1-98D6-D27C3CA6A602} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {EE2D63D4-B7CA-5933-BE1F-05AABF69703E} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {A83FA14F-39A9-57EF-A49D-3EC86731F56E} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {AB83BC75-CF32-506D-9B8A-EBBDD2C28A56} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {3E514FD3-4036-51D5-976B-CD18121684BD} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {C10EF177-5C79-5A55-AE28-360DAB3D252C} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {07FD7BF7-7756-5854-8DDB-41478A34BB64} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {508E13BB-305B-58B8-9F2E-E9759874DF0A} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {6778FAEB-4621-54D3-BF75-0FDB99C6751D} = {F8F38682-4EB1-59F7-86C3-5464582178A1} - {8DCF30E6-164B-55D5-A003-0A4D890A4492} = {CC9FE15F-1FAB-5208-8565-F3811229EC86} - {622E0872-E547-5108-92BB-AE38EFB35E5A} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} - {C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} {66839ADE-60D3-54EB-8BAB-304B9B423C25} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} - {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} - {38E42693-FC3C-569F-909A-B24AD24AD1DA} = {622E0872-E547-5108-92BB-AE38EFB35E5A} - {0192EA27-7AE0-5952-B74A-32CF87973F79} = {622E0872-E547-5108-92BB-AE38EFB35E5A} - {E8A66716-1110-5DB7-81B3-8D2F403419D1} = {622E0872-E547-5108-92BB-AE38EFB35E5A} - {980E3CD4-3D1E-55B0-9D46-3944D82B1506} = {622E0872-E547-5108-92BB-AE38EFB35E5A} - {0C89A31F-44DE-59E0-843E-6608861D032B} = {622E0872-E547-5108-92BB-AE38EFB35E5A} - {72F73293-EFAC-5D27-911E-E6752D9E96FB} = {C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7} - {0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52} = {C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7} {F0011F9C-EF86-578B-B25C-DFBFD8B2D137} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} {18566A49-CB0D-5662-AB0E-22DE76024FE9} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} {68D84C0C-5272-5673-B8BF-1D5424885EC8} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} {D36617C5-65AC-578F-8139-DF3D0BD91E55} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} {731333C9-6F41-5AD4-9B59-C3FAEE2A31A0} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} - {4C4A8491-4950-51C3-A134-89DEA080AFCF} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {EF039F88-3A55-5F6F-A7F7-DC91AAF85B82} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {841F79A2-944F-5807-AB6A-1BFF74278DB4} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {501C9952-398B-503E-8C13-B67848D9DBB1} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {30593F8A-492A-5484-BE89-858A29FE5A58} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {80590588-9B02-52C7-B783-F3C6B0A2C023} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {3611A8A7-BCBA-58AC-905C-420D1018D814} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {82ACA55C-69E9-5488-9383-26C6C2FEE1B0} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {5CE0902E-68CA-536E-AAC5-58041DDA1730} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} - {869157C1-588F-531E-BFD3-5D78FD91BC99} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} {BF6F75A1-C290-5F91-9E7E-427932080486} = {9E7391C6-F886-5F94-A0DF-3D42C0688136} - {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} = {9E7391C6-F886-5F94-A0DF-3D42C0688136} {B330A47C-BCA1-5406-B432-56115A665839} = {BF6F75A1-C290-5F91-9E7E-427932080486} {689E3E97-E53C-5A3D-8938-0587D6B21CD1} = {BF6F75A1-C290-5F91-9E7E-427932080486} {7AA23462-E017-562D-9463-8C5B750E9496} = {BF6F75A1-C290-5F91-9E7E-427932080486} {08D3BB86-4F4B-5C8B-B343-2207C0FA03CE} = {BF6F75A1-C290-5F91-9E7E-427932080486} {CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C} = {BF6F75A1-C290-5F91-9E7E-427932080486} - {2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} - {0FAB272B-4502-5AE8-8B93-828EA37BE954} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} - {EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} - {B11C615A-8910-5102-8841-D3AC7BF7D63D} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} - {ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} - {5E92A1DF-1B82-5B8D-B6A0-40B362A7230F} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} - {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} = {A88F9635-0E95-506D-8AE1-670D45B847BD} - {50708606-307A-5BED-AF2D-8FDCB9C05220} = {A88F9635-0E95-506D-8AE1-670D45B847BD} - {6FFD945A-2042-5A65-9021-BF77FB66C3A9} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {C41CA6D1-6D61-5210-B33C-4ED58D96C319} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {28467D65-21AF-5711-8DA3-7EB8C258E8F9} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {A4A8CF8E-6CE7-5384-8756-71838B0DD5E0} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {7E648DEF-9BFA-5E59-B4BD-3518CD63C833} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {EA34E87C-D188-5ED7-A221-01D1677F8657} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {6BD4B5F7-8974-5010-B9F6-53CB24DE6C06} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {95AD2F0E-8D9D-541C-9E08-4DE9C89B867F} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {EA4F9B01-0644-534A-AA8D-81B5E2BD3A31} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} - {82362C0E-5A23-51EC-A539-38DC2C8B18C6} = {50708606-307A-5BED-AF2D-8FDCB9C05220} - {E8A4DA95-0028-56E3-876D-964AB6285B86} = {50708606-307A-5BED-AF2D-8FDCB9C05220} - {E85B9476-FCE0-557B-9598-FD46D59F7846} = {50708606-307A-5BED-AF2D-8FDCB9C05220} - {92253993-2566-5A11-AD3D-4E9E4DFCA693} = {E141BA2D-1051-5995-91A7-7825ACB7513B} - {99D0800D-C3E6-59C7-8E14-7307D9D19FEE} = {E141BA2D-1051-5995-91A7-7825ACB7513B} - {717BBC3C-0048-5728-9246-E54BCF73FDA0} = {92253993-2566-5A11-AD3D-4E9E4DFCA693} - {97284EB9-3307-5358-9D53-516135B9B67E} = {99D0800D-C3E6-59C7-8E14-7307D9D19FEE} - {20D928CF-6F8E-537C-B614-1344AF5F9BBF} = {6FB093EE-13F2-598F-B637-317D30E2418C} - {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} = {6FB093EE-13F2-598F-B637-317D30E2418C} - {A7D8953B-C099-5CF8-BB7F-567171FBE654} = {6FB093EE-13F2-598F-B637-317D30E2418C} - {333F32BE-6053-51D0-8E43-6D4DABA6D01F} = {20D928CF-6F8E-537C-B614-1344AF5F9BBF} - {533F1413-079E-537A-B336-90543B6A8A6D} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} - {CBBFDF59-D233-5847-B08D-590AAC7D0062} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} - {F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} - {E9ABE946-C645-5359-B25E-8BAA18689C44} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} - {B2CCA353-DF3F-57B7-8108-C7BFA1F6553B} = {A7D8953B-C099-5CF8-BB7F-567171FBE654} - {636012BB-3DED-56DD-90FB-4F280DA764BF} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} - {C98C2683-712C-500D-891A-D685874A0600} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} - {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} - {BC7E9C1F-1451-5098-8839-C440DB51E8F7} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} - {CC66F815-F123-53D0-83A3-83137F66DA87} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} - {C1FCD683-A858-5864-8FFC-71F10EBB037C} = {636012BB-3DED-56DD-90FB-4F280DA764BF} - {533E7642-7A19-5148-9961-7AD1C129F6A3} = {636012BB-3DED-56DD-90FB-4F280DA764BF} - {69E38AB5-4754-5EE1-A4F6-4066121380E8} = {C98C2683-712C-500D-891A-D685874A0600} - {C0D3B371-0629-51A6-977E-109DD8C75193} = {C98C2683-712C-500D-891A-D685874A0600} - {ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1} = {C98C2683-712C-500D-891A-D685874A0600} - {0260AD37-54DA-5800-B7D5-1C87AD53DA5E} = {C98C2683-712C-500D-891A-D685874A0600} - {523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A} = {C98C2683-712C-500D-891A-D685874A0600} - {FD6169A5-BA05-532F-9F9C-CA706278E422} = {C98C2683-712C-500D-891A-D685874A0600} - {2A280282-543C-56B1-ABEA-0E104874FAB2} = {C98C2683-712C-500D-891A-D685874A0600} - {898AEFFF-4499-5223-9E5A-51D23E359283} = {C98C2683-712C-500D-891A-D685874A0600} - {B65C2C6B-14A5-59FC-9864-0ACBCA225905} = {C98C2683-712C-500D-891A-D685874A0600} - {518349EC-22EA-5C63-82C9-B62C355ECF06} = {C98C2683-712C-500D-891A-D685874A0600} - {978E57C9-6329-53E6-BCFB-25B61900FF56} = {C98C2683-712C-500D-891A-D685874A0600} - {A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF} = {C98C2683-712C-500D-891A-D685874A0600} - {67D45094-106D-5A42-8908-EE0ED693C316} = {C98C2683-712C-500D-891A-D685874A0600} - {DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A} = {C98C2683-712C-500D-891A-D685874A0600} - {42C7E32A-4A4F-5E14-9A1C-CB6888F42911} = {C98C2683-712C-500D-891A-D685874A0600} - {ECDA362C-2331-5E2A-9004-158FEFC09558} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {54692AE8-46FE-597C-9804-B85115C8D78E} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {A8FFCABE-523B-52AC-B649-F728A13F7809} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {447BFD00-4629-5040-947F-3823CE6F1623} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {B5FDDDD2-F649-5A1E-9D58-79C1B4880129} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {414164E1-1D79-561F-84C8-AF13D2479467} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {0245DE31-CCD7-570B-A349-4A94B6747E7F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {52A514C6-1F14-57DB-8040-8BD90724DF97} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {D57A3684-6938-52E3-A775-A05D1BC55BD9} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {4D19D7C7-33D5-5E40-BD37-F033F6514F8F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {579B038A-DA40-568D-8D94-1819A61A77E4} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {D1CD0F74-629F-5E39-AB12-D0E873B176DF} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {A39CCE1C-8779-5417-AAB7-F7F662947EF7} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {8B0CB7F1-D942-5256-9345-814D7613FB8D} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {8ADF03A1-5837-5C33-80D5-593F684B5D52} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {DCB28552-B244-5382-A01A-7FF9623D5D8F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {4E932374-54C6-5618-B9D0-C9F9586AF142} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {52F0C68B-4733-5B5A-94BC-8610E0044FB5} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {C7849419-3632-5210-B29D-AE643ADF7614} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {0A8F72E8-0678-5DC6-A529-6051825248A2} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {3C0189B8-5C01-5CAF-921B-14534E5AD8F3} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {399C398F-37AC-5E5E-A071-7856B28E2F91} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {FB31FD4A-6D32-5F44-A765-BF97D0992416} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {2E5136AC-787A-5395-9E34-6DF39AD968A7} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {271FC73D-0A74-5833-9710-095BB48BDE36} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {CCD04E7B-4971-5471-B3C3-F1EB37211477} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {6A3E0408-E974-5B1E-8944-9745294CA34F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {BC02D193-613F-532F-98A3-C09FF0CC8116} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} - {42D599AE-EE37-55F8-926D-2918FE8C2FF1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {9365CC66-A669-5ACD-AA12-4991D1DBCD10} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {C3141611-E90D-55A2-819B-A65AEF921787} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {B62F97B5-73F5-5F9C-90F5-F156C52E6424} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {48090851-C268-5625-9967-7E1B364AE5BB} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {A2FA5C54-A698-51F4-BE96-DA5080CA10D1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {E76711C3-B30E-5E2F-8532-0885F4E4992E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {D8D2C86C-A8D2-597F-B9CB-92C6D412752E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {9326B135-DEF9-52CD-B1E9-F90EEEAA40FB} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {823042FD-8786-5959-AA1E-8E225497A91D} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {A182BBDA-2794-538D-87BC-5C9F1A52EC9C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {E6AD0F88-58A6-591B-B81F-55D76970AAC6} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {64ED47CD-60F8-50B0-ABF1-BD3624D3876B} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {86FE95FB-6E35-599C-AD1F-CCA00200BAD2} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {E048277B-0B7F-5912-8190-871D57D0CB36} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {8637D2D5-FCFA-592E-AB09-1134DD444F51} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {FB3C53E3-B728-5E37-9095-E8A62235C779} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {BAE0F14F-67B0-52A8-8A37-DAB9117CAB92} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {BBD9FB80-1740-52D1-8D4A-CBCC23458967} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {6B728CF0-08D7-5495-AF3B-80E03D8E3085} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {A65C327F-9D4B-57DF-A94E-456215B00102} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {8F9AB893-1069-58DE-9213-58FFD149AEE1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {AE390E3E-F95E-54E2-8ED8-ACF460F30C32} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {C11D8D60-CA38-5F92-A741-EB8C8D99C5D2} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {C2903B94-B7B4-525C-AC6A-DE5FBCADE029} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {7581D3D4-8C62-59F8-A085-143AA9DAFCB7} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {FB660FD7-F8C1-5FE1-85E7-066B22F23381} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {8A7FC726-0271-514B-ABA4-EA48DDE93B8C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {01D6CF66-7B69-5772-9811-C3BF554793C9} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {C4E024A9-91DE-5071-86FB-25B350B6D78E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {58C665E2-C3A7-5E69-873D-B6FEC96FAB8C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {AF70972B-54C3-5DEC-B005-B1CF4B84E14D} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {A284375A-B4E0-50C5-B3C0-766ECBF70CD1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {CBEC642B-A4B3-5B3E-A5EF-64993811FDC9} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {C6BBD0A5-C811-50A3-A614-C535E7D0AF50} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {48256054-736E-5597-995F-BAF166998337} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {B4C782D3-CF67-5A0F-9E60-757405CF4BEB} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {64756370-8E80-5638-B0F3-5EACFBB8FD64} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {251DA02D-00DA-5211-BD79-AC28E18F326C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {C7551073-07A8-58AA-BCB0-5CB79FC2D109} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {06187BD6-754B-529E-BFF1-CA5D0FA4D5D1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {17508C6F-FADD-5BCE-B47B-0A78F4AA437E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {5545C1F3-B963-5FAA-ACD7-9F57D4470F19} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} - {492926FA-134A-5BF8-9148-97D9A291E3C5} = {CC66F815-F123-53D0-83A3-83137F66DA87} - {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} - {1BB68895-DA5E-5335-AB62-7C7C7F599205} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} - {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} - {2DD3A51E-C54C-5B89-9E80-6725631D7C98} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} - {F82ACF7C-966D-5C85-AB8C-637206C2495D} = {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} - {C0BA2B16-7593-55EF-9368-CF06C1F94379} = {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} - {CE252920-E8A0-5175-B211-CD71EABCFC75} = {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} - {5970CA22-EC4F-5D2F-906D-8B5B934E2547} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} - {2F6D6D31-28AC-5022-BD72-61F153062B6C} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} - {E7CD5254-7D73-585E-94B8-E70C281423F1} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} - {BB1F45C7-44CB-516D-A888-4E1EAEABF44B} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} - {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {769E6552-E895-5951-8C67-86B251A6036B} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {92336BE4-5E46-5C13-B200-69A80999182B} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {7531EC3D-6ADD-5551-ADC2-A283A56028FF} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {C270C125-2FCB-5F43-A1B0-EE27079662BB} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {23A27A2A-2C8E-5C38-9F17-06FCDD87C147} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {E2AC4478-3191-5B4E-A0EB-222156F9C2F0} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} - {38127116-0764-53E6-B5B5-2BA0CA0B7F91} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {7701FD94-6296-5CD5-8E7B-F7CAEA02052C} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {A07964A7-387D-587F-9507-5E89354A965A} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {69247914-5C25-5B86-8DA2-93F0C41EC3D2} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {67F2A597-9CF3-554A-89AF-A527D41D8831} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {180A6CFD-B8CE-56A1-AFE8-030C06C67438} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} - {6853411B-3FF4-5446-805B-D24664BF9822} = {75A135A6-2344-5F0A-9314-4DF08380E567} - {ECFC702B-9395-5F70-A935-FFA7CD63F36D} = {75A135A6-2344-5F0A-9314-4DF08380E567} - {AEAA70CB-616D-57FA-BB16-65807FA8D160} = {75A135A6-2344-5F0A-9314-4DF08380E567} - {DB13510A-AFA8-55AA-9918-99B7BCF13AA9} = {75A135A6-2344-5F0A-9314-4DF08380E567} - {69A89A48-4FF1-56DD-95F4-B81DBAADACDA} = {6853411B-3FF4-5446-805B-D24664BF9822} - {22C6842B-7851-510C-9DBB-675188E2B020} = {6853411B-3FF4-5446-805B-D24664BF9822} - {D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9} = {6853411B-3FF4-5446-805B-D24664BF9822} - {5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8} = {ECFC702B-9395-5F70-A935-FFA7CD63F36D} - {027F58E2-96C8-55C3-B22B-1EC5B0621106} = {AEAA70CB-616D-57FA-BB16-65807FA8D160} - {A973EE14-705D-555F-B115-B97D5ADAEA8D} = {DB13510A-AFA8-55AA-9918-99B7BCF13AA9} - {166419DF-16BC-5CC6-9634-6AD9517AA816} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} - {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} - {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} - {BBEB3971-7F5F-5733-A5B6-4BFDE6D8FD39} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} - {3662068D-D45B-5BB0-8547-E431434F6A31} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} - {88C1DF3F-74F3-507F-B63C-EA54EA56C95C} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {F931F697-CC40-55BB-999E-BAA4302595E5} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {BD92B2EA-2C70-514D-B74F-76AD834A0AA4} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {309B5313-C885-5629-B9A9-674A532CC498} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {C0D986EF-15F8-588D-86C8-574B9978D0D1} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {80686466-E848-57CD-99D9-644EEA055741} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {D906F4BC-54A4-567F-8DD9-4A00C6DC3F75} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {48EAC4C2-5B05-5350-83C8-5F25DC7632D5} = {166419DF-16BC-5CC6-9634-6AD9517AA816} - {41F6B7F1-7767-5A85-B9B5-C70D69F80000} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {BA5C61B1-EFF0-5FD7-A92F-4E464C16056B} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {1CC50534-78D2-5DC6-9DCF-8D64532260F8} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {7DED5634-FD01-5854-96BA-C3F636FB6B10} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {3083A5E6-84E0-57FA-8F5F-ECA046992707} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {B70F4C3D-0BF7-59B7-9627-4EF8E7247A17} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {FD121908-49E7-5B7B-B8E6-A4FEB65D59DA} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {8929D374-4010-5CAC-8EC0-693194B7216E} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} - {21342480-FC88-5789-B7B2-5D9AC7ED18F6} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {34D26AF7-F7C3-5D31-8E45-D545DE7B56A9} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {56414F70-A7F6-55C1-B219-DABC8345E9EE} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {486EA70D-9F0F-5259-B908-580A60863C5A} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {21950636-1E41-520C-978D-6C52417F49CB} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {A3045438-648F-5E60-974C-8A6593165CD7} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {393B31FC-1469-5DB5-8B89-C6E9AC69A058} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {3E4B26B0-B184-5184-B086-618F362D3EA8} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {74961AF8-0434-5863-B516-179CBD4DD354} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {D2C87350-D8EE-5774-9D07-5DB161C1CAFA} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {46F08BCB-C218-5A58-8949-E7CD119BCAB6} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {9654C643-AD78-586B-819D-8C081576D60C} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {ADF02308-4349-5280-9E05-75A6C619E0EC} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {3B4D6BEF-0934-5981-B776-AA13BE7FD25E} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {B335DFD5-EAF4-5083-9B37-0435F93396B3} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {986F3041-3E8A-52E0-A965-92243093D1C6} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {8BD98D23-C7B0-566E-8843-17BE8E005B6F} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {89B612AB-821C-5707-831E-CF01A24E0FBA} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} - {B79F5D06-CC07-50E0-9916-CD91E53BCE4F} = {BBEB3971-7F5F-5733-A5B6-4BFDE6D8FD39} - {D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E} = {3662068D-D45B-5BB0-8547-E431434F6A31} - {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} - {80B4238D-14D4-53B9-8DDE-5AAF6963B6D0} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} - {CA8130F6-DB6A-55F8-A656-DDDEA0B1555A} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} - {ABFB61E3-5DEC-5E1A-BAAC-D5BF448B7C65} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} - {8CE426C9-853D-5FE0-A939-954D7787890A} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} - {DF324128-78D3-54C8-AAE0-852EA18A4175} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} - {3B0B6785-6E80-5615-9076-F10DD4ED79FC} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} - {9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} - {F11FF9FF-2A02-5470-93B8-75A8AB307992} = {80B4238D-14D4-53B9-8DDE-5AAF6963B6D0} - {14E66575-1C2C-5223-9286-BE65FD8FCD6E} = {80B4238D-14D4-53B9-8DDE-5AAF6963B6D0} - {17161A8D-0F28-5998-9C38-A09E8A0DFECD} = {CA8130F6-DB6A-55F8-A656-DDDEA0B1555A} - {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136} = {ABFB61E3-5DEC-5E1A-BAAC-D5BF448B7C65} - {D613FC8A-C7D0-5159-BD5E-DD2A912D4430} = {11942B47-88E5-5886-AAAD-FA4DCC461D2A} - {779F3EC3-3CCC-5B43-87B9-5C67C5B9FBAD} = {11942B47-88E5-5886-AAAD-FA4DCC461D2A} - {85B39AEB-D264-59E3-AE46-C6E09D60816F} = {D613FC8A-C7D0-5159-BD5E-DD2A912D4430} - {B22104F2-C574-5E22-ACE9-5E218FCF4ED6} = {D613FC8A-C7D0-5159-BD5E-DD2A912D4430} - {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD} = {779F3EC3-3CCC-5B43-87B9-5C67C5B9FBAD} - {345A6909-395A-5FAB-8832-2941AFB684FE} = {FD98BA86-C18F-5E6F-BDF5-47D53892B0E4} - {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} = {FD98BA86-C18F-5E6F-BDF5-47D53892B0E4} - {E04423CA-6046-55AF-92F1-C8492E44A1F4} = {345A6909-395A-5FAB-8832-2941AFB684FE} - {500252B3-468C-5303-B06E-C961A475C519} = {345A6909-395A-5FAB-8832-2941AFB684FE} - {2004E176-092C-5C14-A7F0-11CC8E383B5C} = {345A6909-395A-5FAB-8832-2941AFB684FE} - {F064B0DB-FE3A-58F4-8E8C-904C04749A55} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} - {5618B67A-A525-5958-8001-9AB7A7EB6412} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} - {D382EF88-1144-5CF4-B768-5A124EB8CF0A} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} - {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} - {9959D246-3C94-5F38-9D11-E30E754AFDDB} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} - {303F85EF-F67E-57CC-9BDD-2381265243FE} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} - {6F0F4397-95CB-56A9-939E-6731390C383E} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} - {A1795401-DAF5-5F44-B3F6-173F7DF8897F} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} - {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} - {70543E0A-0F3A-5954-9C13-3972FA97737A} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} - {922A7463-1237-5064-A5E6-4B583E2D53A8} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} - {DA8F7D8C-2022-51C1-9235-1B3613EB703D} = {9959D246-3C94-5F38-9D11-E30E754AFDDB} - {D2B3DDE0-F44F-5B57-9D3E-679E18FC1032} = {9959D246-3C94-5F38-9D11-E30E754AFDDB} - {600F0F8D-D86F-5CA6-B4E6-7DFB6860981E} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {9A62D7DD-B9F1-5CDD-96D3-07573296F939} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {B9B66624-23D7-53C7-B1F5-B1476F5435F2} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {087B1096-EE56-5337-81C4-3655FEC38AAB} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {394D1A61-BA24-529C-B049-B377DAB866CF} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {5B598FA9-5AE8-566D-B6D8-C87792622114} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {5C964413-BA49-5580-A781-A020335C9301} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {FF74E087-9D87-5321-B99B-70FE364B9422} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {8CC218FA-816B-5D5F-9BDD-19F88444B22B} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {6B99DEB6-D5DF-5BF1-A9A4-228A757D4836} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {3E780079-10D2-5AD2-95FC-98E46718B231} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {C3B48707-75F7-56DD-9FBD-65DE8D53353B} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {A2A04CF8-28FC-51DB-8BC4-00440822348F} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {3F03AECF-1508-5F69-97C3-C2DF3A01B7E1} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {68D37855-2734-5614-AFF7-39D2FAD17795} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {772A91FD-98F3-5EA2-9CB4-E3088C839D32} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {9B85AD15-32BB-5A24-8243-52FD11033E1B} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {222C4ED7-2DD8-5F51-A249-323B1F414AE6} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {A3D24CDD-0855-5F57-989B-5D8C6CF3570D} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {4A1395E2-E03E-542C-B190-BDAA205A0E1F} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {3C4B8D17-0B69-571F-9B6C-6E945937A3B3} = {303F85EF-F67E-57CC-9BDD-2381265243FE} - {E648086E-E39B-5B18-BFDA-E597D04C536A} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {1D75EF57-0B94-54F5-9FCB-16A888141420} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {8A42C228-E80F-5DA1-A752-29F9C7D7FDDC} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {683D176E-ECB8-5F5D-AC6E-E2E3E33526DB} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {5C0BB750-025E-5E1D-B717-B871883AAFDE} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {F03873D8-5506-5461-AF91-247DEF04D700} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {76D66413-B838-5648-BF18-B87DD5084BFC} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {02D3276B-BB16-536D-BF6C-CD9067EE2F27} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {A8F451BE-6076-5D9D-BDF9-FF270ED0391B} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {65906110-4508-5D7A-A870-2225135CA2AB} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {836920D9-3DC3-5926-8ACF-CF41CD59EDB1} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {48BCAF76-EDC4-570D-98C2-032DB39D8662} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {02568C86-83B4-588D-9EA2-58ABAD29DE27} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {034AD4BC-E7E5-5F87-8A30-12D71BFF63E8} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {32CD344F-484F-59C3-AC24-3FD9806DD3D6} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {E8B300BA-17CC-5884-97DB-C53176BD92FA} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {B53D2725-B209-56C2-854A-733AA23791BA} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {303C5589-5F40-5AB6-AC14-B74330F4ABCD} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {ACC984E9-DD35-50E3-9DEE-4D31E3905798} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {B0455206-6836-5CCC-981F-DE01652F719E} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {378D4FEB-0052-5910-A0C6-F23FFAFF9622} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {1772BDC5-1285-5297-A93D-F57692363BB2} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {20030AD8-C9FC-5CDA-BA0E-DE13E792A314} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {787405E2-7F5B-5CC2-821E-A54AF8CE3843} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {468F9192-74B5-5791-807B-A0507E99AE1F} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {02A180E2-6690-5EA6-9AD4-4A9616DC1489} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {98DBA04A-9F13-5740-8713-48A21F41D158} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {059A8E08-8A8E-5766-9556-C3E18707A316} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {A0EF31BA-A294-5B97-BAAA-84737FFB0441} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {49F92D69-4B38-5502-8856-FFD90DEB4ED9} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {BA04E8CF-051D-5A9C-B866-AB9470319426} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {3FBC55A5-8773-5BDC-BF58-45FAC2950D89} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {33BBE42C-6D04-56C2-8A5D-736F670198CE} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {B3A40257-0096-553A-BDDB-ECD222F47D98} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {6CEE9751-CA80-5B25-B7D3-DCB24085450D} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {D1504F57-82C2-5BE5-9524-B3371BC26F82} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {9B29BB87-FEF3-5EF9-8D64-D005408705EC} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {D67441E5-0211-563B-A29E-7C1A0C815A7C} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {A5516E04-C25E-574B-BDA9-25F17B89EA72} = {6F0F4397-95CB-56A9-939E-6731390C383E} - {85D772C5-941E-54D2-A07F-CCD85DE0F37F} = {A1795401-DAF5-5F44-B3F6-173F7DF8897F} - {046A3473-60D2-5BD4-ACFC-5051CAC08296} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {690D6500-40C1-57CF-80DF-BCC788C0F09D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {B631B34A-610F-5F25-A68B-8E2EB93D813F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {A89D579D-119A-512E-ACEB-00C66A99E871} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {C0D1E717-51E3-578B-BEDB-F9A02F54042C} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {04CEAD38-EF61-56A0-A507-72B12606767F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {CC86C30A-0EEB-594F-9680-DB32F10ED128} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {931FAFFC-095E-59B7-9E93-EFAA06CD10EB} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {55593DA0-334B-58C8-BD12-32BD2362A384} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {34A4AD39-111F-5D02-83ED-6FB0B71B3539} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {3A446391-6537-5C7E-885D-A60B8C6402AD} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {0A18583B-3913-5C71-900C-8BDB320D6461} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {6064B3DA-2322-5B7E-B27D-4D0E976114A7} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {254361C7-78CF-5510-8D5B-DC1AD1370726} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {4990948A-CB1D-54FE-8C2E-AA1D0D275B22} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {9D1A020C-0800-5A7C-85DF-4C04A922894B} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {E0341225-8AC0-5A3D-90FA-253A39188C59} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {63AA5DD3-66EC-5770-A2AF-73214634BE74} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {5422FC92-32F8-5B7C-8808-F9F3B01096BA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {239AEE8E-4762-5DC0-AE89-99C559DC3C0C} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {940ADFE2-7115-5A6B-8083-E6E9959C5126} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {C2F4CEBC-0FD0-5711-977B-D15B63B6283F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {D6C8C992-6C92-5B42-8C16-DD8579A33A50} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {914E3DA8-3A2A-541B-B212-E54E5B9E5FF9} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {538897D7-98D3-5E80-BB85-2ADD354A6DAD} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {0735AB65-C84E-5173-AA33-34D053A2206F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {DC026D6C-B3C7-563C-9686-598397B646F0} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {144905E9-FB74-5478-858D-214E98611302} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {138E4BA5-CB08-5034-81E8-77CE875D2338} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {7E440D5A-47CC-5DEA-B24F-74FCEA985B4A} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {E6BAF476-7A8E-5D90-85E5-40C6F3381750} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {39F576C5-7241-5E33-9F70-6A3AC310AA9A} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {FF70148A-101D-5C79-8A6B-C82FEB1D0F2A} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {92FB53E1-32EB-5F4E-833E-35A1CD62B32D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {BCC4F860-588E-5D77-8632-FD3F433875BA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {611D6EF5-47DD-5683-80D1-D127FE684FBE} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {0DCAB8B4-4D58-521B-B7CE-F931660BC02D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {928428D2-2BD5-59AB-8E56-7969B8A75B85} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {96C669DB-9F4A-5302-85BE-5D9EF48D64AA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {47513358-7F52-52B0-8A3A-F6F7083A1357} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} - {3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5} = {70543E0A-0F3A-5954-9C13-3972FA97737A} - {41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB} = {70543E0A-0F3A-5954-9C13-3972FA97737A} - {865BED4F-1D52-5ECE-B19E-A4EA8177C690} = {70543E0A-0F3A-5954-9C13-3972FA97737A} - {0C29ECF8-B816-58C1-8A0E-D2663C91D259} = {70543E0A-0F3A-5954-9C13-3972FA97737A} - {A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD} = {70543E0A-0F3A-5954-9C13-3972FA97737A} - {79CFA9D7-7759-5EA5-9A68-735E4CF304FF} = {922A7463-1237-5064-A5E6-4B583E2D53A8} - {A43B40D5-0F1B-544B-B621-C2A1D4292D05} = {922A7463-1237-5064-A5E6-4B583E2D53A8} - {4B422E10-2700-5740-8507-A9BA717DFF7E} = {922A7463-1237-5064-A5E6-4B583E2D53A8} - {693FBCDA-F357-5B46-93E4-1203E1912FEA} = {922A7463-1237-5064-A5E6-4B583E2D53A8} - {1D421D62-76ED-5076-A4DD-48E3D13232C2} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} - {47CA7D44-20AE-5238-AB1F-ED7382F2F034} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} - {32554071-B945-5653-85C6-007D3DD4E6AC} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} - {3016D8EA-2B83-581B-B0EE-30AB6CA8A1D5} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} - {9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367} = {1D421D62-76ED-5076-A4DD-48E3D13232C2} - {FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5} = {1D421D62-76ED-5076-A4DD-48E3D13232C2} - {245C2445-685D-5F18-8557-0C3266C41358} = {1D421D62-76ED-5076-A4DD-48E3D13232C2} - {8AE5CA1F-85CD-5BCF-A406-15F68FDDA875} = {47CA7D44-20AE-5238-AB1F-ED7382F2F034} - {D7A538CE-DDAB-5F29-A55D-204C9BD1A157} = {32554071-B945-5653-85C6-007D3DD4E6AC} - {ABE22056-D6B6-5B41-812A-8DCEC9812B8E} = {32554071-B945-5653-85C6-007D3DD4E6AC} - {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3} = {32554071-B945-5653-85C6-007D3DD4E6AC} - {59DCF5F1-F87C-5A73-A251-45C4D98D8F34} = {3016D8EA-2B83-581B-B0EE-30AB6CA8A1D5} - {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} = {F689A8D5-683B-5813-8857-AD0EE10504C0} - {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} = {F689A8D5-683B-5813-8857-AD0EE10504C0} - {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} = {F689A8D5-683B-5813-8857-AD0EE10504C0} - {3461BB68-1EB2-5BD8-9FA4-3217CC1E7394} = {F689A8D5-683B-5813-8857-AD0EE10504C0} - {999AFB4F-C686-5BBF-8CA0-38119694DB9D} = {F689A8D5-683B-5813-8857-AD0EE10504C0} - {640B22EB-F7DC-57AF-9E6E-1BDD18810064} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} - {68B2E31B-A427-52C6-A3A6-8902A21A9D04} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} - {6E26EDF7-C6C4-5B4D-A8D5-E69794986F58} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} - {1763B240-97A6-5710-A7A6-8A1F63311597} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} - {F23B9764-280A-5720-8B5B-B227092A24A9} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} - {40426D69-90A0-599F-8113-BAAA98714E62} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} - {41671DFA-9B15-574B-9B82-45CA2A254269} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} - {8119F319-6F44-51B0-893E-24B214690A37} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} - {8581A797-6D1A-5605-B9C6-4EB8CC349425} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} - {7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} - {97545321-6315-574C-94EA-C4D756A323EE} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {7F384D30-79DA-55EF-AA3F-5C433126B646} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {BCD434BC-C9DE-5291-A5C8-AD32891A7401} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {5881D3BD-529E-5092-8640-1CE0844FE0FB} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {2512F361-2C0C-56B4-9D93-7DBBBF55815E} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {78400F00-37A1-574C-8391-3CFA7E014B4D} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {75D9C1EF-60D4-51E9-A0F4-FBE6632AF791} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {4FB42ADD-4BAB-5C19-BD4E-E39F95348600} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {7EE3111E-53B5-5EE7-99FB-230A9B4EFD50} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} - {A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25} = {3461BB68-1EB2-5BD8-9FA4-3217CC1E7394} - {A15C2434-BBA5-540A-B863-20A347A3F160} = {999AFB4F-C686-5BBF-8CA0-38119694DB9D} - {75227D73-DF27-5598-903B-6EF26AF83090} = {82E5585F-AF53-50FD-8805-E8F196A74A69} - {AC257696-D6A2-51B5-A07B-195CC24F374C} = {82E5585F-AF53-50FD-8805-E8F196A74A69} - {FC7268F9-BC0E-5757-8509-3E7AC5DB26C6} = {82E5585F-AF53-50FD-8805-E8F196A74A69} - {CDE07C59-073B-55DD-B462-67D0DCD6E4C8} = {82E5585F-AF53-50FD-8805-E8F196A74A69} - {E11558C3-4D2D-5F2D-A9F0-16EE01291D2B} = {82E5585F-AF53-50FD-8805-E8F196A74A69} - {A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D} = {75227D73-DF27-5598-903B-6EF26AF83090} - {F8564409-54F7-59AA-8E2A-E9022839ED4F} = {75227D73-DF27-5598-903B-6EF26AF83090} - {E6887A02-800D-5F8B-8623-C9C052F6A690} = {AC257696-D6A2-51B5-A07B-195CC24F374C} - {721DD473-5A17-5E0D-B0CA-B2F91A3333EB} = {FC7268F9-BC0E-5757-8509-3E7AC5DB26C6} - {AA0D3C06-0E6C-5671-BBEF-C5594F869378} = {CDE07C59-073B-55DD-B462-67D0DCD6E4C8} - {6584A0EB-82AE-59E7-8023-3261AF88217D} = {E11558C3-4D2D-5F2D-A9F0-16EE01291D2B} - {B03718E1-8606-5503-B4AC-DB966B39847B} = {9F9EC6D6-3A07-5F93-90E8-EA77393FEA02} - {11468ECE-5AA1-5549-90C3-16833B9E9AFE} = {9F9EC6D6-3A07-5F93-90E8-EA77393FEA02} - {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} = {9F9EC6D6-3A07-5F93-90E8-EA77393FEA02} - {8010A35A-7CDE-5521-9D64-4C97F0DA3E93} = {B03718E1-8606-5503-B4AC-DB966B39847B} - {E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D} = {B03718E1-8606-5503-B4AC-DB966B39847B} - {2135DC08-5B28-591C-A43B-445D7BB98303} = {B03718E1-8606-5503-B4AC-DB966B39847B} - {E9610063-C8DB-589B-A817-CC06CE65ACC4} = {B03718E1-8606-5503-B4AC-DB966B39847B} - {B81E7A3D-0F57-59A9-9EFF-E940745C9B90} = {B03718E1-8606-5503-B4AC-DB966B39847B} - {41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35} = {B03718E1-8606-5503-B4AC-DB966B39847B} - {BBA41FC3-A097-5751-9830-B028CB357E58} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} - {F6AE6B49-960C-555C-90BF-38A2E03EF27A} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} - {DEA58CAE-08AD-5376-BE6F-883B85760DD7} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} - {4B27536C-E23B-5808-ABAE-BC93F0F7B109} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} - {4E87FA32-5495-54BA-B5FC-383F20ABA094} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} - {4EF8E25B-4A19-5D64-8F95-40D86B51E453} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} - {9ECD2194-4E14-5CCD-9AA0-5279B464EF4A} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {2EF64916-E58F-5155-8A3D-735E7A019BDF} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {9E95BC40-F0B0-5362-9694-5013FAFE83C5} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {4767D489-E3AF-5C99-825F-6C90CE550264} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {0EFA741A-DAB8-5C34-BCF6-86000CC31530} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {A4790683-9F0A-5B2A-806F-797619E2A98A} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {3B765847-031F-5291-AEB9-E8BB59EF1B53} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {F96E3D04-4D69-575F-9347-8AC47337D471} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {04A2ACE6-20E8-5707-87BD-F024FAD7DED0} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} - {8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B} = {2568E093-797A-5F9B-A22F-02FF7596A39C} - {CFB5CB09-1260-59F2-8B88-9725F2EDF976} = {2568E093-797A-5F9B-A22F-02FF7596A39C} - {AFB1DDA6-465A-5BFA-8794-07FCB8B73B2B} = {2568E093-797A-5F9B-A22F-02FF7596A39C} - {55C23781-1A56-59FF-9AF3-4BA07A0992CC} = {8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B} - {9C2C091A-1607-5418-B5A5-20A86652835B} = {8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B} - {58C44599-F7B5-5911-8B0B-66C4FCB027A2} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} - {FA7943CD-23FC-58EE-BBFE-965758D362C6} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} - {211A70CE-8B98-55B1-9D48-EADD5F34C513} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} - {4144AED2-D212-5A1B-9849-97F97A8760E3} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} - {77ABEF57-B941-5243-A695-AA8B499FE91F} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} - {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D} = {AFB1DDA6-465A-5BFA-8794-07FCB8B73B2B} - {A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32} = {1EB7F9FA-F752-561D-AEAC-2E663F7F0C53} - {BC5D3395-B74D-593F-82D4-6BA4D40F3A69} = {1EB7F9FA-F752-561D-AEAC-2E663F7F0C53} - {0661F0EE-F6A1-5305-86BD-42849137BDBF} = {A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32} - {A2D930E0-FCEC-5984-89FA-1B6D2046C7A7} = {A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32} - {FC7A23D5-6A5F-5274-B360-95393EAB244B} = {BC5D3395-B74D-593F-82D4-6BA4D40F3A69} - {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66} = {BC5D3395-B74D-593F-82D4-6BA4D40F3A69} - {9A4132EA-BE40-53D0-B17B-7EF2995867F0} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {26F61757-EF18-5045-947E-EA076772668A} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {20646475-6101-5739-AEAD-D3CB508D382C} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {A2E3F297-D1D2-5283-81B5-7E83B6B297F9} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {8EDEFD20-4914-53A8-88B3-B5FEB7B9D7A0} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {85703812-08C9-50E6-B355-4F26ED7810F1} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} - {12428388-51C9-5FEA-9EB5-ECF205FD1C90} = {9A4132EA-BE40-53D0-B17B-7EF2995867F0} - {F208351E-5372-53EF-ABBF-C349C32B33E4} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} - {C061A376-5BF3-58B4-B301-28ABC6DE0A3B} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} - {BFCBC834-E9E7-5937-AC74-596459428D2C} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} - {A9660377-E43A-5514-94B8-813B40D34E21} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} - {5A8FFD16-30ED-55A8-A69E-37877E540442} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} - {8C747A2A-F2D2-57C3-9777-C32EFB6BA17A} = {26F61757-EF18-5045-947E-EA076772668A} - {03D045E7-F7AB-59EE-B53D-6B890AF278FB} = {20646475-6101-5739-AEAD-D3CB508D382C} - {174D2124-12A2-5620-964F-6D2737DA5DEA} = {20646475-6101-5739-AEAD-D3CB508D382C} - {9A6818AB-29A5-57B5-9958-B5F93B421964} = {20646475-6101-5739-AEAD-D3CB508D382C} - {467C42CD-ED69-5E21-BFF3-F35BAE24E9AF} = {20646475-6101-5739-AEAD-D3CB508D382C} - {03262415-2C11-5B62-84A7-33FC321D43AF} = {20646475-6101-5739-AEAD-D3CB508D382C} - {75991E1E-7D74-53B5-927C-D639337202C4} = {20646475-6101-5739-AEAD-D3CB508D382C} - {D24D7552-BE3F-58CD-A458-9BFA2403C696} = {20646475-6101-5739-AEAD-D3CB508D382C} - {2BC14382-5C69-528B-9FCE-488CE3F8143E} = {20646475-6101-5739-AEAD-D3CB508D382C} - {E7802557-EEB2-53EB-98C3-62A1E0DCC4BC} = {20646475-6101-5739-AEAD-D3CB508D382C} - {FBF45F4E-D545-5897-8A02-428C51A3C4A0} = {20646475-6101-5739-AEAD-D3CB508D382C} - {D5C3A0AF-A331-5C5F-AC21-3982A3BD3066} = {20646475-6101-5739-AEAD-D3CB508D382C} - {69A56760-817A-5A9C-A52E-764FB0194071} = {20646475-6101-5739-AEAD-D3CB508D382C} - {4A591A91-072D-5332-84B5-40C52406510D} = {20646475-6101-5739-AEAD-D3CB508D382C} - {CF956202-62CB-5340-BED9-0AB42E99E48D} = {20646475-6101-5739-AEAD-D3CB508D382C} - {441BAC38-A865-559B-9310-02CB5D417209} = {20646475-6101-5739-AEAD-D3CB508D382C} - {BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9} = {20646475-6101-5739-AEAD-D3CB508D382C} - {36964679-F5CA-57C8-A7C7-98FF38998644} = {20646475-6101-5739-AEAD-D3CB508D382C} - {DE8969D1-E305-54AD-A3B7-8AF897C19503} = {20646475-6101-5739-AEAD-D3CB508D382C} - {FF3858C2-487C-5056-9BE1-753096E3828C} = {20646475-6101-5739-AEAD-D3CB508D382C} - {284574B8-F4BF-5711-81F6-43A277F6E374} = {20646475-6101-5739-AEAD-D3CB508D382C} - {4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5} = {20646475-6101-5739-AEAD-D3CB508D382C} - {C981E0FC-E546-5B95-8995-2296C4BCCC11} = {20646475-6101-5739-AEAD-D3CB508D382C} - {B7303B10-C5BF-5710-9FB6-FCE79C270488} = {20646475-6101-5739-AEAD-D3CB508D382C} - {40092818-83F9-54F5-9333-083731DC7DB4} = {20646475-6101-5739-AEAD-D3CB508D382C} - {5D2B450D-B34A-575D-BAFB-8DFA29CDCE74} = {20646475-6101-5739-AEAD-D3CB508D382C} - {FD53E7DE-2531-5E41-9D24-93D869813695} = {20646475-6101-5739-AEAD-D3CB508D382C} - {166B5460-FFAB-5469-B256-147CA8671861} = {20646475-6101-5739-AEAD-D3CB508D382C} - {D7EB2001-6897-501F-BF6C-27F849B95430} = {20646475-6101-5739-AEAD-D3CB508D382C} - {F01FB705-B831-5A3A-91A2-476EAE8EE65B} = {20646475-6101-5739-AEAD-D3CB508D382C} - {029ADACB-AADD-5FF1-A1C6-42B2542E4877} = {20646475-6101-5739-AEAD-D3CB508D382C} - {9B1B44EA-214D-5749-88D7-28EC8649B233} = {20646475-6101-5739-AEAD-D3CB508D382C} - {18DE5026-FED1-5636-8F78-7F1B3A2AFEFB} = {20646475-6101-5739-AEAD-D3CB508D382C} - {4C4DF88D-A249-58F2-B98D-00D5E2FC33BA} = {20646475-6101-5739-AEAD-D3CB508D382C} - {226B12A0-1EED-5CC5-974D-E9524E924794} = {20646475-6101-5739-AEAD-D3CB508D382C} - {E31AD5B9-66BC-5217-91BE-C4030ADBA7EF} = {20646475-6101-5739-AEAD-D3CB508D382C} - {4B5D871F-9EBA-5D7C-A9EE-065E22B95894} = {20646475-6101-5739-AEAD-D3CB508D382C} - {F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE} = {20646475-6101-5739-AEAD-D3CB508D382C} - {6EB80E87-172B-5A81-A0E2-932E1AC9615C} = {20646475-6101-5739-AEAD-D3CB508D382C} - {89B055A6-8ACA-5E86-94FB-0FD369790B47} = {20646475-6101-5739-AEAD-D3CB508D382C} - {43E42CDA-84FC-5BB8-B211-4D3E1492D39A} = {20646475-6101-5739-AEAD-D3CB508D382C} - {230D7EA8-20DC-583F-8832-63E54E42E3D2} = {20646475-6101-5739-AEAD-D3CB508D382C} - {2BC11415-1862-50AC-8CBA-0BA29C69E6C6} = {20646475-6101-5739-AEAD-D3CB508D382C} - {AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5} = {20646475-6101-5739-AEAD-D3CB508D382C} - {D37B67AE-68F6-5C6D-AD35-738F8C7D5851} = {20646475-6101-5739-AEAD-D3CB508D382C} - {4DF1E180-AA42-5F22-9664-F87FAEAD59C1} = {20646475-6101-5739-AEAD-D3CB508D382C} - {B8BECE74-88A9-53B0-B457-3C2CF0FCEE01} = {20646475-6101-5739-AEAD-D3CB508D382C} - {A81F1C23-6F7B-5AF1-BC61-312CF1881CFE} = {20646475-6101-5739-AEAD-D3CB508D382C} - {CF6E60E9-000E-51D4-9C67-FE84E08AF277} = {A2E3F297-D1D2-5283-81B5-7E83B6B297F9} - {9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {06B9914A-7331-579B-AD4F-82B3D95B5C4E} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {64305515-BFD3-5627-A917-B45C4BFA08DD} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {87CF5359-648E-5F59-829B-4C61573D02DF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {542F28D0-D20F-5571-AE65-83CEA16B299D} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {545AD377-070A-5001-944C-76418FB7F3FF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {D24E78F3-72F2-5A01-A525-7D9A8F4826F4} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {24A017D2-7BD5-5F4C-8B67-58B56129C4CB} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {10FC6B5B-C9CE-5E8B-9648-D85098F70A62} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {71429279-82DC-51EC-834A-F3C52A19ECE6} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {4B521542-1CC6-5546-9322-8FE869AC7904} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {48C8ED44-9E61-5C72-B912-987F6B4D3D4F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {010D92FC-6304-5FA0-81CD-1AB19BA2F832} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {28923049-DC26-55D4-8E74-8DABCABB6518} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {C2D640E1-47EF-596C-A258-AE5E93A7578C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {DF05A63F-D283-5C81-B7C7-D659CBED0695} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {047FADEF-DBAF-5D43-A2D6-5C68801894E6} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {D77582C2-0CEF-5ED8-8366-5A28492D3C88} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {436C0FB7-F3E3-518B-8F65-CF760E875DD5} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {CC4D16A5-AB4A-5877-B0E5-25928D627933} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {2ACE0837-E738-59B6-9728-1DA6D1A22B08} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {010E1EE1-EC22-55A0-B1E8-86B24B584B95} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {1848E192-CC0F-5736-B68C-D71E6D575301} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {CA77C3B9-4D34-506E-B823-D88353261C77} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {0D8AAAB2-669C-594E-8782-B105F7A3D076} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {24A77816-86CF-5958-8005-511C82A5DE13} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {265D18F4-7D43-5989-BC89-06A0BCAA974F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {CF1DD579-8832-5D10-A776-BEA22477C9E9} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {9DD2C1F3-D4B6-530E-907B-BFA80085311C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {D2F4B045-45B9-573C-8EA7-F639FADF6518} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {891EDEAF-E530-5CB1-B459-E526E563AF44} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {7D80E495-7DE6-5093-AC05-650991082D96} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {434EB740-8EB9-56AA-B7C7-779322245497} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {BD4C1CC3-8493-5647-BDC9-9A9721595549} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {F5D74715-01BD-530A-9234-2C8E8327CA7C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {5DB2DAD4-749D-5958-85A5-D416773EC7AD} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {2C644E8C-5731-566A-9208-25FF724E88CF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {FBAA3D74-4A5F-5F10-877F-C4AEDDD69656} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {D4DC4627-27B2-5162-BF64-821B7AD8837C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {38C61566-48F9-5D8E-9FC1-A1E81E71E5E7} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {D9F26498-410D-5617-B810-BC58D172184D} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {6140569D-4784-53CE-98A2-54D8BD6D1745} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {50274ADF-643D-5FEA-831C-2CB3DD2C6D30} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {D60176B5-3B87-504D-BCAC-067BD9954A8F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {3F743B8C-53C6-5520-B4AB-52C67179DD73} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {BD34A481-9816-51A7-BA6B-7272465F68C4} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {EAA4DB81-CBAA-573C-9C40-19F9551BE98B} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {879D5965-6D83-529C-A2F7-41E85045A7F0} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {45E6A177-140E-5C2C-AAC6-A2D662BEA5BA} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {23CE30EB-406F-573D-BF3D-4281A6FE406F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {FA284264-B63E-5DC4-B2A8-A8D347A554D1} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {EAD55F0E-0895-5BE5-8273-216780F99C1B} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {EF443847-D7D0-5457-85D8-4382BF34931F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {C2C3712D-B2E1-5F74-A3F9-0D912381A2CF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {F28F85B6-F4FD-5785-AF89-58F8159621E8} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} - {563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F} = {8EDEFD20-4914-53A8-88B3-B5FEB7B9D7A0} - {8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986} = {85703812-08C9-50E6-B355-4F26ED7810F1} - {D1E2B45E-632F-55A2-809F-C51E0F5975D1} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} - {065183CB-0CEB-5710-98AA-112036087960} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} - {78EF3724-4F6C-5873-A748-89FB753A6041} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} - {DFF6FD34-2F01-50E2-B2E3-C13F4AFF70BC} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} - {0CF1F217-11C2-56BF-B2B0-4DFD474FE798} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} - {D8858828-8495-5CBB-A7BB-97C058811A13} = {D1E2B45E-632F-55A2-809F-C51E0F5975D1} - {671D8C13-26F5-52C1-80F1-EFB556E12B46} = {065183CB-0CEB-5710-98AA-112036087960} - {335A63A0-01E4-5230-8741-5AE90F371B82} = {065183CB-0CEB-5710-98AA-112036087960} - {79481E86-D2CA-5472-8EDD-D0219F5932AC} = {065183CB-0CEB-5710-98AA-112036087960} - {69F7F8D4-6E7E-5EAA-B36A-273B223B3E30} = {065183CB-0CEB-5710-98AA-112036087960} - {A649555C-AAE1-59A8-A7BA-C118366386DD} = {065183CB-0CEB-5710-98AA-112036087960} - {22C216D9-2A03-5C40-9A18-E30C6FDF4D48} = {78EF3724-4F6C-5873-A748-89FB753A6041} - {6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440} = {78EF3724-4F6C-5873-A748-89FB753A6041} - {91F25B73-0A0C-57B6-89C2-B13E15F1B281} = {78EF3724-4F6C-5873-A748-89FB753A6041} - {F66F5DFE-3B8F-5B43-89DE-4A15B994290B} = {78EF3724-4F6C-5873-A748-89FB753A6041} - {C165A810-99AA-5C2E-99D9-950C4ABD5C63} = {78EF3724-4F6C-5873-A748-89FB753A6041} - {F2436D73-0E94-50F0-9C02-28CE3910EB21} = {78EF3724-4F6C-5873-A748-89FB753A6041} - {1D8E9087-584B-5341-BFAA-EEB046E530AF} = {78EF3724-4F6C-5873-A748-89FB753A6041} - {0D72E841-4F53-5ED8-864B-53AA0DFA5978} = {DFF6FD34-2F01-50E2-B2E3-C13F4AFF70BC} - {E5B88985-0693-51FC-8AB9-7C3728722618} = {0CF1F217-11C2-56BF-B2B0-4DFD474FE798} - {C521E5D8-709E-5061-9564-7D35400AF484} = {76802750-19B9-5E80-80BE-7ADC255ACE3D} - {C4AAD073-8948-5497-B314-B2699A504B73} = {76802750-19B9-5E80-80BE-7ADC255ACE3D} - {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} = {76802750-19B9-5E80-80BE-7ADC255ACE3D} - {78353588-38CA-5CCC-86EB-1513FB86FB4B} = {C521E5D8-709E-5061-9564-7D35400AF484} - {8A43DF4F-CBD4-5481-A113-84EBE37CA375} = {C521E5D8-709E-5061-9564-7D35400AF484} - {37A03641-FA63-5896-B432-EF26DC11F6CB} = {C521E5D8-709E-5061-9564-7D35400AF484} - {16C1069D-EBC9-53F4-909E-6EAF374E7E8A} = {C4AAD073-8948-5497-B314-B2699A504B73} - {EB39A5CF-2689-5002-8A70-CFB0F473CCDE} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} - {13D2C70F-86E5-52EB-9A53-F266E471A5DC} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} - {DC957128-193A-58F3-B987-481370A43953} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} - {05430EEB-6E1F-5396-A521-EE455630F730} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} - {318F564F-76B2-50BF-B629-0EB154BAF41D} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} - {ED97BD71-2A08-5826-8CD2-D90D2FA14B66} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} - {F246CAA7-1A3C-5F2A-B6C4-ADF43C72EBC8} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} - {69DD2687-443E-5E29-B334-E9409586F6B3} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} - {13AAE009-19FD-5093-B154-6FFC4C34B72C} = {318F564F-76B2-50BF-B629-0EB154BAF41D} - {056D1311-0882-5239-9D21-60FC186AB7F8} = {318F564F-76B2-50BF-B629-0EB154BAF41D} - {D99F972A-76D0-57CF-908D-FB28750FE989} = {ED97BD71-2A08-5826-8CD2-D90D2FA14B66} - {66D435A0-4D37-50EA-AC48-F557BD794E8D} = {ED97BD71-2A08-5826-8CD2-D90D2FA14B66} - {BA153C94-5786-5DFB-BF46-5456F314640D} = {F246CAA7-1A3C-5F2A-B6C4-ADF43C72EBC8} - {59194DA8-0065-5FA5-9E4C-9F1D1A141D0D} = {69DD2687-443E-5E29-B334-E9409586F6B3} - {85BFD986-36C4-5D47-9BD8-07211AEC3A03} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} - {C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} - {671DB4E9-704C-515F-B954-4A11384AC422} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} - {620AF63F-D189-5EDE-92BB-F610F5DB878C} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} - {174F6B92-7B4B-5364-9FFA-B0922315E394} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} - {3D5B082E-6F16-5078-B163-57F545C6441D} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} - {D52682FC-295E-53A2-B101-0BC60D53BEF1} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} - {A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} - {27C02428-144F-598E-A2B3-D74AB3A60BC2} = {C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6} - {099EB392-DF89-5A9E-B1CC-7B60A16C61B5} = {C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6} - {B4897CA0-8501-586C-AFA3-502ECDCB58FD} = {671DB4E9-704C-515F-B954-4A11384AC422} - {88F0AAA9-7AB4-5B38-9132-675E0CF0E032} = {620AF63F-D189-5EDE-92BB-F610F5DB878C} - {16CA4052-C32A-5EE4-A1E6-8DE81963D200} = {DEAB797C-CFE8-568B-A47A-549B8F4838A6} - {F82852B2-BCCB-5338-B6FC-DF7BE18CF99A} = {DEAB797C-CFE8-568B-A47A-549B8F4838A6} - {39D079A8-9BEC-5C96-9670-7FFCB16094D4} = {DEAB797C-CFE8-568B-A47A-549B8F4838A6} - {509995C7-1637-5E0A-8F11-0F5E54B77209} = {16CA4052-C32A-5EE4-A1E6-8DE81963D200} - {DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1} = {F82852B2-BCCB-5338-B6FC-DF7BE18CF99A} - {5AA07819-E820-54D5-8A68-69F791EDC4E4} = {39D079A8-9BEC-5C96-9670-7FFCB16094D4} - {BCB84E5F-2F49-53C9-8E91-EAA790F511B8} = {39D079A8-9BEC-5C96-9670-7FFCB16094D4} - {A054E1EC-4757-5B74-83D2-BF7B0F163365} = {F59ED1AE-6A2E-5465-81EB-52CFA175CBE6} - {B7CA7A16-AAFB-5A8F-B598-0284ED7DF744} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {2E7B8D21-CAD8-5844-B59F-7A487E6594DD} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {F30EF61D-A7FC-5689-A06F-42A152CF7393} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {96610609-85C7-5F09-B765-A86463A8DBDE} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {E5A69860-1704-5FB1-BFA3-5872182D4829} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {1F5FFF7C-AF58-5C3E-9981-EE5E978426E8} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {51652C28-0583-5556-A941-D16D99F97B82} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {068138BD-177D-5359-B0DD-A369BB607E95} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {91306E2D-A310-50D1-B64F-47A158D42085} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {59234A8C-D502-5965-AAFC-19739C833885} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {2CE72B3D-4D13-500A-A44D-76029069C773} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {8F7505CD-473C-590A-8851-FA762AB5E214} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {B2ABA214-83FB-5E9E-8AD4-2D54E579310A} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {3EC6A343-75E8-511F-A767-8FAB9EC79A62} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {37DF1BF6-AD9C-59A2-8F10-512ABE804ED3} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {A93B89A8-E39D-560B-82E8-96EAEA545A28} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {DF5A6010-D88B-5327-8E1A-74F2A716D340} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {B143BD73-A4D7-51F3-804E-03CE8C6CF639} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {2063D4CC-6C01-5693-B0B9-1376FB928E43} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {B0A0E3D1-FF2E-5005-B619-4523C2A2C955} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {004D507B-32A2-5704-8747-412E7B8EFAE4} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {62186A00-3E04-51EF-9497-258A973D6E24} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {81DADA98-669F-5B5B-8C31-EA3B5CF77380} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {768155E4-8D91-5A02-A006-2B357C033E25} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} - {27148056-45FD-547F-9F8A-6A56C8487DCB} = {7A6E52D8-29D2-5529-A394-BDF7AB0B84A0} - {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} = {7A6E52D8-29D2-5529-A394-BDF7AB0B84A0} - {9D3B5FD2-1692-5817-89D3-2E5950F83EB7} = {7A6E52D8-29D2-5529-A394-BDF7AB0B84A0} - {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07} = {27148056-45FD-547F-9F8A-6A56C8487DCB} - {BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270} = {27148056-45FD-547F-9F8A-6A56C8487DCB} - {3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7} = {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} - {5682D20E-74D9-50D6-B400-8EE39D2ADF42} = {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} - {73F03316-B1CB-55DC-A3D6-9C9758CFFFEB} = {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} - {ADDC25AD-9056-59DE-95EE-453A90D2D519} = {9D3B5FD2-1692-5817-89D3-2E5950F83EB7} - {9FEBBFD8-3A0B-5249-89ED-239B8E9697CC} = {F171E782-0A1A-586D-9349-7C69A2500836} - {4430BC6C-9ACC-5034-8BE9-A39F8A5FC45E} = {F171E782-0A1A-586D-9349-7C69A2500836} - {A002946E-4486-51F0-A132-2654E3DDB4E9} = {9FEBBFD8-3A0B-5249-89ED-239B8E9697CC} - {D84DFC26-3A6B-539F-822D-CE326F7DB9B4} = {9FEBBFD8-3A0B-5249-89ED-239B8E9697CC} - {07CBEBEF-B614-5A84-BFEB-A8548E20F1E9} = {4430BC6C-9ACC-5034-8BE9-A39F8A5FC45E} - {5EC80510-3F29-54FD-8848-05902F3B5063} = {C565F805-B835-571C-B5F4-136F31FCDF47} - {0CB37973-516C-53DC-BD58-91B698F3B258} = {C565F805-B835-571C-B5F4-136F31FCDF47} - {F3495690-6B86-5FEC-BBB4-DD899C2E419E} = {5EC80510-3F29-54FD-8848-05902F3B5063} - {5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A} = {0CB37973-516C-53DC-BD58-91B698F3B258} - {52051AD4-A4F5-53C2-905A-812A85994CCD} = {E98E0B62-3DB3-518D-A10C-006A509713BC} - {64374268-E685-5130-B546-4FAFCF95CD2A} = {E98E0B62-3DB3-518D-A10C-006A509713BC} - {87C7FE69-A978-534E-8646-18D30C34F667} = {E98E0B62-3DB3-518D-A10C-006A509713BC} - {D3BA9C21-1337-5091-AD41-ABD11C4B150D} = {52051AD4-A4F5-53C2-905A-812A85994CCD} - {849DA55E-D3D1-5E35-A339-B1AC4590E0A3} = {52051AD4-A4F5-53C2-905A-812A85994CCD} - {CEE84738-20C1-5800-B982-E331652C3917} = {52051AD4-A4F5-53C2-905A-812A85994CCD} - {B118588F-2F12-5CA8-8EED-426A7D34FF9A} = {64374268-E685-5130-B546-4FAFCF95CD2A} - {7D3BAFD9-4120-5A6A-B215-10AB461844EB} = {87C7FE69-A978-534E-8646-18D30C34F667} - {27196784-FFEA-59AB-8F26-3840EDF6C831} = {87C7FE69-A978-534E-8646-18D30C34F667} - {69AE1332-70C7-501D-A64E-F769F52B2449} = {87C7FE69-A978-534E-8646-18D30C34F667} EndGlobalSection -EndGlobal \ No newline at end of file +EndGlobal diff --git a/src/StellaOps.sln.bak b/src/StellaOps.sln.bak new file mode 100644 index 000000000..9f4bcdf80 --- /dev/null +++ b/src/StellaOps.sln.bak @@ -0,0 +1,5451 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 + +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AdvisoryAI", "AdvisoryAI", "{C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{8B8EE856-DA24-5594-8E25-C9D70E26C011}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI", "src\AdvisoryAI\StellaOps.AdvisoryAI\StellaOps.AdvisoryAI.csproj", "{B7141C87-33DB-5F99-8B8B-0C61725C2D6F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Hosting", "src\AdvisoryAI\StellaOps.AdvisoryAI.Hosting\StellaOps.AdvisoryAI.Hosting.csproj", "{6C186BD5-9A4D-5318-8AF8-F1B7AE48D812}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{808A70AA-83E2-5AD8-8519-CB6E27E99E66}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Tests", "src\AdvisoryAI\__Tests\StellaOps.AdvisoryAI.Tests\StellaOps.AdvisoryAI.Tests.csproj", "{B7FBC156-D7DE-5962-BFC8-40F94D6C00F9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{D86F0DB2-577A-5B46-8B4A-4D492CAB32D7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.WebService", "src\AdvisoryAI\StellaOps.AdvisoryAI.WebService\StellaOps.AdvisoryAI.WebService.csproj", "{112CFB30-3731-54C5-8E9F-7C2CC75C9B67}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{D0FCFD53-225B-57FA-9073-6A88970B3E4F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AdvisoryAI.Worker", "src\AdvisoryAI\StellaOps.AdvisoryAI.Worker\StellaOps.AdvisoryAI.Worker.csproj", "{51BA43C0-6861-5B57-A837-B6CECF8D0257}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AirGap", "AirGap", "{B30F10B5-2A8C-56C8-9D19-38190F2EC627}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{2E4D25DA-6B5D-5A5F-9F61-CDBF1DBB311D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Analyzers", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Analyzers\StellaOps.AirGap.Policy.Analyzers.csproj", "{7002B619-1F2A-5393-B348-70CDAC639748}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{12FC57D8-ADE7-5756-85D4-AAABC06FAA0A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Controller", "src\AirGap\StellaOps.AirGap.Controller\StellaOps.AirGap.Controller.csproj", "{6D955BD2-7D9B-5495-9153-509864CF7096}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Importer", "src\AirGap\StellaOps.AirGap.Importer\StellaOps.AirGap.Importer.csproj", "{0EB72CBF-4405-5B0C-AF18-26764A0DB489}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.csproj", "{45DE9CF0-B55D-550D-8005-504FBF0F3CDF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Storage.Postgres", "src\AirGap\StellaOps.AirGap.Storage.Postgres\StellaOps.AirGap.Storage.Postgres.csproj", "{FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Time", "src\AirGap\StellaOps.AirGap.Time\StellaOps.AirGap.Time.csproj", "{06AE06C1-E499-590D-88C0-E860AD7A7A32}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{A80991C3-5D9B-5C12-92DE-691A7399F660}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Bundle", "src\AirGap\__Libraries\StellaOps.AirGap.Bundle\StellaOps.AirGap.Bundle.csproj", "{F07AE928-89B5-57F0-921C-3B97A376FF95}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{FC47E687-717F-5EF5-AE4E-EEB1B86E46FF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Controller.Tests", "src\__Tests\AirGap\StellaOps.AirGap.Controller.Tests\StellaOps.AirGap.Controller.Tests.csproj", "{DF2C5848-16B4-54E1-A976-9C548AAF3077}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Importer.Tests", "src\__Tests\AirGap\StellaOps.AirGap.Importer.Tests\StellaOps.AirGap.Importer.Tests.csproj", "{6B905D2C-43E2-5637-9E98-393E5A3A1903}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Time.Tests", "src\__Tests\AirGap\StellaOps.AirGap.Time.Tests\StellaOps.AirGap.Time.Tests.csproj", "{9477476B-34BB-5A40-BAB2-ABA6DBFD9733}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Bundle.Tests", "src\AirGap\__Libraries\__Tests\StellaOps.AirGap.Bundle.Tests\StellaOps.AirGap.Bundle.Tests.csproj", "{9FA8DD10-9178-588E-AC7E-F423FB235DA0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Importer.Tests", "src\AirGap\__Tests\StellaOps.AirGap.Importer.Tests\StellaOps.AirGap.Importer.Tests.csproj", "{58243870-C97F-5F26-B86F-BF1C0863BA0B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Analyzers.Tests", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Analyzers.Tests\StellaOps.AirGap.Policy.Analyzers.Tests.csproj", "{452CFFEA-8914-5128-AC23-65C969E53523}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy.Tests", "src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.Tests\StellaOps.AirGap.Policy.Tests.csproj", "{343BB1E8-DB77-52DA-B2E2-406C72088E34}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Storage.Postgres.Tests", "src\AirGap\StellaOps.AirGap.Storage.Postgres.Tests\StellaOps.AirGap.Storage.Postgres.Tests.csproj", "{6E0B7B8D-58FF-5297-9497-5286822D5483}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aoc", "Aoc", "{7BDA5071-6A44-50AC-B3BF-075FA2B28DFD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{EBE264E0-5321-50D4-97D7-27D2068685AA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Analyzers", "src\Aoc\__Analyzers\StellaOps.Aoc.Analyzers\StellaOps.Aoc.Analyzers.csproj", "{E2189FEA-63C0-5828-A60E-6F4D2B4DC724}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{CEA98078-2A40-5BD7-A10B-D41932877106}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc", "src\Aoc\__Libraries\StellaOps.Aoc\StellaOps.Aoc.csproj", "{8609324D-8A33-5C72-843C-C9CDF861F6B0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.AspNetCore", "src\Aoc\__Libraries\StellaOps.Aoc.AspNetCore\StellaOps.Aoc.AspNetCore.csproj", "{15346A13-8152-5B25-AA03-37AF5A883B94}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{093AF0FF-6681-598B-8B09-AB6DD8FEC4A5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Analyzers.Tests", "src\Aoc\__Tests\StellaOps.Aoc.Analyzers.Tests\StellaOps.Aoc.Analyzers.Tests.csproj", "{A44B07A2-3C46-5AEF-9278-FC35BF3D020F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.AspNetCore.Tests", "src\Aoc\__Tests\StellaOps.Aoc.AspNetCore.Tests\StellaOps.Aoc.AspNetCore.Tests.csproj", "{AC5584D7-5085-5ED3-840C-0B82D7D2606A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Aoc.Tests", "src\Aoc\__Tests\StellaOps.Aoc.Tests\StellaOps.Aoc.Tests.csproj", "{EEFF9AAC-ED84-55BF-8963-F5422023E379}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Attestor", "Attestor", "{9682BDC3-495E-5D69-AEF6-08F675D6896B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{F28A412B-CA0F-515B-BFF5-A258C78E41D4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestation", "src\Attestor\StellaOps.Attestation\StellaOps.Attestation.csproj", "{C011DDAB-DD11-5213-8857-437320BE11C2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Core", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Core\StellaOps.Attestor.Core.csproj", "{8ECC05DA-F183-5849-8840-D7DCD7E80819}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Infrastructure", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Infrastructure\StellaOps.Attestor.Infrastructure.csproj", "{2A7DBD4D-B339-5CBA-889F-358076B03D58}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope", "src\Attestor\StellaOps.Attestor.Envelope\StellaOps.Attestor.Envelope.csproj", "{4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Types.Generator", "src\Attestor\StellaOps.Attestor.Types\Tools\StellaOps.Attestor.Types.Generator\StellaOps.Attestor.Types.Generator.csproj", "{ECC3FD89-64D0-5048-A6E8-44470269D172}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Verify", "src\Attestor\StellaOps.Attestor.Verify\StellaOps.Attestor.Verify.csproj", "{7200949F-B6B8-5857-9ECC-F43FA9C03A44}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{CA93333F-B07B-5C2F-BB5A-B02A27EC6C99}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundle", "src\Attestor\__Libraries\StellaOps.Attestor.Bundle\StellaOps.Attestor.Bundle.csproj", "{D367AE34-6CDE-5367-AE59-D9D037149B00}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundling", "src\Attestor\__Libraries\StellaOps.Attestor.Bundling\StellaOps.Attestor.Bundling.csproj", "{147ED816-086E-5914-ACF0-4E30516BF50C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.GraphRoot", "src\Attestor\__Libraries\StellaOps.Attestor.GraphRoot\StellaOps.Attestor.GraphRoot.csproj", "{80561E59-C6A9-5F30-8BD2-053866ADBEE9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Offline", "src\Attestor\__Libraries\StellaOps.Attestor.Offline\StellaOps.Attestor.Offline.csproj", "{4149C8AA-1BE2-5722-8114-8F1928B8B3F0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Persistence", "src\Attestor\__Libraries\StellaOps.Attestor.Persistence\StellaOps.Attestor.Persistence.csproj", "{27982DF8-303D-5C8C-8595-FEFA9033F98A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.ProofChain", "src\Attestor\__Libraries\StellaOps.Attestor.ProofChain\StellaOps.Attestor.ProofChain.csproj", "{0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.StandardPredicates", "src\Attestor\__Libraries\StellaOps.Attestor.StandardPredicates\StellaOps.Attestor.StandardPredicates.csproj", "{E41F4F80-1D92-59D8-9F97-48BF0BBAD093}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F8F38682-4EB1-59F7-86C3-5464582178A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.GraphRoot.Tests", "src\Attestor\__Libraries\__Tests\StellaOps.Attestor.GraphRoot.Tests\StellaOps.Attestor.GraphRoot.Tests.csproj", "{E71D7DB0-F816-5D1F-B86A-E01E806D7B12}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundle.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Bundle.Tests\StellaOps.Attestor.Bundle.Tests.csproj", "{EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Bundling.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Bundling.Tests\StellaOps.Attestor.Bundling.Tests.csproj", "{EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Offline.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Offline.Tests\StellaOps.Attestor.Offline.Tests.csproj", "{B318A6FB-EBF7-5061-85B2-7542D71D226B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Persistence.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Persistence.Tests\StellaOps.Attestor.Persistence.Tests.csproj", "{5671223D-C370-5DD1-98D6-D27C3CA6A602}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.ProofChain.Tests", "src\Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\StellaOps.Attestor.ProofChain.Tests.csproj", "{EE2D63D4-B7CA-5933-BE1F-05AABF69703E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.StandardPredicates.Tests", "src\Attestor\__Tests\StellaOps.Attestor.StandardPredicates.Tests\StellaOps.Attestor.StandardPredicates.Tests.csproj", "{A83FA14F-39A9-57EF-A49D-3EC86731F56E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Types.Tests", "src\Attestor\__Tests\StellaOps.Attestor.Types.Tests\StellaOps.Attestor.Types.Tests.csproj", "{AB83BC75-CF32-506D-9B8A-EBBDD2C28A56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestation.Tests", "src\Attestor\StellaOps.Attestation.Tests\StellaOps.Attestation.Tests.csproj", "{3E514FD3-4036-51D5-976B-CD18121684BD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Core.Tests", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Core.Tests\StellaOps.Attestor.Core.Tests.csproj", "{C10EF177-5C79-5A55-AE28-360DAB3D252C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Tests", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\StellaOps.Attestor.Tests.csproj", "{07FD7BF7-7756-5854-8DDB-41478A34BB64}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope.Tests", "src\Attestor\StellaOps.Attestor.Envelope\__Tests\StellaOps.Attestor.Envelope.Tests\StellaOps.Attestor.Envelope.Tests.csproj", "{508E13BB-305B-58B8-9F2E-E9759874DF0A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.Envelope.Tests", "src\Attestor\StellaOps.Attestor.Envelope\StellaOps.Attestor.Envelope.Tests\StellaOps.Attestor.Envelope.Tests.csproj", "{6778FAEB-4621-54D3-BF75-0FDB99C6751D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CC9FE15F-1FAB-5208-8565-F3811229EC86}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Attestor.WebService", "src\Attestor\StellaOps.Attestor\StellaOps.Attestor.WebService\StellaOps.Attestor.WebService.csproj", "{8DCF30E6-164B-55D5-A003-0A4D890A4492}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authority", "Authority", "{13FB3AA9-46DD-52F5-B76A-60A506410DCF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{622E0872-E547-5108-92BB-AE38EFB35E5A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions", "src\Authority\StellaOps.Authority\StellaOps.Auth.Abstractions\StellaOps.Auth.Abstractions.csproj", "{38E42693-FC3C-569F-909A-B24AD24AD1DA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client", "src\Authority\StellaOps.Authority\StellaOps.Auth.Client\StellaOps.Auth.Client.csproj", "{0192EA27-7AE0-5952-B74A-32CF87973F79}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration", "src\Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration\StellaOps.Auth.ServerIntegration.csproj", "{E8A66716-1110-5DB7-81B3-8D2F403419D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority", "src\Authority\StellaOps.Authority\StellaOps.Authority\StellaOps.Authority.csproj", "{980E3CD4-3D1E-55B0-9D46-3944D82B1506}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.InMemory", "src\Authority\StellaOps.Authority\StellaOps.Authority.Storage.InMemory\StellaOps.Authority.Storage.InMemory.csproj", "{0C89A31F-44DE-59E0-843E-6608861D032B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Core", "src\Authority\__Libraries\StellaOps.Authority.Core\StellaOps.Authority.Core.csproj", "{72F73293-EFAC-5D27-911E-E6752D9E96FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.Postgres", "src\Authority\__Libraries\StellaOps.Authority.Storage.Postgres\StellaOps.Authority.Storage.Postgres.csproj", "{0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{66839ADE-60D3-54EB-8BAB-304B9B423C25}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Ldap", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Ldap\StellaOps.Authority.Plugin.Ldap.csproj", "{F0011F9C-EF86-578B-B25C-DFBFD8B2D137}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Oidc", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Oidc\StellaOps.Authority.Plugin.Oidc.csproj", "{18566A49-CB0D-5662-AB0E-22DE76024FE9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Saml", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Saml\StellaOps.Authority.Plugin.Saml.csproj", "{68D84C0C-5272-5673-B8BF-1D5424885EC8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Standard", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Standard\StellaOps.Authority.Plugin.Standard.csproj", "{D36617C5-65AC-578F-8139-DF3D0BD91E55}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions\StellaOps.Authority.Plugins.Abstractions.csproj", "{731333C9-6F41-5AD4-9B59-C3FAEE2A31A0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A9571EDE-BA3F-5E26-84E9-649A5EA02C55}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Core.Tests", "src\Authority\__Tests\StellaOps.Authority.Core.Tests\StellaOps.Authority.Core.Tests.csproj", "{4C4A8491-4950-51C3-A134-89DEA080AFCF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Storage.Postgres.Tests", "src\Authority\__Tests\StellaOps.Authority.Storage.Postgres.Tests\StellaOps.Authority.Storage.Postgres.Tests.csproj", "{EF039F88-3A55-5F6F-A7F7-DC91AAF85B82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions.Tests", "src\Authority\StellaOps.Authority\StellaOps.Auth.Abstractions.Tests\StellaOps.Auth.Abstractions.Tests.csproj", "{841F79A2-944F-5807-AB6A-1BFF74278DB4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client.Tests", "src\Authority\StellaOps.Authority\StellaOps.Auth.Client.Tests\StellaOps.Auth.Client.Tests.csproj", "{501C9952-398B-503E-8C13-B67848D9DBB1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration.Tests", "src\Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration.Tests\StellaOps.Auth.ServerIntegration.Tests.csproj", "{30593F8A-492A-5484-BE89-858A29FE5A58}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Ldap.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Ldap.Tests\StellaOps.Authority.Plugin.Ldap.Tests.csproj", "{80590588-9B02-52C7-B783-F3C6B0A2C023}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Oidc.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Oidc.Tests\StellaOps.Authority.Plugin.Oidc.Tests.csproj", "{3611A8A7-BCBA-58AC-905C-420D1018D814}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Saml.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Saml.Tests\StellaOps.Authority.Plugin.Saml.Tests.csproj", "{E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugin.Standard.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugin.Standard.Tests\StellaOps.Authority.Plugin.Standard.Tests.csproj", "{82ACA55C-69E9-5488-9383-26C6C2FEE1B0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions.Tests\StellaOps.Authority.Plugins.Abstractions.Tests.csproj", "{5CE0902E-68CA-536E-AAC5-58041DDA1730}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Tests", "src\Authority\StellaOps.Authority\StellaOps.Authority.Tests\StellaOps.Authority.Tests.csproj", "{869157C1-588F-531E-BFD3-5D78FD91BC99}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bench", "Bench", "{9E7391C6-F886-5F94-A0DF-3D42C0688136}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{BF6F75A1-C290-5F91-9E7E-427932080486}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge", "src\Bench\StellaOps.Bench\LinkNotMerge\StellaOps.Bench.LinkNotMerge\StellaOps.Bench.LinkNotMerge.csproj", "{B330A47C-BCA1-5406-B432-56115A665839}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Vex", "src\Bench\StellaOps.Bench\LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex.csproj", "{689E3E97-E53C-5A3D-8938-0587D6B21CD1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.Notify", "src\Bench\StellaOps.Bench\Notify\StellaOps.Bench.Notify\StellaOps.Bench.Notify.csproj", "{7AA23462-E017-562D-9463-8C5B750E9496}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.PolicyEngine", "src\Bench\StellaOps.Bench\PolicyEngine\StellaOps.Bench.PolicyEngine\StellaOps.Bench.PolicyEngine.csproj", "{08D3BB86-4F4B-5C8B-B343-2207C0FA03CE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ScannerAnalyzers", "src\Bench\StellaOps.Bench\Scanner.Analyzers\StellaOps.Bench.ScannerAnalyzers\StellaOps.Bench.ScannerAnalyzers.csproj", "{CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{05EC3129-9EDA-58C4-964B-E263C0D2F2C4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.BinaryLookup", "src\__Tests\__Benchmarks\binary-lookup\StellaOps.Bench.BinaryLookup.csproj", "{2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ProofChain", "src\__Tests\__Benchmarks\proof-chain\StellaOps.Bench.ProofChain.csproj", "{0FAB272B-4502-5AE8-8B93-828EA37BE954}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Tests", "src\Bench\StellaOps.Bench\LinkNotMerge\StellaOps.Bench.LinkNotMerge.Tests\StellaOps.Bench.LinkNotMerge.Tests.csproj", "{EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.LinkNotMerge.Vex.Tests", "src\Bench\StellaOps.Bench\LinkNotMerge.Vex\StellaOps.Bench.LinkNotMerge.Vex.Tests\StellaOps.Bench.LinkNotMerge.Vex.Tests.csproj", "{B11C615A-8910-5102-8841-D3AC7BF7D63D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.Notify.Tests", "src\Bench\StellaOps.Bench\Notify\StellaOps.Bench.Notify.Tests\StellaOps.Bench.Notify.Tests.csproj", "{ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Bench.ScannerAnalyzers.Tests", "src\Bench\StellaOps.Bench\Scanner.Analyzers\StellaOps.Bench.ScannerAnalyzers.Tests\StellaOps.Bench.ScannerAnalyzers.Tests.csproj", "{5E92A1DF-1B82-5B8D-B6A0-40B362A7230F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BinaryIndex", "BinaryIndex", "{A88F9635-0E95-506D-8AE1-670D45B847BD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{253E1793-19BF-56D0-8F84-D3B3B3F88BFD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Cache", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Cache\StellaOps.BinaryIndex.Cache.csproj", "{6FFD945A-2042-5A65-9021-BF77FB66C3A9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Core", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Core\StellaOps.BinaryIndex.Core.csproj", "{C41CA6D1-6D61-5210-B33C-4ED58D96C319}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus\StellaOps.BinaryIndex.Corpus.csproj", "{28467D65-21AF-5711-8DA3-7EB8C258E8F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Alpine", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Alpine\StellaOps.BinaryIndex.Corpus.Alpine.csproj", "{A4A8CF8E-6CE7-5384-8756-71838B0DD5E0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Debian", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Debian\StellaOps.BinaryIndex.Corpus.Debian.csproj", "{7E648DEF-9BFA-5E59-B4BD-3518CD63C833}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Corpus.Rpm", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Corpus.Rpm\StellaOps.BinaryIndex.Corpus.Rpm.csproj", "{EA34E87C-D188-5ED7-A221-01D1677F8657}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Fingerprints", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Fingerprints\StellaOps.BinaryIndex.Fingerprints.csproj", "{6BD4B5F7-8974-5010-B9F6-53CB24DE6C06}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.FixIndex", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.FixIndex\StellaOps.BinaryIndex.FixIndex.csproj", "{95AD2F0E-8D9D-541C-9E08-4DE9C89B867F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Persistence", "src\BinaryIndex\__Libraries\StellaOps.BinaryIndex.Persistence\StellaOps.BinaryIndex.Persistence.csproj", "{EA4F9B01-0644-534A-AA8D-81B5E2BD3A31}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{50708606-307A-5BED-AF2D-8FDCB9C05220}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Core.Tests", "src\BinaryIndex\__Tests\StellaOps.BinaryIndex.Core.Tests\StellaOps.BinaryIndex.Core.Tests.csproj", "{82362C0E-5A23-51EC-A539-38DC2C8B18C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Fingerprints.Tests", "src\BinaryIndex\__Tests\StellaOps.BinaryIndex.Fingerprints.Tests\StellaOps.BinaryIndex.Fingerprints.Tests.csproj", "{E8A4DA95-0028-56E3-876D-964AB6285B86}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.BinaryIndex.Persistence.Tests", "src\BinaryIndex\__Tests\StellaOps.BinaryIndex.Persistence.Tests\StellaOps.BinaryIndex.Persistence.Tests.csproj", "{E85B9476-FCE0-557B-9598-FD46D59F7846}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cartographer", "Cartographer", "{E141BA2D-1051-5995-91A7-7825ACB7513B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{92253993-2566-5A11-AD3D-4E9E4DFCA693}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cartographer", "src\Cartographer\StellaOps.Cartographer\StellaOps.Cartographer.csproj", "{717BBC3C-0048-5728-9246-E54BCF73FDA0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{99D0800D-C3E6-59C7-8E14-7307D9D19FEE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cartographer.Tests", "src\Cartographer\__Tests\StellaOps.Cartographer.Tests\StellaOps.Cartographer.Tests.csproj", "{97284EB9-3307-5358-9D53-516135B9B67E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cli", "Cli", "{6FB093EE-13F2-598F-B637-317D30E2418C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{20D928CF-6F8E-537C-B614-1344AF5F9BBF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli", "src\Cli\StellaOps.Cli\StellaOps.Cli.csproj", "{333F32BE-6053-51D0-8E43-6D4DABA6D01F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{28D4DF1E-10B2-50EB-B993-0C51781DC4CA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Aoc", "src\Cli\__Libraries\StellaOps.Cli.Plugins.Aoc\StellaOps.Cli.Plugins.Aoc.csproj", "{533F1413-079E-537A-B336-90543B6A8A6D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.NonCore", "src\Cli\__Libraries\StellaOps.Cli.Plugins.NonCore\StellaOps.Cli.Plugins.NonCore.csproj", "{CBBFDF59-D233-5847-B08D-590AAC7D0062}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Symbols", "src\Cli\__Libraries\StellaOps.Cli.Plugins.Symbols\StellaOps.Cli.Plugins.Symbols.csproj", "{F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Plugins.Vex", "src\Cli\__Libraries\StellaOps.Cli.Plugins.Vex\StellaOps.Cli.Plugins.Vex.csproj", "{E9ABE946-C645-5359-B25E-8BAA18689C44}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A7D8953B-C099-5CF8-BB7F-567171FBE654}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Tests", "src\Cli\__Tests\StellaOps.Cli.Tests\StellaOps.Cli.Tests.csproj", "{B2CCA353-DF3F-57B7-8108-C7BFA1F6553B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Concelier", "Concelier", "{F8412DF3-0892-5D8E-88D2-2103807C2F01}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{636012BB-3DED-56DD-90FB-4F280DA764BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Analyzers", "src\Concelier\__Analyzers\StellaOps.Concelier.Analyzers\StellaOps.Concelier.Analyzers.csproj", "{C1FCD683-A858-5864-8FFC-71F10EBB037C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Analyzers", "src\Concelier\__Analyzers\StellaOps.Concelier.Merge.Analyzers\StellaOps.Concelier.Merge.Analyzers.csproj", "{533E7642-7A19-5148-9961-7AD1C129F6A3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{C98C2683-712C-500D-891A-D685874A0600}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Cache.Valkey", "src\Concelier\__Libraries\StellaOps.Concelier.Cache.Valkey\StellaOps.Concelier.Cache.Valkey.csproj", "{69E38AB5-4754-5EE1-A4F6-4066121380E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core", "src\Concelier\__Libraries\StellaOps.Concelier.Core\StellaOps.Concelier.Core.csproj", "{C0D3B371-0629-51A6-977E-109DD8C75193}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json", "src\Concelier\__Libraries\StellaOps.Concelier.Exporter.Json\StellaOps.Concelier.Exporter.Json.csproj", "{ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb", "src\Concelier\__Libraries\StellaOps.Concelier.Exporter.TrivyDb\StellaOps.Concelier.Exporter.TrivyDb.csproj", "{0260AD37-54DA-5800-B7D5-1C87AD53DA5E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Federation", "src\Concelier\__Libraries\StellaOps.Concelier.Federation\StellaOps.Concelier.Federation.csproj", "{523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Interest", "src\Concelier\__Libraries\StellaOps.Concelier.Interest\StellaOps.Concelier.Interest.csproj", "{FD6169A5-BA05-532F-9F9C-CA706278E422}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge", "src\Concelier\__Libraries\StellaOps.Concelier.Merge\StellaOps.Concelier.Merge.csproj", "{2A280282-543C-56B1-ABEA-0E104874FAB2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models", "src\Concelier\__Libraries\StellaOps.Concelier.Models\StellaOps.Concelier.Models.csproj", "{898AEFFF-4499-5223-9E5A-51D23E359283}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization", "src\Concelier\__Libraries\StellaOps.Concelier.Normalization\StellaOps.Concelier.Normalization.csproj", "{B65C2C6B-14A5-59FC-9864-0ACBCA225905}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService", "src\Concelier\__Libraries\StellaOps.Concelier.ProofService\StellaOps.Concelier.ProofService.csproj", "{518349EC-22EA-5C63-82C9-B62C355ECF06}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService.Postgres", "src\Concelier\__Libraries\StellaOps.Concelier.ProofService.Postgres\StellaOps.Concelier.ProofService.Postgres.csproj", "{978E57C9-6329-53E6-BCFB-25B61900FF56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.RawModels", "src\Concelier\__Libraries\StellaOps.Concelier.RawModels\StellaOps.Concelier.RawModels.csproj", "{A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SbomIntegration", "src\Concelier\__Libraries\StellaOps.Concelier.SbomIntegration\StellaOps.Concelier.SbomIntegration.csproj", "{67D45094-106D-5A42-8908-EE0ED693C316}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SourceIntel", "src\Concelier\__Libraries\StellaOps.Concelier.SourceIntel\StellaOps.Concelier.SourceIntel.csproj", "{DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Postgres", "src\Concelier\__Libraries\StellaOps.Concelier.Storage.Postgres\StellaOps.Concelier.Storage.Postgres.csproj", "{42C7E32A-4A4F-5E14-9A1C-CB6888F42911}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Acsc", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Acsc\StellaOps.Concelier.Connector.Acsc.csproj", "{ECDA362C-2331-5E2A-9004-158FEFC09558}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cccs", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Cccs\StellaOps.Concelier.Connector.Cccs.csproj", "{54692AE8-46FE-597C-9804-B85115C8D78E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertBund", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertBund\StellaOps.Concelier.Connector.CertBund.csproj", "{A8FFCABE-523B-52AC-B649-F728A13F7809}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertCc", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertCc\StellaOps.Concelier.Connector.CertCc.csproj", "{447BFD00-4629-5040-947F-3823CE6F1623}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertFr", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertFr\StellaOps.Concelier.Connector.CertFr.csproj", "{FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertIn", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.CertIn\StellaOps.Concelier.Connector.CertIn.csproj", "{B5FDDDD2-F649-5A1E-9D58-79C1B4880129}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Common\StellaOps.Concelier.Connector.Common.csproj", "{414164E1-1D79-561F-84C8-AF13D2479467}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cve", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Cve\StellaOps.Concelier.Connector.Cve.csproj", "{0245DE31-CCD7-570B-A349-4A94B6747E7F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Alpine", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Alpine\StellaOps.Concelier.Connector.Distro.Alpine.csproj", "{52A514C6-1F14-57DB-8040-8BD90724DF97}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Debian", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Debian\StellaOps.Concelier.Connector.Distro.Debian.csproj", "{ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.RedHat", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.RedHat\StellaOps.Concelier.Connector.Distro.RedHat.csproj", "{D57A3684-6938-52E3-A775-A05D1BC55BD9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Suse", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Suse\StellaOps.Concelier.Connector.Distro.Suse.csproj", "{F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Ubuntu", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Distro.Ubuntu\StellaOps.Concelier.Connector.Distro.Ubuntu.csproj", "{4D19D7C7-33D5-5E40-BD37-F033F6514F8F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Epss", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Epss\StellaOps.Concelier.Connector.Epss.csproj", "{579B038A-DA40-568D-8D94-1819A61A77E4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ghsa", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ghsa\StellaOps.Concelier.Connector.Ghsa.csproj", "{D1CD0F74-629F-5E39-AB12-D0E873B176DF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Cisa", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ics.Cisa\StellaOps.Concelier.Connector.Ics.Cisa.csproj", "{A39CCE1C-8779-5417-AAB7-F7F662947EF7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Kaspersky", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ics.Kaspersky\StellaOps.Concelier.Connector.Ics.Kaspersky.csproj", "{8B0CB7F1-D942-5256-9345-814D7613FB8D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Jvn", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Jvn\StellaOps.Concelier.Connector.Jvn.csproj", "{8ADF03A1-5837-5C33-80D5-593F684B5D52}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kev", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Kev\StellaOps.Concelier.Connector.Kev.csproj", "{DCB28552-B244-5382-A01A-7FF9623D5D8F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kisa", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Kisa\StellaOps.Concelier.Connector.Kisa.csproj", "{4E932374-54C6-5618-B9D0-C9F9586AF142}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Nvd", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Nvd\StellaOps.Concelier.Connector.Nvd.csproj", "{52F0C68B-4733-5B5A-94BC-8610E0044FB5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Osv", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Osv\StellaOps.Concelier.Connector.Osv.csproj", "{C7849419-3632-5210-B29D-AE643ADF7614}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Bdu", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ru.Bdu\StellaOps.Concelier.Connector.Ru.Bdu.csproj", "{0A8F72E8-0678-5DC6-A529-6051825248A2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Nkcki", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Ru.Nkcki\StellaOps.Concelier.Connector.Ru.Nkcki.csproj", "{3C0189B8-5C01-5CAF-921B-14534E5AD8F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.StellaOpsMirror", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.StellaOpsMirror\StellaOps.Concelier.Connector.StellaOpsMirror.csproj", "{F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Adobe", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Adobe\StellaOps.Concelier.Connector.Vndr.Adobe.csproj", "{399C398F-37AC-5E5E-A071-7856B28E2F91}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Apple", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Apple\StellaOps.Concelier.Connector.Vndr.Apple.csproj", "{FB31FD4A-6D32-5F44-A765-BF97D0992416}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Chromium", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Chromium\StellaOps.Concelier.Connector.Vndr.Chromium.csproj", "{2E5136AC-787A-5395-9E34-6DF39AD968A7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Cisco", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Cisco\StellaOps.Concelier.Connector.Vndr.Cisco.csproj", "{271FC73D-0A74-5833-9710-095BB48BDE36}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Msrc", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Msrc\StellaOps.Concelier.Connector.Vndr.Msrc.csproj", "{CCD04E7B-4971-5471-B3C3-F1EB37211477}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Oracle", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Oracle\StellaOps.Concelier.Connector.Vndr.Oracle.csproj", "{6A3E0408-E974-5B1E-8944-9745294CA34F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Vmware", "src\Concelier\__Libraries\StellaOps.Concelier.Connector.Vndr.Vmware\StellaOps.Concelier.Connector.Vndr.Vmware.csproj", "{BC02D193-613F-532F-98A3-C09FF0CC8116}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{BC7E9C1F-1451-5098-8839-C440DB51E8F7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "src\__Tests\__Libraries\StellaOps.Concelier.Testing\StellaOps.Concelier.Testing.csproj", "{42D599AE-EE37-55F8-926D-2918FE8C2FF1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Cache.Valkey.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Cache.Valkey.Tests\StellaOps.Concelier.Cache.Valkey.Tests.csproj", "{9365CC66-A669-5ACD-AA12-4991D1DBCD10}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Acsc.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Acsc.Tests\StellaOps.Concelier.Connector.Acsc.Tests.csproj", "{C3141611-E90D-55A2-819B-A65AEF921787}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cccs.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Cccs.Tests\StellaOps.Concelier.Connector.Cccs.Tests.csproj", "{B62F97B5-73F5-5F9C-90F5-F156C52E6424}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertBund.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertBund.Tests\StellaOps.Concelier.Connector.CertBund.Tests.csproj", "{48090851-C268-5625-9967-7E1B364AE5BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertCc.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertCc.Tests\StellaOps.Concelier.Connector.CertCc.Tests.csproj", "{A2FA5C54-A698-51F4-BE96-DA5080CA10D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertFr.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertFr.Tests\StellaOps.Concelier.Connector.CertFr.Tests.csproj", "{E76711C3-B30E-5E2F-8532-0885F4E4992E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.CertIn.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.CertIn.Tests\StellaOps.Concelier.Connector.CertIn.Tests.csproj", "{D8D2C86C-A8D2-597F-B9CB-92C6D412752E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Common.Tests\StellaOps.Concelier.Connector.Common.Tests.csproj", "{9326B135-DEF9-52CD-B1E9-F90EEEAA40FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Cve.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Cve.Tests\StellaOps.Concelier.Connector.Cve.Tests.csproj", "{823042FD-8786-5959-AA1E-8E225497A91D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Alpine.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Alpine.Tests\StellaOps.Concelier.Connector.Distro.Alpine.Tests.csproj", "{A182BBDA-2794-538D-87BC-5C9F1A52EC9C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Debian.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Debian.Tests\StellaOps.Concelier.Connector.Distro.Debian.Tests.csproj", "{49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.RedHat.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.RedHat.Tests\StellaOps.Concelier.Connector.Distro.RedHat.Tests.csproj", "{E6AD0F88-58A6-591B-B81F-55D76970AAC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Suse.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Suse.Tests\StellaOps.Concelier.Connector.Distro.Suse.Tests.csproj", "{64ED47CD-60F8-50B0-ABF1-BD3624D3876B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Distro.Ubuntu.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Distro.Ubuntu.Tests\StellaOps.Concelier.Connector.Distro.Ubuntu.Tests.csproj", "{86FE95FB-6E35-599C-AD1F-CCA00200BAD2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Epss.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Epss.Tests\StellaOps.Concelier.Connector.Epss.Tests.csproj", "{E048277B-0B7F-5912-8190-871D57D0CB36}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ghsa.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ghsa.Tests\StellaOps.Concelier.Connector.Ghsa.Tests.csproj", "{8637D2D5-FCFA-592E-AB09-1134DD444F51}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Cisa.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ics.Cisa.Tests\StellaOps.Concelier.Connector.Ics.Cisa.Tests.csproj", "{6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ics.Kaspersky.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ics.Kaspersky.Tests\StellaOps.Concelier.Connector.Ics.Kaspersky.Tests.csproj", "{6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Jvn.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Jvn.Tests\StellaOps.Concelier.Connector.Jvn.Tests.csproj", "{FB3C53E3-B728-5E37-9095-E8A62235C779}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kev.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Kev.Tests\StellaOps.Concelier.Connector.Kev.Tests.csproj", "{BAE0F14F-67B0-52A8-8A37-DAB9117CAB92}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Kisa.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Kisa.Tests\StellaOps.Concelier.Connector.Kisa.Tests.csproj", "{BBD9FB80-1740-52D1-8D4A-CBCC23458967}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Nvd.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Nvd.Tests\StellaOps.Concelier.Connector.Nvd.Tests.csproj", "{6B728CF0-08D7-5495-AF3B-80E03D8E3085}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Osv.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Osv.Tests\StellaOps.Concelier.Connector.Osv.Tests.csproj", "{A65C327F-9D4B-57DF-A94E-456215B00102}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Bdu.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ru.Bdu.Tests\StellaOps.Concelier.Connector.Ru.Bdu.Tests.csproj", "{8F9AB893-1069-58DE-9213-58FFD149AEE1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Ru.Nkcki.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Ru.Nkcki.Tests\StellaOps.Concelier.Connector.Ru.Nkcki.Tests.csproj", "{AE390E3E-F95E-54E2-8ED8-ACF460F30C32}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.StellaOpsMirror.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.StellaOpsMirror.Tests\StellaOps.Concelier.Connector.StellaOpsMirror.Tests.csproj", "{C11D8D60-CA38-5F92-A741-EB8C8D99C5D2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Adobe.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Adobe.Tests\StellaOps.Concelier.Connector.Vndr.Adobe.Tests.csproj", "{C2903B94-B7B4-525C-AC6A-DE5FBCADE029}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Apple.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Apple.Tests\StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj", "{0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Chromium.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Chromium.Tests\StellaOps.Concelier.Connector.Vndr.Chromium.Tests.csproj", "{7581D3D4-8C62-59F8-A085-143AA9DAFCB7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Cisco.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Cisco.Tests\StellaOps.Concelier.Connector.Vndr.Cisco.Tests.csproj", "{FB660FD7-F8C1-5FE1-85E7-066B22F23381}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Msrc.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Msrc.Tests\StellaOps.Concelier.Connector.Vndr.Msrc.Tests.csproj", "{8A7FC726-0271-514B-ABA4-EA48DDE93B8C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Oracle.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Oracle.Tests\StellaOps.Concelier.Connector.Vndr.Oracle.Tests.csproj", "{1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Vndr.Vmware.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Connector.Vndr.Vmware.Tests\StellaOps.Concelier.Connector.Vndr.Vmware.Tests.csproj", "{01D6CF66-7B69-5772-9811-C3BF554793C9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Core.Tests\StellaOps.Concelier.Core.Tests.csproj", "{1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Exporter.Json.Tests\StellaOps.Concelier.Exporter.Json.Tests.csproj", "{C4E024A9-91DE-5071-86FB-25B350B6D78E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj", "{58C665E2-C3A7-5E69-873D-B6FEC96FAB8C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Federation.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Federation.Tests\StellaOps.Concelier.Federation.Tests.csproj", "{AF70972B-54C3-5DEC-B005-B1CF4B84E14D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Integration.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Integration.Tests\StellaOps.Concelier.Integration.Tests.csproj", "{A284375A-B4E0-50C5-B3C0-766ECBF70CD1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Interest.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Interest.Tests\StellaOps.Concelier.Interest.Tests.csproj", "{CBEC642B-A4B3-5B3E-A5EF-64993811FDC9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Analyzers.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Merge.Analyzers.Tests\StellaOps.Concelier.Merge.Analyzers.Tests.csproj", "{C6BBD0A5-C811-50A3-A614-C535E7D0AF50}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Merge.Tests\StellaOps.Concelier.Merge.Tests.csproj", "{48256054-736E-5597-995F-BAF166998337}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Models.Tests\StellaOps.Concelier.Models.Tests.csproj", "{B4C782D3-CF67-5A0F-9E60-757405CF4BEB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Normalization.Tests\StellaOps.Concelier.Normalization.Tests.csproj", "{64756370-8E80-5638-B0F3-5EACFBB8FD64}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.ProofService.Postgres.Tests", "src\Concelier\__Tests\StellaOps.Concelier.ProofService.Postgres.Tests\StellaOps.Concelier.ProofService.Postgres.Tests.csproj", "{251DA02D-00DA-5211-BD79-AC28E18F326C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.RawModels.Tests", "src\Concelier\__Tests\StellaOps.Concelier.RawModels.Tests\StellaOps.Concelier.RawModels.Tests.csproj", "{E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SbomIntegration.Tests", "src\Concelier\__Tests\StellaOps.Concelier.SbomIntegration.Tests\StellaOps.Concelier.SbomIntegration.Tests.csproj", "{C7551073-07A8-58AA-BCB0-5CB79FC2D109}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.SourceIntel.Tests", "src\Concelier\__Tests\StellaOps.Concelier.SourceIntel.Tests\StellaOps.Concelier.SourceIntel.Tests.csproj", "{06187BD6-754B-529E-BFF1-CA5D0FA4D5D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Postgres.Tests", "src\Concelier\__Tests\StellaOps.Concelier.Storage.Postgres.Tests\StellaOps.Concelier.Storage.Postgres.Tests.csproj", "{17508C6F-FADD-5BCE-B47B-0A78F4AA437E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService.Tests", "src\Concelier\__Tests\StellaOps.Concelier.WebService.Tests\StellaOps.Concelier.WebService.Tests.csproj", "{5545C1F3-B963-5FAA-ACD7-9F57D4470F19}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CC66F815-F123-53D0-83A3-83137F66DA87}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService", "src\Concelier\StellaOps.Concelier.WebService\StellaOps.Concelier.WebService.csproj", "{492926FA-134A-5BF8-9148-97D9A291E3C5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cryptography", "Cryptography", "{33AD4C5F-D4B9-5820-999F-D733192BB68A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{7D8AF489-7371-52B5-ACD5-53CC2E862A1D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "src\Cryptography\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{F82ACF7C-966D-5C85-AB8C-637206C2495D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Profiles.Ecdsa", "src\Cryptography\StellaOps.Cryptography.Profiles.Ecdsa\StellaOps.Cryptography.Profiles.Ecdsa.csproj", "{C0BA2B16-7593-55EF-9368-CF06C1F94379}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Profiles.EdDsa", "src\Cryptography\StellaOps.Cryptography.Profiles.EdDsa\StellaOps.Cryptography.Profiles.EdDsa.csproj", "{CE252920-E8A0-5175-B211-CD71EABCFC75}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{1BB68895-DA5E-5335-AB62-7C7C7F599205}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "src\__Libraries\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{5970CA22-EC4F-5D2F-906D-8B5B934E2547}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.DependencyInjection", "src\__Libraries\StellaOps.Cryptography.DependencyInjection\StellaOps.Cryptography.DependencyInjection.csproj", "{2F6D6D31-28AC-5022-BD72-61F153062B6C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Kms", "src\__Libraries\StellaOps.Cryptography.Kms\StellaOps.Cryptography.Kms.csproj", "{E7CD5254-7D73-585E-94B8-E70C281423F1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Providers.OfflineVerification", "src\__Libraries\StellaOps.Cryptography.Providers.OfflineVerification\StellaOps.Cryptography.Providers.OfflineVerification.csproj", "{BB1F45C7-44CB-516D-A888-4E1EAEABF44B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.BouncyCastle", "src\__Libraries\StellaOps.Cryptography.Plugin.BouncyCastle\StellaOps.Cryptography.Plugin.BouncyCastle.csproj", "{D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.CryptoPro", "src\__Libraries\StellaOps.Cryptography.Plugin.CryptoPro\StellaOps.Cryptography.Plugin.CryptoPro.csproj", "{769E6552-E895-5951-8C67-86B251A6036B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.EIDAS", "src\__Libraries\StellaOps.Cryptography.Plugin.EIDAS\StellaOps.Cryptography.Plugin.EIDAS.csproj", "{92336BE4-5E46-5C13-B200-69A80999182B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OfflineVerification", "src\__Libraries\StellaOps.Cryptography.Plugin.OfflineVerification\StellaOps.Cryptography.Plugin.OfflineVerification.csproj", "{7531EC3D-6ADD-5551-ADC2-A283A56028FF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OpenSslGost", "src\__Libraries\StellaOps.Cryptography.Plugin.OpenSslGost\StellaOps.Cryptography.Plugin.OpenSslGost.csproj", "{C270C125-2FCB-5F43-A1B0-EE27079662BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.Pkcs11Gost", "src\__Libraries\StellaOps.Cryptography.Plugin.Pkcs11Gost\StellaOps.Cryptography.Plugin.Pkcs11Gost.csproj", "{AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.PqSoft", "src\__Libraries\StellaOps.Cryptography.Plugin.PqSoft\StellaOps.Cryptography.Plugin.PqSoft.csproj", "{3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SimRemote", "src\__Libraries\StellaOps.Cryptography.Plugin.SimRemote\StellaOps.Cryptography.Plugin.SimRemote.csproj", "{23A27A2A-2C8E-5C38-9F17-06FCDD87C147}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmRemote", "src\__Libraries\StellaOps.Cryptography.Plugin.SmRemote\StellaOps.Cryptography.Plugin.SmRemote.csproj", "{E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmSoft", "src\__Libraries\StellaOps.Cryptography.Plugin.SmSoft\StellaOps.Cryptography.Plugin.SmSoft.csproj", "{BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.WineCsp", "src\__Libraries\StellaOps.Cryptography.Plugin.WineCsp\StellaOps.Cryptography.Plugin.WineCsp.csproj", "{FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.PluginLoader", "src\__Libraries\StellaOps.Cryptography.PluginLoader\StellaOps.Cryptography.PluginLoader.csproj", "{E2AC4478-3191-5B4E-A0EB-222156F9C2F0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{2DD3A51E-C54C-5B89-9E80-6725631D7C98}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Kms.Tests", "src\__Libraries\__Tests\StellaOps.Cryptography.Kms.Tests\StellaOps.Cryptography.Kms.Tests.csproj", "{38127116-0764-53E6-B5B5-2BA0CA0B7F91}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OfflineVerification.Tests", "src\__Libraries\__Tests\StellaOps.Cryptography.Plugin.OfflineVerification.Tests\StellaOps.Cryptography.Plugin.OfflineVerification.Tests.csproj", "{7701FD94-6296-5CD5-8E7B-F7CAEA02052C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Tests", "src\__Libraries\__Tests\StellaOps.Cryptography.Tests\StellaOps.Cryptography.Tests.csproj", "{8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.EIDAS.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.EIDAS.Tests\StellaOps.Cryptography.Plugin.EIDAS.Tests.csproj", "{A07964A7-387D-587F-9507-5E89354A965A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmRemote.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.SmRemote.Tests\StellaOps.Cryptography.Plugin.SmRemote.Tests.csproj", "{69247914-5C25-5B86-8DA2-93F0C41EC3D2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmSoft.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.SmSoft.Tests\StellaOps.Cryptography.Plugin.SmSoft.Tests.csproj", "{67F2A597-9CF3-554A-89AF-A527D41D8831}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.PluginLoader.Tests", "src\__Libraries\StellaOps.Cryptography.PluginLoader.Tests\StellaOps.Cryptography.PluginLoader.Tests.csproj", "{CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Tests", "src\__Libraries\StellaOps.Cryptography.Tests\StellaOps.Cryptography.Tests.csproj", "{180A6CFD-B8CE-56A1-AFE8-030C06C67438}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EvidenceLocker", "EvidenceLocker", "{75A135A6-2344-5F0A-9314-4DF08380E567}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{6853411B-3FF4-5446-805B-D24664BF9822}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Core", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Core\StellaOps.EvidenceLocker.Core.csproj", "{69A89A48-4FF1-56DD-95F4-B81DBAADACDA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.csproj", "{22C6842B-7851-510C-9DBB-675188E2B020}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Infrastructure", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Infrastructure\StellaOps.EvidenceLocker.Infrastructure.csproj", "{D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{ECFC702B-9395-5F70-A935-FFA7CD63F36D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Tests", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Tests\StellaOps.EvidenceLocker.Tests.csproj", "{5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{AEAA70CB-616D-57FA-BB16-65807FA8D160}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.WebService", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.WebService\StellaOps.EvidenceLocker.WebService.csproj", "{027F58E2-96C8-55C3-B22B-1EC5B0621106}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{DB13510A-AFA8-55AA-9918-99B7BCF13AA9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.EvidenceLocker.Worker", "src\EvidenceLocker\StellaOps.EvidenceLocker\StellaOps.EvidenceLocker.Worker\StellaOps.EvidenceLocker.Worker.csproj", "{A973EE14-705D-555F-B115-B97D5ADAEA8D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Excititor", "Excititor", "{71B4078C-ED75-5332-876E-9B3AD5B6A435}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{166419DF-16BC-5CC6-9634-6AD9517AA816}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.ArtifactStores.S3", "src\Excititor\__Libraries\StellaOps.Excititor.ArtifactStores.S3\StellaOps.Excititor.ArtifactStores.S3.csproj", "{88C1DF3F-74F3-507F-B63C-EA54EA56C95C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Attestation", "src\Excititor\__Libraries\StellaOps.Excititor.Attestation\StellaOps.Excititor.Attestation.csproj", "{F931F697-CC40-55BB-999E-BAA4302595E5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core", "src\Excititor\__Libraries\StellaOps.Excititor.Core\StellaOps.Excititor.Core.csproj", "{BD92B2EA-2C70-514D-B74F-76AD834A0AA4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Export", "src\Excititor\__Libraries\StellaOps.Excititor.Export\StellaOps.Excititor.Export.csproj", "{309B5313-C885-5629-B9A9-674A532CC498}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Formats.CSAF\StellaOps.Excititor.Formats.CSAF.csproj", "{AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CycloneDX", "src\Excititor\__Libraries\StellaOps.Excititor.Formats.CycloneDX\StellaOps.Excititor.Formats.CycloneDX.csproj", "{C0D986EF-15F8-588D-86C8-574B9978D0D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.OpenVEX", "src\Excititor\__Libraries\StellaOps.Excititor.Formats.OpenVEX\StellaOps.Excititor.Formats.OpenVEX.csproj", "{80686466-E848-57CD-99D9-644EEA055741}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Policy", "src\Excititor\__Libraries\StellaOps.Excititor.Policy\StellaOps.Excititor.Policy.csproj", "{D906F4BC-54A4-567F-8DD9-4A00C6DC3F75}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Storage.Postgres", "src\Excititor\__Libraries\StellaOps.Excititor.Storage.Postgres\StellaOps.Excititor.Storage.Postgres.csproj", "{48EAC4C2-5B05-5350-83C8-5F25DC7632D5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Abstractions", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Abstractions\StellaOps.Excititor.Connectors.Abstractions.csproj", "{41F6B7F1-7767-5A85-B9B5-C70D69F80000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Cisco.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Cisco.CSAF\StellaOps.Excititor.Connectors.Cisco.CSAF.csproj", "{BA5C61B1-EFF0-5FD7-A92F-4E464C16056B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.MSRC.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.MSRC.CSAF\StellaOps.Excititor.Connectors.MSRC.CSAF.csproj", "{1CC50534-78D2-5DC6-9DCF-8D64532260F8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.csproj", "{7DED5634-FD01-5854-96BA-C3F636FB6B10}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Oracle.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Oracle.CSAF\StellaOps.Excititor.Connectors.Oracle.CSAF.csproj", "{3083A5E6-84E0-57FA-8F5F-ECA046992707}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.RedHat.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.RedHat.CSAF\StellaOps.Excititor.Connectors.RedHat.CSAF.csproj", "{B70F4C3D-0BF7-59B7-9627-4EF8E7247A17}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.SUSE.RancherVEXHub", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.csproj", "{FD121908-49E7-5B7B-B8E6-A4FEB65D59DA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Ubuntu.CSAF", "src\Excititor\__Libraries\StellaOps.Excititor.Connectors.Ubuntu.CSAF\StellaOps.Excititor.Connectors.Ubuntu.CSAF.csproj", "{8929D374-4010-5CAC-8EC0-693194B7216E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.ArtifactStores.S3.Tests", "src\Excititor\__Tests\StellaOps.Excititor.ArtifactStores.S3.Tests\StellaOps.Excititor.ArtifactStores.S3.Tests.csproj", "{21342480-FC88-5789-B7B2-5D9AC7ED18F6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Attestation.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Attestation.Tests\StellaOps.Excititor.Attestation.Tests.csproj", "{34D26AF7-F7C3-5D31-8E45-D545DE7B56A9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Cisco.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.Cisco.CSAF.Tests\StellaOps.Excititor.Connectors.Cisco.CSAF.Tests.csproj", "{56414F70-A7F6-55C1-B219-DABC8345E9EE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.MSRC.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.MSRC.CSAF.Tests\StellaOps.Excititor.Connectors.MSRC.CSAF.Tests.csproj", "{486EA70D-9F0F-5259-B908-580A60863C5A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests\StellaOps.Excititor.Connectors.OCI.OpenVEX.Attest.Tests.csproj", "{21950636-1E41-520C-978D-6C52417F49CB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Oracle.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.Oracle.CSAF.Tests\StellaOps.Excititor.Connectors.Oracle.CSAF.Tests.csproj", "{A3045438-648F-5E60-974C-8A6593165CD7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.RedHat.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.RedHat.CSAF.Tests\StellaOps.Excititor.Connectors.RedHat.CSAF.Tests.csproj", "{393B31FC-1469-5DB5-8B89-C6E9AC69A058}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests\StellaOps.Excititor.Connectors.SUSE.RancherVEXHub.Tests.csproj", "{3E4B26B0-B184-5184-B086-618F362D3EA8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests\StellaOps.Excititor.Connectors.Ubuntu.CSAF.Tests.csproj", "{74961AF8-0434-5863-B516-179CBD4DD354}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Core.Tests\StellaOps.Excititor.Core.Tests.csproj", "{D2C87350-D8EE-5774-9D07-5DB161C1CAFA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Core.UnitTests", "src\Excititor\__Tests\StellaOps.Excititor.Core.UnitTests\StellaOps.Excititor.Core.UnitTests.csproj", "{46F08BCB-C218-5A58-8949-E7CD119BCAB6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Export.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Export.Tests\StellaOps.Excititor.Export.Tests.csproj", "{9654C643-AD78-586B-819D-8C081576D60C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CSAF.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Formats.CSAF.Tests\StellaOps.Excititor.Formats.CSAF.Tests.csproj", "{ADF02308-4349-5280-9E05-75A6C619E0EC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.CycloneDX.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Formats.CycloneDX.Tests\StellaOps.Excititor.Formats.CycloneDX.Tests.csproj", "{3B4D6BEF-0934-5981-B776-AA13BE7FD25E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Formats.OpenVEX.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Formats.OpenVEX.Tests\StellaOps.Excititor.Formats.OpenVEX.Tests.csproj", "{B335DFD5-EAF4-5083-9B37-0435F93396B3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Policy.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Policy.Tests\StellaOps.Excititor.Policy.Tests.csproj", "{986F3041-3E8A-52E0-A965-92243093D1C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Storage.Postgres.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Storage.Postgres.Tests\StellaOps.Excititor.Storage.Postgres.Tests.csproj", "{8BD98D23-C7B0-566E-8843-17BE8E005B6F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.WebService.Tests", "src\Excititor\__Tests\StellaOps.Excititor.WebService.Tests\StellaOps.Excititor.WebService.Tests.csproj", "{89B612AB-821C-5707-831E-CF01A24E0FBA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Worker.Tests", "src\Excititor\__Tests\StellaOps.Excititor.Worker.Tests\StellaOps.Excititor.Worker.Tests.csproj", "{D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{BBEB3971-7F5F-5733-A5B6-4BFDE6D8FD39}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.WebService", "src\Excititor\StellaOps.Excititor.WebService\StellaOps.Excititor.WebService.csproj", "{B79F5D06-CC07-50E0-9916-CD91E53BCE4F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{3662068D-D45B-5BB0-8547-E431434F6A31}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Excititor.Worker", "src\Excititor\StellaOps.Excititor.Worker\StellaOps.Excititor.Worker.csproj", "{D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ExportCenter", "ExportCenter", "{A56334DF-E16C-5CA1-A53B-B2463BE1285C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Client", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Client\StellaOps.ExportCenter.Client.csproj", "{8CE426C9-853D-5FE0-A939-954D7787890A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Core", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Core\StellaOps.ExportCenter.Core.csproj", "{DF324128-78D3-54C8-AAE0-852EA18A4175}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Infrastructure", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Infrastructure\StellaOps.ExportCenter.Infrastructure.csproj", "{3B0B6785-6E80-5615-9076-F10DD4ED79FC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.RiskBundles", "src\ExportCenter\StellaOps.ExportCenter.RiskBundles\StellaOps.ExportCenter.RiskBundles.csproj", "{9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{80B4238D-14D4-53B9-8DDE-5AAF6963B6D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Client.Tests", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Client.Tests\StellaOps.ExportCenter.Client.Tests.csproj", "{F11FF9FF-2A02-5470-93B8-75A8AB307992}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Tests", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Tests\StellaOps.ExportCenter.Tests.csproj", "{14E66575-1C2C-5223-9286-BE65FD8FCD6E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CA8130F6-DB6A-55F8-A656-DDDEA0B1555A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.WebService", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.WebService\StellaOps.ExportCenter.WebService.csproj", "{17161A8D-0F28-5998-9C38-A09E8A0DFECD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{ABFB61E3-5DEC-5E1A-BAAC-D5BF448B7C65}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ExportCenter.Worker", "src\ExportCenter\StellaOps.ExportCenter\StellaOps.ExportCenter.Worker\StellaOps.ExportCenter.Worker.csproj", "{7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gateway", "Gateway", "{11942B47-88E5-5886-AAAD-FA4DCC461D2A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D613FC8A-C7D0-5159-BD5E-DD2A912D4430}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Gateway.WebService.Tests", "src\__Tests\StellaOps.Gateway.WebService.Tests\StellaOps.Gateway.WebService.Tests.csproj", "{85B39AEB-D264-59E3-AE46-C6E09D60816F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Gateway.WebService.Tests", "src\Gateway\__Tests\StellaOps.Gateway.WebService.Tests\StellaOps.Gateway.WebService.Tests.csproj", "{B22104F2-C574-5E22-ACE9-5E218FCF4ED6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{779F3EC3-3CCC-5B43-87B9-5C67C5B9FBAD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Gateway.WebService", "src\Gateway\StellaOps.Gateway.WebService\StellaOps.Gateway.WebService.csproj", "{2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Graph", "Graph", "{FD98BA86-C18F-5E6F-BDF5-47D53892B0E4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{345A6909-395A-5FAB-8832-2941AFB684FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Api", "src\Graph\StellaOps.Graph.Api\StellaOps.Graph.Api.csproj", "{E04423CA-6046-55AF-92F1-C8492E44A1F4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer", "src\Graph\StellaOps.Graph.Indexer\StellaOps.Graph.Indexer.csproj", "{500252B3-468C-5303-B06E-C961A475C519}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Storage.Postgres", "src\Graph\StellaOps.Graph.Indexer.Storage.Postgres\StellaOps.Graph.Indexer.Storage.Postgres.csproj", "{2004E176-092C-5C14-A7F0-11CC8E383B5C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9F34C945-1CBF-5F89-B0B6-9B38E74A7718}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Tests", "src\__Tests\Graph\StellaOps.Graph.Indexer.Tests\StellaOps.Graph.Indexer.Tests.csproj", "{F064B0DB-FE3A-58F4-8E8C-904C04749A55}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Api.Tests", "src\Graph\__Tests\StellaOps.Graph.Api.Tests\StellaOps.Graph.Api.Tests.csproj", "{5618B67A-A525-5958-8001-9AB7A7EB6412}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Tests", "src\Graph\__Tests\StellaOps.Graph.Indexer.Tests\StellaOps.Graph.Indexer.Tests.csproj", "{D382EF88-1144-5CF4-B768-5A124EB8CF0A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Graph.Indexer.Storage.Postgres.Tests", "src\Graph\StellaOps.Graph.Indexer.Storage.Postgres.Tests\StellaOps.Graph.Indexer.Storage.Postgres.Tests.csproj", "{C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{9959D246-3C94-5F38-9D11-E30E754AFDDB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Analyzers", "src\__Analyzers\StellaOps.Determinism.Analyzers\StellaOps.Determinism.Analyzers.csproj", "{DA8F7D8C-2022-51C1-9235-1B3613EB703D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LanguageAnalyzerSmoke", "src\Tools\LanguageAnalyzerSmoke\LanguageAnalyzerSmoke.csproj", "{D2B3DDE0-F44F-5B57-9D3E-679E18FC1032}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{303F85EF-F67E-57CC-9BDD-2381265243FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.BinaryAnalysis", "src\Feedser\StellaOps.Feedser.BinaryAnalysis\StellaOps.Feedser.BinaryAnalysis.csproj", "{600F0F8D-D86F-5CA6-B4E6-7DFB6860981E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core", "src\Feedser\StellaOps.Feedser.Core\StellaOps.Feedser.Core.csproj", "{9A62D7DD-B9F1-5CDD-96D3-07573296F939}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger", "src\Findings\StellaOps.Findings.Ledger\StellaOps.Findings.Ledger.csproj", "{B9B66624-23D7-53C7-B1F5-B1476F5435F2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LedgerReplayHarness", "src\Findings\StellaOps.Findings.Ledger\tools\LedgerReplayHarness\LedgerReplayHarness.csproj", "{36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LedgerReplayHarness", "src\Findings\tools\LedgerReplayHarness\LedgerReplayHarness.csproj", "{087B1096-EE56-5337-81C4-3655FEC38AAB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Core", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Core\StellaOps.PacksRegistry.Core.csproj", "{07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Infrastructure", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Infrastructure\StellaOps.PacksRegistry.Infrastructure.csproj", "{394D1A61-BA24-529C-B049-B377DAB866CF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Storage.Postgres", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Storage.Postgres\StellaOps.PacksRegistry.Storage.Postgres.csproj", "{5B598FA9-5AE8-566D-B6D8-C87792622114}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation", "src\Provenance\StellaOps.Provenance.Attestation\StellaOps.Provenance.Attestation.csproj", "{5C964413-BA49-5580-A781-A020335C9301}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tool", "src\Provenance\StellaOps.Provenance.Attestation.Tool\StellaOps.Provenance.Attestation.Tool.csproj", "{FF74E087-9D87-5321-B99B-70FE364B9422}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Registry.TokenService", "src\Registry\StellaOps.Registry.TokenService\StellaOps.Registry.TokenService.csproj", "{8CC218FA-816B-5D5F-9BDD-19F88444B22B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Core", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Core\StellaOps.RiskEngine.Core.csproj", "{6B99DEB6-D5DF-5BF1-A9A4-228A757D4836}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Infrastructure", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Infrastructure\StellaOps.RiskEngine.Infrastructure.csproj", "{CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SmRemote.Service", "src\SmRemote\StellaOps.SmRemote.Service\StellaOps.SmRemote.Service.csproj", "{3E780079-10D2-5AD2-95FC-98E46718B231}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Bundle", "src\Symbols\StellaOps.Symbols.Bundle\StellaOps.Symbols.Bundle.csproj", "{C3B48707-75F7-56DD-9FBD-65DE8D53353B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Client", "src\Symbols\StellaOps.Symbols.Client\StellaOps.Symbols.Client.csproj", "{A2A04CF8-28FC-51DB-8BC4-00440822348F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Core", "src\Symbols\StellaOps.Symbols.Core\StellaOps.Symbols.Core.csproj", "{3F03AECF-1508-5F69-97C3-C2DF3A01B7E1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Infrastructure", "src\Symbols\StellaOps.Symbols.Infrastructure\StellaOps.Symbols.Infrastructure.csproj", "{68D37855-2734-5614-AFF7-39D2FAD17795}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Symbols.Server", "src\Symbols\StellaOps.Symbols.Server\StellaOps.Symbols.Server.csproj", "{772A91FD-98F3-5EA2-9CB4-E3088C839D32}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Core", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Core\StellaOps.TimelineIndexer.Core.csproj", "{B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Infrastructure", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Infrastructure\StellaOps.TimelineIndexer.Infrastructure.csproj", "{1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FixtureUpdater", "src\Tools\FixtureUpdater\FixtureUpdater.csproj", "{9B85AD15-32BB-5A24-8243-52FD11033E1B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotifySmokeCheck", "src\Tools\NotifySmokeCheck\NotifySmokeCheck.csproj", "{1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicyDslValidator", "src\Tools\PolicyDslValidator\PolicyDslValidator.csproj", "{222C4ED7-2DD8-5F51-A249-323B1F414AE6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicySchemaExporter", "src\Tools\PolicySchemaExporter\PolicySchemaExporter.csproj", "{A3D24CDD-0855-5F57-989B-5D8C6CF3570D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolicySimulationSmoke", "src\Tools\PolicySimulationSmoke\PolicySimulationSmoke.csproj", "{4A1395E2-E03E-542C-B190-BDAA205A0E1F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RustFsMigrator", "src\Tools\RustFsMigrator\RustFsMigrator.csproj", "{3C4B8D17-0B69-571F-9B6C-6E945937A3B3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{6F0F4397-95CB-56A9-939E-6731390C383E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Audit.ReplayToken", "src\__Libraries\StellaOps.Audit.ReplayToken\StellaOps.Audit.ReplayToken.csproj", "{E648086E-E39B-5B18-BFDA-E597D04C536A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack", "src\__Libraries\StellaOps.AuditPack\StellaOps.AuditPack.csproj", "{1D75EF57-0B94-54F5-9FCB-16A888141420}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Security", "src\__Libraries\StellaOps.Auth.Security\StellaOps.Auth.Security.csproj", "{8A42C228-E80F-5DA1-A752-29F9C7D7FDDC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonical.Json", "src\__Libraries\StellaOps.Canonical.Json\StellaOps.Canonical.Json.csproj", "{683D176E-ECB8-5F5D-AC6E-E2E3E33526DB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonicalization", "src\__Libraries\StellaOps.Canonicalization\StellaOps.Canonicalization.csproj", "{5C0BB750-025E-5E1D-B717-B871883AAFDE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", "src\__Libraries\StellaOps.Configuration\StellaOps.Configuration.csproj", "{F03873D8-5506-5461-AF91-247DEF04D700}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GostCryptography", "src\__Libraries\StellaOps.Cryptography.Plugin.CryptoPro\third_party\AlexMAS.GostCryptography\Source\GostCryptography\GostCryptography.csproj", "{76D66413-B838-5648-BF18-B87DD5084BFC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DeltaVerdict", "src\__Libraries\StellaOps.DeltaVerdict\StellaOps.DeltaVerdict.csproj", "{02D3276B-BB16-536D-BF6C-CD9067EE2F27}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DependencyInjection", "src\__Libraries\StellaOps.DependencyInjection\StellaOps.DependencyInjection.csproj", "{A8F451BE-6076-5D9D-BDF9-FF270ED0391B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Abstractions", "src\__Libraries\StellaOps.Determinism.Abstractions\StellaOps.Determinism.Abstractions.csproj", "{65906110-4508-5D7A-A870-2225135CA2AB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence", "src\__Libraries\StellaOps.Evidence\StellaOps.Evidence.csproj", "{836920D9-3DC3-5926-8ACF-CF41CD59EDB1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Bundle", "src\__Libraries\StellaOps.Evidence.Bundle\StellaOps.Evidence.Bundle.csproj", "{48BCAF76-EDC4-570D-98C2-032DB39D8662}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Core", "src\__Libraries\StellaOps.Evidence.Core\StellaOps.Evidence.Core.csproj", "{02568C86-83B4-588D-9EA2-58ABAD29DE27}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Storage.Postgres", "src\__Libraries\StellaOps.Evidence.Storage.Postgres\StellaOps.Evidence.Storage.Postgres.csproj", "{034AD4BC-E7E5-5F87-8A30-12D71BFF63E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres", "src\__Libraries\StellaOps.Infrastructure.Postgres\StellaOps.Infrastructure.Postgres.csproj", "{32CD344F-484F-59C3-AC24-3FD9806DD3D6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Ingestion.Telemetry", "src\__Libraries\StellaOps.Ingestion.Telemetry\StellaOps.Ingestion.Telemetry.csproj", "{E8B300BA-17CC-5884-97DB-C53176BD92FA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Interop", "src\__Libraries\StellaOps.Interop\StellaOps.Interop.csproj", "{B53D2725-B209-56C2-854A-733AA23791BA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging", "src\__Libraries\StellaOps.Messaging\StellaOps.Messaging.csproj", "{2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.InMemory", "src\__Libraries\StellaOps.Messaging.Transport.InMemory\StellaOps.Messaging.Transport.InMemory.csproj", "{303C5589-5F40-5AB6-AC14-B74330F4ABCD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Postgres", "src\__Libraries\StellaOps.Messaging.Transport.Postgres\StellaOps.Messaging.Transport.Postgres.csproj", "{ACC984E9-DD35-50E3-9DEE-4D31E3905798}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Valkey", "src\__Libraries\StellaOps.Messaging.Transport.Valkey\StellaOps.Messaging.Transport.Valkey.csproj", "{B0455206-6836-5CCC-981F-DE01652F719E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Metrics", "src\__Libraries\StellaOps.Metrics\StellaOps.Metrics.csproj", "{378D4FEB-0052-5910-A0C6-F23FFAFF9622}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice", "src\__Libraries\StellaOps.Microservice\StellaOps.Microservice.csproj", "{D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.AspNetCore", "src\__Libraries\StellaOps.Microservice.AspNetCore\StellaOps.Microservice.AspNetCore.csproj", "{1772BDC5-1285-5297-A93D-F57692363BB2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.SourceGen", "src\__Libraries\StellaOps.Microservice.SourceGen\StellaOps.Microservice.SourceGen.csproj", "{20030AD8-C9FC-5CDA-BA0E-DE13E792A314}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache", "src\__Libraries\StellaOps.Provcache\StellaOps.Provcache.csproj", "{1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Api", "src\__Libraries\StellaOps.Provcache.Api\StellaOps.Provcache.Api.csproj", "{787405E2-7F5B-5CC2-821E-A54AF8CE3843}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Postgres", "src\__Libraries\StellaOps.Provcache.Postgres\StellaOps.Provcache.Postgres.csproj", "{468F9192-74B5-5791-807B-A0507E99AE1F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Valkey", "src\__Libraries\StellaOps.Provcache.Valkey\StellaOps.Provcache.Valkey.csproj", "{AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance", "src\__Libraries\StellaOps.Provenance\StellaOps.Provenance.csproj", "{02A180E2-6690-5EA6-9AD4-4A9616DC1489}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Resolver", "src\__Libraries\StellaOps.Resolver\StellaOps.Resolver.csproj", "{98DBA04A-9F13-5740-8713-48A21F41D158}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.AspNet", "src\__Libraries\StellaOps.Router.AspNet\StellaOps.Router.AspNet.csproj", "{059A8E08-8A8E-5766-9556-C3E18707A316}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common", "src\__Libraries\StellaOps.Router.Common\StellaOps.Router.Common.csproj", "{A0EF31BA-A294-5B97-BAAA-84737FFB0441}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config", "src\__Libraries\StellaOps.Router.Config\StellaOps.Router.Config.csproj", "{49F92D69-4B38-5502-8856-FFD90DEB4ED9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Gateway", "src\__Libraries\StellaOps.Router.Gateway\StellaOps.Router.Gateway.csproj", "{BA04E8CF-051D-5A9C-B866-AB9470319426}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory", "src\__Libraries\StellaOps.Router.Transport.InMemory\StellaOps.Router.Transport.InMemory.csproj", "{3FBC55A5-8773-5BDC-BF58-45FAC2950D89}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Messaging", "src\__Libraries\StellaOps.Router.Transport.Messaging\StellaOps.Router.Transport.Messaging.csproj", "{33BBE42C-6D04-56C2-8A5D-736F670198CE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.RabbitMq", "src\__Libraries\StellaOps.Router.Transport.RabbitMq\StellaOps.Router.Transport.RabbitMq.csproj", "{ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tcp", "src\__Libraries\StellaOps.Router.Transport.Tcp\StellaOps.Router.Transport.Tcp.csproj", "{B3A40257-0096-553A-BDDB-ECD222F47D98}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tls", "src\__Libraries\StellaOps.Router.Transport.Tls\StellaOps.Router.Transport.Tls.csproj", "{6CEE9751-CA80-5B25-B7D3-DCB24085450D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp", "src\__Libraries\StellaOps.Router.Transport.Udp\StellaOps.Router.Transport.Udp.csproj", "{19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TestKit", "src\__Libraries\StellaOps.TestKit\StellaOps.TestKit.csproj", "{D1504F57-82C2-5BE5-9524-B3371BC26F82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VersionComparison", "src\__Libraries\StellaOps.VersionComparison\StellaOps.VersionComparison.csproj", "{9B29BB87-FEF3-5EF9-8D64-D005408705EC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Core", "src\Unknowns\__Libraries\StellaOps.Unknowns.Core\StellaOps.Unknowns.Core.csproj", "{D67441E5-0211-563B-A29E-7C1A0C815A7C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Storage.Postgres", "src\Unknowns\__Libraries\StellaOps.Unknowns.Storage.Postgres\StellaOps.Unknowns.Storage.Postgres.csproj", "{A5516E04-C25E-574B-BDA9-25F17B89EA72}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{A1795401-DAF5-5F44-B3F6-173F7DF8897F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin", "src\__Libraries\StellaOps.Plugin\StellaOps.Plugin.csproj", "{85D772C5-941E-54D2-A07F-CCD85DE0F37F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C6EAF280-23DC-52B2-B52C-AB20ED55AB42}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Determinism.Analyzers.Tests", "src\__Analyzers\StellaOps.Determinism.Analyzers.Tests\StellaOps.Determinism.Analyzers.Tests.csproj", "{046A3473-60D2-5BD4-ACFC-5051CAC08296}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack.Tests", "src\__Libraries\__Tests\StellaOps.AuditPack.Tests\StellaOps.AuditPack.Tests.csproj", "{690D6500-40C1-57CF-80DF-BCC788C0F09D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonicalization.Tests", "src\__Libraries\__Tests\StellaOps.Canonicalization.Tests\StellaOps.Canonicalization.Tests.csproj", "{B631B34A-610F-5F25-A68B-8E2EB93D813F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration.Tests", "src\__Libraries\__Tests\StellaOps.Configuration.Tests\StellaOps.Configuration.Tests.csproj", "{A89D579D-119A-512E-ACEB-00C66A99E871}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DeltaVerdict.Tests", "src\__Libraries\__Tests\StellaOps.DeltaVerdict.Tests\StellaOps.DeltaVerdict.Tests.csproj", "{C0D1E717-51E3-578B-BEDB-F9A02F54042C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Storage.Postgres.Tests", "src\__Libraries\__Tests\StellaOps.Evidence.Storage.Postgres.Tests\StellaOps.Evidence.Storage.Postgres.Tests.csproj", "{04CEAD38-EF61-56A0-A507-72B12606767F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Tests", "src\__Libraries\__Tests\StellaOps.Evidence.Tests\StellaOps.Evidence.Tests.csproj", "{CC86C30A-0EEB-594F-9680-DB32F10ED128}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres.Tests", "src\__Libraries\__Tests\StellaOps.Infrastructure.Postgres.Tests\StellaOps.Infrastructure.Postgres.Tests.csproj", "{931FAFFC-095E-59B7-9E93-EFAA06CD10EB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Transport.Valkey.Tests", "src\__Libraries\__Tests\StellaOps.Messaging.Transport.Valkey.Tests\StellaOps.Messaging.Transport.Valkey.Tests.csproj", "{55593DA0-334B-58C8-BD12-32BD2362A384}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Metrics.Tests", "src\__Libraries\__Tests\StellaOps.Metrics.Tests\StellaOps.Metrics.Tests.csproj", "{34A4AD39-111F-5D02-83ED-6FB0B71B3539}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.AspNetCore.Tests", "src\__Libraries\__Tests\StellaOps.Microservice.AspNetCore.Tests\StellaOps.Microservice.AspNetCore.Tests.csproj", "{3A446391-6537-5C7E-885D-A60B8C6402AD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.SourceGen.Tests", "src\__Libraries\__Tests\StellaOps.Microservice.SourceGen.Tests\StellaOps.Microservice.SourceGen.Tests.csproj", "{0A18583B-3913-5C71-900C-8BDB320D6461}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.Tests", "src\__Libraries\__Tests\StellaOps.Microservice.Tests\StellaOps.Microservice.Tests.csproj", "{6064B3DA-2322-5B7E-B27D-4D0E976114A7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin.Tests", "src\__Libraries\__Tests\StellaOps.Plugin.Tests\StellaOps.Plugin.Tests.csproj", "{254361C7-78CF-5510-8D5B-DC1AD1370726}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provcache.Tests", "src\__Libraries\__Tests\StellaOps.Provcache.Tests\StellaOps.Provcache.Tests.csproj", "{4990948A-CB1D-54FE-8C2E-AA1D0D275B22}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common.Tests", "src\__Libraries\__Tests\StellaOps.Router.Common.Tests\StellaOps.Router.Common.Tests.csproj", "{9D1A020C-0800-5A7C-85DF-4C04A922894B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config.Tests", "src\__Libraries\__Tests\StellaOps.Router.Config.Tests\StellaOps.Router.Config.Tests.csproj", "{8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Integration.Tests", "src\__Libraries\__Tests\StellaOps.Router.Integration.Tests\StellaOps.Router.Integration.Tests.csproj", "{E0341225-8AC0-5A3D-90FA-253A39188C59}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.InMemory.Tests\StellaOps.Router.Transport.InMemory.Tests.csproj", "{63AA5DD3-66EC-5770-A2AF-73214634BE74}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.RabbitMq.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.RabbitMq.Tests\StellaOps.Router.Transport.RabbitMq.Tests.csproj", "{5422FC92-32F8-5B7C-8808-F9F3B01096BA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tcp.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.Tcp.Tests\StellaOps.Router.Transport.Tcp.Tests.csproj", "{239AEE8E-4762-5DC0-AE89-99C559DC3C0C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Tls.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.Tls.Tests\StellaOps.Router.Transport.Tls.Tests.csproj", "{940ADFE2-7115-5A6B-8083-E6E9959C5126}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp.Tests", "src\__Libraries\__Tests\StellaOps.Router.Transport.Udp.Tests\StellaOps.Router.Transport.Udp.Tests.csproj", "{C2F4CEBC-0FD0-5711-977B-D15B63B6283F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism.Tests", "src\__Libraries\__Tests\StellaOps.Testing.Determinism.Tests\StellaOps.Testing.Determinism.Tests.csproj", "{D6C8C992-6C92-5B42-8C16-DD8579A33A50}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Manifests.Tests", "src\__Libraries\__Tests\StellaOps.Testing.Manifests.Tests\StellaOps.Testing.Manifests.Tests.csproj", "{914E3DA8-3A2A-541B-B212-E54E5B9E5FF9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TestKit.Tests", "src\__Libraries\__Tests\StellaOps.TestKit.Tests\StellaOps.TestKit.Tests.csproj", "{538897D7-98D3-5E80-BB85-2ADD354A6DAD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VersionComparison.Tests", "src\__Libraries\__Tests\StellaOps.VersionComparison.Tests\StellaOps.VersionComparison.Tests.csproj", "{D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonical.Json.Tests", "src\__Libraries\StellaOps.Canonical.Json.Tests\StellaOps.Canonical.Json.Tests.csproj", "{0735AB65-C84E-5173-AA33-34D053A2206F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GostCryptography.Tests", "src\__Libraries\StellaOps.Cryptography.Plugin.CryptoPro\third_party\AlexMAS.GostCryptography\Source\GostCryptography.Tests\GostCryptography.Tests.csproj", "{DC026D6C-B3C7-563C-9686-598397B646F0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Core.Tests", "src\__Libraries\StellaOps.Evidence.Core.Tests\StellaOps.Evidence.Core.Tests.csproj", "{144905E9-FB74-5478-858D-214E98611302}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Resolver.Tests", "src\__Libraries\StellaOps.Resolver.Tests\StellaOps.Resolver.Tests.csproj", "{138E4BA5-CB08-5034-81E8-77CE875D2338}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core.Tests", "src\Feedser\__Tests\StellaOps.Feedser.Core.Tests\StellaOps.Feedser.Core.Tests.csproj", "{7E440D5A-47CC-5DEA-B24F-74FCEA985B4A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.Tests", "src\Findings\__Tests\StellaOps.Findings.Ledger.Tests\StellaOps.Findings.Ledger.Tests.csproj", "{E6BAF476-7A8E-5D90-85E5-40C6F3381750}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.Tests", "src\Findings\StellaOps.Findings.Ledger.Tests\StellaOps.Findings.Ledger.Tests.csproj", "{39F576C5-7241-5E33-9F70-6A3AC310AA9A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.Tests", "src\Notifier\StellaOps.Notifier\StellaOps.Notifier.Tests\StellaOps.Notifier.Tests.csproj", "{0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Storage.Postgres.Tests", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Storage.Postgres.Tests\StellaOps.PacksRegistry.Storage.Postgres.Tests.csproj", "{FF70148A-101D-5C79-8A6B-C82FEB1D0F2A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Tests", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Tests\StellaOps.PacksRegistry.Tests.csproj", "{92FB53E1-32EB-5F4E-833E-35A1CD62B32D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tests", "src\Provenance\__Tests\StellaOps.Provenance.Attestation.Tests\StellaOps.Provenance.Attestation.Tests.csproj", "{BCC4F860-588E-5D77-8632-FD3F433875BA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Registry.TokenService.Tests", "src\Registry\__Tests\StellaOps.Registry.TokenService.Tests\StellaOps.Registry.TokenService.Tests.csproj", "{611D6EF5-47DD-5683-80D1-D127FE684FBE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Tests", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Tests\StellaOps.RiskEngine.Tests.csproj", "{0DCAB8B4-4D58-521B-B7CE-F931660BC02D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Tests", "src\__Libraries\__Tests\StellaOps.Provenance.Tests\StellaOps.Provenance.Tests.csproj", "{8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Tests", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Tests\StellaOps.TimelineIndexer.Tests.csproj", "{928428D2-2BD5-59AB-8E56-7969B8A75B85}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Core.Tests", "src\Unknowns\__Tests\StellaOps.Unknowns.Core.Tests\StellaOps.Unknowns.Core.Tests.csproj", "{96C669DB-9F4A-5302-85BE-5D9EF48D64AA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Unknowns.Storage.Postgres.Tests", "src\Unknowns\__Tests\StellaOps.Unknowns.Storage.Postgres.Tests\StellaOps.Unknowns.Storage.Postgres.Tests.csproj", "{47513358-7F52-52B0-8A3A-F6F7083A1357}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{70543E0A-0F3A-5954-9C13-3972FA97737A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Findings.Ledger.WebService", "src\Findings\StellaOps.Findings.Ledger.WebService\StellaOps.Findings.Ledger.WebService.csproj", "{3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.WebService", "src\Notifier\StellaOps.Notifier\StellaOps.Notifier.WebService\StellaOps.Notifier.WebService.csproj", "{41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.WebService", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.WebService\StellaOps.PacksRegistry.WebService.csproj", "{865BED4F-1D52-5ECE-B19E-A4EA8177C690}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.WebService", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.WebService\StellaOps.RiskEngine.WebService.csproj", "{0C29ECF8-B816-58C1-8A0E-D2663C91D259}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.WebService", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.WebService\StellaOps.TimelineIndexer.WebService.csproj", "{A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{922A7463-1237-5064-A5E6-4B583E2D53A8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notifier.Worker", "src\Notifier\StellaOps.Notifier\StellaOps.Notifier.Worker\StellaOps.Notifier.Worker.csproj", "{79CFA9D7-7759-5EA5-9A68-735E4CF304FF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PacksRegistry.Worker", "src\PacksRegistry\StellaOps.PacksRegistry\StellaOps.PacksRegistry.Worker\StellaOps.PacksRegistry.Worker.csproj", "{A43B40D5-0F1B-544B-B621-C2A1D4292D05}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.RiskEngine.Worker", "src\RiskEngine\StellaOps.RiskEngine\StellaOps.RiskEngine.Worker\StellaOps.RiskEngine.Worker.csproj", "{4B422E10-2700-5740-8507-A9BA717DFF7E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TimelineIndexer.Worker", "src\TimelineIndexer\StellaOps.TimelineIndexer\StellaOps.TimelineIndexer.Worker\StellaOps.TimelineIndexer.Worker.csproj", "{693FBCDA-F357-5B46-93E4-1203E1912FEA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IssuerDirectory", "IssuerDirectory", "{C088E3B4-FC6A-53D6-9E58-D880F15DF7DC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{1D421D62-76ED-5076-A4DD-48E3D13232C2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Core", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Core\StellaOps.IssuerDirectory.Core.csproj", "{9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Infrastructure", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Infrastructure\StellaOps.IssuerDirectory.Infrastructure.csproj", "{FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Storage.Postgres\StellaOps.IssuerDirectory.Storage.Postgres.csproj", "{245C2445-685D-5F18-8557-0C3266C41358}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{47CA7D44-20AE-5238-AB1F-ED7382F2F034}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Client", "src\__Libraries\StellaOps.IssuerDirectory.Client\StellaOps.IssuerDirectory.Client.csproj", "{8AE5CA1F-85CD-5BCF-A406-15F68FDDA875}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{32554071-B945-5653-85C6-007D3DD4E6AC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres.Tests", "src\IssuerDirectory\__Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests.csproj", "{D7A538CE-DDAB-5F29-A55D-204C9BD1A157}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Storage.Postgres.Tests", "src\IssuerDirectory\StellaOps.IssuerDirectory\__Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests\StellaOps.IssuerDirectory.Storage.Postgres.Tests.csproj", "{ABE22056-D6B6-5B41-812A-8DCEC9812B8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.Core.Tests", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.Core.Tests\StellaOps.IssuerDirectory.Core.Tests.csproj", "{3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{3016D8EA-2B83-581B-B0EE-30AB6CA8A1D5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.IssuerDirectory.WebService", "src\IssuerDirectory\StellaOps.IssuerDirectory\StellaOps.IssuerDirectory.WebService\StellaOps.IssuerDirectory.WebService.csproj", "{59DCF5F1-F87C-5A73-A251-45C4D98D8F34}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Notify", "Notify", "{F689A8D5-683B-5813-8857-AD0EE10504C0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{DCDABCC3-2699-5112-A042-7E2F0E9E4D43}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Engine", "src\Notify\__Libraries\StellaOps.Notify.Engine\StellaOps.Notify.Engine.csproj", "{640B22EB-F7DC-57AF-9E6E-1BDD18810064}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Models", "src\Notify\__Libraries\StellaOps.Notify.Models\StellaOps.Notify.Models.csproj", "{68B2E31B-A427-52C6-A3A6-8902A21A9D04}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Queue", "src\Notify\__Libraries\StellaOps.Notify.Queue\StellaOps.Notify.Queue.csproj", "{6E26EDF7-C6C4-5B4D-A8D5-E69794986F58}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.InMemory", "src\Notify\__Libraries\StellaOps.Notify.Storage.InMemory\StellaOps.Notify.Storage.InMemory.csproj", "{1763B240-97A6-5710-A7A6-8A1F63311597}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.Postgres", "src\Notify\__Libraries\StellaOps.Notify.Storage.Postgres\StellaOps.Notify.Storage.Postgres.csproj", "{F23B9764-280A-5720-8B5B-B227092A24A9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{00F48869-B5D8-53AE-8E2A-5CBBE28B7D67}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Email", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Email\StellaOps.Notify.Connectors.Email.csproj", "{40426D69-90A0-599F-8113-BAAA98714E62}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Shared", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Shared\StellaOps.Notify.Connectors.Shared.csproj", "{41671DFA-9B15-574B-9B82-45CA2A254269}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Slack", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Slack\StellaOps.Notify.Connectors.Slack.csproj", "{8119F319-6F44-51B0-893E-24B214690A37}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Teams", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Teams\StellaOps.Notify.Connectors.Teams.csproj", "{8581A797-6D1A-5605-B9C6-4EB8CC349425}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Webhook", "src\Notify\__Libraries\StellaOps.Notify.Connectors.Webhook\StellaOps.Notify.Connectors.Webhook.csproj", "{7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F6F2323B-DD8C-53AD-AE3E-2220B928BA24}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Email.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Email.Tests\StellaOps.Notify.Connectors.Email.Tests.csproj", "{97545321-6315-574C-94EA-C4D756A323EE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Slack.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Slack.Tests\StellaOps.Notify.Connectors.Slack.Tests.csproj", "{7F384D30-79DA-55EF-AA3F-5C433126B646}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Teams.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Teams.Tests\StellaOps.Notify.Connectors.Teams.Tests.csproj", "{BCD434BC-C9DE-5291-A5C8-AD32891A7401}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Connectors.Webhook.Tests", "src\Notify\__Tests\StellaOps.Notify.Connectors.Webhook.Tests\StellaOps.Notify.Connectors.Webhook.Tests.csproj", "{95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Core.Tests", "src\Notify\__Tests\StellaOps.Notify.Core.Tests\StellaOps.Notify.Core.Tests.csproj", "{5881D3BD-529E-5092-8640-1CE0844FE0FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Engine.Tests", "src\Notify\__Tests\StellaOps.Notify.Engine.Tests\StellaOps.Notify.Engine.Tests.csproj", "{D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Models.Tests", "src\Notify\__Tests\StellaOps.Notify.Models.Tests\StellaOps.Notify.Models.Tests.csproj", "{2512F361-2C0C-56B4-9D93-7DBBBF55815E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Queue.Tests", "src\Notify\__Tests\StellaOps.Notify.Queue.Tests\StellaOps.Notify.Queue.Tests.csproj", "{78400F00-37A1-574C-8391-3CFA7E014B4D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Storage.Postgres.Tests", "src\Notify\__Tests\StellaOps.Notify.Storage.Postgres.Tests\StellaOps.Notify.Storage.Postgres.Tests.csproj", "{75D9C1EF-60D4-51E9-A0F4-FBE6632AF791}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.WebService.Tests", "src\Notify\__Tests\StellaOps.Notify.WebService.Tests\StellaOps.Notify.WebService.Tests.csproj", "{4FB42ADD-4BAB-5C19-BD4E-E39F95348600}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Worker.Tests", "src\Notify\__Tests\StellaOps.Notify.Worker.Tests\StellaOps.Notify.Worker.Tests.csproj", "{7EE3111E-53B5-5EE7-99FB-230A9B4EFD50}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{3461BB68-1EB2-5BD8-9FA4-3217CC1E7394}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.WebService", "src\Notify\StellaOps.Notify.WebService\StellaOps.Notify.WebService.csproj", "{A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{999AFB4F-C686-5BBF-8CA0-38119694DB9D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Notify.Worker", "src\Notify\StellaOps.Notify.Worker\StellaOps.Notify.Worker.csproj", "{A15C2434-BBA5-540A-B863-20A347A3F160}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Orchestrator", "Orchestrator", "{82E5585F-AF53-50FD-8805-E8F196A74A69}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{75227D73-DF27-5598-903B-6EF26AF83090}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Core", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Core\StellaOps.Orchestrator.Core.csproj", "{A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Infrastructure", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Infrastructure\StellaOps.Orchestrator.Infrastructure.csproj", "{F8564409-54F7-59AA-8E2A-E9022839ED4F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{AC257696-D6A2-51B5-A07B-195CC24F374C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Schemas", "src\__Libraries\StellaOps.Orchestrator.Schemas\StellaOps.Orchestrator.Schemas.csproj", "{E6887A02-800D-5F8B-8623-C9C052F6A690}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{FC7268F9-BC0E-5757-8509-3E7AC5DB26C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Tests", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Tests\StellaOps.Orchestrator.Tests.csproj", "{721DD473-5A17-5E0D-B0CA-B2F91A3333EB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{CDE07C59-073B-55DD-B462-67D0DCD6E4C8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.WebService", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.WebService\StellaOps.Orchestrator.WebService.csproj", "{AA0D3C06-0E6C-5671-BBEF-C5594F869378}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{E11558C3-4D2D-5F2D-A9F0-16EE01291D2B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Orchestrator.Worker", "src\Orchestrator\StellaOps.Orchestrator\StellaOps.Orchestrator.Worker\StellaOps.Orchestrator.Worker.csproj", "{6584A0EB-82AE-59E7-8023-3261AF88217D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Policy", "Policy", "{9F9EC6D6-3A07-5F93-90E8-EA77393FEA02}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{B03718E1-8606-5503-B4AC-DB966B39847B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine", "src\Policy\StellaOps.Policy.Engine\StellaOps.Policy.Engine.csproj", "{8010A35A-7CDE-5521-9D64-4C97F0DA3E93}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Gateway", "src\Policy\StellaOps.Policy.Gateway\StellaOps.Policy.Gateway.csproj", "{E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Registry", "src\Policy\StellaOps.Policy.Registry\StellaOps.Policy.Registry.csproj", "{2135DC08-5B28-591C-A43B-445D7BB98303}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.RiskProfile", "src\Policy\StellaOps.Policy.RiskProfile\StellaOps.Policy.RiskProfile.csproj", "{E9610063-C8DB-589B-A817-CC06CE65ACC4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Scoring", "src\Policy\StellaOps.Policy.Scoring\StellaOps.Policy.Scoring.csproj", "{B81E7A3D-0F57-59A9-9EFF-E940745C9B90}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyDsl", "src\Policy\StellaOps.PolicyDsl\StellaOps.PolicyDsl.csproj", "{41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{11468ECE-5AA1-5549-90C3-16833B9E9AFE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyAuthoritySignals.Contracts", "src\__Libraries\StellaOps.PolicyAuthoritySignals.Contracts\StellaOps.PolicyAuthoritySignals.Contracts.csproj", "{BBA41FC3-A097-5751-9830-B028CB357E58}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy", "src\Policy\__Libraries\StellaOps.Policy\StellaOps.Policy.csproj", "{F6AE6B49-960C-555C-90BF-38A2E03EF27A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.AuthSignals", "src\Policy\__Libraries\StellaOps.Policy.AuthSignals\StellaOps.Policy.AuthSignals.csproj", "{DEA58CAE-08AD-5376-BE6F-883B85760DD7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Exceptions", "src\Policy\__Libraries\StellaOps.Policy.Exceptions\StellaOps.Policy.Exceptions.csproj", "{4B27536C-E23B-5808-ABAE-BC93F0F7B109}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Storage.Postgres", "src\Policy\__Libraries\StellaOps.Policy.Storage.Postgres\StellaOps.Policy.Storage.Postgres.csproj", "{4E87FA32-5495-54BA-B5FC-383F20ABA094}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Unknowns", "src\Policy\__Libraries\StellaOps.Policy.Unknowns\StellaOps.Policy.Unknowns.csproj", "{4EF8E25B-4A19-5D64-8F95-40D86B51E453}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{AFFB37C8-8080-57A0-A0F4-49A20FEC1694}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine.Contract.Tests", "src\Policy\__Tests\StellaOps.Policy.Engine.Contract.Tests\StellaOps.Policy.Engine.Contract.Tests.csproj", "{9ECD2194-4E14-5CCD-9AA0-5279B464EF4A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Engine.Tests", "src\Policy\__Tests\StellaOps.Policy.Engine.Tests\StellaOps.Policy.Engine.Tests.csproj", "{B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Exceptions.Tests", "src\Policy\__Tests\StellaOps.Policy.Exceptions.Tests\StellaOps.Policy.Exceptions.Tests.csproj", "{2EF64916-E58F-5155-8A3D-735E7A019BDF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Gateway.Tests", "src\Policy\__Tests\StellaOps.Policy.Gateway.Tests\StellaOps.Policy.Gateway.Tests.csproj", "{9E95BC40-F0B0-5362-9694-5013FAFE83C5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Pack.Tests", "src\Policy\__Tests\StellaOps.Policy.Pack.Tests\StellaOps.Policy.Pack.Tests.csproj", "{4767D489-E3AF-5C99-825F-6C90CE550264}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.RiskProfile.Tests", "src\Policy\__Tests\StellaOps.Policy.RiskProfile.Tests\StellaOps.Policy.RiskProfile.Tests.csproj", "{0EFA741A-DAB8-5C34-BCF6-86000CC31530}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Scoring.Tests", "src\Policy\__Tests\StellaOps.Policy.Scoring.Tests\StellaOps.Policy.Scoring.Tests.csproj", "{A4790683-9F0A-5B2A-806F-797619E2A98A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Storage.Postgres.Tests", "src\Policy\__Tests\StellaOps.Policy.Storage.Postgres.Tests\StellaOps.Policy.Storage.Postgres.Tests.csproj", "{1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Tests", "src\Policy\__Tests\StellaOps.Policy.Tests\StellaOps.Policy.Tests.csproj", "{3B765847-031F-5291-AEB9-E8BB59EF1B53}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Policy.Unknowns.Tests", "src\Policy\__Tests\StellaOps.Policy.Unknowns.Tests\StellaOps.Policy.Unknowns.Tests.csproj", "{F96E3D04-4D69-575F-9347-8AC47337D471}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.PolicyDsl.Tests", "src\Policy\__Tests\StellaOps.PolicyDsl.Tests\StellaOps.PolicyDsl.Tests.csproj", "{04A2ACE6-20E8-5707-87BD-F024FAD7DED0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Replay", "Replay", "{2568E093-797A-5F9B-A22F-02FF7596A39C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay", "src\__Libraries\StellaOps.Replay\StellaOps.Replay.csproj", "{55C23781-1A56-59FF-9AF3-4BA07A0992CC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core", "src\__Libraries\StellaOps.Replay.Core\StellaOps.Replay.Core.csproj", "{9C2C091A-1607-5418-B5A5-20A86652835B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{CFB5CB09-1260-59F2-8B88-9725F2EDF976}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Libraries\__Tests\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{58C44599-F7B5-5911-8B0B-66C4FCB027A2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Tests", "src\__Libraries\__Tests\StellaOps.Replay.Tests\StellaOps.Replay.Tests.csproj", "{FA7943CD-23FC-58EE-BBFE-965758D362C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Libraries\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{211A70CE-8B98-55B1-9D48-EADD5F34C513}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Tests\reachability\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{4144AED2-D212-5A1B-9849-97F97A8760E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.Core.Tests", "src\__Tests\Replay\StellaOps.Replay.Core.Tests\StellaOps.Replay.Core.Tests.csproj", "{77ABEF57-B941-5243-A695-AA8B499FE91F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{AFB1DDA6-465A-5BFA-8794-07FCB8B73B2B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Replay.WebService", "src\Replay\StellaOps.Replay.WebService\StellaOps.Replay.WebService.csproj", "{C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SbomService", "SbomService", "{1EB7F9FA-F752-561D-AEAC-2E663F7F0C53}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService", "src\SbomService\StellaOps.SbomService\StellaOps.SbomService.csproj", "{0661F0EE-F6A1-5305-86BD-42849137BDBF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Storage.Postgres", "src\SbomService\StellaOps.SbomService.Storage.Postgres\StellaOps.SbomService.Storage.Postgres.csproj", "{A2D930E0-FCEC-5984-89FA-1B6D2046C7A7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{BC5D3395-B74D-593F-82D4-6BA4D40F3A69}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Storage.Postgres.Tests", "src\SbomService\StellaOps.SbomService.Storage.Postgres.Tests\StellaOps.SbomService.Storage.Postgres.Tests.csproj", "{FC7A23D5-6A5F-5274-B360-95393EAB244B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.SbomService.Tests", "src\SbomService\StellaOps.SbomService.Tests\StellaOps.SbomService.Tests.csproj", "{26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scanner", "Scanner", "{BBB6D30E-E84E-5C72-B258-8B71B4C0C37E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{9A4132EA-BE40-53D0-B17B-7EF2995867F0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Native", "src\Scanner\StellaOps.Scanner.Analyzers.Native\StellaOps.Scanner.Analyzers.Native.csproj", "{12428388-51C9-5FEA-9EB5-ECF205FD1C90}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks", "src\Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Deno.Benchmarks.csproj", "{F208351E-5372-53EF-ABBF-C349C32B33E4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks", "src\Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Php.Benchmarks.csproj", "{C061A376-5BF3-58B4-B301-28ABC6DE0A3B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks", "src\Scanner\__Benchmarks\StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks\StellaOps.Scanner.Analyzers.Lang.Rust.Benchmarks.csproj", "{BFCBC834-E9E7-5937-AC74-596459428D2C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmark", "src\Scanner\__Libraries\StellaOps.Scanner.Benchmark\StellaOps.Scanner.Benchmark.csproj", "{A9660377-E43A-5514-94B8-813B40D34E21}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmarks", "src\Scanner\__Libraries\StellaOps.Scanner.Benchmarks\StellaOps.Scanner.Benchmarks.csproj", "{5A8FFD16-30ED-55A8-A69E-37877E540442}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{26F61757-EF18-5045-947E-EA076772668A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Epss.Perf", "src\Scanner\__Benchmarks\StellaOps.Scanner.Storage.Epss.Perf\StellaOps.Scanner.Storage.Epss.Perf.csproj", "{8C747A2A-F2D2-57C3-9777-C32EFB6BA17A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{20646475-6101-5739-AEAD-D3CB508D382C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Advisory", "src\Scanner\__Libraries\StellaOps.Scanner.Advisory\StellaOps.Scanner.Advisory.csproj", "{03D045E7-F7AB-59EE-B53D-6B890AF278FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang\StellaOps.Scanner.Analyzers.Lang.csproj", "{174D2124-12A2-5620-964F-6D2737DA5DEA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Bun", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Bun\StellaOps.Scanner.Analyzers.Lang.Bun.csproj", "{9A6818AB-29A5-57B5-9958-B5F93B421964}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Deno\StellaOps.Scanner.Analyzers.Lang.Deno.csproj", "{467C42CD-ED69-5E21-BFF3-F35BAE24E9AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.DotNet", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.DotNet\StellaOps.Scanner.Analyzers.Lang.DotNet.csproj", "{03262415-2C11-5B62-84A7-33FC321D43AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Go", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Go\StellaOps.Scanner.Analyzers.Lang.Go.csproj", "{75991E1E-7D74-53B5-927C-D639337202C4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Java", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Java\StellaOps.Scanner.Analyzers.Lang.Java.csproj", "{D24D7552-BE3F-58CD-A458-9BFA2403C696}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Node\StellaOps.Scanner.Analyzers.Lang.Node.csproj", "{2BC14382-5C69-528B-9FCE-488CE3F8143E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Php\StellaOps.Scanner.Analyzers.Lang.Php.csproj", "{E7802557-EEB2-53EB-98C3-62A1E0DCC4BC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Python", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Python\StellaOps.Scanner.Analyzers.Lang.Python.csproj", "{FBF45F4E-D545-5897-8A02-428C51A3C4A0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Ruby", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Ruby\StellaOps.Scanner.Analyzers.Lang.Ruby.csproj", "{D5C3A0AF-A331-5C5F-AC21-3982A3BD3066}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Rust", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Lang.Rust\StellaOps.Scanner.Analyzers.Lang.Rust.csproj", "{69A56760-817A-5A9C-A52E-764FB0194071}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Native", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.Native\StellaOps.Scanner.Analyzers.Native.csproj", "{4A591A91-072D-5332-84B5-40C52406510D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS\StellaOps.Scanner.Analyzers.OS.csproj", "{CF956202-62CB-5340-BED9-0AB42E99E48D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Apk", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Apk\StellaOps.Scanner.Analyzers.OS.Apk.csproj", "{441BAC38-A865-559B-9310-02CB5D417209}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Dpkg", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Dpkg\StellaOps.Scanner.Analyzers.OS.Dpkg.csproj", "{BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Homebrew", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Homebrew\StellaOps.Scanner.Analyzers.OS.Homebrew.csproj", "{36964679-F5CA-57C8-A7C7-98FF38998644}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.MacOsBundle", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.MacOsBundle\StellaOps.Scanner.Analyzers.OS.MacOsBundle.csproj", "{DE8969D1-E305-54AD-A3B7-8AF897C19503}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Pkgutil", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Pkgutil\StellaOps.Scanner.Analyzers.OS.Pkgutil.csproj", "{FF3858C2-487C-5056-9BE1-753096E3828C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Rpm", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Rpm\StellaOps.Scanner.Analyzers.OS.Rpm.csproj", "{284574B8-F4BF-5711-81F6-43A277F6E374}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.csproj", "{4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Msi", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.Msi\StellaOps.Scanner.Analyzers.OS.Windows.Msi.csproj", "{C981E0FC-E546-5B95-8995-2296C4BCCC11}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.WinSxS", "src\Scanner\__Libraries\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.csproj", "{B7303B10-C5BF-5710-9FB6-FCE79C270488}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Cache", "src\Scanner\__Libraries\StellaOps.Scanner.Cache\StellaOps.Scanner.Cache.csproj", "{40092818-83F9-54F5-9333-083731DC7DB4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.CallGraph", "src\Scanner\__Libraries\StellaOps.Scanner.CallGraph\StellaOps.Scanner.CallGraph.csproj", "{5D2B450D-B34A-575D-BAFB-8DFA29CDCE74}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Core", "src\Scanner\__Libraries\StellaOps.Scanner.Core\StellaOps.Scanner.Core.csproj", "{FD53E7DE-2531-5E41-9D24-93D869813695}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Diff", "src\Scanner\__Libraries\StellaOps.Scanner.Diff\StellaOps.Scanner.Diff.csproj", "{166B5460-FFAB-5469-B256-147CA8671861}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit", "src\Scanner\__Libraries\StellaOps.Scanner.Emit\StellaOps.Scanner.Emit.csproj", "{D7EB2001-6897-501F-BF6C-27F849B95430}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.EntryTrace", "src\Scanner\__Libraries\StellaOps.Scanner.EntryTrace\StellaOps.Scanner.EntryTrace.csproj", "{F01FB705-B831-5A3A-91A2-476EAE8EE65B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Evidence", "src\Scanner\__Libraries\StellaOps.Scanner.Evidence\StellaOps.Scanner.Evidence.csproj", "{029ADACB-AADD-5FF1-A1C6-42B2542E4877}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Explainability", "src\Scanner\__Libraries\StellaOps.Scanner.Explainability\StellaOps.Scanner.Explainability.csproj", "{9B1B44EA-214D-5749-88D7-28EC8649B233}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Orchestration", "src\Scanner\__Libraries\StellaOps.Scanner.Orchestration\StellaOps.Scanner.Orchestration.csproj", "{18DE5026-FED1-5636-8F78-7F1B3A2AFEFB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofIntegration", "src\Scanner\__Libraries\StellaOps.Scanner.ProofIntegration\StellaOps.Scanner.ProofIntegration.csproj", "{4C4DF88D-A249-58F2-B98D-00D5E2FC33BA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofSpine", "src\Scanner\__Libraries\StellaOps.Scanner.ProofSpine\StellaOps.Scanner.ProofSpine.csproj", "{226B12A0-1EED-5CC5-974D-E9524E924794}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Queue", "src\Scanner\__Libraries\StellaOps.Scanner.Queue\StellaOps.Scanner.Queue.csproj", "{E31AD5B9-66BC-5217-91BE-C4030ADBA7EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability", "src\Scanner\__Libraries\StellaOps.Scanner.Reachability\StellaOps.Scanner.Reachability.csproj", "{4B5D871F-9EBA-5D7C-A9EE-065E22B95894}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ReachabilityDrift", "src\Scanner\__Libraries\StellaOps.Scanner.ReachabilityDrift\StellaOps.Scanner.ReachabilityDrift.csproj", "{F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.SmartDiff", "src\Scanner\__Libraries\StellaOps.Scanner.SmartDiff\StellaOps.Scanner.SmartDiff.csproj", "{6EB80E87-172B-5A81-A0E2-932E1AC9615C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage", "src\Scanner\__Libraries\StellaOps.Scanner.Storage\StellaOps.Scanner.Storage.csproj", "{89B055A6-8ACA-5E86-94FB-0FD369790B47}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Oci", "src\Scanner\__Libraries\StellaOps.Scanner.Storage.Oci\StellaOps.Scanner.Storage.Oci.csproj", "{43E42CDA-84FC-5BB8-B211-4D3E1492D39A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface", "src\Scanner\__Libraries\StellaOps.Scanner.Surface\StellaOps.Scanner.Surface.csproj", "{230D7EA8-20DC-583F-8832-63E54E42E3D2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Env", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.Env\StellaOps.Scanner.Surface.Env.csproj", "{2BC11415-1862-50AC-8CBA-0BA29C69E6C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.FS", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.FS\StellaOps.Scanner.Surface.FS.csproj", "{AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Secrets", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.Secrets\StellaOps.Scanner.Surface.Secrets.csproj", "{D37B67AE-68F6-5C6D-AD35-738F8C7D5851}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Validation", "src\Scanner\__Libraries\StellaOps.Scanner.Surface.Validation\StellaOps.Scanner.Surface.Validation.csproj", "{4DF1E180-AA42-5F22-9664-F87FAEAD59C1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Triage", "src\Scanner\__Libraries\StellaOps.Scanner.Triage\StellaOps.Scanner.Triage.csproj", "{B8BECE74-88A9-53B0-B457-3C2CF0FCEE01}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.VulnSurfaces", "src\Scanner\__Libraries\StellaOps.Scanner.VulnSurfaces\StellaOps.Scanner.VulnSurfaces.csproj", "{A81F1C23-6F7B-5AF1-BC61-312CF1881CFE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{A2E3F297-D1D2-5283-81B5-7E83B6B297F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Sbomer.BuildXPlugin", "src\Scanner\StellaOps.Scanner.Sbomer.BuildXPlugin\StellaOps.Scanner.Sbomer.BuildXPlugin.csproj", "{CF6E60E9-000E-51D4-9C67-FE84E08AF277}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A0A96F05-87B2-5B08-A6E4-3E685E49E50F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.ScannerSignals.IntegrationTests", "src\__Tests\reachability\StellaOps.ScannerSignals.IntegrationTests\StellaOps.ScannerSignals.IntegrationTests.csproj", "{9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.VulnSurfaces.Tests", "src\Scanner\__Libraries\StellaOps.Scanner.VulnSurfaces.Tests\StellaOps.Scanner.VulnSurfaces.Tests.csproj", "{06B9914A-7331-579B-AD4F-82B3D95B5C4E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Advisory.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Advisory.Tests\StellaOps.Scanner.Advisory.Tests.csproj", "{E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\declared-cpm-missing-version\App.csproj", "{64305515-BFD3-5627-A917-B45C4BFA08DD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\declared-cpm-project\App.csproj", "{87CF5359-648E-5F59-829B-4C61573D02DF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\declared-property-placeholder\App.csproj", "{2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyApp", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\MyApp.csproj", "{B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Bun.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests\StellaOps.Scanner.Analyzers.Lang.Bun.Tests.csproj", "{542F28D0-D20F-5571-AE65-83CEA16B299D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{545AD377-070A-5001-944C-76418FB7F3FF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{D24E78F3-72F2-5A01-A525-7D9A8F4826F4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Deno.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests\StellaOps.Scanner.Analyzers.Lang.Deno.Tests.csproj", "{24A017D2-7BD5-5F4C-8B67-58B56129C4CB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.DotNet.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.DotNet.Tests\StellaOps.Scanner.Analyzers.Lang.DotNet.Tests.csproj", "{2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{10FC6B5B-C9CE-5E8B-9648-D85098F70A62}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{71429279-82DC-51EC-834A-F3C52A19ECE6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Go.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests\StellaOps.Scanner.Analyzers.Lang.Go.Tests.csproj", "{4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{4B521542-1CC6-5546-9322-8FE869AC7904}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Java.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests\StellaOps.Scanner.Analyzers.Lang.Java.Tests.csproj", "{BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests\StellaOps.Scanner.Analyzers.Lang.Node.SmokeTests.csproj", "{48C8ED44-9E61-5C72-B912-987F6B4D3D4F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{010D92FC-6304-5FA0-81CD-1AB19BA2F832}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{28923049-DC26-55D4-8E74-8DABCABB6518}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Node.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests\StellaOps.Scanner.Analyzers.Lang.Node.Tests.csproj", "{C2D640E1-47EF-596C-A258-AE5E93A7578C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{DF05A63F-D283-5C81-B7C7-D659CBED0695}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{047FADEF-DBAF-5D43-A2D6-5C68801894E6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Php.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests\StellaOps.Scanner.Analyzers.Lang.Php.Tests.csproj", "{D77582C2-0CEF-5ED8-8366-5A28492D3C88}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{436C0FB7-F3E3-518B-8F65-CF760E875DD5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Python.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests\StellaOps.Scanner.Analyzers.Lang.Python.Tests.csproj", "{CC4D16A5-AB4A-5877-B0E5-25928D627933}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{2ACE0837-E738-59B6-9728-1DA6D1A22B08}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Ruby.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests\StellaOps.Scanner.Analyzers.Lang.Ruby.Tests.csproj", "{C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\bin\Debug\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{010E1EE1-EC22-55A0-B1E8-86B24B584B95}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\bin\Release\net10.0\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{1848E192-CC0F-5736-B68C-D71E6D575301}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.App", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\Fixtures\lang\dotnet\source-tree-only\Sample.App.csproj", "{CA77C3B9-4D34-506E-B823-D88353261C77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Lang.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Lang.Tests\StellaOps.Scanner.Analyzers.Lang.Tests.csproj", "{0D8AAAB2-669C-594E-8782-B105F7A3D076}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.Native.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.Native.Tests\StellaOps.Scanner.Analyzers.Native.Tests.csproj", "{24A77816-86CF-5958-8005-511C82A5DE13}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Homebrew.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Homebrew.Tests\StellaOps.Scanner.Analyzers.OS.Homebrew.Tests.csproj", "{265D18F4-7D43-5989-BC89-06A0BCAA974F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests\StellaOps.Scanner.Analyzers.OS.MacOsBundle.Tests.csproj", "{2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests\StellaOps.Scanner.Analyzers.OS.Pkgutil.Tests.csproj", "{CF1DD579-8832-5D10-A776-BEA22477C9E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Tests\StellaOps.Scanner.Analyzers.OS.Tests.csproj", "{9DD2C1F3-D4B6-530E-907B-BFA80085311C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests\StellaOps.Scanner.Analyzers.OS.Windows.Chocolatey.Tests.csproj", "{7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests\StellaOps.Scanner.Analyzers.OS.Windows.Msi.Tests.csproj", "{D2F4B045-45B9-573C-8EA7-F639FADF6518}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests\StellaOps.Scanner.Analyzers.OS.Windows.WinSxS.Tests.csproj", "{FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Benchmarks.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Benchmarks.Tests\StellaOps.Scanner.Benchmarks.Tests.csproj", "{891EDEAF-E530-5CB1-B459-E526E563AF44}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Cache.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Cache.Tests\StellaOps.Scanner.Cache.Tests.csproj", "{7D80E495-7DE6-5093-AC05-650991082D96}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.CallGraph.Tests", "src\Scanner\__Tests\StellaOps.Scanner.CallGraph.Tests\StellaOps.Scanner.CallGraph.Tests.csproj", "{0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Core.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Core.Tests\StellaOps.Scanner.Core.Tests.csproj", "{434EB740-8EB9-56AA-B7C7-779322245497}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Diff.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Diff.Tests\StellaOps.Scanner.Diff.Tests.csproj", "{BD4C1CC3-8493-5647-BDC9-9A9721595549}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit.Lineage.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Emit.Lineage.Tests\StellaOps.Scanner.Emit.Lineage.Tests.csproj", "{F5D74715-01BD-530A-9234-2C8E8327CA7C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Emit.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Emit.Tests\StellaOps.Scanner.Emit.Tests.csproj", "{5DB2DAD4-749D-5958-85A5-D416773EC7AD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.EntryTrace.Tests", "src\Scanner\__Tests\StellaOps.Scanner.EntryTrace.Tests\StellaOps.Scanner.EntryTrace.Tests.csproj", "{2C644E8C-5731-566A-9208-25FF724E88CF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Evidence.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Evidence.Tests\StellaOps.Scanner.Evidence.Tests.csproj", "{FBAA3D74-4A5F-5F10-877F-C4AEDDD69656}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Explainability.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Explainability.Tests\StellaOps.Scanner.Explainability.Tests.csproj", "{D4DC4627-27B2-5162-BF64-821B7AD8837C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Integration.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Integration.Tests\StellaOps.Scanner.Integration.Tests.csproj", "{38C61566-48F9-5D8E-9FC1-A1E81E71E5E7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ProofSpine.Tests", "src\Scanner\__Tests\StellaOps.Scanner.ProofSpine.Tests\StellaOps.Scanner.ProofSpine.Tests.csproj", "{6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Queue.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Queue.Tests\StellaOps.Scanner.Queue.Tests.csproj", "{D9F26498-410D-5617-B810-BC58D172184D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability.Stack.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Reachability.Stack.Tests\StellaOps.Scanner.Reachability.Stack.Tests.csproj", "{6140569D-4784-53CE-98A2-54D8BD6D1745}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Reachability.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Reachability.Tests\StellaOps.Scanner.Reachability.Tests.csproj", "{50274ADF-643D-5FEA-831C-2CB3DD2C6D30}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.ReachabilityDrift.Tests", "src\Scanner\__Tests\StellaOps.Scanner.ReachabilityDrift.Tests\StellaOps.Scanner.ReachabilityDrift.Tests.csproj", "{D60176B5-3B87-504D-BCAC-067BD9954A8F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Sbomer.BuildXPlugin.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Sbomer.BuildXPlugin.Tests\StellaOps.Scanner.Sbomer.BuildXPlugin.Tests.csproj", "{3F743B8C-53C6-5520-B4AB-52C67179DD73}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.SmartDiff.Tests", "src\Scanner\__Tests\StellaOps.Scanner.SmartDiff.Tests\StellaOps.Scanner.SmartDiff.Tests.csproj", "{BD34A481-9816-51A7-BA6B-7272465F68C4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Oci.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Storage.Oci.Tests\StellaOps.Scanner.Storage.Oci.Tests.csproj", "{EAA4DB81-CBAA-573C-9C40-19F9551BE98B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Storage.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Storage.Tests\StellaOps.Scanner.Storage.Tests.csproj", "{879D5965-6D83-529C-A2F7-41E85045A7F0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Env.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Env.Tests\StellaOps.Scanner.Surface.Env.Tests.csproj", "{45E6A177-140E-5C2C-AAC6-A2D662BEA5BA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.FS.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.FS.Tests\StellaOps.Scanner.Surface.FS.Tests.csproj", "{23CE30EB-406F-573D-BF3D-4281A6FE406F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Secrets.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Secrets.Tests\StellaOps.Scanner.Surface.Secrets.Tests.csproj", "{FA284264-B63E-5DC4-B2A8-A8D347A554D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Tests\StellaOps.Scanner.Surface.Tests.csproj", "{EAD55F0E-0895-5BE5-8273-216780F99C1B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Surface.Validation.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Surface.Validation.Tests\StellaOps.Scanner.Surface.Validation.Tests.csproj", "{6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Triage.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Triage.Tests\StellaOps.Scanner.Triage.Tests.csproj", "{EF443847-D7D0-5457-85D8-4382BF34931F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.WebService.Tests", "src\Scanner\__Tests\StellaOps.Scanner.WebService.Tests\StellaOps.Scanner.WebService.Tests.csproj", "{C2C3712D-B2E1-5F74-A3F9-0D912381A2CF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Worker.Tests", "src\Scanner\__Tests\StellaOps.Scanner.Worker.Tests\StellaOps.Scanner.Worker.Tests.csproj", "{F28F85B6-F4FD-5785-AF89-58F8159621E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{8EDEFD20-4914-53A8-88B3-B5FEB7B9D7A0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.WebService", "src\Scanner\StellaOps.Scanner.WebService\StellaOps.Scanner.WebService.csproj", "{563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{85703812-08C9-50E6-B355-4F26ED7810F1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scanner.Worker", "src\Scanner\StellaOps.Scanner.Worker\StellaOps.Scanner.Worker.csproj", "{8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scheduler", "Scheduler", "{83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{D1E2B45E-632F-55A2-809F-C51E0F5975D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scheduler.Backfill", "src\Scheduler\Tools\Scheduler.Backfill\Scheduler.Backfill.csproj", "{D8858828-8495-5CBB-A7BB-97C058811A13}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{065183CB-0CEB-5710-98AA-112036087960}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.ImpactIndex", "src\Scheduler\__Libraries\StellaOps.Scheduler.ImpactIndex\StellaOps.Scheduler.ImpactIndex.csproj", "{671D8C13-26F5-52C1-80F1-EFB556E12B46}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Models", "src\Scheduler\__Libraries\StellaOps.Scheduler.Models\StellaOps.Scheduler.Models.csproj", "{335A63A0-01E4-5230-8741-5AE90F371B82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Queue", "src\Scheduler\__Libraries\StellaOps.Scheduler.Queue\StellaOps.Scheduler.Queue.csproj", "{79481E86-D2CA-5472-8EDD-D0219F5932AC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Storage.Postgres", "src\Scheduler\__Libraries\StellaOps.Scheduler.Storage.Postgres\StellaOps.Scheduler.Storage.Postgres.csproj", "{69F7F8D4-6E7E-5EAA-B36A-273B223B3E30}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker", "src\Scheduler\__Libraries\StellaOps.Scheduler.Worker\StellaOps.Scheduler.Worker.csproj", "{A649555C-AAE1-59A8-A7BA-C118366386DD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{78EF3724-4F6C-5873-A748-89FB753A6041}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Backfill.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Backfill.Tests\StellaOps.Scheduler.Backfill.Tests.csproj", "{22C216D9-2A03-5C40-9A18-E30C6FDF4D48}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.ImpactIndex.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.ImpactIndex.Tests\StellaOps.Scheduler.ImpactIndex.Tests.csproj", "{6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Models.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Models.Tests\StellaOps.Scheduler.Models.Tests.csproj", "{91F25B73-0A0C-57B6-89C2-B13E15F1B281}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Queue.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Queue.Tests\StellaOps.Scheduler.Queue.Tests.csproj", "{F66F5DFE-3B8F-5B43-89DE-4A15B994290B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Storage.Postgres.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Storage.Postgres.Tests\StellaOps.Scheduler.Storage.Postgres.Tests.csproj", "{C165A810-99AA-5C2E-99D9-950C4ABD5C63}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.WebService.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.WebService.Tests\StellaOps.Scheduler.WebService.Tests.csproj", "{F2436D73-0E94-50F0-9C02-28CE3910EB21}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker.Tests", "src\Scheduler\__Tests\StellaOps.Scheduler.Worker.Tests\StellaOps.Scheduler.Worker.Tests.csproj", "{1D8E9087-584B-5341-BFAA-EEB046E530AF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{DFF6FD34-2F01-50E2-B2E3-C13F4AFF70BC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.WebService", "src\Scheduler\StellaOps.Scheduler.WebService\StellaOps.Scheduler.WebService.csproj", "{0D72E841-4F53-5ED8-864B-53AA0DFA5978}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{0CF1F217-11C2-56BF-B2B0-4DFD474FE798}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Scheduler.Worker.Host", "src\Scheduler\StellaOps.Scheduler.Worker.Host\StellaOps.Scheduler.Worker.Host.csproj", "{E5B88985-0693-51FC-8AB9-7C3728722618}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Signals", "Signals", "{76802750-19B9-5E80-80BE-7ADC255ACE3D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{C521E5D8-709E-5061-9564-7D35400AF484}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals", "src\Signals\StellaOps.Signals\StellaOps.Signals.csproj", "{78353588-38CA-5CCC-86EB-1513FB86FB4B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Scheduler", "src\Signals\StellaOps.Signals.Scheduler\StellaOps.Signals.Scheduler.csproj", "{8A43DF4F-CBD4-5481-A113-84EBE37CA375}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Storage.Postgres", "src\Signals\StellaOps.Signals.Storage.Postgres\StellaOps.Signals.Storage.Postgres.csproj", "{37A03641-FA63-5896-B432-EF26DC11F6CB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{C4AAD073-8948-5497-B314-B2699A504B73}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Contracts", "src\__Libraries\StellaOps.Signals.Contracts\StellaOps.Signals.Contracts.csproj", "{16C1069D-EBC9-53F4-909E-6EAF374E7E8A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{5C08FB5F-37E6-59C6-B04B-ED32DB54F246}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Tests", "src\__Libraries\__Tests\StellaOps.Signals.Tests\StellaOps.Signals.Tests.csproj", "{EB39A5CF-2689-5002-8A70-CFB0F473CCDE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Reachability.Tests", "src\__Tests\reachability\StellaOps.Signals.Reachability.Tests\StellaOps.Signals.Reachability.Tests.csproj", "{13D2C70F-86E5-52EB-9A53-F266E471A5DC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Tests", "src\Signals\__Tests\StellaOps.Signals.Tests\StellaOps.Signals.Tests.csproj", "{DC957128-193A-58F3-B987-481370A43953}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signals.Storage.Postgres.Tests", "src\Signals\StellaOps.Signals.Storage.Postgres.Tests\StellaOps.Signals.Storage.Postgres.Tests.csproj", "{05430EEB-6E1F-5396-A521-EE455630F730}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Signer", "Signer", "{2A2731AB-593C-5E81-BD4F-F16DBBDAA10F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{318F564F-76B2-50BF-B629-0EB154BAF41D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Core", "src\Signer\StellaOps.Signer\StellaOps.Signer.Core\StellaOps.Signer.Core.csproj", "{13AAE009-19FD-5093-B154-6FFC4C34B72C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Infrastructure", "src\Signer\StellaOps.Signer\StellaOps.Signer.Infrastructure\StellaOps.Signer.Infrastructure.csproj", "{056D1311-0882-5239-9D21-60FC186AB7F8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{ED97BD71-2A08-5826-8CD2-D90D2FA14B66}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Keyless", "src\Signer\__Libraries\StellaOps.Signer.Keyless\StellaOps.Signer.Keyless.csproj", "{D99F972A-76D0-57CF-908D-FB28750FE989}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.KeyManagement", "src\Signer\__Libraries\StellaOps.Signer.KeyManagement\StellaOps.Signer.KeyManagement.csproj", "{66D435A0-4D37-50EA-AC48-F557BD794E8D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F246CAA7-1A3C-5F2A-B6C4-ADF43C72EBC8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Tests", "src\Signer\StellaOps.Signer\StellaOps.Signer.Tests\StellaOps.Signer.Tests.csproj", "{BA153C94-5786-5DFB-BF46-5456F314640D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{69DD2687-443E-5E29-B334-E9409586F6B3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.WebService", "src\Signer\StellaOps.Signer\StellaOps.Signer.WebService\StellaOps.Signer.WebService.csproj", "{59194DA8-0065-5FA5-9E4C-9F1D1A141D0D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskRunner", "TaskRunner", "{01BBCE99-BB2B-5A62-96B2-8C5C94221492}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{85BFD986-36C4-5D47-9BD8-07211AEC3A03}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Client", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Client\StellaOps.TaskRunner.Client.csproj", "{174F6B92-7B4B-5364-9FFA-B0922315E394}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Core", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Core\StellaOps.TaskRunner.Core.csproj", "{3D5B082E-6F16-5078-B163-57F545C6441D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Infrastructure", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Infrastructure\StellaOps.TaskRunner.Infrastructure.csproj", "{D52682FC-295E-53A2-B101-0BC60D53BEF1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Storage.Postgres", "src\TaskRunner\StellaOps.TaskRunner.Storage.Postgres\StellaOps.TaskRunner.Storage.Postgres.csproj", "{A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Tests", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Tests\StellaOps.TaskRunner.Tests.csproj", "{27C02428-144F-598E-A2B3-D74AB3A60BC2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Storage.Postgres.Tests", "src\TaskRunner\StellaOps.TaskRunner.Storage.Postgres.Tests\StellaOps.TaskRunner.Storage.Postgres.Tests.csproj", "{099EB392-DF89-5A9E-B1CC-7B60A16C61B5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{671DB4E9-704C-515F-B954-4A11384AC422}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.WebService", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.WebService\StellaOps.TaskRunner.WebService.csproj", "{B4897CA0-8501-586C-AFA3-502ECDCB58FD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{620AF63F-D189-5EDE-92BB-F610F5DB878C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TaskRunner.Worker", "src\TaskRunner\StellaOps.TaskRunner\StellaOps.TaskRunner.Worker\StellaOps.TaskRunner.Worker.csproj", "{88F0AAA9-7AB4-5B38-9132-675E0CF0E032}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Telemetry", "Telemetry", "{DEAB797C-CFE8-568B-A47A-549B8F4838A6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{16CA4052-C32A-5EE4-A1E6-8DE81963D200}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Analyzers", "src\Telemetry\StellaOps.Telemetry.Analyzers\StellaOps.Telemetry.Analyzers.csproj", "{509995C7-1637-5E0A-8F11-0F5E54B77209}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{F82852B2-BCCB-5338-B6FC-DF7BE18CF99A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Core", "src\Telemetry\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core.csproj", "{DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{39D079A8-9BEC-5C96-9670-7FFCB16094D4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Analyzers.Tests", "src\Telemetry\StellaOps.Telemetry.Analyzers\StellaOps.Telemetry.Analyzers.Tests\StellaOps.Telemetry.Analyzers.Tests.csproj", "{5AA07819-E820-54D5-8A68-69F791EDC4E4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Telemetry.Core.Tests", "src\Telemetry\StellaOps.Telemetry.Core\StellaOps.Telemetry.Core.Tests\StellaOps.Telemetry.Core.Tests.csproj", "{BCB84E5F-2F49-53C9-8E91-EAA790F511B8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F59ED1AE-6A2E-5465-81EB-52CFA175CBE6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A054E1EC-4757-5B74-83D2-BF7B0F163365}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Infrastructure.Postgres.Testing", "src\__Tests\__Libraries\StellaOps.Infrastructure.Postgres.Testing\StellaOps.Infrastructure.Postgres.Testing.csproj", "{B7CA7A16-AAFB-5A8F-B598-0284ED7DF744}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging.Testing", "src\__Tests\__Libraries\StellaOps.Messaging.Testing\StellaOps.Messaging.Testing.csproj", "{2E7B8D21-CAD8-5844-B59F-7A487E6594DD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Testing", "src\__Tests\__Libraries\StellaOps.Router.Testing\StellaOps.Router.Testing.csproj", "{F30EF61D-A7FC-5689-A06F-42A152CF7393}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.AirGap", "src\__Tests\__Libraries\StellaOps.Testing.AirGap\StellaOps.Testing.AirGap.csproj", "{96610609-85C7-5F09-B765-A86463A8DBDE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism", "src\__Tests\__Libraries\StellaOps.Testing.Determinism\StellaOps.Testing.Determinism.csproj", "{E5A69860-1704-5FB1-BFA3-5872182D4829}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Determinism.Properties", "src\__Tests\__Libraries\StellaOps.Testing.Determinism.Properties\StellaOps.Testing.Determinism.Properties.csproj", "{1F5FFF7C-AF58-5C3E-9981-EE5E978426E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Testing.Manifests", "src\__Tests\__Libraries\StellaOps.Testing.Manifests\StellaOps.Testing.Manifests.csproj", "{51652C28-0583-5556-A941-D16D99F97B82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Architecture.Tests", "src\__Tests\architecture\StellaOps.Architecture.Tests\StellaOps.Architecture.Tests.csproj", "{068138BD-177D-5359-B0DD-A369BB607E95}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Chaos.Router.Tests", "src\__Tests\chaos\StellaOps.Chaos.Router.Tests\StellaOps.Chaos.Router.Tests.csproj", "{91306E2D-A310-50D1-B64F-47A158D42085}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.AirGap", "src\__Tests\Integration\StellaOps.Integration.AirGap\StellaOps.Integration.AirGap.csproj", "{F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Determinism", "src\__Tests\Integration\StellaOps.Integration.Determinism\StellaOps.Integration.Determinism.csproj", "{59234A8C-D502-5965-AAFC-19739C833885}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.E2E", "src\__Tests\Integration\StellaOps.Integration.E2E\StellaOps.Integration.E2E.csproj", "{2CE72B3D-4D13-500A-A44D-76029069C773}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Performance", "src\__Tests\Integration\StellaOps.Integration.Performance\StellaOps.Integration.Performance.csproj", "{422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Platform", "src\__Tests\Integration\StellaOps.Integration.Platform\StellaOps.Integration.Platform.csproj", "{8F7505CD-473C-590A-8851-FA762AB5E214}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.ProofChain", "src\__Tests\Integration\StellaOps.Integration.ProofChain\StellaOps.Integration.ProofChain.csproj", "{B2ABA214-83FB-5E9E-8AD4-2D54E579310A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Reachability", "src\__Tests\Integration\StellaOps.Integration.Reachability\StellaOps.Integration.Reachability.csproj", "{3EC6A343-75E8-511F-A767-8FAB9EC79A62}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Integration.Unknowns", "src\__Tests\Integration\StellaOps.Integration.Unknowns\StellaOps.Integration.Unknowns.csproj", "{37DF1BF6-AD9C-59A2-8F10-512ABE804ED3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Interop.Tests", "src\__Tests\interop\StellaOps.Interop.Tests\StellaOps.Interop.Tests.csproj", "{A93B89A8-E39D-560B-82E8-96EAEA545A28}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Offline.E2E.Tests", "src\__Tests\offline\StellaOps.Offline.E2E.Tests\StellaOps.Offline.E2E.Tests.csproj", "{DF5A6010-D88B-5327-8E1A-74F2A716D340}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Parity.Tests", "src\__Tests\parity\StellaOps.Parity.Tests\StellaOps.Parity.Tests.csproj", "{C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation.Tests", "src\__Tests\Provenance\StellaOps.Provenance.Attestation.Tests\StellaOps.Provenance.Attestation.Tests.csproj", "{B143BD73-A4D7-51F3-804E-03CE8C6CF639}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Reachability.FixtureTests", "src\__Tests\reachability\StellaOps.Reachability.FixtureTests\StellaOps.Reachability.FixtureTests.csproj", "{53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Security.Tests", "src\__Tests\security\StellaOps.Security.Tests\StellaOps.Security.Tests.csproj", "{96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Audit.ReplayToken.Tests", "src\__Tests\StellaOps.Audit.ReplayToken.Tests\StellaOps.Audit.ReplayToken.Tests.csproj", "{FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Evidence.Bundle.Tests", "src\__Tests\StellaOps.Evidence.Bundle.Tests\StellaOps.Evidence.Bundle.Tests.csproj", "{2063D4CC-6C01-5693-B0B9-1376FB928E43}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.Tests", "src\__Tests\StellaOps.Microservice.Tests\StellaOps.Microservice.Tests.csproj", "{B0A0E3D1-FF2E-5005-B619-4523C2A2C955}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common.Tests", "src\__Tests\StellaOps.Router.Common.Tests\StellaOps.Router.Common.Tests.csproj", "{004D507B-32A2-5704-8747-412E7B8EFAE4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Config.Tests", "src\__Tests\StellaOps.Router.Config.Tests\StellaOps.Router.Config.Tests.csproj", "{FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Gateway.Tests", "src\__Tests\StellaOps.Router.Gateway.Tests\StellaOps.Router.Gateway.Tests.csproj", "{62186A00-3E04-51EF-9497-258A973D6E24}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.InMemory.Tests", "src\__Tests\StellaOps.Router.Transport.InMemory.Tests\StellaOps.Router.Transport.InMemory.Tests.csproj", "{81DADA98-669F-5B5B-8C31-EA3B5CF77380}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Transport.Udp.Tests", "src\__Tests\StellaOps.Router.Transport.Udp.Tests\StellaOps.Router.Transport.Udp.Tests.csproj", "{768155E4-8D91-5A02-A006-2B357C033E25}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AuditPack.Tests", "src\__Tests\unit\StellaOps.AuditPack.Tests\StellaOps.AuditPack.Tests.csproj", "{DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VexHub", "VexHub", "{7A6E52D8-29D2-5529-A394-BDF7AB0B84A0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{27148056-45FD-547F-9F8A-6A56C8487DCB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Core", "src\VexHub\__Libraries\StellaOps.VexHub.Core\StellaOps.VexHub.Core.csproj", "{3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Storage.Postgres", "src\VexHub\__Libraries\StellaOps.VexHub.Storage.Postgres\StellaOps.VexHub.Storage.Postgres.csproj", "{BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Core.Tests", "src\VexHub\__Tests\StellaOps.VexHub.Core.Tests\StellaOps.VexHub.Core.Tests.csproj", "{3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.Storage.Postgres.Tests", "src\VexHub\__Tests\StellaOps.VexHub.Storage.Postgres.Tests\StellaOps.VexHub.Storage.Postgres.Tests.csproj", "{5682D20E-74D9-50D6-B400-8EE39D2ADF42}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.WebService.Tests", "src\VexHub\__Tests\StellaOps.VexHub.WebService.Tests\StellaOps.VexHub.WebService.Tests.csproj", "{73F03316-B1CB-55DC-A3D6-9C9758CFFFEB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{9D3B5FD2-1692-5817-89D3-2E5950F83EB7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexHub.WebService", "src\VexHub\StellaOps.VexHub.WebService\StellaOps.VexHub.WebService.csproj", "{ADDC25AD-9056-59DE-95EE-453A90D2D519}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VexLens", "VexLens", "{F171E782-0A1A-586D-9349-7C69A2500836}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9FEBBFD8-3A0B-5249-89ED-239B8E9697CC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens.Core", "src\VexLens\StellaOps.VexLens\StellaOps.VexLens.Core\StellaOps.VexLens.Core.csproj", "{A002946E-4486-51F0-A132-2654E3DDB4E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens", "src\VexLens\StellaOps.VexLens\StellaOps.VexLens.csproj", "{D84DFC26-3A6B-539F-822D-CE326F7DB9B4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{4430BC6C-9ACC-5034-8BE9-A39F8A5FC45E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VexLens.Core.Tests", "src\VexLens\StellaOps.VexLens\__Tests\StellaOps.VexLens.Core.Tests\StellaOps.VexLens.Core.Tests.csproj", "{07CBEBEF-B614-5A84-BFEB-A8548E20F1E9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VulnExplorer", "VulnExplorer", "{C565F805-B835-571C-B5F4-136F31FCDF47}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{5EC80510-3F29-54FD-8848-05902F3B5063}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VulnExplorer.Api", "src\VulnExplorer\StellaOps.VulnExplorer.Api\StellaOps.VulnExplorer.Api.csproj", "{F3495690-6B86-5FEC-BBB4-DD899C2E419E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{0CB37973-516C-53DC-BD58-91B698F3B258}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.VulnExplorer.Api.Tests", "src\__Tests\StellaOps.VulnExplorer.Api.Tests\StellaOps.VulnExplorer.Api.Tests.csproj", "{5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Zastava", "Zastava", "{E98E0B62-3DB3-518D-A10C-006A509713BC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{52051AD4-A4F5-53C2-905A-812A85994CCD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Agent", "src\Zastava\StellaOps.Zastava.Agent\StellaOps.Zastava.Agent.csproj", "{D3BA9C21-1337-5091-AD41-ABD11C4B150D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Observer", "src\Zastava\StellaOps.Zastava.Observer\StellaOps.Zastava.Observer.csproj", "{849DA55E-D3D1-5E35-A339-B1AC4590E0A3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Webhook", "src\Zastava\StellaOps.Zastava.Webhook\StellaOps.Zastava.Webhook.csproj", "{CEE84738-20C1-5800-B982-E331652C3917}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{64374268-E685-5130-B546-4FAFCF95CD2A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Core", "src\Zastava\__Libraries\StellaOps.Zastava.Core\StellaOps.Zastava.Core.csproj", "{B118588F-2F12-5CA8-8EED-426A7D34FF9A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{87C7FE69-A978-534E-8646-18D30C34F667}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Core.Tests", "src\Zastava\__Tests\StellaOps.Zastava.Core.Tests\StellaOps.Zastava.Core.Tests.csproj", "{7D3BAFD9-4120-5A6A-B215-10AB461844EB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Observer.Tests", "src\Zastava\__Tests\StellaOps.Zastava.Observer.Tests\StellaOps.Zastava.Observer.Tests.csproj", "{27196784-FFEA-59AB-8F26-3840EDF6C831}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Zastava.Webhook.Tests", "src\Zastava\__Tests\StellaOps.Zastava.Webhook.Tests\StellaOps.Zastava.Webhook.Tests.csproj", "{69AE1332-70C7-501D-A64E-F769F52B2449}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B7141C87-33DB-5F99-8B8B-0C61725C2D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7141C87-33DB-5F99-8B8B-0C61725C2D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7141C87-33DB-5F99-8B8B-0C61725C2D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7141C87-33DB-5F99-8B8B-0C61725C2D6F}.Release|Any CPU.Build.0 = Release|Any CPU + {6C186BD5-9A4D-5318-8AF8-F1B7AE48D812}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C186BD5-9A4D-5318-8AF8-F1B7AE48D812}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C186BD5-9A4D-5318-8AF8-F1B7AE48D812}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C186BD5-9A4D-5318-8AF8-F1B7AE48D812}.Release|Any CPU.Build.0 = Release|Any CPU + {B7FBC156-D7DE-5962-BFC8-40F94D6C00F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7FBC156-D7DE-5962-BFC8-40F94D6C00F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7FBC156-D7DE-5962-BFC8-40F94D6C00F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7FBC156-D7DE-5962-BFC8-40F94D6C00F9}.Release|Any CPU.Build.0 = Release|Any CPU + {112CFB30-3731-54C5-8E9F-7C2CC75C9B67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {112CFB30-3731-54C5-8E9F-7C2CC75C9B67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {112CFB30-3731-54C5-8E9F-7C2CC75C9B67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {112CFB30-3731-54C5-8E9F-7C2CC75C9B67}.Release|Any CPU.Build.0 = Release|Any CPU + {51BA43C0-6861-5B57-A837-B6CECF8D0257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51BA43C0-6861-5B57-A837-B6CECF8D0257}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51BA43C0-6861-5B57-A837-B6CECF8D0257}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51BA43C0-6861-5B57-A837-B6CECF8D0257}.Release|Any CPU.Build.0 = Release|Any CPU + {7002B619-1F2A-5393-B348-70CDAC639748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7002B619-1F2A-5393-B348-70CDAC639748}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7002B619-1F2A-5393-B348-70CDAC639748}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7002B619-1F2A-5393-B348-70CDAC639748}.Release|Any CPU.Build.0 = Release|Any CPU + {6D955BD2-7D9B-5495-9153-509864CF7096}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D955BD2-7D9B-5495-9153-509864CF7096}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D955BD2-7D9B-5495-9153-509864CF7096}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D955BD2-7D9B-5495-9153-509864CF7096}.Release|Any CPU.Build.0 = Release|Any CPU + {0EB72CBF-4405-5B0C-AF18-26764A0DB489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0EB72CBF-4405-5B0C-AF18-26764A0DB489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0EB72CBF-4405-5B0C-AF18-26764A0DB489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0EB72CBF-4405-5B0C-AF18-26764A0DB489}.Release|Any CPU.Build.0 = Release|Any CPU + {45DE9CF0-B55D-550D-8005-504FBF0F3CDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45DE9CF0-B55D-550D-8005-504FBF0F3CDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45DE9CF0-B55D-550D-8005-504FBF0F3CDF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45DE9CF0-B55D-550D-8005-504FBF0F3CDF}.Release|Any CPU.Build.0 = Release|Any CPU + {FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2}.Release|Any CPU.Build.0 = Release|Any CPU + {06AE06C1-E499-590D-88C0-E860AD7A7A32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06AE06C1-E499-590D-88C0-E860AD7A7A32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06AE06C1-E499-590D-88C0-E860AD7A7A32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06AE06C1-E499-590D-88C0-E860AD7A7A32}.Release|Any CPU.Build.0 = Release|Any CPU + {F07AE928-89B5-57F0-921C-3B97A376FF95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F07AE928-89B5-57F0-921C-3B97A376FF95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F07AE928-89B5-57F0-921C-3B97A376FF95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F07AE928-89B5-57F0-921C-3B97A376FF95}.Release|Any CPU.Build.0 = Release|Any CPU + {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF2C5848-16B4-54E1-A976-9C548AAF3077}.Release|Any CPU.Build.0 = Release|Any CPU + {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B905D2C-43E2-5637-9E98-393E5A3A1903}.Release|Any CPU.Build.0 = Release|Any CPU + {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9477476B-34BB-5A40-BAB2-ABA6DBFD9733}.Release|Any CPU.Build.0 = Release|Any CPU + {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FA8DD10-9178-588E-AC7E-F423FB235DA0}.Release|Any CPU.Build.0 = Release|Any CPU + {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58243870-C97F-5F26-B86F-BF1C0863BA0B}.Release|Any CPU.Build.0 = Release|Any CPU + {452CFFEA-8914-5128-AC23-65C969E53523}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {452CFFEA-8914-5128-AC23-65C969E53523}.Debug|Any CPU.Build.0 = Debug|Any CPU + {452CFFEA-8914-5128-AC23-65C969E53523}.Release|Any CPU.ActiveCfg = Release|Any CPU + {452CFFEA-8914-5128-AC23-65C969E53523}.Release|Any CPU.Build.0 = Release|Any CPU + {343BB1E8-DB77-52DA-B2E2-406C72088E34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {343BB1E8-DB77-52DA-B2E2-406C72088E34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {343BB1E8-DB77-52DA-B2E2-406C72088E34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {343BB1E8-DB77-52DA-B2E2-406C72088E34}.Release|Any CPU.Build.0 = Release|Any CPU + {6E0B7B8D-58FF-5297-9497-5286822D5483}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E0B7B8D-58FF-5297-9497-5286822D5483}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E0B7B8D-58FF-5297-9497-5286822D5483}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E0B7B8D-58FF-5297-9497-5286822D5483}.Release|Any CPU.Build.0 = Release|Any CPU + {E2189FEA-63C0-5828-A60E-6F4D2B4DC724}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2189FEA-63C0-5828-A60E-6F4D2B4DC724}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2189FEA-63C0-5828-A60E-6F4D2B4DC724}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2189FEA-63C0-5828-A60E-6F4D2B4DC724}.Release|Any CPU.Build.0 = Release|Any CPU + {8609324D-8A33-5C72-843C-C9CDF861F6B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8609324D-8A33-5C72-843C-C9CDF861F6B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8609324D-8A33-5C72-843C-C9CDF861F6B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8609324D-8A33-5C72-843C-C9CDF861F6B0}.Release|Any CPU.Build.0 = Release|Any CPU + {15346A13-8152-5B25-AA03-37AF5A883B94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15346A13-8152-5B25-AA03-37AF5A883B94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15346A13-8152-5B25-AA03-37AF5A883B94}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15346A13-8152-5B25-AA03-37AF5A883B94}.Release|Any CPU.Build.0 = Release|Any CPU + {A44B07A2-3C46-5AEF-9278-FC35BF3D020F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A44B07A2-3C46-5AEF-9278-FC35BF3D020F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A44B07A2-3C46-5AEF-9278-FC35BF3D020F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A44B07A2-3C46-5AEF-9278-FC35BF3D020F}.Release|Any CPU.Build.0 = Release|Any CPU + {AC5584D7-5085-5ED3-840C-0B82D7D2606A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC5584D7-5085-5ED3-840C-0B82D7D2606A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC5584D7-5085-5ED3-840C-0B82D7D2606A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC5584D7-5085-5ED3-840C-0B82D7D2606A}.Release|Any CPU.Build.0 = Release|Any CPU + {EEFF9AAC-ED84-55BF-8963-F5422023E379}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EEFF9AAC-ED84-55BF-8963-F5422023E379}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EEFF9AAC-ED84-55BF-8963-F5422023E379}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EEFF9AAC-ED84-55BF-8963-F5422023E379}.Release|Any CPU.Build.0 = Release|Any CPU + {C011DDAB-DD11-5213-8857-437320BE11C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C011DDAB-DD11-5213-8857-437320BE11C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C011DDAB-DD11-5213-8857-437320BE11C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C011DDAB-DD11-5213-8857-437320BE11C2}.Release|Any CPU.Build.0 = Release|Any CPU + {8ECC05DA-F183-5849-8840-D7DCD7E80819}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8ECC05DA-F183-5849-8840-D7DCD7E80819}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8ECC05DA-F183-5849-8840-D7DCD7E80819}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8ECC05DA-F183-5849-8840-D7DCD7E80819}.Release|Any CPU.Build.0 = Release|Any CPU + {2A7DBD4D-B339-5CBA-889F-358076B03D58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A7DBD4D-B339-5CBA-889F-358076B03D58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A7DBD4D-B339-5CBA-889F-358076B03D58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A7DBD4D-B339-5CBA-889F-358076B03D58}.Release|Any CPU.Build.0 = Release|Any CPU + {4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866}.Release|Any CPU.Build.0 = Release|Any CPU + {ECC3FD89-64D0-5048-A6E8-44470269D172}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECC3FD89-64D0-5048-A6E8-44470269D172}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECC3FD89-64D0-5048-A6E8-44470269D172}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECC3FD89-64D0-5048-A6E8-44470269D172}.Release|Any CPU.Build.0 = Release|Any CPU + {7200949F-B6B8-5857-9ECC-F43FA9C03A44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7200949F-B6B8-5857-9ECC-F43FA9C03A44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7200949F-B6B8-5857-9ECC-F43FA9C03A44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7200949F-B6B8-5857-9ECC-F43FA9C03A44}.Release|Any CPU.Build.0 = Release|Any CPU + {D367AE34-6CDE-5367-AE59-D9D037149B00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D367AE34-6CDE-5367-AE59-D9D037149B00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D367AE34-6CDE-5367-AE59-D9D037149B00}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D367AE34-6CDE-5367-AE59-D9D037149B00}.Release|Any CPU.Build.0 = Release|Any CPU + {147ED816-086E-5914-ACF0-4E30516BF50C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {147ED816-086E-5914-ACF0-4E30516BF50C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {147ED816-086E-5914-ACF0-4E30516BF50C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {147ED816-086E-5914-ACF0-4E30516BF50C}.Release|Any CPU.Build.0 = Release|Any CPU + {80561E59-C6A9-5F30-8BD2-053866ADBEE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80561E59-C6A9-5F30-8BD2-053866ADBEE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80561E59-C6A9-5F30-8BD2-053866ADBEE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80561E59-C6A9-5F30-8BD2-053866ADBEE9}.Release|Any CPU.Build.0 = Release|Any CPU + {4149C8AA-1BE2-5722-8114-8F1928B8B3F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4149C8AA-1BE2-5722-8114-8F1928B8B3F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4149C8AA-1BE2-5722-8114-8F1928B8B3F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4149C8AA-1BE2-5722-8114-8F1928B8B3F0}.Release|Any CPU.Build.0 = Release|Any CPU + {27982DF8-303D-5C8C-8595-FEFA9033F98A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27982DF8-303D-5C8C-8595-FEFA9033F98A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27982DF8-303D-5C8C-8595-FEFA9033F98A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27982DF8-303D-5C8C-8595-FEFA9033F98A}.Release|Any CPU.Build.0 = Release|Any CPU + {0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6}.Release|Any CPU.Build.0 = Release|Any CPU + {E41F4F80-1D92-59D8-9F97-48BF0BBAD093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E41F4F80-1D92-59D8-9F97-48BF0BBAD093}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E41F4F80-1D92-59D8-9F97-48BF0BBAD093}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E41F4F80-1D92-59D8-9F97-48BF0BBAD093}.Release|Any CPU.Build.0 = Release|Any CPU + {E71D7DB0-F816-5D1F-B86A-E01E806D7B12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E71D7DB0-F816-5D1F-B86A-E01E806D7B12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E71D7DB0-F816-5D1F-B86A-E01E806D7B12}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E71D7DB0-F816-5D1F-B86A-E01E806D7B12}.Release|Any CPU.Build.0 = Release|Any CPU + {EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B}.Release|Any CPU.Build.0 = Release|Any CPU + {EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D}.Release|Any CPU.Build.0 = Release|Any CPU + {B318A6FB-EBF7-5061-85B2-7542D71D226B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B318A6FB-EBF7-5061-85B2-7542D71D226B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B318A6FB-EBF7-5061-85B2-7542D71D226B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B318A6FB-EBF7-5061-85B2-7542D71D226B}.Release|Any CPU.Build.0 = Release|Any CPU + {5671223D-C370-5DD1-98D6-D27C3CA6A602}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5671223D-C370-5DD1-98D6-D27C3CA6A602}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5671223D-C370-5DD1-98D6-D27C3CA6A602}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5671223D-C370-5DD1-98D6-D27C3CA6A602}.Release|Any CPU.Build.0 = Release|Any CPU + {EE2D63D4-B7CA-5933-BE1F-05AABF69703E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE2D63D4-B7CA-5933-BE1F-05AABF69703E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE2D63D4-B7CA-5933-BE1F-05AABF69703E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE2D63D4-B7CA-5933-BE1F-05AABF69703E}.Release|Any CPU.Build.0 = Release|Any CPU + {A83FA14F-39A9-57EF-A49D-3EC86731F56E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A83FA14F-39A9-57EF-A49D-3EC86731F56E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A83FA14F-39A9-57EF-A49D-3EC86731F56E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A83FA14F-39A9-57EF-A49D-3EC86731F56E}.Release|Any CPU.Build.0 = Release|Any CPU + {AB83BC75-CF32-506D-9B8A-EBBDD2C28A56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB83BC75-CF32-506D-9B8A-EBBDD2C28A56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB83BC75-CF32-506D-9B8A-EBBDD2C28A56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB83BC75-CF32-506D-9B8A-EBBDD2C28A56}.Release|Any CPU.Build.0 = Release|Any CPU + {3E514FD3-4036-51D5-976B-CD18121684BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E514FD3-4036-51D5-976B-CD18121684BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E514FD3-4036-51D5-976B-CD18121684BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E514FD3-4036-51D5-976B-CD18121684BD}.Release|Any CPU.Build.0 = Release|Any CPU + {C10EF177-5C79-5A55-AE28-360DAB3D252C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C10EF177-5C79-5A55-AE28-360DAB3D252C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C10EF177-5C79-5A55-AE28-360DAB3D252C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C10EF177-5C79-5A55-AE28-360DAB3D252C}.Release|Any CPU.Build.0 = Release|Any CPU + {07FD7BF7-7756-5854-8DDB-41478A34BB64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07FD7BF7-7756-5854-8DDB-41478A34BB64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07FD7BF7-7756-5854-8DDB-41478A34BB64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07FD7BF7-7756-5854-8DDB-41478A34BB64}.Release|Any CPU.Build.0 = Release|Any CPU + {508E13BB-305B-58B8-9F2E-E9759874DF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {508E13BB-305B-58B8-9F2E-E9759874DF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {508E13BB-305B-58B8-9F2E-E9759874DF0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {508E13BB-305B-58B8-9F2E-E9759874DF0A}.Release|Any CPU.Build.0 = Release|Any CPU + {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6778FAEB-4621-54D3-BF75-0FDB99C6751D}.Release|Any CPU.Build.0 = Release|Any CPU + {8DCF30E6-164B-55D5-A003-0A4D890A4492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DCF30E6-164B-55D5-A003-0A4D890A4492}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DCF30E6-164B-55D5-A003-0A4D890A4492}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DCF30E6-164B-55D5-A003-0A4D890A4492}.Release|Any CPU.Build.0 = Release|Any CPU + {38E42693-FC3C-569F-909A-B24AD24AD1DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38E42693-FC3C-569F-909A-B24AD24AD1DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38E42693-FC3C-569F-909A-B24AD24AD1DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38E42693-FC3C-569F-909A-B24AD24AD1DA}.Release|Any CPU.Build.0 = Release|Any CPU + {0192EA27-7AE0-5952-B74A-32CF87973F79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0192EA27-7AE0-5952-B74A-32CF87973F79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0192EA27-7AE0-5952-B74A-32CF87973F79}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0192EA27-7AE0-5952-B74A-32CF87973F79}.Release|Any CPU.Build.0 = Release|Any CPU + {E8A66716-1110-5DB7-81B3-8D2F403419D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8A66716-1110-5DB7-81B3-8D2F403419D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8A66716-1110-5DB7-81B3-8D2F403419D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8A66716-1110-5DB7-81B3-8D2F403419D1}.Release|Any CPU.Build.0 = Release|Any CPU + {980E3CD4-3D1E-55B0-9D46-3944D82B1506}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {980E3CD4-3D1E-55B0-9D46-3944D82B1506}.Debug|Any CPU.Build.0 = Debug|Any CPU + {980E3CD4-3D1E-55B0-9D46-3944D82B1506}.Release|Any CPU.ActiveCfg = Release|Any CPU + {980E3CD4-3D1E-55B0-9D46-3944D82B1506}.Release|Any CPU.Build.0 = Release|Any CPU + {0C89A31F-44DE-59E0-843E-6608861D032B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C89A31F-44DE-59E0-843E-6608861D032B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C89A31F-44DE-59E0-843E-6608861D032B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C89A31F-44DE-59E0-843E-6608861D032B}.Release|Any CPU.Build.0 = Release|Any CPU + {72F73293-EFAC-5D27-911E-E6752D9E96FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72F73293-EFAC-5D27-911E-E6752D9E96FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72F73293-EFAC-5D27-911E-E6752D9E96FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72F73293-EFAC-5D27-911E-E6752D9E96FB}.Release|Any CPU.Build.0 = Release|Any CPU + {0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52}.Release|Any CPU.Build.0 = Release|Any CPU + {F0011F9C-EF86-578B-B25C-DFBFD8B2D137}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0011F9C-EF86-578B-B25C-DFBFD8B2D137}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0011F9C-EF86-578B-B25C-DFBFD8B2D137}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0011F9C-EF86-578B-B25C-DFBFD8B2D137}.Release|Any CPU.Build.0 = Release|Any CPU + {18566A49-CB0D-5662-AB0E-22DE76024FE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18566A49-CB0D-5662-AB0E-22DE76024FE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18566A49-CB0D-5662-AB0E-22DE76024FE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18566A49-CB0D-5662-AB0E-22DE76024FE9}.Release|Any CPU.Build.0 = Release|Any CPU + {68D84C0C-5272-5673-B8BF-1D5424885EC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68D84C0C-5272-5673-B8BF-1D5424885EC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68D84C0C-5272-5673-B8BF-1D5424885EC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68D84C0C-5272-5673-B8BF-1D5424885EC8}.Release|Any CPU.Build.0 = Release|Any CPU + {D36617C5-65AC-578F-8139-DF3D0BD91E55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D36617C5-65AC-578F-8139-DF3D0BD91E55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D36617C5-65AC-578F-8139-DF3D0BD91E55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D36617C5-65AC-578F-8139-DF3D0BD91E55}.Release|Any CPU.Build.0 = Release|Any CPU + {731333C9-6F41-5AD4-9B59-C3FAEE2A31A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {731333C9-6F41-5AD4-9B59-C3FAEE2A31A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {731333C9-6F41-5AD4-9B59-C3FAEE2A31A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {731333C9-6F41-5AD4-9B59-C3FAEE2A31A0}.Release|Any CPU.Build.0 = Release|Any CPU + {4C4A8491-4950-51C3-A134-89DEA080AFCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C4A8491-4950-51C3-A134-89DEA080AFCF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C4A8491-4950-51C3-A134-89DEA080AFCF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C4A8491-4950-51C3-A134-89DEA080AFCF}.Release|Any CPU.Build.0 = Release|Any CPU + {EF039F88-3A55-5F6F-A7F7-DC91AAF85B82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF039F88-3A55-5F6F-A7F7-DC91AAF85B82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF039F88-3A55-5F6F-A7F7-DC91AAF85B82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF039F88-3A55-5F6F-A7F7-DC91AAF85B82}.Release|Any CPU.Build.0 = Release|Any CPU + {841F79A2-944F-5807-AB6A-1BFF74278DB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {841F79A2-944F-5807-AB6A-1BFF74278DB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {841F79A2-944F-5807-AB6A-1BFF74278DB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {841F79A2-944F-5807-AB6A-1BFF74278DB4}.Release|Any CPU.Build.0 = Release|Any CPU + {501C9952-398B-503E-8C13-B67848D9DBB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {501C9952-398B-503E-8C13-B67848D9DBB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {501C9952-398B-503E-8C13-B67848D9DBB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {501C9952-398B-503E-8C13-B67848D9DBB1}.Release|Any CPU.Build.0 = Release|Any CPU + {30593F8A-492A-5484-BE89-858A29FE5A58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30593F8A-492A-5484-BE89-858A29FE5A58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30593F8A-492A-5484-BE89-858A29FE5A58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30593F8A-492A-5484-BE89-858A29FE5A58}.Release|Any CPU.Build.0 = Release|Any CPU + {80590588-9B02-52C7-B783-F3C6B0A2C023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80590588-9B02-52C7-B783-F3C6B0A2C023}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80590588-9B02-52C7-B783-F3C6B0A2C023}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80590588-9B02-52C7-B783-F3C6B0A2C023}.Release|Any CPU.Build.0 = Release|Any CPU + {3611A8A7-BCBA-58AC-905C-420D1018D814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3611A8A7-BCBA-58AC-905C-420D1018D814}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3611A8A7-BCBA-58AC-905C-420D1018D814}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3611A8A7-BCBA-58AC-905C-420D1018D814}.Release|Any CPU.Build.0 = Release|Any CPU + {E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D}.Release|Any CPU.Build.0 = Release|Any CPU + {82ACA55C-69E9-5488-9383-26C6C2FEE1B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {82ACA55C-69E9-5488-9383-26C6C2FEE1B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82ACA55C-69E9-5488-9383-26C6C2FEE1B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82ACA55C-69E9-5488-9383-26C6C2FEE1B0}.Release|Any CPU.Build.0 = Release|Any CPU + {5CE0902E-68CA-536E-AAC5-58041DDA1730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CE0902E-68CA-536E-AAC5-58041DDA1730}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CE0902E-68CA-536E-AAC5-58041DDA1730}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CE0902E-68CA-536E-AAC5-58041DDA1730}.Release|Any CPU.Build.0 = Release|Any CPU + {869157C1-588F-531E-BFD3-5D78FD91BC99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {869157C1-588F-531E-BFD3-5D78FD91BC99}.Debug|Any CPU.Build.0 = Debug|Any CPU + {869157C1-588F-531E-BFD3-5D78FD91BC99}.Release|Any CPU.ActiveCfg = Release|Any CPU + {869157C1-588F-531E-BFD3-5D78FD91BC99}.Release|Any CPU.Build.0 = Release|Any CPU + {B330A47C-BCA1-5406-B432-56115A665839}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B330A47C-BCA1-5406-B432-56115A665839}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B330A47C-BCA1-5406-B432-56115A665839}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B330A47C-BCA1-5406-B432-56115A665839}.Release|Any CPU.Build.0 = Release|Any CPU + {689E3E97-E53C-5A3D-8938-0587D6B21CD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {689E3E97-E53C-5A3D-8938-0587D6B21CD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {689E3E97-E53C-5A3D-8938-0587D6B21CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {689E3E97-E53C-5A3D-8938-0587D6B21CD1}.Release|Any CPU.Build.0 = Release|Any CPU + {7AA23462-E017-562D-9463-8C5B750E9496}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7AA23462-E017-562D-9463-8C5B750E9496}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7AA23462-E017-562D-9463-8C5B750E9496}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7AA23462-E017-562D-9463-8C5B750E9496}.Release|Any CPU.Build.0 = Release|Any CPU + {08D3BB86-4F4B-5C8B-B343-2207C0FA03CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08D3BB86-4F4B-5C8B-B343-2207C0FA03CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08D3BB86-4F4B-5C8B-B343-2207C0FA03CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08D3BB86-4F4B-5C8B-B343-2207C0FA03CE}.Release|Any CPU.Build.0 = Release|Any CPU + {CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C}.Release|Any CPU.Build.0 = Release|Any CPU + {2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C}.Release|Any CPU.Build.0 = Release|Any CPU + {0FAB272B-4502-5AE8-8B93-828EA37BE954}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FAB272B-4502-5AE8-8B93-828EA37BE954}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FAB272B-4502-5AE8-8B93-828EA37BE954}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FAB272B-4502-5AE8-8B93-828EA37BE954}.Release|Any CPU.Build.0 = Release|Any CPU + {EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F}.Release|Any CPU.Build.0 = Release|Any CPU + {B11C615A-8910-5102-8841-D3AC7BF7D63D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B11C615A-8910-5102-8841-D3AC7BF7D63D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B11C615A-8910-5102-8841-D3AC7BF7D63D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B11C615A-8910-5102-8841-D3AC7BF7D63D}.Release|Any CPU.Build.0 = Release|Any CPU + {ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB}.Release|Any CPU.Build.0 = Release|Any CPU + {5E92A1DF-1B82-5B8D-B6A0-40B362A7230F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E92A1DF-1B82-5B8D-B6A0-40B362A7230F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E92A1DF-1B82-5B8D-B6A0-40B362A7230F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E92A1DF-1B82-5B8D-B6A0-40B362A7230F}.Release|Any CPU.Build.0 = Release|Any CPU + {6FFD945A-2042-5A65-9021-BF77FB66C3A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FFD945A-2042-5A65-9021-BF77FB66C3A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FFD945A-2042-5A65-9021-BF77FB66C3A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FFD945A-2042-5A65-9021-BF77FB66C3A9}.Release|Any CPU.Build.0 = Release|Any CPU + {C41CA6D1-6D61-5210-B33C-4ED58D96C319}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C41CA6D1-6D61-5210-B33C-4ED58D96C319}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C41CA6D1-6D61-5210-B33C-4ED58D96C319}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C41CA6D1-6D61-5210-B33C-4ED58D96C319}.Release|Any CPU.Build.0 = Release|Any CPU + {28467D65-21AF-5711-8DA3-7EB8C258E8F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28467D65-21AF-5711-8DA3-7EB8C258E8F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28467D65-21AF-5711-8DA3-7EB8C258E8F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28467D65-21AF-5711-8DA3-7EB8C258E8F9}.Release|Any CPU.Build.0 = Release|Any CPU + {A4A8CF8E-6CE7-5384-8756-71838B0DD5E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4A8CF8E-6CE7-5384-8756-71838B0DD5E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4A8CF8E-6CE7-5384-8756-71838B0DD5E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4A8CF8E-6CE7-5384-8756-71838B0DD5E0}.Release|Any CPU.Build.0 = Release|Any CPU + {7E648DEF-9BFA-5E59-B4BD-3518CD63C833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E648DEF-9BFA-5E59-B4BD-3518CD63C833}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E648DEF-9BFA-5E59-B4BD-3518CD63C833}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E648DEF-9BFA-5E59-B4BD-3518CD63C833}.Release|Any CPU.Build.0 = Release|Any CPU + {EA34E87C-D188-5ED7-A221-01D1677F8657}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA34E87C-D188-5ED7-A221-01D1677F8657}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA34E87C-D188-5ED7-A221-01D1677F8657}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA34E87C-D188-5ED7-A221-01D1677F8657}.Release|Any CPU.Build.0 = Release|Any CPU + {6BD4B5F7-8974-5010-B9F6-53CB24DE6C06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BD4B5F7-8974-5010-B9F6-53CB24DE6C06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BD4B5F7-8974-5010-B9F6-53CB24DE6C06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BD4B5F7-8974-5010-B9F6-53CB24DE6C06}.Release|Any CPU.Build.0 = Release|Any CPU + {95AD2F0E-8D9D-541C-9E08-4DE9C89B867F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95AD2F0E-8D9D-541C-9E08-4DE9C89B867F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95AD2F0E-8D9D-541C-9E08-4DE9C89B867F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95AD2F0E-8D9D-541C-9E08-4DE9C89B867F}.Release|Any CPU.Build.0 = Release|Any CPU + {EA4F9B01-0644-534A-AA8D-81B5E2BD3A31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA4F9B01-0644-534A-AA8D-81B5E2BD3A31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA4F9B01-0644-534A-AA8D-81B5E2BD3A31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA4F9B01-0644-534A-AA8D-81B5E2BD3A31}.Release|Any CPU.Build.0 = Release|Any CPU + {82362C0E-5A23-51EC-A539-38DC2C8B18C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {82362C0E-5A23-51EC-A539-38DC2C8B18C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82362C0E-5A23-51EC-A539-38DC2C8B18C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82362C0E-5A23-51EC-A539-38DC2C8B18C6}.Release|Any CPU.Build.0 = Release|Any CPU + {E8A4DA95-0028-56E3-876D-964AB6285B86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8A4DA95-0028-56E3-876D-964AB6285B86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8A4DA95-0028-56E3-876D-964AB6285B86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8A4DA95-0028-56E3-876D-964AB6285B86}.Release|Any CPU.Build.0 = Release|Any CPU + {E85B9476-FCE0-557B-9598-FD46D59F7846}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E85B9476-FCE0-557B-9598-FD46D59F7846}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E85B9476-FCE0-557B-9598-FD46D59F7846}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E85B9476-FCE0-557B-9598-FD46D59F7846}.Release|Any CPU.Build.0 = Release|Any CPU + {717BBC3C-0048-5728-9246-E54BCF73FDA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {717BBC3C-0048-5728-9246-E54BCF73FDA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {717BBC3C-0048-5728-9246-E54BCF73FDA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {717BBC3C-0048-5728-9246-E54BCF73FDA0}.Release|Any CPU.Build.0 = Release|Any CPU + {97284EB9-3307-5358-9D53-516135B9B67E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97284EB9-3307-5358-9D53-516135B9B67E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97284EB9-3307-5358-9D53-516135B9B67E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97284EB9-3307-5358-9D53-516135B9B67E}.Release|Any CPU.Build.0 = Release|Any CPU + {333F32BE-6053-51D0-8E43-6D4DABA6D01F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {333F32BE-6053-51D0-8E43-6D4DABA6D01F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {333F32BE-6053-51D0-8E43-6D4DABA6D01F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {333F32BE-6053-51D0-8E43-6D4DABA6D01F}.Release|Any CPU.Build.0 = Release|Any CPU + {533F1413-079E-537A-B336-90543B6A8A6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {533F1413-079E-537A-B336-90543B6A8A6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {533F1413-079E-537A-B336-90543B6A8A6D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {533F1413-079E-537A-B336-90543B6A8A6D}.Release|Any CPU.Build.0 = Release|Any CPU + {CBBFDF59-D233-5847-B08D-590AAC7D0062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBBFDF59-D233-5847-B08D-590AAC7D0062}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBBFDF59-D233-5847-B08D-590AAC7D0062}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBBFDF59-D233-5847-B08D-590AAC7D0062}.Release|Any CPU.Build.0 = Release|Any CPU + {F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3}.Release|Any CPU.Build.0 = Release|Any CPU + {E9ABE946-C645-5359-B25E-8BAA18689C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9ABE946-C645-5359-B25E-8BAA18689C44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9ABE946-C645-5359-B25E-8BAA18689C44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9ABE946-C645-5359-B25E-8BAA18689C44}.Release|Any CPU.Build.0 = Release|Any CPU + {B2CCA353-DF3F-57B7-8108-C7BFA1F6553B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B2CCA353-DF3F-57B7-8108-C7BFA1F6553B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2CCA353-DF3F-57B7-8108-C7BFA1F6553B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B2CCA353-DF3F-57B7-8108-C7BFA1F6553B}.Release|Any CPU.Build.0 = Release|Any CPU + {C1FCD683-A858-5864-8FFC-71F10EBB037C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1FCD683-A858-5864-8FFC-71F10EBB037C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1FCD683-A858-5864-8FFC-71F10EBB037C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1FCD683-A858-5864-8FFC-71F10EBB037C}.Release|Any CPU.Build.0 = Release|Any CPU + {533E7642-7A19-5148-9961-7AD1C129F6A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {533E7642-7A19-5148-9961-7AD1C129F6A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {533E7642-7A19-5148-9961-7AD1C129F6A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {533E7642-7A19-5148-9961-7AD1C129F6A3}.Release|Any CPU.Build.0 = Release|Any CPU + {69E38AB5-4754-5EE1-A4F6-4066121380E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69E38AB5-4754-5EE1-A4F6-4066121380E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69E38AB5-4754-5EE1-A4F6-4066121380E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69E38AB5-4754-5EE1-A4F6-4066121380E8}.Release|Any CPU.Build.0 = Release|Any CPU + {C0D3B371-0629-51A6-977E-109DD8C75193}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C0D3B371-0629-51A6-977E-109DD8C75193}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C0D3B371-0629-51A6-977E-109DD8C75193}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C0D3B371-0629-51A6-977E-109DD8C75193}.Release|Any CPU.Build.0 = Release|Any CPU + {ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1}.Release|Any CPU.Build.0 = Release|Any CPU + {0260AD37-54DA-5800-B7D5-1C87AD53DA5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0260AD37-54DA-5800-B7D5-1C87AD53DA5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0260AD37-54DA-5800-B7D5-1C87AD53DA5E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0260AD37-54DA-5800-B7D5-1C87AD53DA5E}.Release|Any CPU.Build.0 = Release|Any CPU + {523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A}.Release|Any CPU.Build.0 = Release|Any CPU + {FD6169A5-BA05-532F-9F9C-CA706278E422}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD6169A5-BA05-532F-9F9C-CA706278E422}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD6169A5-BA05-532F-9F9C-CA706278E422}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD6169A5-BA05-532F-9F9C-CA706278E422}.Release|Any CPU.Build.0 = Release|Any CPU + {2A280282-543C-56B1-ABEA-0E104874FAB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A280282-543C-56B1-ABEA-0E104874FAB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A280282-543C-56B1-ABEA-0E104874FAB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A280282-543C-56B1-ABEA-0E104874FAB2}.Release|Any CPU.Build.0 = Release|Any CPU + {898AEFFF-4499-5223-9E5A-51D23E359283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {898AEFFF-4499-5223-9E5A-51D23E359283}.Debug|Any CPU.Build.0 = Debug|Any CPU + {898AEFFF-4499-5223-9E5A-51D23E359283}.Release|Any CPU.ActiveCfg = Release|Any CPU + {898AEFFF-4499-5223-9E5A-51D23E359283}.Release|Any CPU.Build.0 = Release|Any CPU + {B65C2C6B-14A5-59FC-9864-0ACBCA225905}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B65C2C6B-14A5-59FC-9864-0ACBCA225905}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B65C2C6B-14A5-59FC-9864-0ACBCA225905}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B65C2C6B-14A5-59FC-9864-0ACBCA225905}.Release|Any CPU.Build.0 = Release|Any CPU + {518349EC-22EA-5C63-82C9-B62C355ECF06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {518349EC-22EA-5C63-82C9-B62C355ECF06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {518349EC-22EA-5C63-82C9-B62C355ECF06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {518349EC-22EA-5C63-82C9-B62C355ECF06}.Release|Any CPU.Build.0 = Release|Any CPU + {978E57C9-6329-53E6-BCFB-25B61900FF56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {978E57C9-6329-53E6-BCFB-25B61900FF56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {978E57C9-6329-53E6-BCFB-25B61900FF56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {978E57C9-6329-53E6-BCFB-25B61900FF56}.Release|Any CPU.Build.0 = Release|Any CPU + {A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF}.Release|Any CPU.Build.0 = Release|Any CPU + {67D45094-106D-5A42-8908-EE0ED693C316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67D45094-106D-5A42-8908-EE0ED693C316}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67D45094-106D-5A42-8908-EE0ED693C316}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67D45094-106D-5A42-8908-EE0ED693C316}.Release|Any CPU.Build.0 = Release|Any CPU + {DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A}.Release|Any CPU.Build.0 = Release|Any CPU + {42C7E32A-4A4F-5E14-9A1C-CB6888F42911}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42C7E32A-4A4F-5E14-9A1C-CB6888F42911}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42C7E32A-4A4F-5E14-9A1C-CB6888F42911}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42C7E32A-4A4F-5E14-9A1C-CB6888F42911}.Release|Any CPU.Build.0 = Release|Any CPU + {ECDA362C-2331-5E2A-9004-158FEFC09558}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECDA362C-2331-5E2A-9004-158FEFC09558}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECDA362C-2331-5E2A-9004-158FEFC09558}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECDA362C-2331-5E2A-9004-158FEFC09558}.Release|Any CPU.Build.0 = Release|Any CPU + {54692AE8-46FE-597C-9804-B85115C8D78E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54692AE8-46FE-597C-9804-B85115C8D78E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54692AE8-46FE-597C-9804-B85115C8D78E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54692AE8-46FE-597C-9804-B85115C8D78E}.Release|Any CPU.Build.0 = Release|Any CPU + {A8FFCABE-523B-52AC-B649-F728A13F7809}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8FFCABE-523B-52AC-B649-F728A13F7809}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8FFCABE-523B-52AC-B649-F728A13F7809}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8FFCABE-523B-52AC-B649-F728A13F7809}.Release|Any CPU.Build.0 = Release|Any CPU + {447BFD00-4629-5040-947F-3823CE6F1623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {447BFD00-4629-5040-947F-3823CE6F1623}.Debug|Any CPU.Build.0 = Debug|Any CPU + {447BFD00-4629-5040-947F-3823CE6F1623}.Release|Any CPU.ActiveCfg = Release|Any CPU + {447BFD00-4629-5040-947F-3823CE6F1623}.Release|Any CPU.Build.0 = Release|Any CPU + {FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD}.Release|Any CPU.Build.0 = Release|Any CPU + {B5FDDDD2-F649-5A1E-9D58-79C1B4880129}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5FDDDD2-F649-5A1E-9D58-79C1B4880129}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5FDDDD2-F649-5A1E-9D58-79C1B4880129}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5FDDDD2-F649-5A1E-9D58-79C1B4880129}.Release|Any CPU.Build.0 = Release|Any CPU + {414164E1-1D79-561F-84C8-AF13D2479467}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {414164E1-1D79-561F-84C8-AF13D2479467}.Debug|Any CPU.Build.0 = Debug|Any CPU + {414164E1-1D79-561F-84C8-AF13D2479467}.Release|Any CPU.ActiveCfg = Release|Any CPU + {414164E1-1D79-561F-84C8-AF13D2479467}.Release|Any CPU.Build.0 = Release|Any CPU + {0245DE31-CCD7-570B-A349-4A94B6747E7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0245DE31-CCD7-570B-A349-4A94B6747E7F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0245DE31-CCD7-570B-A349-4A94B6747E7F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0245DE31-CCD7-570B-A349-4A94B6747E7F}.Release|Any CPU.Build.0 = Release|Any CPU + {52A514C6-1F14-57DB-8040-8BD90724DF97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52A514C6-1F14-57DB-8040-8BD90724DF97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52A514C6-1F14-57DB-8040-8BD90724DF97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52A514C6-1F14-57DB-8040-8BD90724DF97}.Release|Any CPU.Build.0 = Release|Any CPU + {ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC}.Release|Any CPU.Build.0 = Release|Any CPU + {D57A3684-6938-52E3-A775-A05D1BC55BD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D57A3684-6938-52E3-A775-A05D1BC55BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D57A3684-6938-52E3-A775-A05D1BC55BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D57A3684-6938-52E3-A775-A05D1BC55BD9}.Release|Any CPU.Build.0 = Release|Any CPU + {F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8}.Release|Any CPU.Build.0 = Release|Any CPU + {4D19D7C7-33D5-5E40-BD37-F033F6514F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D19D7C7-33D5-5E40-BD37-F033F6514F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D19D7C7-33D5-5E40-BD37-F033F6514F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D19D7C7-33D5-5E40-BD37-F033F6514F8F}.Release|Any CPU.Build.0 = Release|Any CPU + {579B038A-DA40-568D-8D94-1819A61A77E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {579B038A-DA40-568D-8D94-1819A61A77E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {579B038A-DA40-568D-8D94-1819A61A77E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {579B038A-DA40-568D-8D94-1819A61A77E4}.Release|Any CPU.Build.0 = Release|Any CPU + {D1CD0F74-629F-5E39-AB12-D0E873B176DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1CD0F74-629F-5E39-AB12-D0E873B176DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1CD0F74-629F-5E39-AB12-D0E873B176DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1CD0F74-629F-5E39-AB12-D0E873B176DF}.Release|Any CPU.Build.0 = Release|Any CPU + {A39CCE1C-8779-5417-AAB7-F7F662947EF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A39CCE1C-8779-5417-AAB7-F7F662947EF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A39CCE1C-8779-5417-AAB7-F7F662947EF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A39CCE1C-8779-5417-AAB7-F7F662947EF7}.Release|Any CPU.Build.0 = Release|Any CPU + {8B0CB7F1-D942-5256-9345-814D7613FB8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B0CB7F1-D942-5256-9345-814D7613FB8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B0CB7F1-D942-5256-9345-814D7613FB8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B0CB7F1-D942-5256-9345-814D7613FB8D}.Release|Any CPU.Build.0 = Release|Any CPU + {8ADF03A1-5837-5C33-80D5-593F684B5D52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8ADF03A1-5837-5C33-80D5-593F684B5D52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8ADF03A1-5837-5C33-80D5-593F684B5D52}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8ADF03A1-5837-5C33-80D5-593F684B5D52}.Release|Any CPU.Build.0 = Release|Any CPU + {DCB28552-B244-5382-A01A-7FF9623D5D8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCB28552-B244-5382-A01A-7FF9623D5D8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCB28552-B244-5382-A01A-7FF9623D5D8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCB28552-B244-5382-A01A-7FF9623D5D8F}.Release|Any CPU.Build.0 = Release|Any CPU + {4E932374-54C6-5618-B9D0-C9F9586AF142}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E932374-54C6-5618-B9D0-C9F9586AF142}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E932374-54C6-5618-B9D0-C9F9586AF142}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E932374-54C6-5618-B9D0-C9F9586AF142}.Release|Any CPU.Build.0 = Release|Any CPU + {52F0C68B-4733-5B5A-94BC-8610E0044FB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52F0C68B-4733-5B5A-94BC-8610E0044FB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52F0C68B-4733-5B5A-94BC-8610E0044FB5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52F0C68B-4733-5B5A-94BC-8610E0044FB5}.Release|Any CPU.Build.0 = Release|Any CPU + {C7849419-3632-5210-B29D-AE643ADF7614}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7849419-3632-5210-B29D-AE643ADF7614}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7849419-3632-5210-B29D-AE643ADF7614}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7849419-3632-5210-B29D-AE643ADF7614}.Release|Any CPU.Build.0 = Release|Any CPU + {0A8F72E8-0678-5DC6-A529-6051825248A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A8F72E8-0678-5DC6-A529-6051825248A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A8F72E8-0678-5DC6-A529-6051825248A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A8F72E8-0678-5DC6-A529-6051825248A2}.Release|Any CPU.Build.0 = Release|Any CPU + {3C0189B8-5C01-5CAF-921B-14534E5AD8F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C0189B8-5C01-5CAF-921B-14534E5AD8F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C0189B8-5C01-5CAF-921B-14534E5AD8F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C0189B8-5C01-5CAF-921B-14534E5AD8F3}.Release|Any CPU.Build.0 = Release|Any CPU + {F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8}.Release|Any CPU.Build.0 = Release|Any CPU + {399C398F-37AC-5E5E-A071-7856B28E2F91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {399C398F-37AC-5E5E-A071-7856B28E2F91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {399C398F-37AC-5E5E-A071-7856B28E2F91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {399C398F-37AC-5E5E-A071-7856B28E2F91}.Release|Any CPU.Build.0 = Release|Any CPU + {FB31FD4A-6D32-5F44-A765-BF97D0992416}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB31FD4A-6D32-5F44-A765-BF97D0992416}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB31FD4A-6D32-5F44-A765-BF97D0992416}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB31FD4A-6D32-5F44-A765-BF97D0992416}.Release|Any CPU.Build.0 = Release|Any CPU + {2E5136AC-787A-5395-9E34-6DF39AD968A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E5136AC-787A-5395-9E34-6DF39AD968A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E5136AC-787A-5395-9E34-6DF39AD968A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E5136AC-787A-5395-9E34-6DF39AD968A7}.Release|Any CPU.Build.0 = Release|Any CPU + {271FC73D-0A74-5833-9710-095BB48BDE36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {271FC73D-0A74-5833-9710-095BB48BDE36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {271FC73D-0A74-5833-9710-095BB48BDE36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {271FC73D-0A74-5833-9710-095BB48BDE36}.Release|Any CPU.Build.0 = Release|Any CPU + {CCD04E7B-4971-5471-B3C3-F1EB37211477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCD04E7B-4971-5471-B3C3-F1EB37211477}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCD04E7B-4971-5471-B3C3-F1EB37211477}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCD04E7B-4971-5471-B3C3-F1EB37211477}.Release|Any CPU.Build.0 = Release|Any CPU + {6A3E0408-E974-5B1E-8944-9745294CA34F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A3E0408-E974-5B1E-8944-9745294CA34F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A3E0408-E974-5B1E-8944-9745294CA34F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A3E0408-E974-5B1E-8944-9745294CA34F}.Release|Any CPU.Build.0 = Release|Any CPU + {BC02D193-613F-532F-98A3-C09FF0CC8116}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC02D193-613F-532F-98A3-C09FF0CC8116}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC02D193-613F-532F-98A3-C09FF0CC8116}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC02D193-613F-532F-98A3-C09FF0CC8116}.Release|Any CPU.Build.0 = Release|Any CPU + {42D599AE-EE37-55F8-926D-2918FE8C2FF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42D599AE-EE37-55F8-926D-2918FE8C2FF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42D599AE-EE37-55F8-926D-2918FE8C2FF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42D599AE-EE37-55F8-926D-2918FE8C2FF1}.Release|Any CPU.Build.0 = Release|Any CPU + {9365CC66-A669-5ACD-AA12-4991D1DBCD10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9365CC66-A669-5ACD-AA12-4991D1DBCD10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9365CC66-A669-5ACD-AA12-4991D1DBCD10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9365CC66-A669-5ACD-AA12-4991D1DBCD10}.Release|Any CPU.Build.0 = Release|Any CPU + {C3141611-E90D-55A2-819B-A65AEF921787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3141611-E90D-55A2-819B-A65AEF921787}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3141611-E90D-55A2-819B-A65AEF921787}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3141611-E90D-55A2-819B-A65AEF921787}.Release|Any CPU.Build.0 = Release|Any CPU + {B62F97B5-73F5-5F9C-90F5-F156C52E6424}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B62F97B5-73F5-5F9C-90F5-F156C52E6424}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B62F97B5-73F5-5F9C-90F5-F156C52E6424}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B62F97B5-73F5-5F9C-90F5-F156C52E6424}.Release|Any CPU.Build.0 = Release|Any CPU + {48090851-C268-5625-9967-7E1B364AE5BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48090851-C268-5625-9967-7E1B364AE5BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48090851-C268-5625-9967-7E1B364AE5BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48090851-C268-5625-9967-7E1B364AE5BB}.Release|Any CPU.Build.0 = Release|Any CPU + {A2FA5C54-A698-51F4-BE96-DA5080CA10D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2FA5C54-A698-51F4-BE96-DA5080CA10D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2FA5C54-A698-51F4-BE96-DA5080CA10D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2FA5C54-A698-51F4-BE96-DA5080CA10D1}.Release|Any CPU.Build.0 = Release|Any CPU + {E76711C3-B30E-5E2F-8532-0885F4E4992E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E76711C3-B30E-5E2F-8532-0885F4E4992E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E76711C3-B30E-5E2F-8532-0885F4E4992E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E76711C3-B30E-5E2F-8532-0885F4E4992E}.Release|Any CPU.Build.0 = Release|Any CPU + {D8D2C86C-A8D2-597F-B9CB-92C6D412752E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8D2C86C-A8D2-597F-B9CB-92C6D412752E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8D2C86C-A8D2-597F-B9CB-92C6D412752E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8D2C86C-A8D2-597F-B9CB-92C6D412752E}.Release|Any CPU.Build.0 = Release|Any CPU + {9326B135-DEF9-52CD-B1E9-F90EEEAA40FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9326B135-DEF9-52CD-B1E9-F90EEEAA40FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9326B135-DEF9-52CD-B1E9-F90EEEAA40FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9326B135-DEF9-52CD-B1E9-F90EEEAA40FB}.Release|Any CPU.Build.0 = Release|Any CPU + {823042FD-8786-5959-AA1E-8E225497A91D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {823042FD-8786-5959-AA1E-8E225497A91D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {823042FD-8786-5959-AA1E-8E225497A91D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {823042FD-8786-5959-AA1E-8E225497A91D}.Release|Any CPU.Build.0 = Release|Any CPU + {A182BBDA-2794-538D-87BC-5C9F1A52EC9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A182BBDA-2794-538D-87BC-5C9F1A52EC9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A182BBDA-2794-538D-87BC-5C9F1A52EC9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A182BBDA-2794-538D-87BC-5C9F1A52EC9C}.Release|Any CPU.Build.0 = Release|Any CPU + {49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE}.Release|Any CPU.Build.0 = Release|Any CPU + {E6AD0F88-58A6-591B-B81F-55D76970AAC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6AD0F88-58A6-591B-B81F-55D76970AAC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6AD0F88-58A6-591B-B81F-55D76970AAC6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6AD0F88-58A6-591B-B81F-55D76970AAC6}.Release|Any CPU.Build.0 = Release|Any CPU + {64ED47CD-60F8-50B0-ABF1-BD3624D3876B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64ED47CD-60F8-50B0-ABF1-BD3624D3876B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64ED47CD-60F8-50B0-ABF1-BD3624D3876B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64ED47CD-60F8-50B0-ABF1-BD3624D3876B}.Release|Any CPU.Build.0 = Release|Any CPU + {86FE95FB-6E35-599C-AD1F-CCA00200BAD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86FE95FB-6E35-599C-AD1F-CCA00200BAD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86FE95FB-6E35-599C-AD1F-CCA00200BAD2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86FE95FB-6E35-599C-AD1F-CCA00200BAD2}.Release|Any CPU.Build.0 = Release|Any CPU + {E048277B-0B7F-5912-8190-871D57D0CB36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E048277B-0B7F-5912-8190-871D57D0CB36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E048277B-0B7F-5912-8190-871D57D0CB36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E048277B-0B7F-5912-8190-871D57D0CB36}.Release|Any CPU.Build.0 = Release|Any CPU + {8637D2D5-FCFA-592E-AB09-1134DD444F51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8637D2D5-FCFA-592E-AB09-1134DD444F51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8637D2D5-FCFA-592E-AB09-1134DD444F51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8637D2D5-FCFA-592E-AB09-1134DD444F51}.Release|Any CPU.Build.0 = Release|Any CPU + {6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494}.Release|Any CPU.Build.0 = Release|Any CPU + {6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F}.Release|Any CPU.Build.0 = Release|Any CPU + {FB3C53E3-B728-5E37-9095-E8A62235C779}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB3C53E3-B728-5E37-9095-E8A62235C779}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB3C53E3-B728-5E37-9095-E8A62235C779}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB3C53E3-B728-5E37-9095-E8A62235C779}.Release|Any CPU.Build.0 = Release|Any CPU + {BAE0F14F-67B0-52A8-8A37-DAB9117CAB92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAE0F14F-67B0-52A8-8A37-DAB9117CAB92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAE0F14F-67B0-52A8-8A37-DAB9117CAB92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAE0F14F-67B0-52A8-8A37-DAB9117CAB92}.Release|Any CPU.Build.0 = Release|Any CPU + {BBD9FB80-1740-52D1-8D4A-CBCC23458967}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBD9FB80-1740-52D1-8D4A-CBCC23458967}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBD9FB80-1740-52D1-8D4A-CBCC23458967}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBD9FB80-1740-52D1-8D4A-CBCC23458967}.Release|Any CPU.Build.0 = Release|Any CPU + {6B728CF0-08D7-5495-AF3B-80E03D8E3085}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B728CF0-08D7-5495-AF3B-80E03D8E3085}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B728CF0-08D7-5495-AF3B-80E03D8E3085}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B728CF0-08D7-5495-AF3B-80E03D8E3085}.Release|Any CPU.Build.0 = Release|Any CPU + {A65C327F-9D4B-57DF-A94E-456215B00102}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A65C327F-9D4B-57DF-A94E-456215B00102}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A65C327F-9D4B-57DF-A94E-456215B00102}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A65C327F-9D4B-57DF-A94E-456215B00102}.Release|Any CPU.Build.0 = Release|Any CPU + {8F9AB893-1069-58DE-9213-58FFD149AEE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F9AB893-1069-58DE-9213-58FFD149AEE1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F9AB893-1069-58DE-9213-58FFD149AEE1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F9AB893-1069-58DE-9213-58FFD149AEE1}.Release|Any CPU.Build.0 = Release|Any CPU + {AE390E3E-F95E-54E2-8ED8-ACF460F30C32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE390E3E-F95E-54E2-8ED8-ACF460F30C32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE390E3E-F95E-54E2-8ED8-ACF460F30C32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE390E3E-F95E-54E2-8ED8-ACF460F30C32}.Release|Any CPU.Build.0 = Release|Any CPU + {C11D8D60-CA38-5F92-A741-EB8C8D99C5D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C11D8D60-CA38-5F92-A741-EB8C8D99C5D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C11D8D60-CA38-5F92-A741-EB8C8D99C5D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C11D8D60-CA38-5F92-A741-EB8C8D99C5D2}.Release|Any CPU.Build.0 = Release|Any CPU + {C2903B94-B7B4-525C-AC6A-DE5FBCADE029}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2903B94-B7B4-525C-AC6A-DE5FBCADE029}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2903B94-B7B4-525C-AC6A-DE5FBCADE029}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2903B94-B7B4-525C-AC6A-DE5FBCADE029}.Release|Any CPU.Build.0 = Release|Any CPU + {0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8}.Release|Any CPU.Build.0 = Release|Any CPU + {7581D3D4-8C62-59F8-A085-143AA9DAFCB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7581D3D4-8C62-59F8-A085-143AA9DAFCB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7581D3D4-8C62-59F8-A085-143AA9DAFCB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7581D3D4-8C62-59F8-A085-143AA9DAFCB7}.Release|Any CPU.Build.0 = Release|Any CPU + {FB660FD7-F8C1-5FE1-85E7-066B22F23381}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB660FD7-F8C1-5FE1-85E7-066B22F23381}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB660FD7-F8C1-5FE1-85E7-066B22F23381}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB660FD7-F8C1-5FE1-85E7-066B22F23381}.Release|Any CPU.Build.0 = Release|Any CPU + {8A7FC726-0271-514B-ABA4-EA48DDE93B8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A7FC726-0271-514B-ABA4-EA48DDE93B8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A7FC726-0271-514B-ABA4-EA48DDE93B8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A7FC726-0271-514B-ABA4-EA48DDE93B8C}.Release|Any CPU.Build.0 = Release|Any CPU + {1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0}.Release|Any CPU.Build.0 = Release|Any CPU + {01D6CF66-7B69-5772-9811-C3BF554793C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01D6CF66-7B69-5772-9811-C3BF554793C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01D6CF66-7B69-5772-9811-C3BF554793C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01D6CF66-7B69-5772-9811-C3BF554793C9}.Release|Any CPU.Build.0 = Release|Any CPU + {1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675}.Release|Any CPU.Build.0 = Release|Any CPU + {C4E024A9-91DE-5071-86FB-25B350B6D78E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4E024A9-91DE-5071-86FB-25B350B6D78E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4E024A9-91DE-5071-86FB-25B350B6D78E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4E024A9-91DE-5071-86FB-25B350B6D78E}.Release|Any CPU.Build.0 = Release|Any CPU + {58C665E2-C3A7-5E69-873D-B6FEC96FAB8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58C665E2-C3A7-5E69-873D-B6FEC96FAB8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58C665E2-C3A7-5E69-873D-B6FEC96FAB8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58C665E2-C3A7-5E69-873D-B6FEC96FAB8C}.Release|Any CPU.Build.0 = Release|Any CPU + {AF70972B-54C3-5DEC-B005-B1CF4B84E14D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF70972B-54C3-5DEC-B005-B1CF4B84E14D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF70972B-54C3-5DEC-B005-B1CF4B84E14D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF70972B-54C3-5DEC-B005-B1CF4B84E14D}.Release|Any CPU.Build.0 = Release|Any CPU + {A284375A-B4E0-50C5-B3C0-766ECBF70CD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A284375A-B4E0-50C5-B3C0-766ECBF70CD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A284375A-B4E0-50C5-B3C0-766ECBF70CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A284375A-B4E0-50C5-B3C0-766ECBF70CD1}.Release|Any CPU.Build.0 = Release|Any CPU + {CBEC642B-A4B3-5B3E-A5EF-64993811FDC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBEC642B-A4B3-5B3E-A5EF-64993811FDC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBEC642B-A4B3-5B3E-A5EF-64993811FDC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBEC642B-A4B3-5B3E-A5EF-64993811FDC9}.Release|Any CPU.Build.0 = Release|Any CPU + {C6BBD0A5-C811-50A3-A614-C535E7D0AF50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6BBD0A5-C811-50A3-A614-C535E7D0AF50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6BBD0A5-C811-50A3-A614-C535E7D0AF50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6BBD0A5-C811-50A3-A614-C535E7D0AF50}.Release|Any CPU.Build.0 = Release|Any CPU + {48256054-736E-5597-995F-BAF166998337}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48256054-736E-5597-995F-BAF166998337}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48256054-736E-5597-995F-BAF166998337}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48256054-736E-5597-995F-BAF166998337}.Release|Any CPU.Build.0 = Release|Any CPU + {B4C782D3-CF67-5A0F-9E60-757405CF4BEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4C782D3-CF67-5A0F-9E60-757405CF4BEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4C782D3-CF67-5A0F-9E60-757405CF4BEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4C782D3-CF67-5A0F-9E60-757405CF4BEB}.Release|Any CPU.Build.0 = Release|Any CPU + {64756370-8E80-5638-B0F3-5EACFBB8FD64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64756370-8E80-5638-B0F3-5EACFBB8FD64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64756370-8E80-5638-B0F3-5EACFBB8FD64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64756370-8E80-5638-B0F3-5EACFBB8FD64}.Release|Any CPU.Build.0 = Release|Any CPU + {251DA02D-00DA-5211-BD79-AC28E18F326C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {251DA02D-00DA-5211-BD79-AC28E18F326C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {251DA02D-00DA-5211-BD79-AC28E18F326C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {251DA02D-00DA-5211-BD79-AC28E18F326C}.Release|Any CPU.Build.0 = Release|Any CPU + {E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE}.Release|Any CPU.Build.0 = Release|Any CPU + {C7551073-07A8-58AA-BCB0-5CB79FC2D109}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7551073-07A8-58AA-BCB0-5CB79FC2D109}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7551073-07A8-58AA-BCB0-5CB79FC2D109}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7551073-07A8-58AA-BCB0-5CB79FC2D109}.Release|Any CPU.Build.0 = Release|Any CPU + {06187BD6-754B-529E-BFF1-CA5D0FA4D5D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06187BD6-754B-529E-BFF1-CA5D0FA4D5D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06187BD6-754B-529E-BFF1-CA5D0FA4D5D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06187BD6-754B-529E-BFF1-CA5D0FA4D5D1}.Release|Any CPU.Build.0 = Release|Any CPU + {17508C6F-FADD-5BCE-B47B-0A78F4AA437E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {17508C6F-FADD-5BCE-B47B-0A78F4AA437E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17508C6F-FADD-5BCE-B47B-0A78F4AA437E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {17508C6F-FADD-5BCE-B47B-0A78F4AA437E}.Release|Any CPU.Build.0 = Release|Any CPU + {5545C1F3-B963-5FAA-ACD7-9F57D4470F19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5545C1F3-B963-5FAA-ACD7-9F57D4470F19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5545C1F3-B963-5FAA-ACD7-9F57D4470F19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5545C1F3-B963-5FAA-ACD7-9F57D4470F19}.Release|Any CPU.Build.0 = Release|Any CPU + {492926FA-134A-5BF8-9148-97D9A291E3C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {492926FA-134A-5BF8-9148-97D9A291E3C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {492926FA-134A-5BF8-9148-97D9A291E3C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {492926FA-134A-5BF8-9148-97D9A291E3C5}.Release|Any CPU.Build.0 = Release|Any CPU + {F82ACF7C-966D-5C85-AB8C-637206C2495D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F82ACF7C-966D-5C85-AB8C-637206C2495D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F82ACF7C-966D-5C85-AB8C-637206C2495D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F82ACF7C-966D-5C85-AB8C-637206C2495D}.Release|Any CPU.Build.0 = Release|Any CPU + {C0BA2B16-7593-55EF-9368-CF06C1F94379}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C0BA2B16-7593-55EF-9368-CF06C1F94379}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C0BA2B16-7593-55EF-9368-CF06C1F94379}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C0BA2B16-7593-55EF-9368-CF06C1F94379}.Release|Any CPU.Build.0 = Release|Any CPU + {CE252920-E8A0-5175-B211-CD71EABCFC75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE252920-E8A0-5175-B211-CD71EABCFC75}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE252920-E8A0-5175-B211-CD71EABCFC75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE252920-E8A0-5175-B211-CD71EABCFC75}.Release|Any CPU.Build.0 = Release|Any CPU + {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5970CA22-EC4F-5D2F-906D-8B5B934E2547}.Release|Any CPU.Build.0 = Release|Any CPU + {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F6D6D31-28AC-5022-BD72-61F153062B6C}.Release|Any CPU.Build.0 = Release|Any CPU + {E7CD5254-7D73-585E-94B8-E70C281423F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7CD5254-7D73-585E-94B8-E70C281423F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7CD5254-7D73-585E-94B8-E70C281423F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7CD5254-7D73-585E-94B8-E70C281423F1}.Release|Any CPU.Build.0 = Release|Any CPU + {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB1F45C7-44CB-516D-A888-4E1EAEABF44B}.Release|Any CPU.Build.0 = Release|Any CPU + {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA}.Release|Any CPU.Build.0 = Release|Any CPU + {769E6552-E895-5951-8C67-86B251A6036B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {769E6552-E895-5951-8C67-86B251A6036B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {769E6552-E895-5951-8C67-86B251A6036B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {769E6552-E895-5951-8C67-86B251A6036B}.Release|Any CPU.Build.0 = Release|Any CPU + {92336BE4-5E46-5C13-B200-69A80999182B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92336BE4-5E46-5C13-B200-69A80999182B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92336BE4-5E46-5C13-B200-69A80999182B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92336BE4-5E46-5C13-B200-69A80999182B}.Release|Any CPU.Build.0 = Release|Any CPU + {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7531EC3D-6ADD-5551-ADC2-A283A56028FF}.Release|Any CPU.Build.0 = Release|Any CPU + {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C270C125-2FCB-5F43-A1B0-EE27079662BB}.Release|Any CPU.Build.0 = Release|Any CPU + {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970}.Release|Any CPU.Build.0 = Release|Any CPU + {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF}.Release|Any CPU.Build.0 = Release|Any CPU + {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23A27A2A-2C8E-5C38-9F17-06FCDD87C147}.Release|Any CPU.Build.0 = Release|Any CPU + {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27}.Release|Any CPU.Build.0 = Release|Any CPU + {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C}.Release|Any CPU.Build.0 = Release|Any CPU + {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD}.Release|Any CPU.Build.0 = Release|Any CPU + {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2AC4478-3191-5B4E-A0EB-222156F9C2F0}.Release|Any CPU.Build.0 = Release|Any CPU + {38127116-0764-53E6-B5B5-2BA0CA0B7F91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38127116-0764-53E6-B5B5-2BA0CA0B7F91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38127116-0764-53E6-B5B5-2BA0CA0B7F91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38127116-0764-53E6-B5B5-2BA0CA0B7F91}.Release|Any CPU.Build.0 = Release|Any CPU + {7701FD94-6296-5CD5-8E7B-F7CAEA02052C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7701FD94-6296-5CD5-8E7B-F7CAEA02052C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7701FD94-6296-5CD5-8E7B-F7CAEA02052C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7701FD94-6296-5CD5-8E7B-F7CAEA02052C}.Release|Any CPU.Build.0 = Release|Any CPU + {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4}.Release|Any CPU.Build.0 = Release|Any CPU + {A07964A7-387D-587F-9507-5E89354A965A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A07964A7-387D-587F-9507-5E89354A965A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A07964A7-387D-587F-9507-5E89354A965A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A07964A7-387D-587F-9507-5E89354A965A}.Release|Any CPU.Build.0 = Release|Any CPU + {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69247914-5C25-5B86-8DA2-93F0C41EC3D2}.Release|Any CPU.Build.0 = Release|Any CPU + {67F2A597-9CF3-554A-89AF-A527D41D8831}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67F2A597-9CF3-554A-89AF-A527D41D8831}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67F2A597-9CF3-554A-89AF-A527D41D8831}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67F2A597-9CF3-554A-89AF-A527D41D8831}.Release|Any CPU.Build.0 = Release|Any CPU + {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D}.Release|Any CPU.Build.0 = Release|Any CPU + {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Debug|Any CPU.Build.0 = Debug|Any CPU + {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Release|Any CPU.ActiveCfg = Release|Any CPU + {180A6CFD-B8CE-56A1-AFE8-030C06C67438}.Release|Any CPU.Build.0 = Release|Any CPU + {69A89A48-4FF1-56DD-95F4-B81DBAADACDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69A89A48-4FF1-56DD-95F4-B81DBAADACDA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69A89A48-4FF1-56DD-95F4-B81DBAADACDA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69A89A48-4FF1-56DD-95F4-B81DBAADACDA}.Release|Any CPU.Build.0 = Release|Any CPU + {22C6842B-7851-510C-9DBB-675188E2B020}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22C6842B-7851-510C-9DBB-675188E2B020}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22C6842B-7851-510C-9DBB-675188E2B020}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22C6842B-7851-510C-9DBB-675188E2B020}.Release|Any CPU.Build.0 = Release|Any CPU + {D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9}.Release|Any CPU.Build.0 = Release|Any CPU + {5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8}.Release|Any CPU.Build.0 = Release|Any CPU + {027F58E2-96C8-55C3-B22B-1EC5B0621106}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {027F58E2-96C8-55C3-B22B-1EC5B0621106}.Debug|Any CPU.Build.0 = Debug|Any CPU + {027F58E2-96C8-55C3-B22B-1EC5B0621106}.Release|Any CPU.ActiveCfg = Release|Any CPU + {027F58E2-96C8-55C3-B22B-1EC5B0621106}.Release|Any CPU.Build.0 = Release|Any CPU + {A973EE14-705D-555F-B115-B97D5ADAEA8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A973EE14-705D-555F-B115-B97D5ADAEA8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A973EE14-705D-555F-B115-B97D5ADAEA8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A973EE14-705D-555F-B115-B97D5ADAEA8D}.Release|Any CPU.Build.0 = Release|Any CPU + {88C1DF3F-74F3-507F-B63C-EA54EA56C95C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88C1DF3F-74F3-507F-B63C-EA54EA56C95C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88C1DF3F-74F3-507F-B63C-EA54EA56C95C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88C1DF3F-74F3-507F-B63C-EA54EA56C95C}.Release|Any CPU.Build.0 = Release|Any CPU + {F931F697-CC40-55BB-999E-BAA4302595E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F931F697-CC40-55BB-999E-BAA4302595E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F931F697-CC40-55BB-999E-BAA4302595E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F931F697-CC40-55BB-999E-BAA4302595E5}.Release|Any CPU.Build.0 = Release|Any CPU + {BD92B2EA-2C70-514D-B74F-76AD834A0AA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD92B2EA-2C70-514D-B74F-76AD834A0AA4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD92B2EA-2C70-514D-B74F-76AD834A0AA4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD92B2EA-2C70-514D-B74F-76AD834A0AA4}.Release|Any CPU.Build.0 = Release|Any CPU + {309B5313-C885-5629-B9A9-674A532CC498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {309B5313-C885-5629-B9A9-674A532CC498}.Debug|Any CPU.Build.0 = Debug|Any CPU + {309B5313-C885-5629-B9A9-674A532CC498}.Release|Any CPU.ActiveCfg = Release|Any CPU + {309B5313-C885-5629-B9A9-674A532CC498}.Release|Any CPU.Build.0 = Release|Any CPU + {AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7}.Release|Any CPU.Build.0 = Release|Any CPU + {C0D986EF-15F8-588D-86C8-574B9978D0D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C0D986EF-15F8-588D-86C8-574B9978D0D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C0D986EF-15F8-588D-86C8-574B9978D0D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C0D986EF-15F8-588D-86C8-574B9978D0D1}.Release|Any CPU.Build.0 = Release|Any CPU + {80686466-E848-57CD-99D9-644EEA055741}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80686466-E848-57CD-99D9-644EEA055741}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80686466-E848-57CD-99D9-644EEA055741}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80686466-E848-57CD-99D9-644EEA055741}.Release|Any CPU.Build.0 = Release|Any CPU + {D906F4BC-54A4-567F-8DD9-4A00C6DC3F75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D906F4BC-54A4-567F-8DD9-4A00C6DC3F75}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D906F4BC-54A4-567F-8DD9-4A00C6DC3F75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D906F4BC-54A4-567F-8DD9-4A00C6DC3F75}.Release|Any CPU.Build.0 = Release|Any CPU + {48EAC4C2-5B05-5350-83C8-5F25DC7632D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48EAC4C2-5B05-5350-83C8-5F25DC7632D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48EAC4C2-5B05-5350-83C8-5F25DC7632D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48EAC4C2-5B05-5350-83C8-5F25DC7632D5}.Release|Any CPU.Build.0 = Release|Any CPU + {41F6B7F1-7767-5A85-B9B5-C70D69F80000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41F6B7F1-7767-5A85-B9B5-C70D69F80000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41F6B7F1-7767-5A85-B9B5-C70D69F80000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41F6B7F1-7767-5A85-B9B5-C70D69F80000}.Release|Any CPU.Build.0 = Release|Any CPU + {BA5C61B1-EFF0-5FD7-A92F-4E464C16056B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA5C61B1-EFF0-5FD7-A92F-4E464C16056B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA5C61B1-EFF0-5FD7-A92F-4E464C16056B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA5C61B1-EFF0-5FD7-A92F-4E464C16056B}.Release|Any CPU.Build.0 = Release|Any CPU + {1CC50534-78D2-5DC6-9DCF-8D64532260F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CC50534-78D2-5DC6-9DCF-8D64532260F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CC50534-78D2-5DC6-9DCF-8D64532260F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CC50534-78D2-5DC6-9DCF-8D64532260F8}.Release|Any CPU.Build.0 = Release|Any CPU + {7DED5634-FD01-5854-96BA-C3F636FB6B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DED5634-FD01-5854-96BA-C3F636FB6B10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DED5634-FD01-5854-96BA-C3F636FB6B10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DED5634-FD01-5854-96BA-C3F636FB6B10}.Release|Any CPU.Build.0 = Release|Any CPU + {3083A5E6-84E0-57FA-8F5F-ECA046992707}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3083A5E6-84E0-57FA-8F5F-ECA046992707}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3083A5E6-84E0-57FA-8F5F-ECA046992707}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3083A5E6-84E0-57FA-8F5F-ECA046992707}.Release|Any CPU.Build.0 = Release|Any CPU + {B70F4C3D-0BF7-59B7-9627-4EF8E7247A17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B70F4C3D-0BF7-59B7-9627-4EF8E7247A17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B70F4C3D-0BF7-59B7-9627-4EF8E7247A17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B70F4C3D-0BF7-59B7-9627-4EF8E7247A17}.Release|Any CPU.Build.0 = Release|Any CPU + {FD121908-49E7-5B7B-B8E6-A4FEB65D59DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD121908-49E7-5B7B-B8E6-A4FEB65D59DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD121908-49E7-5B7B-B8E6-A4FEB65D59DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD121908-49E7-5B7B-B8E6-A4FEB65D59DA}.Release|Any CPU.Build.0 = Release|Any CPU + {8929D374-4010-5CAC-8EC0-693194B7216E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8929D374-4010-5CAC-8EC0-693194B7216E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8929D374-4010-5CAC-8EC0-693194B7216E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8929D374-4010-5CAC-8EC0-693194B7216E}.Release|Any CPU.Build.0 = Release|Any CPU + {21342480-FC88-5789-B7B2-5D9AC7ED18F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21342480-FC88-5789-B7B2-5D9AC7ED18F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21342480-FC88-5789-B7B2-5D9AC7ED18F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21342480-FC88-5789-B7B2-5D9AC7ED18F6}.Release|Any CPU.Build.0 = Release|Any CPU + {34D26AF7-F7C3-5D31-8E45-D545DE7B56A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34D26AF7-F7C3-5D31-8E45-D545DE7B56A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34D26AF7-F7C3-5D31-8E45-D545DE7B56A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34D26AF7-F7C3-5D31-8E45-D545DE7B56A9}.Release|Any CPU.Build.0 = Release|Any CPU + {56414F70-A7F6-55C1-B219-DABC8345E9EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56414F70-A7F6-55C1-B219-DABC8345E9EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56414F70-A7F6-55C1-B219-DABC8345E9EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56414F70-A7F6-55C1-B219-DABC8345E9EE}.Release|Any CPU.Build.0 = Release|Any CPU + {486EA70D-9F0F-5259-B908-580A60863C5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {486EA70D-9F0F-5259-B908-580A60863C5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {486EA70D-9F0F-5259-B908-580A60863C5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {486EA70D-9F0F-5259-B908-580A60863C5A}.Release|Any CPU.Build.0 = Release|Any CPU + {21950636-1E41-520C-978D-6C52417F49CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21950636-1E41-520C-978D-6C52417F49CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21950636-1E41-520C-978D-6C52417F49CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21950636-1E41-520C-978D-6C52417F49CB}.Release|Any CPU.Build.0 = Release|Any CPU + {A3045438-648F-5E60-974C-8A6593165CD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3045438-648F-5E60-974C-8A6593165CD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3045438-648F-5E60-974C-8A6593165CD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3045438-648F-5E60-974C-8A6593165CD7}.Release|Any CPU.Build.0 = Release|Any CPU + {393B31FC-1469-5DB5-8B89-C6E9AC69A058}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {393B31FC-1469-5DB5-8B89-C6E9AC69A058}.Debug|Any CPU.Build.0 = Debug|Any CPU + {393B31FC-1469-5DB5-8B89-C6E9AC69A058}.Release|Any CPU.ActiveCfg = Release|Any CPU + {393B31FC-1469-5DB5-8B89-C6E9AC69A058}.Release|Any CPU.Build.0 = Release|Any CPU + {3E4B26B0-B184-5184-B086-618F362D3EA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E4B26B0-B184-5184-B086-618F362D3EA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E4B26B0-B184-5184-B086-618F362D3EA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E4B26B0-B184-5184-B086-618F362D3EA8}.Release|Any CPU.Build.0 = Release|Any CPU + {74961AF8-0434-5863-B516-179CBD4DD354}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74961AF8-0434-5863-B516-179CBD4DD354}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74961AF8-0434-5863-B516-179CBD4DD354}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74961AF8-0434-5863-B516-179CBD4DD354}.Release|Any CPU.Build.0 = Release|Any CPU + {D2C87350-D8EE-5774-9D07-5DB161C1CAFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2C87350-D8EE-5774-9D07-5DB161C1CAFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2C87350-D8EE-5774-9D07-5DB161C1CAFA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2C87350-D8EE-5774-9D07-5DB161C1CAFA}.Release|Any CPU.Build.0 = Release|Any CPU + {46F08BCB-C218-5A58-8949-E7CD119BCAB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46F08BCB-C218-5A58-8949-E7CD119BCAB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46F08BCB-C218-5A58-8949-E7CD119BCAB6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46F08BCB-C218-5A58-8949-E7CD119BCAB6}.Release|Any CPU.Build.0 = Release|Any CPU + {9654C643-AD78-586B-819D-8C081576D60C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9654C643-AD78-586B-819D-8C081576D60C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9654C643-AD78-586B-819D-8C081576D60C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9654C643-AD78-586B-819D-8C081576D60C}.Release|Any CPU.Build.0 = Release|Any CPU + {ADF02308-4349-5280-9E05-75A6C619E0EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADF02308-4349-5280-9E05-75A6C619E0EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADF02308-4349-5280-9E05-75A6C619E0EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADF02308-4349-5280-9E05-75A6C619E0EC}.Release|Any CPU.Build.0 = Release|Any CPU + {3B4D6BEF-0934-5981-B776-AA13BE7FD25E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B4D6BEF-0934-5981-B776-AA13BE7FD25E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B4D6BEF-0934-5981-B776-AA13BE7FD25E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B4D6BEF-0934-5981-B776-AA13BE7FD25E}.Release|Any CPU.Build.0 = Release|Any CPU + {B335DFD5-EAF4-5083-9B37-0435F93396B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B335DFD5-EAF4-5083-9B37-0435F93396B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B335DFD5-EAF4-5083-9B37-0435F93396B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B335DFD5-EAF4-5083-9B37-0435F93396B3}.Release|Any CPU.Build.0 = Release|Any CPU + {986F3041-3E8A-52E0-A965-92243093D1C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {986F3041-3E8A-52E0-A965-92243093D1C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {986F3041-3E8A-52E0-A965-92243093D1C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {986F3041-3E8A-52E0-A965-92243093D1C6}.Release|Any CPU.Build.0 = Release|Any CPU + {8BD98D23-C7B0-566E-8843-17BE8E005B6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BD98D23-C7B0-566E-8843-17BE8E005B6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BD98D23-C7B0-566E-8843-17BE8E005B6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BD98D23-C7B0-566E-8843-17BE8E005B6F}.Release|Any CPU.Build.0 = Release|Any CPU + {89B612AB-821C-5707-831E-CF01A24E0FBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {89B612AB-821C-5707-831E-CF01A24E0FBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89B612AB-821C-5707-831E-CF01A24E0FBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {89B612AB-821C-5707-831E-CF01A24E0FBA}.Release|Any CPU.Build.0 = Release|Any CPU + {D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223}.Release|Any CPU.Build.0 = Release|Any CPU + {B79F5D06-CC07-50E0-9916-CD91E53BCE4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B79F5D06-CC07-50E0-9916-CD91E53BCE4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B79F5D06-CC07-50E0-9916-CD91E53BCE4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B79F5D06-CC07-50E0-9916-CD91E53BCE4F}.Release|Any CPU.Build.0 = Release|Any CPU + {D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E}.Release|Any CPU.Build.0 = Release|Any CPU + {8CE426C9-853D-5FE0-A939-954D7787890A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8CE426C9-853D-5FE0-A939-954D7787890A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CE426C9-853D-5FE0-A939-954D7787890A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8CE426C9-853D-5FE0-A939-954D7787890A}.Release|Any CPU.Build.0 = Release|Any CPU + {DF324128-78D3-54C8-AAE0-852EA18A4175}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF324128-78D3-54C8-AAE0-852EA18A4175}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF324128-78D3-54C8-AAE0-852EA18A4175}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF324128-78D3-54C8-AAE0-852EA18A4175}.Release|Any CPU.Build.0 = Release|Any CPU + {3B0B6785-6E80-5615-9076-F10DD4ED79FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B0B6785-6E80-5615-9076-F10DD4ED79FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B0B6785-6E80-5615-9076-F10DD4ED79FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B0B6785-6E80-5615-9076-F10DD4ED79FC}.Release|Any CPU.Build.0 = Release|Any CPU + {9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4}.Release|Any CPU.Build.0 = Release|Any CPU + {F11FF9FF-2A02-5470-93B8-75A8AB307992}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F11FF9FF-2A02-5470-93B8-75A8AB307992}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F11FF9FF-2A02-5470-93B8-75A8AB307992}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F11FF9FF-2A02-5470-93B8-75A8AB307992}.Release|Any CPU.Build.0 = Release|Any CPU + {14E66575-1C2C-5223-9286-BE65FD8FCD6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14E66575-1C2C-5223-9286-BE65FD8FCD6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14E66575-1C2C-5223-9286-BE65FD8FCD6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14E66575-1C2C-5223-9286-BE65FD8FCD6E}.Release|Any CPU.Build.0 = Release|Any CPU + {17161A8D-0F28-5998-9C38-A09E8A0DFECD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {17161A8D-0F28-5998-9C38-A09E8A0DFECD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17161A8D-0F28-5998-9C38-A09E8A0DFECD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {17161A8D-0F28-5998-9C38-A09E8A0DFECD}.Release|Any CPU.Build.0 = Release|Any CPU + {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136}.Release|Any CPU.Build.0 = Release|Any CPU + {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85B39AEB-D264-59E3-AE46-C6E09D60816F}.Release|Any CPU.Build.0 = Release|Any CPU + {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B22104F2-C574-5E22-ACE9-5E218FCF4ED6}.Release|Any CPU.Build.0 = Release|Any CPU + {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD}.Release|Any CPU.Build.0 = Release|Any CPU + {E04423CA-6046-55AF-92F1-C8492E44A1F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E04423CA-6046-55AF-92F1-C8492E44A1F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E04423CA-6046-55AF-92F1-C8492E44A1F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E04423CA-6046-55AF-92F1-C8492E44A1F4}.Release|Any CPU.Build.0 = Release|Any CPU + {500252B3-468C-5303-B06E-C961A475C519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {500252B3-468C-5303-B06E-C961A475C519}.Debug|Any CPU.Build.0 = Debug|Any CPU + {500252B3-468C-5303-B06E-C961A475C519}.Release|Any CPU.ActiveCfg = Release|Any CPU + {500252B3-468C-5303-B06E-C961A475C519}.Release|Any CPU.Build.0 = Release|Any CPU + {2004E176-092C-5C14-A7F0-11CC8E383B5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2004E176-092C-5C14-A7F0-11CC8E383B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2004E176-092C-5C14-A7F0-11CC8E383B5C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2004E176-092C-5C14-A7F0-11CC8E383B5C}.Release|Any CPU.Build.0 = Release|Any CPU + {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F064B0DB-FE3A-58F4-8E8C-904C04749A55}.Release|Any CPU.Build.0 = Release|Any CPU + {5618B67A-A525-5958-8001-9AB7A7EB6412}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5618B67A-A525-5958-8001-9AB7A7EB6412}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5618B67A-A525-5958-8001-9AB7A7EB6412}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5618B67A-A525-5958-8001-9AB7A7EB6412}.Release|Any CPU.Build.0 = Release|Any CPU + {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D382EF88-1144-5CF4-B768-5A124EB8CF0A}.Release|Any CPU.Build.0 = Release|Any CPU + {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7}.Release|Any CPU.Build.0 = Release|Any CPU + {DA8F7D8C-2022-51C1-9235-1B3613EB703D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA8F7D8C-2022-51C1-9235-1B3613EB703D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA8F7D8C-2022-51C1-9235-1B3613EB703D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA8F7D8C-2022-51C1-9235-1B3613EB703D}.Release|Any CPU.Build.0 = Release|Any CPU + {D2B3DDE0-F44F-5B57-9D3E-679E18FC1032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2B3DDE0-F44F-5B57-9D3E-679E18FC1032}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2B3DDE0-F44F-5B57-9D3E-679E18FC1032}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2B3DDE0-F44F-5B57-9D3E-679E18FC1032}.Release|Any CPU.Build.0 = Release|Any CPU + {600F0F8D-D86F-5CA6-B4E6-7DFB6860981E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {600F0F8D-D86F-5CA6-B4E6-7DFB6860981E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {600F0F8D-D86F-5CA6-B4E6-7DFB6860981E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {600F0F8D-D86F-5CA6-B4E6-7DFB6860981E}.Release|Any CPU.Build.0 = Release|Any CPU + {9A62D7DD-B9F1-5CDD-96D3-07573296F939}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A62D7DD-B9F1-5CDD-96D3-07573296F939}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A62D7DD-B9F1-5CDD-96D3-07573296F939}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A62D7DD-B9F1-5CDD-96D3-07573296F939}.Release|Any CPU.Build.0 = Release|Any CPU + {B9B66624-23D7-53C7-B1F5-B1476F5435F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9B66624-23D7-53C7-B1F5-B1476F5435F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9B66624-23D7-53C7-B1F5-B1476F5435F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9B66624-23D7-53C7-B1F5-B1476F5435F2}.Release|Any CPU.Build.0 = Release|Any CPU + {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25}.Release|Any CPU.Build.0 = Release|Any CPU + {087B1096-EE56-5337-81C4-3655FEC38AAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {087B1096-EE56-5337-81C4-3655FEC38AAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {087B1096-EE56-5337-81C4-3655FEC38AAB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {087B1096-EE56-5337-81C4-3655FEC38AAB}.Release|Any CPU.Build.0 = Release|Any CPU + {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7}.Release|Any CPU.Build.0 = Release|Any CPU + {394D1A61-BA24-529C-B049-B377DAB866CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {394D1A61-BA24-529C-B049-B377DAB866CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {394D1A61-BA24-529C-B049-B377DAB866CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {394D1A61-BA24-529C-B049-B377DAB866CF}.Release|Any CPU.Build.0 = Release|Any CPU + {5B598FA9-5AE8-566D-B6D8-C87792622114}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B598FA9-5AE8-566D-B6D8-C87792622114}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B598FA9-5AE8-566D-B6D8-C87792622114}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B598FA9-5AE8-566D-B6D8-C87792622114}.Release|Any CPU.Build.0 = Release|Any CPU + {5C964413-BA49-5580-A781-A020335C9301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5C964413-BA49-5580-A781-A020335C9301}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C964413-BA49-5580-A781-A020335C9301}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C964413-BA49-5580-A781-A020335C9301}.Release|Any CPU.Build.0 = Release|Any CPU + {FF74E087-9D87-5321-B99B-70FE364B9422}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF74E087-9D87-5321-B99B-70FE364B9422}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF74E087-9D87-5321-B99B-70FE364B9422}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF74E087-9D87-5321-B99B-70FE364B9422}.Release|Any CPU.Build.0 = Release|Any CPU + {8CC218FA-816B-5D5F-9BDD-19F88444B22B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8CC218FA-816B-5D5F-9BDD-19F88444B22B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CC218FA-816B-5D5F-9BDD-19F88444B22B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8CC218FA-816B-5D5F-9BDD-19F88444B22B}.Release|Any CPU.Build.0 = Release|Any CPU + {6B99DEB6-D5DF-5BF1-A9A4-228A757D4836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B99DEB6-D5DF-5BF1-A9A4-228A757D4836}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B99DEB6-D5DF-5BF1-A9A4-228A757D4836}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B99DEB6-D5DF-5BF1-A9A4-228A757D4836}.Release|Any CPU.Build.0 = Release|Any CPU + {CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F}.Release|Any CPU.Build.0 = Release|Any CPU + {3E780079-10D2-5AD2-95FC-98E46718B231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E780079-10D2-5AD2-95FC-98E46718B231}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E780079-10D2-5AD2-95FC-98E46718B231}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E780079-10D2-5AD2-95FC-98E46718B231}.Release|Any CPU.Build.0 = Release|Any CPU + {C3B48707-75F7-56DD-9FBD-65DE8D53353B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3B48707-75F7-56DD-9FBD-65DE8D53353B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3B48707-75F7-56DD-9FBD-65DE8D53353B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3B48707-75F7-56DD-9FBD-65DE8D53353B}.Release|Any CPU.Build.0 = Release|Any CPU + {A2A04CF8-28FC-51DB-8BC4-00440822348F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2A04CF8-28FC-51DB-8BC4-00440822348F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2A04CF8-28FC-51DB-8BC4-00440822348F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2A04CF8-28FC-51DB-8BC4-00440822348F}.Release|Any CPU.Build.0 = Release|Any CPU + {3F03AECF-1508-5F69-97C3-C2DF3A01B7E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F03AECF-1508-5F69-97C3-C2DF3A01B7E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F03AECF-1508-5F69-97C3-C2DF3A01B7E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F03AECF-1508-5F69-97C3-C2DF3A01B7E1}.Release|Any CPU.Build.0 = Release|Any CPU + {68D37855-2734-5614-AFF7-39D2FAD17795}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68D37855-2734-5614-AFF7-39D2FAD17795}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68D37855-2734-5614-AFF7-39D2FAD17795}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68D37855-2734-5614-AFF7-39D2FAD17795}.Release|Any CPU.Build.0 = Release|Any CPU + {772A91FD-98F3-5EA2-9CB4-E3088C839D32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {772A91FD-98F3-5EA2-9CB4-E3088C839D32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {772A91FD-98F3-5EA2-9CB4-E3088C839D32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {772A91FD-98F3-5EA2-9CB4-E3088C839D32}.Release|Any CPU.Build.0 = Release|Any CPU + {B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF}.Release|Any CPU.Build.0 = Release|Any CPU + {1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2}.Release|Any CPU.Build.0 = Release|Any CPU + {9B85AD15-32BB-5A24-8243-52FD11033E1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B85AD15-32BB-5A24-8243-52FD11033E1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B85AD15-32BB-5A24-8243-52FD11033E1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B85AD15-32BB-5A24-8243-52FD11033E1B}.Release|Any CPU.Build.0 = Release|Any CPU + {1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9}.Release|Any CPU.Build.0 = Release|Any CPU + {222C4ED7-2DD8-5F51-A249-323B1F414AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {222C4ED7-2DD8-5F51-A249-323B1F414AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {222C4ED7-2DD8-5F51-A249-323B1F414AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {222C4ED7-2DD8-5F51-A249-323B1F414AE6}.Release|Any CPU.Build.0 = Release|Any CPU + {A3D24CDD-0855-5F57-989B-5D8C6CF3570D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3D24CDD-0855-5F57-989B-5D8C6CF3570D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3D24CDD-0855-5F57-989B-5D8C6CF3570D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3D24CDD-0855-5F57-989B-5D8C6CF3570D}.Release|Any CPU.Build.0 = Release|Any CPU + {4A1395E2-E03E-542C-B190-BDAA205A0E1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A1395E2-E03E-542C-B190-BDAA205A0E1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A1395E2-E03E-542C-B190-BDAA205A0E1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A1395E2-E03E-542C-B190-BDAA205A0E1F}.Release|Any CPU.Build.0 = Release|Any CPU + {3C4B8D17-0B69-571F-9B6C-6E945937A3B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C4B8D17-0B69-571F-9B6C-6E945937A3B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C4B8D17-0B69-571F-9B6C-6E945937A3B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C4B8D17-0B69-571F-9B6C-6E945937A3B3}.Release|Any CPU.Build.0 = Release|Any CPU + {E648086E-E39B-5B18-BFDA-E597D04C536A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E648086E-E39B-5B18-BFDA-E597D04C536A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E648086E-E39B-5B18-BFDA-E597D04C536A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E648086E-E39B-5B18-BFDA-E597D04C536A}.Release|Any CPU.Build.0 = Release|Any CPU + {1D75EF57-0B94-54F5-9FCB-16A888141420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D75EF57-0B94-54F5-9FCB-16A888141420}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D75EF57-0B94-54F5-9FCB-16A888141420}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D75EF57-0B94-54F5-9FCB-16A888141420}.Release|Any CPU.Build.0 = Release|Any CPU + {8A42C228-E80F-5DA1-A752-29F9C7D7FDDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A42C228-E80F-5DA1-A752-29F9C7D7FDDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A42C228-E80F-5DA1-A752-29F9C7D7FDDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A42C228-E80F-5DA1-A752-29F9C7D7FDDC}.Release|Any CPU.Build.0 = Release|Any CPU + {683D176E-ECB8-5F5D-AC6E-E2E3E33526DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {683D176E-ECB8-5F5D-AC6E-E2E3E33526DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {683D176E-ECB8-5F5D-AC6E-E2E3E33526DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {683D176E-ECB8-5F5D-AC6E-E2E3E33526DB}.Release|Any CPU.Build.0 = Release|Any CPU + {5C0BB750-025E-5E1D-B717-B871883AAFDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5C0BB750-025E-5E1D-B717-B871883AAFDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C0BB750-025E-5E1D-B717-B871883AAFDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C0BB750-025E-5E1D-B717-B871883AAFDE}.Release|Any CPU.Build.0 = Release|Any CPU + {F03873D8-5506-5461-AF91-247DEF04D700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F03873D8-5506-5461-AF91-247DEF04D700}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F03873D8-5506-5461-AF91-247DEF04D700}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F03873D8-5506-5461-AF91-247DEF04D700}.Release|Any CPU.Build.0 = Release|Any CPU + {76D66413-B838-5648-BF18-B87DD5084BFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76D66413-B838-5648-BF18-B87DD5084BFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76D66413-B838-5648-BF18-B87DD5084BFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76D66413-B838-5648-BF18-B87DD5084BFC}.Release|Any CPU.Build.0 = Release|Any CPU + {02D3276B-BB16-536D-BF6C-CD9067EE2F27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02D3276B-BB16-536D-BF6C-CD9067EE2F27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02D3276B-BB16-536D-BF6C-CD9067EE2F27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02D3276B-BB16-536D-BF6C-CD9067EE2F27}.Release|Any CPU.Build.0 = Release|Any CPU + {A8F451BE-6076-5D9D-BDF9-FF270ED0391B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8F451BE-6076-5D9D-BDF9-FF270ED0391B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8F451BE-6076-5D9D-BDF9-FF270ED0391B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8F451BE-6076-5D9D-BDF9-FF270ED0391B}.Release|Any CPU.Build.0 = Release|Any CPU + {65906110-4508-5D7A-A870-2225135CA2AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65906110-4508-5D7A-A870-2225135CA2AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65906110-4508-5D7A-A870-2225135CA2AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65906110-4508-5D7A-A870-2225135CA2AB}.Release|Any CPU.Build.0 = Release|Any CPU + {836920D9-3DC3-5926-8ACF-CF41CD59EDB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {836920D9-3DC3-5926-8ACF-CF41CD59EDB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {836920D9-3DC3-5926-8ACF-CF41CD59EDB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {836920D9-3DC3-5926-8ACF-CF41CD59EDB1}.Release|Any CPU.Build.0 = Release|Any CPU + {48BCAF76-EDC4-570D-98C2-032DB39D8662}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48BCAF76-EDC4-570D-98C2-032DB39D8662}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48BCAF76-EDC4-570D-98C2-032DB39D8662}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48BCAF76-EDC4-570D-98C2-032DB39D8662}.Release|Any CPU.Build.0 = Release|Any CPU + {02568C86-83B4-588D-9EA2-58ABAD29DE27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02568C86-83B4-588D-9EA2-58ABAD29DE27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02568C86-83B4-588D-9EA2-58ABAD29DE27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02568C86-83B4-588D-9EA2-58ABAD29DE27}.Release|Any CPU.Build.0 = Release|Any CPU + {034AD4BC-E7E5-5F87-8A30-12D71BFF63E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {034AD4BC-E7E5-5F87-8A30-12D71BFF63E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {034AD4BC-E7E5-5F87-8A30-12D71BFF63E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {034AD4BC-E7E5-5F87-8A30-12D71BFF63E8}.Release|Any CPU.Build.0 = Release|Any CPU + {32CD344F-484F-59C3-AC24-3FD9806DD3D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32CD344F-484F-59C3-AC24-3FD9806DD3D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32CD344F-484F-59C3-AC24-3FD9806DD3D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32CD344F-484F-59C3-AC24-3FD9806DD3D6}.Release|Any CPU.Build.0 = Release|Any CPU + {E8B300BA-17CC-5884-97DB-C53176BD92FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8B300BA-17CC-5884-97DB-C53176BD92FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8B300BA-17CC-5884-97DB-C53176BD92FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8B300BA-17CC-5884-97DB-C53176BD92FA}.Release|Any CPU.Build.0 = Release|Any CPU + {B53D2725-B209-56C2-854A-733AA23791BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B53D2725-B209-56C2-854A-733AA23791BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B53D2725-B209-56C2-854A-733AA23791BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B53D2725-B209-56C2-854A-733AA23791BA}.Release|Any CPU.Build.0 = Release|Any CPU + {2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE}.Release|Any CPU.Build.0 = Release|Any CPU + {303C5589-5F40-5AB6-AC14-B74330F4ABCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {303C5589-5F40-5AB6-AC14-B74330F4ABCD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {303C5589-5F40-5AB6-AC14-B74330F4ABCD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {303C5589-5F40-5AB6-AC14-B74330F4ABCD}.Release|Any CPU.Build.0 = Release|Any CPU + {ACC984E9-DD35-50E3-9DEE-4D31E3905798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACC984E9-DD35-50E3-9DEE-4D31E3905798}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACC984E9-DD35-50E3-9DEE-4D31E3905798}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACC984E9-DD35-50E3-9DEE-4D31E3905798}.Release|Any CPU.Build.0 = Release|Any CPU + {B0455206-6836-5CCC-981F-DE01652F719E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0455206-6836-5CCC-981F-DE01652F719E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0455206-6836-5CCC-981F-DE01652F719E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0455206-6836-5CCC-981F-DE01652F719E}.Release|Any CPU.Build.0 = Release|Any CPU + {378D4FEB-0052-5910-A0C6-F23FFAFF9622}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {378D4FEB-0052-5910-A0C6-F23FFAFF9622}.Debug|Any CPU.Build.0 = Debug|Any CPU + {378D4FEB-0052-5910-A0C6-F23FFAFF9622}.Release|Any CPU.ActiveCfg = Release|Any CPU + {378D4FEB-0052-5910-A0C6-F23FFAFF9622}.Release|Any CPU.Build.0 = Release|Any CPU + {D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7}.Release|Any CPU.Build.0 = Release|Any CPU + {1772BDC5-1285-5297-A93D-F57692363BB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1772BDC5-1285-5297-A93D-F57692363BB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1772BDC5-1285-5297-A93D-F57692363BB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1772BDC5-1285-5297-A93D-F57692363BB2}.Release|Any CPU.Build.0 = Release|Any CPU + {20030AD8-C9FC-5CDA-BA0E-DE13E792A314}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20030AD8-C9FC-5CDA-BA0E-DE13E792A314}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20030AD8-C9FC-5CDA-BA0E-DE13E792A314}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20030AD8-C9FC-5CDA-BA0E-DE13E792A314}.Release|Any CPU.Build.0 = Release|Any CPU + {1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C}.Release|Any CPU.Build.0 = Release|Any CPU + {787405E2-7F5B-5CC2-821E-A54AF8CE3843}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {787405E2-7F5B-5CC2-821E-A54AF8CE3843}.Debug|Any CPU.Build.0 = Debug|Any CPU + {787405E2-7F5B-5CC2-821E-A54AF8CE3843}.Release|Any CPU.ActiveCfg = Release|Any CPU + {787405E2-7F5B-5CC2-821E-A54AF8CE3843}.Release|Any CPU.Build.0 = Release|Any CPU + {468F9192-74B5-5791-807B-A0507E99AE1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {468F9192-74B5-5791-807B-A0507E99AE1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {468F9192-74B5-5791-807B-A0507E99AE1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {468F9192-74B5-5791-807B-A0507E99AE1F}.Release|Any CPU.Build.0 = Release|Any CPU + {AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49}.Release|Any CPU.Build.0 = Release|Any CPU + {02A180E2-6690-5EA6-9AD4-4A9616DC1489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02A180E2-6690-5EA6-9AD4-4A9616DC1489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02A180E2-6690-5EA6-9AD4-4A9616DC1489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02A180E2-6690-5EA6-9AD4-4A9616DC1489}.Release|Any CPU.Build.0 = Release|Any CPU + {98DBA04A-9F13-5740-8713-48A21F41D158}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98DBA04A-9F13-5740-8713-48A21F41D158}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98DBA04A-9F13-5740-8713-48A21F41D158}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98DBA04A-9F13-5740-8713-48A21F41D158}.Release|Any CPU.Build.0 = Release|Any CPU + {059A8E08-8A8E-5766-9556-C3E18707A316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {059A8E08-8A8E-5766-9556-C3E18707A316}.Debug|Any CPU.Build.0 = Debug|Any CPU + {059A8E08-8A8E-5766-9556-C3E18707A316}.Release|Any CPU.ActiveCfg = Release|Any CPU + {059A8E08-8A8E-5766-9556-C3E18707A316}.Release|Any CPU.Build.0 = Release|Any CPU + {A0EF31BA-A294-5B97-BAAA-84737FFB0441}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0EF31BA-A294-5B97-BAAA-84737FFB0441}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0EF31BA-A294-5B97-BAAA-84737FFB0441}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0EF31BA-A294-5B97-BAAA-84737FFB0441}.Release|Any CPU.Build.0 = Release|Any CPU + {49F92D69-4B38-5502-8856-FFD90DEB4ED9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49F92D69-4B38-5502-8856-FFD90DEB4ED9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49F92D69-4B38-5502-8856-FFD90DEB4ED9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49F92D69-4B38-5502-8856-FFD90DEB4ED9}.Release|Any CPU.Build.0 = Release|Any CPU + {BA04E8CF-051D-5A9C-B866-AB9470319426}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA04E8CF-051D-5A9C-B866-AB9470319426}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA04E8CF-051D-5A9C-B866-AB9470319426}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA04E8CF-051D-5A9C-B866-AB9470319426}.Release|Any CPU.Build.0 = Release|Any CPU + {3FBC55A5-8773-5BDC-BF58-45FAC2950D89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3FBC55A5-8773-5BDC-BF58-45FAC2950D89}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FBC55A5-8773-5BDC-BF58-45FAC2950D89}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3FBC55A5-8773-5BDC-BF58-45FAC2950D89}.Release|Any CPU.Build.0 = Release|Any CPU + {33BBE42C-6D04-56C2-8A5D-736F670198CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33BBE42C-6D04-56C2-8A5D-736F670198CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33BBE42C-6D04-56C2-8A5D-736F670198CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33BBE42C-6D04-56C2-8A5D-736F670198CE}.Release|Any CPU.Build.0 = Release|Any CPU + {ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179}.Release|Any CPU.Build.0 = Release|Any CPU + {B3A40257-0096-553A-BDDB-ECD222F47D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3A40257-0096-553A-BDDB-ECD222F47D98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3A40257-0096-553A-BDDB-ECD222F47D98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3A40257-0096-553A-BDDB-ECD222F47D98}.Release|Any CPU.Build.0 = Release|Any CPU + {6CEE9751-CA80-5B25-B7D3-DCB24085450D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CEE9751-CA80-5B25-B7D3-DCB24085450D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CEE9751-CA80-5B25-B7D3-DCB24085450D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6CEE9751-CA80-5B25-B7D3-DCB24085450D}.Release|Any CPU.Build.0 = Release|Any CPU + {19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D}.Release|Any CPU.Build.0 = Release|Any CPU + {D1504F57-82C2-5BE5-9524-B3371BC26F82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1504F57-82C2-5BE5-9524-B3371BC26F82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1504F57-82C2-5BE5-9524-B3371BC26F82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1504F57-82C2-5BE5-9524-B3371BC26F82}.Release|Any CPU.Build.0 = Release|Any CPU + {9B29BB87-FEF3-5EF9-8D64-D005408705EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B29BB87-FEF3-5EF9-8D64-D005408705EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B29BB87-FEF3-5EF9-8D64-D005408705EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B29BB87-FEF3-5EF9-8D64-D005408705EC}.Release|Any CPU.Build.0 = Release|Any CPU + {D67441E5-0211-563B-A29E-7C1A0C815A7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D67441E5-0211-563B-A29E-7C1A0C815A7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D67441E5-0211-563B-A29E-7C1A0C815A7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D67441E5-0211-563B-A29E-7C1A0C815A7C}.Release|Any CPU.Build.0 = Release|Any CPU + {A5516E04-C25E-574B-BDA9-25F17B89EA72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5516E04-C25E-574B-BDA9-25F17B89EA72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5516E04-C25E-574B-BDA9-25F17B89EA72}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5516E04-C25E-574B-BDA9-25F17B89EA72}.Release|Any CPU.Build.0 = Release|Any CPU + {85D772C5-941E-54D2-A07F-CCD85DE0F37F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85D772C5-941E-54D2-A07F-CCD85DE0F37F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85D772C5-941E-54D2-A07F-CCD85DE0F37F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85D772C5-941E-54D2-A07F-CCD85DE0F37F}.Release|Any CPU.Build.0 = Release|Any CPU + {046A3473-60D2-5BD4-ACFC-5051CAC08296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {046A3473-60D2-5BD4-ACFC-5051CAC08296}.Debug|Any CPU.Build.0 = Debug|Any CPU + {046A3473-60D2-5BD4-ACFC-5051CAC08296}.Release|Any CPU.ActiveCfg = Release|Any CPU + {046A3473-60D2-5BD4-ACFC-5051CAC08296}.Release|Any CPU.Build.0 = Release|Any CPU + {690D6500-40C1-57CF-80DF-BCC788C0F09D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {690D6500-40C1-57CF-80DF-BCC788C0F09D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {690D6500-40C1-57CF-80DF-BCC788C0F09D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {690D6500-40C1-57CF-80DF-BCC788C0F09D}.Release|Any CPU.Build.0 = Release|Any CPU + {B631B34A-610F-5F25-A68B-8E2EB93D813F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B631B34A-610F-5F25-A68B-8E2EB93D813F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B631B34A-610F-5F25-A68B-8E2EB93D813F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B631B34A-610F-5F25-A68B-8E2EB93D813F}.Release|Any CPU.Build.0 = Release|Any CPU + {A89D579D-119A-512E-ACEB-00C66A99E871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A89D579D-119A-512E-ACEB-00C66A99E871}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A89D579D-119A-512E-ACEB-00C66A99E871}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A89D579D-119A-512E-ACEB-00C66A99E871}.Release|Any CPU.Build.0 = Release|Any CPU + {C0D1E717-51E3-578B-BEDB-F9A02F54042C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C0D1E717-51E3-578B-BEDB-F9A02F54042C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C0D1E717-51E3-578B-BEDB-F9A02F54042C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C0D1E717-51E3-578B-BEDB-F9A02F54042C}.Release|Any CPU.Build.0 = Release|Any CPU + {04CEAD38-EF61-56A0-A507-72B12606767F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04CEAD38-EF61-56A0-A507-72B12606767F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04CEAD38-EF61-56A0-A507-72B12606767F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04CEAD38-EF61-56A0-A507-72B12606767F}.Release|Any CPU.Build.0 = Release|Any CPU + {CC86C30A-0EEB-594F-9680-DB32F10ED128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC86C30A-0EEB-594F-9680-DB32F10ED128}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC86C30A-0EEB-594F-9680-DB32F10ED128}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC86C30A-0EEB-594F-9680-DB32F10ED128}.Release|Any CPU.Build.0 = Release|Any CPU + {931FAFFC-095E-59B7-9E93-EFAA06CD10EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {931FAFFC-095E-59B7-9E93-EFAA06CD10EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {931FAFFC-095E-59B7-9E93-EFAA06CD10EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {931FAFFC-095E-59B7-9E93-EFAA06CD10EB}.Release|Any CPU.Build.0 = Release|Any CPU + {55593DA0-334B-58C8-BD12-32BD2362A384}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55593DA0-334B-58C8-BD12-32BD2362A384}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55593DA0-334B-58C8-BD12-32BD2362A384}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55593DA0-334B-58C8-BD12-32BD2362A384}.Release|Any CPU.Build.0 = Release|Any CPU + {34A4AD39-111F-5D02-83ED-6FB0B71B3539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34A4AD39-111F-5D02-83ED-6FB0B71B3539}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34A4AD39-111F-5D02-83ED-6FB0B71B3539}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34A4AD39-111F-5D02-83ED-6FB0B71B3539}.Release|Any CPU.Build.0 = Release|Any CPU + {3A446391-6537-5C7E-885D-A60B8C6402AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A446391-6537-5C7E-885D-A60B8C6402AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A446391-6537-5C7E-885D-A60B8C6402AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A446391-6537-5C7E-885D-A60B8C6402AD}.Release|Any CPU.Build.0 = Release|Any CPU + {0A18583B-3913-5C71-900C-8BDB320D6461}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A18583B-3913-5C71-900C-8BDB320D6461}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A18583B-3913-5C71-900C-8BDB320D6461}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A18583B-3913-5C71-900C-8BDB320D6461}.Release|Any CPU.Build.0 = Release|Any CPU + {6064B3DA-2322-5B7E-B27D-4D0E976114A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6064B3DA-2322-5B7E-B27D-4D0E976114A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6064B3DA-2322-5B7E-B27D-4D0E976114A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6064B3DA-2322-5B7E-B27D-4D0E976114A7}.Release|Any CPU.Build.0 = Release|Any CPU + {254361C7-78CF-5510-8D5B-DC1AD1370726}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {254361C7-78CF-5510-8D5B-DC1AD1370726}.Debug|Any CPU.Build.0 = Debug|Any CPU + {254361C7-78CF-5510-8D5B-DC1AD1370726}.Release|Any CPU.ActiveCfg = Release|Any CPU + {254361C7-78CF-5510-8D5B-DC1AD1370726}.Release|Any CPU.Build.0 = Release|Any CPU + {4990948A-CB1D-54FE-8C2E-AA1D0D275B22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4990948A-CB1D-54FE-8C2E-AA1D0D275B22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4990948A-CB1D-54FE-8C2E-AA1D0D275B22}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4990948A-CB1D-54FE-8C2E-AA1D0D275B22}.Release|Any CPU.Build.0 = Release|Any CPU + {9D1A020C-0800-5A7C-85DF-4C04A922894B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D1A020C-0800-5A7C-85DF-4C04A922894B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D1A020C-0800-5A7C-85DF-4C04A922894B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D1A020C-0800-5A7C-85DF-4C04A922894B}.Release|Any CPU.Build.0 = Release|Any CPU + {8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D}.Release|Any CPU.Build.0 = Release|Any CPU + {E0341225-8AC0-5A3D-90FA-253A39188C59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0341225-8AC0-5A3D-90FA-253A39188C59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0341225-8AC0-5A3D-90FA-253A39188C59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0341225-8AC0-5A3D-90FA-253A39188C59}.Release|Any CPU.Build.0 = Release|Any CPU + {63AA5DD3-66EC-5770-A2AF-73214634BE74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63AA5DD3-66EC-5770-A2AF-73214634BE74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63AA5DD3-66EC-5770-A2AF-73214634BE74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63AA5DD3-66EC-5770-A2AF-73214634BE74}.Release|Any CPU.Build.0 = Release|Any CPU + {5422FC92-32F8-5B7C-8808-F9F3B01096BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5422FC92-32F8-5B7C-8808-F9F3B01096BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5422FC92-32F8-5B7C-8808-F9F3B01096BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5422FC92-32F8-5B7C-8808-F9F3B01096BA}.Release|Any CPU.Build.0 = Release|Any CPU + {239AEE8E-4762-5DC0-AE89-99C559DC3C0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {239AEE8E-4762-5DC0-AE89-99C559DC3C0C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {239AEE8E-4762-5DC0-AE89-99C559DC3C0C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {239AEE8E-4762-5DC0-AE89-99C559DC3C0C}.Release|Any CPU.Build.0 = Release|Any CPU + {940ADFE2-7115-5A6B-8083-E6E9959C5126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {940ADFE2-7115-5A6B-8083-E6E9959C5126}.Debug|Any CPU.Build.0 = Debug|Any CPU + {940ADFE2-7115-5A6B-8083-E6E9959C5126}.Release|Any CPU.ActiveCfg = Release|Any CPU + {940ADFE2-7115-5A6B-8083-E6E9959C5126}.Release|Any CPU.Build.0 = Release|Any CPU + {C2F4CEBC-0FD0-5711-977B-D15B63B6283F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2F4CEBC-0FD0-5711-977B-D15B63B6283F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2F4CEBC-0FD0-5711-977B-D15B63B6283F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2F4CEBC-0FD0-5711-977B-D15B63B6283F}.Release|Any CPU.Build.0 = Release|Any CPU + {D6C8C992-6C92-5B42-8C16-DD8579A33A50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6C8C992-6C92-5B42-8C16-DD8579A33A50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D6C8C992-6C92-5B42-8C16-DD8579A33A50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D6C8C992-6C92-5B42-8C16-DD8579A33A50}.Release|Any CPU.Build.0 = Release|Any CPU + {914E3DA8-3A2A-541B-B212-E54E5B9E5FF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {914E3DA8-3A2A-541B-B212-E54E5B9E5FF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {914E3DA8-3A2A-541B-B212-E54E5B9E5FF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {914E3DA8-3A2A-541B-B212-E54E5B9E5FF9}.Release|Any CPU.Build.0 = Release|Any CPU + {538897D7-98D3-5E80-BB85-2ADD354A6DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {538897D7-98D3-5E80-BB85-2ADD354A6DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {538897D7-98D3-5E80-BB85-2ADD354A6DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {538897D7-98D3-5E80-BB85-2ADD354A6DAD}.Release|Any CPU.Build.0 = Release|Any CPU + {D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6}.Release|Any CPU.Build.0 = Release|Any CPU + {0735AB65-C84E-5173-AA33-34D053A2206F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0735AB65-C84E-5173-AA33-34D053A2206F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0735AB65-C84E-5173-AA33-34D053A2206F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0735AB65-C84E-5173-AA33-34D053A2206F}.Release|Any CPU.Build.0 = Release|Any CPU + {DC026D6C-B3C7-563C-9686-598397B646F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC026D6C-B3C7-563C-9686-598397B646F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC026D6C-B3C7-563C-9686-598397B646F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC026D6C-B3C7-563C-9686-598397B646F0}.Release|Any CPU.Build.0 = Release|Any CPU + {144905E9-FB74-5478-858D-214E98611302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {144905E9-FB74-5478-858D-214E98611302}.Debug|Any CPU.Build.0 = Debug|Any CPU + {144905E9-FB74-5478-858D-214E98611302}.Release|Any CPU.ActiveCfg = Release|Any CPU + {144905E9-FB74-5478-858D-214E98611302}.Release|Any CPU.Build.0 = Release|Any CPU + {138E4BA5-CB08-5034-81E8-77CE875D2338}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {138E4BA5-CB08-5034-81E8-77CE875D2338}.Debug|Any CPU.Build.0 = Debug|Any CPU + {138E4BA5-CB08-5034-81E8-77CE875D2338}.Release|Any CPU.ActiveCfg = Release|Any CPU + {138E4BA5-CB08-5034-81E8-77CE875D2338}.Release|Any CPU.Build.0 = Release|Any CPU + {7E440D5A-47CC-5DEA-B24F-74FCEA985B4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E440D5A-47CC-5DEA-B24F-74FCEA985B4A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E440D5A-47CC-5DEA-B24F-74FCEA985B4A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E440D5A-47CC-5DEA-B24F-74FCEA985B4A}.Release|Any CPU.Build.0 = Release|Any CPU + {E6BAF476-7A8E-5D90-85E5-40C6F3381750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6BAF476-7A8E-5D90-85E5-40C6F3381750}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6BAF476-7A8E-5D90-85E5-40C6F3381750}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6BAF476-7A8E-5D90-85E5-40C6F3381750}.Release|Any CPU.Build.0 = Release|Any CPU + {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39F576C5-7241-5E33-9F70-6A3AC310AA9A}.Release|Any CPU.Build.0 = Release|Any CPU + {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA}.Release|Any CPU.Build.0 = Release|Any CPU + {FF70148A-101D-5C79-8A6B-C82FEB1D0F2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF70148A-101D-5C79-8A6B-C82FEB1D0F2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF70148A-101D-5C79-8A6B-C82FEB1D0F2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF70148A-101D-5C79-8A6B-C82FEB1D0F2A}.Release|Any CPU.Build.0 = Release|Any CPU + {92FB53E1-32EB-5F4E-833E-35A1CD62B32D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92FB53E1-32EB-5F4E-833E-35A1CD62B32D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92FB53E1-32EB-5F4E-833E-35A1CD62B32D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92FB53E1-32EB-5F4E-833E-35A1CD62B32D}.Release|Any CPU.Build.0 = Release|Any CPU + {BCC4F860-588E-5D77-8632-FD3F433875BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCC4F860-588E-5D77-8632-FD3F433875BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCC4F860-588E-5D77-8632-FD3F433875BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCC4F860-588E-5D77-8632-FD3F433875BA}.Release|Any CPU.Build.0 = Release|Any CPU + {611D6EF5-47DD-5683-80D1-D127FE684FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {611D6EF5-47DD-5683-80D1-D127FE684FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {611D6EF5-47DD-5683-80D1-D127FE684FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {611D6EF5-47DD-5683-80D1-D127FE684FBE}.Release|Any CPU.Build.0 = Release|Any CPU + {0DCAB8B4-4D58-521B-B7CE-F931660BC02D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0DCAB8B4-4D58-521B-B7CE-F931660BC02D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DCAB8B4-4D58-521B-B7CE-F931660BC02D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0DCAB8B4-4D58-521B-B7CE-F931660BC02D}.Release|Any CPU.Build.0 = Release|Any CPU + {8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77}.Release|Any CPU.Build.0 = Release|Any CPU + {928428D2-2BD5-59AB-8E56-7969B8A75B85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {928428D2-2BD5-59AB-8E56-7969B8A75B85}.Debug|Any CPU.Build.0 = Debug|Any CPU + {928428D2-2BD5-59AB-8E56-7969B8A75B85}.Release|Any CPU.ActiveCfg = Release|Any CPU + {928428D2-2BD5-59AB-8E56-7969B8A75B85}.Release|Any CPU.Build.0 = Release|Any CPU + {96C669DB-9F4A-5302-85BE-5D9EF48D64AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96C669DB-9F4A-5302-85BE-5D9EF48D64AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96C669DB-9F4A-5302-85BE-5D9EF48D64AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96C669DB-9F4A-5302-85BE-5D9EF48D64AA}.Release|Any CPU.Build.0 = Release|Any CPU + {47513358-7F52-52B0-8A3A-F6F7083A1357}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47513358-7F52-52B0-8A3A-F6F7083A1357}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47513358-7F52-52B0-8A3A-F6F7083A1357}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47513358-7F52-52B0-8A3A-F6F7083A1357}.Release|Any CPU.Build.0 = Release|Any CPU + {3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5}.Release|Any CPU.Build.0 = Release|Any CPU + {41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB}.Release|Any CPU.Build.0 = Release|Any CPU + {865BED4F-1D52-5ECE-B19E-A4EA8177C690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {865BED4F-1D52-5ECE-B19E-A4EA8177C690}.Debug|Any CPU.Build.0 = Debug|Any CPU + {865BED4F-1D52-5ECE-B19E-A4EA8177C690}.Release|Any CPU.ActiveCfg = Release|Any CPU + {865BED4F-1D52-5ECE-B19E-A4EA8177C690}.Release|Any CPU.Build.0 = Release|Any CPU + {0C29ECF8-B816-58C1-8A0E-D2663C91D259}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C29ECF8-B816-58C1-8A0E-D2663C91D259}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C29ECF8-B816-58C1-8A0E-D2663C91D259}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C29ECF8-B816-58C1-8A0E-D2663C91D259}.Release|Any CPU.Build.0 = Release|Any CPU + {A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD}.Release|Any CPU.Build.0 = Release|Any CPU + {79CFA9D7-7759-5EA5-9A68-735E4CF304FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79CFA9D7-7759-5EA5-9A68-735E4CF304FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79CFA9D7-7759-5EA5-9A68-735E4CF304FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79CFA9D7-7759-5EA5-9A68-735E4CF304FF}.Release|Any CPU.Build.0 = Release|Any CPU + {A43B40D5-0F1B-544B-B621-C2A1D4292D05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A43B40D5-0F1B-544B-B621-C2A1D4292D05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A43B40D5-0F1B-544B-B621-C2A1D4292D05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A43B40D5-0F1B-544B-B621-C2A1D4292D05}.Release|Any CPU.Build.0 = Release|Any CPU + {4B422E10-2700-5740-8507-A9BA717DFF7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B422E10-2700-5740-8507-A9BA717DFF7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B422E10-2700-5740-8507-A9BA717DFF7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B422E10-2700-5740-8507-A9BA717DFF7E}.Release|Any CPU.Build.0 = Release|Any CPU + {693FBCDA-F357-5B46-93E4-1203E1912FEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {693FBCDA-F357-5B46-93E4-1203E1912FEA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {693FBCDA-F357-5B46-93E4-1203E1912FEA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {693FBCDA-F357-5B46-93E4-1203E1912FEA}.Release|Any CPU.Build.0 = Release|Any CPU + {9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367}.Release|Any CPU.Build.0 = Release|Any CPU + {FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5}.Release|Any CPU.Build.0 = Release|Any CPU + {245C2445-685D-5F18-8557-0C3266C41358}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {245C2445-685D-5F18-8557-0C3266C41358}.Debug|Any CPU.Build.0 = Debug|Any CPU + {245C2445-685D-5F18-8557-0C3266C41358}.Release|Any CPU.ActiveCfg = Release|Any CPU + {245C2445-685D-5F18-8557-0C3266C41358}.Release|Any CPU.Build.0 = Release|Any CPU + {8AE5CA1F-85CD-5BCF-A406-15F68FDDA875}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8AE5CA1F-85CD-5BCF-A406-15F68FDDA875}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8AE5CA1F-85CD-5BCF-A406-15F68FDDA875}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8AE5CA1F-85CD-5BCF-A406-15F68FDDA875}.Release|Any CPU.Build.0 = Release|Any CPU + {D7A538CE-DDAB-5F29-A55D-204C9BD1A157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7A538CE-DDAB-5F29-A55D-204C9BD1A157}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7A538CE-DDAB-5F29-A55D-204C9BD1A157}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7A538CE-DDAB-5F29-A55D-204C9BD1A157}.Release|Any CPU.Build.0 = Release|Any CPU + {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABE22056-D6B6-5B41-812A-8DCEC9812B8E}.Release|Any CPU.Build.0 = Release|Any CPU + {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3}.Release|Any CPU.Build.0 = Release|Any CPU + {59DCF5F1-F87C-5A73-A251-45C4D98D8F34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59DCF5F1-F87C-5A73-A251-45C4D98D8F34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59DCF5F1-F87C-5A73-A251-45C4D98D8F34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59DCF5F1-F87C-5A73-A251-45C4D98D8F34}.Release|Any CPU.Build.0 = Release|Any CPU + {640B22EB-F7DC-57AF-9E6E-1BDD18810064}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {640B22EB-F7DC-57AF-9E6E-1BDD18810064}.Debug|Any CPU.Build.0 = Debug|Any CPU + {640B22EB-F7DC-57AF-9E6E-1BDD18810064}.Release|Any CPU.ActiveCfg = Release|Any CPU + {640B22EB-F7DC-57AF-9E6E-1BDD18810064}.Release|Any CPU.Build.0 = Release|Any CPU + {68B2E31B-A427-52C6-A3A6-8902A21A9D04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68B2E31B-A427-52C6-A3A6-8902A21A9D04}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68B2E31B-A427-52C6-A3A6-8902A21A9D04}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68B2E31B-A427-52C6-A3A6-8902A21A9D04}.Release|Any CPU.Build.0 = Release|Any CPU + {6E26EDF7-C6C4-5B4D-A8D5-E69794986F58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E26EDF7-C6C4-5B4D-A8D5-E69794986F58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E26EDF7-C6C4-5B4D-A8D5-E69794986F58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E26EDF7-C6C4-5B4D-A8D5-E69794986F58}.Release|Any CPU.Build.0 = Release|Any CPU + {1763B240-97A6-5710-A7A6-8A1F63311597}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1763B240-97A6-5710-A7A6-8A1F63311597}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1763B240-97A6-5710-A7A6-8A1F63311597}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1763B240-97A6-5710-A7A6-8A1F63311597}.Release|Any CPU.Build.0 = Release|Any CPU + {F23B9764-280A-5720-8B5B-B227092A24A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F23B9764-280A-5720-8B5B-B227092A24A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F23B9764-280A-5720-8B5B-B227092A24A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F23B9764-280A-5720-8B5B-B227092A24A9}.Release|Any CPU.Build.0 = Release|Any CPU + {40426D69-90A0-599F-8113-BAAA98714E62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40426D69-90A0-599F-8113-BAAA98714E62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40426D69-90A0-599F-8113-BAAA98714E62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40426D69-90A0-599F-8113-BAAA98714E62}.Release|Any CPU.Build.0 = Release|Any CPU + {41671DFA-9B15-574B-9B82-45CA2A254269}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41671DFA-9B15-574B-9B82-45CA2A254269}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41671DFA-9B15-574B-9B82-45CA2A254269}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41671DFA-9B15-574B-9B82-45CA2A254269}.Release|Any CPU.Build.0 = Release|Any CPU + {8119F319-6F44-51B0-893E-24B214690A37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8119F319-6F44-51B0-893E-24B214690A37}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8119F319-6F44-51B0-893E-24B214690A37}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8119F319-6F44-51B0-893E-24B214690A37}.Release|Any CPU.Build.0 = Release|Any CPU + {8581A797-6D1A-5605-B9C6-4EB8CC349425}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8581A797-6D1A-5605-B9C6-4EB8CC349425}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8581A797-6D1A-5605-B9C6-4EB8CC349425}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8581A797-6D1A-5605-B9C6-4EB8CC349425}.Release|Any CPU.Build.0 = Release|Any CPU + {7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC}.Release|Any CPU.Build.0 = Release|Any CPU + {97545321-6315-574C-94EA-C4D756A323EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97545321-6315-574C-94EA-C4D756A323EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97545321-6315-574C-94EA-C4D756A323EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97545321-6315-574C-94EA-C4D756A323EE}.Release|Any CPU.Build.0 = Release|Any CPU + {7F384D30-79DA-55EF-AA3F-5C433126B646}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F384D30-79DA-55EF-AA3F-5C433126B646}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F384D30-79DA-55EF-AA3F-5C433126B646}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F384D30-79DA-55EF-AA3F-5C433126B646}.Release|Any CPU.Build.0 = Release|Any CPU + {BCD434BC-C9DE-5291-A5C8-AD32891A7401}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCD434BC-C9DE-5291-A5C8-AD32891A7401}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCD434BC-C9DE-5291-A5C8-AD32891A7401}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCD434BC-C9DE-5291-A5C8-AD32891A7401}.Release|Any CPU.Build.0 = Release|Any CPU + {95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0}.Release|Any CPU.Build.0 = Release|Any CPU + {5881D3BD-529E-5092-8640-1CE0844FE0FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5881D3BD-529E-5092-8640-1CE0844FE0FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5881D3BD-529E-5092-8640-1CE0844FE0FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5881D3BD-529E-5092-8640-1CE0844FE0FB}.Release|Any CPU.Build.0 = Release|Any CPU + {D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4}.Release|Any CPU.Build.0 = Release|Any CPU + {2512F361-2C0C-56B4-9D93-7DBBBF55815E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2512F361-2C0C-56B4-9D93-7DBBBF55815E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2512F361-2C0C-56B4-9D93-7DBBBF55815E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2512F361-2C0C-56B4-9D93-7DBBBF55815E}.Release|Any CPU.Build.0 = Release|Any CPU + {78400F00-37A1-574C-8391-3CFA7E014B4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78400F00-37A1-574C-8391-3CFA7E014B4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78400F00-37A1-574C-8391-3CFA7E014B4D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78400F00-37A1-574C-8391-3CFA7E014B4D}.Release|Any CPU.Build.0 = Release|Any CPU + {75D9C1EF-60D4-51E9-A0F4-FBE6632AF791}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75D9C1EF-60D4-51E9-A0F4-FBE6632AF791}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75D9C1EF-60D4-51E9-A0F4-FBE6632AF791}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75D9C1EF-60D4-51E9-A0F4-FBE6632AF791}.Release|Any CPU.Build.0 = Release|Any CPU + {4FB42ADD-4BAB-5C19-BD4E-E39F95348600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FB42ADD-4BAB-5C19-BD4E-E39F95348600}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FB42ADD-4BAB-5C19-BD4E-E39F95348600}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FB42ADD-4BAB-5C19-BD4E-E39F95348600}.Release|Any CPU.Build.0 = Release|Any CPU + {7EE3111E-53B5-5EE7-99FB-230A9B4EFD50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7EE3111E-53B5-5EE7-99FB-230A9B4EFD50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7EE3111E-53B5-5EE7-99FB-230A9B4EFD50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7EE3111E-53B5-5EE7-99FB-230A9B4EFD50}.Release|Any CPU.Build.0 = Release|Any CPU + {A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25}.Release|Any CPU.Build.0 = Release|Any CPU + {A15C2434-BBA5-540A-B863-20A347A3F160}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A15C2434-BBA5-540A-B863-20A347A3F160}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A15C2434-BBA5-540A-B863-20A347A3F160}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A15C2434-BBA5-540A-B863-20A347A3F160}.Release|Any CPU.Build.0 = Release|Any CPU + {A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D}.Release|Any CPU.Build.0 = Release|Any CPU + {F8564409-54F7-59AA-8E2A-E9022839ED4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8564409-54F7-59AA-8E2A-E9022839ED4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8564409-54F7-59AA-8E2A-E9022839ED4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8564409-54F7-59AA-8E2A-E9022839ED4F}.Release|Any CPU.Build.0 = Release|Any CPU + {E6887A02-800D-5F8B-8623-C9C052F6A690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6887A02-800D-5F8B-8623-C9C052F6A690}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6887A02-800D-5F8B-8623-C9C052F6A690}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6887A02-800D-5F8B-8623-C9C052F6A690}.Release|Any CPU.Build.0 = Release|Any CPU + {721DD473-5A17-5E0D-B0CA-B2F91A3333EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {721DD473-5A17-5E0D-B0CA-B2F91A3333EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {721DD473-5A17-5E0D-B0CA-B2F91A3333EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {721DD473-5A17-5E0D-B0CA-B2F91A3333EB}.Release|Any CPU.Build.0 = Release|Any CPU + {AA0D3C06-0E6C-5671-BBEF-C5594F869378}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA0D3C06-0E6C-5671-BBEF-C5594F869378}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA0D3C06-0E6C-5671-BBEF-C5594F869378}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA0D3C06-0E6C-5671-BBEF-C5594F869378}.Release|Any CPU.Build.0 = Release|Any CPU + {6584A0EB-82AE-59E7-8023-3261AF88217D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6584A0EB-82AE-59E7-8023-3261AF88217D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6584A0EB-82AE-59E7-8023-3261AF88217D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6584A0EB-82AE-59E7-8023-3261AF88217D}.Release|Any CPU.Build.0 = Release|Any CPU + {8010A35A-7CDE-5521-9D64-4C97F0DA3E93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8010A35A-7CDE-5521-9D64-4C97F0DA3E93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8010A35A-7CDE-5521-9D64-4C97F0DA3E93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8010A35A-7CDE-5521-9D64-4C97F0DA3E93}.Release|Any CPU.Build.0 = Release|Any CPU + {E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D}.Release|Any CPU.Build.0 = Release|Any CPU + {2135DC08-5B28-591C-A43B-445D7BB98303}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2135DC08-5B28-591C-A43B-445D7BB98303}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2135DC08-5B28-591C-A43B-445D7BB98303}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2135DC08-5B28-591C-A43B-445D7BB98303}.Release|Any CPU.Build.0 = Release|Any CPU + {E9610063-C8DB-589B-A817-CC06CE65ACC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9610063-C8DB-589B-A817-CC06CE65ACC4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9610063-C8DB-589B-A817-CC06CE65ACC4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9610063-C8DB-589B-A817-CC06CE65ACC4}.Release|Any CPU.Build.0 = Release|Any CPU + {B81E7A3D-0F57-59A9-9EFF-E940745C9B90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B81E7A3D-0F57-59A9-9EFF-E940745C9B90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B81E7A3D-0F57-59A9-9EFF-E940745C9B90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B81E7A3D-0F57-59A9-9EFF-E940745C9B90}.Release|Any CPU.Build.0 = Release|Any CPU + {41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35}.Release|Any CPU.Build.0 = Release|Any CPU + {BBA41FC3-A097-5751-9830-B028CB357E58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBA41FC3-A097-5751-9830-B028CB357E58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBA41FC3-A097-5751-9830-B028CB357E58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBA41FC3-A097-5751-9830-B028CB357E58}.Release|Any CPU.Build.0 = Release|Any CPU + {F6AE6B49-960C-555C-90BF-38A2E03EF27A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6AE6B49-960C-555C-90BF-38A2E03EF27A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6AE6B49-960C-555C-90BF-38A2E03EF27A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6AE6B49-960C-555C-90BF-38A2E03EF27A}.Release|Any CPU.Build.0 = Release|Any CPU + {DEA58CAE-08AD-5376-BE6F-883B85760DD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEA58CAE-08AD-5376-BE6F-883B85760DD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEA58CAE-08AD-5376-BE6F-883B85760DD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEA58CAE-08AD-5376-BE6F-883B85760DD7}.Release|Any CPU.Build.0 = Release|Any CPU + {4B27536C-E23B-5808-ABAE-BC93F0F7B109}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B27536C-E23B-5808-ABAE-BC93F0F7B109}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B27536C-E23B-5808-ABAE-BC93F0F7B109}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B27536C-E23B-5808-ABAE-BC93F0F7B109}.Release|Any CPU.Build.0 = Release|Any CPU + {4E87FA32-5495-54BA-B5FC-383F20ABA094}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E87FA32-5495-54BA-B5FC-383F20ABA094}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E87FA32-5495-54BA-B5FC-383F20ABA094}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E87FA32-5495-54BA-B5FC-383F20ABA094}.Release|Any CPU.Build.0 = Release|Any CPU + {4EF8E25B-4A19-5D64-8F95-40D86B51E453}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EF8E25B-4A19-5D64-8F95-40D86B51E453}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EF8E25B-4A19-5D64-8F95-40D86B51E453}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EF8E25B-4A19-5D64-8F95-40D86B51E453}.Release|Any CPU.Build.0 = Release|Any CPU + {9ECD2194-4E14-5CCD-9AA0-5279B464EF4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9ECD2194-4E14-5CCD-9AA0-5279B464EF4A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9ECD2194-4E14-5CCD-9AA0-5279B464EF4A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9ECD2194-4E14-5CCD-9AA0-5279B464EF4A}.Release|Any CPU.Build.0 = Release|Any CPU + {B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9}.Release|Any CPU.Build.0 = Release|Any CPU + {2EF64916-E58F-5155-8A3D-735E7A019BDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2EF64916-E58F-5155-8A3D-735E7A019BDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EF64916-E58F-5155-8A3D-735E7A019BDF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2EF64916-E58F-5155-8A3D-735E7A019BDF}.Release|Any CPU.Build.0 = Release|Any CPU + {9E95BC40-F0B0-5362-9694-5013FAFE83C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E95BC40-F0B0-5362-9694-5013FAFE83C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E95BC40-F0B0-5362-9694-5013FAFE83C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E95BC40-F0B0-5362-9694-5013FAFE83C5}.Release|Any CPU.Build.0 = Release|Any CPU + {4767D489-E3AF-5C99-825F-6C90CE550264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4767D489-E3AF-5C99-825F-6C90CE550264}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4767D489-E3AF-5C99-825F-6C90CE550264}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4767D489-E3AF-5C99-825F-6C90CE550264}.Release|Any CPU.Build.0 = Release|Any CPU + {0EFA741A-DAB8-5C34-BCF6-86000CC31530}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0EFA741A-DAB8-5C34-BCF6-86000CC31530}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0EFA741A-DAB8-5C34-BCF6-86000CC31530}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0EFA741A-DAB8-5C34-BCF6-86000CC31530}.Release|Any CPU.Build.0 = Release|Any CPU + {A4790683-9F0A-5B2A-806F-797619E2A98A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4790683-9F0A-5B2A-806F-797619E2A98A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4790683-9F0A-5B2A-806F-797619E2A98A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4790683-9F0A-5B2A-806F-797619E2A98A}.Release|Any CPU.Build.0 = Release|Any CPU + {1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30}.Release|Any CPU.Build.0 = Release|Any CPU + {3B765847-031F-5291-AEB9-E8BB59EF1B53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B765847-031F-5291-AEB9-E8BB59EF1B53}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B765847-031F-5291-AEB9-E8BB59EF1B53}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B765847-031F-5291-AEB9-E8BB59EF1B53}.Release|Any CPU.Build.0 = Release|Any CPU + {F96E3D04-4D69-575F-9347-8AC47337D471}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F96E3D04-4D69-575F-9347-8AC47337D471}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F96E3D04-4D69-575F-9347-8AC47337D471}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F96E3D04-4D69-575F-9347-8AC47337D471}.Release|Any CPU.Build.0 = Release|Any CPU + {04A2ACE6-20E8-5707-87BD-F024FAD7DED0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04A2ACE6-20E8-5707-87BD-F024FAD7DED0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04A2ACE6-20E8-5707-87BD-F024FAD7DED0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04A2ACE6-20E8-5707-87BD-F024FAD7DED0}.Release|Any CPU.Build.0 = Release|Any CPU + {55C23781-1A56-59FF-9AF3-4BA07A0992CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55C23781-1A56-59FF-9AF3-4BA07A0992CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55C23781-1A56-59FF-9AF3-4BA07A0992CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55C23781-1A56-59FF-9AF3-4BA07A0992CC}.Release|Any CPU.Build.0 = Release|Any CPU + {9C2C091A-1607-5418-B5A5-20A86652835B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C2C091A-1607-5418-B5A5-20A86652835B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C2C091A-1607-5418-B5A5-20A86652835B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C2C091A-1607-5418-B5A5-20A86652835B}.Release|Any CPU.Build.0 = Release|Any CPU + {58C44599-F7B5-5911-8B0B-66C4FCB027A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58C44599-F7B5-5911-8B0B-66C4FCB027A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58C44599-F7B5-5911-8B0B-66C4FCB027A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58C44599-F7B5-5911-8B0B-66C4FCB027A2}.Release|Any CPU.Build.0 = Release|Any CPU + {FA7943CD-23FC-58EE-BBFE-965758D362C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA7943CD-23FC-58EE-BBFE-965758D362C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA7943CD-23FC-58EE-BBFE-965758D362C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA7943CD-23FC-58EE-BBFE-965758D362C6}.Release|Any CPU.Build.0 = Release|Any CPU + {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Debug|Any CPU.Build.0 = Debug|Any CPU + {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Release|Any CPU.ActiveCfg = Release|Any CPU + {211A70CE-8B98-55B1-9D48-EADD5F34C513}.Release|Any CPU.Build.0 = Release|Any CPU + {4144AED2-D212-5A1B-9849-97F97A8760E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4144AED2-D212-5A1B-9849-97F97A8760E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4144AED2-D212-5A1B-9849-97F97A8760E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4144AED2-D212-5A1B-9849-97F97A8760E3}.Release|Any CPU.Build.0 = Release|Any CPU + {77ABEF57-B941-5243-A695-AA8B499FE91F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77ABEF57-B941-5243-A695-AA8B499FE91F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77ABEF57-B941-5243-A695-AA8B499FE91F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77ABEF57-B941-5243-A695-AA8B499FE91F}.Release|Any CPU.Build.0 = Release|Any CPU + {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D}.Release|Any CPU.Build.0 = Release|Any CPU + {0661F0EE-F6A1-5305-86BD-42849137BDBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0661F0EE-F6A1-5305-86BD-42849137BDBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0661F0EE-F6A1-5305-86BD-42849137BDBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0661F0EE-F6A1-5305-86BD-42849137BDBF}.Release|Any CPU.Build.0 = Release|Any CPU + {A2D930E0-FCEC-5984-89FA-1B6D2046C7A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2D930E0-FCEC-5984-89FA-1B6D2046C7A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2D930E0-FCEC-5984-89FA-1B6D2046C7A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2D930E0-FCEC-5984-89FA-1B6D2046C7A7}.Release|Any CPU.Build.0 = Release|Any CPU + {FC7A23D5-6A5F-5274-B360-95393EAB244B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC7A23D5-6A5F-5274-B360-95393EAB244B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC7A23D5-6A5F-5274-B360-95393EAB244B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC7A23D5-6A5F-5274-B360-95393EAB244B}.Release|Any CPU.Build.0 = Release|Any CPU + {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66}.Release|Any CPU.Build.0 = Release|Any CPU + {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12428388-51C9-5FEA-9EB5-ECF205FD1C90}.Release|Any CPU.Build.0 = Release|Any CPU + {F208351E-5372-53EF-ABBF-C349C32B33E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F208351E-5372-53EF-ABBF-C349C32B33E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F208351E-5372-53EF-ABBF-C349C32B33E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F208351E-5372-53EF-ABBF-C349C32B33E4}.Release|Any CPU.Build.0 = Release|Any CPU + {C061A376-5BF3-58B4-B301-28ABC6DE0A3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C061A376-5BF3-58B4-B301-28ABC6DE0A3B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C061A376-5BF3-58B4-B301-28ABC6DE0A3B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C061A376-5BF3-58B4-B301-28ABC6DE0A3B}.Release|Any CPU.Build.0 = Release|Any CPU + {BFCBC834-E9E7-5937-AC74-596459428D2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BFCBC834-E9E7-5937-AC74-596459428D2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BFCBC834-E9E7-5937-AC74-596459428D2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BFCBC834-E9E7-5937-AC74-596459428D2C}.Release|Any CPU.Build.0 = Release|Any CPU + {A9660377-E43A-5514-94B8-813B40D34E21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A9660377-E43A-5514-94B8-813B40D34E21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A9660377-E43A-5514-94B8-813B40D34E21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A9660377-E43A-5514-94B8-813B40D34E21}.Release|Any CPU.Build.0 = Release|Any CPU + {5A8FFD16-30ED-55A8-A69E-37877E540442}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A8FFD16-30ED-55A8-A69E-37877E540442}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A8FFD16-30ED-55A8-A69E-37877E540442}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A8FFD16-30ED-55A8-A69E-37877E540442}.Release|Any CPU.Build.0 = Release|Any CPU + {8C747A2A-F2D2-57C3-9777-C32EFB6BA17A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C747A2A-F2D2-57C3-9777-C32EFB6BA17A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C747A2A-F2D2-57C3-9777-C32EFB6BA17A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C747A2A-F2D2-57C3-9777-C32EFB6BA17A}.Release|Any CPU.Build.0 = Release|Any CPU + {03D045E7-F7AB-59EE-B53D-6B890AF278FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03D045E7-F7AB-59EE-B53D-6B890AF278FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03D045E7-F7AB-59EE-B53D-6B890AF278FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03D045E7-F7AB-59EE-B53D-6B890AF278FB}.Release|Any CPU.Build.0 = Release|Any CPU + {174D2124-12A2-5620-964F-6D2737DA5DEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {174D2124-12A2-5620-964F-6D2737DA5DEA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {174D2124-12A2-5620-964F-6D2737DA5DEA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {174D2124-12A2-5620-964F-6D2737DA5DEA}.Release|Any CPU.Build.0 = Release|Any CPU + {9A6818AB-29A5-57B5-9958-B5F93B421964}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A6818AB-29A5-57B5-9958-B5F93B421964}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A6818AB-29A5-57B5-9958-B5F93B421964}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A6818AB-29A5-57B5-9958-B5F93B421964}.Release|Any CPU.Build.0 = Release|Any CPU + {467C42CD-ED69-5E21-BFF3-F35BAE24E9AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {467C42CD-ED69-5E21-BFF3-F35BAE24E9AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {467C42CD-ED69-5E21-BFF3-F35BAE24E9AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {467C42CD-ED69-5E21-BFF3-F35BAE24E9AF}.Release|Any CPU.Build.0 = Release|Any CPU + {03262415-2C11-5B62-84A7-33FC321D43AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03262415-2C11-5B62-84A7-33FC321D43AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03262415-2C11-5B62-84A7-33FC321D43AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03262415-2C11-5B62-84A7-33FC321D43AF}.Release|Any CPU.Build.0 = Release|Any CPU + {75991E1E-7D74-53B5-927C-D639337202C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75991E1E-7D74-53B5-927C-D639337202C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75991E1E-7D74-53B5-927C-D639337202C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75991E1E-7D74-53B5-927C-D639337202C4}.Release|Any CPU.Build.0 = Release|Any CPU + {D24D7552-BE3F-58CD-A458-9BFA2403C696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D24D7552-BE3F-58CD-A458-9BFA2403C696}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D24D7552-BE3F-58CD-A458-9BFA2403C696}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D24D7552-BE3F-58CD-A458-9BFA2403C696}.Release|Any CPU.Build.0 = Release|Any CPU + {2BC14382-5C69-528B-9FCE-488CE3F8143E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BC14382-5C69-528B-9FCE-488CE3F8143E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BC14382-5C69-528B-9FCE-488CE3F8143E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BC14382-5C69-528B-9FCE-488CE3F8143E}.Release|Any CPU.Build.0 = Release|Any CPU + {E7802557-EEB2-53EB-98C3-62A1E0DCC4BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7802557-EEB2-53EB-98C3-62A1E0DCC4BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7802557-EEB2-53EB-98C3-62A1E0DCC4BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7802557-EEB2-53EB-98C3-62A1E0DCC4BC}.Release|Any CPU.Build.0 = Release|Any CPU + {FBF45F4E-D545-5897-8A02-428C51A3C4A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBF45F4E-D545-5897-8A02-428C51A3C4A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBF45F4E-D545-5897-8A02-428C51A3C4A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBF45F4E-D545-5897-8A02-428C51A3C4A0}.Release|Any CPU.Build.0 = Release|Any CPU + {D5C3A0AF-A331-5C5F-AC21-3982A3BD3066}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5C3A0AF-A331-5C5F-AC21-3982A3BD3066}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5C3A0AF-A331-5C5F-AC21-3982A3BD3066}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5C3A0AF-A331-5C5F-AC21-3982A3BD3066}.Release|Any CPU.Build.0 = Release|Any CPU + {69A56760-817A-5A9C-A52E-764FB0194071}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69A56760-817A-5A9C-A52E-764FB0194071}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69A56760-817A-5A9C-A52E-764FB0194071}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69A56760-817A-5A9C-A52E-764FB0194071}.Release|Any CPU.Build.0 = Release|Any CPU + {4A591A91-072D-5332-84B5-40C52406510D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A591A91-072D-5332-84B5-40C52406510D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A591A91-072D-5332-84B5-40C52406510D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A591A91-072D-5332-84B5-40C52406510D}.Release|Any CPU.Build.0 = Release|Any CPU + {CF956202-62CB-5340-BED9-0AB42E99E48D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF956202-62CB-5340-BED9-0AB42E99E48D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF956202-62CB-5340-BED9-0AB42E99E48D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF956202-62CB-5340-BED9-0AB42E99E48D}.Release|Any CPU.Build.0 = Release|Any CPU + {441BAC38-A865-559B-9310-02CB5D417209}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {441BAC38-A865-559B-9310-02CB5D417209}.Debug|Any CPU.Build.0 = Debug|Any CPU + {441BAC38-A865-559B-9310-02CB5D417209}.Release|Any CPU.ActiveCfg = Release|Any CPU + {441BAC38-A865-559B-9310-02CB5D417209}.Release|Any CPU.Build.0 = Release|Any CPU + {BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9}.Release|Any CPU.Build.0 = Release|Any CPU + {36964679-F5CA-57C8-A7C7-98FF38998644}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36964679-F5CA-57C8-A7C7-98FF38998644}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36964679-F5CA-57C8-A7C7-98FF38998644}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36964679-F5CA-57C8-A7C7-98FF38998644}.Release|Any CPU.Build.0 = Release|Any CPU + {DE8969D1-E305-54AD-A3B7-8AF897C19503}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE8969D1-E305-54AD-A3B7-8AF897C19503}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE8969D1-E305-54AD-A3B7-8AF897C19503}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE8969D1-E305-54AD-A3B7-8AF897C19503}.Release|Any CPU.Build.0 = Release|Any CPU + {FF3858C2-487C-5056-9BE1-753096E3828C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF3858C2-487C-5056-9BE1-753096E3828C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF3858C2-487C-5056-9BE1-753096E3828C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF3858C2-487C-5056-9BE1-753096E3828C}.Release|Any CPU.Build.0 = Release|Any CPU + {284574B8-F4BF-5711-81F6-43A277F6E374}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {284574B8-F4BF-5711-81F6-43A277F6E374}.Debug|Any CPU.Build.0 = Debug|Any CPU + {284574B8-F4BF-5711-81F6-43A277F6E374}.Release|Any CPU.ActiveCfg = Release|Any CPU + {284574B8-F4BF-5711-81F6-43A277F6E374}.Release|Any CPU.Build.0 = Release|Any CPU + {4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5}.Release|Any CPU.Build.0 = Release|Any CPU + {C981E0FC-E546-5B95-8995-2296C4BCCC11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C981E0FC-E546-5B95-8995-2296C4BCCC11}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C981E0FC-E546-5B95-8995-2296C4BCCC11}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C981E0FC-E546-5B95-8995-2296C4BCCC11}.Release|Any CPU.Build.0 = Release|Any CPU + {B7303B10-C5BF-5710-9FB6-FCE79C270488}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7303B10-C5BF-5710-9FB6-FCE79C270488}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7303B10-C5BF-5710-9FB6-FCE79C270488}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7303B10-C5BF-5710-9FB6-FCE79C270488}.Release|Any CPU.Build.0 = Release|Any CPU + {40092818-83F9-54F5-9333-083731DC7DB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40092818-83F9-54F5-9333-083731DC7DB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40092818-83F9-54F5-9333-083731DC7DB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40092818-83F9-54F5-9333-083731DC7DB4}.Release|Any CPU.Build.0 = Release|Any CPU + {5D2B450D-B34A-575D-BAFB-8DFA29CDCE74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D2B450D-B34A-575D-BAFB-8DFA29CDCE74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D2B450D-B34A-575D-BAFB-8DFA29CDCE74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D2B450D-B34A-575D-BAFB-8DFA29CDCE74}.Release|Any CPU.Build.0 = Release|Any CPU + {FD53E7DE-2531-5E41-9D24-93D869813695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD53E7DE-2531-5E41-9D24-93D869813695}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD53E7DE-2531-5E41-9D24-93D869813695}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD53E7DE-2531-5E41-9D24-93D869813695}.Release|Any CPU.Build.0 = Release|Any CPU + {166B5460-FFAB-5469-B256-147CA8671861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {166B5460-FFAB-5469-B256-147CA8671861}.Debug|Any CPU.Build.0 = Debug|Any CPU + {166B5460-FFAB-5469-B256-147CA8671861}.Release|Any CPU.ActiveCfg = Release|Any CPU + {166B5460-FFAB-5469-B256-147CA8671861}.Release|Any CPU.Build.0 = Release|Any CPU + {D7EB2001-6897-501F-BF6C-27F849B95430}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7EB2001-6897-501F-BF6C-27F849B95430}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7EB2001-6897-501F-BF6C-27F849B95430}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7EB2001-6897-501F-BF6C-27F849B95430}.Release|Any CPU.Build.0 = Release|Any CPU + {F01FB705-B831-5A3A-91A2-476EAE8EE65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F01FB705-B831-5A3A-91A2-476EAE8EE65B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F01FB705-B831-5A3A-91A2-476EAE8EE65B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F01FB705-B831-5A3A-91A2-476EAE8EE65B}.Release|Any CPU.Build.0 = Release|Any CPU + {029ADACB-AADD-5FF1-A1C6-42B2542E4877}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {029ADACB-AADD-5FF1-A1C6-42B2542E4877}.Debug|Any CPU.Build.0 = Debug|Any CPU + {029ADACB-AADD-5FF1-A1C6-42B2542E4877}.Release|Any CPU.ActiveCfg = Release|Any CPU + {029ADACB-AADD-5FF1-A1C6-42B2542E4877}.Release|Any CPU.Build.0 = Release|Any CPU + {9B1B44EA-214D-5749-88D7-28EC8649B233}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B1B44EA-214D-5749-88D7-28EC8649B233}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B1B44EA-214D-5749-88D7-28EC8649B233}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B1B44EA-214D-5749-88D7-28EC8649B233}.Release|Any CPU.Build.0 = Release|Any CPU + {18DE5026-FED1-5636-8F78-7F1B3A2AFEFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18DE5026-FED1-5636-8F78-7F1B3A2AFEFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18DE5026-FED1-5636-8F78-7F1B3A2AFEFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18DE5026-FED1-5636-8F78-7F1B3A2AFEFB}.Release|Any CPU.Build.0 = Release|Any CPU + {4C4DF88D-A249-58F2-B98D-00D5E2FC33BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C4DF88D-A249-58F2-B98D-00D5E2FC33BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C4DF88D-A249-58F2-B98D-00D5E2FC33BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C4DF88D-A249-58F2-B98D-00D5E2FC33BA}.Release|Any CPU.Build.0 = Release|Any CPU + {226B12A0-1EED-5CC5-974D-E9524E924794}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {226B12A0-1EED-5CC5-974D-E9524E924794}.Debug|Any CPU.Build.0 = Debug|Any CPU + {226B12A0-1EED-5CC5-974D-E9524E924794}.Release|Any CPU.ActiveCfg = Release|Any CPU + {226B12A0-1EED-5CC5-974D-E9524E924794}.Release|Any CPU.Build.0 = Release|Any CPU + {E31AD5B9-66BC-5217-91BE-C4030ADBA7EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E31AD5B9-66BC-5217-91BE-C4030ADBA7EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E31AD5B9-66BC-5217-91BE-C4030ADBA7EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E31AD5B9-66BC-5217-91BE-C4030ADBA7EF}.Release|Any CPU.Build.0 = Release|Any CPU + {4B5D871F-9EBA-5D7C-A9EE-065E22B95894}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B5D871F-9EBA-5D7C-A9EE-065E22B95894}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B5D871F-9EBA-5D7C-A9EE-065E22B95894}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B5D871F-9EBA-5D7C-A9EE-065E22B95894}.Release|Any CPU.Build.0 = Release|Any CPU + {F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE}.Release|Any CPU.Build.0 = Release|Any CPU + {6EB80E87-172B-5A81-A0E2-932E1AC9615C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EB80E87-172B-5A81-A0E2-932E1AC9615C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EB80E87-172B-5A81-A0E2-932E1AC9615C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EB80E87-172B-5A81-A0E2-932E1AC9615C}.Release|Any CPU.Build.0 = Release|Any CPU + {89B055A6-8ACA-5E86-94FB-0FD369790B47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {89B055A6-8ACA-5E86-94FB-0FD369790B47}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89B055A6-8ACA-5E86-94FB-0FD369790B47}.Release|Any CPU.ActiveCfg = Release|Any CPU + {89B055A6-8ACA-5E86-94FB-0FD369790B47}.Release|Any CPU.Build.0 = Release|Any CPU + {43E42CDA-84FC-5BB8-B211-4D3E1492D39A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43E42CDA-84FC-5BB8-B211-4D3E1492D39A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43E42CDA-84FC-5BB8-B211-4D3E1492D39A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43E42CDA-84FC-5BB8-B211-4D3E1492D39A}.Release|Any CPU.Build.0 = Release|Any CPU + {230D7EA8-20DC-583F-8832-63E54E42E3D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {230D7EA8-20DC-583F-8832-63E54E42E3D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {230D7EA8-20DC-583F-8832-63E54E42E3D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {230D7EA8-20DC-583F-8832-63E54E42E3D2}.Release|Any CPU.Build.0 = Release|Any CPU + {2BC11415-1862-50AC-8CBA-0BA29C69E6C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BC11415-1862-50AC-8CBA-0BA29C69E6C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BC11415-1862-50AC-8CBA-0BA29C69E6C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BC11415-1862-50AC-8CBA-0BA29C69E6C6}.Release|Any CPU.Build.0 = Release|Any CPU + {AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5}.Release|Any CPU.Build.0 = Release|Any CPU + {D37B67AE-68F6-5C6D-AD35-738F8C7D5851}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D37B67AE-68F6-5C6D-AD35-738F8C7D5851}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D37B67AE-68F6-5C6D-AD35-738F8C7D5851}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D37B67AE-68F6-5C6D-AD35-738F8C7D5851}.Release|Any CPU.Build.0 = Release|Any CPU + {4DF1E180-AA42-5F22-9664-F87FAEAD59C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DF1E180-AA42-5F22-9664-F87FAEAD59C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DF1E180-AA42-5F22-9664-F87FAEAD59C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DF1E180-AA42-5F22-9664-F87FAEAD59C1}.Release|Any CPU.Build.0 = Release|Any CPU + {B8BECE74-88A9-53B0-B457-3C2CF0FCEE01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B8BECE74-88A9-53B0-B457-3C2CF0FCEE01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B8BECE74-88A9-53B0-B457-3C2CF0FCEE01}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B8BECE74-88A9-53B0-B457-3C2CF0FCEE01}.Release|Any CPU.Build.0 = Release|Any CPU + {A81F1C23-6F7B-5AF1-BC61-312CF1881CFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A81F1C23-6F7B-5AF1-BC61-312CF1881CFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A81F1C23-6F7B-5AF1-BC61-312CF1881CFE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A81F1C23-6F7B-5AF1-BC61-312CF1881CFE}.Release|Any CPU.Build.0 = Release|Any CPU + {CF6E60E9-000E-51D4-9C67-FE84E08AF277}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF6E60E9-000E-51D4-9C67-FE84E08AF277}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF6E60E9-000E-51D4-9C67-FE84E08AF277}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF6E60E9-000E-51D4-9C67-FE84E08AF277}.Release|Any CPU.Build.0 = Release|Any CPU + {9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E}.Release|Any CPU.Build.0 = Release|Any CPU + {06B9914A-7331-579B-AD4F-82B3D95B5C4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06B9914A-7331-579B-AD4F-82B3D95B5C4E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06B9914A-7331-579B-AD4F-82B3D95B5C4E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06B9914A-7331-579B-AD4F-82B3D95B5C4E}.Release|Any CPU.Build.0 = Release|Any CPU + {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF}.Release|Any CPU.Build.0 = Release|Any CPU + {64305515-BFD3-5627-A917-B45C4BFA08DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64305515-BFD3-5627-A917-B45C4BFA08DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64305515-BFD3-5627-A917-B45C4BFA08DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64305515-BFD3-5627-A917-B45C4BFA08DD}.Release|Any CPU.Build.0 = Release|Any CPU + {87CF5359-648E-5F59-829B-4C61573D02DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87CF5359-648E-5F59-829B-4C61573D02DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87CF5359-648E-5F59-829B-4C61573D02DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87CF5359-648E-5F59-829B-4C61573D02DF}.Release|Any CPU.Build.0 = Release|Any CPU + {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5}.Release|Any CPU.Build.0 = Release|Any CPU + {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C}.Release|Any CPU.Build.0 = Release|Any CPU + {542F28D0-D20F-5571-AE65-83CEA16B299D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {542F28D0-D20F-5571-AE65-83CEA16B299D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {542F28D0-D20F-5571-AE65-83CEA16B299D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {542F28D0-D20F-5571-AE65-83CEA16B299D}.Release|Any CPU.Build.0 = Release|Any CPU + {545AD377-070A-5001-944C-76418FB7F3FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {545AD377-070A-5001-944C-76418FB7F3FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {545AD377-070A-5001-944C-76418FB7F3FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {545AD377-070A-5001-944C-76418FB7F3FF}.Release|Any CPU.Build.0 = Release|Any CPU + {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D24E78F3-72F2-5A01-A525-7D9A8F4826F4}.Release|Any CPU.Build.0 = Release|Any CPU + {24A017D2-7BD5-5F4C-8B67-58B56129C4CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24A017D2-7BD5-5F4C-8B67-58B56129C4CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24A017D2-7BD5-5F4C-8B67-58B56129C4CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24A017D2-7BD5-5F4C-8B67-58B56129C4CB}.Release|Any CPU.Build.0 = Release|Any CPU + {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97}.Release|Any CPU.Build.0 = Release|Any CPU + {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10FC6B5B-C9CE-5E8B-9648-D85098F70A62}.Release|Any CPU.Build.0 = Release|Any CPU + {71429279-82DC-51EC-834A-F3C52A19ECE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {71429279-82DC-51EC-834A-F3C52A19ECE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71429279-82DC-51EC-834A-F3C52A19ECE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {71429279-82DC-51EC-834A-F3C52A19ECE6}.Release|Any CPU.Build.0 = Release|Any CPU + {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A}.Release|Any CPU.Build.0 = Release|Any CPU + {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50}.Release|Any CPU.Build.0 = Release|Any CPU + {4B521542-1CC6-5546-9322-8FE869AC7904}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B521542-1CC6-5546-9322-8FE869AC7904}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B521542-1CC6-5546-9322-8FE869AC7904}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B521542-1CC6-5546-9322-8FE869AC7904}.Release|Any CPU.Build.0 = Release|Any CPU + {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59}.Release|Any CPU.Build.0 = Release|Any CPU + {48C8ED44-9E61-5C72-B912-987F6B4D3D4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48C8ED44-9E61-5C72-B912-987F6B4D3D4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48C8ED44-9E61-5C72-B912-987F6B4D3D4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48C8ED44-9E61-5C72-B912-987F6B4D3D4F}.Release|Any CPU.Build.0 = Release|Any CPU + {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Debug|Any CPU.Build.0 = Debug|Any CPU + {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Release|Any CPU.ActiveCfg = Release|Any CPU + {010D92FC-6304-5FA0-81CD-1AB19BA2F832}.Release|Any CPU.Build.0 = Release|Any CPU + {28923049-DC26-55D4-8E74-8DABCABB6518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28923049-DC26-55D4-8E74-8DABCABB6518}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28923049-DC26-55D4-8E74-8DABCABB6518}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28923049-DC26-55D4-8E74-8DABCABB6518}.Release|Any CPU.Build.0 = Release|Any CPU + {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2D640E1-47EF-596C-A258-AE5E93A7578C}.Release|Any CPU.Build.0 = Release|Any CPU + {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF05A63F-D283-5C81-B7C7-D659CBED0695}.Release|Any CPU.Build.0 = Release|Any CPU + {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {047FADEF-DBAF-5D43-A2D6-5C68801894E6}.Release|Any CPU.Build.0 = Release|Any CPU + {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D77582C2-0CEF-5ED8-8366-5A28492D3C88}.Release|Any CPU.Build.0 = Release|Any CPU + {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {436C0FB7-F3E3-518B-8F65-CF760E875DD5}.Release|Any CPU.Build.0 = Release|Any CPU + {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C}.Release|Any CPU.Build.0 = Release|Any CPU + {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC4D16A5-AB4A-5877-B0E5-25928D627933}.Release|Any CPU.Build.0 = Release|Any CPU + {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ACE0837-E738-59B6-9728-1DA6D1A22B08}.Release|Any CPU.Build.0 = Release|Any CPU + {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0}.Release|Any CPU.Build.0 = Release|Any CPU + {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E}.Release|Any CPU.Build.0 = Release|Any CPU + {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {010E1EE1-EC22-55A0-B1E8-86B24B584B95}.Release|Any CPU.Build.0 = Release|Any CPU + {1848E192-CC0F-5736-B68C-D71E6D575301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1848E192-CC0F-5736-B68C-D71E6D575301}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1848E192-CC0F-5736-B68C-D71E6D575301}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1848E192-CC0F-5736-B68C-D71E6D575301}.Release|Any CPU.Build.0 = Release|Any CPU + {CA77C3B9-4D34-506E-B823-D88353261C77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA77C3B9-4D34-506E-B823-D88353261C77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA77C3B9-4D34-506E-B823-D88353261C77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA77C3B9-4D34-506E-B823-D88353261C77}.Release|Any CPU.Build.0 = Release|Any CPU + {0D8AAAB2-669C-594E-8782-B105F7A3D076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D8AAAB2-669C-594E-8782-B105F7A3D076}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D8AAAB2-669C-594E-8782-B105F7A3D076}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D8AAAB2-669C-594E-8782-B105F7A3D076}.Release|Any CPU.Build.0 = Release|Any CPU + {24A77816-86CF-5958-8005-511C82A5DE13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24A77816-86CF-5958-8005-511C82A5DE13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24A77816-86CF-5958-8005-511C82A5DE13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24A77816-86CF-5958-8005-511C82A5DE13}.Release|Any CPU.Build.0 = Release|Any CPU + {265D18F4-7D43-5989-BC89-06A0BCAA974F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {265D18F4-7D43-5989-BC89-06A0BCAA974F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {265D18F4-7D43-5989-BC89-06A0BCAA974F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {265D18F4-7D43-5989-BC89-06A0BCAA974F}.Release|Any CPU.Build.0 = Release|Any CPU + {2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF}.Release|Any CPU.Build.0 = Release|Any CPU + {CF1DD579-8832-5D10-A776-BEA22477C9E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF1DD579-8832-5D10-A776-BEA22477C9E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF1DD579-8832-5D10-A776-BEA22477C9E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF1DD579-8832-5D10-A776-BEA22477C9E9}.Release|Any CPU.Build.0 = Release|Any CPU + {9DD2C1F3-D4B6-530E-907B-BFA80085311C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DD2C1F3-D4B6-530E-907B-BFA80085311C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DD2C1F3-D4B6-530E-907B-BFA80085311C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DD2C1F3-D4B6-530E-907B-BFA80085311C}.Release|Any CPU.Build.0 = Release|Any CPU + {7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A}.Release|Any CPU.Build.0 = Release|Any CPU + {D2F4B045-45B9-573C-8EA7-F639FADF6518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2F4B045-45B9-573C-8EA7-F639FADF6518}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2F4B045-45B9-573C-8EA7-F639FADF6518}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2F4B045-45B9-573C-8EA7-F639FADF6518}.Release|Any CPU.Build.0 = Release|Any CPU + {FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD}.Release|Any CPU.Build.0 = Release|Any CPU + {891EDEAF-E530-5CB1-B459-E526E563AF44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {891EDEAF-E530-5CB1-B459-E526E563AF44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {891EDEAF-E530-5CB1-B459-E526E563AF44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {891EDEAF-E530-5CB1-B459-E526E563AF44}.Release|Any CPU.Build.0 = Release|Any CPU + {7D80E495-7DE6-5093-AC05-650991082D96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D80E495-7DE6-5093-AC05-650991082D96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D80E495-7DE6-5093-AC05-650991082D96}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D80E495-7DE6-5093-AC05-650991082D96}.Release|Any CPU.Build.0 = Release|Any CPU + {0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A}.Release|Any CPU.Build.0 = Release|Any CPU + {434EB740-8EB9-56AA-B7C7-779322245497}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {434EB740-8EB9-56AA-B7C7-779322245497}.Debug|Any CPU.Build.0 = Debug|Any CPU + {434EB740-8EB9-56AA-B7C7-779322245497}.Release|Any CPU.ActiveCfg = Release|Any CPU + {434EB740-8EB9-56AA-B7C7-779322245497}.Release|Any CPU.Build.0 = Release|Any CPU + {BD4C1CC3-8493-5647-BDC9-9A9721595549}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD4C1CC3-8493-5647-BDC9-9A9721595549}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD4C1CC3-8493-5647-BDC9-9A9721595549}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD4C1CC3-8493-5647-BDC9-9A9721595549}.Release|Any CPU.Build.0 = Release|Any CPU + {F5D74715-01BD-530A-9234-2C8E8327CA7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F5D74715-01BD-530A-9234-2C8E8327CA7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5D74715-01BD-530A-9234-2C8E8327CA7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F5D74715-01BD-530A-9234-2C8E8327CA7C}.Release|Any CPU.Build.0 = Release|Any CPU + {5DB2DAD4-749D-5958-85A5-D416773EC7AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DB2DAD4-749D-5958-85A5-D416773EC7AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DB2DAD4-749D-5958-85A5-D416773EC7AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DB2DAD4-749D-5958-85A5-D416773EC7AD}.Release|Any CPU.Build.0 = Release|Any CPU + {2C644E8C-5731-566A-9208-25FF724E88CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C644E8C-5731-566A-9208-25FF724E88CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C644E8C-5731-566A-9208-25FF724E88CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C644E8C-5731-566A-9208-25FF724E88CF}.Release|Any CPU.Build.0 = Release|Any CPU + {FBAA3D74-4A5F-5F10-877F-C4AEDDD69656}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBAA3D74-4A5F-5F10-877F-C4AEDDD69656}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBAA3D74-4A5F-5F10-877F-C4AEDDD69656}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBAA3D74-4A5F-5F10-877F-C4AEDDD69656}.Release|Any CPU.Build.0 = Release|Any CPU + {D4DC4627-27B2-5162-BF64-821B7AD8837C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D4DC4627-27B2-5162-BF64-821B7AD8837C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4DC4627-27B2-5162-BF64-821B7AD8837C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4DC4627-27B2-5162-BF64-821B7AD8837C}.Release|Any CPU.Build.0 = Release|Any CPU + {38C61566-48F9-5D8E-9FC1-A1E81E71E5E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38C61566-48F9-5D8E-9FC1-A1E81E71E5E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38C61566-48F9-5D8E-9FC1-A1E81E71E5E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38C61566-48F9-5D8E-9FC1-A1E81E71E5E7}.Release|Any CPU.Build.0 = Release|Any CPU + {6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6}.Release|Any CPU.Build.0 = Release|Any CPU + {D9F26498-410D-5617-B810-BC58D172184D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9F26498-410D-5617-B810-BC58D172184D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9F26498-410D-5617-B810-BC58D172184D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9F26498-410D-5617-B810-BC58D172184D}.Release|Any CPU.Build.0 = Release|Any CPU + {6140569D-4784-53CE-98A2-54D8BD6D1745}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6140569D-4784-53CE-98A2-54D8BD6D1745}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6140569D-4784-53CE-98A2-54D8BD6D1745}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6140569D-4784-53CE-98A2-54D8BD6D1745}.Release|Any CPU.Build.0 = Release|Any CPU + {50274ADF-643D-5FEA-831C-2CB3DD2C6D30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50274ADF-643D-5FEA-831C-2CB3DD2C6D30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50274ADF-643D-5FEA-831C-2CB3DD2C6D30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50274ADF-643D-5FEA-831C-2CB3DD2C6D30}.Release|Any CPU.Build.0 = Release|Any CPU + {D60176B5-3B87-504D-BCAC-067BD9954A8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D60176B5-3B87-504D-BCAC-067BD9954A8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D60176B5-3B87-504D-BCAC-067BD9954A8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D60176B5-3B87-504D-BCAC-067BD9954A8F}.Release|Any CPU.Build.0 = Release|Any CPU + {3F743B8C-53C6-5520-B4AB-52C67179DD73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F743B8C-53C6-5520-B4AB-52C67179DD73}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F743B8C-53C6-5520-B4AB-52C67179DD73}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F743B8C-53C6-5520-B4AB-52C67179DD73}.Release|Any CPU.Build.0 = Release|Any CPU + {BD34A481-9816-51A7-BA6B-7272465F68C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD34A481-9816-51A7-BA6B-7272465F68C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD34A481-9816-51A7-BA6B-7272465F68C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD34A481-9816-51A7-BA6B-7272465F68C4}.Release|Any CPU.Build.0 = Release|Any CPU + {EAA4DB81-CBAA-573C-9C40-19F9551BE98B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAA4DB81-CBAA-573C-9C40-19F9551BE98B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAA4DB81-CBAA-573C-9C40-19F9551BE98B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAA4DB81-CBAA-573C-9C40-19F9551BE98B}.Release|Any CPU.Build.0 = Release|Any CPU + {879D5965-6D83-529C-A2F7-41E85045A7F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {879D5965-6D83-529C-A2F7-41E85045A7F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {879D5965-6D83-529C-A2F7-41E85045A7F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {879D5965-6D83-529C-A2F7-41E85045A7F0}.Release|Any CPU.Build.0 = Release|Any CPU + {45E6A177-140E-5C2C-AAC6-A2D662BEA5BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45E6A177-140E-5C2C-AAC6-A2D662BEA5BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45E6A177-140E-5C2C-AAC6-A2D662BEA5BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45E6A177-140E-5C2C-AAC6-A2D662BEA5BA}.Release|Any CPU.Build.0 = Release|Any CPU + {23CE30EB-406F-573D-BF3D-4281A6FE406F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23CE30EB-406F-573D-BF3D-4281A6FE406F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23CE30EB-406F-573D-BF3D-4281A6FE406F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23CE30EB-406F-573D-BF3D-4281A6FE406F}.Release|Any CPU.Build.0 = Release|Any CPU + {FA284264-B63E-5DC4-B2A8-A8D347A554D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA284264-B63E-5DC4-B2A8-A8D347A554D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA284264-B63E-5DC4-B2A8-A8D347A554D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA284264-B63E-5DC4-B2A8-A8D347A554D1}.Release|Any CPU.Build.0 = Release|Any CPU + {EAD55F0E-0895-5BE5-8273-216780F99C1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAD55F0E-0895-5BE5-8273-216780F99C1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAD55F0E-0895-5BE5-8273-216780F99C1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAD55F0E-0895-5BE5-8273-216780F99C1B}.Release|Any CPU.Build.0 = Release|Any CPU + {6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4}.Release|Any CPU.Build.0 = Release|Any CPU + {EF443847-D7D0-5457-85D8-4382BF34931F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF443847-D7D0-5457-85D8-4382BF34931F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF443847-D7D0-5457-85D8-4382BF34931F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF443847-D7D0-5457-85D8-4382BF34931F}.Release|Any CPU.Build.0 = Release|Any CPU + {C2C3712D-B2E1-5F74-A3F9-0D912381A2CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2C3712D-B2E1-5F74-A3F9-0D912381A2CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2C3712D-B2E1-5F74-A3F9-0D912381A2CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2C3712D-B2E1-5F74-A3F9-0D912381A2CF}.Release|Any CPU.Build.0 = Release|Any CPU + {F28F85B6-F4FD-5785-AF89-58F8159621E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F28F85B6-F4FD-5785-AF89-58F8159621E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F28F85B6-F4FD-5785-AF89-58F8159621E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F28F85B6-F4FD-5785-AF89-58F8159621E8}.Release|Any CPU.Build.0 = Release|Any CPU + {563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F}.Release|Any CPU.Build.0 = Release|Any CPU + {8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986}.Release|Any CPU.Build.0 = Release|Any CPU + {D8858828-8495-5CBB-A7BB-97C058811A13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8858828-8495-5CBB-A7BB-97C058811A13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8858828-8495-5CBB-A7BB-97C058811A13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8858828-8495-5CBB-A7BB-97C058811A13}.Release|Any CPU.Build.0 = Release|Any CPU + {671D8C13-26F5-52C1-80F1-EFB556E12B46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {671D8C13-26F5-52C1-80F1-EFB556E12B46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {671D8C13-26F5-52C1-80F1-EFB556E12B46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {671D8C13-26F5-52C1-80F1-EFB556E12B46}.Release|Any CPU.Build.0 = Release|Any CPU + {335A63A0-01E4-5230-8741-5AE90F371B82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {335A63A0-01E4-5230-8741-5AE90F371B82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {335A63A0-01E4-5230-8741-5AE90F371B82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {335A63A0-01E4-5230-8741-5AE90F371B82}.Release|Any CPU.Build.0 = Release|Any CPU + {79481E86-D2CA-5472-8EDD-D0219F5932AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79481E86-D2CA-5472-8EDD-D0219F5932AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79481E86-D2CA-5472-8EDD-D0219F5932AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79481E86-D2CA-5472-8EDD-D0219F5932AC}.Release|Any CPU.Build.0 = Release|Any CPU + {69F7F8D4-6E7E-5EAA-B36A-273B223B3E30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69F7F8D4-6E7E-5EAA-B36A-273B223B3E30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69F7F8D4-6E7E-5EAA-B36A-273B223B3E30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69F7F8D4-6E7E-5EAA-B36A-273B223B3E30}.Release|Any CPU.Build.0 = Release|Any CPU + {A649555C-AAE1-59A8-A7BA-C118366386DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A649555C-AAE1-59A8-A7BA-C118366386DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A649555C-AAE1-59A8-A7BA-C118366386DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A649555C-AAE1-59A8-A7BA-C118366386DD}.Release|Any CPU.Build.0 = Release|Any CPU + {22C216D9-2A03-5C40-9A18-E30C6FDF4D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22C216D9-2A03-5C40-9A18-E30C6FDF4D48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22C216D9-2A03-5C40-9A18-E30C6FDF4D48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22C216D9-2A03-5C40-9A18-E30C6FDF4D48}.Release|Any CPU.Build.0 = Release|Any CPU + {6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440}.Release|Any CPU.Build.0 = Release|Any CPU + {91F25B73-0A0C-57B6-89C2-B13E15F1B281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91F25B73-0A0C-57B6-89C2-B13E15F1B281}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91F25B73-0A0C-57B6-89C2-B13E15F1B281}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91F25B73-0A0C-57B6-89C2-B13E15F1B281}.Release|Any CPU.Build.0 = Release|Any CPU + {F66F5DFE-3B8F-5B43-89DE-4A15B994290B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F66F5DFE-3B8F-5B43-89DE-4A15B994290B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F66F5DFE-3B8F-5B43-89DE-4A15B994290B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F66F5DFE-3B8F-5B43-89DE-4A15B994290B}.Release|Any CPU.Build.0 = Release|Any CPU + {C165A810-99AA-5C2E-99D9-950C4ABD5C63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C165A810-99AA-5C2E-99D9-950C4ABD5C63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C165A810-99AA-5C2E-99D9-950C4ABD5C63}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C165A810-99AA-5C2E-99D9-950C4ABD5C63}.Release|Any CPU.Build.0 = Release|Any CPU + {F2436D73-0E94-50F0-9C02-28CE3910EB21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2436D73-0E94-50F0-9C02-28CE3910EB21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2436D73-0E94-50F0-9C02-28CE3910EB21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2436D73-0E94-50F0-9C02-28CE3910EB21}.Release|Any CPU.Build.0 = Release|Any CPU + {1D8E9087-584B-5341-BFAA-EEB046E530AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D8E9087-584B-5341-BFAA-EEB046E530AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D8E9087-584B-5341-BFAA-EEB046E530AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D8E9087-584B-5341-BFAA-EEB046E530AF}.Release|Any CPU.Build.0 = Release|Any CPU + {0D72E841-4F53-5ED8-864B-53AA0DFA5978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D72E841-4F53-5ED8-864B-53AA0DFA5978}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D72E841-4F53-5ED8-864B-53AA0DFA5978}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D72E841-4F53-5ED8-864B-53AA0DFA5978}.Release|Any CPU.Build.0 = Release|Any CPU + {E5B88985-0693-51FC-8AB9-7C3728722618}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5B88985-0693-51FC-8AB9-7C3728722618}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5B88985-0693-51FC-8AB9-7C3728722618}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5B88985-0693-51FC-8AB9-7C3728722618}.Release|Any CPU.Build.0 = Release|Any CPU + {78353588-38CA-5CCC-86EB-1513FB86FB4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78353588-38CA-5CCC-86EB-1513FB86FB4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78353588-38CA-5CCC-86EB-1513FB86FB4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78353588-38CA-5CCC-86EB-1513FB86FB4B}.Release|Any CPU.Build.0 = Release|Any CPU + {8A43DF4F-CBD4-5481-A113-84EBE37CA375}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A43DF4F-CBD4-5481-A113-84EBE37CA375}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A43DF4F-CBD4-5481-A113-84EBE37CA375}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A43DF4F-CBD4-5481-A113-84EBE37CA375}.Release|Any CPU.Build.0 = Release|Any CPU + {37A03641-FA63-5896-B432-EF26DC11F6CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37A03641-FA63-5896-B432-EF26DC11F6CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37A03641-FA63-5896-B432-EF26DC11F6CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37A03641-FA63-5896-B432-EF26DC11F6CB}.Release|Any CPU.Build.0 = Release|Any CPU + {16C1069D-EBC9-53F4-909E-6EAF374E7E8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16C1069D-EBC9-53F4-909E-6EAF374E7E8A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16C1069D-EBC9-53F4-909E-6EAF374E7E8A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16C1069D-EBC9-53F4-909E-6EAF374E7E8A}.Release|Any CPU.Build.0 = Release|Any CPU + {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB39A5CF-2689-5002-8A70-CFB0F473CCDE}.Release|Any CPU.Build.0 = Release|Any CPU + {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13D2C70F-86E5-52EB-9A53-F266E471A5DC}.Release|Any CPU.Build.0 = Release|Any CPU + {DC957128-193A-58F3-B987-481370A43953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC957128-193A-58F3-B987-481370A43953}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC957128-193A-58F3-B987-481370A43953}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC957128-193A-58F3-B987-481370A43953}.Release|Any CPU.Build.0 = Release|Any CPU + {05430EEB-6E1F-5396-A521-EE455630F730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05430EEB-6E1F-5396-A521-EE455630F730}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05430EEB-6E1F-5396-A521-EE455630F730}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05430EEB-6E1F-5396-A521-EE455630F730}.Release|Any CPU.Build.0 = Release|Any CPU + {13AAE009-19FD-5093-B154-6FFC4C34B72C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13AAE009-19FD-5093-B154-6FFC4C34B72C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13AAE009-19FD-5093-B154-6FFC4C34B72C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13AAE009-19FD-5093-B154-6FFC4C34B72C}.Release|Any CPU.Build.0 = Release|Any CPU + {056D1311-0882-5239-9D21-60FC186AB7F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {056D1311-0882-5239-9D21-60FC186AB7F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {056D1311-0882-5239-9D21-60FC186AB7F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {056D1311-0882-5239-9D21-60FC186AB7F8}.Release|Any CPU.Build.0 = Release|Any CPU + {D99F972A-76D0-57CF-908D-FB28750FE989}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D99F972A-76D0-57CF-908D-FB28750FE989}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D99F972A-76D0-57CF-908D-FB28750FE989}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D99F972A-76D0-57CF-908D-FB28750FE989}.Release|Any CPU.Build.0 = Release|Any CPU + {66D435A0-4D37-50EA-AC48-F557BD794E8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {66D435A0-4D37-50EA-AC48-F557BD794E8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {66D435A0-4D37-50EA-AC48-F557BD794E8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {66D435A0-4D37-50EA-AC48-F557BD794E8D}.Release|Any CPU.Build.0 = Release|Any CPU + {BA153C94-5786-5DFB-BF46-5456F314640D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA153C94-5786-5DFB-BF46-5456F314640D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA153C94-5786-5DFB-BF46-5456F314640D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA153C94-5786-5DFB-BF46-5456F314640D}.Release|Any CPU.Build.0 = Release|Any CPU + {59194DA8-0065-5FA5-9E4C-9F1D1A141D0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59194DA8-0065-5FA5-9E4C-9F1D1A141D0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59194DA8-0065-5FA5-9E4C-9F1D1A141D0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59194DA8-0065-5FA5-9E4C-9F1D1A141D0D}.Release|Any CPU.Build.0 = Release|Any CPU + {174F6B92-7B4B-5364-9FFA-B0922315E394}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {174F6B92-7B4B-5364-9FFA-B0922315E394}.Debug|Any CPU.Build.0 = Debug|Any CPU + {174F6B92-7B4B-5364-9FFA-B0922315E394}.Release|Any CPU.ActiveCfg = Release|Any CPU + {174F6B92-7B4B-5364-9FFA-B0922315E394}.Release|Any CPU.Build.0 = Release|Any CPU + {3D5B082E-6F16-5078-B163-57F545C6441D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D5B082E-6F16-5078-B163-57F545C6441D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D5B082E-6F16-5078-B163-57F545C6441D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D5B082E-6F16-5078-B163-57F545C6441D}.Release|Any CPU.Build.0 = Release|Any CPU + {D52682FC-295E-53A2-B101-0BC60D53BEF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D52682FC-295E-53A2-B101-0BC60D53BEF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D52682FC-295E-53A2-B101-0BC60D53BEF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D52682FC-295E-53A2-B101-0BC60D53BEF1}.Release|Any CPU.Build.0 = Release|Any CPU + {A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9}.Release|Any CPU.Build.0 = Release|Any CPU + {27C02428-144F-598E-A2B3-D74AB3A60BC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27C02428-144F-598E-A2B3-D74AB3A60BC2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27C02428-144F-598E-A2B3-D74AB3A60BC2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27C02428-144F-598E-A2B3-D74AB3A60BC2}.Release|Any CPU.Build.0 = Release|Any CPU + {099EB392-DF89-5A9E-B1CC-7B60A16C61B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {099EB392-DF89-5A9E-B1CC-7B60A16C61B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {099EB392-DF89-5A9E-B1CC-7B60A16C61B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {099EB392-DF89-5A9E-B1CC-7B60A16C61B5}.Release|Any CPU.Build.0 = Release|Any CPU + {B4897CA0-8501-586C-AFA3-502ECDCB58FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4897CA0-8501-586C-AFA3-502ECDCB58FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4897CA0-8501-586C-AFA3-502ECDCB58FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4897CA0-8501-586C-AFA3-502ECDCB58FD}.Release|Any CPU.Build.0 = Release|Any CPU + {88F0AAA9-7AB4-5B38-9132-675E0CF0E032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88F0AAA9-7AB4-5B38-9132-675E0CF0E032}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88F0AAA9-7AB4-5B38-9132-675E0CF0E032}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88F0AAA9-7AB4-5B38-9132-675E0CF0E032}.Release|Any CPU.Build.0 = Release|Any CPU + {509995C7-1637-5E0A-8F11-0F5E54B77209}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {509995C7-1637-5E0A-8F11-0F5E54B77209}.Debug|Any CPU.Build.0 = Debug|Any CPU + {509995C7-1637-5E0A-8F11-0F5E54B77209}.Release|Any CPU.ActiveCfg = Release|Any CPU + {509995C7-1637-5E0A-8F11-0F5E54B77209}.Release|Any CPU.Build.0 = Release|Any CPU + {DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1}.Release|Any CPU.Build.0 = Release|Any CPU + {5AA07819-E820-54D5-8A68-69F791EDC4E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AA07819-E820-54D5-8A68-69F791EDC4E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AA07819-E820-54D5-8A68-69F791EDC4E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AA07819-E820-54D5-8A68-69F791EDC4E4}.Release|Any CPU.Build.0 = Release|Any CPU + {BCB84E5F-2F49-53C9-8E91-EAA790F511B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCB84E5F-2F49-53C9-8E91-EAA790F511B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCB84E5F-2F49-53C9-8E91-EAA790F511B8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCB84E5F-2F49-53C9-8E91-EAA790F511B8}.Release|Any CPU.Build.0 = Release|Any CPU + {B7CA7A16-AAFB-5A8F-B598-0284ED7DF744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7CA7A16-AAFB-5A8F-B598-0284ED7DF744}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7CA7A16-AAFB-5A8F-B598-0284ED7DF744}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7CA7A16-AAFB-5A8F-B598-0284ED7DF744}.Release|Any CPU.Build.0 = Release|Any CPU + {2E7B8D21-CAD8-5844-B59F-7A487E6594DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E7B8D21-CAD8-5844-B59F-7A487E6594DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E7B8D21-CAD8-5844-B59F-7A487E6594DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E7B8D21-CAD8-5844-B59F-7A487E6594DD}.Release|Any CPU.Build.0 = Release|Any CPU + {F30EF61D-A7FC-5689-A06F-42A152CF7393}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F30EF61D-A7FC-5689-A06F-42A152CF7393}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F30EF61D-A7FC-5689-A06F-42A152CF7393}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F30EF61D-A7FC-5689-A06F-42A152CF7393}.Release|Any CPU.Build.0 = Release|Any CPU + {96610609-85C7-5F09-B765-A86463A8DBDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96610609-85C7-5F09-B765-A86463A8DBDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96610609-85C7-5F09-B765-A86463A8DBDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96610609-85C7-5F09-B765-A86463A8DBDE}.Release|Any CPU.Build.0 = Release|Any CPU + {E5A69860-1704-5FB1-BFA3-5872182D4829}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5A69860-1704-5FB1-BFA3-5872182D4829}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5A69860-1704-5FB1-BFA3-5872182D4829}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5A69860-1704-5FB1-BFA3-5872182D4829}.Release|Any CPU.Build.0 = Release|Any CPU + {1F5FFF7C-AF58-5C3E-9981-EE5E978426E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1F5FFF7C-AF58-5C3E-9981-EE5E978426E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F5FFF7C-AF58-5C3E-9981-EE5E978426E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F5FFF7C-AF58-5C3E-9981-EE5E978426E8}.Release|Any CPU.Build.0 = Release|Any CPU + {51652C28-0583-5556-A941-D16D99F97B82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51652C28-0583-5556-A941-D16D99F97B82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51652C28-0583-5556-A941-D16D99F97B82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51652C28-0583-5556-A941-D16D99F97B82}.Release|Any CPU.Build.0 = Release|Any CPU + {068138BD-177D-5359-B0DD-A369BB607E95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {068138BD-177D-5359-B0DD-A369BB607E95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {068138BD-177D-5359-B0DD-A369BB607E95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {068138BD-177D-5359-B0DD-A369BB607E95}.Release|Any CPU.Build.0 = Release|Any CPU + {91306E2D-A310-50D1-B64F-47A158D42085}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91306E2D-A310-50D1-B64F-47A158D42085}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91306E2D-A310-50D1-B64F-47A158D42085}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91306E2D-A310-50D1-B64F-47A158D42085}.Release|Any CPU.Build.0 = Release|Any CPU + {F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93}.Release|Any CPU.Build.0 = Release|Any CPU + {59234A8C-D502-5965-AAFC-19739C833885}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59234A8C-D502-5965-AAFC-19739C833885}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59234A8C-D502-5965-AAFC-19739C833885}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59234A8C-D502-5965-AAFC-19739C833885}.Release|Any CPU.Build.0 = Release|Any CPU + {2CE72B3D-4D13-500A-A44D-76029069C773}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CE72B3D-4D13-500A-A44D-76029069C773}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CE72B3D-4D13-500A-A44D-76029069C773}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CE72B3D-4D13-500A-A44D-76029069C773}.Release|Any CPU.Build.0 = Release|Any CPU + {422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF}.Release|Any CPU.Build.0 = Release|Any CPU + {8F7505CD-473C-590A-8851-FA762AB5E214}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F7505CD-473C-590A-8851-FA762AB5E214}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F7505CD-473C-590A-8851-FA762AB5E214}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F7505CD-473C-590A-8851-FA762AB5E214}.Release|Any CPU.Build.0 = Release|Any CPU + {B2ABA214-83FB-5E9E-8AD4-2D54E579310A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B2ABA214-83FB-5E9E-8AD4-2D54E579310A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2ABA214-83FB-5E9E-8AD4-2D54E579310A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B2ABA214-83FB-5E9E-8AD4-2D54E579310A}.Release|Any CPU.Build.0 = Release|Any CPU + {3EC6A343-75E8-511F-A767-8FAB9EC79A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EC6A343-75E8-511F-A767-8FAB9EC79A62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EC6A343-75E8-511F-A767-8FAB9EC79A62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EC6A343-75E8-511F-A767-8FAB9EC79A62}.Release|Any CPU.Build.0 = Release|Any CPU + {37DF1BF6-AD9C-59A2-8F10-512ABE804ED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37DF1BF6-AD9C-59A2-8F10-512ABE804ED3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37DF1BF6-AD9C-59A2-8F10-512ABE804ED3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37DF1BF6-AD9C-59A2-8F10-512ABE804ED3}.Release|Any CPU.Build.0 = Release|Any CPU + {A93B89A8-E39D-560B-82E8-96EAEA545A28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A93B89A8-E39D-560B-82E8-96EAEA545A28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A93B89A8-E39D-560B-82E8-96EAEA545A28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A93B89A8-E39D-560B-82E8-96EAEA545A28}.Release|Any CPU.Build.0 = Release|Any CPU + {DF5A6010-D88B-5327-8E1A-74F2A716D340}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF5A6010-D88B-5327-8E1A-74F2A716D340}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF5A6010-D88B-5327-8E1A-74F2A716D340}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF5A6010-D88B-5327-8E1A-74F2A716D340}.Release|Any CPU.Build.0 = Release|Any CPU + {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23}.Release|Any CPU.Build.0 = Release|Any CPU + {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B143BD73-A4D7-51F3-804E-03CE8C6CF639}.Release|Any CPU.Build.0 = Release|Any CPU + {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF}.Release|Any CPU.Build.0 = Release|Any CPU + {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3}.Release|Any CPU.Build.0 = Release|Any CPU + {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B}.Release|Any CPU.Build.0 = Release|Any CPU + {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2063D4CC-6C01-5693-B0B9-1376FB928E43}.Release|Any CPU.Build.0 = Release|Any CPU + {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0A0E3D1-FF2E-5005-B619-4523C2A2C955}.Release|Any CPU.Build.0 = Release|Any CPU + {004D507B-32A2-5704-8747-412E7B8EFAE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {004D507B-32A2-5704-8747-412E7B8EFAE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {004D507B-32A2-5704-8747-412E7B8EFAE4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {004D507B-32A2-5704-8747-412E7B8EFAE4}.Release|Any CPU.Build.0 = Release|Any CPU + {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0}.Release|Any CPU.Build.0 = Release|Any CPU + {62186A00-3E04-51EF-9497-258A973D6E24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {62186A00-3E04-51EF-9497-258A973D6E24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62186A00-3E04-51EF-9497-258A973D6E24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {62186A00-3E04-51EF-9497-258A973D6E24}.Release|Any CPU.Build.0 = Release|Any CPU + {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81DADA98-669F-5B5B-8C31-EA3B5CF77380}.Release|Any CPU.Build.0 = Release|Any CPU + {768155E4-8D91-5A02-A006-2B357C033E25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {768155E4-8D91-5A02-A006-2B357C033E25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {768155E4-8D91-5A02-A006-2B357C033E25}.Release|Any CPU.ActiveCfg = Release|Any CPU + {768155E4-8D91-5A02-A006-2B357C033E25}.Release|Any CPU.Build.0 = Release|Any CPU + {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79}.Release|Any CPU.Build.0 = Release|Any CPU + {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07}.Release|Any CPU.Build.0 = Release|Any CPU + {BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270}.Release|Any CPU.Build.0 = Release|Any CPU + {3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7}.Release|Any CPU.Build.0 = Release|Any CPU + {5682D20E-74D9-50D6-B400-8EE39D2ADF42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5682D20E-74D9-50D6-B400-8EE39D2ADF42}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5682D20E-74D9-50D6-B400-8EE39D2ADF42}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5682D20E-74D9-50D6-B400-8EE39D2ADF42}.Release|Any CPU.Build.0 = Release|Any CPU + {73F03316-B1CB-55DC-A3D6-9C9758CFFFEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73F03316-B1CB-55DC-A3D6-9C9758CFFFEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73F03316-B1CB-55DC-A3D6-9C9758CFFFEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73F03316-B1CB-55DC-A3D6-9C9758CFFFEB}.Release|Any CPU.Build.0 = Release|Any CPU + {ADDC25AD-9056-59DE-95EE-453A90D2D519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADDC25AD-9056-59DE-95EE-453A90D2D519}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADDC25AD-9056-59DE-95EE-453A90D2D519}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADDC25AD-9056-59DE-95EE-453A90D2D519}.Release|Any CPU.Build.0 = Release|Any CPU + {A002946E-4486-51F0-A132-2654E3DDB4E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A002946E-4486-51F0-A132-2654E3DDB4E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A002946E-4486-51F0-A132-2654E3DDB4E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A002946E-4486-51F0-A132-2654E3DDB4E9}.Release|Any CPU.Build.0 = Release|Any CPU + {D84DFC26-3A6B-539F-822D-CE326F7DB9B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D84DFC26-3A6B-539F-822D-CE326F7DB9B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D84DFC26-3A6B-539F-822D-CE326F7DB9B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D84DFC26-3A6B-539F-822D-CE326F7DB9B4}.Release|Any CPU.Build.0 = Release|Any CPU + {07CBEBEF-B614-5A84-BFEB-A8548E20F1E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07CBEBEF-B614-5A84-BFEB-A8548E20F1E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07CBEBEF-B614-5A84-BFEB-A8548E20F1E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07CBEBEF-B614-5A84-BFEB-A8548E20F1E9}.Release|Any CPU.Build.0 = Release|Any CPU + {F3495690-6B86-5FEC-BBB4-DD899C2E419E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3495690-6B86-5FEC-BBB4-DD899C2E419E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3495690-6B86-5FEC-BBB4-DD899C2E419E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3495690-6B86-5FEC-BBB4-DD899C2E419E}.Release|Any CPU.Build.0 = Release|Any CPU + {5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A}.Release|Any CPU.Build.0 = Release|Any CPU + {D3BA9C21-1337-5091-AD41-ABD11C4B150D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3BA9C21-1337-5091-AD41-ABD11C4B150D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3BA9C21-1337-5091-AD41-ABD11C4B150D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3BA9C21-1337-5091-AD41-ABD11C4B150D}.Release|Any CPU.Build.0 = Release|Any CPU + {849DA55E-D3D1-5E35-A339-B1AC4590E0A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {849DA55E-D3D1-5E35-A339-B1AC4590E0A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {849DA55E-D3D1-5E35-A339-B1AC4590E0A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {849DA55E-D3D1-5E35-A339-B1AC4590E0A3}.Release|Any CPU.Build.0 = Release|Any CPU + {CEE84738-20C1-5800-B982-E331652C3917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CEE84738-20C1-5800-B982-E331652C3917}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CEE84738-20C1-5800-B982-E331652C3917}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CEE84738-20C1-5800-B982-E331652C3917}.Release|Any CPU.Build.0 = Release|Any CPU + {B118588F-2F12-5CA8-8EED-426A7D34FF9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B118588F-2F12-5CA8-8EED-426A7D34FF9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B118588F-2F12-5CA8-8EED-426A7D34FF9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B118588F-2F12-5CA8-8EED-426A7D34FF9A}.Release|Any CPU.Build.0 = Release|Any CPU + {7D3BAFD9-4120-5A6A-B215-10AB461844EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D3BAFD9-4120-5A6A-B215-10AB461844EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D3BAFD9-4120-5A6A-B215-10AB461844EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D3BAFD9-4120-5A6A-B215-10AB461844EB}.Release|Any CPU.Build.0 = Release|Any CPU + {27196784-FFEA-59AB-8F26-3840EDF6C831}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27196784-FFEA-59AB-8F26-3840EDF6C831}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27196784-FFEA-59AB-8F26-3840EDF6C831}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27196784-FFEA-59AB-8F26-3840EDF6C831}.Release|Any CPU.Build.0 = Release|Any CPU + {69AE1332-70C7-501D-A64E-F769F52B2449}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69AE1332-70C7-501D-A64E-F769F52B2449}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69AE1332-70C7-501D-A64E-F769F52B2449}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69AE1332-70C7-501D-A64E-F769F52B2449}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {8B8EE856-DA24-5594-8E25-C9D70E26C011} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} + {808A70AA-83E2-5AD8-8519-CB6E27E99E66} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} + {D86F0DB2-577A-5B46-8B4A-4D492CAB32D7} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} + {D0FCFD53-225B-57FA-9073-6A88970B3E4F} = {C1754E05-6E9B-5DA3-9F48-7FA73BA7C23B} + {B7141C87-33DB-5F99-8B8B-0C61725C2D6F} = {8B8EE856-DA24-5594-8E25-C9D70E26C011} + {6C186BD5-9A4D-5318-8AF8-F1B7AE48D812} = {8B8EE856-DA24-5594-8E25-C9D70E26C011} + {B7FBC156-D7DE-5962-BFC8-40F94D6C00F9} = {808A70AA-83E2-5AD8-8519-CB6E27E99E66} + {112CFB30-3731-54C5-8E9F-7C2CC75C9B67} = {D86F0DB2-577A-5B46-8B4A-4D492CAB32D7} + {51BA43C0-6861-5B57-A837-B6CECF8D0257} = {D0FCFD53-225B-57FA-9073-6A88970B3E4F} + {2E4D25DA-6B5D-5A5F-9F61-CDBF1DBB311D} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} + {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} + {A80991C3-5D9B-5C12-92DE-691A7399F660} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} + {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} = {B30F10B5-2A8C-56C8-9D19-38190F2EC627} + {7002B619-1F2A-5393-B348-70CDAC639748} = {2E4D25DA-6B5D-5A5F-9F61-CDBF1DBB311D} + {6D955BD2-7D9B-5495-9153-509864CF7096} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} + {0EB72CBF-4405-5B0C-AF18-26764A0DB489} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} + {45DE9CF0-B55D-550D-8005-504FBF0F3CDF} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} + {FED2097B-DF4E-5ACA-A5E4-9B3AC770BBF2} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} + {06AE06C1-E499-590D-88C0-E860AD7A7A32} = {12FC57D8-ADE7-5756-85D4-AAABC06FAA0A} + {F07AE928-89B5-57F0-921C-3B97A376FF95} = {A80991C3-5D9B-5C12-92DE-691A7399F660} + {DF2C5848-16B4-54E1-A976-9C548AAF3077} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {6B905D2C-43E2-5637-9E98-393E5A3A1903} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {9477476B-34BB-5A40-BAB2-ABA6DBFD9733} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {9FA8DD10-9178-588E-AC7E-F423FB235DA0} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {58243870-C97F-5F26-B86F-BF1C0863BA0B} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {452CFFEA-8914-5128-AC23-65C969E53523} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {343BB1E8-DB77-52DA-B2E2-406C72088E34} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {6E0B7B8D-58FF-5297-9497-5286822D5483} = {FC47E687-717F-5EF5-AE4E-EEB1B86E46FF} + {EBE264E0-5321-50D4-97D7-27D2068685AA} = {7BDA5071-6A44-50AC-B3BF-075FA2B28DFD} + {CEA98078-2A40-5BD7-A10B-D41932877106} = {7BDA5071-6A44-50AC-B3BF-075FA2B28DFD} + {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} = {7BDA5071-6A44-50AC-B3BF-075FA2B28DFD} + {E2189FEA-63C0-5828-A60E-6F4D2B4DC724} = {EBE264E0-5321-50D4-97D7-27D2068685AA} + {8609324D-8A33-5C72-843C-C9CDF861F6B0} = {CEA98078-2A40-5BD7-A10B-D41932877106} + {15346A13-8152-5B25-AA03-37AF5A883B94} = {CEA98078-2A40-5BD7-A10B-D41932877106} + {A44B07A2-3C46-5AEF-9278-FC35BF3D020F} = {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} + {AC5584D7-5085-5ED3-840C-0B82D7D2606A} = {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} + {EEFF9AAC-ED84-55BF-8963-F5422023E379} = {093AF0FF-6681-598B-8B09-AB6DD8FEC4A5} + {F28A412B-CA0F-515B-BFF5-A258C78E41D4} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} + {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} + {F8F38682-4EB1-59F7-86C3-5464582178A1} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} + {CC9FE15F-1FAB-5208-8565-F3811229EC86} = {9682BDC3-495E-5D69-AEF6-08F675D6896B} + {C011DDAB-DD11-5213-8857-437320BE11C2} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} + {8ECC05DA-F183-5849-8840-D7DCD7E80819} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} + {2A7DBD4D-B339-5CBA-889F-358076B03D58} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} + {4FC403CF-B5CE-53FE-9DD6-E4EA1B55A866} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} + {ECC3FD89-64D0-5048-A6E8-44470269D172} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} + {7200949F-B6B8-5857-9ECC-F43FA9C03A44} = {F28A412B-CA0F-515B-BFF5-A258C78E41D4} + {D367AE34-6CDE-5367-AE59-D9D037149B00} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} + {147ED816-086E-5914-ACF0-4E30516BF50C} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} + {80561E59-C6A9-5F30-8BD2-053866ADBEE9} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} + {4149C8AA-1BE2-5722-8114-8F1928B8B3F0} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} + {27982DF8-303D-5C8C-8595-FEFA9033F98A} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} + {0E033FF7-A9B0-5FEA-9201-C6902D3A1DC6} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} + {E41F4F80-1D92-59D8-9F97-48BF0BBAD093} = {CA93333F-B07B-5C2F-BB5A-B02A27EC6C99} + {E71D7DB0-F816-5D1F-B86A-E01E806D7B12} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {EEA41C38-BC80-5A6A-9DC5-66B3DB7FE01B} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {EC0ED92D-3382-5E8C-BD60-FBDE461A2C5D} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {B318A6FB-EBF7-5061-85B2-7542D71D226B} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {5671223D-C370-5DD1-98D6-D27C3CA6A602} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {EE2D63D4-B7CA-5933-BE1F-05AABF69703E} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {A83FA14F-39A9-57EF-A49D-3EC86731F56E} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {AB83BC75-CF32-506D-9B8A-EBBDD2C28A56} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {3E514FD3-4036-51D5-976B-CD18121684BD} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {C10EF177-5C79-5A55-AE28-360DAB3D252C} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {07FD7BF7-7756-5854-8DDB-41478A34BB64} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {508E13BB-305B-58B8-9F2E-E9759874DF0A} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {6778FAEB-4621-54D3-BF75-0FDB99C6751D} = {F8F38682-4EB1-59F7-86C3-5464582178A1} + {8DCF30E6-164B-55D5-A003-0A4D890A4492} = {CC9FE15F-1FAB-5208-8565-F3811229EC86} + {622E0872-E547-5108-92BB-AE38EFB35E5A} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} + {C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} + {66839ADE-60D3-54EB-8BAB-304B9B423C25} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} + {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} = {13FB3AA9-46DD-52F5-B76A-60A506410DCF} + {38E42693-FC3C-569F-909A-B24AD24AD1DA} = {622E0872-E547-5108-92BB-AE38EFB35E5A} + {0192EA27-7AE0-5952-B74A-32CF87973F79} = {622E0872-E547-5108-92BB-AE38EFB35E5A} + {E8A66716-1110-5DB7-81B3-8D2F403419D1} = {622E0872-E547-5108-92BB-AE38EFB35E5A} + {980E3CD4-3D1E-55B0-9D46-3944D82B1506} = {622E0872-E547-5108-92BB-AE38EFB35E5A} + {0C89A31F-44DE-59E0-843E-6608861D032B} = {622E0872-E547-5108-92BB-AE38EFB35E5A} + {72F73293-EFAC-5D27-911E-E6752D9E96FB} = {C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7} + {0BFFB8BD-F2CB-56DF-9547-7C89DF4F4B52} = {C4D043EE-DA9E-5F8F-A561-1F2E7B195BF7} + {F0011F9C-EF86-578B-B25C-DFBFD8B2D137} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} + {18566A49-CB0D-5662-AB0E-22DE76024FE9} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} + {68D84C0C-5272-5673-B8BF-1D5424885EC8} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} + {D36617C5-65AC-578F-8139-DF3D0BD91E55} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} + {731333C9-6F41-5AD4-9B59-C3FAEE2A31A0} = {66839ADE-60D3-54EB-8BAB-304B9B423C25} + {4C4A8491-4950-51C3-A134-89DEA080AFCF} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {EF039F88-3A55-5F6F-A7F7-DC91AAF85B82} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {841F79A2-944F-5807-AB6A-1BFF74278DB4} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {501C9952-398B-503E-8C13-B67848D9DBB1} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {30593F8A-492A-5484-BE89-858A29FE5A58} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {80590588-9B02-52C7-B783-F3C6B0A2C023} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {3611A8A7-BCBA-58AC-905C-420D1018D814} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {E6A1E48D-E008-5DC1-BDB8-40B23D5CCF2D} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {82ACA55C-69E9-5488-9383-26C6C2FEE1B0} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {5CE0902E-68CA-536E-AAC5-58041DDA1730} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {869157C1-588F-531E-BFD3-5D78FD91BC99} = {A9571EDE-BA3F-5E26-84E9-649A5EA02C55} + {BF6F75A1-C290-5F91-9E7E-427932080486} = {9E7391C6-F886-5F94-A0DF-3D42C0688136} + {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} = {9E7391C6-F886-5F94-A0DF-3D42C0688136} + {B330A47C-BCA1-5406-B432-56115A665839} = {BF6F75A1-C290-5F91-9E7E-427932080486} + {689E3E97-E53C-5A3D-8938-0587D6B21CD1} = {BF6F75A1-C290-5F91-9E7E-427932080486} + {7AA23462-E017-562D-9463-8C5B750E9496} = {BF6F75A1-C290-5F91-9E7E-427932080486} + {08D3BB86-4F4B-5C8B-B343-2207C0FA03CE} = {BF6F75A1-C290-5F91-9E7E-427932080486} + {CBC0B7D5-F744-5F3B-8EC5-A987D3D3021C} = {BF6F75A1-C290-5F91-9E7E-427932080486} + {2B5F7701-FBA9-5DC0-B456-D8E267CD0C2C} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} + {0FAB272B-4502-5AE8-8B93-828EA37BE954} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} + {EB1D08E3-DB6B-5D04-8ABA-3B0DC602479F} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} + {B11C615A-8910-5102-8841-D3AC7BF7D63D} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} + {ACC1D304-D3F8-55B7-B819-78FFA1AAD3EB} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} + {5E92A1DF-1B82-5B8D-B6A0-40B362A7230F} = {05EC3129-9EDA-58C4-964B-E263C0D2F2C4} + {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} = {A88F9635-0E95-506D-8AE1-670D45B847BD} + {50708606-307A-5BED-AF2D-8FDCB9C05220} = {A88F9635-0E95-506D-8AE1-670D45B847BD} + {6FFD945A-2042-5A65-9021-BF77FB66C3A9} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {C41CA6D1-6D61-5210-B33C-4ED58D96C319} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {28467D65-21AF-5711-8DA3-7EB8C258E8F9} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {A4A8CF8E-6CE7-5384-8756-71838B0DD5E0} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {7E648DEF-9BFA-5E59-B4BD-3518CD63C833} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {EA34E87C-D188-5ED7-A221-01D1677F8657} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {6BD4B5F7-8974-5010-B9F6-53CB24DE6C06} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {95AD2F0E-8D9D-541C-9E08-4DE9C89B867F} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {EA4F9B01-0644-534A-AA8D-81B5E2BD3A31} = {253E1793-19BF-56D0-8F84-D3B3B3F88BFD} + {82362C0E-5A23-51EC-A539-38DC2C8B18C6} = {50708606-307A-5BED-AF2D-8FDCB9C05220} + {E8A4DA95-0028-56E3-876D-964AB6285B86} = {50708606-307A-5BED-AF2D-8FDCB9C05220} + {E85B9476-FCE0-557B-9598-FD46D59F7846} = {50708606-307A-5BED-AF2D-8FDCB9C05220} + {92253993-2566-5A11-AD3D-4E9E4DFCA693} = {E141BA2D-1051-5995-91A7-7825ACB7513B} + {99D0800D-C3E6-59C7-8E14-7307D9D19FEE} = {E141BA2D-1051-5995-91A7-7825ACB7513B} + {717BBC3C-0048-5728-9246-E54BCF73FDA0} = {92253993-2566-5A11-AD3D-4E9E4DFCA693} + {97284EB9-3307-5358-9D53-516135B9B67E} = {99D0800D-C3E6-59C7-8E14-7307D9D19FEE} + {20D928CF-6F8E-537C-B614-1344AF5F9BBF} = {6FB093EE-13F2-598F-B637-317D30E2418C} + {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} = {6FB093EE-13F2-598F-B637-317D30E2418C} + {A7D8953B-C099-5CF8-BB7F-567171FBE654} = {6FB093EE-13F2-598F-B637-317D30E2418C} + {333F32BE-6053-51D0-8E43-6D4DABA6D01F} = {20D928CF-6F8E-537C-B614-1344AF5F9BBF} + {533F1413-079E-537A-B336-90543B6A8A6D} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} + {CBBFDF59-D233-5847-B08D-590AAC7D0062} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} + {F7A5FDF6-73A2-57ED-BDD3-2DF11960D1E3} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} + {E9ABE946-C645-5359-B25E-8BAA18689C44} = {28D4DF1E-10B2-50EB-B993-0C51781DC4CA} + {B2CCA353-DF3F-57B7-8108-C7BFA1F6553B} = {A7D8953B-C099-5CF8-BB7F-567171FBE654} + {636012BB-3DED-56DD-90FB-4F280DA764BF} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} + {C98C2683-712C-500D-891A-D685874A0600} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} + {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} + {BC7E9C1F-1451-5098-8839-C440DB51E8F7} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} + {CC66F815-F123-53D0-83A3-83137F66DA87} = {F8412DF3-0892-5D8E-88D2-2103807C2F01} + {C1FCD683-A858-5864-8FFC-71F10EBB037C} = {636012BB-3DED-56DD-90FB-4F280DA764BF} + {533E7642-7A19-5148-9961-7AD1C129F6A3} = {636012BB-3DED-56DD-90FB-4F280DA764BF} + {69E38AB5-4754-5EE1-A4F6-4066121380E8} = {C98C2683-712C-500D-891A-D685874A0600} + {C0D3B371-0629-51A6-977E-109DD8C75193} = {C98C2683-712C-500D-891A-D685874A0600} + {ED9EBD4C-10DC-5F1D-9E7C-126B0E23B2C1} = {C98C2683-712C-500D-891A-D685874A0600} + {0260AD37-54DA-5800-B7D5-1C87AD53DA5E} = {C98C2683-712C-500D-891A-D685874A0600} + {523BB7B5-2BF3-5FD6-A65E-0EA0D2326D3A} = {C98C2683-712C-500D-891A-D685874A0600} + {FD6169A5-BA05-532F-9F9C-CA706278E422} = {C98C2683-712C-500D-891A-D685874A0600} + {2A280282-543C-56B1-ABEA-0E104874FAB2} = {C98C2683-712C-500D-891A-D685874A0600} + {898AEFFF-4499-5223-9E5A-51D23E359283} = {C98C2683-712C-500D-891A-D685874A0600} + {B65C2C6B-14A5-59FC-9864-0ACBCA225905} = {C98C2683-712C-500D-891A-D685874A0600} + {518349EC-22EA-5C63-82C9-B62C355ECF06} = {C98C2683-712C-500D-891A-D685874A0600} + {978E57C9-6329-53E6-BCFB-25B61900FF56} = {C98C2683-712C-500D-891A-D685874A0600} + {A484C8B0-C427-5DBC-B5B3-9CBBDF6562AF} = {C98C2683-712C-500D-891A-D685874A0600} + {67D45094-106D-5A42-8908-EE0ED693C316} = {C98C2683-712C-500D-891A-D685874A0600} + {DC5FD4DF-6BB1-538C-AFBC-C5D1F996565A} = {C98C2683-712C-500D-891A-D685874A0600} + {42C7E32A-4A4F-5E14-9A1C-CB6888F42911} = {C98C2683-712C-500D-891A-D685874A0600} + {ECDA362C-2331-5E2A-9004-158FEFC09558} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {54692AE8-46FE-597C-9804-B85115C8D78E} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {A8FFCABE-523B-52AC-B649-F728A13F7809} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {447BFD00-4629-5040-947F-3823CE6F1623} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {FD19D0F2-EFA6-5D8C-9F8E-392FF333DABD} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {B5FDDDD2-F649-5A1E-9D58-79C1B4880129} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {414164E1-1D79-561F-84C8-AF13D2479467} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {0245DE31-CCD7-570B-A349-4A94B6747E7F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {52A514C6-1F14-57DB-8040-8BD90724DF97} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {ABFB3DCF-22E4-5AF1-ADE4-18B1F42697BC} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {D57A3684-6938-52E3-A775-A05D1BC55BD9} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {F9C1A7E4-0C21-5ADD-BC17-7A0D3386BCF8} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {4D19D7C7-33D5-5E40-BD37-F033F6514F8F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {579B038A-DA40-568D-8D94-1819A61A77E4} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {D1CD0F74-629F-5E39-AB12-D0E873B176DF} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {A39CCE1C-8779-5417-AAB7-F7F662947EF7} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {8B0CB7F1-D942-5256-9345-814D7613FB8D} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {8ADF03A1-5837-5C33-80D5-593F684B5D52} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {DCB28552-B244-5382-A01A-7FF9623D5D8F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {4E932374-54C6-5618-B9D0-C9F9586AF142} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {52F0C68B-4733-5B5A-94BC-8610E0044FB5} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {C7849419-3632-5210-B29D-AE643ADF7614} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {0A8F72E8-0678-5DC6-A529-6051825248A2} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {3C0189B8-5C01-5CAF-921B-14534E5AD8F3} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {F3746A6C-CF60-59C7-B0F4-D654FD0E3FF8} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {399C398F-37AC-5E5E-A071-7856B28E2F91} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {FB31FD4A-6D32-5F44-A765-BF97D0992416} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {2E5136AC-787A-5395-9E34-6DF39AD968A7} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {271FC73D-0A74-5833-9710-095BB48BDE36} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {CCD04E7B-4971-5471-B3C3-F1EB37211477} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {6A3E0408-E974-5B1E-8944-9745294CA34F} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {BC02D193-613F-532F-98A3-C09FF0CC8116} = {30ED3EB6-DCF3-5068-A8A4-9B55614E7BA7} + {42D599AE-EE37-55F8-926D-2918FE8C2FF1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {9365CC66-A669-5ACD-AA12-4991D1DBCD10} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {C3141611-E90D-55A2-819B-A65AEF921787} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {B62F97B5-73F5-5F9C-90F5-F156C52E6424} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {48090851-C268-5625-9967-7E1B364AE5BB} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {A2FA5C54-A698-51F4-BE96-DA5080CA10D1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {E76711C3-B30E-5E2F-8532-0885F4E4992E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {D8D2C86C-A8D2-597F-B9CB-92C6D412752E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {9326B135-DEF9-52CD-B1E9-F90EEEAA40FB} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {823042FD-8786-5959-AA1E-8E225497A91D} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {A182BBDA-2794-538D-87BC-5C9F1A52EC9C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {49F5A6DD-9D57-5DA7-BD13-B22E1914B2EE} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {E6AD0F88-58A6-591B-B81F-55D76970AAC6} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {64ED47CD-60F8-50B0-ABF1-BD3624D3876B} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {86FE95FB-6E35-599C-AD1F-CCA00200BAD2} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {E048277B-0B7F-5912-8190-871D57D0CB36} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {8637D2D5-FCFA-592E-AB09-1134DD444F51} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {6611FCA6-C1FC-5B1E-B4F2-ACAE01D7B494} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {6AD219B7-DC42-5BA7-A8D8-8CAC7E1A545F} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {FB3C53E3-B728-5E37-9095-E8A62235C779} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {BAE0F14F-67B0-52A8-8A37-DAB9117CAB92} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {BBD9FB80-1740-52D1-8D4A-CBCC23458967} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {6B728CF0-08D7-5495-AF3B-80E03D8E3085} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {A65C327F-9D4B-57DF-A94E-456215B00102} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {8F9AB893-1069-58DE-9213-58FFD149AEE1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {AE390E3E-F95E-54E2-8ED8-ACF460F30C32} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {C11D8D60-CA38-5F92-A741-EB8C8D99C5D2} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {C2903B94-B7B4-525C-AC6A-DE5FBCADE029} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {0A55FCF4-99D2-5A7B-AF01-88CF71AD39D8} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {7581D3D4-8C62-59F8-A085-143AA9DAFCB7} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {FB660FD7-F8C1-5FE1-85E7-066B22F23381} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {8A7FC726-0271-514B-ABA4-EA48DDE93B8C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {1F86C969-9DDE-5942-AC1B-2EEE29FCF8B0} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {01D6CF66-7B69-5772-9811-C3BF554793C9} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {1D6B142F-A2E1-5B0A-AFC2-299E0DB5D675} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {C4E024A9-91DE-5071-86FB-25B350B6D78E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {58C665E2-C3A7-5E69-873D-B6FEC96FAB8C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {AF70972B-54C3-5DEC-B005-B1CF4B84E14D} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {A284375A-B4E0-50C5-B3C0-766ECBF70CD1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {CBEC642B-A4B3-5B3E-A5EF-64993811FDC9} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {C6BBD0A5-C811-50A3-A614-C535E7D0AF50} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {48256054-736E-5597-995F-BAF166998337} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {B4C782D3-CF67-5A0F-9E60-757405CF4BEB} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {64756370-8E80-5638-B0F3-5EACFBB8FD64} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {251DA02D-00DA-5211-BD79-AC28E18F326C} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {E5BB7BDE-B76C-52E8-A4A2-AD71453BB2BE} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {C7551073-07A8-58AA-BCB0-5CB79FC2D109} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {06187BD6-754B-529E-BFF1-CA5D0FA4D5D1} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {17508C6F-FADD-5BCE-B47B-0A78F4AA437E} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {5545C1F3-B963-5FAA-ACD7-9F57D4470F19} = {BC7E9C1F-1451-5098-8839-C440DB51E8F7} + {492926FA-134A-5BF8-9148-97D9A291E3C5} = {CC66F815-F123-53D0-83A3-83137F66DA87} + {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} + {1BB68895-DA5E-5335-AB62-7C7C7F599205} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} + {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} + {2DD3A51E-C54C-5B89-9E80-6725631D7C98} = {33AD4C5F-D4B9-5820-999F-D733192BB68A} + {F82ACF7C-966D-5C85-AB8C-637206C2495D} = {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} + {C0BA2B16-7593-55EF-9368-CF06C1F94379} = {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} + {CE252920-E8A0-5175-B211-CD71EABCFC75} = {7D8AF489-7371-52B5-ACD5-53CC2E862A1D} + {5970CA22-EC4F-5D2F-906D-8B5B934E2547} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} + {2F6D6D31-28AC-5022-BD72-61F153062B6C} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} + {E7CD5254-7D73-585E-94B8-E70C281423F1} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} + {BB1F45C7-44CB-516D-A888-4E1EAEABF44B} = {1BB68895-DA5E-5335-AB62-7C7C7F599205} + {D2DB6670-C4E3-5EDC-8374-4D61A021BBEA} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {769E6552-E895-5951-8C67-86B251A6036B} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {92336BE4-5E46-5C13-B200-69A80999182B} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {7531EC3D-6ADD-5551-ADC2-A283A56028FF} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {C270C125-2FCB-5F43-A1B0-EE27079662BB} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {AD56AE6C-B8CC-5F33-A2ED-C0E3BEDCC970} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {3BC0EAC6-5A4A-5164-8459-01958C5FB3DF} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {23A27A2A-2C8E-5C38-9F17-06FCDD87C147} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {E6AA66EA-B771-514F-8CE0-2A4DAF77DD27} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {BAA651D9-A2A1-5268-8A42-0CABE21D9D0C} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {FC1BEAFB-D33A-54E0-9ABF-91BCA7A7A4AD} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {E2AC4478-3191-5B4E-A0EB-222156F9C2F0} = {26BFC5ED-99B9-58C8-B603-CA6CAD6CE57B} + {38127116-0764-53E6-B5B5-2BA0CA0B7F91} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {7701FD94-6296-5CD5-8E7B-F7CAEA02052C} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {8FFB17E2-0421-5B48-9D3F-53B739C7C9D4} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {A07964A7-387D-587F-9507-5E89354A965A} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {69247914-5C25-5B86-8DA2-93F0C41EC3D2} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {67F2A597-9CF3-554A-89AF-A527D41D8831} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {CCBAF6D9-B55A-5640-907A-4BE7B4A89E3D} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {180A6CFD-B8CE-56A1-AFE8-030C06C67438} = {2DD3A51E-C54C-5B89-9E80-6725631D7C98} + {6853411B-3FF4-5446-805B-D24664BF9822} = {75A135A6-2344-5F0A-9314-4DF08380E567} + {ECFC702B-9395-5F70-A935-FFA7CD63F36D} = {75A135A6-2344-5F0A-9314-4DF08380E567} + {AEAA70CB-616D-57FA-BB16-65807FA8D160} = {75A135A6-2344-5F0A-9314-4DF08380E567} + {DB13510A-AFA8-55AA-9918-99B7BCF13AA9} = {75A135A6-2344-5F0A-9314-4DF08380E567} + {69A89A48-4FF1-56DD-95F4-B81DBAADACDA} = {6853411B-3FF4-5446-805B-D24664BF9822} + {22C6842B-7851-510C-9DBB-675188E2B020} = {6853411B-3FF4-5446-805B-D24664BF9822} + {D3DC29F7-A44B-58E1-8E3F-6C8D69BC41F9} = {6853411B-3FF4-5446-805B-D24664BF9822} + {5C5E48F1-D79A-5629-BBC9-758C6A1CBEE8} = {ECFC702B-9395-5F70-A935-FFA7CD63F36D} + {027F58E2-96C8-55C3-B22B-1EC5B0621106} = {AEAA70CB-616D-57FA-BB16-65807FA8D160} + {A973EE14-705D-555F-B115-B97D5ADAEA8D} = {DB13510A-AFA8-55AA-9918-99B7BCF13AA9} + {166419DF-16BC-5CC6-9634-6AD9517AA816} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} + {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} + {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} + {BBEB3971-7F5F-5733-A5B6-4BFDE6D8FD39} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} + {3662068D-D45B-5BB0-8547-E431434F6A31} = {71B4078C-ED75-5332-876E-9B3AD5B6A435} + {88C1DF3F-74F3-507F-B63C-EA54EA56C95C} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {F931F697-CC40-55BB-999E-BAA4302595E5} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {BD92B2EA-2C70-514D-B74F-76AD834A0AA4} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {309B5313-C885-5629-B9A9-674A532CC498} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {AA07F41B-E3AC-5D2B-9B56-34095FFF0AE7} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {C0D986EF-15F8-588D-86C8-574B9978D0D1} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {80686466-E848-57CD-99D9-644EEA055741} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {D906F4BC-54A4-567F-8DD9-4A00C6DC3F75} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {48EAC4C2-5B05-5350-83C8-5F25DC7632D5} = {166419DF-16BC-5CC6-9634-6AD9517AA816} + {41F6B7F1-7767-5A85-B9B5-C70D69F80000} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {BA5C61B1-EFF0-5FD7-A92F-4E464C16056B} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {1CC50534-78D2-5DC6-9DCF-8D64532260F8} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {7DED5634-FD01-5854-96BA-C3F636FB6B10} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {3083A5E6-84E0-57FA-8F5F-ECA046992707} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {B70F4C3D-0BF7-59B7-9627-4EF8E7247A17} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {FD121908-49E7-5B7B-B8E6-A4FEB65D59DA} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {8929D374-4010-5CAC-8EC0-693194B7216E} = {3E5A1DF0-A936-57FB-AD86-FDCCB35F2D3B} + {21342480-FC88-5789-B7B2-5D9AC7ED18F6} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {34D26AF7-F7C3-5D31-8E45-D545DE7B56A9} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {56414F70-A7F6-55C1-B219-DABC8345E9EE} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {486EA70D-9F0F-5259-B908-580A60863C5A} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {21950636-1E41-520C-978D-6C52417F49CB} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {A3045438-648F-5E60-974C-8A6593165CD7} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {393B31FC-1469-5DB5-8B89-C6E9AC69A058} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {3E4B26B0-B184-5184-B086-618F362D3EA8} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {74961AF8-0434-5863-B516-179CBD4DD354} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {D2C87350-D8EE-5774-9D07-5DB161C1CAFA} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {46F08BCB-C218-5A58-8949-E7CD119BCAB6} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {9654C643-AD78-586B-819D-8C081576D60C} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {ADF02308-4349-5280-9E05-75A6C619E0EC} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {3B4D6BEF-0934-5981-B776-AA13BE7FD25E} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {B335DFD5-EAF4-5083-9B37-0435F93396B3} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {986F3041-3E8A-52E0-A965-92243093D1C6} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {8BD98D23-C7B0-566E-8843-17BE8E005B6F} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {89B612AB-821C-5707-831E-CF01A24E0FBA} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {D4DCE15D-619B-55CE-9EE0-9C0C1DE9F223} = {F89B6DC5-33C0-53E0-ADEF-2B3F767B4EA5} + {B79F5D06-CC07-50E0-9916-CD91E53BCE4F} = {BBEB3971-7F5F-5733-A5B6-4BFDE6D8FD39} + {D19362A9-7CFD-5AA9-BC1A-6E58E8C3E74E} = {3662068D-D45B-5BB0-8547-E431434F6A31} + {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} + {80B4238D-14D4-53B9-8DDE-5AAF6963B6D0} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} + {CA8130F6-DB6A-55F8-A656-DDDEA0B1555A} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} + {ABFB61E3-5DEC-5E1A-BAAC-D5BF448B7C65} = {A56334DF-E16C-5CA1-A53B-B2463BE1285C} + {8CE426C9-853D-5FE0-A939-954D7787890A} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} + {DF324128-78D3-54C8-AAE0-852EA18A4175} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} + {3B0B6785-6E80-5615-9076-F10DD4ED79FC} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} + {9C88A7C8-E00F-565B-8E6A-4AE3DB4E0DE4} = {4C7619D5-63C9-59A1-AFE0-43DE9E4D4BDD} + {F11FF9FF-2A02-5470-93B8-75A8AB307992} = {80B4238D-14D4-53B9-8DDE-5AAF6963B6D0} + {14E66575-1C2C-5223-9286-BE65FD8FCD6E} = {80B4238D-14D4-53B9-8DDE-5AAF6963B6D0} + {17161A8D-0F28-5998-9C38-A09E8A0DFECD} = {CA8130F6-DB6A-55F8-A656-DDDEA0B1555A} + {7FD85CD6-0AE1-5B5B-8C05-838FE81C7136} = {ABFB61E3-5DEC-5E1A-BAAC-D5BF448B7C65} + {D613FC8A-C7D0-5159-BD5E-DD2A912D4430} = {11942B47-88E5-5886-AAAD-FA4DCC461D2A} + {779F3EC3-3CCC-5B43-87B9-5C67C5B9FBAD} = {11942B47-88E5-5886-AAAD-FA4DCC461D2A} + {85B39AEB-D264-59E3-AE46-C6E09D60816F} = {D613FC8A-C7D0-5159-BD5E-DD2A912D4430} + {B22104F2-C574-5E22-ACE9-5E218FCF4ED6} = {D613FC8A-C7D0-5159-BD5E-DD2A912D4430} + {2410CF83-1FBB-51EC-A6F0-95ABD7D8D5AD} = {779F3EC3-3CCC-5B43-87B9-5C67C5B9FBAD} + {345A6909-395A-5FAB-8832-2941AFB684FE} = {FD98BA86-C18F-5E6F-BDF5-47D53892B0E4} + {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} = {FD98BA86-C18F-5E6F-BDF5-47D53892B0E4} + {E04423CA-6046-55AF-92F1-C8492E44A1F4} = {345A6909-395A-5FAB-8832-2941AFB684FE} + {500252B3-468C-5303-B06E-C961A475C519} = {345A6909-395A-5FAB-8832-2941AFB684FE} + {2004E176-092C-5C14-A7F0-11CC8E383B5C} = {345A6909-395A-5FAB-8832-2941AFB684FE} + {F064B0DB-FE3A-58F4-8E8C-904C04749A55} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} + {5618B67A-A525-5958-8001-9AB7A7EB6412} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} + {D382EF88-1144-5CF4-B768-5A124EB8CF0A} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} + {C1BB68D4-4B44-5155-B7AA-D5FFBD3A00A7} = {9F34C945-1CBF-5F89-B0B6-9B38E74A7718} + {9959D246-3C94-5F38-9D11-E30E754AFDDB} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} + {303F85EF-F67E-57CC-9BDD-2381265243FE} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} + {6F0F4397-95CB-56A9-939E-6731390C383E} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} + {A1795401-DAF5-5F44-B3F6-173F7DF8897F} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} + {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} + {70543E0A-0F3A-5954-9C13-3972FA97737A} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} + {922A7463-1237-5064-A5E6-4B583E2D53A8} = {AEB023EB-F72D-5FFC-8FED-AD8F297E4FCA} + {DA8F7D8C-2022-51C1-9235-1B3613EB703D} = {9959D246-3C94-5F38-9D11-E30E754AFDDB} + {D2B3DDE0-F44F-5B57-9D3E-679E18FC1032} = {9959D246-3C94-5F38-9D11-E30E754AFDDB} + {600F0F8D-D86F-5CA6-B4E6-7DFB6860981E} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {9A62D7DD-B9F1-5CDD-96D3-07573296F939} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {B9B66624-23D7-53C7-B1F5-B1476F5435F2} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {36C2CF7D-BEE8-57AC-8D2E-6E6D24505F25} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {087B1096-EE56-5337-81C4-3655FEC38AAB} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {07F56C8A-C188-5B01-8ABE-E8CE7344B5D7} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {394D1A61-BA24-529C-B049-B377DAB866CF} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {5B598FA9-5AE8-566D-B6D8-C87792622114} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {5C964413-BA49-5580-A781-A020335C9301} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {FF74E087-9D87-5321-B99B-70FE364B9422} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {8CC218FA-816B-5D5F-9BDD-19F88444B22B} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {6B99DEB6-D5DF-5BF1-A9A4-228A757D4836} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {CCCB2B8D-C3C2-53F3-8A08-259A0EDBE76F} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {3E780079-10D2-5AD2-95FC-98E46718B231} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {C3B48707-75F7-56DD-9FBD-65DE8D53353B} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {A2A04CF8-28FC-51DB-8BC4-00440822348F} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {3F03AECF-1508-5F69-97C3-C2DF3A01B7E1} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {68D37855-2734-5614-AFF7-39D2FAD17795} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {772A91FD-98F3-5EA2-9CB4-E3088C839D32} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {B40A0645-C9DD-5D6B-AC8E-0A57CC7381EF} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {1DF9D457-8A7C-5A38-ACFF-65EB6269B4F2} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {9B85AD15-32BB-5A24-8243-52FD11033E1B} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {1F54A459-6953-5AB3-A0FE-EEAE8F53C0F9} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {222C4ED7-2DD8-5F51-A249-323B1F414AE6} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {A3D24CDD-0855-5F57-989B-5D8C6CF3570D} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {4A1395E2-E03E-542C-B190-BDAA205A0E1F} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {3C4B8D17-0B69-571F-9B6C-6E945937A3B3} = {303F85EF-F67E-57CC-9BDD-2381265243FE} + {E648086E-E39B-5B18-BFDA-E597D04C536A} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {1D75EF57-0B94-54F5-9FCB-16A888141420} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {8A42C228-E80F-5DA1-A752-29F9C7D7FDDC} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {683D176E-ECB8-5F5D-AC6E-E2E3E33526DB} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {5C0BB750-025E-5E1D-B717-B871883AAFDE} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {F03873D8-5506-5461-AF91-247DEF04D700} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {76D66413-B838-5648-BF18-B87DD5084BFC} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {02D3276B-BB16-536D-BF6C-CD9067EE2F27} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {A8F451BE-6076-5D9D-BDF9-FF270ED0391B} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {65906110-4508-5D7A-A870-2225135CA2AB} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {836920D9-3DC3-5926-8ACF-CF41CD59EDB1} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {48BCAF76-EDC4-570D-98C2-032DB39D8662} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {02568C86-83B4-588D-9EA2-58ABAD29DE27} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {034AD4BC-E7E5-5F87-8A30-12D71BFF63E8} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {32CD344F-484F-59C3-AC24-3FD9806DD3D6} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {E8B300BA-17CC-5884-97DB-C53176BD92FA} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {B53D2725-B209-56C2-854A-733AA23791BA} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {2FFB82CA-D88D-5F32-B821-D0E1D8F47BEE} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {303C5589-5F40-5AB6-AC14-B74330F4ABCD} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {ACC984E9-DD35-50E3-9DEE-4D31E3905798} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {B0455206-6836-5CCC-981F-DE01652F719E} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {378D4FEB-0052-5910-A0C6-F23FFAFF9622} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {D29DC1EC-0FBC-5E01-8DE8-7FA1687A2FB7} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {1772BDC5-1285-5297-A93D-F57692363BB2} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {20030AD8-C9FC-5CDA-BA0E-DE13E792A314} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {1CB6E15B-7A60-5B3E-A6F1-C2300F9CB14C} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {787405E2-7F5B-5CC2-821E-A54AF8CE3843} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {468F9192-74B5-5791-807B-A0507E99AE1F} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {AB11CD1B-0F3C-5A7A-92D6-21E7E962AC49} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {02A180E2-6690-5EA6-9AD4-4A9616DC1489} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {98DBA04A-9F13-5740-8713-48A21F41D158} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {059A8E08-8A8E-5766-9556-C3E18707A316} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {A0EF31BA-A294-5B97-BAAA-84737FFB0441} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {49F92D69-4B38-5502-8856-FFD90DEB4ED9} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {BA04E8CF-051D-5A9C-B866-AB9470319426} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {3FBC55A5-8773-5BDC-BF58-45FAC2950D89} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {33BBE42C-6D04-56C2-8A5D-736F670198CE} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {ED7BEB9C-BE03-52A2-AE55-4E9F2B31E179} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {B3A40257-0096-553A-BDDB-ECD222F47D98} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {6CEE9751-CA80-5B25-B7D3-DCB24085450D} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {19FB46E2-5E4B-5DBA-ACD5-A43B86BA542D} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {D1504F57-82C2-5BE5-9524-B3371BC26F82} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {9B29BB87-FEF3-5EF9-8D64-D005408705EC} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {D67441E5-0211-563B-A29E-7C1A0C815A7C} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {A5516E04-C25E-574B-BDA9-25F17B89EA72} = {6F0F4397-95CB-56A9-939E-6731390C383E} + {85D772C5-941E-54D2-A07F-CCD85DE0F37F} = {A1795401-DAF5-5F44-B3F6-173F7DF8897F} + {046A3473-60D2-5BD4-ACFC-5051CAC08296} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {690D6500-40C1-57CF-80DF-BCC788C0F09D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {B631B34A-610F-5F25-A68B-8E2EB93D813F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {A89D579D-119A-512E-ACEB-00C66A99E871} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {C0D1E717-51E3-578B-BEDB-F9A02F54042C} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {04CEAD38-EF61-56A0-A507-72B12606767F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {CC86C30A-0EEB-594F-9680-DB32F10ED128} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {931FAFFC-095E-59B7-9E93-EFAA06CD10EB} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {55593DA0-334B-58C8-BD12-32BD2362A384} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {34A4AD39-111F-5D02-83ED-6FB0B71B3539} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {3A446391-6537-5C7E-885D-A60B8C6402AD} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {0A18583B-3913-5C71-900C-8BDB320D6461} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {6064B3DA-2322-5B7E-B27D-4D0E976114A7} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {254361C7-78CF-5510-8D5B-DC1AD1370726} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {4990948A-CB1D-54FE-8C2E-AA1D0D275B22} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {9D1A020C-0800-5A7C-85DF-4C04A922894B} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {8C1D631D-0BCA-5F4C-B5DB-DFEB93C7835D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {E0341225-8AC0-5A3D-90FA-253A39188C59} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {63AA5DD3-66EC-5770-A2AF-73214634BE74} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {5422FC92-32F8-5B7C-8808-F9F3B01096BA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {239AEE8E-4762-5DC0-AE89-99C559DC3C0C} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {940ADFE2-7115-5A6B-8083-E6E9959C5126} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {C2F4CEBC-0FD0-5711-977B-D15B63B6283F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {D6C8C992-6C92-5B42-8C16-DD8579A33A50} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {914E3DA8-3A2A-541B-B212-E54E5B9E5FF9} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {538897D7-98D3-5E80-BB85-2ADD354A6DAD} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {D5452CC8-BDC4-5621-B4C1-9640B9A8EBF6} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {0735AB65-C84E-5173-AA33-34D053A2206F} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {DC026D6C-B3C7-563C-9686-598397B646F0} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {144905E9-FB74-5478-858D-214E98611302} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {138E4BA5-CB08-5034-81E8-77CE875D2338} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {7E440D5A-47CC-5DEA-B24F-74FCEA985B4A} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {E6BAF476-7A8E-5D90-85E5-40C6F3381750} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {39F576C5-7241-5E33-9F70-6A3AC310AA9A} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {0C4DCE98-A626-5BF9-BEB9-9BA11D5852DA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {FF70148A-101D-5C79-8A6B-C82FEB1D0F2A} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {92FB53E1-32EB-5F4E-833E-35A1CD62B32D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {BCC4F860-588E-5D77-8632-FD3F433875BA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {611D6EF5-47DD-5683-80D1-D127FE684FBE} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {0DCAB8B4-4D58-521B-B7CE-F931660BC02D} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {8E9E7C6F-4AB1-532F-A4A8-E814BFBD9A77} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {928428D2-2BD5-59AB-8E56-7969B8A75B85} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {96C669DB-9F4A-5302-85BE-5D9EF48D64AA} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {47513358-7F52-52B0-8A3A-F6F7083A1357} = {C6EAF280-23DC-52B2-B52C-AB20ED55AB42} + {3BF59ABC-2BA6-59BF-A303-D3B710B4E6D5} = {70543E0A-0F3A-5954-9C13-3972FA97737A} + {41C4E053-ED5C-5A65-95E2-DDD2DF0A9CAB} = {70543E0A-0F3A-5954-9C13-3972FA97737A} + {865BED4F-1D52-5ECE-B19E-A4EA8177C690} = {70543E0A-0F3A-5954-9C13-3972FA97737A} + {0C29ECF8-B816-58C1-8A0E-D2663C91D259} = {70543E0A-0F3A-5954-9C13-3972FA97737A} + {A587665A-BCD4-5A71-A9B4-4B2CBCA3A4DD} = {70543E0A-0F3A-5954-9C13-3972FA97737A} + {79CFA9D7-7759-5EA5-9A68-735E4CF304FF} = {922A7463-1237-5064-A5E6-4B583E2D53A8} + {A43B40D5-0F1B-544B-B621-C2A1D4292D05} = {922A7463-1237-5064-A5E6-4B583E2D53A8} + {4B422E10-2700-5740-8507-A9BA717DFF7E} = {922A7463-1237-5064-A5E6-4B583E2D53A8} + {693FBCDA-F357-5B46-93E4-1203E1912FEA} = {922A7463-1237-5064-A5E6-4B583E2D53A8} + {1D421D62-76ED-5076-A4DD-48E3D13232C2} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} + {47CA7D44-20AE-5238-AB1F-ED7382F2F034} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} + {32554071-B945-5653-85C6-007D3DD4E6AC} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} + {3016D8EA-2B83-581B-B0EE-30AB6CA8A1D5} = {C088E3B4-FC6A-53D6-9E58-D880F15DF7DC} + {9E5CC14C-0669-5E9D-AB0D-9AF7B24D1367} = {1D421D62-76ED-5076-A4DD-48E3D13232C2} + {FDA4B04B-7F0D-5D72-AD40-E98CA171B5C5} = {1D421D62-76ED-5076-A4DD-48E3D13232C2} + {245C2445-685D-5F18-8557-0C3266C41358} = {1D421D62-76ED-5076-A4DD-48E3D13232C2} + {8AE5CA1F-85CD-5BCF-A406-15F68FDDA875} = {47CA7D44-20AE-5238-AB1F-ED7382F2F034} + {D7A538CE-DDAB-5F29-A55D-204C9BD1A157} = {32554071-B945-5653-85C6-007D3DD4E6AC} + {ABE22056-D6B6-5B41-812A-8DCEC9812B8E} = {32554071-B945-5653-85C6-007D3DD4E6AC} + {3FD3FCBA-7E50-5016-84A7-EB1DF91D7CC3} = {32554071-B945-5653-85C6-007D3DD4E6AC} + {59DCF5F1-F87C-5A73-A251-45C4D98D8F34} = {3016D8EA-2B83-581B-B0EE-30AB6CA8A1D5} + {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} = {F689A8D5-683B-5813-8857-AD0EE10504C0} + {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} = {F689A8D5-683B-5813-8857-AD0EE10504C0} + {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} = {F689A8D5-683B-5813-8857-AD0EE10504C0} + {3461BB68-1EB2-5BD8-9FA4-3217CC1E7394} = {F689A8D5-683B-5813-8857-AD0EE10504C0} + {999AFB4F-C686-5BBF-8CA0-38119694DB9D} = {F689A8D5-683B-5813-8857-AD0EE10504C0} + {640B22EB-F7DC-57AF-9E6E-1BDD18810064} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} + {68B2E31B-A427-52C6-A3A6-8902A21A9D04} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} + {6E26EDF7-C6C4-5B4D-A8D5-E69794986F58} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} + {1763B240-97A6-5710-A7A6-8A1F63311597} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} + {F23B9764-280A-5720-8B5B-B227092A24A9} = {DCDABCC3-2699-5112-A042-7E2F0E9E4D43} + {40426D69-90A0-599F-8113-BAAA98714E62} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} + {41671DFA-9B15-574B-9B82-45CA2A254269} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} + {8119F319-6F44-51B0-893E-24B214690A37} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} + {8581A797-6D1A-5605-B9C6-4EB8CC349425} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} + {7B8B42CA-AB6C-5C04-BBCD-E1958CD62AFC} = {00F48869-B5D8-53AE-8E2A-5CBBE28B7D67} + {97545321-6315-574C-94EA-C4D756A323EE} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {7F384D30-79DA-55EF-AA3F-5C433126B646} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {BCD434BC-C9DE-5291-A5C8-AD32891A7401} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {95927BB2-7EBD-545E-93C6-4F5D1BFE7BA0} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {5881D3BD-529E-5092-8640-1CE0844FE0FB} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {D2ABD1E8-CA71-5B65-B8C0-F4846FE595A4} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {2512F361-2C0C-56B4-9D93-7DBBBF55815E} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {78400F00-37A1-574C-8391-3CFA7E014B4D} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {75D9C1EF-60D4-51E9-A0F4-FBE6632AF791} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {4FB42ADD-4BAB-5C19-BD4E-E39F95348600} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {7EE3111E-53B5-5EE7-99FB-230A9B4EFD50} = {F6F2323B-DD8C-53AD-AE3E-2220B928BA24} + {A8E7D04F-7F35-54F0-B2C3-D6CBD5D03E25} = {3461BB68-1EB2-5BD8-9FA4-3217CC1E7394} + {A15C2434-BBA5-540A-B863-20A347A3F160} = {999AFB4F-C686-5BBF-8CA0-38119694DB9D} + {75227D73-DF27-5598-903B-6EF26AF83090} = {82E5585F-AF53-50FD-8805-E8F196A74A69} + {AC257696-D6A2-51B5-A07B-195CC24F374C} = {82E5585F-AF53-50FD-8805-E8F196A74A69} + {FC7268F9-BC0E-5757-8509-3E7AC5DB26C6} = {82E5585F-AF53-50FD-8805-E8F196A74A69} + {CDE07C59-073B-55DD-B462-67D0DCD6E4C8} = {82E5585F-AF53-50FD-8805-E8F196A74A69} + {E11558C3-4D2D-5F2D-A9F0-16EE01291D2B} = {82E5585F-AF53-50FD-8805-E8F196A74A69} + {A2F1CCE0-9BEB-54F2-A923-1CBECB9C360D} = {75227D73-DF27-5598-903B-6EF26AF83090} + {F8564409-54F7-59AA-8E2A-E9022839ED4F} = {75227D73-DF27-5598-903B-6EF26AF83090} + {E6887A02-800D-5F8B-8623-C9C052F6A690} = {AC257696-D6A2-51B5-A07B-195CC24F374C} + {721DD473-5A17-5E0D-B0CA-B2F91A3333EB} = {FC7268F9-BC0E-5757-8509-3E7AC5DB26C6} + {AA0D3C06-0E6C-5671-BBEF-C5594F869378} = {CDE07C59-073B-55DD-B462-67D0DCD6E4C8} + {6584A0EB-82AE-59E7-8023-3261AF88217D} = {E11558C3-4D2D-5F2D-A9F0-16EE01291D2B} + {B03718E1-8606-5503-B4AC-DB966B39847B} = {9F9EC6D6-3A07-5F93-90E8-EA77393FEA02} + {11468ECE-5AA1-5549-90C3-16833B9E9AFE} = {9F9EC6D6-3A07-5F93-90E8-EA77393FEA02} + {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} = {9F9EC6D6-3A07-5F93-90E8-EA77393FEA02} + {8010A35A-7CDE-5521-9D64-4C97F0DA3E93} = {B03718E1-8606-5503-B4AC-DB966B39847B} + {E8FF3CFC-3B20-5D56-A5D3-9A621DC0424D} = {B03718E1-8606-5503-B4AC-DB966B39847B} + {2135DC08-5B28-591C-A43B-445D7BB98303} = {B03718E1-8606-5503-B4AC-DB966B39847B} + {E9610063-C8DB-589B-A817-CC06CE65ACC4} = {B03718E1-8606-5503-B4AC-DB966B39847B} + {B81E7A3D-0F57-59A9-9EFF-E940745C9B90} = {B03718E1-8606-5503-B4AC-DB966B39847B} + {41CAA9AD-E4BA-50F1-83A2-ADB28EBC6C35} = {B03718E1-8606-5503-B4AC-DB966B39847B} + {BBA41FC3-A097-5751-9830-B028CB357E58} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} + {F6AE6B49-960C-555C-90BF-38A2E03EF27A} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} + {DEA58CAE-08AD-5376-BE6F-883B85760DD7} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} + {4B27536C-E23B-5808-ABAE-BC93F0F7B109} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} + {4E87FA32-5495-54BA-B5FC-383F20ABA094} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} + {4EF8E25B-4A19-5D64-8F95-40D86B51E453} = {11468ECE-5AA1-5549-90C3-16833B9E9AFE} + {9ECD2194-4E14-5CCD-9AA0-5279B464EF4A} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {B06AFFD4-5FA9-5ABF-B620-FDBAB5689ED9} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {2EF64916-E58F-5155-8A3D-735E7A019BDF} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {9E95BC40-F0B0-5362-9694-5013FAFE83C5} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {4767D489-E3AF-5C99-825F-6C90CE550264} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {0EFA741A-DAB8-5C34-BCF6-86000CC31530} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {A4790683-9F0A-5B2A-806F-797619E2A98A} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {1EB2E551-EDAA-5555-ACA2-CA7BFA39AC30} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {3B765847-031F-5291-AEB9-E8BB59EF1B53} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {F96E3D04-4D69-575F-9347-8AC47337D471} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {04A2ACE6-20E8-5707-87BD-F024FAD7DED0} = {AFFB37C8-8080-57A0-A0F4-49A20FEC1694} + {8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B} = {2568E093-797A-5F9B-A22F-02FF7596A39C} + {CFB5CB09-1260-59F2-8B88-9725F2EDF976} = {2568E093-797A-5F9B-A22F-02FF7596A39C} + {AFB1DDA6-465A-5BFA-8794-07FCB8B73B2B} = {2568E093-797A-5F9B-A22F-02FF7596A39C} + {55C23781-1A56-59FF-9AF3-4BA07A0992CC} = {8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B} + {9C2C091A-1607-5418-B5A5-20A86652835B} = {8AABE3A5-EEF9-5381-B5BB-F86ECA63BC8B} + {58C44599-F7B5-5911-8B0B-66C4FCB027A2} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} + {FA7943CD-23FC-58EE-BBFE-965758D362C6} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} + {211A70CE-8B98-55B1-9D48-EADD5F34C513} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} + {4144AED2-D212-5A1B-9849-97F97A8760E3} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} + {77ABEF57-B941-5243-A695-AA8B499FE91F} = {CFB5CB09-1260-59F2-8B88-9725F2EDF976} + {C86D9BE0-8DC1-548D-BE62-15C5F2B30F0D} = {AFB1DDA6-465A-5BFA-8794-07FCB8B73B2B} + {A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32} = {1EB7F9FA-F752-561D-AEAC-2E663F7F0C53} + {BC5D3395-B74D-593F-82D4-6BA4D40F3A69} = {1EB7F9FA-F752-561D-AEAC-2E663F7F0C53} + {0661F0EE-F6A1-5305-86BD-42849137BDBF} = {A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32} + {A2D930E0-FCEC-5984-89FA-1B6D2046C7A7} = {A7D7DFF0-FC8D-57BA-9DA5-D4D159904F32} + {FC7A23D5-6A5F-5274-B360-95393EAB244B} = {BC5D3395-B74D-593F-82D4-6BA4D40F3A69} + {26BDBCD3-CE96-5E0B-B8DC-E03EB4458A66} = {BC5D3395-B74D-593F-82D4-6BA4D40F3A69} + {9A4132EA-BE40-53D0-B17B-7EF2995867F0} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {26F61757-EF18-5045-947E-EA076772668A} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {20646475-6101-5739-AEAD-D3CB508D382C} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {A2E3F297-D1D2-5283-81B5-7E83B6B297F9} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {8EDEFD20-4914-53A8-88B3-B5FEB7B9D7A0} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {85703812-08C9-50E6-B355-4F26ED7810F1} = {BBB6D30E-E84E-5C72-B258-8B71B4C0C37E} + {12428388-51C9-5FEA-9EB5-ECF205FD1C90} = {9A4132EA-BE40-53D0-B17B-7EF2995867F0} + {F208351E-5372-53EF-ABBF-C349C32B33E4} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} + {C061A376-5BF3-58B4-B301-28ABC6DE0A3B} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} + {BFCBC834-E9E7-5937-AC74-596459428D2C} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} + {A9660377-E43A-5514-94B8-813B40D34E21} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} + {5A8FFD16-30ED-55A8-A69E-37877E540442} = {AD6CCFB1-5090-50B6-AA06-E5B6AE4EF32A} + {8C747A2A-F2D2-57C3-9777-C32EFB6BA17A} = {26F61757-EF18-5045-947E-EA076772668A} + {03D045E7-F7AB-59EE-B53D-6B890AF278FB} = {20646475-6101-5739-AEAD-D3CB508D382C} + {174D2124-12A2-5620-964F-6D2737DA5DEA} = {20646475-6101-5739-AEAD-D3CB508D382C} + {9A6818AB-29A5-57B5-9958-B5F93B421964} = {20646475-6101-5739-AEAD-D3CB508D382C} + {467C42CD-ED69-5E21-BFF3-F35BAE24E9AF} = {20646475-6101-5739-AEAD-D3CB508D382C} + {03262415-2C11-5B62-84A7-33FC321D43AF} = {20646475-6101-5739-AEAD-D3CB508D382C} + {75991E1E-7D74-53B5-927C-D639337202C4} = {20646475-6101-5739-AEAD-D3CB508D382C} + {D24D7552-BE3F-58CD-A458-9BFA2403C696} = {20646475-6101-5739-AEAD-D3CB508D382C} + {2BC14382-5C69-528B-9FCE-488CE3F8143E} = {20646475-6101-5739-AEAD-D3CB508D382C} + {E7802557-EEB2-53EB-98C3-62A1E0DCC4BC} = {20646475-6101-5739-AEAD-D3CB508D382C} + {FBF45F4E-D545-5897-8A02-428C51A3C4A0} = {20646475-6101-5739-AEAD-D3CB508D382C} + {D5C3A0AF-A331-5C5F-AC21-3982A3BD3066} = {20646475-6101-5739-AEAD-D3CB508D382C} + {69A56760-817A-5A9C-A52E-764FB0194071} = {20646475-6101-5739-AEAD-D3CB508D382C} + {4A591A91-072D-5332-84B5-40C52406510D} = {20646475-6101-5739-AEAD-D3CB508D382C} + {CF956202-62CB-5340-BED9-0AB42E99E48D} = {20646475-6101-5739-AEAD-D3CB508D382C} + {441BAC38-A865-559B-9310-02CB5D417209} = {20646475-6101-5739-AEAD-D3CB508D382C} + {BEFEF285-5EAF-5DCD-9CC0-DA93E97496C9} = {20646475-6101-5739-AEAD-D3CB508D382C} + {36964679-F5CA-57C8-A7C7-98FF38998644} = {20646475-6101-5739-AEAD-D3CB508D382C} + {DE8969D1-E305-54AD-A3B7-8AF897C19503} = {20646475-6101-5739-AEAD-D3CB508D382C} + {FF3858C2-487C-5056-9BE1-753096E3828C} = {20646475-6101-5739-AEAD-D3CB508D382C} + {284574B8-F4BF-5711-81F6-43A277F6E374} = {20646475-6101-5739-AEAD-D3CB508D382C} + {4EDC6E34-E9D6-5DF8-AAFE-BDED5FAF06F5} = {20646475-6101-5739-AEAD-D3CB508D382C} + {C981E0FC-E546-5B95-8995-2296C4BCCC11} = {20646475-6101-5739-AEAD-D3CB508D382C} + {B7303B10-C5BF-5710-9FB6-FCE79C270488} = {20646475-6101-5739-AEAD-D3CB508D382C} + {40092818-83F9-54F5-9333-083731DC7DB4} = {20646475-6101-5739-AEAD-D3CB508D382C} + {5D2B450D-B34A-575D-BAFB-8DFA29CDCE74} = {20646475-6101-5739-AEAD-D3CB508D382C} + {FD53E7DE-2531-5E41-9D24-93D869813695} = {20646475-6101-5739-AEAD-D3CB508D382C} + {166B5460-FFAB-5469-B256-147CA8671861} = {20646475-6101-5739-AEAD-D3CB508D382C} + {D7EB2001-6897-501F-BF6C-27F849B95430} = {20646475-6101-5739-AEAD-D3CB508D382C} + {F01FB705-B831-5A3A-91A2-476EAE8EE65B} = {20646475-6101-5739-AEAD-D3CB508D382C} + {029ADACB-AADD-5FF1-A1C6-42B2542E4877} = {20646475-6101-5739-AEAD-D3CB508D382C} + {9B1B44EA-214D-5749-88D7-28EC8649B233} = {20646475-6101-5739-AEAD-D3CB508D382C} + {18DE5026-FED1-5636-8F78-7F1B3A2AFEFB} = {20646475-6101-5739-AEAD-D3CB508D382C} + {4C4DF88D-A249-58F2-B98D-00D5E2FC33BA} = {20646475-6101-5739-AEAD-D3CB508D382C} + {226B12A0-1EED-5CC5-974D-E9524E924794} = {20646475-6101-5739-AEAD-D3CB508D382C} + {E31AD5B9-66BC-5217-91BE-C4030ADBA7EF} = {20646475-6101-5739-AEAD-D3CB508D382C} + {4B5D871F-9EBA-5D7C-A9EE-065E22B95894} = {20646475-6101-5739-AEAD-D3CB508D382C} + {F80D6ECD-BC46-5C70-9244-1CB6BFF6A2FE} = {20646475-6101-5739-AEAD-D3CB508D382C} + {6EB80E87-172B-5A81-A0E2-932E1AC9615C} = {20646475-6101-5739-AEAD-D3CB508D382C} + {89B055A6-8ACA-5E86-94FB-0FD369790B47} = {20646475-6101-5739-AEAD-D3CB508D382C} + {43E42CDA-84FC-5BB8-B211-4D3E1492D39A} = {20646475-6101-5739-AEAD-D3CB508D382C} + {230D7EA8-20DC-583F-8832-63E54E42E3D2} = {20646475-6101-5739-AEAD-D3CB508D382C} + {2BC11415-1862-50AC-8CBA-0BA29C69E6C6} = {20646475-6101-5739-AEAD-D3CB508D382C} + {AC00E388-5AAB-5AD1-995C-1A7E9BFEF4C5} = {20646475-6101-5739-AEAD-D3CB508D382C} + {D37B67AE-68F6-5C6D-AD35-738F8C7D5851} = {20646475-6101-5739-AEAD-D3CB508D382C} + {4DF1E180-AA42-5F22-9664-F87FAEAD59C1} = {20646475-6101-5739-AEAD-D3CB508D382C} + {B8BECE74-88A9-53B0-B457-3C2CF0FCEE01} = {20646475-6101-5739-AEAD-D3CB508D382C} + {A81F1C23-6F7B-5AF1-BC61-312CF1881CFE} = {20646475-6101-5739-AEAD-D3CB508D382C} + {CF6E60E9-000E-51D4-9C67-FE84E08AF277} = {A2E3F297-D1D2-5283-81B5-7E83B6B297F9} + {9DB7AA23-D6E6-5C2A-AD09-9B6D8EA7E95E} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {06B9914A-7331-579B-AD4F-82B3D95B5C4E} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {E0677FF7-CB20-58B1-AD37-B6AA4ADBC8EF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {64305515-BFD3-5627-A917-B45C4BFA08DD} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {87CF5359-648E-5F59-829B-4C61573D02DF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {2D2D00EA-C84F-598B-9F85-40A2C2FBE3F5} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {B0663070-EE50-51D7-A06B-0D4F9C1A8A2C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {542F28D0-D20F-5571-AE65-83CEA16B299D} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {545AD377-070A-5001-944C-76418FB7F3FF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {D24E78F3-72F2-5A01-A525-7D9A8F4826F4} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {24A017D2-7BD5-5F4C-8B67-58B56129C4CB} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {2A1EEEFB-3A91-5CB2-9013-E298FA6CEE97} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {10FC6B5B-C9CE-5E8B-9648-D85098F70A62} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {71429279-82DC-51EC-834A-F3C52A19ECE6} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {4A88B08E-BE3F-58A9-8711-CE695E8F5E7A} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {C97E71E8-4E2A-5B5C-918D-ABA55CD13C50} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {4B521542-1CC6-5546-9322-8FE869AC7904} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {BB90CA5F-6BC0-59B6-9E49-8E0F09B4EE59} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {48C8ED44-9E61-5C72-B912-987F6B4D3D4F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {010D92FC-6304-5FA0-81CD-1AB19BA2F832} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {28923049-DC26-55D4-8E74-8DABCABB6518} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {C2D640E1-47EF-596C-A258-AE5E93A7578C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {DF05A63F-D283-5C81-B7C7-D659CBED0695} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {047FADEF-DBAF-5D43-A2D6-5C68801894E6} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {D77582C2-0CEF-5ED8-8366-5A28492D3C88} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {436C0FB7-F3E3-518B-8F65-CF760E875DD5} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {3E1613E4-1339-5BB2-AD69-ECD1AEAD737C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {CC4D16A5-AB4A-5877-B0E5-25928D627933} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {2ACE0837-E738-59B6-9728-1DA6D1A22B08} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {1224DD5B-396E-5BA5-B53F-4FA8A93B82A0} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {C7B2C72E-1FBB-5B42-A218-615DE12A3D8E} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {010E1EE1-EC22-55A0-B1E8-86B24B584B95} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {1848E192-CC0F-5736-B68C-D71E6D575301} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {CA77C3B9-4D34-506E-B823-D88353261C77} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {0D8AAAB2-669C-594E-8782-B105F7A3D076} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {24A77816-86CF-5958-8005-511C82A5DE13} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {265D18F4-7D43-5989-BC89-06A0BCAA974F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {2FD9BBFA-0283-50EC-8D0D-E0D2F37737BF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {CF1DD579-8832-5D10-A776-BEA22477C9E9} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {9DD2C1F3-D4B6-530E-907B-BFA80085311C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {7DD2BFFA-80C7-522E-ABB3-3A0D3D48057A} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {D2F4B045-45B9-573C-8EA7-F639FADF6518} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {FCEFC64F-A672-57FD-BE9E-D43CC53FFDDD} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {891EDEAF-E530-5CB1-B459-E526E563AF44} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {7D80E495-7DE6-5093-AC05-650991082D96} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {0EE014F5-0ACF-5AAD-AE6F-C73E160DEE3A} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {434EB740-8EB9-56AA-B7C7-779322245497} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {BD4C1CC3-8493-5647-BDC9-9A9721595549} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {F5D74715-01BD-530A-9234-2C8E8327CA7C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {5DB2DAD4-749D-5958-85A5-D416773EC7AD} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {2C644E8C-5731-566A-9208-25FF724E88CF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {FBAA3D74-4A5F-5F10-877F-C4AEDDD69656} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {D4DC4627-27B2-5162-BF64-821B7AD8837C} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {38C61566-48F9-5D8E-9FC1-A1E81E71E5E7} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {6C4EBD85-A4C8-5F4B-AE5F-BE66D63BC6D6} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {D9F26498-410D-5617-B810-BC58D172184D} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {6140569D-4784-53CE-98A2-54D8BD6D1745} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {50274ADF-643D-5FEA-831C-2CB3DD2C6D30} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {D60176B5-3B87-504D-BCAC-067BD9954A8F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {3F743B8C-53C6-5520-B4AB-52C67179DD73} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {BD34A481-9816-51A7-BA6B-7272465F68C4} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {EAA4DB81-CBAA-573C-9C40-19F9551BE98B} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {879D5965-6D83-529C-A2F7-41E85045A7F0} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {45E6A177-140E-5C2C-AAC6-A2D662BEA5BA} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {23CE30EB-406F-573D-BF3D-4281A6FE406F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {FA284264-B63E-5DC4-B2A8-A8D347A554D1} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {EAD55F0E-0895-5BE5-8273-216780F99C1B} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {6FC550E8-B5D1-5B80-9FA4-CCCA5A05CCB4} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {EF443847-D7D0-5457-85D8-4382BF34931F} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {C2C3712D-B2E1-5F74-A3F9-0D912381A2CF} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {F28F85B6-F4FD-5785-AF89-58F8159621E8} = {A0A96F05-87B2-5B08-A6E4-3E685E49E50F} + {563BF754-9AAF-5CB4-A3C0-DF5E5FFB6D9F} = {8EDEFD20-4914-53A8-88B3-B5FEB7B9D7A0} + {8FFBEF0A-0A3A-5B8B-BEF0-1346D7D65986} = {85703812-08C9-50E6-B355-4F26ED7810F1} + {D1E2B45E-632F-55A2-809F-C51E0F5975D1} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} + {065183CB-0CEB-5710-98AA-112036087960} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} + {78EF3724-4F6C-5873-A748-89FB753A6041} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} + {DFF6FD34-2F01-50E2-B2E3-C13F4AFF70BC} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} + {0CF1F217-11C2-56BF-B2B0-4DFD474FE798} = {83A9BCAC-D1E8-5DE8-9558-76C75E8F45F7} + {D8858828-8495-5CBB-A7BB-97C058811A13} = {D1E2B45E-632F-55A2-809F-C51E0F5975D1} + {671D8C13-26F5-52C1-80F1-EFB556E12B46} = {065183CB-0CEB-5710-98AA-112036087960} + {335A63A0-01E4-5230-8741-5AE90F371B82} = {065183CB-0CEB-5710-98AA-112036087960} + {79481E86-D2CA-5472-8EDD-D0219F5932AC} = {065183CB-0CEB-5710-98AA-112036087960} + {69F7F8D4-6E7E-5EAA-B36A-273B223B3E30} = {065183CB-0CEB-5710-98AA-112036087960} + {A649555C-AAE1-59A8-A7BA-C118366386DD} = {065183CB-0CEB-5710-98AA-112036087960} + {22C216D9-2A03-5C40-9A18-E30C6FDF4D48} = {78EF3724-4F6C-5873-A748-89FB753A6041} + {6EF5CE2B-5D4F-5F5F-901D-6B6FA2BF8440} = {78EF3724-4F6C-5873-A748-89FB753A6041} + {91F25B73-0A0C-57B6-89C2-B13E15F1B281} = {78EF3724-4F6C-5873-A748-89FB753A6041} + {F66F5DFE-3B8F-5B43-89DE-4A15B994290B} = {78EF3724-4F6C-5873-A748-89FB753A6041} + {C165A810-99AA-5C2E-99D9-950C4ABD5C63} = {78EF3724-4F6C-5873-A748-89FB753A6041} + {F2436D73-0E94-50F0-9C02-28CE3910EB21} = {78EF3724-4F6C-5873-A748-89FB753A6041} + {1D8E9087-584B-5341-BFAA-EEB046E530AF} = {78EF3724-4F6C-5873-A748-89FB753A6041} + {0D72E841-4F53-5ED8-864B-53AA0DFA5978} = {DFF6FD34-2F01-50E2-B2E3-C13F4AFF70BC} + {E5B88985-0693-51FC-8AB9-7C3728722618} = {0CF1F217-11C2-56BF-B2B0-4DFD474FE798} + {C521E5D8-709E-5061-9564-7D35400AF484} = {76802750-19B9-5E80-80BE-7ADC255ACE3D} + {C4AAD073-8948-5497-B314-B2699A504B73} = {76802750-19B9-5E80-80BE-7ADC255ACE3D} + {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} = {76802750-19B9-5E80-80BE-7ADC255ACE3D} + {78353588-38CA-5CCC-86EB-1513FB86FB4B} = {C521E5D8-709E-5061-9564-7D35400AF484} + {8A43DF4F-CBD4-5481-A113-84EBE37CA375} = {C521E5D8-709E-5061-9564-7D35400AF484} + {37A03641-FA63-5896-B432-EF26DC11F6CB} = {C521E5D8-709E-5061-9564-7D35400AF484} + {16C1069D-EBC9-53F4-909E-6EAF374E7E8A} = {C4AAD073-8948-5497-B314-B2699A504B73} + {EB39A5CF-2689-5002-8A70-CFB0F473CCDE} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} + {13D2C70F-86E5-52EB-9A53-F266E471A5DC} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} + {DC957128-193A-58F3-B987-481370A43953} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} + {05430EEB-6E1F-5396-A521-EE455630F730} = {5C08FB5F-37E6-59C6-B04B-ED32DB54F246} + {318F564F-76B2-50BF-B629-0EB154BAF41D} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} + {ED97BD71-2A08-5826-8CD2-D90D2FA14B66} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} + {F246CAA7-1A3C-5F2A-B6C4-ADF43C72EBC8} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} + {69DD2687-443E-5E29-B334-E9409586F6B3} = {2A2731AB-593C-5E81-BD4F-F16DBBDAA10F} + {13AAE009-19FD-5093-B154-6FFC4C34B72C} = {318F564F-76B2-50BF-B629-0EB154BAF41D} + {056D1311-0882-5239-9D21-60FC186AB7F8} = {318F564F-76B2-50BF-B629-0EB154BAF41D} + {D99F972A-76D0-57CF-908D-FB28750FE989} = {ED97BD71-2A08-5826-8CD2-D90D2FA14B66} + {66D435A0-4D37-50EA-AC48-F557BD794E8D} = {ED97BD71-2A08-5826-8CD2-D90D2FA14B66} + {BA153C94-5786-5DFB-BF46-5456F314640D} = {F246CAA7-1A3C-5F2A-B6C4-ADF43C72EBC8} + {59194DA8-0065-5FA5-9E4C-9F1D1A141D0D} = {69DD2687-443E-5E29-B334-E9409586F6B3} + {85BFD986-36C4-5D47-9BD8-07211AEC3A03} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} + {C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} + {671DB4E9-704C-515F-B954-4A11384AC422} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} + {620AF63F-D189-5EDE-92BB-F610F5DB878C} = {01BBCE99-BB2B-5A62-96B2-8C5C94221492} + {174F6B92-7B4B-5364-9FFA-B0922315E394} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} + {3D5B082E-6F16-5078-B163-57F545C6441D} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} + {D52682FC-295E-53A2-B101-0BC60D53BEF1} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} + {A3C2D3DE-A5EC-5685-8AF2-BD6BC22C9AF9} = {85BFD986-36C4-5D47-9BD8-07211AEC3A03} + {27C02428-144F-598E-A2B3-D74AB3A60BC2} = {C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6} + {099EB392-DF89-5A9E-B1CC-7B60A16C61B5} = {C5EEA846-ECF7-5091-9CBE-3DBCB6BA09D6} + {B4897CA0-8501-586C-AFA3-502ECDCB58FD} = {671DB4E9-704C-515F-B954-4A11384AC422} + {88F0AAA9-7AB4-5B38-9132-675E0CF0E032} = {620AF63F-D189-5EDE-92BB-F610F5DB878C} + {16CA4052-C32A-5EE4-A1E6-8DE81963D200} = {DEAB797C-CFE8-568B-A47A-549B8F4838A6} + {F82852B2-BCCB-5338-B6FC-DF7BE18CF99A} = {DEAB797C-CFE8-568B-A47A-549B8F4838A6} + {39D079A8-9BEC-5C96-9670-7FFCB16094D4} = {DEAB797C-CFE8-568B-A47A-549B8F4838A6} + {509995C7-1637-5E0A-8F11-0F5E54B77209} = {16CA4052-C32A-5EE4-A1E6-8DE81963D200} + {DC2AE149-8B7E-5EFC-896D-F3AFFBD64EA1} = {F82852B2-BCCB-5338-B6FC-DF7BE18CF99A} + {5AA07819-E820-54D5-8A68-69F791EDC4E4} = {39D079A8-9BEC-5C96-9670-7FFCB16094D4} + {BCB84E5F-2F49-53C9-8E91-EAA790F511B8} = {39D079A8-9BEC-5C96-9670-7FFCB16094D4} + {A054E1EC-4757-5B74-83D2-BF7B0F163365} = {F59ED1AE-6A2E-5465-81EB-52CFA175CBE6} + {B7CA7A16-AAFB-5A8F-B598-0284ED7DF744} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {2E7B8D21-CAD8-5844-B59F-7A487E6594DD} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {F30EF61D-A7FC-5689-A06F-42A152CF7393} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {96610609-85C7-5F09-B765-A86463A8DBDE} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {E5A69860-1704-5FB1-BFA3-5872182D4829} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {1F5FFF7C-AF58-5C3E-9981-EE5E978426E8} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {51652C28-0583-5556-A941-D16D99F97B82} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {068138BD-177D-5359-B0DD-A369BB607E95} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {91306E2D-A310-50D1-B64F-47A158D42085} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {F2126F28-8343-5BEB-BE5D-D0E4F7CA1A93} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {59234A8C-D502-5965-AAFC-19739C833885} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {2CE72B3D-4D13-500A-A44D-76029069C773} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {422C9F81-D3AB-5EFC-A6CD-245C7FA24ADF} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {8F7505CD-473C-590A-8851-FA762AB5E214} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {B2ABA214-83FB-5E9E-8AD4-2D54E579310A} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {3EC6A343-75E8-511F-A767-8FAB9EC79A62} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {37DF1BF6-AD9C-59A2-8F10-512ABE804ED3} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {A93B89A8-E39D-560B-82E8-96EAEA545A28} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {DF5A6010-D88B-5327-8E1A-74F2A716D340} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {C7E0CDBA-5E91-546C-AE25-27D0C82F1A23} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {B143BD73-A4D7-51F3-804E-03CE8C6CF639} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {53EEFE3D-CE01-598F-9EE0-49DF5F6806BF} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {96E7DE01-9824-53C8-B4A6-5E8BA4BD42E3} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {FB55B7A8-C0F5-53EE-B9E9-B66F4E4D453B} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {2063D4CC-6C01-5693-B0B9-1376FB928E43} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {B0A0E3D1-FF2E-5005-B619-4523C2A2C955} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {004D507B-32A2-5704-8747-412E7B8EFAE4} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {FA6CBA17-E0E7-5C13-ADC3-0FB73949CCE0} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {62186A00-3E04-51EF-9497-258A973D6E24} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {81DADA98-669F-5B5B-8C31-EA3B5CF77380} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {768155E4-8D91-5A02-A006-2B357C033E25} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {DCA9FEBF-076C-5040-BFE8-1F8A0088DE79} = {A054E1EC-4757-5B74-83D2-BF7B0F163365} + {27148056-45FD-547F-9F8A-6A56C8487DCB} = {7A6E52D8-29D2-5529-A394-BDF7AB0B84A0} + {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} = {7A6E52D8-29D2-5529-A394-BDF7AB0B84A0} + {9D3B5FD2-1692-5817-89D3-2E5950F83EB7} = {7A6E52D8-29D2-5529-A394-BDF7AB0B84A0} + {3F7D6DBC-E43C-55FF-A5B6-EDC0823C4B07} = {27148056-45FD-547F-9F8A-6A56C8487DCB} + {BC484F0A-AA81-5FBC-AC4C-D6C7B40CE270} = {27148056-45FD-547F-9F8A-6A56C8487DCB} + {3E04DC13-CF7A-5EDC-8D57-26769FD1BEA7} = {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} + {5682D20E-74D9-50D6-B400-8EE39D2ADF42} = {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} + {73F03316-B1CB-55DC-A3D6-9C9758CFFFEB} = {C1960B91-BB31-5A60-9FA0-DA2D5E4B44CF} + {ADDC25AD-9056-59DE-95EE-453A90D2D519} = {9D3B5FD2-1692-5817-89D3-2E5950F83EB7} + {9FEBBFD8-3A0B-5249-89ED-239B8E9697CC} = {F171E782-0A1A-586D-9349-7C69A2500836} + {4430BC6C-9ACC-5034-8BE9-A39F8A5FC45E} = {F171E782-0A1A-586D-9349-7C69A2500836} + {A002946E-4486-51F0-A132-2654E3DDB4E9} = {9FEBBFD8-3A0B-5249-89ED-239B8E9697CC} + {D84DFC26-3A6B-539F-822D-CE326F7DB9B4} = {9FEBBFD8-3A0B-5249-89ED-239B8E9697CC} + {07CBEBEF-B614-5A84-BFEB-A8548E20F1E9} = {4430BC6C-9ACC-5034-8BE9-A39F8A5FC45E} + {5EC80510-3F29-54FD-8848-05902F3B5063} = {C565F805-B835-571C-B5F4-136F31FCDF47} + {0CB37973-516C-53DC-BD58-91B698F3B258} = {C565F805-B835-571C-B5F4-136F31FCDF47} + {F3495690-6B86-5FEC-BBB4-DD899C2E419E} = {5EC80510-3F29-54FD-8848-05902F3B5063} + {5CD4FACE-A9E3-5F9A-9F1F-713334D79F5A} = {0CB37973-516C-53DC-BD58-91B698F3B258} + {52051AD4-A4F5-53C2-905A-812A85994CCD} = {E98E0B62-3DB3-518D-A10C-006A509713BC} + {64374268-E685-5130-B546-4FAFCF95CD2A} = {E98E0B62-3DB3-518D-A10C-006A509713BC} + {87C7FE69-A978-534E-8646-18D30C34F667} = {E98E0B62-3DB3-518D-A10C-006A509713BC} + {D3BA9C21-1337-5091-AD41-ABD11C4B150D} = {52051AD4-A4F5-53C2-905A-812A85994CCD} + {849DA55E-D3D1-5E35-A339-B1AC4590E0A3} = {52051AD4-A4F5-53C2-905A-812A85994CCD} + {CEE84738-20C1-5800-B982-E331652C3917} = {52051AD4-A4F5-53C2-905A-812A85994CCD} + {B118588F-2F12-5CA8-8EED-426A7D34FF9A} = {64374268-E685-5130-B546-4FAFCF95CD2A} + {7D3BAFD9-4120-5A6A-B215-10AB461844EB} = {87C7FE69-A978-534E-8646-18D30C34F667} + {27196784-FFEA-59AB-8F26-3840EDF6C831} = {87C7FE69-A978-534E-8646-18D30C34F667} + {69AE1332-70C7-501D-A64E-F769F52B2449} = {87C7FE69-A978-534E-8646-18D30C34F667} + EndGlobalSection +EndGlobal \ No newline at end of file diff --git a/src/StellaOps.slnx b/src/StellaOps.slnx new file mode 100644 index 000000000..ba788ff0d --- /dev/null +++ b/src/StellaOps.slnx @@ -0,0 +1,2 @@ + + diff --git a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/BundleIngestionStepExecutorTests.cs b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/BundleIngestionStepExecutorTests.cs index 6b53ffabe..5b3798c38 100644 --- a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/BundleIngestionStepExecutorTests.cs +++ b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/BundleIngestionStepExecutorTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json.Nodes; +using System.Text.Json.Nodes; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.TaskRunner.Core.Configuration; @@ -73,7 +73,6 @@ public sealed class BundleIngestionStepExecutorTests public async Task ExecuteAsync_MissingChecksum_Fails() { using var temp = new TempDirectory(); -using StellaOps.TestKit; var source = Path.Combine(temp.Path, "bundle.tgz"); var ct = TestContext.Current.CancellationToken; await File.WriteAllTextAsync(source, "bundle-data", ct); diff --git a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/FilesystemPackRunArtifactReaderTests.cs b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/FilesystemPackRunArtifactReaderTests.cs index 2adc24dc2..570b376cc 100644 --- a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/FilesystemPackRunArtifactReaderTests.cs +++ b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/FilesystemPackRunArtifactReaderTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.TaskRunner.Infrastructure.Execution; @@ -25,7 +25,6 @@ public sealed class FilesystemPackRunArtifactReaderTests public async Task ListAsync_ParsesManifestAndSortsByName() { using var temp = new TempDir(); -using StellaOps.TestKit; var runId = "run-1"; var manifestPath = Path.Combine(temp.Path, "run-1", "artifact-manifest.json"); Directory.CreateDirectory(Path.GetDirectoryName(manifestPath)!); diff --git a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/PackRunProvenanceWriterTests.cs b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/PackRunProvenanceWriterTests.cs index 75d96e0f6..9ffaf0db5 100644 --- a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/PackRunProvenanceWriterTests.cs +++ b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/PackRunProvenanceWriterTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using System.Text.Json.Nodes; using StellaOps.TaskRunner.Core.Execution; using StellaOps.TaskRunner.Core.Execution.Simulation; @@ -30,7 +30,6 @@ public sealed class PackRunProvenanceWriterTests Assert.True(File.Exists(path)); using var document = JsonDocument.Parse(await File.ReadAllTextAsync(path, ct)); -using StellaOps.TestKit; var root = document.RootElement; Assert.Equal("run-test", root.GetProperty("runId").GetString()); Assert.Equal("tenant-alpha", root.GetProperty("tenantId").GetString()); diff --git a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/TaskRunnerClientTests.cs b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/TaskRunnerClientTests.cs index 6ee55491c..f54eaee98 100644 --- a/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/TaskRunnerClientTests.cs +++ b/src/TaskRunner/StellaOps.TaskRunner/StellaOps.TaskRunner.Tests/TaskRunnerClientTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using StellaOps.TaskRunner.Client.Models; using StellaOps.TaskRunner.Client.Streaming; using StellaOps.TaskRunner.Client.Pagination; @@ -59,7 +59,6 @@ public sealed class TaskRunnerClientTests """; using var stream = new MemoryStream(Encoding.UTF8.GetBytes(ndjson)); -using StellaOps.TestKit; var entries = await StreamingLogReader.CollectAsync(stream, ct); Assert.Equal(2, entries.Count); diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/GoldenSignalMetricsTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/GoldenSignalMetricsTests.cs index 9043c17cf..081c04ab9 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/GoldenSignalMetricsTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/GoldenSignalMetricsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Metrics; @@ -179,7 +179,6 @@ public sealed class GoldenSignalMetricsTests : IDisposable }; using var metrics = new GoldenSignalMetrics(options); -using StellaOps.TestKit; for (int i = 0; i < 10; i++) { metrics.IncrementRequests(1, GoldenSignalMetrics.Tag("unique_id", $"id-{i}")); diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/IncidentModeServiceTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/IncidentModeServiceTests.cs index 3e9289e65..1cad30771 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/IncidentModeServiceTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/IncidentModeServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -480,7 +480,6 @@ public sealed class IncidentModeServiceTests : IDisposable using var service = CreateService(opt => { opt.Enabled = false; -using StellaOps.TestKit; }); var result = await service.ActivateFromConfigAsync(); diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/ProofCoverageMetricsTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/ProofCoverageMetricsTests.cs index d94e84977..97cdc838d 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/ProofCoverageMetricsTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/ProofCoverageMetricsTests.cs @@ -1,4 +1,4 @@ -using Xunit; +using Xunit; using StellaOps.TestKit; @@ -25,7 +25,6 @@ public sealed class ProofCoverageMetricsTests { using var metrics = new ProofCoverageMetrics(); -using StellaOps.TestKit; metrics.RecordScanCoverage( tenantId: "tenant-1", surfaceId: "surface-1", diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeFileExporterTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeFileExporterTests.cs index 05a30c3a3..5d2afda4d 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeFileExporterTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeFileExporterTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text; using Microsoft.Extensions.Logging; @@ -253,7 +253,6 @@ public sealed class SealedModeFileExporterTests : IDisposable using var exporter = CreateExporter(opt => { opt.MaxBytes = 50; -using StellaOps.TestKit; opt.MaxRotatedFiles = 2; }); exporter.Initialize(); diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeTelemetryServiceTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeTelemetryServiceTests.cs index b59220374..fa2724c90 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeTelemetryServiceTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/SealedModeTelemetryServiceTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -347,7 +347,6 @@ public sealed class SealedModeTelemetryServiceTests : IDisposable public void RecordDriftEvent_DoesNotThrow() { using var service = CreateService(opt => opt.Enabled = true); -using StellaOps.TestKit; var endpoint = new Uri("https://collector.example.com"); // Should not throw diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryContextTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryContextTests.cs index 61fca9b4d..5799e39c7 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryContextTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryContextTests.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using Xunit; @@ -80,7 +80,6 @@ public sealed class TelemetryContextTests public void TraceId_ReturnsActivityTraceId_WhenActivityExists() { using var activity = new Activity("test-operation"); -using StellaOps.TestKit; activity.Start(); var context = new TelemetryContext(); diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryExporterGuardTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryExporterGuardTests.cs index 9a198f3d1..c3a8fc5c9 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryExporterGuardTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TelemetryExporterGuardTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; using StellaOps.AirGap.Policy; @@ -49,7 +49,6 @@ public sealed class TelemetryExporterGuardTests var provider = new CollectingLoggerProvider(); using var loggerFactory = LoggerFactory.Create(builder => builder.AddProvider(provider)); -using StellaOps.TestKit; var guard = new TelemetryExporterGuard(loggerFactory.CreateLogger(), policy); var descriptor = new TelemetryServiceDescriptor("PolicyEngine", "1.2.3"); var collectorOptions = new StellaOpsTelemetryOptions.CollectorOptions diff --git a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TtfsIngestionServiceTests.cs b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TtfsIngestionServiceTests.cs index 6be5f65d9..898b92dd8 100644 --- a/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TtfsIngestionServiceTests.cs +++ b/src/Telemetry/StellaOps.Telemetry.Core/StellaOps.Telemetry.Core.Tests/TtfsIngestionServiceTests.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.Metrics; +using System.Diagnostics.Metrics; using Microsoft.Extensions.Logging; using StellaOps.Telemetry.Core.Triage; @@ -140,7 +140,6 @@ public sealed class TtfsIngestionServiceTests : IDisposable public void IngestEvent_DecisionRecorded_RecordsDecisionMetricsAndClickBudgetViolation() { using var loggerFactory = LoggerFactory.Create(_ => { }); -using StellaOps.TestKit; var service = new TtfsIngestionService(loggerFactory.CreateLogger()); service.IngestEvent(new TtfsEvent diff --git a/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/EvidenceLinkageIntegrationTests.cs b/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/EvidenceLinkageIntegrationTests.cs index 3af5dbe01..cdd9a6828 100644 --- a/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/EvidenceLinkageIntegrationTests.cs +++ b/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/EvidenceLinkageIntegrationTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using StellaOps.TimelineIndexer.Core.Models; using StellaOps.TimelineIndexer.Infrastructure.Subscriptions; using StellaOps.TimelineIndexer.Core.Abstractions; @@ -63,7 +63,6 @@ public class EvidenceLinkageIntegrationTests Assert.Equal(manifestUri, evidence.ManifestUri); using var doc = JsonDocument.Parse(expectedJson); -using StellaOps.TestKit; var subject = doc.RootElement.GetProperty("subject").GetString(); Assert.Equal(subject, evidence.AttestationSubject); } diff --git a/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineIngestionWorkerTests.cs b/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineIngestionWorkerTests.cs index 7124ceb10..13bd945d9 100644 --- a/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineIngestionWorkerTests.cs +++ b/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineIngestionWorkerTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using StellaOps.TimelineIndexer.Core.Abstractions; @@ -66,7 +66,6 @@ public sealed class TimelineIngestionWorkerTests services.AddLogging(); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var hosted = provider.GetRequiredService(); var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2)); await hosted.StartAsync(cts.Token); diff --git a/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineWorkerEndToEndTests.cs b/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineWorkerEndToEndTests.cs index 3c8909513..5e7b8209e 100644 --- a/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineWorkerEndToEndTests.cs +++ b/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Tests/TimelineWorkerEndToEndTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // TimelineWorkerEndToEndTests.cs // Sprint: SPRINT_5100_0010_0002_graph_timeline_tests // Tasks: TIMELINE-5100-003, TIMELINE-5100-004, TIMELINE-5100-005 @@ -21,8 +21,8 @@ namespace StellaOps.TimelineIndexer.Tests; /// /// WK1 Worker Layer Tests -/// Task TIMELINE-5100-003: Worker end-to-end (subscribe → process → ack) -/// Task TIMELINE-5100-004: Retry tests (transient fail → retry → success) +/// Task TIMELINE-5100-003: Worker end-to-end (subscribe → process → ack) +/// Task TIMELINE-5100-004: Retry tests (transient fail → retry → success) /// Task TIMELINE-5100-005: OTel correlation (trace_id from event propagates to span) /// public sealed class TimelineWorkerEndToEndTests @@ -354,7 +354,6 @@ public sealed class TimelineWorkerEndToEndTests services.AddLogging(); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var hosted = provider.GetRequiredService(); var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3)); diff --git a/src/Tools/PolicySchemaExporter/PolicySchemaExporter.csproj b/src/Tools/PolicySchemaExporter/PolicySchemaExporter.csproj index 41184f004..7fccccd00 100644 --- a/src/Tools/PolicySchemaExporter/PolicySchemaExporter.csproj +++ b/src/Tools/PolicySchemaExporter/PolicySchemaExporter.csproj @@ -10,7 +10,6 @@ - diff --git a/src/Unknowns/__Tests/StellaOps.Unknowns.Core.Tests/StellaOps.Unknowns.Core.Tests.csproj b/src/Unknowns/__Tests/StellaOps.Unknowns.Core.Tests/StellaOps.Unknowns.Core.Tests.csproj index eeb96967d..85b414ce6 100644 --- a/src/Unknowns/__Tests/StellaOps.Unknowns.Core.Tests/StellaOps.Unknowns.Core.Tests.csproj +++ b/src/Unknowns/__Tests/StellaOps.Unknowns.Core.Tests/StellaOps.Unknowns.Core.Tests.csproj @@ -24,7 +24,7 @@ - + diff --git a/src/Unknowns/__Tests/StellaOps.Unknowns.Storage.Postgres.Tests/PostgresUnknownRepositoryTests.cs b/src/Unknowns/__Tests/StellaOps.Unknowns.Storage.Postgres.Tests/PostgresUnknownRepositoryTests.cs index afb58c1de..d571831d5 100644 --- a/src/Unknowns/__Tests/StellaOps.Unknowns.Storage.Postgres.Tests/PostgresUnknownRepositoryTests.cs +++ b/src/Unknowns/__Tests/StellaOps.Unknowns.Storage.Postgres.Tests/PostgresUnknownRepositoryTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Npgsql; using StellaOps.Unknowns.Core.Models; @@ -127,7 +127,6 @@ public sealed class PostgresUnknownRepositoryTests : IAsyncLifetime """; await using var command = new NpgsqlCommand(schema, connection); -using StellaOps.TestKit; await command.ExecuteNonQueryAsync(); } diff --git a/src/__Analyzers/StellaOps.Determinism.Analyzers.Tests/CanonicalizationBoundaryAnalyzerTests.cs b/src/__Analyzers/StellaOps.Determinism.Analyzers.Tests/CanonicalizationBoundaryAnalyzerTests.cs index 943a032a3..1215c530c 100644 --- a/src/__Analyzers/StellaOps.Determinism.Analyzers.Tests/CanonicalizationBoundaryAnalyzerTests.cs +++ b/src/__Analyzers/StellaOps.Determinism.Analyzers.Tests/CanonicalizationBoundaryAnalyzerTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // CanonicalizationBoundaryAnalyzerTests.cs // Sprint: SPRINT_20251226_007_BE_determinism_gaps // Task: DET-GAP-18 @@ -213,7 +213,6 @@ public class CanonicalizationBoundaryAnalyzerTests var testCode = """ using System.Text.Json; -using StellaOps.TestKit; public class SigningAttestor { public string CreatePayload(object data) diff --git a/src/__Libraries/StellaOps.Cryptography.Plugin.SmRemote.Tests/SmRemoteHttpProviderTests.cs b/src/__Libraries/StellaOps.Cryptography.Plugin.SmRemote.Tests/SmRemoteHttpProviderTests.cs index 69a717664..8c3894d2e 100644 --- a/src/__Libraries/StellaOps.Cryptography.Plugin.SmRemote.Tests/SmRemoteHttpProviderTests.cs +++ b/src/__Libraries/StellaOps.Cryptography.Plugin.SmRemote.Tests/SmRemoteHttpProviderTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; @@ -25,7 +25,6 @@ public class SmRemoteHttpProviderTests using var app = new WebApplicationFactory() .WithWebHostBuilder(_ => { }); -using StellaOps.TestKit; var client = app.CreateClient(); var status = await client.GetFromJsonAsync("/status"); status.Should().NotBeNull(); diff --git a/src/__Libraries/StellaOps.Cryptography.Tests/PolicyProvidersTests.cs b/src/__Libraries/StellaOps.Cryptography.Tests/PolicyProvidersTests.cs deleted file mode 100644 index b2111fa1e..000000000 --- a/src/__Libraries/StellaOps.Cryptography.Tests/PolicyProvidersTests.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Security.Cryptography; -using System.Text; -using FluentAssertions; -using StellaOps.Cryptography; -using Xunit; - - -using StellaOps.TestKit; -namespace StellaOps.Cryptography.Tests; - -public class PolicyProvidersTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task FipsSoft_Signs_And_Verifies_Es256() - { - Environment.SetEnvironmentVariable("FIPS_SOFT_ALLOWED", "1"); - - var provider = new FipsSoftCryptoProvider(); - using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); - var key = new CryptoSigningKey( - new CryptoKeyReference("fips-es256"), - SignatureAlgorithms.Es256, - ecdsa.ExportParameters(true), - DateTimeOffset.UtcNow); - - provider.UpsertSigningKey(key); - - var signer = provider.GetSigner(SignatureAlgorithms.Es256, new CryptoKeyReference("fips-es256")); - var data = Encoding.UTF8.GetBytes("fips-soft-provider"); - var signature = await signer.SignAsync(data); - - (await signer.VerifyAsync(data, signature)).Should().BeTrue(); - provider.GetHasher(HashAlgorithms.Sha256).ComputeHash(data).Length.Should().Be(32); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task EidasSoft_Signs_And_Verifies_Es384() - { - Environment.SetEnvironmentVariable("EIDAS_SOFT_ALLOWED", "1"); - - var provider = new EidasSoftCryptoProvider(); - using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP384); -using StellaOps.TestKit; - var key = new CryptoSigningKey( - new CryptoKeyReference("eidas-es384"), - SignatureAlgorithms.Es384, - ecdsa.ExportParameters(true), - DateTimeOffset.UtcNow); - - provider.UpsertSigningKey(key); - - var signer = provider.GetSigner(SignatureAlgorithms.Es384, new CryptoKeyReference("eidas-es384")); - var data = Encoding.UTF8.GetBytes("eidas-soft-provider"); - var signature = await signer.SignAsync(data); - - (await signer.VerifyAsync(data, signature)).Should().BeTrue(); - provider.GetHasher(HashAlgorithms.Sha384).ComputeHash(data).Length.Should().Be(48); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void KcmvpHashOnly_Computes_Hash() - { - Environment.SetEnvironmentVariable("KCMVP_HASH_ALLOWED", "1"); - - var provider = new KcmvpHashOnlyProvider(); - var data = Encoding.UTF8.GetBytes("kcmvp-hash-only"); - - provider.Supports(CryptoCapability.ContentHashing, HashAlgorithms.Sha256).Should().BeTrue(); - var digest = provider.GetHasher(HashAlgorithms.Sha256).ComputeHash(data); - digest.Length.Should().Be(32); - - provider.Invoking(p => p.GetSigner(SignatureAlgorithms.Es256, new CryptoKeyReference("none"))) - .Should().Throw(); - } -} diff --git a/src/__Libraries/StellaOps.Cryptography.Tests/PqSoftCryptoProviderTests.cs b/src/__Libraries/StellaOps.Cryptography.Tests/PqSoftCryptoProviderTests.cs deleted file mode 100644 index 2470fed56..000000000 --- a/src/__Libraries/StellaOps.Cryptography.Tests/PqSoftCryptoProviderTests.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Text; -using FluentAssertions; -using Microsoft.Extensions.Options; -using Org.BouncyCastle.Security; -using Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium; -using Org.BouncyCastle.Pqc.Crypto.Falcon; -using StellaOps.Cryptography; -using StellaOps.Cryptography.Plugin.PqSoft; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Cryptography.Tests; - -public class PqSoftCryptoProviderTests -{ - private const string DeterministicMessage = "pq-deterministic-msg"; - private const string DilithiumPrivate = "oYBqsu5PY/ni2bGQa7tcWid2G7PsU2Z7LcquwBX7GVTEYRMHrlE3aj9C/ypoMmtaV93SAAjUQyTgUldNIeCPHdcunAPocvlZ9QAaxGYoDhCgXS/BKkdsuQl2B4rZfYrIJfPBBpbkebSbgr2o2BgzGcTzfdA9VD+HnO3vRSk2SNlyeCUiEjcwWEeIcWNDg1ZTEAcGZzQTVCNzaBeIdUV4d1hVBwdhR4gAV2M2U0IVdWEUM3RmcWRGBHGAd1MYMXeDYgF4Y4gDgwUmKDUhEkAohnQwIjcYOAUFFEN4UgZ0YDgBBISEBjVHVEFhVxVYUyNlaHASIXJXBYOHQyImCGQUZFIkhohgEzc4EAYgBxYShRBRKFdUMkNXIQWDaFEldQFVBTZEdkBYQyhCAEMQgYAUMoURSBYoeFZ4eBA3YVWAiDaGaFIxV1N2NDgVBFFjFmNTYmhkBGchA1JRdlJ2U0dIg3iCRnJDIYVhhyURMEMAZlBHSCY1GHKIVSQXKBhTZlNlEFQCaIUjdmSAMzMyQlRRiEZyEAF2RodBYXVnVwEkZSKFdoJ3Q0dBYoZGRIIIh2YDd3d1MScWNRIhAEI4BTcERAQmUSUUVzFXQlhQBWFiiBQDh4QBaEYRFkBWEhYxF4FCVSQxYyQjAQh2ZmNHByNkZFgId2cUNSaDcQRiUXJgGCGHdjV3QhB2ESZWYGM4YQIVOEcAZhdEIjcVQEYIY4AnJCEWNYYRBENgNVNlFUhiMoRwaAQ1RQd4KIhWUEY0FxKAZCRnaDhlCBEiAyCDQBcAUYWHI2cIVlEUOBKAciiDJBaBcBVUJRZEIBMEdhdhUxhXYhFReBMIJERlCEUwQSByBhNGUyVjRlV1dUhxNTIlE4SBEURjaCJWiDVHdIMRRxZUQicYQDVROEYUcYEWEHhjFhARZjBBVYVzgXUgd0NXADNChkFVQ1Z4chByEIQoJTJ0UFYTEDZRIGRQd4ZRR1gTYmWCA0NTKABzUyUAh3gyQTcxhiBYJGAiSDWCRnIwBjIIZCZ0gTJYJgh4MABRVocRI2VUhxJCFHIQIxBCCBAHJBRyVhETZCKHAjVYVoZzI3h4A4gDcSh1FgQgEFMxN1dmNQdBSAclYVJRc4Z1RXgzhURFEjFDhygTeBVYJhV2hoEYMBVwc1hxgmdnJBYHKDF4IQJDhVIDgyBRFiciACdTAzYWd4UnAyQ4JHhoUyhlaFBxhwEzADNwQEeAYiMBZgZ0dwUQIiZFFUgUY2VQMFQ4V2gwQwEzITd4ZiAXNDgIJwCEAnc3MkWBVlVHdFaBgUIXcAiCdyQiQlVEgARUCBglCGREGBYIVIJzRhJgI3cEMRBEMXQ4YIYRYmM4ACIFZ4NRczI0Y1QSSICEUTQVE2NACGhjIGIUZQaBhHZTNzUCVGcTRCERNhKANEQ0hxBDU3ZoRXeHZSNGgEEhA4YGR1gYRwIXcENwMzdxgXcYEXZiVCRndSQGEHRiITEUdhZIA3eGV1VFKABnYBBWeDNEV3MBCGdmOGZxJXhQdDSECEOAhSiIBFRWA0dzgFcSVEOAYGVWMlhzYyATRidgJliCV4hHdWViZYNwVCdlIyh4gjgFGDBxg4GIFlFgF2hzN0IxIXNTQxgxRYdkFSQYYWVVOIQEclcxBHNDiFZWQSFCZgV1ZQVFcFFFIAAAMygoSHUyRVhwNoaBVoEFcVQxSEdXdAFoSDB4Q4J3dDY1BGgVFkVnNHZWYmiEVHRFQHgXVShABxBgBxhIZ1dXUmdxIRNDCBYFZ3YCZBAxYgiBEkBkB3QhNTAwU1ZjM4dTJTQgWIcSBVB1hmaDAWMFNQZlRFMWE2NhZ3MkNlYYYlMkiAUiUXAoATAHIDZ1iGV1R3FQhWR3ODUjITWFAgh0J0chcYNCdiGCYBQoQiNIBXZheCYDgAd0dGM2dAOBBDICSEc1IGQoInYDaIMSJQZiVXM1BRREZGEnQGFGU2ZjIUEBRIImiDhydiSGIngSh2giVAQjRGKHKBZ1ASYDVYEoMnVxeCQRBYh4hwNwJYRHN0ZjIjVYBXF4URRQXqN5K4/Rl33pDgT54QwlorpcS6eNKA/0r9/t1xH5g5bckJN13q4m8q3CaXu65zYG1kQ0wX1FjrSZCa/xCj68gMWsD+dHXdc06U/IN4SL33gacoaxiN0LIAoS6JWALyWDU3T0fQ14+Z4pnjsKkGe14HNG6e9R/J0AjfHbshDYGcbIyVgz6HddSzkxnWybI967svTldKYi4bGvixkDGPY8xMScuntBPp3WofNXnPhiBeaJw49Gi1Z2vAzbt/HR+iVUh2A5LimlnH23Su4gSl5HcHLLMvh+6sfWGzuSENA65yAR2N0CCJI1p57a/csBa8wBZAn7voTL6c5k+pk5hHc2m43WX1zphxrbQBIA0cJcTrvMZ/mCyvoxQrnC5R0VPz9rsazSppSToG4FxwENm10Br720VZdfxMfYy0IWE3urSPUnkNZvhR67v20ll0ShNG/W2ptjiW+IubE2Qe4c3l5vq99A0v7byR+L7CG5yyiuig9WrlbVe3kEQvkcva4w0Qwm1LRxGPInUap8z7lGc/db0xp98YBPOKtayrtHQDMOHgV4ECXtfACdxuKB8hTctzv9rZlYtgWJCmzPRD6ogarEI4VNq5vECv1lvweq1gWY5WffxFixm5jHpt0tcHct6BlLCkWuYdiP5HsMqfHPEtko8Ebs/OWjHv2PVDuC2HhrfvvdK/OOtiiljflU/DocIXc/mrHVuvboMrQ8FUd4jaXpg+IUXHb61jBP68cNujNaOakEQ1ycKreuN6Edr+jbb7MtPxmk+yVH+Vorv4sMsLZfuBbbfp+3MnWG/PcThtLexnAz3NOTW8fBgX7CYOVCKjm9YYww15z3d2gIfU6gfN1H9URNMPVLJ3kye+FAftBtaPem+r3GHFCIGutNaz3tog2P0dJF35S5jPXcn5FAS8bzulct583mB5l256Ydf9nSZD7W2PXWXaPNEPx+3VZ6HhPfhu9P4uo4xVKz3QL9UHIFxTOi9OfJtG2mkPKtLhx3NCMoogiugavLLlDgKyJfmVy2y356VIFs0H6V/4+QbEEOAnkySM07xJvzTo5MVWcQ9a1oNf1NJr71cBRea0YVMPyWnoz2L5E4ieL6HyHzvd7TGA/+Jdmw9vYDrvUbjcmu98nldOSKye1IGFM1lnguWvFPsag6tfQwK0e/0nnx2t8qWGc0qR11kos5LDrWtHYl9ztcwA+VvrQWmvwGbS1J+6MfKxDnSkh1QzzvUGt1oyE6OtSOnsmO6VNjVbvTncIg0JQykbjPZPjWzLLjCQaav6veFh7zKvOJemg9FvA0xwj+Uh50X0Y8Qk8J5FXQJgCBE0UPmqQHPqXaJKlx2cUis1dOZBSqxuYkMqex93NzEZy2GfuKnRQaykzKtdXmKkakNSPBVKYJXL30dxrg+Rdh8DXUpDBw1A5qvirwzaPCgqUkmemL5dgENB3/O5bWIKdLXv7Z66mDmPVI2oZmGlrqw5LpwTU5PpCDhZI+JHvNitTdwzTOVVvqANe+hRsydaHbnQxMNvagr27QodK3dcVEUjSdJ5sheKX5kpFg+uPwuOIIPGydN1aCv2CltLSt/b3lr+Yt/QLL+cXgK4WpOd6t4aL9WbpzK8uaOMS6Ll3eeh2ylzntfoSDiaImANycpQEVocoin4snwPP9Fk4RDPuh3G2Kbu3FIqKmXVqYqJE8gPYNAcliTnSCSXdTGOm/SF65rX7FE1+jIAuVXumu1e2IqEeP2Izg8QnRkorjJYFbUJxoqzThheZkpUtG49fIByLFejaMX+iJkJpINvemSsbdihprAa4LnnRDwiJ5ckFXzhfjgnhQN5+xyJZDTmaEY1GuYH9W41ZFqRlqwcWi9p3+03OMwiPM/Vceuo8MeqfVWtOqTk7g91BsVIpm2TF7ttxYKxUWI1PEn2BIFNsPDM5s9qbtrKkzyM+DwaX1J8jxMPKU57FG2cyVUm7sJ8dE+gWalkK0tkQBHtL4GqLbdw6EIuk1YR5I7RXEvACJsXatiMxjJ4STNTibaZETRDRcgLmI2EJwIDG65LlfRnAfLAanwJ0Raezi1h6Q9WD/nB1Ar/6ZmbWJwfoUVZ2T9JyNo1GYdIvAwrdInjzit3dcPciEsJb4nObf0RuwZn+VIDA+QJjEaLze6FgAllaBKIvgYzrpqShXIbQYUkWhxhRspIT96XxxtJPItrxYyIdLqpfX/J1RS+OcjU5taSzt0mGaOkAUnLfkbYFmNMys8kdtC8ecl09bEk8p3IdjLNRBzusmKpqSmL+frdvJSzFe94LOiMSoXeZLY4hdHHuHC8ldphPhJ23gmP401d5BfE2uzvTHKud6WtMj0JrWOJqT3OnQgk7r+qGWEhaA3zhNe+Ha4r6J0DUPq6Fi4A4IdAeNxPQbOMAsuX0E1SDu/6VGY/VcADdhlNhwFD3TFbFyA66TvHXfd7tWaPMOb5YU7U1/bLMawnK1g7mX0cKa7uN5f9nTwK8K+5XXpcDMca4OLZ2qwMLpIITODdpWy9iHsCc/K1JXJULMT4IgCWhVYyySdWvMlM77SYTDaEMxL/l5P14sKlkCDq2R5YvVEkFnvmBekxyPOhbmwWrLXubRj7MRGCFkWCkTDqkZjz25OzT5RP9z7aRAg581+WT/bzKyVkeqypWlThnfkwK+Pva7loq+ww19c07iXmFXMukbViYaD41HK0+KZk8W8nmAkhlJ/UEFvyfrGHdgtWbJ7t/4ajqYwxpezvU8FiPHQwQ+djYmYESgzeKWlQvKgkHNc09dZlaAhVyALK1egtTw2KMhagodtqkzJhCprG2UdCqlxY/DEKfpmsBJfBGHBF134Xd+kA87EbuJFaZiEDOsYUp5VgdfHesjsDNqJiHtFV2azhl8JB7LB3Izzxo9wUfcOaGQod5Jk0gIihzf7CZaWZPAgUPlapv+1/xZSSZj0lKXilMzDTtNjkc19tivxCEWiwIdmuLeJMkKtKOJYHDYJT2xHfIvBdmO4wX9Me1VGl7RpHEBlu5+tox2e4eu7gOfSPWavg303YrHboAwQyX/rf3lBzUQ9xOpMW0bYPP6bMVAcJtL5oHJOzCBgU3STiVZwSs07p9h+7RLx+qwYozqS/l/fdly6/HKi1kOOenVmSBTUgYCPGSXhL1NVVNz12oNOacZDy9U5SyZ8e3nkAC42Qp6wOeSCeYCfFDpHRwxwEj2dkjwK/SradKBLdhaGGgHh91yvX4LD/ln4uGQuACDRffkMhSHvy+fRtYMSgBGLopCTJwXO5eb1Mb8RYE/10BRsEhraAGNlFxdS0+C/LGa4dxQKQ4PkVQbuwKUACvNWuVaJAsaurYzHW7n3Vor"; - private const string DilithiumPublic = "oYBqsu5PY/ni2bGQa7tcWid2G7PsU2Z7LcquwBX7GVS+X7FkMVZbTbBPN//XBtAYLY9BTpzRaVosF2GkjZNM+twqXPJguJ65qeY6myL9xc1Bbtfa8v8iPygjkbCIssA7q5MJvpIrdp6zWv+B+bQEiKBTDoaRFeXZlbr7rngszf9hrbBmBy5BU/4WFn0L2c9Wnxz+7RE5tLLHyr2KVM4qBoLCKM6Z0l4E3y3vOR/Pq+LN64q5wV8StozbLYsjW3URo806b04TpyttDG5LYONeQkKIXAsRzZdXA8wUGbjzQxhaoAFd+CeDGkM95hVOXJETYMaYBtvMgZrKvHDRJAY+x+IVrwla0hYCDqAVtziBqYqSLx+t2oOw2/0Btr4nwPtF43rTvkx3+SBD5zjbd7fHx8iVSYK6hTkoEQz35Nc2Hd0a2GQKCpSx16Mu2olIN8394EzMoaTI9Cs7a+yRMCpXB5y9dnQCIjkMc91R6hM1VGE+olpjbcAEL0cHeqrzGbRw4dlu3cV08Md4bhXXhEKLY/qopYUbjBQONH/UPai8JSeHIQ3qc4sfwFb7w1ltSXx5gCZd34dsxTK1yFbvNqPpQA0mk2ohTl+vbIlfhL3MqN4MVlfvxls97NKmPHYkpfnf0drs2g+9tgNSyOewbym1JITezyUmkR4qAhw7eVbh+SNb4H6hH4Xr4Qj0ZPvdJmchUEFJQJoc/ZHxVRbRSaxYCumFmsdnSB/T2ugTEOscHBn265dFsRPEP5i9I9U/QvalIZjG7CCaoMZMWoJcUDOztYhHnnP1TM45yjrs51JJJA+phrY+5nYPjFPg0cXzFMAxeokodoezEAt8MdDY1GuoFBONSuOb+Bt9nw3MNzqdNv6uMZMdUfUw/IzT/+UMt5LAJsG+A4bucIQEcGG7VVwTUrwze8/X8X8M0NPJo15c6S8RFM0D7k/0XdZsQfO6yNiXZCnj3wEmXAaAJdN16NUtol/u5cOucOQPmtQI/7jbgZrgmfAHcEQ/XI3tR19sBHBrObVFf0frm+AWjuh9MUpBx+jJb3GPVKRceqGLxbRY6ksbnGz3iEwwYb+W9vzaomg440WEyC4I5aergvbZJOaAQdkxFUQ6Jq134iBq2fEFCJChGqGcodAFlWZ5Y/Tctxmmu/ExijOnSV0PlLJ1Tm7zkI/06LM0BT1V1wzPSxYRcjouFdEEfiV7wLR8hMOtTjh2QnBeFGQn0JXRkoQMCIJivPOBn2Hj4Q33qjZe+ZRIUarKmXvE9pWx7dTwKIpQNI9Q3PzTtIcueVpWfu2bxk4uJk/KjPowfFnvcMWr61cxcMeRxqKqLYmLp/T1d0PWMdGoYPsRTiOqlSupvQTH5QtlS064ydcukFdWTkldnG1BLMw3fj6Gn+6epDtpHa2HImceq952S6QF2uPvTu82xdHIZ4qBVFCmsoWjDyUPopJDB8hIYIVWImkSsfJibEtUNnlScDpE/vu0EphWN27HBVHbSgxYhqLW1YbS3HB7vA3wnWj9C8JPTqrMG+dLP3HUL4zUXGDJ6ORIobQKxvbKJhZr2a2aq2yrlyBGel0Nkaz9q5KCvkf2K/2LMcyWr2ngAu+vvvaJZ6IZXhGjwXnUsPjjlTdCqMnve3+d2Iao8/UFwlRe1UidxQ4jbjzjruomzd8iJrcngXsdtDkXKJoeZF2aYaq3Pethei//sNJYdnP6f/d7EiYpVGJmcn4GmURDyYNeNR+vDDtKvF8w8SIaW/PSeBVVLPTpR963hXRAm8iXPkLJ9bp5R/INWp5VorDt9hKw6uJTnpKyX0D36U+rueoY3Uxyu7of0S0XsQ3RRODA/r+oPSZB64QROT6VLnnC8iNNSS1p6kA+927VKznN4k8pijy1pSHrvPEBZ4EbMCTDNv4iUYjuj0lum+T9CkKMQLv5bFOze3bUFMIdgSgXaoDEGIKKDe19GVMkzPF7DjriCWc85A9h6jjuGnxtshHKQbGC3zTP+b/O2zWptHHNv2v7TMp0HGbdYROQbPsShdwk18Gti0mTkyzoX+ckwddeXK7IKYiIDlE8JX77cr75tTszpA2OEXd8Nj+2HhUajDfwa6kBIMAFsvGfJyKnODPrJc8pGWKbQxRpnrHoM1NNlLxm2/5GlnR1MLrDfV/T099zIqsO7kyLNFn6fikXXnDHhpNHeqTtv93vHCjxkGHqFexZZEGVKo3E0y9YBe0XlROnWUAB9Wv7by3J07wLxYq3v6Jw02NHiZi71Xp3DX4bJyNJM8bKCpRGT8JJhDTqqnjJWNA/aZjM9Rv9rCkZqhGkTU2ltHzKuX2qWyBbsv1TO1pEVItWP3KJv5RW4PIhJV9WOPGECNZ7LobsHqKDDHX41Z+AWG5uEbSq8HTLhIZJfZUrLpOohvgTIQ8DIFuShaUUPprB4fM+xrAZAooQWDa24nF5w0Mg2Ar0Ycoz4oVMDN2soboWcdsLm7nibLQWJ8F+TQvHq2WFPvFiiuvY5Vzw+PmWfpCJoXFY9ZK2LEPT9b4533gNRYPqc0r7VpVchYd9wEBSwrYy2N1cXdXSC5hjvszwaSJ2zQ4cgPsG8FKvsoBYfSnoj6ysBIdMqbBG9PBxoAI="; - private const string DilithiumSignature = "4hmKerpbSUucq4R9Kzaq8WE8F4SHAxkSRhyPfAJ6Uz1MJzEN2wVKAKLGY9pZwQ0O9AHpS6W2olfClnoLM1p8AgrJSOOWAHiEmHQBvwZZJYzVALzqNXHE+yUq2rXbJpXQW2oN14jVYK4vj+KT2gWZIIHpnGZ4eh4TpjsaprCcvGvGz8CAT1WpLf9G0ETrP8hkJx21ZAjGgUWAPlgvq0Ht7h7NpL9/TCLt574atXSWTosOCG1SZoCEMy6AvDO1tgqPtWcWJh2JHMr/TAGn0mJgqJ65jlAND3kjYiYoN9d7MrcmFt4ECe9Ff/zqaKz359xOzZ+xCxigD5VCe7jAxOhD55V8C1YnJh7SUAIDBOfgEbwi+XROZnUvgAFjiA57hPJ252sDHa17KSQGB7tBGKd14R7h1uneFNVgua+FYjO11GveQ4FkL7aWwy0W58AG7rSqvB36fbqYd5eSSXLZqbNhETaVJHeDLjo3XnMe59TL4s0camPQXKCZtS5ZUxg6y3b/mqORqlud6HEHqZ9dmeGisyw0oqMMMlxAPRbgqqCdJSrDXBjMw4V+rgv1O397f6tPpheUeYuzj4n0PuR3HRwFPFjCJHAhqHuPCsl6JKuNjwDVQFp9+DALfwJMyAAly68Mjum3Zy+BXNV/fJg95JvUwhxqEaJQnmYHZ6pIBMQnS1zDe0wfFpSf6wWNXDQyLGASeX5hLFmBPUX+thcNXBLvoK1uFOzyLinsaWpamwNbWvGAabe0j9+M1pWEv0jt17Pps02VZg7IPEkuwJJ10DOBQ0kcVBtCQOQXuyvUgJyswMqfswT+AXObWfytxU1kOTRRd32CM7YwpHVr995d5PhBLCSZICVxwKrfMXhu8eFXNltOlodZipfaJBQE6j7ed2MpvGs6Qv59BGJ1V+5nA3MrPJCkQVL3eUVPCN4DQuCDiX5TeCYgdQYN1J2yNZuXlOrBwzZDK75GHqAqqg1oWnbHhtooP+pxyKyHvqm/nJvycClJoM5uR+VELwikekOY01kMAunPQynXE33lrmPpFbLG2siObsSyAE7jEtNlzlq/Qx8zy0WWlva9q6BiMLERthZXKia0fhqZRCLuOaBEilCNH133SyewrTAR1PAYCe2uBxVHnFWJ2saMvMs+YJSoRMx1AL2FvaxtZR33OHjvOAHVlJK3MlwPm2Lq5Fr22VqGRF8It2c61W/BBytrGUAfkb8oaKfm1EZ+kZoBjy4balVuyoyFCqIOriK0W6eFHkEZ2KY4WsJe1jfrUZFUfT8KV6kRUECH1BzaDi7LJtqerHXFHsnHQVOciHMO0r0xKQERyBaLzf9gDZdD/yJl04yMbY01aQzyt2rqUmihBymbq/xyCdB66eNHyry5Qv3fcOnd+XsJu07fRw8khIW4KcLlO+cCmWubWH68FlOFHOfCF/zYgXms1c+EyCEgnCKP7l52diaBDkUEv7KpJ3xHGtY0mgWe2/SXcxMhx7uuaEjPYhX4MHk+yGgjdGwD2Y1e/vzj/qEdtD7sOjb0cMBv2Og8Y3j1TljmP9iHqzTU+ps0C/I/sBHBMDjnQoDEPyVbbRxU9GNSaKBd7xxvbxHaKiMlllV4Ye8L975UNr4ZzRrUZVKbaFPZO4RDu9Bf+bFppoLfefBH2ONsyX2q1LR0RZ/QBkS1z5bsShDTRWZgP/6qS3vXufOuYibn5GXgLCph7hMd4EvSwrfcOUdusBgECH5fIRlGsiCP7mutX4nkm2AESps9QsKyu9bd74EKxtHRXLxQkQOQqVfmoFEcvRLQwPnhCtPwQikI/IFqIb2iFVcdd8QwThqfV6SVBmVwwbQWv+2Ey20lyEtr3+ZQWb3d5JolCD7s3KGM/XZpeM6rNZr2Dl6VzZtLstOtaESRFw+QIC0IiPs+cE3XsGVYgpdGChiEk/YnEEOik8xnvj6YQxzI474wNwsel4e8KPVBYv++/vXqFdJ9OpgVO+kcwLKygLbJWMUuXcR71JlpdrXgH/BMdYD0xUUAV32nkt54zcTodoKVs+vCkt3jk0Nk+RCsDwC/DaBl5u9//yuNlkUfvKcRjdqS3ybjQedniJbzpwySXwSOMEIsMJ2wdQSeqo1XBIx+mUY8vZsWXN16UQEJIbeb78Jjyx5nU4zQFPtUnhKdgA6DUATVVbzFg4h3un8LXmo73CL9h8Ps29i8pXfeoi/yAmJJTUEFcEKjSyt0i6RezioqTzS5Q7qDndZFDxy8VdU7/9i5fXKVeRlIEtWKbN+uW0RiKIT/nP3l/GRI4Y2qkadxGw9Iq6bYBUQQW2Ae3HdoN2WJB8a/SRerBm687UPf5N/pt1u9SG7RM44n8hQNx42+4JnaBFt7RqQFBuFGg/l+lFQ8yXay5SlnLd1J4t3jSMrL0b/XjwYRi3sKK3oM/wbOrz1NAyb9uw9rMxf67S2SH1DB6SO8q3/WNdokOyoWjmsQklgsi280fyQ163Xagv7E22D/BNo1DGLhvKBBK5+RhZgjpnkurJD0+lVmSjKdTRV8HHmOH42wz80AoO+ZEmrWk/PFWmMnlw8Z/PNua2+MjOLcjbLdiRBa9eYhdjkr8blVwa+KBeoFrNXVo83UJnEQMHfpACvLGu/0XLccOrfHNF3ukvT8GRwX6TjnO3Qtize1+VYqEQyjs0CMwLYFDY2O3qdkxv695PvHIIq6b3X752EPd7su6mseCuA3QmLIg81KJ7hM+N+Jpa5zvU2/I86kXEJ/ucC8ZYkP4RK2pCe5rurylf4RmGTEKmYQmOpmJC0zT3k0XBKaUhqax4lS1yf+r5RgCPFyZZCjV64HbJPfE5gU1p9F4CmfJ8AH3zhoL/ZSPwlbPRhHNXGdFhwA7DSV0jtkVzIPDpl/7nAaErkWyvaui9fwzPvSRK/aqUd80IvDUiSChFlVsLFcKTmEWCn+lCu+AkjwbI9P2v8y/+328DIXVpEeXUDbr4WTJExcxXEYReQdliLvfJjbMZ1uvpPRI2EXMqoHz2XRr0g5rnpWgW4ekWSvWT2HSZAe+sH4FtNQ4sAMOECrxzFfNBb9A7euFkQ2kq7BvCKeJoG96uLRYAcM9uNhXYSgprtBo5ypqubQJm7aTOgQDCyRJEU6m1xQEqMZiapPm04JTpcI09YvDCqfE8YGXLHPzbi8WbqXLIi7kxLag1z5uuD9TKMESXwvz4jD2yWlDyPIu09JkiIlT4yZ+Aoz6WoyP9LLdz1T3EAGAHxL+nwFD3GwdSMYfQpOUh5hssMWk3A+cd89EIEwGVLu4lF2hT6R5uy2KvGz/dEiecNZSzz8IajZBulN23fDTYDq2/n1ngHaXmF7wV6R902oP6fn5mnqgpR5lgvrErSCnQJBARuHdVVYhaVCICqcenQ6wqZOn+yQsu2VACFRsDH8UTywqszTLtt9SbmOjc0O4yS7g/o4TZN/dY1gFYcs3Hjx6BIsQTyXd9J3R7vGcYHwIdappw2avJe8dcUnLQKQatZhtMoM14bN8MJS1RdcblxAGdkGz9rtkO7du6z6rKAlmX42QkGl0Ne8XTE0fVhwXoafFbLrQYLHQgLnHQ9iQG8/b6vJg1HfRw+hQSR8Ul3xo4flK2Qq9TbXmSggJdzgaa4F6WCSnwxambhxauWO7+KoPGAQI7n/Rrw8HS0M0hKDadEOXfXLPGApPYyhuXxpaJEEIXtaUEjnStlMQ6LPlm3E5xQjBGGGZYdCJDHPEcA2Jlfm029OE6Knu+53cWgXvFeng8OqQM4bQscHB0qmKKn+tqbZb1nBTrLTJ6sTFVpju4CV7iZeWszyPzTdmqr02tQSePtLoEyq0OAyBkVCcaH33TK6Lbma3u0fmIH32T+/HFO4zBFT/K+HDvTZHNkhqk3z5Or4L3mDFtEWTgX3xWs3NauUrfEhBaBx/tPRst6GE6sQ7JwzARlpro5Tin8yG3NsEoA/Sy8CC36PBwc1qkFuzXKnJ0Pkl78Vn//hCfVHbvFGXV/gtOfGB4lLN6MSCQdfGqwIwMXgubKupLoaVVpSMYbeST0TCZa/egHzi/6GjewSAREDsozgGYMAcUdYp1nilmqaA+j/ONIBg6pQgdqTRt+5w1xv1irTl9GfwEyEt21NHibIwefvPox7V1bDy34jB20H7yu00zKAjbpUiQB6xLtWjwNeoMony+l2Gw9KQqiGyI4OU7nzpMoQ2u0dA0oE5ueaI2L/rkhESWR/CgJAWl/SrsC8i5+3kRwnJtWpUkQEPuUnXiZcqIFmqJ6XqxSEzevDYV/edMCC/ZdEk036p84qR40FjxRg4jjDYCoMBdrP+08LsMj6u91Lr1C07o6oq/7/CozJa9gRuDBVmBwYHS1MUKzh5iPM5PhGUlyLyeNagqTb6P0TOrAdODsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwSGBse"; - private const string FalconPrivate = "CADAE9CBC9D6BC+DE88+D+9A+7EKAE9/E9B96FI+BF/83BI/AE/++CG7+4AEDE+E76CC8A+++E8CABBDB7/CCA9C4BFD/6G62CBDBHAAF4/BGBJD+BAGA/89JFC+9AB9FG78+EA8EDE/C+D78/J/8B7+/BEF+CBD7+/7F596AADGD/F/EE+DB/A++7CFI/D/A//+9/E+AA/7+D99A988C7ACJ/B+F+BADAB98KFBBEJ+D7+A8EBD/75A9/99BI9BE8A8D/IC/638/A8/6CH+A5CAB+/I9CDG76ALB/ABD947E579AA6BA5/9B5AFCDA7KE97A5DB/FACE//D/F+MD8978/AEE7F3B++C3BEB7C+H/CBE+188EDAD+8+C9EE9AF6IG/4+CCEFFD5HF+7FE/E+/B76+LI8G/A/777A898E98CG8AB8H5EE9CJE+A/+I5DAHD8BFCD+76+9B+/7H7FEA8/A/BHA+JB+D7DE3CFF8B+E898BI6B8FA6//BBA8BFGFB8F9/F+A+BD4A/MA+CBC9+IA/E7D+AC/DFD+DA8B9+CF6BBB9/L2+/A+FEF6+ECB9FC866E2/5DA+C/9C1+HC/AF88A+FFB/C//97A7/BBDD/AHCE8+FC9EBA88H9B7B6AA48BD+DFCC8+/58/GG8CAF+D8AAH/CK/KJACB7/6ICDE8F/DC/ABF6+HEzDHBGBC4B9D+CBDA/++/+AE69FBB7ABCC89785CDFGD6A9/ADKD9C5BD895CC/DFBAD45AAFAB6+EI79C+BBDGK+HC46E9CB7AD+B977/ECC+A/+3ABC+8G878CHGBCG9DDD2+97C7+6DCHCE/6AEG6E0B+AADBDIF8DA39B/85C9//6C9+6G/+BFEAAD57/H/BCB9DJ/AF+ABBH+AABG8EEA/9B8FED6D/D9E9BGEMC+GFBE+9A6+A8JFE7CAAD9BDCBAEC7BADBBF2/EAEB/GKBHC/D/FDDA89//EA/B6/5/GB/AD6A6AE74GAF+CAFd4f/wwCEBw0CS0R9trX5BPh+x4BAcYl+wUJ/xH55e0ICe0IDgINBBf8ABoVJPr/Ggb4HvIvBf3JAxz3/foCDgv4+hm31hkK7QsG5+LmKwUoxBoTAvMgFN/eAB/8+/Ah3/kD9gDpB/X1+A8czukx8w/yGAfw9+vV/fITJQMZGRwCBOL15tMJ9RMJG/732hbU0wcuKPk76/wM8gcK2B//K93j6Ojo6hj7A/8G9cQDE+bpA/In9Q0IDtAxEwH38hQ+CfMj++Tw/vX7Afoe6/gqz/f0AwIIENkU+u/1AggxF+z07AkM1hra5QYnMOvn9wv84O7lFSUx+Q0JChEY9gzqAvz/Lfz3BQj5GgQi/xcYLAvvA9AS9gAL+Qzl8hfk8wgVDx/96eHcH98aIPYPKhjV8vvkIiMELAUm1dcP8+gh7egiAhQK/AsW9dD9AQsD9gMNBxj6HO8Q/xvzBQkSDPEC6P30Hw3X0iX37uUFORr16hzd7+VC2/H2AxbtJxUEGusbJf7iDuTtG+MrFAHSz//m9P4KEQj95wTq//wS+vvWJwbnFgnyDvIRJ+TxGQX2FCgAzfPMAAPdCQoDAy7fuv8OFSIPBv0G6wbftwHuJPspKPnm+vgS3tT1Fe7w3QXT5g4L5DPg6AEVCPX3GEUpIh7xFtssp/n2MAn+LSQF/MTrDMc="; - private const string FalconPublic = "Jv6LkSCSV25Fk8XuSAZVAYuFsivvFkrde2eUhjeNOIi7FnEOVhDy2tulOoFJYB1eLnKWcfcB4B6iWvuQvZ+NRHYbZJNnlG/JrcCTSQFybqYY5tv7TAYHcozO9Qe6Nju25ThfuANwomnNsCWsizGs4xO2IdZ1inooJGnmcCAhIsa8WvXVIBhoSlSjV/Nxjmw7c5KSFUqUiQ6KFn8dELZNK/10OLBzBMWQIrmCi+0NmUieiKcVk1MdeKJFslEISCHi1vDiUpgQFPTH2MAsOqz591JFAD7FyWarfGLh6Rgd1WwZAWtWxpAnSXGkY9ADO0R+wXnuIoiEOQi1axW0UwjMZCoivmoJf5ZsEn4CyfenMNKqe5K+Z7fiw5Vdjoh4ZqoH0gzbWYZoGlRpC6XmWlQIwbnBaQRFRdkphuMTTBK8NKDHxod1xzEJrXmAiG4xZQGXvopGQMNdqGja8sOcncMN4lN4dp9VDOK4algsVBglrOuwinwp+GxLz+rcHwV0hkNUswmpWOPplUZLJtlmeJ1YJjRk8egce6oQRYde4QsWIIyoKYOfh/7hV2NYdEcIPCknRZsPiXyqcGoFqAZTMlZblFQ5A1e+1FyQ8DPQeKzlO8A1JRAJ7A6eioHBKJ1zYZblxiwyggHOOoXK1HbpU4PvJROQ6MW08ZK4tAkXZI0lw3s50ViSBFd5zI8xtFrzpjRLOZzMY0dkVDGLlr8+9gsBCU48dfyMga6lrbgVJVcW6rFgPD9lG09mhDArGR8opVeSm6WR60Wq9RRI9WCmDFL+9N/Z8YsdGgo8y2Fx9mNz88DRd0hGyQ/pZTluDuuWEHxx0UCyzWofcq7TkT2pLGq5cBBB3klRWK4CgpRns+HRQhuWeEEtH8Pm4pyJ1NYkXeEbOohkk5NgEmfCF/NmlORdZDxAQSi9r/bvBnlGdS6aV9BvpWugvJV3wcDFvQVjR4HT0IlBwwpHyQhJdcrKsebSaynfQfySaUgMOgUGARAn4jl34sZZia3UCQhpO7yYcacxXRwHSK5nTGePiOoiWCfZYwGQ92k0aLO5fIL4GWo6VmrQu/HiJrF1/GCHa9ozFvcW4wHkejos9Nkf8at5c7QoRoNfEl4zkKjvSKivpZyetasiOuf/6UW06A8m2xfHU0ixQB1emzSGRpGP0gWwicUbdE1tcakAKtMV2I3NolR5wO4="; - private const string FalconSignature = "OfUX6CmZ14QRj1xzxUFf657ng0GtWjPuT3HVLNV+es9pwMAMZe98/2POuD5YQ9z85g2fkSKqDx9pgyiMLG4lTERJ/qorc9KgSKomkUgS1JL+78qdsnkwUS4cA5BDHB0ipP3thSLVkEWt74ReIz2TDDfbzqzX/ZgFf5ZiYPhsZBSQ0fq23cqYYKTWZ4rjDOkiawuFEMUmCaEp9amx9essVLyEcTqQMCfjdFbJ3LTPweD8Q2SGECYNL7PdUbqJWRWWGR9LE14EpNLNckyFPP3uEYevr1CYF+kbUd3nNyXPG0zHKe2KEffTP3EcmO/x5HjGXZSUdrElbQU0FjYiwm8s2vOO7+IfOm8Fj4rslTRlDuuwDHGB40q57r4P3JMv61tqa0ynSglolqkOBp7EZfAyb7sMwrU6arvXpIDlzCmagDW8DGw7SPUxcV1CZ/XvoNs1jfjWQfVOiTrFDWOvm6WSRYZnLkHaVKUN7CMbFI1lzaNdu2UfMQKA6zsRs+NwVeZGJ26q0rvMmkIvVuMUlaav+Rp/kKKIZVM7Sj7LnrkU2zrII+WSsy9JaZmbHi+XxIXUi9XeT2Xc5anTE9manN4x/wvpByQogntxZb6ej8ZXD1t/a6sPQKc9MJWX9UVl2/wr07iHww0317LqLLC2FNHclYcLR7KK/GEVnAvrDn94r4wY88nsusNDmli3Thh1C6UNg17gjsazteq6m0y+Yrzrb3ZmMzl0bkganSnNTOIsgwyCbDo0d8/WTKjMeoNWQQhKUJM2elWn2TvmaFdOZHMV6Iuw17ociTXHko3J/MZKncSPjYE12pw70mHZ2B+ZxvM1Cj4RUbLHfYz0ANGuSbUGjlgzmewiNXJS4KOsY2K6PYcZ"; - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Dilithium3_Signs_And_Verifies() - { - var provider = CreateProvider(); - - var generator = new DilithiumKeyPairGenerator(); - generator.Init(new DilithiumKeyGenerationParameters(new SecureRandom(), DilithiumParameters.Dilithium3)); - var keyPair = generator.GenerateKeyPair(); - - var priv = ((DilithiumPrivateKeyParameters)keyPair.Private).GetEncoded(); - var pub = ((DilithiumPublicKeyParameters)keyPair.Public).GetEncoded(); - - provider.UpsertSigningKey(new CryptoSigningKey( - new CryptoKeyReference("pq-dil3"), - SignatureAlgorithms.Dilithium3, - priv, - DateTimeOffset.UtcNow, - publicKey: pub)); - - var signer = provider.GetSigner(SignatureAlgorithms.Dilithium3, new CryptoKeyReference("pq-dil3")); - var data = Encoding.UTF8.GetBytes("dilithium-soft"); - - var signature = await signer.SignAsync(data); - (await signer.VerifyAsync(data, signature)).Should().BeTrue(); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Falcon512_Signs_And_Verifies() - { - var provider = CreateProvider(); - - provider.UpsertSigningKey(new CryptoSigningKey( - new CryptoKeyReference("pq-falcon-det"), - SignatureAlgorithms.Falcon512, - Convert.FromBase64String(FalconPrivate), - DateTimeOffset.UtcNow, - publicKey: Convert.FromBase64String(FalconPublic))); - - var signer = provider.GetSigner(SignatureAlgorithms.Falcon512, new CryptoKeyReference("pq-falcon-det")); - var data = Encoding.UTF8.GetBytes(DeterministicMessage); - var signature = await signer.SignAsync(data); - (await signer.VerifyAsync(data, signature)).Should().BeTrue(); - } - - private static PqSoftCryptoProvider CreateProvider() - { - var options = Options.Create(new PqSoftProviderOptions - { - RequireEnvironmentGate = false - }); - - return new PqSoftCryptoProvider(options); - } -} diff --git a/src/__Libraries/StellaOps.Cryptography.Tests/SimRemoteProviderTests.cs b/src/__Libraries/StellaOps.Cryptography.Tests/SimRemoteProviderTests.cs deleted file mode 100644 index e91823700..000000000 --- a/src/__Libraries/StellaOps.Cryptography.Tests/SimRemoteProviderTests.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System.Net; -using System.Net.Http; -using System.Net.Http.Json; -using System.Security.Cryptography; -using System.Text; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using StellaOps.Cryptography; -using StellaOps.Cryptography.Plugin.SimRemote; -using StellaOps.Cryptography.DependencyInjection; -using Xunit; - - -using StellaOps.TestKit; -namespace StellaOps.Cryptography.Tests; - -public class SimRemoteProviderTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Supports_DefaultAlgorithms_CoversStandardIds() - { - var handler = new NoopHandler(); - var client = new HttpClient(handler) { BaseAddress = new Uri("http://sim.test") }; - var options = Options.Create(new SimRemoteProviderOptions()); - var provider = new SimRemoteProvider(new SimRemoteHttpClient(client), options); - - Assert.True(provider.Supports(CryptoCapability.Signing, SignatureAlgorithms.Sm2)); - Assert.True(provider.Supports(CryptoCapability.Signing, SignatureAlgorithms.GostR3410_2012_256)); - Assert.True(provider.Supports(CryptoCapability.Signing, SignatureAlgorithms.Dilithium3)); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task SignAndVerify_WithSimProvider_Succeeds() - { - // Arrange - using var services = new ServiceCollection(); - services.AddLogging(); - services.Configure(opts => - { - opts.BaseAddress = "http://sim.test"; - opts.Algorithms.Clear(); - opts.Algorithms.Add("pq.sim"); - opts.RemoteKeyId = "sim-key"; - }); - services.AddHttpClient() - .ConfigurePrimaryHttpMessageHandler(() => new SimHandler()); - - services.AddSingleton>(sp => Options.Create(sp.GetRequiredService>().Value)); - services.AddSingleton(); - - using var providerScope = services.BuildServiceProvider(); -using StellaOps.TestKit; - var provider = providerScope.GetRequiredService(); - var signer = provider.GetSigner("pq.sim", new CryptoKeyReference("sim-key")); - var payload = Encoding.UTF8.GetBytes("hello-sim"); - - // Act - var signature = await signer.SignAsync(payload); - var ok = await signer.VerifyAsync(payload, signature); - - // Assert - Assert.True(ok); - Assert.Equal("sim-key", signer.KeyId); - Assert.Equal("pq.sim", signer.AlgorithmId); - } - - private sealed class SimHandler : HttpMessageHandler - { - private static readonly byte[] Key = Encoding.UTF8.GetBytes("sim-hmac-key"); - - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - var path = request.RequestUri?.AbsolutePath ?? string.Empty; - if (path.Contains("/sign", StringComparison.OrdinalIgnoreCase)) - { - var payload = await request.Content!.ReadFromJsonAsync(cancellationToken: cancellationToken).ConfigureAwait(false) - ?? throw new InvalidOperationException("Missing sign payload"); - var data = Convert.FromBase64String(payload.MessageBase64); - var sig = HMACSHA256.HashData(Key, data); - var response = new SignResponse(Convert.ToBase64String(sig), payload.Algorithm); - return new HttpResponseMessage(HttpStatusCode.OK) - { - Content = JsonContent.Create(response) - }; - } - - if (path.Contains("/verify", StringComparison.OrdinalIgnoreCase)) - { - var payload = await request.Content!.ReadFromJsonAsync(cancellationToken: cancellationToken).ConfigureAwait(false) - ?? throw new InvalidOperationException("Missing verify payload"); - var data = Convert.FromBase64String(payload.MessageBase64); - var expected = HMACSHA256.HashData(Key, data); - var actual = Convert.FromBase64String(payload.SignatureBase64); - var ok = CryptographicOperations.FixedTimeEquals(expected, actual); - var response = new VerifyResponse(ok, payload.Algorithm); - return new HttpResponseMessage(HttpStatusCode.OK) - { - Content = JsonContent.Create(response) - }; - } - - return new HttpResponseMessage(HttpStatusCode.NotFound); - } - - private sealed record SignPayload(string MessageBase64, string Algorithm); - private sealed record VerifyPayload(string MessageBase64, string SignatureBase64, string Algorithm); - private sealed record SignResponse(string SignatureBase64, string Algorithm); - private sealed record VerifyResponse(bool Ok, string Algorithm); - } - - private sealed class NoopHandler : HttpMessageHandler - { - protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - => Task.FromResult(new HttpResponseMessage(HttpStatusCode.NotFound)); - } -} diff --git a/src/__Libraries/StellaOps.Cryptography.Tests/StellaOps.Cryptography.Tests.csproj b/src/__Libraries/StellaOps.Cryptography.Tests/StellaOps.Cryptography.Tests.csproj deleted file mode 100644 index 69629d918..000000000 --- a/src/__Libraries/StellaOps.Cryptography.Tests/StellaOps.Cryptography.Tests.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - net10.0 - preview - enable - enable - false - false - - - - - - - - - - - - - - - - - diff --git a/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationDependency.cs b/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationDependency.cs new file mode 100644 index 000000000..a56daa945 --- /dev/null +++ b/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationDependency.cs @@ -0,0 +1,274 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace StellaOps.Infrastructure.Postgres.Migrations; + +/// +/// Represents a dependency between migrations in different modules. +/// +public sealed record MigrationDependency +{ + /// + /// The module that has the dependency. + /// + public required string Module { get; init; } + + /// + /// The migration file that has the dependency. + /// + public required string Migration { get; init; } + + /// + /// The module being depended upon. + /// + public required string DependsOnModule { get; init; } + + /// + /// The schema being depended upon. + /// + public required string DependsOnSchema { get; init; } + + /// + /// The specific table or object being depended upon (optional). + /// + public string? DependsOnObject { get; init; } + + /// + /// Whether this is a soft dependency (FK created conditionally). + /// + public bool IsSoft { get; init; } + + /// + /// Description of why this dependency exists. + /// + public string? Description { get; init; } +} + +/// +/// Module schema configuration for dependency resolution. +/// +public sealed record ModuleSchemaConfig +{ + /// + /// The module name (e.g., "Authority", "Concelier"). + /// + public required string Module { get; init; } + + /// + /// The PostgreSQL schema name (e.g., "auth", "vuln"). + /// + public required string Schema { get; init; } + + /// + /// The WebService that owns this module's migrations. + /// + public string? OwnerService { get; init; } + + /// + /// The assembly containing migrations for this module. + /// + public string? MigrationAssembly { get; init; } +} + +/// +/// Registry of module schemas and their dependencies. +/// +public sealed class ModuleDependencyRegistry +{ + private readonly Dictionary _modules = new(StringComparer.OrdinalIgnoreCase); + private readonly List _dependencies = []; + + /// + /// Gets all registered modules. + /// + public IReadOnlyDictionary Modules => _modules; + + /// + /// Gets all registered dependencies. + /// + public IReadOnlyList Dependencies => _dependencies; + + /// + /// Registers a module schema configuration. + /// + public ModuleDependencyRegistry RegisterModule(ModuleSchemaConfig config) + { + ArgumentNullException.ThrowIfNull(config); + _modules[config.Module] = config; + return this; + } + + /// + /// Registers a dependency between modules. + /// + public ModuleDependencyRegistry RegisterDependency(MigrationDependency dependency) + { + ArgumentNullException.ThrowIfNull(dependency); + _dependencies.Add(dependency); + return this; + } + + /// + /// Gets the schema name for a module. + /// + public string? GetSchemaForModule(string moduleName) + { + return _modules.TryGetValue(moduleName, out var config) ? config.Schema : null; + } + + /// + /// Gets the module name for a schema. + /// + public string? GetModuleForSchema(string schemaName) + { + return _modules.Values + .FirstOrDefault(m => string.Equals(m.Schema, schemaName, StringComparison.OrdinalIgnoreCase)) + ?.Module; + } + + /// + /// Gets dependencies for a specific module. + /// + public IReadOnlyList GetDependenciesForModule(string moduleName) + { + return _dependencies + .Where(d => string.Equals(d.Module, moduleName, StringComparison.OrdinalIgnoreCase)) + .ToList(); + } + + /// + /// Gets modules that depend on a specific module. + /// + public IReadOnlyList GetDependentsOfModule(string moduleName) + { + return _dependencies + .Where(d => string.Equals(d.DependsOnModule, moduleName, StringComparison.OrdinalIgnoreCase)) + .ToList(); + } + + /// + /// Validates that all dependencies can be satisfied. + /// + public IReadOnlyList ValidateDependencies() + { + var errors = new List(); + + foreach (var dep in _dependencies) + { + // Check that the dependent module exists + if (!_modules.ContainsKey(dep.Module)) + { + errors.Add($"Unknown module '{dep.Module}' in dependency declaration."); + } + + // Check that the target module exists + if (!_modules.ContainsKey(dep.DependsOnModule)) + { + errors.Add($"Unknown dependency target module '{dep.DependsOnModule}' from '{dep.Module}'."); + } + + // Check that the target schema matches + if (_modules.TryGetValue(dep.DependsOnModule, out var targetConfig)) + { + if (!string.Equals(targetConfig.Schema, dep.DependsOnSchema, StringComparison.OrdinalIgnoreCase)) + { + errors.Add( + $"Schema mismatch for dependency '{dep.Module}' -> '{dep.DependsOnModule}': " + + $"expected schema '{targetConfig.Schema}', got '{dep.DependsOnSchema}'."); + } + } + } + + return errors; + } + + /// + /// Creates the default registry with all StellaOps modules. + /// + public static ModuleDependencyRegistry CreateDefault() + { + var registry = new ModuleDependencyRegistry(); + + // Register all modules with their schemas + registry + .RegisterModule(new ModuleSchemaConfig { Module = "Authority", Schema = "auth", OwnerService = "Authority.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Concelier", Schema = "vuln", OwnerService = "Concelier.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Excititor", Schema = "vex", OwnerService = "Excititor.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Policy", Schema = "policy", OwnerService = "Policy.Gateway" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Scheduler", Schema = "scheduler", OwnerService = "Scheduler.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Notify", Schema = "notify", OwnerService = "Notify.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Scanner", Schema = "scanner", OwnerService = "Scanner.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Attestor", Schema = "proofchain", OwnerService = "Attestor.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Signer", Schema = "signer", OwnerService = "Signer.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Signals", Schema = "signals", OwnerService = "Signals" }) + .RegisterModule(new ModuleSchemaConfig { Module = "EvidenceLocker", Schema = "evidence", OwnerService = "EvidenceLocker.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "ExportCenter", Schema = "export", OwnerService = "ExportCenter.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "IssuerDirectory", Schema = "issuer", OwnerService = "IssuerDirectory.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Orchestrator", Schema = "orchestrator", OwnerService = "Orchestrator.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Findings", Schema = "findings", OwnerService = "Findings.Ledger.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "BinaryIndex", Schema = "binaries", OwnerService = "Scanner.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "VexHub", Schema = "vexhub", OwnerService = "VexHub.WebService" }) + .RegisterModule(new ModuleSchemaConfig { Module = "Unknowns", Schema = "unknowns", OwnerService = "Policy.Gateway" }); + + // Register known cross-module dependencies + registry + .RegisterDependency(new MigrationDependency + { + Module = "Signer", + Migration = "20251214000001_AddKeyManagementSchema.sql", + DependsOnModule = "Attestor", + DependsOnSchema = "proofchain", + DependsOnObject = "trust_anchors", + IsSoft = true, + Description = "Optional FK from signer.key_history to proofchain.trust_anchors" + }) + .RegisterDependency(new MigrationDependency + { + Module = "Scanner", + Migration = "N/A", + DependsOnModule = "Concelier", + DependsOnSchema = "vuln", + IsSoft = true, + Description = "Scanner uses Concelier linksets for advisory data" + }) + .RegisterDependency(new MigrationDependency + { + Module = "Policy", + Migration = "N/A", + DependsOnModule = "Concelier", + DependsOnSchema = "vuln", + IsSoft = true, + Description = "Policy uses vulnerability data from Concelier" + }) + .RegisterDependency(new MigrationDependency + { + Module = "Policy", + Migration = "N/A", + DependsOnModule = "Excititor", + DependsOnSchema = "vex", + IsSoft = true, + Description = "Policy uses VEX data from Excititor" + }); + + return registry; + } + + /// + /// Serializes the registry to JSON. + /// + public string ToJson() + { + var data = new + { + modules = _modules.Values.ToList(), + dependencies = _dependencies + }; + + return JsonSerializer.Serialize(data, new JsonSerializerOptions + { + WriteIndented = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }); + } +} diff --git a/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationTelemetry.cs b/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationTelemetry.cs new file mode 100644 index 000000000..cdbdce17f --- /dev/null +++ b/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationTelemetry.cs @@ -0,0 +1,218 @@ +using System.Diagnostics; +using System.Diagnostics.Metrics; + +namespace StellaOps.Infrastructure.Postgres.Migrations; + +/// +/// OpenTelemetry instrumentation for database migrations. +/// +public static class MigrationTelemetry +{ + /// + /// The name of the activity source for migration tracing. + /// + public const string ActivitySourceName = "StellaOps.Infrastructure.Postgres.Migrations"; + + /// + /// The name of the meter for migration metrics. + /// + public const string MeterName = "StellaOps.Infrastructure.Postgres.Migrations"; + + private static readonly ActivitySource ActivitySource = new(ActivitySourceName, "1.0.0"); + private static readonly Meter Meter = new(MeterName, "1.0.0"); + + // Metrics + private static readonly Counter MigrationsAppliedCounter = Meter.CreateCounter( + "stellaops.migrations.applied.total", + description: "Total number of migrations applied"); + + private static readonly Counter MigrationsFailedCounter = Meter.CreateCounter( + "stellaops.migrations.failed.total", + description: "Total number of migration failures"); + + private static readonly Histogram MigrationDurationHistogram = Meter.CreateHistogram( + "stellaops.migrations.duration.seconds", + unit: "s", + description: "Duration of migration execution"); + + private static readonly Counter LockAcquiredCounter = Meter.CreateCounter( + "stellaops.migrations.lock.acquired.total", + description: "Total number of advisory locks acquired"); + + private static readonly Counter LockTimeoutCounter = Meter.CreateCounter( + "stellaops.migrations.lock.timeout.total", + description: "Total number of advisory lock timeouts"); + + private static readonly UpDownCounter PendingMigrationsGauge = Meter.CreateUpDownCounter( + "stellaops.migrations.pending.count", + description: "Number of pending migrations"); + + /// + /// Starts an activity for migration execution. + /// + public static Activity? StartMigrationRun(string moduleName, string schemaName, int pendingCount) + { + var activity = ActivitySource.StartActivity("migration.run", ActivityKind.Internal); + if (activity is not null) + { + activity.SetTag("migration.module", moduleName); + activity.SetTag("migration.schema", schemaName); + activity.SetTag("migration.pending_count", pendingCount); + activity.SetTag("db.system", "postgresql"); + } + + PendingMigrationsGauge.Add(pendingCount, new KeyValuePair("module", moduleName)); + return activity; + } + + /// + /// Starts an activity for a single migration. + /// + public static Activity? StartMigrationApply(string moduleName, string migrationName, MigrationCategory category) + { + var activity = ActivitySource.StartActivity("migration.apply", ActivityKind.Internal); + if (activity is not null) + { + activity.SetTag("migration.module", moduleName); + activity.SetTag("migration.name", migrationName); + activity.SetTag("migration.category", category.ToString().ToLowerInvariant()); + activity.SetTag("db.system", "postgresql"); + } + + return activity; + } + + /// + /// Starts an activity for advisory lock acquisition. + /// + public static Activity? StartLockAcquisition(string moduleName, string schemaName) + { + var activity = ActivitySource.StartActivity("migration.lock.acquire", ActivityKind.Internal); + if (activity is not null) + { + activity.SetTag("migration.module", moduleName); + activity.SetTag("migration.schema", schemaName); + activity.SetTag("db.system", "postgresql"); + } + + return activity; + } + + /// + /// Records a successful migration application. + /// + public static void RecordMigrationApplied( + string moduleName, + string migrationName, + MigrationCategory category, + double durationSeconds) + { + var tags = new TagList + { + { "module", moduleName }, + { "migration", migrationName }, + { "category", category.ToString().ToLowerInvariant() } + }; + + MigrationsAppliedCounter.Add(1, tags); + MigrationDurationHistogram.Record(durationSeconds, tags); + PendingMigrationsGauge.Add(-1, new KeyValuePair("module", moduleName)); + } + + /// + /// Records a migration failure. + /// + public static void RecordMigrationFailed( + string moduleName, + string migrationName, + MigrationCategory category, + string errorCode) + { + var tags = new TagList + { + { "module", moduleName }, + { "migration", migrationName }, + { "category", category.ToString().ToLowerInvariant() }, + { "error.code", errorCode } + }; + + MigrationsFailedCounter.Add(1, tags); + } + + /// + /// Records a successful lock acquisition. + /// + public static void RecordLockAcquired(string moduleName, string schemaName, double waitSeconds) + { + var tags = new TagList + { + { "module", moduleName }, + { "schema", schemaName } + }; + + LockAcquiredCounter.Add(1, tags); + + // Also record wait time as part of histogram + Meter.CreateHistogram("stellaops.migrations.lock.wait.seconds", unit: "s") + .Record(waitSeconds, tags); + } + + /// + /// Records a lock acquisition timeout. + /// + public static void RecordLockTimeout(string moduleName, string schemaName) + { + var tags = new TagList + { + { "module", moduleName }, + { "schema", schemaName } + }; + + LockTimeoutCounter.Add(1, tags); + } + + /// + /// Records a checksum validation error. + /// + public static void RecordChecksumError(string moduleName, string migrationName) + { + Meter.CreateCounter("stellaops.migrations.checksum.errors.total") + .Add(1, new TagList + { + { "module", moduleName }, + { "migration", migrationName } + }); + } + + /// + /// Sets the error on an activity. + /// + public static void SetActivityError(Activity? activity, Exception exception) + { + if (activity is null) return; + + activity.SetStatus(ActivityStatusCode.Error, exception.Message); + activity.SetTag("error.type", exception.GetType().FullName); + activity.SetTag("error.message", exception.Message); + activity.SetTag("exception.stacktrace", exception.StackTrace); + + // Add exception event for OpenTelemetry compatibility + var tags = new ActivityTagsCollection + { + { "exception.type", exception.GetType().FullName }, + { "exception.message", exception.Message } + }; + activity.AddEvent(new ActivityEvent("exception", tags: tags)); + } + + /// + /// Marks an activity as successful. + /// + public static void SetActivitySuccess(Activity? activity, int appliedCount) + { + if (activity is null) return; + + activity.SetStatus(ActivityStatusCode.Ok); + activity.SetTag("migration.applied_count", appliedCount); + } +} diff --git a/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationValidator.cs b/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationValidator.cs new file mode 100644 index 000000000..d5b016214 --- /dev/null +++ b/src/__Libraries/StellaOps.Infrastructure.Postgres/Migrations/MigrationValidator.cs @@ -0,0 +1,241 @@ +using System.Text.RegularExpressions; + +namespace StellaOps.Infrastructure.Postgres.Migrations; + +/// +/// Validates migration files for naming conventions, duplicates, and ordering issues. +/// +public static partial class MigrationValidator +{ + /// + /// Standard migration pattern: NNN_description.sql (001-099 for startup, 100+ for release). + /// + [GeneratedRegex(@"^(\d{3})_[a-z0-9_]+\.sql$", RegexOptions.IgnoreCase | RegexOptions.Compiled)] + private static partial Regex StandardPattern(); + + /// + /// Seed migration pattern: SNNN_description.sql. + /// + [GeneratedRegex(@"^S(\d{3})_[a-z0-9_]+\.sql$", RegexOptions.IgnoreCase | RegexOptions.Compiled)] + private static partial Regex SeedPattern(); + + /// + /// Data migration pattern: DMNNN_description.sql. + /// + [GeneratedRegex(@"^DM(\d{3})_[a-z0-9_]+\.sql$", RegexOptions.IgnoreCase | RegexOptions.Compiled)] + private static partial Regex DataMigrationPattern(); + + /// + /// Validation result for a set of migrations. + /// + public sealed record ValidationResult + { + public bool IsValid => Errors.Count == 0; + public IReadOnlyList Errors { get; init; } = []; + public IReadOnlyList Warnings { get; init; } = []; + + public static ValidationResult Success(IReadOnlyList? warnings = null) => + new() { Warnings = warnings ?? [] }; + + public static ValidationResult Failed(IReadOnlyList errors, IReadOnlyList? warnings = null) => + new() { Errors = errors, Warnings = warnings ?? [] }; + } + + /// + /// Validation error that will block migration execution. + /// + public sealed record ValidationError(string Code, string Message, string? MigrationName = null); + + /// + /// Validation warning that should be addressed but won't block execution. + /// + public sealed record ValidationWarning(string Code, string Message, string? MigrationName = null); + + /// + /// Validates a collection of migration file names. + /// + public static ValidationResult Validate(IEnumerable migrationNames) + { + var names = migrationNames.ToList(); + var errors = new List(); + var warnings = new List(); + + // Check for duplicates (same numeric prefix) + var duplicates = DetectDuplicatePrefixes(names); + foreach (var (prefix, duplicateNames) in duplicates) + { + errors.Add(new ValidationError( + "DUPLICATE_PREFIX", + $"Multiple migrations with prefix '{prefix}': {string.Join(", ", duplicateNames)}", + duplicateNames.First())); + } + + // Check naming conventions + foreach (var name in names) + { + var conventionResult = ValidateNamingConvention(name); + if (conventionResult is not null) + { + if (conventionResult.Value.IsError) + { + errors.Add(new ValidationError(conventionResult.Value.Code, conventionResult.Value.Message, name)); + } + else + { + warnings.Add(new ValidationWarning(conventionResult.Value.Code, conventionResult.Value.Message, name)); + } + } + } + + // Check for gaps in numbering + var gaps = DetectNumberingGaps(names); + foreach (var gap in gaps) + { + warnings.Add(new ValidationWarning( + "NUMBERING_GAP", + $"Gap in migration numbering: {gap.After} is followed by {gap.Before} (missing {gap.Missing})", + gap.Before)); + } + + return errors.Count > 0 + ? ValidationResult.Failed(errors, warnings) + : ValidationResult.Success(warnings); + } + + /// + /// Detects migrations with duplicate numeric prefixes. + /// + public static IReadOnlyList<(string Prefix, IReadOnlyList Names)> DetectDuplicatePrefixes( + IEnumerable migrationNames) + { + var byPrefix = new Dictionary>(StringComparer.Ordinal); + + foreach (var name in migrationNames) + { + var prefix = ExtractNumericPrefix(name); + if (prefix is null) continue; + + if (!byPrefix.TryGetValue(prefix, out var list)) + { + list = []; + byPrefix[prefix] = list; + } + list.Add(name); + } + + return byPrefix + .Where(kvp => kvp.Value.Count > 1) + .Select(kvp => (kvp.Key, (IReadOnlyList)kvp.Value)) + .ToList(); + } + + /// + /// Extracts the numeric prefix from a migration name. + /// + public static string? ExtractNumericPrefix(string migrationName) + { + var name = Path.GetFileNameWithoutExtension(migrationName); + + // Handle seed migrations (S001, S002, etc.) + if (name.StartsWith('S') && char.IsDigit(name.ElementAtOrDefault(1))) + { + return "S" + new string(name.Skip(1).TakeWhile(char.IsDigit).ToArray()); + } + + // Handle data migrations (DM001, DM002, etc.) + if (name.StartsWith("DM", StringComparison.OrdinalIgnoreCase) && char.IsDigit(name.ElementAtOrDefault(2))) + { + return "DM" + new string(name.Skip(2).TakeWhile(char.IsDigit).ToArray()); + } + + // Handle standard migrations (001, 002, etc.) + var digits = new string(name.TakeWhile(char.IsDigit).ToArray()); + return string.IsNullOrEmpty(digits) ? null : digits.TrimStart('0').PadLeft(3, '0'); + } + + private static (bool IsError, string Code, string Message)? ValidateNamingConvention(string migrationName) + { + var name = Path.GetFileName(migrationName); + + // Check standard pattern + if (StandardPattern().IsMatch(name)) + { + return null; // Valid + } + + // Check seed pattern + if (SeedPattern().IsMatch(name)) + { + return null; // Valid + } + + // Check data migration pattern + if (DataMigrationPattern().IsMatch(name)) + { + return null; // Valid + } + + // Check for non-standard but common patterns + if (name.StartsWith("V", StringComparison.OrdinalIgnoreCase)) + { + return (false, "FLYWAY_STYLE", $"Migration '{name}' uses Flyway-style naming. Consider standardizing to NNN_description.sql format."); + } + + if (name.Length > 15 && char.IsDigit(name[0]) && name.Contains("_")) + { + // Likely EF Core timestamp pattern like 20251214000001_AddSchema.sql + return (false, "EFCORE_STYLE", $"Migration '{name}' uses EF Core timestamp naming. Consider standardizing to NNN_description.sql format."); + } + + // Check for 4-digit prefixes (like 0059_scans_table.sql) + var fourDigitMatch = System.Text.RegularExpressions.Regex.Match(name, @"^(\d{4})_"); + if (fourDigitMatch.Success) + { + return (false, "FOUR_DIGIT_PREFIX", $"Migration '{name}' uses 4-digit prefix. Standard is 3-digit (NNN_description.sql)."); + } + + return (false, "NON_STANDARD_NAME", $"Migration '{name}' does not match standard naming pattern (NNN_description.sql)."); + } + + private static IReadOnlyList<(string After, string Before, string Missing)> DetectNumberingGaps( + IEnumerable migrationNames) + { + var gaps = new List<(string, string, string)>(); + var standardMigrations = new List<(int Number, string Name)>(); + + foreach (var name in migrationNames) + { + var prefix = ExtractNumericPrefix(name); + if (prefix is null) continue; + + // Only check standard migrations (not S or DM) + if (prefix.StartsWith('S') || prefix.StartsWith("DM", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + if (int.TryParse(prefix, out var num)) + { + standardMigrations.Add((num, name)); + } + } + + var sorted = standardMigrations.OrderBy(m => m.Number).ToList(); + for (var i = 1; i < sorted.Count; i++) + { + var prev = sorted[i - 1]; + var curr = sorted[i]; + var expected = prev.Number + 1; + + if (curr.Number > expected && curr.Number - prev.Number > 1) + { + var missing = expected == curr.Number - 1 + ? expected.ToString("D3") + : $"{expected:D3}-{(curr.Number - 1):D3}"; + gaps.Add((prev.Name, curr.Name, missing)); + } + } + + return gaps; + } +} diff --git a/src/__Libraries/StellaOps.Replay.Core.Tests/FeedSnapshot/FeedSnapshotCoordinatorTests.cs b/src/__Libraries/StellaOps.Replay.Core.Tests/FeedSnapshot/FeedSnapshotCoordinatorTests.cs deleted file mode 100644 index b05b938f9..000000000 --- a/src/__Libraries/StellaOps.Replay.Core.Tests/FeedSnapshot/FeedSnapshotCoordinatorTests.cs +++ /dev/null @@ -1,255 +0,0 @@ -// ----------------------------------------------------------------------------- -// FeedSnapshotCoordinatorTests.cs -// Sprint: SPRINT_20251226_007_BE_determinism_gaps -// Task: DET-GAP-02 -// Description: Tests for feed snapshot coordinator determinism -// ----------------------------------------------------------------------------- - -using StellaOps.Replay.Core.FeedSnapshot; -using Xunit; - -namespace StellaOps.Replay.Core.Tests.FeedSnapshot; - -public sealed class FeedSnapshotCoordinatorTests -{ - [Fact] - public async Task CreateSnapshot_WithMultipleSources_ProducesConsistentDigest() - { - // Arrange - var providers = new IFeedSourceProvider[] - { - new FakeSourceProvider("nvd", "v1", "sha256:abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", 100), - new FakeSourceProvider("ghsa", "v2", "sha256:def456def456def456def456def456def456def456def456def456def456def4", 200), - new FakeSourceProvider("osv", "v3", "sha256:789012789012789012789012789012789012789012789012789012789012789a", 150) - }; - var store = new InMemorySnapshotStore(); - var coordinator = new FeedSnapshotCoordinatorService(providers, store); - - // Act - var snapshot1 = await coordinator.CreateSnapshotAsync("test-label"); - var snapshot2 = await coordinator.CreateSnapshotAsync("test-label"); - - // Assert - same providers should produce same composite digest - Assert.Equal(snapshot1.CompositeDigest, snapshot2.CompositeDigest); - Assert.Equal(3, snapshot1.Sources.Count); - } - - [Fact] - public async Task CreateSnapshot_SourcesAreSortedAlphabetically() - { - // Arrange - providers added in non-alphabetical order - var providers = new IFeedSourceProvider[] - { - new FakeSourceProvider("zebra", "v1", "sha256:aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1aaa1", 10), - new FakeSourceProvider("alpha", "v2", "sha256:bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2bbb2", 20), - new FakeSourceProvider("middle", "v3", "sha256:ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3ccc3", 30) - }; - var store = new InMemorySnapshotStore(); - var coordinator = new FeedSnapshotCoordinatorService(providers, store); - - // Act - var snapshot = await coordinator.CreateSnapshotAsync(); - - // Assert - sources should be sorted alphabetically - Assert.Equal("alpha", snapshot.Sources[0].SourceId); - Assert.Equal("middle", snapshot.Sources[1].SourceId); - Assert.Equal("zebra", snapshot.Sources[2].SourceId); - } - - [Fact] - public async Task CreateSnapshot_WithSubsetOfSources_IncludesOnlyRequested() - { - // Arrange - var providers = new IFeedSourceProvider[] - { - new FakeSourceProvider("nvd", "v1", "sha256:abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", 100), - new FakeSourceProvider("ghsa", "v2", "sha256:def456def456def456def456def456def456def456def456def456def456def4", 200), - new FakeSourceProvider("osv", "v3", "sha256:789012789012789012789012789012789012789012789012789012789012789a", 150) - }; - var store = new InMemorySnapshotStore(); - var coordinator = new FeedSnapshotCoordinatorService(providers, store); - - // Act - var snapshot = await coordinator.CreateSnapshotAsync(["nvd", "osv"]); - - // Assert - Assert.Equal(2, snapshot.Sources.Count); - Assert.Contains(snapshot.Sources, s => s.SourceId == "nvd"); - Assert.Contains(snapshot.Sources, s => s.SourceId == "osv"); - Assert.DoesNotContain(snapshot.Sources, s => s.SourceId == "ghsa"); - } - - [Fact] - public async Task RegisteredSources_ReturnsSortedList() - { - // Arrange - var providers = new IFeedSourceProvider[] - { - new FakeSourceProvider("zebra", "v1", "sha256:a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1", 10), - new FakeSourceProvider("alpha", "v2", "sha256:b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2", 20) - }; - var store = new InMemorySnapshotStore(); - var coordinator = new FeedSnapshotCoordinatorService(providers, store); - - // Act - var registered = coordinator.RegisteredSources; - - // Assert - Assert.Equal(2, registered.Count); - Assert.Equal("alpha", registered[0]); - Assert.Equal("zebra", registered[1]); - } - - [Fact] - public async Task GetSnapshot_ReturnsStoredBundle() - { - // Arrange - var providers = new IFeedSourceProvider[] - { - new FakeSourceProvider("nvd", "v1", "sha256:abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", 100) - }; - var store = new InMemorySnapshotStore(); - var coordinator = new FeedSnapshotCoordinatorService(providers, store); - - var created = await coordinator.CreateSnapshotAsync("test"); - - // Act - var retrieved = await coordinator.GetSnapshotAsync(created.CompositeDigest); - - // Assert - Assert.NotNull(retrieved); - Assert.Equal(created.SnapshotId, retrieved.SnapshotId); - Assert.Equal(created.CompositeDigest, retrieved.CompositeDigest); - } - - [Fact] - public async Task ValidateSnapshot_WhenNoChanges_ReturnsValid() - { - // Arrange - var providers = new IFeedSourceProvider[] - { - new FakeSourceProvider("nvd", "v1", "sha256:abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", 100) - }; - var store = new InMemorySnapshotStore(); - var coordinator = new FeedSnapshotCoordinatorService(providers, store); - - var snapshot = await coordinator.CreateSnapshotAsync(); - - // Act - var result = await coordinator.ValidateSnapshotAsync(snapshot.CompositeDigest); - - // Assert - Assert.True(result.IsValid); - Assert.Null(result.MissingSources); - Assert.Null(result.DriftedSources); - } - - [Fact] - public async Task CreateSnapshot_WithUnknownSource_Throws() - { - // Arrange - var providers = new IFeedSourceProvider[] - { - new FakeSourceProvider("nvd", "v1", "sha256:abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", 100) - }; - var store = new InMemorySnapshotStore(); - var coordinator = new FeedSnapshotCoordinatorService(providers, store); - - // Act & Assert - await Assert.ThrowsAsync(() => - coordinator.CreateSnapshotAsync(["nvd", "unknown-source"])); - } - - private sealed class FakeSourceProvider : IFeedSourceProvider - { - private readonly string _version; - private readonly string _digest; - private readonly long _recordCount; - - public FakeSourceProvider(string sourceId, string version, string digest, long recordCount) - { - SourceId = sourceId; - _version = version; - _digest = digest; - _recordCount = recordCount; - } - - public string SourceId { get; } - public string DisplayName => $"Fake {SourceId}"; - public int Priority => 0; - - public Task CreateSnapshotAsync(CancellationToken cancellationToken = default) - { - return Task.FromResult(new SourceSnapshot - { - SourceId = SourceId, - Version = _version, - Digest = _digest, - RecordCount = _recordCount - }); - } - - public Task GetCurrentDigestAsync(CancellationToken cancellationToken = default) => - Task.FromResult(_digest); - - public Task GetRecordCountAsync(CancellationToken cancellationToken = default) => - Task.FromResult(_recordCount); - - public Task ExportAsync(SourceSnapshot snapshot, Stream outputStream, CancellationToken cancellationToken = default) => - Task.CompletedTask; - - public Task ImportAsync(Stream inputStream, CancellationToken cancellationToken = default) => - CreateSnapshotAsync(cancellationToken); - } - - private sealed class InMemorySnapshotStore : IFeedSnapshotStore - { - private readonly Dictionary _byDigest = new(StringComparer.OrdinalIgnoreCase); - private readonly Dictionary _byId = new(StringComparer.OrdinalIgnoreCase); - - public Task SaveAsync(FeedSnapshotBundle bundle, CancellationToken cancellationToken = default) - { - _byDigest[bundle.CompositeDigest] = bundle; - _byId[bundle.SnapshotId] = bundle; - return Task.CompletedTask; - } - - public Task GetByDigestAsync(string compositeDigest, CancellationToken cancellationToken = default) => - Task.FromResult(_byDigest.GetValueOrDefault(compositeDigest)); - - public Task GetByIdAsync(string snapshotId, CancellationToken cancellationToken = default) => - Task.FromResult(_byId.GetValueOrDefault(snapshotId)); - - public async IAsyncEnumerable ListAsync( - DateTimeOffset? from = null, - DateTimeOffset? to = null, - [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken = default) - { - foreach (var bundle in _byDigest.Values.OrderByDescending(b => b.CreatedAt)) - { - if (from.HasValue && bundle.CreatedAt < from.Value) continue; - if (to.HasValue && bundle.CreatedAt > to.Value) continue; - - yield return new FeedSnapshotSummary - { - SnapshotId = bundle.SnapshotId, - CompositeDigest = bundle.CompositeDigest, - Label = bundle.Label, - CreatedAt = bundle.CreatedAt, - SourceCount = bundle.Sources.Count, - TotalRecordCount = bundle.Sources.Sum(s => s.RecordCount) - }; - } - } - - public Task DeleteAsync(string compositeDigest, CancellationToken cancellationToken = default) - { - var existed = _byDigest.Remove(compositeDigest, out var bundle); - if (existed && bundle is not null) - { - _byId.Remove(bundle.SnapshotId); - } - return Task.FromResult(existed); - } - } -} diff --git a/src/__Libraries/StellaOps.Replay.Core.Tests/ReplayManifestTests.cs b/src/__Libraries/StellaOps.Replay.Core.Tests/ReplayManifestTests.cs deleted file mode 100644 index 65dd9fbfa..000000000 --- a/src/__Libraries/StellaOps.Replay.Core.Tests/ReplayManifestTests.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System.Text.Json; -using StellaOps.Replay.Core; -using Xunit; - -using StellaOps.TestKit; -public class ReplayManifestTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SerializesWithNamespacesAndAnalysis_V1() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V1, - Reachability = new ReplayReachabilitySection - { - AnalysisId = "analysis-123" - } - }; - - manifest.AddReachabilityGraph(new ReplayReachabilityGraphReference - { - Kind = "static", - CasUri = "cas://reachability_graphs/aa/aagraph.tar.zst", - Hash = "sha256:aa", - HashAlgorithm = "sha256", - Sha256 = "aa", // Legacy field for v1 compat - Namespace = "reachability_graphs", - CallgraphId = "cg-1", - Analyzer = "scanner", - Version = "0.1" - }); - - manifest.AddReachabilityTrace(new ReplayReachabilityTraceReference - { - Source = "runtime", - CasUri = "cas://runtime_traces/bb/bbtrace.tar.zst", - Hash = "sha256:bb", - HashAlgorithm = "sha256", - Sha256 = "bb", // Legacy field for v1 compat - Namespace = "runtime_traces", - RecordedAt = System.DateTimeOffset.Parse("2025-11-26T00:00:00Z") - }); - - var json = JsonSerializer.Serialize(manifest, new JsonSerializerOptions(JsonSerializerDefaults.Web)); - - Assert.Contains("\"analysisId\":\"analysis-123\"", json); - Assert.Contains("\"namespace\":\"reachability_graphs\"", json); - Assert.Contains("\"callgraphId\":\"cg-1\"", json); - Assert.Contains("\"namespace\":\"runtime_traces\"", json); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SerializesWithV2HashFields() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Reachability = new ReplayReachabilitySection - { - AnalysisId = "analysis-v2" - } - }; - - manifest.AddReachabilityGraph(new ReplayReachabilityGraphReference - { - Kind = "static", - CasUri = "cas://reachability/graphs/blake3:abc123", - Hash = "blake3:abc123def456789012345678901234567890123456789012345678901234", - HashAlgorithm = "blake3-256", - Namespace = "reachability_graphs", - Analyzer = "scanner.java@10.0.0", - Version = "10.0.0" - }); - - var json = JsonSerializer.Serialize(manifest, new JsonSerializerOptions(JsonSerializerDefaults.Web)); - - Assert.Contains("\"schemaVersion\":\"2.0\"", json); - Assert.Contains("\"hash\":\"blake3:", json); - Assert.Contains("\"hashAlg\":\"blake3-256\"", json); - // v2 manifests should not emit legacy sha256 field (JsonIgnore when null) - Assert.DoesNotContain("\"sha256\":", json); - } -} diff --git a/src/__Libraries/StellaOps.Replay.Core.Tests/ReplayManifestV2Tests.cs b/src/__Libraries/StellaOps.Replay.Core.Tests/ReplayManifestV2Tests.cs deleted file mode 100644 index cdc11e696..000000000 --- a/src/__Libraries/StellaOps.Replay.Core.Tests/ReplayManifestV2Tests.cs +++ /dev/null @@ -1,500 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json; -using System.Threading.Tasks; -using StellaOps.Replay.Core; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Replay.Core.Tests; - -/// -/// Test vectors from replay-manifest-v2-acceptance.md -/// -public class ReplayManifestV2Tests -{ - private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web) - { - WriteIndented = false - }; - - #region Section 4.1: Minimal Valid Manifest v2 - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void MinimalValidManifestV2_SerializesCorrectly() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Scan = new ReplayScanMetadata - { - Id = "scan-test-001", - Time = DateTimeOffset.Parse("2025-12-13T10:00:00Z") - }, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Kind = "static", - Analyzer = "scanner.java@10.2.0", - Hash = "blake3:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2" - } - }, - RuntimeTraces = new List(), - CodeIdCoverage = new CodeIdCoverage - { - TotalNodes = 100, - NodesWithSymbolId = 100, - NodesWithCodeId = 0, - CoveragePercent = 100.0 - } - } - }; - - var json = JsonSerializer.Serialize(manifest, JsonOptions); - - Assert.Contains("\"schemaVersion\":\"2.0\"", json); - Assert.Contains("\"hash\":\"blake3:", json); - Assert.Contains("\"hashAlg\":\"blake3-256\"", json); - Assert.Contains("\"code_id_coverage\"", json); - Assert.Contains("\"total_nodes\":100", json); - } - - #endregion - - #region Section 4.2: Manifest with Runtime Traces - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void ManifestWithRuntimeTraces_SerializesCorrectly() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Scan = new ReplayScanMetadata - { - Id = "scan-test-002", - Time = DateTimeOffset.Parse("2025-12-13T11:00:00Z") - }, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Kind = "static", - Analyzer = "scanner.java@10.2.0", - Hash = "blake3:1111111111111111111111111111111111111111111111111111111111111111", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:1111111111111111111111111111111111111111111111111111111111111111" - } - }, - RuntimeTraces = new List - { - new() - { - Source = "eventpipe", - Hash = "sha256:2222222222222222222222222222222222222222222222222222222222222222", - HashAlgorithm = "sha256", - CasUri = "cas://reachability/runtime/sha256:2222222222222222222222222222222222222222222222222222222222222222", - RecordedAt = DateTimeOffset.Parse("2025-12-13T10:30:00Z") - } - } - } - }; - - var json = JsonSerializer.Serialize(manifest, JsonOptions); - - Assert.Contains("\"source\":\"eventpipe\"", json); - Assert.Contains("\"hash\":\"sha256:", json); - Assert.Contains("\"hashAlg\":\"sha256\"", json); - } - - #endregion - - #region Section 4.3: Sorting Validation - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SortingValidation_UnsortedGraphs_FailsValidation() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Kind = "framework", - Hash = "blake3:zzzz1111111111111111111111111111111111111111111111111111111111", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:zzzz..." - }, - new() - { - Kind = "static", - Hash = "blake3:aaaa1111111111111111111111111111111111111111111111111111111111", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:aaaa..." - } - } - } - }; - - var validator = new ReplayManifestValidator(); - var result = validator.ValidateAsync(manifest).GetAwaiter().GetResult(); - - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.ErrorCode == ReplayManifestErrorCodes.UnsortedEntries); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SortingValidation_SortedGraphs_PassesValidation() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Kind = "static", - Hash = "blake3:aaaa1111111111111111111111111111111111111111111111111111111111", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:aaaa..." - }, - new() - { - Kind = "framework", - Hash = "blake3:zzzz1111111111111111111111111111111111111111111111111111111111", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:zzzz..." - } - } - } - }; - - var validator = new ReplayManifestValidator(); - var result = validator.ValidateAsync(manifest).GetAwaiter().GetResult(); - - Assert.True(result.IsValid); - } - - #endregion - - #region Section 4.4: Invalid Manifest Vectors - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void InvalidManifest_MissingSchemaVersion_FailsValidation() - { - var manifest = new ReplayManifest - { - SchemaVersion = null! - }; - - var validator = new ReplayManifestValidator(); - var result = validator.ValidateAsync(manifest).GetAwaiter().GetResult(); - - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.ErrorCode == ReplayManifestErrorCodes.MissingVersion); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void InvalidManifest_VersionMismatch_WhenV2Required_FailsValidation() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V1 - }; - - var validator = new ReplayManifestValidator(requireV2: true); - var result = validator.ValidateAsync(manifest).GetAwaiter().GetResult(); - - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.ErrorCode == ReplayManifestErrorCodes.VersionMismatch); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void InvalidManifest_MissingHashAlg_InV2_FailsValidation() - { - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Hash = "blake3:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2", - HashAlgorithm = null!, // Missing - CasUri = "cas://reachability/graphs/blake3:..." - } - } - } - }; - - var validator = new ReplayManifestValidator(); - var result = validator.ValidateAsync(manifest).GetAwaiter().GetResult(); - - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.ErrorCode == ReplayManifestErrorCodes.MissingHashAlg); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task InvalidManifest_MissingCasReference_FailsValidation() - { - var casValidator = new InMemoryCasValidator(); - // Don't register any objects - - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Hash = "blake3:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:missing" - } - } - } - }; - - var validator = new ReplayManifestValidator(casValidator); - var result = await validator.ValidateAsync(manifest); - - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.ErrorCode == ReplayManifestErrorCodes.CasNotFound); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task InvalidManifest_HashMismatch_FailsValidation() - { - var casValidator = new InMemoryCasValidator(); - casValidator.Register( - "cas://reachability/graphs/blake3:actual", - "blake3:differenthash"); - casValidator.Register( - "cas://reachability/graphs/blake3:actual.dsse", - "blake3:differenthash.dsse"); - - var manifest = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V2, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Hash = "blake3:expected", - HashAlgorithm = "blake3-256", - CasUri = "cas://reachability/graphs/blake3:actual" - } - } - } - }; - - var validator = new ReplayManifestValidator(casValidator); - var result = await validator.ValidateAsync(manifest); - - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.ErrorCode == ReplayManifestErrorCodes.HashMismatch); - } - - #endregion - - #region Section 5: Migration Path - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void UpgradeToV2_ConvertsV1ManifestCorrectly() - { - var v1 = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V1, - Scan = new ReplayScanMetadata - { - Id = "scan-legacy" - }, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() - { - Kind = "static", - Sha256 = "abc123", - CasUri = "cas://reachability/graphs/abc123" - } - } - } - }; - - var v2 = ReplayManifestValidator.UpgradeToV2(v1); - - Assert.Equal(ReplayManifestVersions.V2, v2.SchemaVersion); - Assert.Single(v2.Reachability.Graphs); - Assert.Equal("sha256:abc123", v2.Reachability.Graphs[0].Hash); - Assert.Equal("sha256", v2.Reachability.Graphs[0].HashAlgorithm); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void UpgradeToV2_SortsGraphsByUri() - { - var v1 = new ReplayManifest - { - SchemaVersion = ReplayManifestVersions.V1, - Reachability = new ReplayReachabilitySection - { - Graphs = new List - { - new() { Sha256 = "zzz", CasUri = "cas://graphs/zzz" }, - new() { Sha256 = "aaa", CasUri = "cas://graphs/aaa" } - } - } - }; - - var v2 = ReplayManifestValidator.UpgradeToV2(v1); - - Assert.Equal("cas://graphs/aaa", v2.Reachability.Graphs[0].CasUri); - Assert.Equal("cas://graphs/zzz", v2.Reachability.Graphs[1].CasUri); - } - - #endregion - - #region ReachabilityReplayWriter Tests - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BuildManifestV2_WithValidGraphs_CreatesSortedManifest() - { - var scan = new ReplayScanMetadata { Id = "test-scan" }; - var graphs = new[] - { - new ReplayReachabilityGraphReference - { - Hash = "blake3:zzzz", - CasUri = "cas://graphs/zzzz" - }, - new ReplayReachabilityGraphReference - { - Hash = "blake3:aaaa", - CasUri = "cas://graphs/aaaa" - } - }; - - var manifest = ReachabilityReplayWriter.BuildManifestV2( - scan, - graphs, - Array.Empty()); - - Assert.Equal(ReplayManifestVersions.V2, manifest.SchemaVersion); - Assert.Equal("cas://graphs/aaaa", manifest.Reachability.Graphs[0].CasUri); - Assert.Equal("cas://graphs/zzzz", manifest.Reachability.Graphs[1].CasUri); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BuildManifestV2_WithLegacySha256_MigratesHashField() - { - var scan = new ReplayScanMetadata { Id = "test-scan" }; - var graphs = new[] - { - new ReplayReachabilityGraphReference - { - Sha256 = "abc123", - CasUri = "cas://graphs/abc123" - } - }; - - var manifest = ReachabilityReplayWriter.BuildManifestV2( - scan, - graphs, - Array.Empty()); - - Assert.Equal("sha256:abc123", manifest.Reachability.Graphs[0].Hash); - Assert.Equal("sha256", manifest.Reachability.Graphs[0].HashAlgorithm); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BuildManifestV2_InfersHashAlgorithmFromPrefix() - { - var scan = new ReplayScanMetadata { Id = "test-scan" }; - var graphs = new[] - { - new ReplayReachabilityGraphReference - { - Hash = "blake3:a1b2c3d4", - CasUri = "cas://graphs/a1b2c3d4" - } - }; - - var manifest = ReachabilityReplayWriter.BuildManifestV2( - scan, - graphs, - Array.Empty()); - - Assert.Equal("blake3-256", manifest.Reachability.Graphs[0].HashAlgorithm); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BuildManifestV2_RequiresAtLeastOneGraph() - { - var scan = new ReplayScanMetadata { Id = "test-scan" }; - - Assert.Throws(() => - ReachabilityReplayWriter.BuildManifestV2( - scan, - Array.Empty(), - Array.Empty())); - } - - #endregion - - #region CodeIdCoverage Tests - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void CodeIdCoverage_SerializesWithSnakeCaseKeys() - { - var coverage = new CodeIdCoverage - { - TotalNodes = 1247, - NodesWithSymbolId = 1189, - NodesWithCodeId = 58, - CoveragePercent = 100.0 - }; - - var json = JsonSerializer.Serialize(coverage, JsonOptions); - - Assert.Contains("\"total_nodes\":1247", json); - Assert.Contains("\"nodes_with_symbol_id\":1189", json); - Assert.Contains("\"nodes_with_code_id\":58", json); - Assert.Contains("\"coverage_percent\":100", json); - } - - #endregion -} diff --git a/src/__Libraries/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj b/src/__Libraries/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj deleted file mode 100644 index 8d7bff527..000000000 --- a/src/__Libraries/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - net10.0 - enable - enable - false - $(NoWarn);NETSDK1188 - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - diff --git a/src/__Libraries/StellaOps.Replay.Core.Tests/Validation/DeterminismManifestValidatorTests.cs b/src/__Libraries/StellaOps.Replay.Core.Tests/Validation/DeterminismManifestValidatorTests.cs deleted file mode 100644 index e5c33f468..000000000 --- a/src/__Libraries/StellaOps.Replay.Core.Tests/Validation/DeterminismManifestValidatorTests.cs +++ /dev/null @@ -1,399 +0,0 @@ -// ----------------------------------------------------------------------------- -// DeterminismManifestValidatorTests.cs -// Sprint: SPRINT_20251226_007_BE_determinism_gaps -// Task: DET-GAP-10 -// Description: Tests for determinism manifest validator -// ----------------------------------------------------------------------------- - -using StellaOps.Replay.Core.Validation; -using Xunit; - -namespace StellaOps.Replay.Core.Tests.Validation; - -public sealed class DeterminismManifestValidatorTests -{ - private readonly DeterminismManifestValidator _validator = new(); - - [Fact] - public void Validate_ValidManifest_ReturnsValid() - { - // Arrange - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "sbom", - "name": "alpine-3.18", - "version": "2025-12-26T00:00:00Z", - "format": "SPDX 3.0.1" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [ - {"name": "StellaOps.Scanner", "version": "1.0.0"} - ] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.True(result.IsValid); - Assert.Empty(result.Errors); - } - - [Fact] - public void Validate_MissingRequiredField_ReturnsError() - { - // Arrange - missing "artifact" - var json = """ - { - "schemaVersion": "1.0", - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "artifact"); - } - - [Fact] - public void Validate_InvalidArtifactType_ReturnsError() - { - // Arrange - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "invalid-type", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "artifact.type"); - } - - [Fact] - public void Validate_InvalidHashAlgorithm_ReturnsError() - { - // Arrange - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "sbom", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "MD5", - "value": "abc123", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "canonicalHash.algorithm"); - } - - [Fact] - public void Validate_InvalidHashValue_ReturnsError() - { - // Arrange - hash value too short - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "sbom", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "canonicalHash.value"); - } - - [Fact] - public void Validate_UnsupportedSchemaVersion_ReturnsError() - { - // Arrange - var json = """ - { - "schemaVersion": "2.0", - "artifact": { - "type": "sbom", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "schemaVersion"); - } - - [Fact] - public void Validate_InvalidTimestamp_ReturnsError() - { - // Arrange - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "sbom", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [] - }, - "generatedAt": "not-a-timestamp" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "generatedAt"); - } - - [Fact] - public void Validate_EmptyComponentsArray_ReturnsWarning() - { - // Arrange - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "verdict", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.True(result.IsValid); - Assert.Contains(result.Warnings, w => w.Path == "toolchain.components"); - } - - [Fact] - public void Validate_SbomWithoutFormat_ReturnsWarning() - { - // Arrange - sbom without format specified - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "sbom", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [ - {"name": "test", "version": "1.0"} - ] - }, - "generatedAt": "2025-12-26T12:00:00Z" - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.True(result.IsValid); - Assert.Contains(result.Warnings, w => w.Path == "artifact.format"); - } - - [Fact] - public void Validate_InvalidJson_ReturnsError() - { - // Arrange - var json = "{ invalid json }"; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "$"); - } - - [Fact] - public void Validate_WithInputs_ValidatesHashFormats() - { - // Arrange - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "verdict", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [{"name": "test", "version": "1.0"}] - }, - "generatedAt": "2025-12-26T12:00:00Z", - "inputs": { - "feedSnapshotHash": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "baseImageDigest": "sha256:def456def456def456def456def456def456def456def456def456def456def4" - } - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.True(result.IsValid); - } - - [Fact] - public void Validate_InvalidBaseImageDigest_ReturnsError() - { - // Arrange - missing sha256: prefix - var json = """ - { - "schemaVersion": "1.0", - "artifact": { - "type": "verdict", - "name": "test", - "version": "1.0" - }, - "canonicalHash": { - "algorithm": "SHA-256", - "value": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1", - "encoding": "hex" - }, - "toolchain": { - "platform": ".NET 10.0.0", - "components": [{"name": "test", "version": "1.0"}] - }, - "generatedAt": "2025-12-26T12:00:00Z", - "inputs": { - "baseImageDigest": "def456def456def456def456def456def456def456def456def456def456def4" - } - } - """; - - // Act - var result = _validator.Validate(json); - - // Assert - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Path == "inputs.baseImageDigest"); - } -} diff --git a/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AirGapTrustStoreIntegrationTests.cs b/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AirGapTrustStoreIntegrationTests.cs index fdba682e6..b6ad32f78 100644 --- a/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AirGapTrustStoreIntegrationTests.cs +++ b/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AirGapTrustStoreIntegrationTests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // AirGapTrustStoreIntegrationTests.cs // Sprint: SPRINT_4300_0001_0002 (One-Command Audit Replay CLI) // Description: Unit tests for AirGapTrustStoreIntegration. @@ -337,7 +337,6 @@ public class AirGapTrustStoreIntegrationTests : IDisposable private static string GenerateEcdsaPublicKeyPem() { using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); -using StellaOps.TestKit; return ecdsa.ExportSubjectPublicKeyInfoPem(); } } diff --git a/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AuditReplayE2ETests.cs b/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AuditReplayE2ETests.cs index c1eb3d19b..1c26d4abc 100644 --- a/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AuditReplayE2ETests.cs +++ b/src/__Libraries/__Tests/StellaOps.AuditPack.Tests/AuditReplayE2ETests.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // AuditReplayE2ETests.cs // Sprint: SPRINT_4300_0001_0002 (One-Command Audit Replay CLI) // Task: REPLAY-028 - E2E test: export -> transfer -> replay offline @@ -513,7 +513,6 @@ public class AuditReplayE2ETests : IDisposable private static async Task ComputeFileHashAsync(string filePath) { await using var stream = File.OpenRead(filePath); -using StellaOps.TestKit; var hash = await SHA256.HashDataAsync(stream); return Convert.ToHexString(hash).ToLowerInvariant(); } diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/CloudKmsClientTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/CloudKmsClientTests.cs index e17c02c8c..1e6dbc864 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/CloudKmsClientTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/CloudKmsClientTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Immutable; +using System.Collections.Immutable; using System.Linq; using System.Security.Cryptography; using System.Text; @@ -161,7 +161,6 @@ public sealed class CloudKmsClientTests public async Task Fido2Client_Signs_Verifies_And_Exports() { using var fixture = new EcdsaFixture(); -using StellaOps.TestKit; var authenticator = new TestFidoAuthenticator(fixture); var options = new Fido2Options { diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/FileKmsClientTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/FileKmsClientTests.cs index fc8c5470e..5732f515f 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/FileKmsClientTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Kms.Tests/FileKmsClientTests.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; using StellaOps.Cryptography.Kms; @@ -75,7 +75,6 @@ public sealed class FileKmsClientTests : IDisposable public async Task ExportAsync_ReturnsKeyMaterial() { using var client = CreateClient(); -using StellaOps.TestKit; var keyId = "kms-export"; await client.RotateAsync(keyId); diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/BouncyCastleEd25519CryptoProviderTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/BouncyCastleEd25519CryptoProviderTests.cs index d1411ae9c..98d49d4e8 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/BouncyCastleEd25519CryptoProviderTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/BouncyCastleEd25519CryptoProviderTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.Cryptography; using StellaOps.Cryptography.DependencyInjection; @@ -22,7 +22,6 @@ public sealed class BouncyCastleEd25519CryptoProviderTests services.AddBouncyCastleEd25519Provider(); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var registry = provider.GetRequiredService(); var bcProvider = provider.GetServices() .OfType() diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/CryptoProGostSignerTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/CryptoProGostSignerTests.cs index 7b2f58550..79d146edb 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/CryptoProGostSignerTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/CryptoProGostSignerTests.cs @@ -1,4 +1,4 @@ -#if STELLAOPS_CRYPTO_PRO +#if STELLAOPS_CRYPTO_PRO using System; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; @@ -31,7 +31,6 @@ public class CryptoProGostSignerTests var request = new CertificateRequest("CN=stellaops.test", ecdsa, HashAlgorithmName.SHA256); using var cert = request.CreateSelfSigned(DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddDays(1)); -using StellaOps.TestKit; var entry = new CryptoProGostKeyEntry( "test-key", SignatureAlgorithms.GostR3410_2012_256, diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHashTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHashTests.cs index 959c5064f..f572b9316 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHashTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHashTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Security.Cryptography; using System.Text; @@ -84,7 +84,6 @@ public sealed class DefaultCryptoHashTests var hash = CryptoHashFactory.CreateDefault(); var expected = Convert.ToHexStringLower(SHA256.HashData(Sample)); await using var stream = new MemoryStream(Sample); -using StellaOps.TestKit; var actual = await hash.ComputeHashHexAsync(stream, HashAlgorithms.Sha256); Assert.Equal(expected, actual); } diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHmacTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHmacTests.cs index 69e07ef8b..b032e20fc 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHmacTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoHmacTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Security.Cryptography; using System.Text; @@ -32,7 +32,6 @@ public sealed class DefaultCryptoHmacTests var hmac = DefaultCryptoHmac.CreateForTests(); var expected = Convert.ToHexStringLower(HMACSHA256.HashData(Key, Sample)); await using var stream = new MemoryStream(Sample); -using StellaOps.TestKit; var actual = await hmac.ComputeHmacHexForPurposeAsync(Key, stream, HmacPurpose.WebhookInterop); Assert.Equal(expected, actual); } diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoProviderSigningTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoProviderSigningTests.cs index d03905812..2998d4555 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoProviderSigningTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/DefaultCryptoProviderSigningTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; @@ -61,7 +61,6 @@ public class DefaultCryptoProviderSigningTests { var provider = new DefaultCryptoProvider(); using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); -using StellaOps.TestKit; var parameters = ecdsa.ExportParameters(true); var signingKey = new CryptoSigningKey(new CryptoKeyReference("key-to-remove"), SignatureAlgorithms.Es256, in parameters, DateTimeOffset.UtcNow); diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/LibsodiumCryptoProviderTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/LibsodiumCryptoProviderTests.cs index ca9c05ccb..48576a45a 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/LibsodiumCryptoProviderTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/LibsodiumCryptoProviderTests.cs @@ -1,4 +1,4 @@ -#if STELLAOPS_CRYPTO_SODIUM +#if STELLAOPS_CRYPTO_SODIUM using System; using System.Security.Cryptography; using System.Text; @@ -17,7 +17,6 @@ public class LibsodiumCryptoProviderTests { var provider = new LibsodiumCryptoProvider(); using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); -using StellaOps.TestKit; var parameters = ecdsa.ExportParameters(includePrivateParameters: true); var signingKey = new CryptoSigningKey( diff --git a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/Pkcs11GostProviderTests.cs b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/Pkcs11GostProviderTests.cs index 4f31a808a..5aa892344 100644 --- a/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/Pkcs11GostProviderTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Cryptography.Tests/Pkcs11GostProviderTests.cs @@ -1,4 +1,4 @@ -#if STELLAOPS_PKCS11 +#if STELLAOPS_PKCS11 using System; using System.IO; using System.Security.Cryptography; @@ -23,7 +23,6 @@ public class Pkcs11GostProviderTests } using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); -using StellaOps.TestKit; var req = new CertificateRequest("CN=pkcs11.test", ecdsa, HashAlgorithmName.SHA256); var cert = req.CreateSelfSigned(DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddDays(1)); diff --git a/src/__Libraries/__Tests/StellaOps.Infrastructure.Postgres.Tests/PostgresFixtureTests.cs b/src/__Libraries/__Tests/StellaOps.Infrastructure.Postgres.Tests/PostgresFixtureTests.cs index 819154f9b..b31ec5bab 100644 --- a/src/__Libraries/__Tests/StellaOps.Infrastructure.Postgres.Tests/PostgresFixtureTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Infrastructure.Postgres.Tests/PostgresFixtureTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using StellaOps.Infrastructure.Postgres.Testing; using Testcontainers.PostgreSql; using Xunit; @@ -99,7 +99,6 @@ public sealed class PostgresFixtureTests : IAsyncLifetime await using var cmd = new Npgsql.NpgsqlCommand( "SELECT EXISTS(SELECT 1 FROM information_schema.schemata WHERE schema_name = @name)", conn); -using StellaOps.TestKit; cmd.Parameters.AddWithValue("name", schemaName); var exists = await cmd.ExecuteScalarAsync(); exists.Should().Be(false); diff --git a/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/MinimalApiBindingIntegrationTests.cs b/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/MinimalApiBindingIntegrationTests.cs index 7753c1cb7..62c3d0eb2 100644 --- a/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/MinimalApiBindingIntegrationTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/MinimalApiBindingIntegrationTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Text.Json; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; @@ -273,7 +273,6 @@ public sealed class MinimalApiBindingIntegrationTests : IAsyncLifetime app.MapPatch("/items/{itemId}", async ([FromRoute] string itemId, HttpContext context) => { using var reader = new StreamReader(context.Request.Body); -using StellaOps.TestKit; var bodyText = await reader.ReadToEndAsync(); var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var request = JsonSerializer.Deserialize(bodyText, options); @@ -640,7 +639,7 @@ using StellaOps.TestKit; public async Task FromBody_UnicodeContent_HandledCorrectly() { // Arrange - var unicodeMessage = "Hello 世界! Привет мир! مرحبا"; + var unicodeMessage = "Hello 世界! Привет мир! مرحبا"; var jsonBody = JsonSerializer.Serialize(new { message = unicodeMessage }, _jsonOptions); var request = CreateRequest("POST", "/echo", body: jsonBody, contentType: "application/json"); diff --git a/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/StellaRouterBridgeIntegrationTests.cs b/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/StellaRouterBridgeIntegrationTests.cs index 18721c6b7..0848aefa5 100644 --- a/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/StellaRouterBridgeIntegrationTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Microservice.AspNetCore.Tests/StellaRouterBridgeIntegrationTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Text.Json; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; @@ -14,7 +14,7 @@ namespace StellaOps.Microservice.AspNetCore.Tests; /// /// Full integration tests for StellaOps Router bridge. -/// Tests the complete flow: Program.cs registration → service startup → endpoint discovery → request dispatch. +/// Tests the complete flow: Program.cs registration → service startup → endpoint discovery → request dispatch. /// /// /// Uses registerMicroserviceServices: false to avoid needing a real transport during tests. @@ -116,7 +116,6 @@ public sealed class StellaRouterBridgeIntegrationTests : IAsyncLifetime app.MapPut("/api/items/{id}", async (string id, HttpContext context) => { using var reader = new StreamReader(context.Request.Body); -using StellaOps.TestKit; var body = await reader.ReadToEndAsync(); var data = JsonSerializer.Deserialize(body); var name = data.GetProperty("name").GetString(); diff --git a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/InflightRequestTrackerTests.cs b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/InflightRequestTrackerTests.cs index 3e30de832..f359896fb 100644 --- a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/InflightRequestTrackerTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/InflightRequestTrackerTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -305,7 +305,6 @@ public sealed class InflightRequestTrackerTests : IDisposable // Arrange - use a fresh tracker using var tracker = new InflightRequestTracker(NullLogger.Instance); -using StellaOps.TestKit; // Assert tracker.Count.Should().Be(0); } diff --git a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawRequestContextTests.cs b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawRequestContextTests.cs index 88b9d9298..a9dcde654 100644 --- a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawRequestContextTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawRequestContextTests.cs @@ -1,4 +1,4 @@ -using StellaOps.TestKit; +using StellaOps.TestKit; namespace StellaOps.Microservice.Tests; /// @@ -232,7 +232,6 @@ public sealed class RawRequestContextTests { // Arrange using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; cts.Cancel(); // Act diff --git a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawResponseTests.cs b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawResponseTests.cs index 8aef67c05..1d4ca56e4 100644 --- a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawResponseTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RawResponseTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using StellaOps.TestKit; @@ -332,7 +332,6 @@ public sealed class RawResponseTests // Assert using var reader = new StreamReader(response.Body, Encoding.UTF8); -using StellaOps.TestKit; reader.ReadToEnd().Should().Be(message); } diff --git a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RouterConnectionManagerTests.cs b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RouterConnectionManagerTests.cs index 826216d47..ff524c4d4 100644 --- a/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RouterConnectionManagerTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Microservice.Tests/RouterConnectionManagerTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Moq; using StellaOps.Router.Common.Abstractions; @@ -300,7 +300,6 @@ public sealed class RouterConnectionManagerTests : IDisposable TransportType = TransportType.InMemory }); using var manager = CreateManager(); -using StellaOps.TestKit; manager.CurrentStatus = InstanceHealthStatus.Degraded; manager.InFlightRequestCount = 10; manager.ErrorRate = 0.05; diff --git a/src/__Libraries/__Tests/StellaOps.Provcache.Tests/EvidenceChunkerTests.cs b/src/__Libraries/__Tests/StellaOps.Provcache.Tests/EvidenceChunkerTests.cs index fd3941e73..4ad25c129 100644 --- a/src/__Libraries/__Tests/StellaOps.Provcache.Tests/EvidenceChunkerTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Provcache.Tests/EvidenceChunkerTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using StellaOps.Provcache; using Xunit; @@ -259,7 +259,6 @@ public sealed class EvidenceChunkerTests var evidence = new byte[200]; Random.Shared.NextBytes(evidence); using var stream = new MemoryStream(evidence); -using StellaOps.TestKit; const string contentType = "application/octet-stream"; // Act diff --git a/src/__Libraries/__Tests/StellaOps.Provcache.Tests/MinimalProofExporterTests.cs b/src/__Libraries/__Tests/StellaOps.Provcache.Tests/MinimalProofExporterTests.cs index a56423a81..0f6a16033 100644 --- a/src/__Libraries/__Tests/StellaOps.Provcache.Tests/MinimalProofExporterTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Provcache.Tests/MinimalProofExporterTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Moq; using StellaOps.Cryptography; @@ -223,7 +223,6 @@ public sealed class MinimalProofExporterTests var options = new MinimalProofExportOptions { Density = ProofDensity.Lite }; using var stream = new MemoryStream(); -using StellaOps.TestKit; // Act await _exporter.ExportToStreamAsync(_testEntry.VeriKey, options, stream); diff --git a/src/__Libraries/__Tests/StellaOps.Provcache.Tests/StorageIntegrationTests.cs b/src/__Libraries/__Tests/StellaOps.Provcache.Tests/StorageIntegrationTests.cs index db0b72c29..5ec8858b0 100644 --- a/src/__Libraries/__Tests/StellaOps.Provcache.Tests/StorageIntegrationTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Provcache.Tests/StorageIntegrationTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Moq; @@ -139,7 +139,6 @@ public class WriteBehindQueueTests // Act - Start the queue and let it process using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; var task = queue.StartAsync(cts.Token); // Wait for processing diff --git a/src/StellaOps.Events.Provenance.Tests/ProvenanceExtensionsTests.cs b/src/__Libraries/__Tests/StellaOps.Provenance.Tests/ProvenanceExtensionsTests.cs similarity index 98% rename from src/StellaOps.Events.Provenance.Tests/ProvenanceExtensionsTests.cs rename to src/__Libraries/__Tests/StellaOps.Provenance.Tests/ProvenanceExtensionsTests.cs index 3710a66d6..a7c8be9df 100644 --- a/src/StellaOps.Events.Provenance.Tests/ProvenanceExtensionsTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Provenance.Tests/ProvenanceExtensionsTests.cs @@ -4,7 +4,7 @@ using StellaOps.Provenance; using Xunit; using StellaOps.TestKit; -namespace StellaOps.Events.Provenance.Tests; +namespace StellaOps.Provenance.Tests; public sealed class ProvenanceExtensionsTests { diff --git a/src/__Libraries/__Tests/StellaOps.Provenance.Tests/StellaOps.Provenance.Tests.csproj b/src/__Libraries/__Tests/StellaOps.Provenance.Tests/StellaOps.Provenance.Tests.csproj new file mode 100644 index 000000000..c5383c718 --- /dev/null +++ b/src/__Libraries/__Tests/StellaOps.Provenance.Tests/StellaOps.Provenance.Tests.csproj @@ -0,0 +1,14 @@ + + + net10.0 + enable + enable + false + true + + + + + + + diff --git a/src/__Libraries/__Tests/StellaOps.Replay.Tests/StellaOps.Replay.Tests.csproj b/src/__Libraries/__Tests/StellaOps.Replay.Tests/StellaOps.Replay.Tests.csproj index bed310fea..06c410c8d 100644 --- a/src/__Libraries/__Tests/StellaOps.Replay.Tests/StellaOps.Replay.Tests.csproj +++ b/src/__Libraries/__Tests/StellaOps.Replay.Tests/StellaOps.Replay.Tests.csproj @@ -7,7 +7,7 @@ - + all diff --git a/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/MessageOrderingTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/MessageOrderingTests.cs index f1e78cb7c..e3c721303 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/MessageOrderingTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/MessageOrderingTests.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Text; using System.Text.Json; using StellaOps.Router.Common.Enums; @@ -354,7 +354,6 @@ public sealed class MessageOrderingTests : IAsyncLifetime, IDisposable for (int run = 0; run < 3; run++) { using var channel = new InMemoryChannel($"determinism-{run}", bufferSize: 100); -using StellaOps.TestKit; var received = new List(); // Same sequence each run diff --git a/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/ServiceRegistrationIntegrationTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/ServiceRegistrationIntegrationTests.cs index 404332dbd..77afe2e08 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/ServiceRegistrationIntegrationTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Integration.Tests/ServiceRegistrationIntegrationTests.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using StellaOps.Microservice; using StellaOps.Router.Common.Abstractions; using StellaOps.Router.Integration.Tests.Fixtures; @@ -147,7 +147,6 @@ public sealed class ServiceRegistrationIntegrationTests using var scope1 = _fixture.Services.CreateScope(); using var scope2 = _fixture.Services.CreateScope(); -using StellaOps.TestKit; var echo1 = scope1.ServiceProvider.GetService(); var echo2 = scope2.ServiceProvider.GetService(); diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/BackpressureTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/BackpressureTests.cs index affc20e98..dbf28ae58 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/BackpressureTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/BackpressureTests.cs @@ -1,4 +1,4 @@ -using System.Threading.Channels; +using System.Threading.Channels; using StellaOps.Router.Common.Enums; using StellaOps.Router.Common.Models; @@ -7,7 +7,7 @@ using StellaOps.TestKit; namespace StellaOps.Router.Transport.InMemory.Tests; /// -/// Backpressure tests: consumer slow → producer backpressure applied (not dropped). +/// Backpressure tests: consumer slow → producer backpressure applied (not dropped). /// Tests that the transport applies backpressure correctly when consumers can't keep up. /// public sealed class BackpressureTests @@ -424,7 +424,6 @@ public sealed class BackpressureTests // Arrange using var channel = new InMemoryChannel("bp-precancelled"); using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; await cts.CancelAsync(); // Act & Assert diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs index 996c4ec66..f47baecc7 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs @@ -1,4 +1,4 @@ -using System.Threading.Channels; +using System.Threading.Channels; using StellaOps.Router.Common.Enums; using StellaOps.Router.Common.Models; @@ -290,7 +290,6 @@ public sealed class InMemoryChannelTests // Arrange using var channel = new InMemoryChannel("conn-123"); -using StellaOps.TestKit; // Start reader task var readerTask = Task.Run(async () => { diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryTransportComplianceTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryTransportComplianceTests.cs index eadd68282..eac3a52af 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryTransportComplianceTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryTransportComplianceTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using StellaOps.Router.Common.Enums; using StellaOps.Router.Common.Frames; using StellaOps.Router.Common.Models; @@ -614,7 +614,6 @@ public sealed class InMemoryTransportComplianceTests // Arrange using var channel = new InMemoryChannel($"conn-det-{run}"); -using StellaOps.TestKit; var request = new RequestFrame { RequestId = "deterministic-req", diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/ConnectionFailureTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/ConnectionFailureTests.cs index ee5f504dc..fbc2179c3 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/ConnectionFailureTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/ConnectionFailureTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Sockets; using System.Threading.Channels; using FluentAssertions; @@ -17,7 +17,7 @@ using StellaOps.TestKit; namespace StellaOps.Router.Transport.Tcp.Tests; /// -/// Connection failure tests: transport disconnects → automatic reconnection with backoff. +/// Connection failure tests: transport disconnects → automatic reconnection with backoff. /// Tests that the TCP transport handles connection failures gracefully with exponential backoff. /// public sealed class ConnectionFailureTests : IDisposable @@ -587,7 +587,6 @@ public sealed class InMemoryConnectionFailureTests public async Task InMemoryChannel_CompletedWithError_PropagatesError() { using var channel = new InMemoryChannel("error-complete"); -using StellaOps.TestKit; var expectedException = new InvalidOperationException("Simulated failure"); // Complete with error diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/FrameFuzzTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/FrameFuzzTests.cs index 33f3de7fd..35b5bc9e8 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/FrameFuzzTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/FrameFuzzTests.cs @@ -1,4 +1,4 @@ -using System.Buffers.Binary; +using System.Buffers.Binary; using System.Text; using StellaOps.Router.Common.Enums; using StellaOps.Router.Common.Models; @@ -8,7 +8,7 @@ using StellaOps.TestKit; namespace StellaOps.Router.Transport.Tcp.Tests; /// -/// Fuzz tests for invalid message formats: malformed frames → graceful error handling. +/// Fuzz tests for invalid message formats: malformed frames → graceful error handling. /// Tests protocol resilience against corrupted, truncated, and invalid data. /// public sealed class FrameFuzzTests @@ -515,7 +515,6 @@ public sealed class FrameFuzzTests { // Arrange - Payload with null bytes using var stream = new MemoryStream(); -using StellaOps.TestKit; var payloadWithNulls = new byte[] { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00 }; var frame = new Frame diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportComplianceTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportComplianceTests.cs index 891b21b2e..105e093d0 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportComplianceTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportComplianceTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using StellaOps.Router.Common.Enums; using StellaOps.Router.Common.Frames; using StellaOps.Router.Common.Models; @@ -286,7 +286,7 @@ public sealed class TcpTransportComplianceTests "simple-id", "guid-" + Guid.NewGuid().ToString("N"), "with-dashes-123-456", - "unicode-日本語" + "unicode-日本語" }; foreach (var correlationId in correlationIds) @@ -534,7 +534,6 @@ public sealed class TcpTransportComplianceTests // Arrange using var stream = new MemoryStream(); using var cts = new CancellationTokenSource(); -using StellaOps.TestKit; await cts.CancelAsync(); var frame = new Frame diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportTests.cs index 2108c0cf4..b6991f195 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tcp.Tests/TcpTransportTests.cs @@ -1,4 +1,4 @@ -using System.Buffers.Binary; +using System.Buffers.Binary; using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -777,7 +777,6 @@ public class TcpTransportClientTests // Arrange await using var client = CreateClient(); -using StellaOps.TestKit; // Act var action = () => client.CancelAllInflight("test shutdown"); diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportComplianceTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportComplianceTests.cs index ee1c35d24..db7565b47 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportComplianceTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportComplianceTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Security; using System.Security.Authentication; using System.Security.Cryptography; @@ -474,7 +474,6 @@ public sealed class TlsTransportComplianceTests private static X509Certificate2 CreateTestCertificate(string subject) { using var rsa = RSA.Create(2048); -using StellaOps.TestKit; var request = new CertificateRequest( $"CN={subject}", rsa, diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportTests.cs index 161e742a5..a52ae9a30 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Tls.Tests/TlsTransportTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Security.Authentication; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; @@ -689,7 +689,6 @@ public class TlsIntegrationTests private static X509Certificate2 CreateSelfSignedServerCertificate(string hostname) { using var rsa = RSA.Create(2048); -using StellaOps.TestKit; var request = new CertificateRequest( $"CN={hostname}", rsa, diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportClientTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportClientTests.cs index f27e41092..87238bbba 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportClientTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportClientTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.Router.Common.Enums; @@ -219,7 +219,6 @@ public sealed class UdpTransportClientTests }); await using var client = new UdpTransportClient(options, NullLogger.Instance); -using StellaOps.TestKit; Guid? receivedCorrelationId = null; // Act diff --git a/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportServerTests.cs b/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportServerTests.cs index 8b28fc1b3..045b22bb6 100644 --- a/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportServerTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportServerTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -268,7 +268,6 @@ public sealed class UdpTransportServerTests var options = Options.Create(new UdpTransportOptions { Port = 0 }); await using var server = new UdpTransportServer(options, NullLogger.Instance); -using StellaOps.TestKit; Frame? receivedFrame = null; server.OnFrame += (id, frame) => receivedFrame = frame; diff --git a/src/__Libraries/__Tests/StellaOps.Signals.Tests/CallgraphIngestionTests.cs b/src/__Libraries/__Tests/StellaOps.Signals.Tests/CallgraphIngestionTests.cs index 573654a46..f2a1c3d2c 100644 --- a/src/__Libraries/__Tests/StellaOps.Signals.Tests/CallgraphIngestionTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Signals.Tests/CallgraphIngestionTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Net; @@ -135,7 +135,6 @@ public class CallgraphIngestionTests : IClassFixture Assert.Equal(HttpStatusCode.Accepted, secondResponse.StatusCode); using var scope = factory.Services.CreateScope(); -using StellaOps.TestKit; var repo = scope.ServiceProvider.GetRequiredService(); var doc = await repo.GetByIdAsync((await secondResponse.Content.ReadFromJsonAsync())!.CallgraphId, CancellationToken.None); diff --git a/src/__Libraries/__Tests/StellaOps.Signals.Tests/SignalsApiTests.cs b/src/__Libraries/__Tests/StellaOps.Signals.Tests/SignalsApiTests.cs index 1259be96b..211b94352 100644 --- a/src/__Libraries/__Tests/StellaOps.Signals.Tests/SignalsApiTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Signals.Tests/SignalsApiTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text.Json; using System.Threading.Tasks; @@ -24,7 +24,6 @@ public class SignalsApiTests : IClassFixture public async Task Callgraph_Ingest_Response_Includes_Extended_Fields() { using var client = factory.CreateClient(); -using StellaOps.TestKit; client.DefaultRequestHeaders.Add("X-Scopes", "signals:write signals:read"); var req = CallgraphIngestionTests.CreateRequest("java", component: "api-test", version: "1.2.3"); diff --git a/src/__Libraries/__Tests/StellaOps.Signals.Tests/SyntheticRuntimeProbeTests.cs b/src/__Libraries/__Tests/StellaOps.Signals.Tests/SyntheticRuntimeProbeTests.cs index af682f621..58df7976b 100644 --- a/src/__Libraries/__Tests/StellaOps.Signals.Tests/SyntheticRuntimeProbeTests.cs +++ b/src/__Libraries/__Tests/StellaOps.Signals.Tests/SyntheticRuntimeProbeTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Http.Json; using System.Text.Json; using System.Threading.Tasks; @@ -50,7 +50,6 @@ public class SyntheticRuntimeProbeTests : IClassFixture Assert.Equal(HttpStatusCode.OK, factRes.StatusCode); var factJson = await factRes.Content.ReadAsStringAsync(); using var doc = JsonDocument.Parse(factJson); -using StellaOps.TestKit; Assert.True(doc.RootElement.TryGetProperty("states", out var states)); Assert.True(states.GetArrayLength() > 0); Assert.True(doc.RootElement.TryGetProperty("runtimeFacts", out var runtimeFacts)); diff --git a/src/__Tests/AirGap/README.md b/src/__Tests/AirGap/README.md deleted file mode 100644 index 3fcb15bab..000000000 --- a/src/__Tests/AirGap/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# AirGap Tests - -## Notes -- Tests now run entirely against in-memory stores (no MongoDB or external services required). -- Keep fixtures deterministic: stable ordering, UTC timestamps, fixed seeds where applicable. -- Sealed-mode and staleness tests rely on local fixture bundles only; no network access is needed. diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/AirGapStartupDiagnosticsHostedServiceTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/AirGapStartupDiagnosticsHostedServiceTests.cs deleted file mode 100644 index 8855d77c4..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/AirGapStartupDiagnosticsHostedServiceTests.cs +++ /dev/null @@ -1,168 +0,0 @@ -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; -using StellaOps.AirGap.Controller.Domain; -using StellaOps.AirGap.Controller.Options; -using StellaOps.AirGap.Controller.Services; -using StellaOps.AirGap.Controller.Stores; -using StellaOps.AirGap.Importer.Validation; -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Controller.Tests; - -public class AirGapStartupDiagnosticsHostedServiceTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Blocks_when_allowlist_missing_for_sealed_state() - { - var now = DateTimeOffset.UtcNow; - var store = new InMemoryAirGapStateStore(); - await store.SetAsync(new AirGapState - { - TenantId = "default", - Sealed = true, - PolicyHash = "policy-x", - TimeAnchor = new TimeAnchor(now, "rough", "rough", "fp", "digest"), - StalenessBudget = new StalenessBudget(60, 120) - }); - - var trustDir = CreateTrustMaterial(); - var options = BuildOptions(trustDir); - options.EgressAllowlist = null; // simulate missing config section - - var service = CreateService(store, options, now); - - var ex = await Assert.ThrowsAsync(() => service.StartAsync(CancellationToken.None)); - Assert.Contains("egress-allowlist-missing", ex.Message); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Passes_when_materials_present_and_anchor_fresh() - { - var now = DateTimeOffset.UtcNow; - var store = new InMemoryAirGapStateStore(); - await store.SetAsync(new AirGapState - { - TenantId = "default", - Sealed = true, - PolicyHash = "policy-ok", - TimeAnchor = new TimeAnchor(now.AddMinutes(-1), "rough", "rough", "fp", "digest"), - StalenessBudget = new StalenessBudget(300, 600) - }); - - var trustDir = CreateTrustMaterial(); - var options = BuildOptions(trustDir, new[] { "127.0.0.1/32" }); - - var service = CreateService(store, options, now); - - await service.StartAsync(CancellationToken.None); // should not throw - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Blocks_when_anchor_is_stale() - { - var now = DateTimeOffset.UtcNow; - var store = new InMemoryAirGapStateStore(); - await store.SetAsync(new AirGapState - { - TenantId = "default", - Sealed = true, - PolicyHash = "policy-stale", - TimeAnchor = new TimeAnchor(now.AddHours(-2), "rough", "rough", "fp", "digest"), - StalenessBudget = new StalenessBudget(60, 90) - }); - - var trustDir = CreateTrustMaterial(); - var options = BuildOptions(trustDir, new[] { "10.0.0.0/24" }); - - var service = CreateService(store, options, now); - - var ex = await Assert.ThrowsAsync(() => service.StartAsync(CancellationToken.None)); - Assert.Contains("time-anchor-stale", ex.Message); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Blocks_when_rotation_pending_without_dual_approval() - { - var now = DateTimeOffset.UtcNow; - var store = new InMemoryAirGapStateStore(); - await store.SetAsync(new AirGapState - { - TenantId = "default", - Sealed = true, - PolicyHash = "policy-rot", - TimeAnchor = new TimeAnchor(now, "rough", "rough", "fp", "digest"), - StalenessBudget = new StalenessBudget(120, 240) - }); - - var trustDir = CreateTrustMaterial(); - var options = BuildOptions(trustDir, new[] { "10.10.0.0/16" }); - options.Rotation.PendingKeys["k-new"] = Convert.ToBase64String(new byte[] { 1, 2, 3 }); - options.Rotation.ActiveKeys["k-old"] = Convert.ToBase64String(new byte[] { 9, 9, 9 }); - options.Rotation.ApproverIds.Add("approver-1"); - - var service = CreateService(store, options, now); - - var ex = await Assert.ThrowsAsync(() => service.StartAsync(CancellationToken.None)); - Assert.Contains("rotation:rotation-dual-approval-required", ex.Message); - } - - private static AirGapStartupOptions BuildOptions(string trustDir, string[]? allowlist = null) - { - return new AirGapStartupOptions - { - TenantId = "default", - EgressAllowlist = allowlist, - Trust = new TrustMaterialOptions - { - RootJsonPath = Path.Combine(trustDir, "root.json"), - SnapshotJsonPath = Path.Combine(trustDir, "snapshot.json"), - TimestampJsonPath = Path.Combine(trustDir, "timestamp.json") - } - }; - } - - private static AirGapStartupDiagnosticsHostedService CreateService(IAirGapStateStore store, AirGapStartupOptions options, DateTimeOffset now) - { - return new AirGapStartupDiagnosticsHostedService( - store, - new StalenessCalculator(), - new FixedTimeProvider(now), - Microsoft.Extensions.Options.Options.Create(options), - NullLogger.Instance, - new AirGapTelemetry(NullLogger.Instance), - new TufMetadataValidator(), - new RootRotationPolicy()); - } - - private static string CreateTrustMaterial() - { - var dir = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), "airgap-trust-" + Guid.NewGuid().ToString("N"))).FullName; - var expires = DateTimeOffset.UtcNow.AddDays(1).ToString("O"); - const string hash = "abc123"; - - File.WriteAllText(Path.Combine(dir, "root.json"), $"{{\"version\":1,\"expiresUtc\":\"{expires}\"}}"); - File.WriteAllText(Path.Combine(dir, "snapshot.json"), $"{{\"version\":1,\"expiresUtc\":\"{expires}\",\"meta\":{{\"snapshot\":{{\"hashes\":{{\"sha256\":\"{hash}\"}}}}}}}}"); - File.WriteAllText(Path.Combine(dir, "timestamp.json"), $"{{\"version\":1,\"expiresUtc\":\"{expires}\",\"snapshot\":{{\"meta\":{{\"hashes\":{{\"sha256\":\"{hash}\"}}}}}}}}"); - - return dir; - } - - private sealed class FixedTimeProvider : TimeProvider - { - private readonly DateTimeOffset _now; - - public FixedTimeProvider(DateTimeOffset now) - { - _now = now; - } - - public override DateTimeOffset GetUtcNow() => _now; - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/AirGapStateServiceTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/AirGapStateServiceTests.cs deleted file mode 100644 index fca812225..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/AirGapStateServiceTests.cs +++ /dev/null @@ -1,127 +0,0 @@ -using StellaOps.AirGap.Controller.Services; -using StellaOps.AirGap.Controller.Stores; -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Controller.Tests; - -public class AirGapStateServiceTests -{ - private readonly AirGapStateService _service; - private readonly InMemoryAirGapStateStore _store = new(); - private readonly StalenessCalculator _calculator = new(); - - public AirGapStateServiceTests() - { - _service = new AirGapStateService(_store, _calculator); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Seal_sets_state_and_computes_staleness() - { - var now = DateTimeOffset.UtcNow; - var anchor = new TimeAnchor(now.AddMinutes(-2), "roughtime", "roughtime", "fp", "digest"); - var budget = new StalenessBudget(60, 120); - - await _service.SealAsync("tenant-a", "policy-1", anchor, budget, now); - var status = await _service.GetStatusAsync("tenant-a", now); - - Assert.True(status.State.Sealed); - Assert.Equal("policy-1", status.State.PolicyHash); - Assert.Equal("tenant-a", status.State.TenantId); - Assert.True(status.Staleness.AgeSeconds > 0); - Assert.True(status.Staleness.IsWarning); - Assert.Equal(120 - status.Staleness.AgeSeconds, status.Staleness.SecondsRemaining); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Unseal_clears_sealed_flag_and_updates_timestamp() - { - var now = DateTimeOffset.UtcNow; - await _service.SealAsync("default", "hash", TimeAnchor.Unknown, StalenessBudget.Default, now); - - var later = now.AddMinutes(1); - await _service.UnsealAsync("default", later); - var status = await _service.GetStatusAsync("default", later); - - Assert.False(status.State.Sealed); - Assert.Equal(later, status.State.LastTransitionAt); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Seal_persists_drift_baseline_seconds() - { - var now = DateTimeOffset.UtcNow; - var anchor = new TimeAnchor(now.AddMinutes(-5), "roughtime", "roughtime", "fp", "digest"); - var budget = StalenessBudget.Default; - - var state = await _service.SealAsync("tenant-drift", "policy-drift", anchor, budget, now); - - Assert.Equal(300, state.DriftBaselineSeconds); // 5 minutes = 300 seconds - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Seal_creates_default_content_budgets_when_not_provided() - { - var now = DateTimeOffset.UtcNow; - var anchor = new TimeAnchor(now.AddMinutes(-1), "roughtime", "roughtime", "fp", "digest"); - var budget = new StalenessBudget(120, 240); - - var state = await _service.SealAsync("tenant-content", "policy-content", anchor, budget, now); - - Assert.Contains("advisories", state.ContentBudgets.Keys); - Assert.Contains("vex", state.ContentBudgets.Keys); - Assert.Contains("policy", state.ContentBudgets.Keys); - Assert.Equal(budget, state.ContentBudgets["advisories"]); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Seal_uses_provided_content_budgets() - { - var now = DateTimeOffset.UtcNow; - var anchor = new TimeAnchor(now.AddMinutes(-1), "roughtime", "roughtime", "fp", "digest"); - var budget = StalenessBudget.Default; - var contentBudgets = new Dictionary - { - { "advisories", new StalenessBudget(30, 60) }, - { "vex", new StalenessBudget(60, 120) } - }; - - var state = await _service.SealAsync("tenant-custom", "policy-custom", anchor, budget, now, contentBudgets); - - Assert.Equal(new StalenessBudget(30, 60), state.ContentBudgets["advisories"]); - Assert.Equal(new StalenessBudget(60, 120), state.ContentBudgets["vex"]); - Assert.Equal(budget, state.ContentBudgets["policy"]); // Falls back to default - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task GetStatus_returns_per_content_staleness() - { - var now = DateTimeOffset.UtcNow; - var anchor = new TimeAnchor(now.AddSeconds(-45), "roughtime", "roughtime", "fp", "digest"); - var budget = StalenessBudget.Default; - var contentBudgets = new Dictionary - { - { "advisories", new StalenessBudget(30, 60) }, - { "vex", new StalenessBudget(60, 120) }, - { "policy", new StalenessBudget(100, 200) } - }; - - await _service.SealAsync("tenant-content-status", "policy-content-status", anchor, budget, now, contentBudgets); - var status = await _service.GetStatusAsync("tenant-content-status", now); - - Assert.NotEmpty(status.ContentStaleness); - Assert.True(status.ContentStaleness["advisories"].IsWarning); // 45s >= 30s warning - Assert.False(status.ContentStaleness["advisories"].IsBreach); // 45s < 60s breach - Assert.False(status.ContentStaleness["vex"].IsWarning); // 45s < 60s warning - Assert.False(status.ContentStaleness["policy"].IsWarning); // 45s < 100s warning - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/InMemoryAirGapStateStoreTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/InMemoryAirGapStateStoreTests.cs deleted file mode 100644 index 2bacb5241..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/InMemoryAirGapStateStoreTests.cs +++ /dev/null @@ -1,151 +0,0 @@ -using StellaOps.AirGap.Controller.Domain; -using StellaOps.AirGap.Controller.Stores; -using StellaOps.AirGap.Time.Models; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Controller.Tests; - -public class InMemoryAirGapStateStoreTests -{ - private readonly InMemoryAirGapStateStore _store = new(); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Upsert_and_read_state_by_tenant() - { - var state = new AirGapState - { - TenantId = "tenant-x", - Sealed = true, - PolicyHash = "hash-1", - TimeAnchor = new TimeAnchor(DateTimeOffset.UtcNow, "roughtime", "roughtime", "fp", "digest"), - StalenessBudget = new StalenessBudget(10, 20), - LastTransitionAt = DateTimeOffset.UtcNow - }; - - await _store.SetAsync(state); - - var stored = await _store.GetAsync("tenant-x"); - Assert.True(stored.Sealed); - Assert.Equal("hash-1", stored.PolicyHash); - Assert.Equal("tenant-x", stored.TenantId); - Assert.Equal(state.TimeAnchor.TokenDigest, stored.TimeAnchor.TokenDigest); - Assert.Equal(10, stored.StalenessBudget.WarningSeconds); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Enforces_singleton_per_tenant() - { - var first = new AirGapState { TenantId = "tenant-y", Sealed = true, PolicyHash = "h1" }; - var second = new AirGapState { TenantId = "tenant-y", Sealed = false, PolicyHash = "h2" }; - - await _store.SetAsync(first); - await _store.SetAsync(second); - - var stored = await _store.GetAsync("tenant-y"); - Assert.Equal("h2", stored.PolicyHash); - Assert.False(stored.Sealed); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Defaults_to_unknown_when_missing() - { - var stored = await _store.GetAsync("absent"); - Assert.False(stored.Sealed); - Assert.Equal("absent", stored.TenantId); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Parallel_upserts_keep_single_document() - { - var tasks = Enumerable.Range(0, 20).Select(i => - { - var state = new AirGapState - { - TenantId = "tenant-parallel", - Sealed = i % 2 == 0, - PolicyHash = $"hash-{i}" - }; - return _store.SetAsync(state); - }); - - await Task.WhenAll(tasks); - - var stored = await _store.GetAsync("tenant-parallel"); - Assert.StartsWith("hash-", stored.PolicyHash); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Multi_tenant_updates_do_not_collide() - { - var tenants = Enumerable.Range(0, 5).Select(i => $"t-{i}").ToArray(); - - var tasks = tenants.Select(t => _store.SetAsync(new AirGapState - { - TenantId = t, - Sealed = true, - PolicyHash = $"hash-{t}" - })); - - await Task.WhenAll(tasks); - - foreach (var t in tenants) - { - var stored = await _store.GetAsync(t); - Assert.Equal($"hash-{t}", stored.PolicyHash); - } - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Staleness_round_trip_matches_budget() - { - var anchor = new TimeAnchor(DateTimeOffset.UtcNow.AddMinutes(-3), "roughtime", "roughtime", "fp", "digest"); - var budget = new StalenessBudget(60, 600); - await _store.SetAsync(new AirGapState - { - TenantId = "tenant-staleness", - Sealed = true, - PolicyHash = "hash-s", - TimeAnchor = anchor, - StalenessBudget = budget, - LastTransitionAt = DateTimeOffset.UtcNow - }); - - var stored = await _store.GetAsync("tenant-staleness"); - Assert.Equal(anchor.TokenDigest, stored.TimeAnchor.TokenDigest); - Assert.Equal(budget.WarningSeconds, stored.StalenessBudget.WarningSeconds); - Assert.Equal(budget.BreachSeconds, stored.StalenessBudget.BreachSeconds); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Multi_tenant_states_preserve_transition_times() - { - var tenants = new[] { "a", "b", "c" }; - var now = DateTimeOffset.UtcNow; - - foreach (var t in tenants) - { - await _store.SetAsync(new AirGapState - { - TenantId = t, - Sealed = true, - PolicyHash = $"ph-{t}", - LastTransitionAt = now - }); - } - - foreach (var t in tenants) - { - var state = await _store.GetAsync(t); - Assert.Equal(now, state.LastTransitionAt); - Assert.Equal($"ph-{t}", state.PolicyHash); - } - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/ReplayVerificationServiceTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/ReplayVerificationServiceTests.cs deleted file mode 100644 index b115ebad1..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/ReplayVerificationServiceTests.cs +++ /dev/null @@ -1,97 +0,0 @@ -using StellaOps.AirGap.Controller.Endpoints.Contracts; -using StellaOps.AirGap.Controller.Services; -using StellaOps.AirGap.Controller.Stores; -using StellaOps.AirGap.Importer.Contracts; -using StellaOps.AirGap.Importer.Validation; -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Controller.Tests; - -public class ReplayVerificationServiceTests -{ - private readonly ReplayVerificationService _service; - private readonly AirGapStateService _stateService; - private readonly StalenessCalculator _staleness = new(); - private readonly InMemoryAirGapStateStore _store = new(); - - public ReplayVerificationServiceTests() - { - _stateService = new AirGapStateService(_store, _staleness); - _service = new ReplayVerificationService(_stateService, new ReplayVerifier()); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Passes_full_recompute_when_hashes_match() - { - var now = DateTimeOffset.Parse("2025-12-02T01:00:00Z"); - await _stateService.SealAsync("tenant-a", "policy-x", TimeAnchor.Unknown, StalenessBudget.Default, now); - - var request = new VerifyRequest - { - Depth = ReplayDepth.FullRecompute, - ManifestSha256 = new string('a', 64), - BundleSha256 = new string('b', 64), - ComputedManifestSha256 = new string('a', 64), - ComputedBundleSha256 = new string('b', 64), - ManifestCreatedAt = now.AddHours(-2), - StalenessWindowHours = 24, - BundlePolicyHash = "policy-x" - }; - - var result = await _service.VerifyAsync("tenant-a", request, now); - - Assert.True(result.IsValid); - Assert.Equal("full-recompute-passed", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Detects_stale_manifest() - { - var now = DateTimeOffset.UtcNow; - var request = new VerifyRequest - { - Depth = ReplayDepth.HashOnly, - ManifestSha256 = new string('a', 64), - BundleSha256 = new string('b', 64), - ComputedManifestSha256 = new string('a', 64), - ComputedBundleSha256 = new string('b', 64), - ManifestCreatedAt = now.AddHours(-30), - StalenessWindowHours = 12 - }; - - var result = await _service.VerifyAsync("default", request, now); - - Assert.False(result.IsValid); - Assert.Equal("manifest-stale", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task Policy_freeze_requires_matching_policy() - { - var now = DateTimeOffset.UtcNow; - await _stateService.SealAsync("tenant-b", "sealed-policy", TimeAnchor.Unknown, StalenessBudget.Default, now); - - var request = new VerifyRequest - { - Depth = ReplayDepth.PolicyFreeze, - ManifestSha256 = new string('a', 64), - BundleSha256 = new string('b', 64), - ComputedManifestSha256 = new string('a', 64), - ComputedBundleSha256 = new string('b', 64), - ManifestCreatedAt = now, - StalenessWindowHours = 48, - BundlePolicyHash = "bundle-policy" - }; - - var result = await _service.VerifyAsync("tenant-b", request, now); - - Assert.False(result.IsValid); - Assert.Equal("policy-hash-drift", result.Reason); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/StellaOps.AirGap.Controller.Tests.csproj b/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/StellaOps.AirGap.Controller.Tests.csproj deleted file mode 100644 index b627ecf56..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Controller.Tests/StellaOps.AirGap.Controller.Tests.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - false - enable - enable - - - - - - - - - - - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/BundleImportPlannerTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/BundleImportPlannerTests.cs deleted file mode 100644 index 3e4205cf6..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/BundleImportPlannerTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using StellaOps.AirGap.Importer.Contracts; -using StellaOps.AirGap.Importer.Planning; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public class BundleImportPlannerTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void ReturnsFailureWhenBundlePathMissing() - { - var planner = new BundleImportPlanner(); - var result = planner.CreatePlan(string.Empty, TrustRootConfig.Empty("/tmp")); - - Assert.False(result.InitialState.IsValid); - Assert.Equal("bundle-path-required", result.InitialState.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void ReturnsFailureWhenTrustRootsMissing() - { - var planner = new BundleImportPlanner(); - var result = planner.CreatePlan("bundle.tar", TrustRootConfig.Empty("/tmp")); - - Assert.False(result.InitialState.IsValid); - Assert.Equal("trust-roots-required", result.InitialState.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void ReturnsDefaultPlanWhenInputsProvided() - { - var planner = new BundleImportPlanner(); - var trust = new TrustRootConfig("/tmp/trust.json", new[] { "abc" }, new[] { "ed25519" }, null, null, new Dictionary()); - - var result = planner.CreatePlan("bundle.tar", trust); - - Assert.True(result.InitialState.IsValid); - Assert.Contains("verify-dsse-signature", result.Steps); - Assert.Equal("bundle.tar", result.Inputs["bundlePath"]); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/DsseVerifierTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/DsseVerifierTests.cs deleted file mode 100644 index 3a4e3fb01..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/DsseVerifierTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System.Security.Cryptography; -using StellaOps.AirGap.Importer.Contracts; -using StellaOps.AirGap.Importer.Validation; - - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public class DsseVerifierTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FailsWhenUntrustedKey() - { - var verifier = new DsseVerifier(); - var envelope = new DsseEnvelope("text/plain", Convert.ToBase64String("hi"u8), new[] { new DsseSignature("k1", "sig") }); - var trust = TrustRootConfig.Empty("/tmp"); - - var result = verifier.Verify(envelope, trust); - - Assert.False(result.IsValid); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void VerifiesRsaPssSignature() - { - using var rsa = RSA.Create(2048); -using StellaOps.TestKit; - var pub = rsa.ExportSubjectPublicKeyInfo(); - var payload = "hello-world"; - var payloadType = "application/vnd.stella.bundle"; - var pae = BuildPae(payloadType, payload); - var sig = rsa.SignData(pae, HashAlgorithmName.SHA256, RSASignaturePadding.Pss); - - var envelope = new DsseEnvelope(payloadType, Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(payload)), new[] - { - new DsseSignature("k1", Convert.ToBase64String(sig)) - }); - - var trust = new TrustRootConfig( - "/tmp/root.json", - new[] { Fingerprint(pub) }, - new[] { "rsassa-pss-sha256" }, - null, - null, - new Dictionary { ["k1"] = pub }); - - var result = new DsseVerifier().Verify(envelope, trust); - - Assert.True(result.IsValid); - Assert.Equal("dsse-signature-verified", result.Reason); - } - - private static byte[] BuildPae(string payloadType, string payload) - { - var parts = new[] { "DSSEv1", payloadType, payload }; - var paeBuilder = new System.Text.StringBuilder(); - paeBuilder.Append("PAE:"); - paeBuilder.Append(parts.Length); - foreach (var part in parts) - { - paeBuilder.Append(' '); - paeBuilder.Append(part.Length); - paeBuilder.Append(' '); - paeBuilder.Append(part); - } - - return System.Text.Encoding.UTF8.GetBytes(paeBuilder.ToString()); - } - - private static string Fingerprint(byte[] pub) - { - return Convert.ToHexString(SHA256.HashData(pub)).ToLowerInvariant(); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/GlobalUsings.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/GlobalUsings.cs deleted file mode 100644 index c802f4480..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/GlobalUsings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/ImportValidatorTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/ImportValidatorTests.cs deleted file mode 100644 index 99c04b481..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/ImportValidatorTests.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System.Security.Cryptography; -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.AirGap.Importer.Contracts; -using StellaOps.AirGap.Importer.Quarantine; -using StellaOps.AirGap.Importer.Validation; -using StellaOps.AirGap.Importer.Versioning; - - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public sealed class ImportValidatorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ValidateAsync_WhenTufInvalid_ShouldFailAndQuarantine() - { - var quarantine = new CapturingQuarantineService(); - var monotonicity = new CapturingMonotonicityChecker(); - - var validator = new ImportValidator( - new DsseVerifier(), - new TufMetadataValidator(), - new MerkleRootCalculator(), - new RootRotationPolicy(), - monotonicity, - quarantine, - NullLogger.Instance); - - var tempRoot = Path.Combine(Path.GetTempPath(), "stellaops-airgap-tests", Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(tempRoot); - var bundlePath = Path.Combine(tempRoot, "bundle.tar.zst"); - await File.WriteAllTextAsync(bundlePath, "bundle-bytes"); - - try - { - var request = BuildRequest(bundlePath, rootJson: "{}", snapshotJson: "{}", timestampJson: "{}"); - var result = await validator.ValidateAsync(request); - - result.IsValid.Should().BeFalse(); - result.Reason.Should().StartWith("tuf:"); - - quarantine.Requests.Should().HaveCount(1); - quarantine.Requests[0].TenantId.Should().Be("tenant-a"); - } - finally - { - try - { - Directory.Delete(tempRoot, recursive: true); - } - catch - { - // best-effort cleanup - } - } - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ValidateAsync_WhenAllChecksPass_ShouldSucceedAndRecordActivation() - { - var root = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\"}"; - var snapshot = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\",\"meta\":{\"snapshot\":{\"hashes\":{\"sha256\":\"abc\"}}}}"; - var timestamp = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\",\"snapshot\":{\"meta\":{\"hashes\":{\"sha256\":\"abc\"}}}}"; - - using var rsa = RSA.Create(2048); -using StellaOps.TestKit; - var pub = rsa.ExportSubjectPublicKeyInfo(); - - var payload = "bundle-body"; - var payloadType = "application/vnd.stella.bundle"; - var pae = BuildPae(payloadType, payload); - var sig = rsa.SignData(pae, HashAlgorithmName.SHA256, RSASignaturePadding.Pss); - - var envelope = new DsseEnvelope(payloadType, Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(payload)), new[] - { - new DsseSignature("k1", Convert.ToBase64String(sig)) - }); - - var trustStore = new TrustStore(); - trustStore.LoadActive(new Dictionary { ["k1"] = pub }); - trustStore.StagePending(new Dictionary { ["k2"] = pub }); - - var quarantine = new CapturingQuarantineService(); - var monotonicity = new CapturingMonotonicityChecker(); - - var validator = new ImportValidator( - new DsseVerifier(), - new TufMetadataValidator(), - new MerkleRootCalculator(), - new RootRotationPolicy(), - monotonicity, - quarantine, - NullLogger.Instance); - - var tempRoot = Path.Combine(Path.GetTempPath(), "stellaops-airgap-tests", Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(tempRoot); - var bundlePath = Path.Combine(tempRoot, "bundle.tar.zst"); - await File.WriteAllTextAsync(bundlePath, "bundle-bytes"); - - try - { - var request = new ImportValidationRequest( - TenantId: "tenant-a", - BundleType: "offline-kit", - BundleDigest: "sha256:bundle", - BundlePath: bundlePath, - ManifestJson: "{\"version\":\"1.0.0\"}", - ManifestVersion: "1.0.0", - ManifestCreatedAt: DateTimeOffset.Parse("2025-12-15T00:00:00Z"), - ForceActivate: false, - ForceActivateReason: null, - Envelope: envelope, - TrustRoots: new TrustRootConfig("/tmp/root.json", new[] { Fingerprint(pub) }, new[] { "rsassa-pss-sha256" }, null, null, new Dictionary { ["k1"] = pub }), - RootJson: root, - SnapshotJson: snapshot, - TimestampJson: timestamp, - PayloadEntries: new List { new("a.txt", new MemoryStream("data"u8.ToArray())) }, - TrustStore: trustStore, - ApproverIds: new[] { "approver-1", "approver-2" }); - - var result = await validator.ValidateAsync(request); - - result.IsValid.Should().BeTrue(); - result.Reason.Should().Be("import-validated"); - - monotonicity.RecordedActivations.Should().HaveCount(1); - monotonicity.RecordedActivations[0].BundleDigest.Should().Be("sha256:bundle"); - monotonicity.RecordedActivations[0].Version.SemVer.Should().Be("1.0.0"); - - quarantine.Requests.Should().BeEmpty(); - } - finally - { - try - { - Directory.Delete(tempRoot, recursive: true); - } - catch - { - // best-effort cleanup - } - } - } - - private static byte[] BuildPae(string payloadType, string payload) - { - var parts = new[] { "DSSEv1", payloadType, payload }; - var paeBuilder = new System.Text.StringBuilder(); - paeBuilder.Append("PAE:"); - paeBuilder.Append(parts.Length); - foreach (var part in parts) - { - paeBuilder.Append(' '); - paeBuilder.Append(part.Length); - paeBuilder.Append(' '); - paeBuilder.Append(part); - } - - return System.Text.Encoding.UTF8.GetBytes(paeBuilder.ToString()); - } - - private static string Fingerprint(byte[] pub) => Convert.ToHexString(SHA256.HashData(pub)).ToLowerInvariant(); - - private static ImportValidationRequest BuildRequest(string bundlePath, string rootJson, string snapshotJson, string timestampJson) - { - var envelope = new DsseEnvelope("text/plain", Convert.ToBase64String("hi"u8), Array.Empty()); - var trustRoot = TrustRootConfig.Empty("/tmp"); - var trustStore = new TrustStore(); - return new ImportValidationRequest( - TenantId: "tenant-a", - BundleType: "offline-kit", - BundleDigest: "sha256:bundle", - BundlePath: bundlePath, - ManifestJson: null, - ManifestVersion: "1.0.0", - ManifestCreatedAt: DateTimeOffset.Parse("2025-12-15T00:00:00Z"), - ForceActivate: false, - ForceActivateReason: null, - Envelope: envelope, - TrustRoots: trustRoot, - RootJson: rootJson, - SnapshotJson: snapshotJson, - TimestampJson: timestampJson, - PayloadEntries: Array.Empty(), - TrustStore: trustStore, - ApproverIds: Array.Empty()); - } - - private sealed class CapturingMonotonicityChecker : IVersionMonotonicityChecker - { - public List<(BundleVersion Version, string BundleDigest)> RecordedActivations { get; } = new(); - - public Task CheckAsync(string tenantId, string bundleType, BundleVersion incomingVersion, CancellationToken cancellationToken = default) - { - return Task.FromResult(new MonotonicityCheckResult( - IsMonotonic: true, - CurrentVersion: null, - CurrentBundleDigest: null, - CurrentActivatedAt: null, - ReasonCode: "FIRST_ACTIVATION")); - } - - public Task RecordActivationAsync( - string tenantId, - string bundleType, - BundleVersion version, - string bundleDigest, - bool wasForceActivated = false, - string? forceActivateReason = null, - CancellationToken cancellationToken = default) - { - RecordedActivations.Add((version, bundleDigest)); - return Task.CompletedTask; - } - } - - private sealed class CapturingQuarantineService : IQuarantineService - { - public List Requests { get; } = new(); - - public Task QuarantineAsync(QuarantineRequest request, CancellationToken cancellationToken = default) - { - Requests.Add(request); - return Task.FromResult(new QuarantineResult( - Success: true, - QuarantineId: "test", - QuarantinePath: "(memory)", - QuarantinedAt: DateTimeOffset.UnixEpoch)); - } - - public Task> ListAsync(string tenantId, QuarantineListOptions? options = null, CancellationToken cancellationToken = default) => - Task.FromResult>(Array.Empty()); - - public Task RemoveAsync(string tenantId, string quarantineId, string removalReason, CancellationToken cancellationToken = default) => - Task.FromResult(false); - - public Task CleanupExpiredAsync(TimeSpan retentionPeriod, CancellationToken cancellationToken = default) => - Task.FromResult(0); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/InMemoryBundleRepositoriesTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/InMemoryBundleRepositoriesTests.cs deleted file mode 100644 index e1ed41421..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/InMemoryBundleRepositoriesTests.cs +++ /dev/null @@ -1,68 +0,0 @@ -using StellaOps.AirGap.Importer.Models; -using StellaOps.AirGap.Importer.Repositories; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public class InMemoryBundleRepositoriesTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task CatalogUpsertOverwritesPerTenant() - { - var repo = new InMemoryBundleCatalogRepository(); - var entry1 = new BundleCatalogEntry("t1", "b1", "d1", DateTimeOffset.UnixEpoch, new[] { "a" }); - var entry2 = new BundleCatalogEntry("t1", "b1", "d2", DateTimeOffset.UnixEpoch.AddMinutes(1), new[] { "b" }); - - await repo.UpsertAsync(entry1, default); - await repo.UpsertAsync(entry2, default); - - var list = await repo.ListAsync("t1", default); - Assert.Single(list); - Assert.Equal("d2", list[0].Digest); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task CatalogIsTenantIsolated() - { - var repo = new InMemoryBundleCatalogRepository(); - await repo.UpsertAsync(new BundleCatalogEntry("t1", "b1", "d1", DateTimeOffset.UnixEpoch, Array.Empty()), default); - await repo.UpsertAsync(new BundleCatalogEntry("t2", "b1", "d2", DateTimeOffset.UnixEpoch, Array.Empty()), default); - - var t1 = await repo.ListAsync("t1", default); - Assert.Single(t1); - Assert.Equal("d1", t1[0].Digest); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ItemsOrderedByPath() - { - var repo = new InMemoryBundleItemRepository(); - await repo.UpsertManyAsync(new[] - { - new BundleItem("t1", "b1", "b.txt", "d2", 10), - new BundleItem("t1", "b1", "a.txt", "d1", 5) - }, default); - - var list = await repo.ListByBundleAsync("t1", "b1", default); - Assert.Equal(new[] { "a.txt", "b.txt" }, list.Select(i => i.Path).ToArray()); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ItemsTenantIsolated() - { - var repo = new InMemoryBundleItemRepository(); - await repo.UpsertManyAsync(new[] - { - new BundleItem("t1", "b1", "a.txt", "d1", 1), - new BundleItem("t2", "b1", "a.txt", "d2", 1) - }, default); - - var list = await repo.ListByBundleAsync("t1", "b1", default); - Assert.Single(list); - Assert.Equal("d1", list[0].Digest); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/MerkleRootCalculatorTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/MerkleRootCalculatorTests.cs deleted file mode 100644 index 0f8a5b53b..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/MerkleRootCalculatorTests.cs +++ /dev/null @@ -1,31 +0,0 @@ -using StellaOps.AirGap.Importer.Validation; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public class MerkleRootCalculatorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EmptySetProducesEmptyRoot() - { - var calc = new MerkleRootCalculator(); - var root = calc.ComputeRoot(Array.Empty()); - Assert.Equal(string.Empty, root); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void DeterministicAcrossOrder() - { - var calc = new MerkleRootCalculator(); - var a = new NamedStream("b.txt", new MemoryStream("two"u8.ToArray())); - var b = new NamedStream("a.txt", new MemoryStream("one"u8.ToArray())); - - var root1 = calc.ComputeRoot(new[] { a, b }); - var root2 = calc.ComputeRoot(new[] { b, a }); - - Assert.Equal(root1, root2); - Assert.NotEqual(string.Empty, root1); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/OfflineKitMetricsTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/OfflineKitMetricsTests.cs deleted file mode 100644 index dc3fbe5f4..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/OfflineKitMetricsTests.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System.Diagnostics.Metrics; -using StellaOps.AirGap.Importer.Telemetry; - - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public sealed class OfflineKitMetricsTests : IDisposable -{ - private readonly MeterListener _listener; - private readonly List _measurements = []; - - public OfflineKitMetricsTests() - { - _listener = new MeterListener(); - _listener.InstrumentPublished = (instrument, listener) => - { - if (instrument.Meter.Name == OfflineKitMetrics.MeterName) - { - listener.EnableMeasurementEvents(instrument); - } - }; - - _listener.SetMeasurementEventCallback((instrument, measurement, tags, state) => - { - _measurements.Add(new RecordedMeasurement(instrument.Name, measurement, tags.ToArray())); - }); - _listener.SetMeasurementEventCallback((instrument, measurement, tags, state) => - { - _measurements.Add(new RecordedMeasurement(instrument.Name, measurement, tags.ToArray())); - }); - _listener.Start(); - } - - public void Dispose() => _listener.Dispose(); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RecordImport_EmitsCounterWithLabels() - { - using var metrics = new OfflineKitMetrics(); - - metrics.RecordImport(status: "success", tenantId: "tenant-a"); - - Assert.Contains(_measurements, m => - m.Name == "offlinekit_import_total" && - m.Value is long v && - v == 1 && - m.HasTag(OfflineKitMetrics.TagNames.Status, "success") && - m.HasTag(OfflineKitMetrics.TagNames.TenantId, "tenant-a")); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RecordAttestationVerifyLatency_EmitsHistogramWithLabels() - { - using var metrics = new OfflineKitMetrics(); - - metrics.RecordAttestationVerifyLatency(attestationType: "dsse", seconds: 1.234, success: true); - - Assert.Contains(_measurements, m => - m.Name == "offlinekit_attestation_verify_latency_seconds" && - m.Value is double v && - Math.Abs(v - 1.234) < 0.000_001 && - m.HasTag(OfflineKitMetrics.TagNames.AttestationType, "dsse") && - m.HasTag(OfflineKitMetrics.TagNames.Success, "true")); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RecordRekorSuccess_EmitsCounterWithLabels() - { - using var metrics = new OfflineKitMetrics(); - - metrics.RecordRekorSuccess(mode: "offline"); - - Assert.Contains(_measurements, m => - m.Name == "attestor_rekor_success_total" && - m.Value is long v && - v == 1 && - m.HasTag(OfflineKitMetrics.TagNames.Mode, "offline")); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RecordRekorRetry_EmitsCounterWithLabels() - { - using var metrics = new OfflineKitMetrics(); - - metrics.RecordRekorRetry(reason: "stale_snapshot"); - - Assert.Contains(_measurements, m => - m.Name == "attestor_rekor_retry_total" && - m.Value is long v && - v == 1 && - m.HasTag(OfflineKitMetrics.TagNames.Reason, "stale_snapshot")); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RecordRekorInclusionLatency_EmitsHistogramWithLabels() - { - using var metrics = new OfflineKitMetrics(); - -using StellaOps.TestKit; - metrics.RecordRekorInclusionLatency(seconds: 0.5, success: false); - - Assert.Contains(_measurements, m => - m.Name == "rekor_inclusion_latency" && - m.Value is double v && - Math.Abs(v - 0.5) < 0.000_001 && - m.HasTag(OfflineKitMetrics.TagNames.Success, "false")); - } - - private sealed record RecordedMeasurement(string Name, object Value, IReadOnlyList> Tags) - { - public bool HasTag(string key, string expectedValue) => - Tags.Any(t => t.Key == key && string.Equals(t.Value?.ToString(), expectedValue, StringComparison.Ordinal)); - } -} - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Quarantine/FileSystemQuarantineServiceTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Quarantine/FileSystemQuarantineServiceTests.cs deleted file mode 100644 index dc5e45d04..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Quarantine/FileSystemQuarantineServiceTests.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System.Text.Json; -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; -using StellaOps.AirGap.Importer.Quarantine; - -namespace StellaOps.AirGap.Importer.Tests.Quarantine; - -public sealed class FileSystemQuarantineServiceTests -{ - [Fact] - public async Task QuarantineAsync_ShouldCreateExpectedFiles_AndListAsyncShouldReturnEntry() - { - var root = CreateTempDirectory(); - try - { - var bundlePath = Path.Combine(root, "bundle.tar.zst"); - await File.WriteAllTextAsync(bundlePath, "bundle-bytes"); - - var options = Options.Create(new QuarantineOptions - { - QuarantineRoot = Path.Combine(root, "quarantine"), - RetentionPeriod = TimeSpan.FromDays(30), - MaxQuarantineSizeBytes = 1024 * 1024, - EnableAutomaticCleanup = true - }); - - var svc = new FileSystemQuarantineService( - options, - NullLogger.Instance, - TimeProvider.System); - - var result = await svc.QuarantineAsync(new QuarantineRequest( - TenantId: "tenant-a", - BundlePath: bundlePath, - ManifestJson: "{\"version\":\"1.0.0\"}", - ReasonCode: "dsse:invalid", - ReasonMessage: "dsse:invalid", - VerificationLog: new[] { "tuf:ok", "dsse:invalid" }, - Metadata: new Dictionary { ["k"] = "v" })); - - result.Success.Should().BeTrue(); - Directory.Exists(result.QuarantinePath).Should().BeTrue(); - - File.Exists(Path.Combine(result.QuarantinePath, "bundle.tar.zst")).Should().BeTrue(); - File.Exists(Path.Combine(result.QuarantinePath, "manifest.json")).Should().BeTrue(); - File.Exists(Path.Combine(result.QuarantinePath, "verification.log")).Should().BeTrue(); - File.Exists(Path.Combine(result.QuarantinePath, "failure-reason.txt")).Should().BeTrue(); - File.Exists(Path.Combine(result.QuarantinePath, "quarantine.json")).Should().BeTrue(); - - var listed = await svc.ListAsync("tenant-a"); - listed.Should().ContainSingle(e => e.QuarantineId == result.QuarantineId); - } - finally - { - SafeDeleteDirectory(root); - } - } - - [Fact] - public async Task RemoveAsync_ShouldMoveToRemovedFolder() - { - var root = CreateTempDirectory(); - try - { - var bundlePath = Path.Combine(root, "bundle.tar.zst"); - await File.WriteAllTextAsync(bundlePath, "bundle-bytes"); - - var quarantineRoot = Path.Combine(root, "quarantine"); - var options = Options.Create(new QuarantineOptions { QuarantineRoot = quarantineRoot, MaxQuarantineSizeBytes = 1024 * 1024 }); - var svc = new FileSystemQuarantineService(options, NullLogger.Instance, TimeProvider.System); - - var result = await svc.QuarantineAsync(new QuarantineRequest( - TenantId: "tenant-a", - BundlePath: bundlePath, - ManifestJson: null, - ReasonCode: "tuf:invalid", - ReasonMessage: "tuf:invalid", - VerificationLog: new[] { "tuf:invalid" })); - - var removed = await svc.RemoveAsync("tenant-a", result.QuarantineId, "investigated"); - removed.Should().BeTrue(); - - Directory.Exists(result.QuarantinePath).Should().BeFalse(); - Directory.Exists(Path.Combine(quarantineRoot, "tenant-a", ".removed", result.QuarantineId)).Should().BeTrue(); - } - finally - { - SafeDeleteDirectory(root); - } - } - - [Fact] - public async Task CleanupExpiredAsync_ShouldDeleteOldEntries() - { - var root = CreateTempDirectory(); - try - { - var bundlePath = Path.Combine(root, "bundle.tar.zst"); - await File.WriteAllTextAsync(bundlePath, "bundle-bytes"); - - var quarantineRoot = Path.Combine(root, "quarantine"); - var options = Options.Create(new QuarantineOptions { QuarantineRoot = quarantineRoot, MaxQuarantineSizeBytes = 1024 * 1024 }); - var svc = new FileSystemQuarantineService(options, NullLogger.Instance, TimeProvider.System); - - var result = await svc.QuarantineAsync(new QuarantineRequest( - TenantId: "tenant-a", - BundlePath: bundlePath, - ManifestJson: null, - ReasonCode: "tuf:invalid", - ReasonMessage: "tuf:invalid", - VerificationLog: new[] { "tuf:invalid" })); - - var jsonPath = Path.Combine(result.QuarantinePath, "quarantine.json"); - var json = await File.ReadAllTextAsync(jsonPath); - var jsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web) { WriteIndented = true }; - var entry = JsonSerializer.Deserialize(json, jsonOptions); - entry.Should().NotBeNull(); - - var oldEntry = entry! with { QuarantinedAt = DateTimeOffset.Parse("1900-01-01T00:00:00Z") }; - await File.WriteAllTextAsync(jsonPath, JsonSerializer.Serialize(oldEntry, jsonOptions)); - - var removed = await svc.CleanupExpiredAsync(TimeSpan.FromDays(30)); - removed.Should().BeGreaterThanOrEqualTo(1); - Directory.Exists(result.QuarantinePath).Should().BeFalse(); - } - finally - { - SafeDeleteDirectory(root); - } - } - - private static string CreateTempDirectory() - { - var dir = Path.Combine(Path.GetTempPath(), "stellaops-airgap-tests", Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(dir); - return dir; - } - - private static void SafeDeleteDirectory(string path) - { - try - { - if (Directory.Exists(path)) - { - Directory.Delete(path, recursive: true); - } - } - catch - { - // best-effort cleanup - } - } -} - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/ArtifactIndexTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/ArtifactIndexTests.cs deleted file mode 100644 index bd466198e..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/ArtifactIndexTests.cs +++ /dev/null @@ -1,65 +0,0 @@ -using FluentAssertions; -using StellaOps.AirGap.Importer.Reconciliation; - -namespace StellaOps.AirGap.Importer.Tests.Reconciliation; - -public sealed class ArtifactIndexTests -{ - [Fact] - public void NormalizeDigest_BareHex_AddsPrefixAndLowercases() - { - var hex = new string('A', 64); - ArtifactIndex.NormalizeDigest(hex).Should().Be("sha256:" + new string('a', 64)); - } - - [Fact] - public void NormalizeDigest_WithSha256Prefix_IsCanonical() - { - var hex = new string('B', 64); - ArtifactIndex.NormalizeDigest("sha256:" + hex).Should().Be("sha256:" + new string('b', 64)); - } - - [Fact] - public void NormalizeDigest_WithOtherAlgorithm_Throws() - { - var ex = Assert.Throws(() => ArtifactIndex.NormalizeDigest("sha512:" + new string('a', 64))); - ex.Message.Should().Contain("Only sha256"); - } - - [Fact] - public void AddOrUpdate_MergesEntries_DeduplicatesAndSorts() - { - var digest = new string('c', 64); - - var entryA = ArtifactEntry.Empty(digest) with - { - Sboms = new[] - { - new SbomReference("b", "b.json", SbomFormat.CycloneDx, null), - new SbomReference("a", "a.json", SbomFormat.Spdx, null), - } - }; - - var entryB = ArtifactEntry.Empty("sha256:" + digest.ToUpperInvariant()) with - { - Sboms = new[] - { - new SbomReference("a", "a2.json", SbomFormat.CycloneDx, null), - new SbomReference("c", "c.json", SbomFormat.Spdx, null), - } - }; - - var index = new ArtifactIndex(); - index.AddOrUpdate(entryA); - index.AddOrUpdate(entryB); - - var stored = index.Get("sha256:" + digest); - stored.Should().NotBeNull(); - stored!.Digest.Should().Be("sha256:" + digest); - - stored.Sboms.Select(s => (s.ContentHash, s.FilePath)).Should().Equal( - ("a", "a.json"), - ("b", "b.json"), - ("c", "c.json")); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/CycloneDxParserTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/CycloneDxParserTests.cs deleted file mode 100644 index 2bf002a23..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/CycloneDxParserTests.cs +++ /dev/null @@ -1,136 +0,0 @@ -// ============================================================================= -// CycloneDxParserTests.cs -// Golden-file tests for CycloneDX SBOM parsing -// Part of Task T24: Golden-file tests for determinism -// ============================================================================= - -using FluentAssertions; -using StellaOps.AirGap.Importer.Reconciliation; -using StellaOps.AirGap.Importer.Reconciliation.Parsers; - -namespace StellaOps.AirGap.Importer.Tests.Reconciliation; - -public sealed class CycloneDxParserTests -{ - private static readonly string FixturesPath = Path.Combine( - AppDomain.CurrentDomain.BaseDirectory, - "Reconciliation", "Fixtures"); - - [Fact] - public async Task ParseAsync_ValidCycloneDx_ExtractsAllSubjects() - { - // Arrange - var parser = new CycloneDxParser(); - var filePath = Path.Combine(FixturesPath, "sample.cdx.json"); - - // Skip if fixtures not available - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - result.IsSuccess.Should().BeTrue(); - result.Format.Should().Be(SbomFormat.CycloneDx); - result.SpecVersion.Should().Be("1.6"); - result.SerialNumber.Should().Be("urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79"); - result.GeneratorTool.Should().Contain("syft"); - - // Should have 3 subjects with SHA-256 hashes (primary + 2 components) - result.Subjects.Should().HaveCount(3); - - // Verify subjects are sorted by digest - result.Subjects.Should().BeInAscendingOrder(s => s.Digest, StringComparer.Ordinal); - } - - [Fact] - public async Task ParseAsync_ExtractsPrimarySubject() - { - // Arrange - var parser = new CycloneDxParser(); - var filePath = Path.Combine(FixturesPath, "sample.cdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - result.PrimarySubject.Should().NotBeNull(); - result.PrimarySubject!.Name.Should().Be("test-app"); - result.PrimarySubject.Version.Should().Be("1.0.0"); - result.PrimarySubject.Digest.Should().StartWith("sha256:"); - } - - [Fact] - public async Task ParseAsync_SubjectDigestsAreNormalized() - { - // Arrange - var parser = new CycloneDxParser(); - var filePath = Path.Combine(FixturesPath, "sample.cdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - all digests should be normalized sha256:lowercase format - foreach (var subject in result.Subjects) - { - subject.Digest.Should().StartWith("sha256:"); - subject.Digest[7..].Should().MatchRegex("^[a-f0-9]{64}$"); - } - } - - [Fact] - public void DetectFormat_CycloneDxFile_ReturnsCycloneDx() - { - var parser = new CycloneDxParser(); - parser.DetectFormat("test.cdx.json").Should().Be(SbomFormat.CycloneDx); - parser.DetectFormat("test.bom.json").Should().Be(SbomFormat.CycloneDx); - } - - [Fact] - public void DetectFormat_NonCycloneDxFile_ReturnsUnknown() - { - var parser = new CycloneDxParser(); - parser.DetectFormat("test.spdx.json").Should().Be(SbomFormat.Unknown); - parser.DetectFormat("test.json").Should().Be(SbomFormat.Unknown); - } - - [Fact] - public async Task ParseAsync_Deterministic_SameOutputForSameInput() - { - // Arrange - var parser = new CycloneDxParser(); - var filePath = Path.Combine(FixturesPath, "sample.cdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - parse twice - var result1 = await parser.ParseAsync(filePath); - var result2 = await parser.ParseAsync(filePath); - - // Assert - results should be identical - result1.Subjects.Select(s => s.Digest) - .Should().BeEquivalentTo(result2.Subjects.Select(s => s.Digest)); - - result1.Subjects.Select(s => s.Name) - .Should().BeEquivalentTo(result2.Subjects.Select(s => s.Name)); - - // Order should be the same - result1.Subjects.Select(s => s.Digest).Should().Equal(result2.Subjects.Select(s => s.Digest)); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/DsseAttestationParserTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/DsseAttestationParserTests.cs deleted file mode 100644 index de15d0bcc..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/DsseAttestationParserTests.cs +++ /dev/null @@ -1,141 +0,0 @@ -// ============================================================================= -// DsseAttestationParserTests.cs -// Golden-file tests for DSSE attestation parsing -// Part of Task T24: Golden-file tests for determinism -// ============================================================================= - -using FluentAssertions; -using StellaOps.AirGap.Importer.Reconciliation.Parsers; - -namespace StellaOps.AirGap.Importer.Tests.Reconciliation; - -public sealed class DsseAttestationParserTests -{ - private static readonly string FixturesPath = Path.Combine( - AppDomain.CurrentDomain.BaseDirectory, - "Reconciliation", "Fixtures"); - - [Fact] - public async Task ParseAsync_ValidDsse_ExtractsEnvelope() - { - // Arrange - var parser = new DsseAttestationParser(); - var filePath = Path.Combine(FixturesPath, "sample.intoto.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - result.IsSuccess.Should().BeTrue(); - result.Envelope.Should().NotBeNull(); - result.Envelope!.PayloadType.Should().Be("application/vnd.in-toto+json"); - result.Envelope.Signatures.Should().HaveCount(1); - result.Envelope.Signatures[0].KeyId.Should().Be("test-key-id"); - } - - [Fact] - public async Task ParseAsync_ValidDsse_ExtractsStatement() - { - // Arrange - var parser = new DsseAttestationParser(); - var filePath = Path.Combine(FixturesPath, "sample.intoto.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - result.Statement.Should().NotBeNull(); - result.Statement!.Type.Should().Be("https://in-toto.io/Statement/v1"); - result.Statement.PredicateType.Should().Be("https://slsa.dev/provenance/v1"); - result.Statement.Subjects.Should().HaveCount(1); - } - - [Fact] - public async Task ParseAsync_ExtractsSubjectDigests() - { - // Arrange - var parser = new DsseAttestationParser(); - var filePath = Path.Combine(FixturesPath, "sample.intoto.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - var subject = result.Statement!.Subjects[0]; - subject.Name.Should().Be("test-app"); - subject.GetSha256Digest().Should().Be("sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); - } - - [Fact] - public void IsAttestation_DsseFile_ReturnsTrue() - { - var parser = new DsseAttestationParser(); - parser.IsAttestation("test.intoto.json").Should().BeTrue(); - parser.IsAttestation("test.intoto.jsonl").Should().BeTrue(); - parser.IsAttestation("test.dsig").Should().BeTrue(); - parser.IsAttestation("test.dsse").Should().BeTrue(); - } - - [Fact] - public void IsAttestation_NonDsseFile_ReturnsFalse() - { - var parser = new DsseAttestationParser(); - parser.IsAttestation("test.json").Should().BeFalse(); - parser.IsAttestation("test.cdx.json").Should().BeFalse(); - parser.IsAttestation("test.spdx.json").Should().BeFalse(); - } - - [Fact] - public async Task ParseAsync_Deterministic_SameOutputForSameInput() - { - // Arrange - var parser = new DsseAttestationParser(); - var filePath = Path.Combine(FixturesPath, "sample.intoto.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - parse twice - var result1 = await parser.ParseAsync(filePath); - var result2 = await parser.ParseAsync(filePath); - - // Assert - results should be identical - result1.Statement!.PredicateType.Should().Be(result2.Statement!.PredicateType); - result1.Statement.Subjects.Count.Should().Be(result2.Statement.Subjects.Count); - result1.Statement.Subjects[0].GetSha256Digest() - .Should().Be(result2.Statement.Subjects[0].GetSha256Digest()); - } - - [Fact] - public async Task ParseAsync_InvalidJson_ReturnsFailure() - { - // Arrange - var parser = new DsseAttestationParser(); - var json = "not valid json"; - using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)); - - // Act - var result = await parser.ParseAsync(stream); - - // Assert - result.IsSuccess.Should().BeFalse(); - result.ErrorMessage.Should().Contain("parsing error"); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/EvidenceDirectoryDiscoveryTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/EvidenceDirectoryDiscoveryTests.cs deleted file mode 100644 index c90a72d6b..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/EvidenceDirectoryDiscoveryTests.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Security.Cryptography; -using System.Text; -using FluentAssertions; -using StellaOps.AirGap.Importer.Reconciliation; - -namespace StellaOps.AirGap.Importer.Tests.Reconciliation; - -public sealed class EvidenceDirectoryDiscoveryTests -{ - [Fact] - public void Discover_ReturnsDeterministicRelativePathsAndHashes() - { - var root = Path.Combine(Path.GetTempPath(), "stellaops-evidence-" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(root); - - try - { - WriteUtf8(Path.Combine(root, "sboms", "a.cdx.json"), "{\"bom\":1}"); - WriteUtf8(Path.Combine(root, "attestations", "z.intoto.jsonl.dsig"), "dsse"); - WriteUtf8(Path.Combine(root, "vex", "v.openvex.json"), "{\"vex\":true}"); - - var discovered = EvidenceDirectoryDiscovery.Discover(root); - discovered.Should().HaveCount(3); - - discovered.Select(d => d.RelativePath).Should().Equal( - "attestations/z.intoto.jsonl.dsig", - "sboms/a.cdx.json", - "vex/v.openvex.json"); - - discovered[0].Kind.Should().Be(EvidenceFileKind.Attestation); - discovered[1].Kind.Should().Be(EvidenceFileKind.Sbom); - discovered[2].Kind.Should().Be(EvidenceFileKind.Vex); - - discovered[0].ContentSha256.Should().Be(HashUtf8("dsse")); - discovered[1].ContentSha256.Should().Be(HashUtf8("{\"bom\":1}")); - discovered[2].ContentSha256.Should().Be(HashUtf8("{\"vex\":true}")); - } - finally - { - Directory.Delete(root, recursive: true); - } - } - - [Fact] - public void Discover_WhenDirectoryMissing_Throws() - { - var missing = Path.Combine(Path.GetTempPath(), "stellaops-missing-" + Guid.NewGuid().ToString("N")); - Action act = () => EvidenceDirectoryDiscovery.Discover(missing); - act.Should().Throw(); - } - - private static void WriteUtf8(string path, string content) - { - Directory.CreateDirectory(Path.GetDirectoryName(path)!); - File.WriteAllText(path, content, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); - } - - private static string HashUtf8(string content) - { - using var sha256 = SHA256.Create(); - var bytes = Encoding.UTF8.GetBytes(content); - var hash = sha256.ComputeHash(bytes); - return "sha256:" + Convert.ToHexString(hash).ToLowerInvariant(); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.cdx.json b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.cdx.json deleted file mode 100644 index 4cef96889..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.cdx.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "bomFormat": "CycloneDX", - "specVersion": "1.6", - "version": 1, - "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", - "metadata": { - "timestamp": "2025-01-15T10:00:00Z", - "component": { - "type": "application", - "name": "test-app", - "version": "1.0.0", - "hashes": [ - { - "alg": "SHA-256", - "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - } - ] - }, - "tools": { - "components": [ - { - "name": "syft", - "version": "1.0.0" - } - ] - } - }, - "components": [ - { - "type": "library", - "name": "zlib", - "version": "1.2.11", - "bom-ref": "pkg:generic/zlib@1.2.11", - "purl": "pkg:generic/zlib@1.2.11", - "hashes": [ - { - "alg": "SHA-256", - "content": "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1" - } - ] - }, - { - "type": "library", - "name": "openssl", - "version": "3.0.0", - "bom-ref": "pkg:generic/openssl@3.0.0", - "purl": "pkg:generic/openssl@3.0.0", - "hashes": [ - { - "alg": "SHA-256", - "content": "919b4a3e65a8deade6b3c94dd44cb98e0f65a1785a787689c23e6b5c0b4edfea" - } - ] - } - ] -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.intoto.json b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.intoto.json deleted file mode 100644 index 5ee01ce56..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.intoto.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "payloadType": "application/vnd.in-toto+json", - "payload": "eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJwcmVkaWNhdGVUeXBlIjoiaHR0cHM6Ly9zbHNhLmRldi9wcm92ZW5hbmNlL3YxIiwic3ViamVjdCI6W3sibmFtZSI6InRlc3QtYXBwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifX1dLCJwcmVkaWNhdGUiOnsiYnVpbGRlcklkIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9idWlsZGVyIiwiYnVpbGRUeXBlIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9idWlsZC10eXBlIn19", - "signatures": [ - { - "keyid": "test-key-id", - "sig": "MEUCIQDFmJRQSwWMbQGiS8X5mY9CvZxVbVmXJ7JQVGEYIhXEBQIgbqDBJxP2P9N2kGPXDlX7Qx8KPVQjN3P1Y5Z9A8B2C3D=" - } - ] -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.spdx.json b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.spdx.json deleted file mode 100644 index 1c7db19e3..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/Fixtures/sample.spdx.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "spdxVersion": "SPDX-2.3", - "dataLicense": "CC0-1.0", - "SPDXID": "SPDXRef-DOCUMENT", - "name": "test-app-sbom", - "documentNamespace": "https://example.com/test-app/1.0.0", - "creationInfo": { - "created": "2025-01-15T10:00:00Z", - "creators": [ - "Tool: syft-1.0.0" - ] - }, - "documentDescribes": [ - "SPDXRef-Package-test-app" - ], - "packages": [ - { - "SPDXID": "SPDXRef-Package-test-app", - "name": "test-app", - "versionInfo": "1.0.0", - "downloadLocation": "NOASSERTION", - "filesAnalyzed": false, - "checksums": [ - { - "algorithm": "SHA256", - "checksumValue": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - } - ] - }, - { - "SPDXID": "SPDXRef-Package-zlib", - "name": "zlib", - "versionInfo": "1.2.11", - "downloadLocation": "NOASSERTION", - "filesAnalyzed": false, - "checksums": [ - { - "algorithm": "SHA256", - "checksumValue": "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1" - } - ], - "externalRefs": [ - { - "referenceCategory": "PACKAGE-MANAGER", - "referenceType": "purl", - "referenceLocator": "pkg:generic/zlib@1.2.11" - } - ] - }, - { - "SPDXID": "SPDXRef-Package-openssl", - "name": "openssl", - "versionInfo": "3.0.0", - "downloadLocation": "NOASSERTION", - "filesAnalyzed": false, - "checksums": [ - { - "algorithm": "SHA256", - "checksumValue": "919b4a3e65a8deade6b3c94dd44cb98e0f65a1785a787689c23e6b5c0b4edfea" - } - ], - "externalRefs": [ - { - "referenceCategory": "PACKAGE-MANAGER", - "referenceType": "purl", - "referenceLocator": "pkg:generic/openssl@3.0.0" - } - ] - } - ], - "relationships": [ - { - "spdxElementId": "SPDXRef-DOCUMENT", - "relatedSpdxElement": "SPDXRef-Package-test-app", - "relationshipType": "DESCRIBES" - }, - { - "spdxElementId": "SPDXRef-Package-test-app", - "relatedSpdxElement": "SPDXRef-Package-zlib", - "relationshipType": "DEPENDS_ON" - }, - { - "spdxElementId": "SPDXRef-Package-test-app", - "relatedSpdxElement": "SPDXRef-Package-openssl", - "relationshipType": "DEPENDS_ON" - } - ] -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/SourcePrecedenceLatticePropertyTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/SourcePrecedenceLatticePropertyTests.cs deleted file mode 100644 index a434d15c8..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/SourcePrecedenceLatticePropertyTests.cs +++ /dev/null @@ -1,453 +0,0 @@ -// ============================================================================= -// SourcePrecedenceLatticePropertyTests.cs -// Property-based tests for lattice properties -// Part of Task T25: Write property-based tests -// ============================================================================= - -using StellaOps.AirGap.Importer.Reconciliation; - -namespace StellaOps.AirGap.Importer.Tests.Reconciliation; - -/// -/// Property-based tests verifying lattice algebraic properties. -/// A lattice must satisfy: associativity, commutativity, idempotence, and absorption. -/// -public sealed class SourcePrecedenceLatticePropertyTests -{ - private static readonly SourcePrecedence[] AllPrecedences = - [ - SourcePrecedence.Unknown, - SourcePrecedence.ThirdParty, - SourcePrecedence.Maintainer, - SourcePrecedence.Vendor - ]; - - #region Lattice Algebraic Properties - - /// - /// Property: Join is commutative - Join(a, b) = Join(b, a) - /// - [Fact] - public void Join_IsCommutative() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var joinAB = SourcePrecedenceLattice.Join(a, b); - var joinBA = SourcePrecedenceLattice.Join(b, a); - - Assert.Equal(joinAB, joinBA); - } - } - } - - /// - /// Property: Meet is commutative - Meet(a, b) = Meet(b, a) - /// - [Fact] - public void Meet_IsCommutative() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var meetAB = SourcePrecedenceLattice.Meet(a, b); - var meetBA = SourcePrecedenceLattice.Meet(b, a); - - Assert.Equal(meetAB, meetBA); - } - } - } - - /// - /// Property: Join is associative - Join(Join(a, b), c) = Join(a, Join(b, c)) - /// - [Fact] - public void Join_IsAssociative() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - foreach (var c in AllPrecedences) - { - var left = SourcePrecedenceLattice.Join(SourcePrecedenceLattice.Join(a, b), c); - var right = SourcePrecedenceLattice.Join(a, SourcePrecedenceLattice.Join(b, c)); - - Assert.Equal(left, right); - } - } - } - } - - /// - /// Property: Meet is associative - Meet(Meet(a, b), c) = Meet(a, Meet(b, c)) - /// - [Fact] - public void Meet_IsAssociative() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - foreach (var c in AllPrecedences) - { - var left = SourcePrecedenceLattice.Meet(SourcePrecedenceLattice.Meet(a, b), c); - var right = SourcePrecedenceLattice.Meet(a, SourcePrecedenceLattice.Meet(b, c)); - - Assert.Equal(left, right); - } - } - } - } - - /// - /// Property: Join is idempotent - Join(a, a) = a - /// - [Fact] - public void Join_IsIdempotent() - { - foreach (var a in AllPrecedences) - { - var result = SourcePrecedenceLattice.Join(a, a); - Assert.Equal(a, result); - } - } - - /// - /// Property: Meet is idempotent - Meet(a, a) = a - /// - [Fact] - public void Meet_IsIdempotent() - { - foreach (var a in AllPrecedences) - { - var result = SourcePrecedenceLattice.Meet(a, a); - Assert.Equal(a, result); - } - } - - /// - /// Property: Absorption law 1 - Join(a, Meet(a, b)) = a - /// - [Fact] - public void Absorption_JoinMeet_ReturnsFirst() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var meet = SourcePrecedenceLattice.Meet(a, b); - var result = SourcePrecedenceLattice.Join(a, meet); - - Assert.Equal(a, result); - } - } - } - - /// - /// Property: Absorption law 2 - Meet(a, Join(a, b)) = a - /// - [Fact] - public void Absorption_MeetJoin_ReturnsFirst() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var join = SourcePrecedenceLattice.Join(a, b); - var result = SourcePrecedenceLattice.Meet(a, join); - - Assert.Equal(a, result); - } - } - } - - #endregion - - #region Ordering Properties - - /// - /// Property: Compare is antisymmetric - if Compare(a,b) > 0 then Compare(b,a) < 0 - /// - [Fact] - public void Compare_IsAntisymmetric() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var compareAB = SourcePrecedenceLattice.Compare(a, b); - var compareBA = SourcePrecedenceLattice.Compare(b, a); - - if (compareAB > 0) - { - Assert.True(compareBA < 0); - } - else if (compareAB < 0) - { - Assert.True(compareBA > 0); - } - else - { - Assert.Equal(0, compareBA); - } - } - } - } - - /// - /// Property: Compare is transitive - if Compare(a,b) > 0 and Compare(b,c) > 0 then Compare(a,c) > 0 - /// - [Fact] - public void Compare_IsTransitive() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - foreach (var c in AllPrecedences) - { - var ab = SourcePrecedenceLattice.Compare(a, b); - var bc = SourcePrecedenceLattice.Compare(b, c); - var ac = SourcePrecedenceLattice.Compare(a, c); - - if (ab > 0 && bc > 0) - { - Assert.True(ac > 0); - } - - if (ab < 0 && bc < 0) - { - Assert.True(ac < 0); - } - } - } - } - } - - /// - /// Property: Compare is reflexive - Compare(a, a) = 0 - /// - [Fact] - public void Compare_IsReflexive() - { - foreach (var a in AllPrecedences) - { - Assert.Equal(0, SourcePrecedenceLattice.Compare(a, a)); - } - } - - #endregion - - #region Join/Meet Bound Properties - - /// - /// Property: Join returns an upper bound - Join(a, b) >= a AND Join(a, b) >= b - /// - [Fact] - public void Join_ReturnsUpperBound() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var join = SourcePrecedenceLattice.Join(a, b); - - Assert.True(SourcePrecedenceLattice.Compare(join, a) >= 0); - Assert.True(SourcePrecedenceLattice.Compare(join, b) >= 0); - } - } - } - - /// - /// Property: Meet returns a lower bound - Meet(a, b) <= a AND Meet(a, b) <= b - /// - [Fact] - public void Meet_ReturnsLowerBound() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var meet = SourcePrecedenceLattice.Meet(a, b); - - Assert.True(SourcePrecedenceLattice.Compare(meet, a) <= 0); - Assert.True(SourcePrecedenceLattice.Compare(meet, b) <= 0); - } - } - } - - /// - /// Property: Join is least upper bound - for all c, if c >= a and c >= b then c >= Join(a,b) - /// - [Fact] - public void Join_IsLeastUpperBound() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var join = SourcePrecedenceLattice.Join(a, b); - - foreach (var c in AllPrecedences) - { - var cGeA = SourcePrecedenceLattice.Compare(c, a) >= 0; - var cGeB = SourcePrecedenceLattice.Compare(c, b) >= 0; - - if (cGeA && cGeB) - { - Assert.True(SourcePrecedenceLattice.Compare(c, join) >= 0); - } - } - } - } - } - - /// - /// Property: Meet is greatest lower bound - for all c, if c <= a and c <= b then c <= Meet(a,b) - /// - [Fact] - public void Meet_IsGreatestLowerBound() - { - foreach (var a in AllPrecedences) - { - foreach (var b in AllPrecedences) - { - var meet = SourcePrecedenceLattice.Meet(a, b); - - foreach (var c in AllPrecedences) - { - var cLeA = SourcePrecedenceLattice.Compare(c, a) <= 0; - var cLeB = SourcePrecedenceLattice.Compare(c, b) <= 0; - - if (cLeA && cLeB) - { - Assert.True(SourcePrecedenceLattice.Compare(c, meet) <= 0); - } - } - } - } - } - - #endregion - - #region Bounded Lattice Properties - - /// - /// Property: Unknown is the bottom element - Join(Unknown, a) = a - /// - [Fact] - public void Unknown_IsBottomElement() - { - foreach (var a in AllPrecedences) - { - var result = SourcePrecedenceLattice.Join(SourcePrecedence.Unknown, a); - Assert.Equal(a, result); - } - } - - /// - /// Property: Vendor is the top element - Meet(Vendor, a) = a - /// - [Fact] - public void Vendor_IsTopElement() - { - foreach (var a in AllPrecedences) - { - var result = SourcePrecedenceLattice.Meet(SourcePrecedence.Vendor, a); - Assert.Equal(a, result); - } - } - - #endregion - - #region Merge Determinism - - /// - /// Property: Merge is deterministic - same inputs always produce same output - /// - [Fact] - public void Merge_IsDeterministic() - { - var lattice = new SourcePrecedenceLattice(); - var timestamp = new DateTimeOffset(2025, 12, 4, 12, 0, 0, TimeSpan.Zero); - - var statements = new[] - { - CreateStatement("CVE-2024-001", "product-1", VexStatus.Affected, SourcePrecedence.ThirdParty, timestamp), - CreateStatement("CVE-2024-001", "product-1", VexStatus.NotAffected, SourcePrecedence.Vendor, timestamp), - CreateStatement("CVE-2024-001", "product-1", VexStatus.Fixed, SourcePrecedence.Maintainer, timestamp) - }; - - // Run merge 100 times and verify same result - var firstResult = lattice.Merge(statements); - - for (int i = 0; i < 100; i++) - { - var result = lattice.Merge(statements); - - Assert.Equal(firstResult.Status, result.Status); - Assert.Equal(firstResult.Source, result.Source); - Assert.Equal(firstResult.VulnerabilityId, result.VulnerabilityId); - } - } - - /// - /// Property: Higher precedence always wins in merge - /// - [Fact] - public void Merge_HigherPrecedenceWins() - { - var lattice = new SourcePrecedenceLattice(); - var timestamp = new DateTimeOffset(2025, 12, 4, 12, 0, 0, TimeSpan.Zero); - - // Vendor should win over ThirdParty - var vendorStatement = CreateStatement("CVE-2024-001", "product-1", VexStatus.NotAffected, SourcePrecedence.Vendor, timestamp); - var thirdPartyStatement = CreateStatement("CVE-2024-001", "product-1", VexStatus.Affected, SourcePrecedence.ThirdParty, timestamp); - - var result = lattice.Merge(vendorStatement, thirdPartyStatement); - - Assert.Equal(SourcePrecedence.Vendor, result.Source); - Assert.Equal(VexStatus.NotAffected, result.Status); - } - - /// - /// Property: More recent timestamp wins when precedence is equal - /// - [Fact] - public void Merge_MoreRecentTimestampWins_WhenPrecedenceEqual() - { - var lattice = new SourcePrecedenceLattice(); - var olderTimestamp = new DateTimeOffset(2025, 12, 1, 12, 0, 0, TimeSpan.Zero); - var newerTimestamp = new DateTimeOffset(2025, 12, 4, 12, 0, 0, TimeSpan.Zero); - - var olderStatement = CreateStatement("CVE-2024-001", "product-1", VexStatus.Affected, SourcePrecedence.Maintainer, olderTimestamp); - var newerStatement = CreateStatement("CVE-2024-001", "product-1", VexStatus.Fixed, SourcePrecedence.Maintainer, newerTimestamp); - - var result = lattice.Merge(olderStatement, newerStatement); - - Assert.Equal(VexStatus.Fixed, result.Status); - Assert.Equal(newerTimestamp, result.Timestamp); - } - - private static VexStatement CreateStatement( - string vulnId, - string productId, - VexStatus status, - SourcePrecedence source, - DateTimeOffset? timestamp) - { - return new VexStatement - { - VulnerabilityId = vulnId, - ProductId = productId, - Status = status, - Source = source, - Timestamp = timestamp - }; - } - - #endregion -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/SpdxParserTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/SpdxParserTests.cs deleted file mode 100644 index 4731f37c9..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Reconciliation/SpdxParserTests.cs +++ /dev/null @@ -1,149 +0,0 @@ -// ============================================================================= -// SpdxParserTests.cs -// Golden-file tests for SPDX SBOM parsing -// Part of Task T24: Golden-file tests for determinism -// ============================================================================= - -using FluentAssertions; -using StellaOps.AirGap.Importer.Reconciliation; -using StellaOps.AirGap.Importer.Reconciliation.Parsers; - -namespace StellaOps.AirGap.Importer.Tests.Reconciliation; - -public sealed class SpdxParserTests -{ - private static readonly string FixturesPath = Path.Combine( - AppDomain.CurrentDomain.BaseDirectory, - "Reconciliation", "Fixtures"); - - [Fact] - public async Task ParseAsync_ValidSpdx_ExtractsAllSubjects() - { - // Arrange - var parser = new SpdxParser(); - var filePath = Path.Combine(FixturesPath, "sample.spdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - result.IsSuccess.Should().BeTrue(); - result.Format.Should().Be(SbomFormat.Spdx); - result.SpecVersion.Should().Be("2.3"); - result.SerialNumber.Should().Be("https://example.com/test-app/1.0.0"); - result.GeneratorTool.Should().Contain("syft"); - - // Should have 3 packages with SHA256 checksums - result.Subjects.Should().HaveCount(3); - - // Verify subjects are sorted by digest - result.Subjects.Should().BeInAscendingOrder(s => s.Digest, StringComparer.Ordinal); - } - - [Fact] - public async Task ParseAsync_ExtractsPrimarySubject() - { - // Arrange - var parser = new SpdxParser(); - var filePath = Path.Combine(FixturesPath, "sample.spdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - result.PrimarySubject.Should().NotBeNull(); - result.PrimarySubject!.Name.Should().Be("test-app"); - result.PrimarySubject.Version.Should().Be("1.0.0"); - result.PrimarySubject.SpdxId.Should().Be("SPDXRef-Package-test-app"); - } - - [Fact] - public async Task ParseAsync_ExtractsPurls() - { - // Arrange - var parser = new SpdxParser(); - var filePath = Path.Combine(FixturesPath, "sample.spdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - check for components with purls - var zlib = result.Subjects.FirstOrDefault(s => s.Name == "zlib"); - zlib.Should().NotBeNull(); - zlib!.Purl.Should().Be("pkg:generic/zlib@1.2.11"); - } - - [Fact] - public async Task ParseAsync_SubjectDigestsAreNormalized() - { - // Arrange - var parser = new SpdxParser(); - var filePath = Path.Combine(FixturesPath, "sample.spdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - var result = await parser.ParseAsync(filePath); - - // Assert - all digests should be normalized sha256:lowercase format - foreach (var subject in result.Subjects) - { - subject.Digest.Should().StartWith("sha256:"); - subject.Digest[7..].Should().MatchRegex("^[a-f0-9]{64}$"); - } - } - - [Fact] - public void DetectFormat_SpdxFile_ReturnsSpdx() - { - var parser = new SpdxParser(); - parser.DetectFormat("test.spdx.json").Should().Be(SbomFormat.Spdx); - } - - [Fact] - public void DetectFormat_NonSpdxFile_ReturnsUnknown() - { - var parser = new SpdxParser(); - parser.DetectFormat("test.cdx.json").Should().Be(SbomFormat.Unknown); - parser.DetectFormat("test.json").Should().Be(SbomFormat.Unknown); - } - - [Fact] - public async Task ParseAsync_Deterministic_SameOutputForSameInput() - { - // Arrange - var parser = new SpdxParser(); - var filePath = Path.Combine(FixturesPath, "sample.spdx.json"); - - if (!File.Exists(filePath)) - { - return; - } - - // Act - parse twice - var result1 = await parser.ParseAsync(filePath); - var result2 = await parser.ParseAsync(filePath); - - // Assert - results should be identical and in same order - result1.Subjects.Select(s => s.Digest).Should().Equal(result2.Subjects.Select(s => s.Digest)); - result1.Subjects.Select(s => s.Name).Should().Equal(result2.Subjects.Select(s => s.Name)); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/ReplayVerifierTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/ReplayVerifierTests.cs deleted file mode 100644 index a850047b4..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/ReplayVerifierTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using StellaOps.AirGap.Importer.Contracts; -using StellaOps.AirGap.Importer.Validation; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public class ReplayVerifierTests -{ - private readonly ReplayVerifier _verifier = new(); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FullRecompute_succeeds_when_hashes_match_and_fresh() - { - var now = DateTimeOffset.Parse("2025-12-02T01:00:00Z"); - var request = new ReplayVerificationRequest( - "aa".PadRight(64, 'a'), - "bb".PadRight(64, 'b'), - "aa".PadRight(64, 'a'), - "bb".PadRight(64, 'b'), - now.AddHours(-4), - 24, - "cc".PadRight(64, 'c'), - "cc".PadRight(64, 'c'), - ReplayDepth.FullRecompute); - - var result = _verifier.Verify(request, now); - - Assert.True(result.IsValid); - Assert.Equal("full-recompute-passed", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Detects_hash_drift() - { - var now = DateTimeOffset.UtcNow; - var request = new ReplayVerificationRequest( - "aa".PadRight(64, 'a'), - "bb".PadRight(64, 'b'), - "00".PadRight(64, '0'), - "bb".PadRight(64, 'b'), - now, - 1, - null, - null, - ReplayDepth.HashOnly); - - var result = _verifier.Verify(request, now); - - Assert.False(result.IsValid); - Assert.Equal("manifest-hash-drift", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void PolicyFreeze_requires_matching_policy_hash() - { - var now = DateTimeOffset.UtcNow; - var request = new ReplayVerificationRequest( - "aa".PadRight(64, 'a'), - "bb".PadRight(64, 'b'), - "aa".PadRight(64, 'a'), - "bb".PadRight(64, 'b'), - now, - 12, - "bundle-policy", - "sealed-policy-other", - ReplayDepth.PolicyFreeze); - - var result = _verifier.Verify(request, now); - - Assert.False(result.IsValid); - Assert.Equal("policy-hash-drift", result.Reason); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/RootRotationPolicyTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/RootRotationPolicyTests.cs deleted file mode 100644 index c833203ab..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/RootRotationPolicyTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using StellaOps.AirGap.Importer.Validation; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public class RootRotationPolicyTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RequiresTwoApprovers() - { - var policy = new RootRotationPolicy(); - var result = policy.Validate(new Dictionary(), new Dictionary { ["k1"] = new byte[] { 1 } }, new[] { "a" }); - Assert.False(result.IsValid); - Assert.Equal("rotation-dual-approval-required", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RejectsNoChange() - { - var policy = new RootRotationPolicy(); - var result = policy.Validate( - new Dictionary { ["k1"] = new byte[] { 1 } }, - new Dictionary { ["k1"] = new byte[] { 1 } }, - new[] { "a", "b" }); - Assert.False(result.IsValid); - Assert.Equal("rotation-no-change", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void AcceptsRotationWithDualApproval() - { - var policy = new RootRotationPolicy(); - var result = policy.Validate( - new Dictionary { ["old"] = new byte[] { 1 } }, - new Dictionary { ["new"] = new byte[] { 2 } }, - new[] { "a", "b" }); - - Assert.True(result.IsValid); - Assert.Equal("rotation-approved", result.Reason); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/StellaOps.AirGap.Importer.Tests.csproj b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/StellaOps.AirGap.Importer.Tests.csproj deleted file mode 100644 index 39acab8b4..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/StellaOps.AirGap.Importer.Tests.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - net10.0 - false - enable - enable - - - - - - - - - - - - - - PreserveNewest - - - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/TufMetadataValidatorTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/TufMetadataValidatorTests.cs deleted file mode 100644 index 334850d02..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/TufMetadataValidatorTests.cs +++ /dev/null @@ -1,46 +0,0 @@ -using StellaOps.AirGap.Importer.Validation; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Importer.Tests; - -public class TufMetadataValidatorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RejectsInvalidJson() - { - var validator = new TufMetadataValidator(); - var result = validator.Validate("{}", "{}", "{}"); - Assert.False(result.IsValid); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void AcceptsConsistentSnapshotHash() - { - var validator = new TufMetadataValidator(); - var root = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\"}"; - var snapshot = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\",\"meta\":{\"snapshot\":{\"hashes\":{\"sha256\":\"abc\"}}}}"; - var timestamp = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\",\"snapshot\":{\"meta\":{\"hashes\":{\"sha256\":\"abc\"}}}}"; - - var result = validator.Validate(root, snapshot, timestamp); - - Assert.True(result.IsValid); - Assert.Equal("tuf-metadata-valid", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void DetectsHashMismatch() - { - var validator = new TufMetadataValidator(); - var root = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\"}"; - var snapshot = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\",\"meta\":{\"snapshot\":{\"hashes\":{\"sha256\":\"abc\"}}}}"; - var timestamp = "{\"version\":1,\"expiresUtc\":\"2030-01-01T00:00:00Z\",\"snapshot\":{\"meta\":{\"hashes\":{\"sha256\":\"def\"}}}}"; - - var result = validator.Validate(root, snapshot, timestamp); - - Assert.False(result.IsValid); - Assert.Equal("tuf-snapshot-hash-mismatch", result.Reason); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Validation/ImportValidatorIntegrationTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Validation/ImportValidatorIntegrationTests.cs deleted file mode 100644 index 001cf7a96..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Validation/ImportValidatorIntegrationTests.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System.Security.Cryptography; -using System.Text; -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.AirGap.Importer.Contracts; -using StellaOps.AirGap.Importer.Quarantine; -using StellaOps.AirGap.Importer.Validation; -using StellaOps.AirGap.Importer.Versioning; - -namespace StellaOps.AirGap.Importer.Tests.Validation; - -public sealed class ImportValidatorIntegrationTests -{ - [Fact] - public async Task ValidateAsync_WhenNonMonotonic_ShouldFailAndQuarantine() - { - var quarantine = new CapturingQuarantineService(); - var monotonicity = new FixedMonotonicityChecker(isMonotonic: false); - - var validator = new ImportValidator( - new DsseVerifier(), - new TufMetadataValidator(), - new MerkleRootCalculator(), - new RootRotationPolicy(), - monotonicity, - quarantine, - NullLogger.Instance); - - var tempRoot = Path.Combine(Path.GetTempPath(), "stellaops-airgap-tests", Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(tempRoot); - var bundlePath = Path.Combine(tempRoot, "bundle.tar.zst"); - await File.WriteAllTextAsync(bundlePath, "bundle-bytes"); - - try - { - var (envelope, trustRoots) = CreateValidDsse(); - - var trustStore = new TrustStore(); - trustStore.LoadActive(new Dictionary()); - trustStore.StagePending(new Dictionary { ["pending-key"] = new byte[] { 1, 2, 3 } }); - - var request = new ImportValidationRequest( - TenantId: "tenant-a", - BundleType: "offline-kit", - BundleDigest: "sha256:bundle", - BundlePath: bundlePath, - ManifestJson: "{\"version\":\"1.0.0\"}", - ManifestVersion: "1.0.0", - ManifestCreatedAt: DateTimeOffset.Parse("2025-12-15T00:00:00Z"), - ForceActivate: false, - ForceActivateReason: null, - Envelope: envelope, - TrustRoots: trustRoots, - RootJson: """ - {"version":1,"expiresUtc":"2025-12-31T00:00:00Z"} - """, - SnapshotJson: """ - {"version":1,"expiresUtc":"2025-12-31T00:00:00Z","meta":{"snapshot":{"hashes":{"sha256":"abc"}}}} - """, - TimestampJson: """ - {"version":1,"expiresUtc":"2025-12-31T00:00:00Z","snapshot":{"meta":{"hashes":{"sha256":"abc"}}}} - """, - PayloadEntries: new[] { new NamedStream("payload.txt", new MemoryStream(Encoding.UTF8.GetBytes("hello"))) }, - TrustStore: trustStore, - ApproverIds: new[] { "approver-a", "approver-b" }); - - var result = await validator.ValidateAsync(request); - - result.IsValid.Should().BeFalse(); - result.Reason.Should().Contain("version-non-monotonic"); - - quarantine.Requests.Should().HaveCount(1); - quarantine.Requests[0].TenantId.Should().Be("tenant-a"); - quarantine.Requests[0].ReasonCode.Should().Contain("version-non-monotonic"); - } - finally - { - try - { - Directory.Delete(tempRoot, recursive: true); - } - catch - { - // best-effort cleanup - } - } - } - - private static (DsseEnvelope envelope, TrustRootConfig trustRoots) CreateValidDsse() - { - using var rsa = RSA.Create(2048); - var publicKey = rsa.ExportSubjectPublicKeyInfo(); - - var fingerprint = Convert.ToHexString(SHA256.HashData(publicKey)).ToLowerInvariant(); - var payloadType = "application/vnd.in-toto+json"; - var payloadBytes = Encoding.UTF8.GetBytes("{\"hello\":\"world\"}"); - var payloadBase64 = Convert.ToBase64String(payloadBytes); - - var pae = BuildPae(payloadType, payloadBytes); - var signature = rsa.SignData(pae, HashAlgorithmName.SHA256, RSASignaturePadding.Pss); - - var envelope = new DsseEnvelope( - PayloadType: payloadType, - Payload: payloadBase64, - Signatures: new[] { new DsseSignature("key-1", Convert.ToBase64String(signature)) }); - - var trustRoots = new TrustRootConfig( - RootBundlePath: "(memory)", - TrustedKeyFingerprints: new[] { fingerprint }, - AllowedSignatureAlgorithms: new[] { "rsa-pss-sha256" }, - NotBeforeUtc: null, - NotAfterUtc: null, - PublicKeys: new Dictionary { ["key-1"] = publicKey }); - - return (envelope, trustRoots); - } - - private static byte[] BuildPae(string payloadType, byte[] payloadBytes) - { - const string paePrefix = "DSSEv1"; - var payload = Encoding.UTF8.GetString(payloadBytes); - - var parts = new[] - { - paePrefix, - payloadType, - payload - }; - - var paeBuilder = new StringBuilder(); - paeBuilder.Append("PAE:"); - paeBuilder.Append(parts.Length); - foreach (var part in parts) - { - paeBuilder.Append(' '); - paeBuilder.Append(part.Length); - paeBuilder.Append(' '); - paeBuilder.Append(part); - } - - return Encoding.UTF8.GetBytes(paeBuilder.ToString()); - } - - private sealed class FixedMonotonicityChecker : IVersionMonotonicityChecker - { - private readonly bool _isMonotonic; - - public FixedMonotonicityChecker(bool isMonotonic) - { - _isMonotonic = isMonotonic; - } - - public Task CheckAsync( - string tenantId, - string bundleType, - BundleVersion incomingVersion, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new MonotonicityCheckResult( - IsMonotonic: _isMonotonic, - CurrentVersion: new BundleVersion(2, 0, 0, DateTimeOffset.Parse("2025-12-14T00:00:00Z")), - CurrentBundleDigest: "sha256:current", - CurrentActivatedAt: DateTimeOffset.Parse("2025-12-14T00:00:00Z"), - ReasonCode: _isMonotonic ? "MONOTONIC_OK" : "VERSION_NON_MONOTONIC")); - } - - public Task RecordActivationAsync( - string tenantId, - string bundleType, - BundleVersion version, - string bundleDigest, - bool wasForceActivated = false, - string? forceActivateReason = null, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - } - - private sealed class CapturingQuarantineService : IQuarantineService - { - public List Requests { get; } = new(); - - public Task QuarantineAsync(QuarantineRequest request, CancellationToken cancellationToken = default) - { - Requests.Add(request); - return Task.FromResult(new QuarantineResult( - Success: true, - QuarantineId: "test", - QuarantinePath: "(memory)", - QuarantinedAt: DateTimeOffset.UnixEpoch)); - } - - public Task> ListAsync(string tenantId, QuarantineListOptions? options = null, CancellationToken cancellationToken = default) => - Task.FromResult>(Array.Empty()); - - public Task RemoveAsync(string tenantId, string quarantineId, string removalReason, CancellationToken cancellationToken = default) => - Task.FromResult(false); - - public Task CleanupExpiredAsync(TimeSpan retentionPeriod, CancellationToken cancellationToken = default) => - Task.FromResult(0); - } -} - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Validation/RekorOfflineReceiptVerifierTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Validation/RekorOfflineReceiptVerifierTests.cs deleted file mode 100644 index 3db8514fb..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Validation/RekorOfflineReceiptVerifierTests.cs +++ /dev/null @@ -1,165 +0,0 @@ -using System.Security.Cryptography; -using System.Text; -using System.Text.Json; -using FluentAssertions; -using StellaOps.AirGap.Importer.Validation; - -namespace StellaOps.AirGap.Importer.Tests.Validation; - -public sealed class RekorOfflineReceiptVerifierTests -{ - [Fact] - public async Task VerifyAsync_ValidReceiptAndCheckpoint_Succeeds() - { - var temp = Path.Combine(Path.GetTempPath(), "stellaops-rekor-" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(temp); - - try - { - // Leaf 0 is the DSSE digest we verify for inclusion. - var dsseSha256 = SHA256.HashData(Encoding.UTF8.GetBytes("dsse-envelope")); - var otherDsseSha256 = SHA256.HashData(Encoding.UTF8.GetBytes("other-envelope")); - - var leaf0 = HashLeaf(dsseSha256); - var leaf1 = HashLeaf(otherDsseSha256); - var root = HashInterior(leaf0, leaf1); - - var rootBase64 = Convert.ToBase64String(root); - var treeSize = 2L; - var origin = "rekor.sigstore.dev - 2605736670972794746"; - var timestamp = "1700000000"; - var canonicalBody = $"{origin}\n{treeSize}\n{rootBase64}\n{timestamp}\n"; - - using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); - var signature = ecdsa.SignData(Encoding.UTF8.GetBytes(canonicalBody), HashAlgorithmName.SHA256); - var signatureBase64 = Convert.ToBase64String(signature); - - var checkpointPath = Path.Combine(temp, "checkpoint.sig"); - await File.WriteAllTextAsync( - checkpointPath, - canonicalBody + $"sig {signatureBase64}\n", - new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); - - var publicKeyPath = Path.Combine(temp, "rekor-pub.pem"); - await File.WriteAllTextAsync( - publicKeyPath, - WrapPem("PUBLIC KEY", ecdsa.ExportSubjectPublicKeyInfo()), - new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); - - var receiptPath = Path.Combine(temp, "rekor-receipt.json"); - var receiptJson = JsonSerializer.Serialize(new - { - uuid = "uuid-1", - logIndex = 0, - rootHash = Convert.ToHexString(root).ToLowerInvariant(), - hashes = new[] { Convert.ToHexString(leaf1).ToLowerInvariant() }, - checkpoint = "checkpoint.sig" - }, new JsonSerializerOptions(JsonSerializerDefaults.Web) { WriteIndented = true }); - await File.WriteAllTextAsync(receiptPath, receiptJson, new UTF8Encoding(false)); - - var result = await RekorOfflineReceiptVerifier.VerifyAsync(receiptPath, dsseSha256, publicKeyPath, CancellationToken.None); - - result.Verified.Should().BeTrue(); - result.CheckpointSignatureVerified.Should().BeTrue(); - result.RekorUuid.Should().Be("uuid-1"); - result.LogIndex.Should().Be(0); - result.TreeSize.Should().Be(2); - result.ExpectedRootHash.Should().Be(Convert.ToHexString(root).ToLowerInvariant()); - result.ComputedRootHash.Should().Be(Convert.ToHexString(root).ToLowerInvariant()); - } - finally - { - Directory.Delete(temp, recursive: true); - } - } - - [Fact] - public async Task VerifyAsync_TamperedCheckpointSignature_Fails() - { - var temp = Path.Combine(Path.GetTempPath(), "stellaops-rekor-" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(temp); - - try - { - var dsseSha256 = SHA256.HashData(Encoding.UTF8.GetBytes("dsse-envelope")); - var otherDsseSha256 = SHA256.HashData(Encoding.UTF8.GetBytes("other-envelope")); - - var leaf0 = HashLeaf(dsseSha256); - var leaf1 = HashLeaf(otherDsseSha256); - var root = HashInterior(leaf0, leaf1); - - var rootBase64 = Convert.ToBase64String(root); - var treeSize = 2L; - var origin = "rekor.sigstore.dev - 2605736670972794746"; - var timestamp = "1700000000"; - var canonicalBody = $"{origin}\n{treeSize}\n{rootBase64}\n{timestamp}\n"; - - using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256); - var signature = ecdsa.SignData(Encoding.UTF8.GetBytes(canonicalBody), HashAlgorithmName.SHA256); - signature[0] ^= 0xFF; // tamper - - var checkpointPath = Path.Combine(temp, "checkpoint.sig"); - await File.WriteAllTextAsync( - checkpointPath, - canonicalBody + $"sig {Convert.ToBase64String(signature)}\n", - new UTF8Encoding(false)); - - var publicKeyPath = Path.Combine(temp, "rekor-pub.pem"); - await File.WriteAllTextAsync( - publicKeyPath, - WrapPem("PUBLIC KEY", ecdsa.ExportSubjectPublicKeyInfo()), - new UTF8Encoding(false)); - - var receiptPath = Path.Combine(temp, "rekor-receipt.json"); - var receiptJson = JsonSerializer.Serialize(new - { - uuid = "uuid-1", - logIndex = 0, - rootHash = Convert.ToHexString(root).ToLowerInvariant(), - hashes = new[] { Convert.ToHexString(leaf1).ToLowerInvariant() }, - checkpoint = "checkpoint.sig" - }, new JsonSerializerOptions(JsonSerializerDefaults.Web) { WriteIndented = true }); - await File.WriteAllTextAsync(receiptPath, receiptJson, new UTF8Encoding(false)); - - var result = await RekorOfflineReceiptVerifier.VerifyAsync(receiptPath, dsseSha256, publicKeyPath, CancellationToken.None); - - result.Verified.Should().BeFalse(); - result.FailureReason.Should().Contain("checkpoint signature", because: result.FailureReason); - } - finally - { - Directory.Delete(temp, recursive: true); - } - } - - private static byte[] HashLeaf(byte[] leafData) - { - var buffer = new byte[1 + leafData.Length]; - buffer[0] = 0x00; - leafData.CopyTo(buffer, 1); - return SHA256.HashData(buffer); - } - - private static byte[] HashInterior(byte[] left, byte[] right) - { - var buffer = new byte[1 + left.Length + right.Length]; - buffer[0] = 0x01; - left.CopyTo(buffer, 1); - right.CopyTo(buffer, 1 + left.Length); - return SHA256.HashData(buffer); - } - - private static string WrapPem(string label, byte[] derBytes) - { - var base64 = Convert.ToBase64String(derBytes); - var sb = new StringBuilder(); - sb.AppendLine($"-----BEGIN {label}-----"); - for (var i = 0; i < base64.Length; i += 64) - { - sb.AppendLine(base64.Substring(i, Math.Min(64, base64.Length - i))); - } - sb.AppendLine($"-----END {label}-----"); - return sb.ToString(); - } -} - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Versioning/BundleVersionTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Versioning/BundleVersionTests.cs deleted file mode 100644 index b3225df51..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Versioning/BundleVersionTests.cs +++ /dev/null @@ -1,79 +0,0 @@ -using FluentAssertions; -using StellaOps.AirGap.Importer.Versioning; - -namespace StellaOps.AirGap.Importer.Tests.Versioning; - -public sealed class BundleVersionTests -{ - [Fact] - public void Parse_ShouldParseSemVer() - { - var createdAt = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); - var version = BundleVersion.Parse("1.2.3", createdAt); - - version.Major.Should().Be(1); - version.Minor.Should().Be(2); - version.Patch.Should().Be(3); - version.Prerelease.Should().BeNull(); - version.CreatedAt.Should().Be(createdAt); - version.SemVer.Should().Be("1.2.3"); - } - - [Fact] - public void Parse_ShouldParsePrerelease() - { - var createdAt = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); - var version = BundleVersion.Parse("1.2.3-edge.1", createdAt); - - version.SemVer.Should().Be("1.2.3-edge.1"); - version.Prerelease.Should().Be("edge.1"); - } - - [Fact] - public void IsNewerThan_ShouldCompareMajorMinorPatch() - { - var a = new BundleVersion(1, 2, 3, DateTimeOffset.UnixEpoch); - var b = new BundleVersion(2, 0, 0, DateTimeOffset.UnixEpoch); - b.IsNewerThan(a).Should().BeTrue(); - a.IsNewerThan(b).Should().BeFalse(); - } - - [Fact] - public void IsNewerThan_ShouldTreatReleaseAsNewerThanPrerelease() - { - var now = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); - var prerelease = new BundleVersion(1, 2, 3, now, "alpha"); - var release = new BundleVersion(1, 2, 3, now, null); - - release.IsNewerThan(prerelease).Should().BeTrue(); - prerelease.IsNewerThan(release).Should().BeFalse(); - } - - [Fact] - public void IsNewerThan_ShouldOrderPrereleaseIdentifiers() - { - var now = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); - var alpha = new BundleVersion(1, 2, 3, now, "alpha"); - var beta = new BundleVersion(1, 2, 3, now, "beta"); - var rc1 = new BundleVersion(1, 2, 3, now, "rc.1"); - var rc2 = new BundleVersion(1, 2, 3, now, "rc.2"); - - beta.IsNewerThan(alpha).Should().BeTrue(); - rc1.IsNewerThan(beta).Should().BeTrue(); - rc2.IsNewerThan(rc1).Should().BeTrue(); - } - - [Fact] - public void IsNewerThan_ShouldUseCreatedAtAsTiebreaker() - { - var earlier = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); - var later = earlier.AddMinutes(1); - - var a = new BundleVersion(1, 2, 3, earlier, "edge"); - var b = new BundleVersion(1, 2, 3, later, "edge"); - - b.IsNewerThan(a).Should().BeTrue(); - a.IsNewerThan(b).Should().BeFalse(); - } -} - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Versioning/VersionMonotonicityCheckerTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Versioning/VersionMonotonicityCheckerTests.cs deleted file mode 100644 index eae6791ef..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Importer.Tests/Versioning/VersionMonotonicityCheckerTests.cs +++ /dev/null @@ -1,157 +0,0 @@ -using FluentAssertions; -using StellaOps.AirGap.Importer.Versioning; - -namespace StellaOps.AirGap.Importer.Tests.Versioning; - -public sealed class VersionMonotonicityCheckerTests -{ - [Fact] - public async Task CheckAsync_WhenNoCurrent_ShouldBeFirstActivation() - { - var store = new InMemoryBundleVersionStore(); - var checker = new VersionMonotonicityChecker(store, new FixedTimeProvider(DateTimeOffset.Parse("2025-12-14T00:00:00Z"))); - - var incoming = BundleVersion.Parse("1.0.0", DateTimeOffset.Parse("2025-12-14T00:00:00Z")); - var result = await checker.CheckAsync("tenant-a", "offline-kit", incoming); - - result.IsMonotonic.Should().BeTrue(); - result.ReasonCode.Should().Be("FIRST_ACTIVATION"); - result.CurrentVersion.Should().BeNull(); - result.CurrentBundleDigest.Should().BeNull(); - } - - [Fact] - public async Task CheckAsync_WhenOlder_ShouldBeNonMonotonic() - { - var store = new InMemoryBundleVersionStore(); - await store.UpsertAsync(new BundleVersionRecord( - TenantId: "tenant-a", - BundleType: "offline-kit", - VersionString: "2.0.0", - Major: 2, - Minor: 0, - Patch: 0, - Prerelease: null, - BundleCreatedAt: DateTimeOffset.Parse("2025-12-14T00:00:00Z"), - BundleDigest: "sha256:current", - ActivatedAt: DateTimeOffset.Parse("2025-12-14T00:00:00Z"), - WasForceActivated: false, - ForceActivateReason: null)); - - var checker = new VersionMonotonicityChecker(store, new FixedTimeProvider(DateTimeOffset.Parse("2025-12-14T00:00:00Z"))); - var incoming = BundleVersion.Parse("1.0.0", DateTimeOffset.Parse("2025-12-14T00:00:00Z")); - - var result = await checker.CheckAsync("tenant-a", "offline-kit", incoming); - - result.IsMonotonic.Should().BeFalse(); - result.ReasonCode.Should().Be("VERSION_NON_MONOTONIC"); - result.CurrentVersion.Should().NotBeNull(); - result.CurrentVersion!.SemVer.Should().Be("2.0.0"); - } - - [Fact] - public async Task RecordActivationAsync_WhenNonMonotonicWithoutForce_ShouldThrow() - { - var store = new InMemoryBundleVersionStore(); - await store.UpsertAsync(new BundleVersionRecord( - TenantId: "tenant-a", - BundleType: "offline-kit", - VersionString: "2.0.0", - Major: 2, - Minor: 0, - Patch: 0, - Prerelease: null, - BundleCreatedAt: DateTimeOffset.Parse("2025-12-14T00:00:00Z"), - BundleDigest: "sha256:current", - ActivatedAt: DateTimeOffset.Parse("2025-12-14T00:00:00Z"), - WasForceActivated: false, - ForceActivateReason: null)); - - var checker = new VersionMonotonicityChecker(store, new FixedTimeProvider(DateTimeOffset.Parse("2025-12-15T00:00:00Z"))); - var incoming = BundleVersion.Parse("1.0.0", DateTimeOffset.Parse("2025-12-15T00:00:00Z")); - - var act = () => checker.RecordActivationAsync("tenant-a", "offline-kit", incoming, "sha256:new"); - await act.Should().ThrowAsync(); - } - - [Fact] - public async Task RecordActivationAsync_WhenForced_ShouldWriteForceFields() - { - var store = new InMemoryBundleVersionStore(); - await store.UpsertAsync(new BundleVersionRecord( - TenantId: "tenant-a", - BundleType: "offline-kit", - VersionString: "2.0.0", - Major: 2, - Minor: 0, - Patch: 0, - Prerelease: null, - BundleCreatedAt: DateTimeOffset.Parse("2025-12-14T00:00:00Z"), - BundleDigest: "sha256:current", - ActivatedAt: DateTimeOffset.Parse("2025-12-14T00:00:00Z"), - WasForceActivated: false, - ForceActivateReason: null)); - - var checker = new VersionMonotonicityChecker(store, new FixedTimeProvider(DateTimeOffset.Parse("2025-12-15T00:00:00Z"))); - var incoming = BundleVersion.Parse("1.0.0", DateTimeOffset.Parse("2025-12-15T00:00:00Z")); - - await checker.RecordActivationAsync( - "tenant-a", - "offline-kit", - incoming, - "sha256:new", - wasForceActivated: true, - forceActivateReason: "manual rollback permitted"); - - var current = await store.GetCurrentAsync("tenant-a", "offline-kit"); - current.Should().NotBeNull(); - current!.WasForceActivated.Should().BeTrue(); - current.ForceActivateReason.Should().Be("manual rollback permitted"); - current.BundleDigest.Should().Be("sha256:new"); - } - - private sealed class InMemoryBundleVersionStore : IBundleVersionStore - { - private BundleVersionRecord? _current; - private readonly List _history = new(); - - public Task GetCurrentAsync(string tenantId, string bundleType, CancellationToken ct = default) - { - return Task.FromResult(_current is not null && - _current.TenantId.Equals(tenantId, StringComparison.Ordinal) && - _current.BundleType.Equals(bundleType, StringComparison.Ordinal) - ? _current - : null); - } - - public Task UpsertAsync(BundleVersionRecord record, CancellationToken ct = default) - { - _current = record; - _history.Insert(0, record); - return Task.CompletedTask; - } - - public Task> GetHistoryAsync(string tenantId, string bundleType, int limit = 10, CancellationToken ct = default) - { - var items = _history - .Where(r => r.TenantId.Equals(tenantId, StringComparison.Ordinal) && r.BundleType.Equals(bundleType, StringComparison.Ordinal)) - .Take(limit) - .ToArray(); - - return Task.FromResult>(items); - } - } - - private sealed class FixedTimeProvider : TimeProvider - { - private readonly DateTimeOffset _utcNow; - - public FixedTimeProvider(DateTimeOffset utcNow) - { - _utcNow = utcNow; - } - - public override DateTimeOffset GetUtcNow() => _utcNow; - } -} - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/AirGapOptionsValidatorTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/AirGapOptionsValidatorTests.cs deleted file mode 100644 index 2b96bb052..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/AirGapOptionsValidatorTests.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Microsoft.Extensions.Options; -using StellaOps.AirGap.Time.Config; -using StellaOps.AirGap.Time.Models; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class AirGapOptionsValidatorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FailsWhenTenantMissing() - { - var opts = new AirGapOptions { TenantId = "" }; - var validator = new AirGapOptionsValidator(); - var result = validator.Validate(null, opts); - Assert.True(result.Failed); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FailsWhenWarningExceedsBreach() - { - var opts = new AirGapOptions { TenantId = "t", Staleness = new StalenessOptions { WarningSeconds = 20, BreachSeconds = 10 } }; - var validator = new AirGapOptionsValidator(); - var result = validator.Validate(null, opts); - Assert.True(result.Failed); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SucceedsForValidOptions() - { - var opts = new AirGapOptions { TenantId = "t", Staleness = new StalenessOptions { WarningSeconds = 10, BreachSeconds = 20 } }; - var validator = new AirGapOptionsValidator(); - var result = validator.Validate(null, opts); - Assert.True(result.Succeeded); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/GlobalUsings.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/GlobalUsings.cs deleted file mode 100644 index c802f4480..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/GlobalUsings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/Rfc3161VerifierTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/Rfc3161VerifierTests.cs deleted file mode 100644 index ae3163ae0..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/Rfc3161VerifierTests.cs +++ /dev/null @@ -1,100 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -/// -/// Tests for Rfc3161Verifier with real SignedCms verification. -/// Per AIRGAP-TIME-57-001: Trusted time-anchor service. -/// -public class Rfc3161VerifierTests -{ - private readonly Rfc3161Verifier _verifier = new(); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenTrustRootsEmpty() - { - var token = new byte[] { 0x01, 0x02, 0x03 }; - - var result = _verifier.Verify(token, Array.Empty(), out var anchor); - - Assert.False(result.IsValid); - Assert.Equal("rfc3161-trust-roots-required", result.Reason); - Assert.Equal(TimeAnchor.Unknown, anchor); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenTokenEmpty() - { - var trust = new[] { new TimeTrustRoot("tsa-root", new byte[] { 0x01 }, "rsa") }; - - var result = _verifier.Verify(ReadOnlySpan.Empty, trust, out var anchor); - - Assert.False(result.IsValid); - Assert.Equal("rfc3161-token-empty", result.Reason); - Assert.Equal(TimeAnchor.Unknown, anchor); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenInvalidAsn1Structure() - { - var token = new byte[] { 0x01, 0x02, 0x03 }; // Invalid ASN.1 - var trust = new[] { new TimeTrustRoot("tsa-root", new byte[] { 0x01 }, "rsa") }; - - var result = _verifier.Verify(token, trust, out var anchor); - - Assert.False(result.IsValid); - Assert.Contains("rfc3161-", result.Reason); - Assert.Equal(TimeAnchor.Unknown, anchor); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ProducesTokenDigest() - { - var token = new byte[] { 0x30, 0x00 }; // Empty SEQUENCE (minimal valid ASN.1) - var trust = new[] { new TimeTrustRoot("tsa-root", new byte[] { 0x01 }, "rsa") }; - - var result = _verifier.Verify(token, trust, out _); - - // Should fail on CMS decode but attempt was made - Assert.False(result.IsValid); - Assert.Contains("rfc3161-", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_HandlesExceptionsGracefully() - { - // Create bytes that might cause internal exceptions - var token = new byte[256]; - new Random(42).NextBytes(token); - var trust = new[] { new TimeTrustRoot("tsa-root", new byte[] { 0x01 }, "rsa") }; - - var result = _verifier.Verify(token, trust, out var anchor); - - // Should not throw, should return failure result - Assert.False(result.IsValid); - Assert.Contains("rfc3161-", result.Reason); - Assert.Equal(TimeAnchor.Unknown, anchor); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReportsDecodeErrorForMalformedCms() - { - // Create something that looks like CMS but isn't valid - var token = new byte[] { 0x30, 0x82, 0x00, 0x10, 0x06, 0x09 }; - var trust = new[] { new TimeTrustRoot("tsa-root", new byte[] { 0x01 }, "rsa") }; - - var result = _verifier.Verify(token, trust, out _); - - Assert.False(result.IsValid); - // Should report either decode or error - Assert.True(result.Reason?.Contains("rfc3161-") ?? false); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/RoughtimeVerifierTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/RoughtimeVerifierTests.cs deleted file mode 100644 index f7c10beae..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/RoughtimeVerifierTests.cs +++ /dev/null @@ -1,158 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -/// -/// Tests for RoughtimeVerifier with real Ed25519 signature verification. -/// Per AIRGAP-TIME-57-001: Trusted time-anchor service. -/// -public class RoughtimeVerifierTests -{ - private readonly RoughtimeVerifier _verifier = new(); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenTrustRootsEmpty() - { - var token = new byte[] { 0x01, 0x02, 0x03, 0x04 }; - - var result = _verifier.Verify(token, Array.Empty(), out var anchor); - - Assert.False(result.IsValid); - Assert.Equal("roughtime-trust-roots-required", result.Reason); - Assert.Equal(TimeAnchor.Unknown, anchor); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenTokenEmpty() - { - var trust = new[] { new TimeTrustRoot("root1", new byte[32], "ed25519") }; - - var result = _verifier.Verify(ReadOnlySpan.Empty, trust, out var anchor); - - Assert.False(result.IsValid); - Assert.Equal("roughtime-token-empty", result.Reason); - Assert.Equal(TimeAnchor.Unknown, anchor); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenTokenTooShort() - { - var token = new byte[] { 0x01, 0x02, 0x03 }; - var trust = new[] { new TimeTrustRoot("root1", new byte[32], "ed25519") }; - - var result = _verifier.Verify(token, trust, out var anchor); - - Assert.False(result.IsValid); - Assert.Equal("roughtime-message-too-short", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenInvalidTagCount() - { - // Create a minimal wire format with invalid tag count - var token = new byte[8]; - // Set num_tags to 0 (invalid) - BitConverter.TryWriteBytes(token.AsSpan(0, 4), (uint)0); - - var trust = new[] { new TimeTrustRoot("root1", new byte[32], "ed25519") }; - - var result = _verifier.Verify(token, trust, out var anchor); - - Assert.False(result.IsValid); - Assert.Equal("roughtime-invalid-tag-count", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenNonEd25519Algorithm() - { - // Create a minimal valid-looking wire format - var token = CreateMinimalRoughtimeToken(); - var trust = new[] { new TimeTrustRoot("root1", new byte[32], "rsa") }; // Wrong algorithm - - var result = _verifier.Verify(token, trust, out var anchor); - - Assert.False(result.IsValid); - // Should fail either on parsing or signature verification - Assert.Contains("roughtime-", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ReturnsFailure_WhenKeyLengthWrong() - { - var token = CreateMinimalRoughtimeToken(); - var trust = new[] { new TimeTrustRoot("root1", new byte[16], "ed25519") }; // Wrong key length - - var result = _verifier.Verify(token, trust, out var anchor); - - Assert.False(result.IsValid); - Assert.Contains("roughtime-", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Verify_ProducesTokenDigest() - { - var token = new byte[] { 0xAA, 0xBB, 0xCC, 0xDD }; - var trust = new[] { new TimeTrustRoot("root1", new byte[32], "ed25519") }; - - var result = _verifier.Verify(token, trust, out _); - - // Even on failure, we should get a deterministic result - Assert.False(result.IsValid); - } - - /// - /// Creates a minimal Roughtime wire format token for testing parsing paths. - /// Note: This will fail signature verification but tests the parsing logic. - /// - private static byte[] CreateMinimalRoughtimeToken() - { - // Roughtime wire format: - // [num_tags:u32] [offsets:u32[n-1]] [tags:u32[n]] [values...] - // We'll create 2 tags: SIG and SREP - - const uint TagSig = 0x00474953; // "SIG\0" - const uint TagSrep = 0x50455253; // "SREP" - - var sigValue = new byte[64]; // Ed25519 signature - var srepValue = CreateMinimalSrep(); - - // Header: num_tags=2, offset[0]=64 (sig length), tags=[SIG, SREP] - var headerSize = 4 + 4 + 8; // num_tags + 1 offset + 2 tags = 16 bytes - var token = new byte[headerSize + sigValue.Length + srepValue.Length]; - - BitConverter.TryWriteBytes(token.AsSpan(0, 4), (uint)2); // num_tags = 2 - BitConverter.TryWriteBytes(token.AsSpan(4, 4), (uint)64); // offset[0] = 64 (sig length) - BitConverter.TryWriteBytes(token.AsSpan(8, 4), TagSig); - BitConverter.TryWriteBytes(token.AsSpan(12, 4), TagSrep); - sigValue.CopyTo(token.AsSpan(16)); - srepValue.CopyTo(token.AsSpan(16 + 64)); - - return token; - } - - private static byte[] CreateMinimalSrep() - { - // SREP with MIDP tag containing 8-byte timestamp - const uint TagMidp = 0x5044494D; // "MIDP" - - // Header: num_tags=1, tags=[MIDP] - var headerSize = 4 + 4; // num_tags + 1 tag = 8 bytes - var srepValue = new byte[headerSize + 8]; // + 8 bytes for MIDP value - - BitConverter.TryWriteBytes(srepValue.AsSpan(0, 4), (uint)1); // num_tags = 1 - BitConverter.TryWriteBytes(srepValue.AsSpan(4, 4), TagMidp); - // MIDP value: microseconds since Unix epoch (example: 2025-01-01 00:00:00 UTC) - BitConverter.TryWriteBytes(srepValue.AsSpan(8, 8), 1735689600000000L); - - return srepValue; - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/SealedStartupValidatorTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/SealedStartupValidatorTests.cs deleted file mode 100644 index 0f9d0fbec..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/SealedStartupValidatorTests.cs +++ /dev/null @@ -1,68 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; -using StellaOps.AirGap.Time.Stores; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class SealedStartupValidatorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task FailsWhenAnchorMissing() - { - var validator = Build(out var statusService); - var result = await validator.ValidateAsync("t1", StalenessBudget.Default, default); - Assert.False(result.IsValid); - Assert.Equal("time-anchor-missing", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task FailsWhenBreach() - { - var validator = Build(out var statusService); - var anchor = new TimeAnchor(DateTimeOffset.UnixEpoch, "src", "fmt", "fp", "digest"); - await statusService.SetAnchorAsync("t1", anchor, new StalenessBudget(10, 20)); - var now = DateTimeOffset.UnixEpoch.AddSeconds(25); - var status = await statusService.GetStatusAsync("t1", now); - var result = status.Staleness.IsBreach; - Assert.True(result); - var validation = await validator.ValidateAsync("t1", new StalenessBudget(10, 20), default); - Assert.False(validation.IsValid); - Assert.Equal("time-anchor-stale", validation.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task SucceedsWhenFresh() - { - var validator = Build(out var statusService); - var now = DateTimeOffset.UtcNow; - var anchor = new TimeAnchor(now, "src", "fmt", "fp", "digest"); - await statusService.SetAnchorAsync("t1", anchor, new StalenessBudget(10, 20)); - var validation = await validator.ValidateAsync("t1", new StalenessBudget(10, 20), default); - Assert.True(validation.IsValid); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task FailsOnBudgetMismatch() - { - var validator = Build(out var statusService); - var anchor = new TimeAnchor(DateTimeOffset.UtcNow, "src", "fmt", "fp", "digest"); - await statusService.SetAnchorAsync("t1", anchor, new StalenessBudget(10, 20)); - - var validation = await validator.ValidateAsync("t1", new StalenessBudget(5, 15), default); - - Assert.False(validation.IsValid); - Assert.Equal("time-anchor-budget-mismatch", validation.Reason); - } - - private static SealedStartupValidator Build(out TimeStatusService statusService) - { - var store = new InMemoryTimeAnchorStore(); - statusService = new TimeStatusService(store, new StalenessCalculator(), new TimeTelemetry(), Microsoft.Extensions.Options.Options.Create(new AirGapOptions())); - return new SealedStartupValidator(statusService); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/StalenessCalculatorTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/StalenessCalculatorTests.cs deleted file mode 100644 index a3d30649f..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/StalenessCalculatorTests.cs +++ /dev/null @@ -1,47 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class StalenessCalculatorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void UnknownWhenNoAnchor() - { - var calc = new StalenessCalculator(); - var result = calc.Evaluate(TimeAnchor.Unknown, StalenessBudget.Default, DateTimeOffset.UnixEpoch); - Assert.False(result.IsWarning); - Assert.False(result.IsBreach); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BreachWhenBeyondBudget() - { - var anchor = new TimeAnchor(DateTimeOffset.UnixEpoch, "source", "fmt", "fp", "digest"); - var budget = new StalenessBudget(10, 20); - var calc = new StalenessCalculator(); - - var result = calc.Evaluate(anchor, budget, DateTimeOffset.UnixEpoch.AddSeconds(25)); - - Assert.True(result.IsBreach); - Assert.True(result.IsWarning); - Assert.Equal(25, result.AgeSeconds); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void WarningWhenBetweenWarningAndBreach() - { - var anchor = new TimeAnchor(DateTimeOffset.UnixEpoch, "source", "fmt", "fp", "digest"); - var budget = new StalenessBudget(10, 20); - var calc = new StalenessCalculator(); - - var result = calc.Evaluate(anchor, budget, DateTimeOffset.UnixEpoch.AddSeconds(15)); - - Assert.True(result.IsWarning); - Assert.False(result.IsBreach); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/StellaOps.AirGap.Time.Tests.csproj b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/StellaOps.AirGap.Time.Tests.csproj deleted file mode 100644 index abc33a411..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/StellaOps.AirGap.Time.Tests.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - false - enable - enable - - - - - - - - - - - diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeAnchorLoaderTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeAnchorLoaderTests.cs deleted file mode 100644 index 5c910064e..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeAnchorLoaderTests.cs +++ /dev/null @@ -1,66 +0,0 @@ -using Microsoft.Extensions.Options; -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Parsing; -using StellaOps.AirGap.Time.Services; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class TimeAnchorLoaderTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RejectsInvalidHex() - { - var loader = Build(); - var trust = new[] { new TimeTrustRoot("k1", new byte[32], "ed25519") }; - var result = loader.TryLoadHex("not-hex", TimeTokenFormat.Roughtime, trust, out _); - Assert.False(result.IsValid); - Assert.Equal("token-hex-invalid", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void LoadsHexToken() - { - var loader = Build(); - var hex = "01020304"; - var trust = new[] { new TimeTrustRoot("k1", new byte[32], "ed25519") }; - var result = loader.TryLoadHex(hex, TimeTokenFormat.Roughtime, trust, out var anchor); - - Assert.True(result.IsValid); - Assert.Equal("Roughtime", anchor.Format); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RejectsIncompatibleTrustRoots() - { - var loader = Build(); - var hex = "010203"; - var rsaKey = new byte[128]; - var trust = new[] { new TimeTrustRoot("k1", rsaKey, "rsa") }; - - var result = loader.TryLoadHex(hex, TimeTokenFormat.Roughtime, trust, out _); - - Assert.False(result.IsValid); - Assert.Equal("trust-roots-incompatible-format", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RejectsWhenTrustRootsMissing() - { - var loader = Build(); - var result = loader.TryLoadHex("010203", TimeTokenFormat.Roughtime, Array.Empty(), out _); - - Assert.False(result.IsValid); - Assert.Equal("trust-roots-required", result.Reason); - } - - private static TimeAnchorLoader Build() - { - var options = Options.Create(new AirGapOptions { AllowUntrustedAnchors = false }); - return new TimeAnchorLoader(new TimeVerificationService(), new TimeTokenParser(), options); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeAnchorPolicyServiceTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeAnchorPolicyServiceTests.cs deleted file mode 100644 index 9bbaf0a49..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeAnchorPolicyServiceTests.cs +++ /dev/null @@ -1,273 +0,0 @@ -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; -using StellaOps.AirGap.Time.Stores; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -/// -/// Tests for TimeAnchorPolicyService. -/// Per AIRGAP-TIME-57-001: Time-anchor policy enforcement. -/// -public class TimeAnchorPolicyServiceTests -{ - private readonly TimeProvider _fixedTimeProvider; - private readonly InMemoryTimeAnchorStore _store; - private readonly StalenessCalculator _calculator; - private readonly TimeTelemetry _telemetry; - private readonly TimeStatusService _statusService; - private readonly AirGapOptions _airGapOptions; - - public TimeAnchorPolicyServiceTests() - { - _fixedTimeProvider = new FakeTimeProvider(new DateTimeOffset(2025, 1, 15, 12, 0, 0, TimeSpan.Zero)); - _store = new InMemoryTimeAnchorStore(); - _calculator = new StalenessCalculator(); - _telemetry = new TimeTelemetry(); - _airGapOptions = new AirGapOptions - { - Staleness = new AirGapOptions.StalenessOptions { WarningSeconds = 3600, BreachSeconds = 7200 }, - ContentBudgets = new Dictionary() - }; - _statusService = new TimeStatusService(_store, _calculator, _telemetry, Options.Create(_airGapOptions)); - } - - private TimeAnchorPolicyService CreateService(TimeAnchorPolicyOptions? options = null) - { - return new TimeAnchorPolicyService( - _statusService, - Options.Create(options ?? new TimeAnchorPolicyOptions()), - NullLogger.Instance, - _fixedTimeProvider); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ValidateTimeAnchorAsync_ReturnsFailure_WhenNoAnchor() - { - var service = CreateService(); - - var result = await service.ValidateTimeAnchorAsync("tenant-1"); - - Assert.False(result.Allowed); - Assert.Equal(TimeAnchorPolicyErrorCodes.AnchorMissing, result.ErrorCode); - Assert.NotNull(result.Remediation); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ValidateTimeAnchorAsync_ReturnsSuccess_WhenAnchorValid() - { - var service = CreateService(); - var anchor = new TimeAnchor( - _fixedTimeProvider.GetUtcNow().AddMinutes(-30), - "test-source", - "Roughtime", - "fingerprint", - "digest123"); - var budget = new StalenessBudget(3600, 7200); - - await _store.SetAsync("tenant-1", anchor, budget, CancellationToken.None); - - var result = await service.ValidateTimeAnchorAsync("tenant-1"); - - Assert.True(result.Allowed); - Assert.Null(result.ErrorCode); - Assert.NotNull(result.Staleness); - Assert.False(result.Staleness.IsBreach); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ValidateTimeAnchorAsync_ReturnsWarning_WhenAnchorStale() - { - var service = CreateService(); - var anchor = new TimeAnchor( - _fixedTimeProvider.GetUtcNow().AddSeconds(-5000), // Past warning threshold - "test-source", - "Roughtime", - "fingerprint", - "digest123"); - var budget = new StalenessBudget(3600, 7200); - - await _store.SetAsync("tenant-1", anchor, budget, CancellationToken.None); - - var result = await service.ValidateTimeAnchorAsync("tenant-1"); - - Assert.True(result.Allowed); // Allowed but with warning - Assert.NotNull(result.Staleness); - Assert.True(result.Staleness.IsWarning); - Assert.Contains("warning", result.Reason, StringComparison.OrdinalIgnoreCase); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ValidateTimeAnchorAsync_ReturnsFailure_WhenAnchorBreached() - { - var service = CreateService(); - var anchor = new TimeAnchor( - _fixedTimeProvider.GetUtcNow().AddSeconds(-8000), // Past breach threshold - "test-source", - "Roughtime", - "fingerprint", - "digest123"); - var budget = new StalenessBudget(3600, 7200); - - await _store.SetAsync("tenant-1", anchor, budget, CancellationToken.None); - - var result = await service.ValidateTimeAnchorAsync("tenant-1"); - - Assert.False(result.Allowed); - Assert.Equal(TimeAnchorPolicyErrorCodes.AnchorBreached, result.ErrorCode); - Assert.NotNull(result.Staleness); - Assert.True(result.Staleness.IsBreach); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task EnforceBundleImportPolicyAsync_AllowsImport_WhenAnchorValid() - { - var service = CreateService(); - var anchor = new TimeAnchor( - _fixedTimeProvider.GetUtcNow().AddMinutes(-30), - "test-source", - "Roughtime", - "fingerprint", - "digest123"); - var budget = new StalenessBudget(3600, 7200); - - await _store.SetAsync("tenant-1", anchor, budget, CancellationToken.None); - - var result = await service.EnforceBundleImportPolicyAsync( - "tenant-1", - "bundle-123", - _fixedTimeProvider.GetUtcNow().AddMinutes(-15)); - - Assert.True(result.Allowed); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task EnforceBundleImportPolicyAsync_BlocksImport_WhenDriftExceeded() - { - var options = new TimeAnchorPolicyOptions { MaxDriftSeconds = 3600 }; // 1 hour max - var service = CreateService(options); - var anchor = new TimeAnchor( - _fixedTimeProvider.GetUtcNow().AddMinutes(-30), - "test-source", - "Roughtime", - "fingerprint", - "digest123"); - var budget = new StalenessBudget(86400, 172800); // Large budget - - await _store.SetAsync("tenant-1", anchor, budget, CancellationToken.None); - - var bundleTimestamp = _fixedTimeProvider.GetUtcNow().AddDays(-2); // 2 days ago - - var result = await service.EnforceBundleImportPolicyAsync( - "tenant-1", - "bundle-123", - bundleTimestamp); - - Assert.False(result.Allowed); - Assert.Equal(TimeAnchorPolicyErrorCodes.DriftExceeded, result.ErrorCode); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task EnforceOperationPolicyAsync_BlocksStrictOperations_WhenNoAnchor() - { - var options = new TimeAnchorPolicyOptions - { - StrictOperations = new[] { "attestation.sign" } - }; - var service = CreateService(options); - - var result = await service.EnforceOperationPolicyAsync("tenant-1", "attestation.sign"); - - Assert.False(result.Allowed); - Assert.Equal(TimeAnchorPolicyErrorCodes.AnchorMissing, result.ErrorCode); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task EnforceOperationPolicyAsync_AllowsNonStrictOperations_InNonStrictMode() - { - var options = new TimeAnchorPolicyOptions - { - StrictEnforcement = false, - StrictOperations = new[] { "attestation.sign" } - }; - var service = CreateService(options); - - var result = await service.EnforceOperationPolicyAsync("tenant-1", "some.other.operation"); - - Assert.True(result.Allowed); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task CalculateDriftAsync_ReturnsNoDrift_WhenNoAnchor() - { - var service = CreateService(); - - var result = await service.CalculateDriftAsync("tenant-1", _fixedTimeProvider.GetUtcNow()); - - Assert.False(result.HasAnchor); - Assert.Equal(TimeSpan.Zero, result.Drift); - Assert.Null(result.AnchorTime); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task CalculateDriftAsync_ReturnsDrift_WhenAnchorExists() - { - var service = CreateService(new TimeAnchorPolicyOptions { MaxDriftSeconds = 3600 }); - var anchorTime = _fixedTimeProvider.GetUtcNow().AddMinutes(-30); - var anchor = new TimeAnchor(anchorTime, "test", "Roughtime", "fp", "digest"); - var budget = new StalenessBudget(3600, 7200); - - await _store.SetAsync("tenant-1", anchor, budget, CancellationToken.None); - - var targetTime = _fixedTimeProvider.GetUtcNow().AddMinutes(15); - var result = await service.CalculateDriftAsync("tenant-1", targetTime); - - Assert.True(result.HasAnchor); - Assert.Equal(anchorTime, result.AnchorTime); - Assert.Equal(45, (int)result.Drift.TotalMinutes); // 30 min + 15 min - Assert.False(result.DriftExceedsThreshold); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task CalculateDriftAsync_DetectsExcessiveDrift() - { - var service = CreateService(new TimeAnchorPolicyOptions { MaxDriftSeconds = 60 }); // 1 minute max - var anchor = new TimeAnchor( - _fixedTimeProvider.GetUtcNow(), - "test", - "Roughtime", - "fp", - "digest"); - var budget = new StalenessBudget(3600, 7200); - - await _store.SetAsync("tenant-1", anchor, budget, CancellationToken.None); - - var targetTime = _fixedTimeProvider.GetUtcNow().AddMinutes(5); // 5 minutes drift - var result = await service.CalculateDriftAsync("tenant-1", targetTime); - - Assert.True(result.HasAnchor); - Assert.True(result.DriftExceedsThreshold); - } - - private sealed class FakeTimeProvider : TimeProvider - { - private readonly DateTimeOffset _now; - - public FakeTimeProvider(DateTimeOffset now) => _now = now; - - public override DateTimeOffset GetUtcNow() => _now; - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeStatusDtoTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeStatusDtoTests.cs deleted file mode 100644 index 832410f60..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeStatusDtoTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -using StellaOps.AirGap.Time.Models; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class TimeStatusDtoTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SerializesDeterministically() - { - var status = new TimeStatus( - new TimeAnchor(DateTimeOffset.Parse("2025-01-01T00:00:00Z"), "source", "fmt", "fp", "digest"), - new StalenessEvaluation(42, 10, 20, true, false), - new StalenessBudget(10, 20), - new Dictionary - { - { "advisories", new StalenessEvaluation(42, 10, 20, true, false) } - }, - DateTimeOffset.Parse("2025-01-02T00:00:00Z")); - - var json = TimeStatusDto.FromStatus(status).ToJson(); - Assert.Contains("\"contentStaleness\":{\"advisories\":{", json); - Assert.Contains("\"ageSeconds\":42", json); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeStatusServiceTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeStatusServiceTests.cs deleted file mode 100644 index 380ea1c4f..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeStatusServiceTests.cs +++ /dev/null @@ -1,48 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; -using StellaOps.AirGap.Time.Stores; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class TimeStatusServiceTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ReturnsUnknownWhenNoAnchor() - { - var svc = Build(out var telemetry); - var status = await svc.GetStatusAsync("t1", DateTimeOffset.UnixEpoch); - Assert.Equal(TimeAnchor.Unknown, status.Anchor); - Assert.False(status.Staleness.IsWarning); - Assert.Equal(0, telemetry.GetLatest("t1")?.AgeSeconds ?? 0); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task PersistsAnchorAndBudget() - { - var svc = Build(out var telemetry); - var anchor = new TimeAnchor(DateTimeOffset.UnixEpoch, "source", "fmt", "fp", "digest"); - var budget = new StalenessBudget(10, 20); - - await svc.SetAnchorAsync("t1", anchor, budget); - var status = await svc.GetStatusAsync("t1", DateTimeOffset.UnixEpoch.AddSeconds(15)); - - Assert.Equal(anchor, status.Anchor); - Assert.True(status.Staleness.IsWarning); - Assert.False(status.Staleness.IsBreach); - Assert.Equal(15, status.Staleness.AgeSeconds); - var snap = telemetry.GetLatest("t1"); - Assert.NotNull(snap); - Assert.Equal(status.Staleness.AgeSeconds, snap!.AgeSeconds); - Assert.True(snap.IsWarning); - } - - private static TimeStatusService Build(out TimeTelemetry telemetry) - { - telemetry = new TimeTelemetry(); - var options = Microsoft.Extensions.Options.Options.Create(new AirGapOptions()); - return new TimeStatusService(new InMemoryTimeAnchorStore(), new StalenessCalculator(), telemetry, options); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeTelemetryTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeTelemetryTests.cs deleted file mode 100644 index bd311b5bf..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeTelemetryTests.cs +++ /dev/null @@ -1,29 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Services; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class TimeTelemetryTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Records_latest_snapshot_per_tenant() - { - var telemetry = new TimeTelemetry(); - var status = new TimeStatus( - new TimeAnchor(DateTimeOffset.UnixEpoch, "src", "fmt", "fp", "digest"), - new StalenessEvaluation(90, 60, 120, true, false), - StalenessBudget.Default, - new Dictionary{{"advisories", new StalenessEvaluation(90,60,120,true,false)}}, - DateTimeOffset.UtcNow); - - telemetry.Record("t1", status); - - var snap = telemetry.GetLatest("t1"); - Assert.NotNull(snap); - Assert.Equal(90, snap!.AgeSeconds); - Assert.True(snap.IsWarning); - Assert.False(snap.IsBreach); - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeTokenParserTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeTokenParserTests.cs deleted file mode 100644 index 5d9d294f5..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeTokenParserTests.cs +++ /dev/null @@ -1,37 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Parsing; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class TimeTokenParserTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EmptyTokenFails() - { - var parser = new TimeTokenParser(); - var result = parser.TryParse(Array.Empty(), TimeTokenFormat.Roughtime, out var anchor); - - Assert.False(result.IsValid); - Assert.Equal("token-empty", result.Reason); - Assert.Equal(TimeAnchor.Unknown, anchor); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void RoughtimeTokenProducesDigest() - { - var parser = new TimeTokenParser(); - var token = new byte[] { 0x01, 0x02, 0x03 }; - - var result = parser.TryParse(token, TimeTokenFormat.Roughtime, out var anchor); - - Assert.True(result.IsValid); - Assert.Equal("Roughtime", anchor.Format); - Assert.Equal("roughtime-token", anchor.Source); - Assert.Equal("structure-stubbed", result.Reason); - Assert.Matches("^[0-9a-f]{64}$", anchor.TokenDigest); - Assert.NotEqual(DateTimeOffset.UnixEpoch, anchor.AnchorTime); // deterministic derivation - } -} diff --git a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeVerificationServiceTests.cs b/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeVerificationServiceTests.cs deleted file mode 100644 index 0f74752a0..000000000 --- a/src/__Tests/AirGap/StellaOps.AirGap.Time.Tests/TimeVerificationServiceTests.cs +++ /dev/null @@ -1,31 +0,0 @@ -using StellaOps.AirGap.Time.Models; -using StellaOps.AirGap.Time.Parsing; -using StellaOps.AirGap.Time.Services; - -using StellaOps.TestKit; -namespace StellaOps.AirGap.Time.Tests; - -public class TimeVerificationServiceTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void FailsWithoutTrustRoots() - { - var svc = new TimeVerificationService(); - var result = svc.Verify(new byte[] { 0x01 }, TimeTokenFormat.Roughtime, Array.Empty(), out _); - Assert.False(result.IsValid); - Assert.Equal("trust-roots-required", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void SucceedsForRoughtimeWithTrustRoot() - { - var svc = new TimeVerificationService(); - var trust = new[] { new TimeTrustRoot("k1", new byte[] { 0x01 }, "rsassa-pss-sha256") }; - var result = svc.Verify(new byte[] { 0x01, 0x02 }, TimeTokenFormat.Roughtime, trust, out var anchor); - Assert.True(result.IsValid); - Assert.Equal("Roughtime", anchor.Format); - Assert.Equal("k1", anchor.SignatureFingerprint); - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/AdvisoryLinksetProcessorTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/AdvisoryLinksetProcessorTests.cs deleted file mode 100644 index 220bfc951..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/AdvisoryLinksetProcessorTests.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Graph.Indexer.Ingestion.Advisory; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class AdvisoryLinksetProcessorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ProcessAsync_persists_batch_and_records_success() - { - var snapshot = CreateSnapshot(); - var transformer = new AdvisoryLinksetTransformer(); - var writer = new CaptureWriter(); - var metrics = new CaptureMetrics(); - var processor = new AdvisoryLinksetProcessor( - transformer, - writer, - metrics, - NullLogger.Instance); - - await processor.ProcessAsync(snapshot, CancellationToken.None); - - writer.LastBatch.Should().NotBeNull(); - writer.LastBatch!.Edges.Length.Should().Be(1, "duplicate impacts should collapse into one edge"); - metrics.LastRecord.Should().NotBeNull(); - metrics.LastRecord!.Success.Should().BeTrue(); - metrics.LastRecord.NodeCount.Should().Be(writer.LastBatch!.Nodes.Length); - metrics.LastRecord.EdgeCount.Should().Be(writer.LastBatch!.Edges.Length); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ProcessAsync_records_failure_when_writer_throws() - { - var snapshot = CreateSnapshot(); - var transformer = new AdvisoryLinksetTransformer(); - var writer = new CaptureWriter(shouldThrow: true); - var metrics = new CaptureMetrics(); - var processor = new AdvisoryLinksetProcessor( - transformer, - writer, - metrics, - NullLogger.Instance); - - var act = () => processor.ProcessAsync(snapshot, CancellationToken.None); - - await act.Should().ThrowAsync(); - metrics.LastRecord.Should().NotBeNull(); - metrics.LastRecord!.Success.Should().BeFalse(); - } - - private static AdvisoryLinksetSnapshot CreateSnapshot() - { - return new AdvisoryLinksetSnapshot - { - Tenant = "tenant-alpha", - Source = "concelier.overlay.v1", - LinksetDigest = "sha256:linkset001", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:05:00Z"), - EventOffset = 2201, - Advisory = new AdvisoryDetails - { - Source = "concelier.linkset.v1", - AdvisorySource = "ghsa", - AdvisoryId = "GHSA-1234-5678-90AB", - Severity = "HIGH", - PublishedAt = DateTimeOffset.Parse("2025-10-25T09:00:00Z"), - ContentHash = "sha256:ddd444" - }, - Components = new[] - { - new AdvisoryComponentImpact - { - ComponentPurl = "pkg:nuget/Newtonsoft.Json@13.0.3", - ComponentSourceType = "inventory", - EvidenceDigest = "sha256:evidence004", - MatchedVersions = new[] { "13.0.3" }, - Cvss = 8.1, - Confidence = 0.9, - Source = "concelier.overlay.v1", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:05:10Z"), - EventOffset = 3100, - SbomDigest = "sha256:sbom111" - }, - new AdvisoryComponentImpact - { - ComponentPurl = "pkg:nuget/Newtonsoft.Json@13.0.3", - ComponentSourceType = "inventory", - EvidenceDigest = "sha256:evidence004", - MatchedVersions = new[] { "13.0.3" }, - Cvss = 8.1, - Confidence = 0.9, - Source = "concelier.overlay.v1", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:05:10Z"), - EventOffset = 3100, - SbomDigest = "sha256:sbom111" - } - } - }; - } - - private sealed class CaptureWriter : IGraphDocumentWriter - { - private readonly bool _shouldThrow; - - public CaptureWriter(bool shouldThrow = false) - { - _shouldThrow = shouldThrow; - } - - public GraphBuildBatch? LastBatch { get; private set; } - - public Task WriteAsync(GraphBuildBatch batch, CancellationToken cancellationToken) - { - LastBatch = batch; - - if (_shouldThrow) - { - throw new InvalidOperationException("Simulated write failure"); - } - - return Task.CompletedTask; - } - } - - private sealed class CaptureMetrics : IAdvisoryLinksetMetrics - { - public BatchRecord? LastRecord { get; private set; } - - public void RecordBatch(string source, string tenant, int nodeCount, int edgeCount, TimeSpan duration, bool success) - { - LastRecord = new BatchRecord(source, tenant, nodeCount, edgeCount, duration, success); - } - } - - private sealed record BatchRecord( - string Source, - string Tenant, - int NodeCount, - int EdgeCount, - TimeSpan Duration, - bool Success); -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/AdvisoryLinksetTransformerTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/AdvisoryLinksetTransformerTests.cs deleted file mode 100644 index e15d8fb9c..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/AdvisoryLinksetTransformerTests.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Nodes; -using FluentAssertions; -using StellaOps.Graph.Indexer.Ingestion.Advisory; -using Xunit; -using Xunit.Abstractions; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class AdvisoryLinksetTransformerTests -{ - private readonly ITestOutputHelper _output; - - public AdvisoryLinksetTransformerTests(ITestOutputHelper output) - { - _output = output; - } - - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - private static readonly HashSet ExpectedNodeKinds = new(StringComparer.Ordinal) - { - "advisory" - }; - - private static readonly HashSet ExpectedEdgeKinds = new(StringComparer.Ordinal) - { - "AFFECTED_BY" - }; - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Transform_projects_advisory_nodes_and_affected_by_edges() - { - var snapshot = LoadSnapshot("concelier-linkset.json"); - var transformer = new AdvisoryLinksetTransformer(); - - var batch = transformer.Transform(snapshot); - - var expectedNodes = LoadArray("nodes.json") - .Cast() - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var expectedEdges = LoadArray("edges.json") - .Cast() - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualNodes = batch.Nodes - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualEdges = batch.Edges - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - actualNodes.Length.Should().Be(expectedNodes.Length); - actualEdges.Length.Should().Be(expectedEdges.Length); - - for (var i = 0; i < expectedNodes.Length; i++) - { - if (!JsonNode.DeepEquals(expectedNodes[i], actualNodes[i])) - { - _output.WriteLine($"Expected Node: {expectedNodes[i]}"); - _output.WriteLine($"Actual Node: {actualNodes[i]}"); - } - - JsonNode.DeepEquals(expectedNodes[i], actualNodes[i]).Should().BeTrue(); - } - - for (var i = 0; i < expectedEdges.Length; i++) - { - if (!JsonNode.DeepEquals(expectedEdges[i], actualEdges[i])) - { - _output.WriteLine($"Expected Edge: {expectedEdges[i]}"); - _output.WriteLine($"Actual Edge: {actualEdges[i]}"); - } - - JsonNode.DeepEquals(expectedEdges[i], actualEdges[i]).Should().BeTrue(); - } - } - - private static AdvisoryLinksetSnapshot LoadSnapshot(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - })!; - } - - private static JsonArray LoadArray(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - return (JsonArray)JsonNode.Parse(File.ReadAllText(path))!; - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/FileSystemSnapshotFileWriterTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/FileSystemSnapshotFileWriterTests.cs deleted file mode 100644 index cddc6ad4a..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/FileSystemSnapshotFileWriterTests.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.IO; -using System.Text.Json.Nodes; -using FluentAssertions; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class FileSystemSnapshotFileWriterTests : IDisposable -{ - private readonly string _root = Path.Combine(Path.GetTempPath(), $"graph-snapshots-{Guid.NewGuid():N}"); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task WriteJsonAsync_writes_canonical_json() - { - var writer = new FileSystemSnapshotFileWriter(_root); - var json = new JsonObject - { - ["b"] = "value2", - ["a"] = "value1" - }; - - await writer.WriteJsonAsync("manifest.json", json, CancellationToken.None); - - var content = await File.ReadAllTextAsync(Path.Combine(_root, "manifest.json")); - content.Should().Be("{\"a\":\"value1\",\"b\":\"value2\"}"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task WriteJsonLinesAsync_writes_each_object_on_new_line() - { - var writer = new FileSystemSnapshotFileWriter(_root); - var items = new[] - { - new JsonObject { ["id"] = "1", ["kind"] = "component" }, - new JsonObject { ["id"] = "2", ["kind"] = "artifact" } - }; - - await writer.WriteJsonLinesAsync("nodes.jsonl", items, CancellationToken.None); - - var lines = await File.ReadAllLinesAsync(Path.Combine(_root, "nodes.jsonl")); - lines.Should().HaveCount(2); - lines[0].Should().Be("{\"id\":\"1\",\"kind\":\"component\"}"); - lines[1].Should().Be("{\"id\":\"2\",\"kind\":\"artifact\"}"); - } - - public void Dispose() - { - if (Directory.Exists(_root)) - { - Directory.Delete(_root, recursive: true); - } - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/concelier-linkset.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/concelier-linkset.json deleted file mode 100644 index 772829927..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/concelier-linkset.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "tenant": "tenant-alpha", - "source": "concelier.overlay.v1", - "linksetDigest": "sha256:linkset001", - "collectedAt": "2025-10-30T12:05:10Z", - "eventOffset": 3100, - "advisory": { - "source": "concelier.linkset.v1", - "advisorySource": "ghsa", - "advisoryId": "GHSA-1234-5678-90AB", - "severity": "HIGH", - "publishedAt": "2025-10-25T09:00:00Z", - "contentHash": "sha256:ddd444", - "linksetDigest": "sha256:linkset001" - }, - "components": [ - { - "purl": "pkg:nuget/Newtonsoft.Json@13.0.3", - "sourceType": "inventory", - "sbomDigest": "sha256:sbom111", - "evidenceDigest": "sha256:evidence004", - "matchedVersions": [ - "13.0.3" - ], - "cvss": 8.1, - "confidence": 0.9, - "source": "concelier.overlay.v1", - "collectedAt": "2025-10-30T12:05:10Z", - "eventOffset": 3100 - } - ] -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/edges.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/edges.json deleted file mode 100644 index c03ad0e25..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/edges.json +++ /dev/null @@ -1,209 +0,0 @@ -[ - { - "kind": "CONTAINS", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "artifact_node_id": "gn:tenant-alpha:artifact:RX033HH7S6JXMY66QM51S89SX76B3JXJHWHPXPPBJCD05BR3GVXG", - "component_node_id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "sbom_digest": "sha256:sbom111" - }, - "attributes": { - "detected_by": "sbom.analyzer.nuget", - "layer_digest": "sha256:layer123", - "scope": "runtime", - "evidence_digest": "sha256:evidence001" - }, - "provenance": { - "source": "scanner.sbom.v1", - "collected_at": "2025-10-30T12:00:02Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 2100 - }, - "valid_from": "2025-10-30T12:00:02Z", - "valid_to": null, - "id": "ge:tenant-alpha:CONTAINS:EVA5N7P029VYV9W8Q7XJC0JFTEQYFSAQ6381SNVM3T1G5290XHTG", - "hash": "139e534be32f666cbd8e4fb0daee629b7b133ef8d10e98413ffc33fde59f7935" - }, - { - "kind": "DEPENDS_ON", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "component_node_id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "dependency_purl": "pkg:nuget/System.Text.Encoding.Extensions@4.7.0", - "sbom_digest": "sha256:sbom111" - }, - "attributes": { - "dependency_purl": "pkg:nuget/System.Text.Encoding.Extensions@4.7.0", - "dependency_version": "4.7.0", - "relationship": "direct", - "evidence_digest": "sha256:evidence002" - }, - "provenance": { - "source": "scanner.sbom.v1", - "collected_at": "2025-10-30T12:00:02Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 2101 - }, - "valid_from": "2025-10-30T12:00:02Z", - "valid_to": null, - "id": "ge:tenant-alpha:DEPENDS_ON:FJ7GZ9RHPKPR30XVKECD702QG20PGT3V75DY1GST8AAW9SR8TBB0", - "hash": "4caae0dff840dee840d413005f1b493936446322e8cfcecd393983184cc399c1" - }, - { - "kind": "DECLARED_IN", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "component_node_id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "file_node_id": "gn:tenant-alpha:file:M1MWHCXA66MQE8FZMPK3RNRMN7Z18H4VGWX6QTNNBKABFKRACKDG", - "sbom_digest": "sha256:sbom111" - }, - "attributes": { - "detected_by": "sbom.analyzer.nuget", - "scope": "runtime", - "evidence_digest": "sha256:evidence003" - }, - "provenance": { - "source": "scanner.layer.v1", - "collected_at": "2025-10-30T12:00:03Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 2102 - }, - "valid_from": "2025-10-30T12:00:03Z", - "valid_to": null, - "id": "ge:tenant-alpha:DECLARED_IN:T7E8NQEMKXPZ3T1SWT8HXKWAHJVS9QKD87XBKAQAAQ29CDHEA47G", - "hash": "2a2e7ba8785d75eb11feebc2df99a6a04d05ee609b36cbe0b15fa142e4c4f184" - }, - { - "kind": "BUILT_FROM", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "parent_artifact_node_id": "gn:tenant-alpha:artifact:RX033HH7S6JXMY66QM51S89SX76B3JXJHWHPXPPBJCD05BR3GVXG", - "child_artifact_digest": "sha256:base000" - }, - "attributes": { - "build_type": "https://slsa.dev/provenance/v1", - "builder_id": "builder://tekton/pipeline/default", - "attestation_digest": "sha256:attestation001" - }, - "provenance": { - "source": "scanner.provenance.v1", - "collected_at": "2025-10-30T12:00:05Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 2103 - }, - "valid_from": "2025-10-30T12:00:05Z", - "valid_to": null, - "id": "ge:tenant-alpha:BUILT_FROM:HJNKVFSDSA44HRY0XAJ0GBEVPD2S82JFF58BZVRT9QF6HB2EGPJG", - "hash": "17bdb166f4ba05406ed17ec38d460fb83bd72cec60095f0966b1d79c2a55f1de" - }, - { - "kind": "AFFECTED_BY", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "component_node_id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "advisory_node_id": "gn:tenant-alpha:advisory:RFGYXZ2TG0BF117T3HCX3XYAZFXPD72991QD0JZWDVY7FXYY87R0", - "linkset_digest": "sha256:linkset001" - }, - "attributes": { - "evidence_digest": "sha256:evidence004", - "matched_versions": [ - "13.0.3" - ], - "cvss": 8.1, - "confidence": 0.9 - }, - "provenance": { - "source": "concelier.overlay.v1", - "collected_at": "2025-10-30T12:05:10Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 3100 - }, - "valid_from": "2025-10-30T12:05:10Z", - "valid_to": null, - "id": "ge:tenant-alpha:AFFECTED_BY:1V3NRKAR6KMXAWZ89R69G8JAY3HV7DXNB16YY9X25X1TAFW9VGYG", - "hash": "45e845ee51dc2e8e8990707906bddcd3ecedf209de10b87ce8eed604dcc51ff5" - }, - { - "kind": "VEX_EXEMPTS", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "component_node_id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "vex_node_id": "gn:tenant-alpha:vex_statement:BVRF35CX6TZTHPD7YFHYTJJACPYJD86JP7C74SH07QT9JT82NDSG", - "statement_hash": "sha256:eee555" - }, - "attributes": { - "status": "not_affected", - "justification": "component not present", - "impact_statement": "Library not loaded at runtime", - "evidence_digest": "sha256:evidence005" - }, - "provenance": { - "source": "excititor.overlay.v1", - "collected_at": "2025-10-30T12:06:10Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 3200 - }, - "valid_from": "2025-10-30T12:06:10Z", - "valid_to": null, - "id": "ge:tenant-alpha:VEX_EXEMPTS:DT0BBCM9S0KJVF61KVR7D2W8DVFTKK03F3TFD4DR9DRS0T5CWZM0", - "hash": "0ae4085e510898e68ad5cb48b7385a1ae9af68fcfea9bd5c22c47d78bb1c2f2e" - }, - { - "kind": "GOVERNS_WITH", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "policy_node_id": "gn:tenant-alpha:policy_version:YZSMWHHR6Y5XR1HFRBV3H5TR6GMZVN9BPDAAVQEACV7XRYP06390", - "component_node_id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "finding_explain_hash": "sha256:explain001" - }, - "attributes": { - "verdict": "fail", - "explain_hash": "sha256:explain001", - "policy_rule_id": "rule:runtime/critical-dependency", - "evaluation_timestamp": "2025-10-30T12:07:00Z" - }, - "provenance": { - "source": "policy.engine.v1", - "collected_at": "2025-10-30T12:07:00Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 4200 - }, - "valid_from": "2025-10-30T12:07:00Z", - "valid_to": null, - "id": "ge:tenant-alpha:GOVERNS_WITH:XG3KQTYT8D4NY0BTFXWGBQY6TXR2MRYDWZBQT07T0200NQ72AFG0", - "hash": "38a05081a9b046bfd391505d47da6b7c6e3a74e114999b38a4e4e9341f2dc279" - }, - { - "kind": "OBSERVED_RUNTIME", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "runtime_node_id": "gn:tenant-alpha:runtime_context:EFVARD7VM4710F8554Q3NGH0X8W7XRF3RDARE8YJWK1H3GABX8A0", - "component_node_id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "runtime_fingerprint": "pod-abc123" - }, - "attributes": { - "process_name": "dotnet", - "entrypoint_kind": "container", - "runtime_evidence_digest": "sha256:evidence006", - "confidence": 0.8 - }, - "provenance": { - "source": "signals.runtime.v1", - "collected_at": "2025-10-30T12:15:10Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 5200 - }, - "valid_from": "2025-10-30T12:15:10Z", - "valid_to": null, - "id": "ge:tenant-alpha:OBSERVED_RUNTIME:CVV4ACPPJVHWX2NRZATB8H045F71HXT59TQHEZE2QBAQGJDK1FY0", - "hash": "15d24ebdf126b6f8947d3041f8cbb291bb66e8f595737a7c7dd2683215568367" - } -] diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/excititor-vex.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/excititor-vex.json deleted file mode 100644 index 4feb89ae7..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/excititor-vex.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "tenant": "tenant-alpha", - "source": "excititor.overlay.v1", - "collectedAt": "2025-10-30T12:06:10Z", - "eventOffset": 3200, - "statement": { - "vexSource": "vendor-x", - "statementId": "statement-789", - "status": "not_affected", - "justification": "component not present", - "impactStatement": "Library not loaded at runtime", - "issuedAt": "2025-10-27T14:30:00Z", - "expiresAt": "2026-10-27T14:30:00Z", - "contentHash": "sha256:eee555", - "provenanceSource": "excititor.vex.v1", - "collectedAt": "2025-10-30T12:06:00Z", - "eventOffset": 3302 - }, - "exemptions": [ - { - "componentPurl": "pkg:nuget/Newtonsoft.Json@13.0.3", - "componentSourceType": "inventory", - "sbomDigest": "sha256:sbom111", - "statementHash": "sha256:eee555", - "status": "not_affected", - "justification": "component not present", - "impactStatement": "Library not loaded at runtime", - "evidenceDigest": "sha256:evidence005", - "provenanceSource": "excititor.overlay.v1", - "collectedAt": "2025-10-30T12:06:10Z", - "eventOffset": 3200 - } - ] -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/linkset-snapshot.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/linkset-snapshot.json deleted file mode 100644 index 7d39322d9..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/linkset-snapshot.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - tenant: tenant-alpha, - source: concelier.overlay.v1, - linksetDigest: sha256:linkset001, - collectedAt: 2025-10-30T12:05:00Z, - eventOffset: 2201, - advisory: { - source: concelier.linkset.v1, - advisorySource: ghsa, - advisoryId: GHSA-1234-5678-90AB, - contentHash: sha256:ddd444, - severity: HIGH, - publishedAt: 2025-10-25T09:00:00Z - }, - components: [ - { - purl: pkg:nuget/Newtonsoft.Json@13.0.3, - sourceType: inventory, - sbomDigest: sha256:sbom111, - evidenceDigest: sha256:evidence004, - matchedVersions: [13.0.3], - cvss: 8.1, - confidence: 0.9, - collectedAt: 2025-10-30T12:05:10Z, - eventOffset: 3100, - source: concelier.overlay.v1 - } - ] -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/nodes.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/nodes.json deleted file mode 100644 index 5477a5bf8..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/nodes.json +++ /dev/null @@ -1,280 +0,0 @@ -[ - { - "kind": "artifact", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "artifact_digest": "sha256:aaa111", - "sbom_digest": "sha256:sbom111" - }, - "attributes": { - "display_name": "registry.example.com/team/app:1.2.3", - "artifact_digest": "sha256:aaa111", - "sbom_digest": "sha256:sbom111", - "environment": "prod", - "labels": [ - "critical", - "payments" - ], - "origin_registry": "registry.example.com", - "supply_chain_stage": "deploy" - }, - "provenance": { - "source": "scanner.sbom.v1", - "collected_at": "2025-10-30T12:00:00Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 1182 - }, - "valid_from": "2025-10-30T12:00:00Z", - "valid_to": null, - "id": "gn:tenant-alpha:artifact:RX033HH7S6JXMY66QM51S89SX76B3JXJHWHPXPPBJCD05BR3GVXG", - "hash": "891601471f7dea636ec2988966b3aee3721a1faedb7e1c8e2834355eb4e31cfd" - }, - { - "kind": "artifact", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "artifact_digest": "sha256:base000", - "sbom_digest": "sha256:sbom-base" - }, - "attributes": { - "display_name": "registry.example.com/base/runtime:2025.09", - "artifact_digest": "sha256:base000", - "sbom_digest": "sha256:sbom-base", - "environment": "prod", - "labels": [ - "base-image" - ], - "origin_registry": "registry.example.com", - "supply_chain_stage": "build" - }, - "provenance": { - "source": "scanner.sbom.v1", - "collected_at": "2025-10-22T08:00:00Z", - "sbom_digest": "sha256:sbom-base", - "event_offset": 800 - }, - "valid_from": "2025-10-22T08:00:00Z", - "valid_to": null, - "id": "gn:tenant-alpha:artifact:KD207PSJ36Q0B19CT8K8H2FQCV0HGQRNK8QWHFXE1VWAKPF9XH00", - "hash": "11593184fe6aa37a0e1d1909d4a401084a9ca452959a369590ac20d4dff77bd8" - }, - { - "kind": "component", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "purl": "pkg:nuget/Newtonsoft.Json@13.0.3", - "source_type": "inventory" - }, - "attributes": { - "purl": "pkg:nuget/Newtonsoft.Json@13.0.3", - "version": "13.0.3", - "ecosystem": "nuget", - "scope": "runtime", - "license_spdx": "MIT", - "usage": "direct" - }, - "provenance": { - "source": "scanner.sbom.v1", - "collected_at": "2025-10-30T12:00:01Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 1183 - }, - "valid_from": "2025-10-30T12:00:01Z", - "valid_to": null, - "id": "gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0", - "hash": "e4c22e7522573b746c654bb6bdd05d01db1bcd34db8b22e5e12d2e8528268786" - }, - { - "kind": "component", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "purl": "pkg:nuget/System.Text.Encoding.Extensions@4.7.0", - "source_type": "inventory" - }, - "attributes": { - "purl": "pkg:nuget/System.Text.Encoding.Extensions@4.7.0", - "version": "4.7.0", - "ecosystem": "nuget", - "scope": "runtime", - "license_spdx": "MIT", - "usage": "transitive" - }, - "provenance": { - "source": "scanner.sbom.v1", - "collected_at": "2025-10-30T12:00:01Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 1184 - }, - "valid_from": "2025-10-30T12:00:01Z", - "valid_to": null, - "id": "gn:tenant-alpha:component:FZ9EHXFFGPDQAEKAPWZ4JX5X6KYS467PJ5D1Y4T9NFFQG2SG0DV0", - "hash": "b941ff7178451b7a0403357d08ed8996e8aea1bf40032660e18406787e57ce3f" - }, - { - "kind": "file", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "artifact_digest": "sha256:aaa111", - "normalized_path": "/src/app/Program.cs", - "content_sha256": "sha256:bbb222" - }, - "attributes": { - "normalized_path": "/src/app/Program.cs", - "content_sha256": "sha256:bbb222", - "language_hint": "csharp", - "size_bytes": 3472, - "scope": "build" - }, - "provenance": { - "source": "scanner.layer.v1", - "collected_at": "2025-10-30T12:00:02Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 1185 - }, - "valid_from": "2025-10-30T12:00:02Z", - "valid_to": null, - "id": "gn:tenant-alpha:file:M1MWHCXA66MQE8FZMPK3RNRMN7Z18H4VGWX6QTNNBKABFKRACKDG", - "hash": "a0a7e7b6ff4a8357bea3273e38b3a3d801531a4f6b716513b7d4972026db3a76" - }, - { - "kind": "license", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "license_spdx": "Apache-2.0", - "source_digest": "sha256:ccc333" - }, - "attributes": { - "license_spdx": "Apache-2.0", - "name": "Apache License 2.0", - "classification": "permissive", - "notice_uri": "https://www.apache.org/licenses/LICENSE-2.0" - }, - "provenance": { - "source": "scanner.sbom.v1", - "collected_at": "2025-10-30T12:00:03Z", - "sbom_digest": "sha256:sbom111", - "event_offset": 1186 - }, - "valid_from": "2025-10-30T12:00:03Z", - "valid_to": null, - "id": "gn:tenant-alpha:license:7SDDWTRKXYG9MBK89X7JFMAQRBEZHV1NFZNSN2PBRZT5H0FHZB90", - "hash": "790f1d803dd35d9f77b08977e4dd3fc9145218ee7c68524881ee13b7a2e9ede8" - }, - { - "tenant": "tenant-alpha", - "kind": "advisory", - "canonical_key": { - "advisory_id": "GHSA-1234-5678-90AB", - "advisory_source": "ghsa", - "content_hash": "sha256:ddd444", - "tenant": "tenant-alpha" - }, - "attributes": { - "advisory_source": "ghsa", - "advisory_id": "GHSA-1234-5678-90AB", - "severity": "HIGH", - "published_at": "2025-10-25T09:00:00Z", - "content_hash": "sha256:ddd444", - "linkset_digest": "sha256:linkset001" - }, - "provenance": { - "source": "concelier.linkset.v1", - "collected_at": "2025-10-30T12:05:10Z", - "sbom_digest": null, - "event_offset": 3100 - }, - "valid_from": "2025-10-25T09:00:00Z", - "valid_to": null, - "id": "gn:tenant-alpha:advisory:RFGYXZ2TG0BF117T3HCX3XYAZFXPD72991QD0JZWDVY7FXYY87R0", - "hash": "df4b4087dc6bf4c8b071ce808b97025036a6d33d30ea538a279a4f55ed7ffb8e" - }, - { - "tenant": "tenant-alpha", - "kind": "vex_statement", - "canonical_key": { - "content_hash": "sha256:eee555", - "statement_id": "statement-789", - "tenant": "tenant-alpha", - "vex_source": "vendor-x" - }, - "attributes": { - "status": "not_affected", - "statement_id": "statement-789", - "justification": "component not present", - "issued_at": "2025-10-27T14:30:00Z", - "expires_at": "2026-10-27T14:30:00Z", - "content_hash": "sha256:eee555" - }, - "provenance": { - "source": "excititor.vex.v1", - "collected_at": "2025-10-30T12:06:00Z", - "sbom_digest": null, - "event_offset": 3302 - }, - "valid_from": "2025-10-27T14:30:00Z", - "valid_to": null, - "id": "gn:tenant-alpha:vex_statement:BVRF35CX6TZTHPD7YFHYTJJACPYJD86JP7C74SH07QT9JT82NDSG", - "hash": "4b613e2b8460c542597bbc70b8ba3e6796c3e1d261d0c74ce30fba42f7681f25" - }, - { - "kind": "policy_version", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "policy_pack_digest": "sha256:fff666", - "effective_from": "2025-10-28T00:00:00Z" - }, - "attributes": { - "policy_pack_digest": "sha256:fff666", - "policy_name": "Default Runtime Policy", - "effective_from": "2025-10-28T00:00:00Z", - "expires_at": "2026-01-01T00:00:00Z", - "explain_hash": "sha256:explain001" - }, - "provenance": { - "source": "policy.engine.v1", - "collected_at": "2025-10-28T00:00:05Z", - "sbom_digest": null, - "event_offset": 4100 - }, - "valid_from": "2025-10-28T00:00:00Z", - "valid_to": "2026-01-01T00:00:00Z", - "id": "gn:tenant-alpha:policy_version:YZSMWHHR6Y5XR1HFRBV3H5TR6GMZVN9BPDAAVQEACV7XRYP06390", - "hash": "a8539c4d611535c3afcfd406a08208ab3bbfc81f6e31f87dd727b7d8bd9c4209" - }, - { - "kind": "runtime_context", - "tenant": "tenant-alpha", - "canonical_key": { - "tenant": "tenant-alpha", - "runtime_fingerprint": "pod-abc123", - "collector": "zastava.v1", - "observed_at": "2025-10-30T12:15:00Z" - }, - "attributes": { - "runtime_fingerprint": "pod-abc123", - "collector": "zastava.v1", - "observed_at": "2025-10-30T12:15:00Z", - "cluster": "prod-cluster-1", - "namespace": "payments", - "workload_kind": "deployment", - "runtime_state": "Running" - }, - "provenance": { - "source": "signals.runtime.v1", - "collected_at": "2025-10-30T12:15:05Z", - "sbom_digest": null, - "event_offset": 5109 - }, - "valid_from": "2025-10-30T12:15:00Z", - "valid_to": null, - "id": "gn:tenant-alpha:runtime_context:EFVARD7VM4710F8554Q3NGH0X8W7XRF3RDARE8YJWK1H3GABX8A0", - "hash": "0294c4131ba98d52674ca31a409488b73f47a193cf3a13cede8671e6112a5a29" - } -] diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/policy-overlay.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/policy-overlay.json deleted file mode 100644 index 11ccab0f2..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/policy-overlay.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "tenant": "tenant-alpha", - "source": "policy.engine.v1", - "collectedAt": "2025-10-30T12:07:00Z", - "eventOffset": 4200, - "policy": { - "source": "policy.engine.v1", - "policyPackDigest": "sha256:fff666", - "policyName": "Default Runtime Policy", - "effectiveFrom": "2025-10-28T00:00:00Z", - "expiresAt": "2026-01-01T00:00:00Z", - "explainHash": "sha256:explain001", - "collectedAt": "2025-10-28T00:00:05Z", - "eventOffset": 4100 - }, - "evaluations": [ - { - "componentPurl": "pkg:nuget/Newtonsoft.Json@13.0.3", - "componentSourceType": "inventory", - "findingExplainHash": "sha256:explain001", - "explainHash": "sha256:explain001", - "policyRuleId": "rule:runtime/critical-dependency", - "verdict": "fail", - "evaluationTimestamp": "2025-10-30T12:07:00Z", - "sbomDigest": "sha256:sbom111", - "source": "policy.engine.v1", - "collectedAt": "2025-10-30T12:07:00Z", - "eventOffset": 4200 - } - ] -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/sbom-snapshot.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/sbom-snapshot.json deleted file mode 100644 index b8c0473bb..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/sbom-snapshot.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "tenant": "tenant-alpha", - "source": "scanner.sbom.v1", - "artifactDigest": "sha256:aaa111", - "sbomDigest": "sha256:sbom111", - "collectedAt": "2025-10-30T12:00:00Z", - "eventOffset": 1182, - "artifact": { - "displayName": "registry.example.com/team/app:1.2.3", - "environment": "prod", - "labels": [ - "critical", - "payments" - ], - "originRegistry": "registry.example.com", - "supplyChainStage": "deploy" - }, - "build": { - "builderId": "builder://tekton/pipeline/default", - "buildType": "https://slsa.dev/provenance/v1", - "attestationDigest": "sha256:attestation001", - "source": "scanner.provenance.v1", - "collectedAt": "2025-10-30T12:00:05Z", - "eventOffset": 2103 - }, - "components": [ - { - "purl": "pkg:nuget/Newtonsoft.Json@13.0.3", - "version": "13.0.3", - "ecosystem": "nuget", - "scope": "runtime", - "license": { - "spdx": "MIT", - "name": "MIT License", - "classification": "permissive", - "noticeUri": "https://opensource.org/licenses/MIT", - "sourceDigest": "sha256:ccc333" - }, - "usage": "direct", - "detectedBy": "sbom.analyzer.nuget", - "layerDigest": "sha256:layer123", - "evidenceDigest": "sha256:evidence001", - "collectedAt": "2025-10-30T12:00:01Z", - "eventOffset": 1183, - "source": "scanner.sbom.v1", - "files": [ - { - "path": "/src/app/Program.cs", - "contentSha256": "sha256:bbb222", - "languageHint": "csharp", - "sizeBytes": 3472, - "scope": "build", - "detectedBy": "sbom.analyzer.nuget", - "evidenceDigest": "sha256:evidence003", - "collectedAt": "2025-10-30T12:00:02Z", - "eventOffset": 1185, - "source": "scanner.layer.v1" - } - ], - "dependencies": [ - { - "purl": "pkg:nuget/System.Text.Encoding.Extensions@4.7.0", - "version": "4.7.0", - "relationship": "direct", - "evidenceDigest": "sha256:evidence002", - "collectedAt": "2025-10-30T12:00:01Z", - "eventOffset": 1183 - } - ] - }, - { - "purl": "pkg:nuget/System.Text.Encoding.Extensions@4.7.0", - "version": "4.7.0", - "ecosystem": "nuget", - "scope": "runtime", - "license": { - "spdx": "MIT", - "name": "MIT License", - "classification": "permissive", - "noticeUri": "https://opensource.org/licenses/MIT", - "sourceDigest": "sha256:ccc333" - }, - "usage": "transitive", - "detectedBy": "sbom.analyzer.nuget", - "layerDigest": "sha256:layer123", - "evidenceDigest": "sha256:evidence001", - "collectedAt": "2025-10-30T12:00:01Z", - "eventOffset": 1184, - "source": "scanner.sbom.v1", - "files": [], - "dependencies": [] - } - ], - "baseArtifacts": [ - { - "artifactDigest": "sha256:base000", - "sbomDigest": "sha256:sbom-base", - "displayName": "registry.example.com/base/runtime:2025.09", - "environment": "prod", - "labels": [ - "base-image" - ], - "originRegistry": "registry.example.com", - "supplyChainStage": "build", - "collectedAt": "2025-10-22T08:00:00Z", - "eventOffset": 800, - "source": "scanner.sbom.v1" - } - ] -} \ No newline at end of file diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/schema-matrix.json b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/schema-matrix.json deleted file mode 100644 index fc09c8836..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/Fixtures/v1/schema-matrix.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "version": "v1", - "nodes": { - "artifact": [ - "display_name", - "artifact_digest", - "sbom_digest", - "environment", - "labels", - "origin_registry", - "supply_chain_stage" - ], - "component": [ - "purl", - "version", - "ecosystem", - "scope", - "license_spdx", - "usage" - ], - "file": [ - "normalized_path", - "content_sha256", - "language_hint", - "size_bytes", - "scope" - ], - "license": [ - "license_spdx", - "name", - "classification", - "notice_uri" - ], - "advisory": [ - "advisory_source", - "advisory_id", - "severity", - "published_at", - "content_hash", - "linkset_digest" - ], - "vex_statement": [ - "status", - "statement_id", - "justification", - "issued_at", - "expires_at", - "content_hash" - ], - "policy_version": [ - "policy_pack_digest", - "policy_name", - "effective_from", - "expires_at", - "explain_hash" - ], - "runtime_context": [ - "runtime_fingerprint", - "collector", - "observed_at", - "cluster", - "namespace", - "workload_kind", - "runtime_state" - ] - }, - "edges": { - "CONTAINS": [ - "detected_by", - "layer_digest", - "scope", - "evidence_digest" - ], - "DEPENDS_ON": [ - "dependency_purl", - "dependency_version", - "relationship", - "evidence_digest" - ], - "DECLARED_IN": [ - "detected_by", - "scope", - "evidence_digest" - ], - "BUILT_FROM": [ - "build_type", - "builder_id", - "attestation_digest" - ], - "AFFECTED_BY": [ - "evidence_digest", - "matched_versions", - "cvss", - "confidence" - ], - "VEX_EXEMPTS": [ - "status", - "justification", - "impact_statement", - "evidence_digest" - ], - "GOVERNS_WITH": [ - "verdict", - "explain_hash", - "policy_rule_id", - "evaluation_timestamp" - ], - "OBSERVED_RUNTIME": [ - "process_name", - "entrypoint_kind", - "runtime_evidence_digest", - "confidence" - ] - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/GraphIdentityTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/GraphIdentityTests.cs deleted file mode 100644 index f48f07ed9..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/GraphIdentityTests.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System.Text.Json; -using System.Text.Json.Nodes; -using FluentAssertions; -using StellaOps.Graph.Indexer.Schema; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class GraphIdentityTests -{ - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void NodeIds_are_stable() - { - var nodes = LoadArray("nodes.json"); - - foreach (var node in nodes.Cast()) - { - var tenant = node["tenant"]!.GetValue(); - var kind = node["kind"]!.GetValue(); - var canonicalKey = (JsonObject)node["canonical_key"]!; - var tuple = GraphIdentity.ExtractIdentityTuple(canonicalKey); - - var expectedId = node["id"]!.GetValue(); - var actualId = GraphIdentity.ComputeNodeId(tenant, kind, tuple); - - actualId.Should() - .Be(expectedId, $"node {kind} with canonical tuple {canonicalKey.ToJsonString()} must have deterministic id"); - - var documentClone = JsonNode.Parse(node.ToJsonString())!.AsObject(); - documentClone.Remove("hash"); - - var expectedHash = node["hash"]!.GetValue(); - var actualHash = GraphIdentity.ComputeDocumentHash(documentClone); - - actualHash.Should() - .Be(expectedHash, $"node {kind}:{expectedId} must have deterministic document hash"); - } - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void EdgeIds_are_stable() - { - var edges = LoadArray("edges.json"); - - foreach (var edge in edges.Cast()) - { - var tenant = edge["tenant"]!.GetValue(); - var kind = edge["kind"]!.GetValue(); - var canonicalKey = (JsonObject)edge["canonical_key"]!; - var tuple = GraphIdentity.ExtractIdentityTuple(canonicalKey); - - var expectedId = edge["id"]!.GetValue(); - var actualId = GraphIdentity.ComputeEdgeId(tenant, kind, tuple); - - actualId.Should() - .Be(expectedId, $"edge {kind} with canonical tuple {canonicalKey.ToJsonString()} must have deterministic id"); - - var documentClone = JsonNode.Parse(edge.ToJsonString())!.AsObject(); - documentClone.Remove("hash"); - - var expectedHash = edge["hash"]!.GetValue(); - var actualHash = GraphIdentity.ComputeDocumentHash(documentClone); - - actualHash.Should() - .Be(expectedHash, $"edge {kind}:{expectedId} must have deterministic document hash"); - } - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void AttributeCoverage_matches_matrix() - { - var matrix = LoadObject("schema-matrix.json"); - var nodeExpectations = (JsonObject)matrix["nodes"]!; - var edgeExpectations = (JsonObject)matrix["edges"]!; - - var nodes = LoadArray("nodes.json"); - foreach (var node in nodes.Cast()) - { - var kind = node["kind"]!.GetValue(); - var expectedAttributes = nodeExpectations[kind]!.AsArray().Select(x => x!.GetValue()).OrderBy(x => x, StringComparer.Ordinal).ToArray(); - var actualAttributes = ((JsonObject)node["attributes"]!).Select(pair => pair.Key).OrderBy(x => x, StringComparer.Ordinal).ToArray(); - - actualAttributes.Should() - .Equal(expectedAttributes, $"node kind {kind} must align with schema matrix"); - } - - var edges = LoadArray("edges.json"); - foreach (var edge in edges.Cast()) - { - var kind = edge["kind"]!.GetValue(); - var expectedAttributes = edgeExpectations[kind]!.AsArray().Select(x => x!.GetValue()).OrderBy(x => x, StringComparer.Ordinal).ToArray(); - var actualAttributes = ((JsonObject)edge["attributes"]!).Select(pair => pair.Key).OrderBy(x => x, StringComparer.Ordinal).ToArray(); - - actualAttributes.Should() - .Equal(expectedAttributes, $"edge kind {kind} must align with schema matrix"); - } - } - - private static JsonArray LoadArray(string fileName) - => (JsonArray)JsonNode.Parse(File.ReadAllText(GetFixturePath(fileName)))!; - - private static JsonObject LoadObject(string fileName) - => (JsonObject)JsonNode.Parse(File.ReadAllText(GetFixturePath(fileName)))!; - - private static string GetFixturePath(string fileName) - => Path.Combine(FixturesRoot, fileName); -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/GraphSnapshotBuilderTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/GraphSnapshotBuilderTests.cs deleted file mode 100644 index 4d6707f68..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/GraphSnapshotBuilderTests.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Nodes; -using FluentAssertions; -using StellaOps.Graph.Indexer.Documents; -using StellaOps.Graph.Indexer.Ingestion.Advisory; -using StellaOps.Graph.Indexer.Ingestion.Policy; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using StellaOps.Graph.Indexer.Ingestion.Vex; -using StellaOps.Graph.Indexer.Schema; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class GraphSnapshotBuilderTests -{ - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Build_creates_manifest_and_adjacency_with_lineage() - { - var sbomSnapshot = Load("sbom-snapshot.json"); - var linksetSnapshot = Load("concelier-linkset.json"); - var vexSnapshot = Load("excititor-vex.json"); - var policySnapshot = Load("policy-overlay.json"); - - var sbomBatch = new SbomIngestTransformer().Transform(sbomSnapshot); - var advisoryBatch = new AdvisoryLinksetTransformer().Transform(linksetSnapshot); - var vexBatch = new VexOverlayTransformer().Transform(vexSnapshot); - var policyBatch = new PolicyOverlayTransformer().Transform(policySnapshot); - - var combinedBatch = MergeBatches(sbomBatch, advisoryBatch, vexBatch, policyBatch); - - var builder = new GraphSnapshotBuilder(); - var generatedAt = DateTimeOffset.Parse("2025-10-30T12:06:30Z"); - - var snapshot = builder.Build(sbomSnapshot, combinedBatch, generatedAt); - - snapshot.Manifest.Tenant.Should().Be("tenant-alpha"); - snapshot.Manifest.ArtifactDigest.Should().Be("sha256:aaa111"); - snapshot.Manifest.SbomDigest.Should().Be("sha256:sbom111"); - snapshot.Manifest.GeneratedAt.Should().Be(generatedAt); - snapshot.Manifest.NodeCount.Should().Be(combinedBatch.Nodes.Length); - snapshot.Manifest.EdgeCount.Should().Be(combinedBatch.Edges.Length); - snapshot.Manifest.Files.Nodes.Should().Be("nodes.jsonl"); - snapshot.Manifest.Files.Edges.Should().Be("edges.jsonl"); - snapshot.Manifest.Files.Adjacency.Should().Be("adjacency.json"); - - snapshot.Manifest.Lineage.DerivedFromSbomDigests.Should().BeEquivalentTo(new[] { "sha256:sbom-base" }, options => options.WithStrictOrdering()); - snapshot.Manifest.Lineage.BaseArtifactDigests.Should().BeEquivalentTo(new[] { "sha256:base000" }, options => options.WithStrictOrdering()); - snapshot.Manifest.Lineage.SourceSnapshotId.Should().BeNull(); - - var manifestJson = snapshot.Manifest.ToJson(); - manifestJson.Should().NotBeNull(); - manifestJson["hash"]!.GetValue().Should().Be(snapshot.Manifest.Hash); - - var manifestWithoutHash = (JsonObject)manifestJson.DeepClone(); - manifestWithoutHash.Remove("hash"); - var expectedManifestHash = GraphIdentity.ComputeDocumentHash(manifestWithoutHash); - snapshot.Manifest.Hash.Should().Be(expectedManifestHash); - - var adjacency = snapshot.Adjacency; - adjacency.Tenant.Should().Be("tenant-alpha"); - adjacency.SnapshotId.Should().Be(snapshot.Manifest.SnapshotId); - adjacency.GeneratedAt.Should().Be(generatedAt); - - var adjacencyNodes = adjacency.Nodes.ToDictionary(node => node.NodeId, StringComparer.Ordinal); - adjacencyNodes.Should().ContainKey("gn:tenant-alpha:artifact:RX033HH7S6JXMY66QM51S89SX76B3JXJHWHPXPPBJCD05BR3GVXG"); - - var artifactAdjacency = adjacencyNodes["gn:tenant-alpha:artifact:RX033HH7S6JXMY66QM51S89SX76B3JXJHWHPXPPBJCD05BR3GVXG"]; - artifactAdjacency.OutgoingEdges.Should().BeEquivalentTo(new[] - { - "ge:tenant-alpha:BUILT_FROM:HJNKVFSDSA44HRY0XAJ0GBEVPD2S82JFF58BZVRT9QF6HB2EGPJG", - "ge:tenant-alpha:CONTAINS:EVA5N7P029VYV9W8Q7XJC0JFTEQYFSAQ6381SNVM3T1G5290XHTG" - }, options => options.WithStrictOrdering()); - artifactAdjacency.IncomingEdges.Should().BeEmpty(); - - var componentAdjacency = adjacencyNodes["gn:tenant-alpha:component:BQSZFXSPNGS6M8XEQZ6XX3E7775XZQABM301GFPFXCQSQSA1WHZ0"]; - componentAdjacency.IncomingEdges.Should().BeEquivalentTo(new[] - { - "ge:tenant-alpha:CONTAINS:EVA5N7P029VYV9W8Q7XJC0JFTEQYFSAQ6381SNVM3T1G5290XHTG", - "ge:tenant-alpha:GOVERNS_WITH:XG3KQTYT8D4NY0BTFXWGBQY6TXR2MRYDWZBQT07T0200NQ72AFG0" - }); - componentAdjacency.OutgoingEdges.Should().BeEquivalentTo(new[] - { - "ge:tenant-alpha:DEPENDS_ON:FJ7GZ9RHPKPR30XVKECD702QG20PGT3V75DY1GST8AAW9SR8TBB0", - "ge:tenant-alpha:DECLARED_IN:T7E8NQEMKXPZ3T1SWT8HXKWAHJVS9QKD87XBKAQAAQ29CDHEA47G", - "ge:tenant-alpha:AFFECTED_BY:1V3NRKAR6KMXAWZ89R69G8JAY3HV7DXNB16YY9X25X1TAFW9VGYG", - "ge:tenant-alpha:VEX_EXEMPTS:DT0BBCM9S0KJVF61KVR7D2W8DVFTKK03F3TFD4DR9DRS0T5CWZM0" - }); - - var dependencyComponent = adjacencyNodes["gn:tenant-alpha:component:FZ9EHXFFGPDQAEKAPWZ4JX5X6KYS467PJ5D1Y4T9NFFQG2SG0DV0"]; - dependencyComponent.IncomingEdges.Should().BeEquivalentTo(new[] - { - "ge:tenant-alpha:DEPENDS_ON:FJ7GZ9RHPKPR30XVKECD702QG20PGT3V75DY1GST8AAW9SR8TBB0" - }); - dependencyComponent.OutgoingEdges.Should().BeEmpty(); - - adjacency.Nodes.Length.Should().Be(combinedBatch.Nodes.Length); - } - - private static GraphBuildBatch MergeBatches(params GraphBuildBatch[] batches) - { - var nodes = new Dictionary(StringComparer.Ordinal); - var edges = new Dictionary(StringComparer.Ordinal); - - foreach (var batch in batches) - { - foreach (var node in batch.Nodes) - { - nodes[node["id"]!.GetValue()] = node; - } - - foreach (var edge in batch.Edges) - { - edges[edge["id"]!.GetValue()] = edge; - } - } - - var orderedNodes = nodes.Values - .OrderBy(node => node["kind"]!.GetValue(), StringComparer.Ordinal) - .ThenBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToImmutableArray(); - - var orderedEdges = edges.Values - .OrderBy(edge => edge["kind"]!.GetValue(), StringComparer.Ordinal) - .ThenBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToImmutableArray(); - - return new GraphBuildBatch(orderedNodes, orderedEdges); - } - - private static T Load(string fixtureFile) - { - var path = Path.Combine(FixturesRoot, fixtureFile); - var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - })!; - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/PolicyOverlayProcessorTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/PolicyOverlayProcessorTests.cs deleted file mode 100644 index 900cf55f7..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/PolicyOverlayProcessorTests.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Graph.Indexer.Ingestion.Policy; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class PolicyOverlayProcessorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ProcessAsync_persists_overlay_and_records_success_metrics() - { - var snapshot = CreateSnapshot(); - var transformer = new PolicyOverlayTransformer(); - var writer = new CaptureWriter(); - var metrics = new CaptureMetrics(); - var processor = new PolicyOverlayProcessor( - transformer, - writer, - metrics, - NullLogger.Instance); - - await processor.ProcessAsync(snapshot, CancellationToken.None); - - writer.LastBatch.Should().NotBeNull(); - metrics.LastRecord.Should().NotBeNull(); - metrics.LastRecord!.Success.Should().BeTrue(); - metrics.LastRecord.NodeCount.Should().Be(writer.LastBatch!.Nodes.Length); - metrics.LastRecord.EdgeCount.Should().Be(writer.LastBatch!.Edges.Length); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ProcessAsync_records_failure_when_writer_throws() - { - var snapshot = CreateSnapshot(); - var transformer = new PolicyOverlayTransformer(); - var writer = new CaptureWriter(shouldThrow: true); - var metrics = new CaptureMetrics(); - var processor = new PolicyOverlayProcessor( - transformer, - writer, - metrics, - NullLogger.Instance); - - var act = () => processor.ProcessAsync(snapshot, CancellationToken.None); - - await act.Should().ThrowAsync(); - metrics.LastRecord.Should().NotBeNull(); - metrics.LastRecord!.Success.Should().BeFalse(); - } - - private static PolicyOverlaySnapshot CreateSnapshot() - { - return new PolicyOverlaySnapshot - { - Tenant = "tenant-alpha", - Source = "policy.engine.v1", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:07:00Z"), - EventOffset = 4200, - Policy = new PolicyVersionDetails - { - Source = "policy.engine.v1", - PolicyPackDigest = "sha256:fff666", - PolicyName = "Default Runtime Policy", - EffectiveFrom = DateTimeOffset.Parse("2025-10-28T00:00:00Z"), - ExpiresAt = DateTimeOffset.Parse("2026-01-01T00:00:00Z"), - ExplainHash = "sha256:explain001", - CollectedAt = DateTimeOffset.Parse("2025-10-28T00:00:05Z"), - EventOffset = 4100 - }, - Evaluations = new[] - { - new PolicyEvaluation - { - ComponentPurl = "pkg:nuget/Newtonsoft.Json@13.0.3", - ComponentSourceType = "inventory", - FindingExplainHash = "sha256:explain001", - ExplainHash = "sha256:explain001", - PolicyRuleId = "rule:runtime/critical-dependency", - Verdict = "fail", - EvaluationTimestamp = DateTimeOffset.Parse("2025-10-30T12:07:00Z"), - SbomDigest = "sha256:sbom111", - Source = "policy.engine.v1", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:07:00Z"), - EventOffset = 4200 - } - } - }; - } - - private sealed class CaptureWriter : IGraphDocumentWriter - { - private readonly bool _shouldThrow; - - public CaptureWriter(bool shouldThrow = false) - { - _shouldThrow = shouldThrow; - } - - public GraphBuildBatch? LastBatch { get; private set; } - - public Task WriteAsync(GraphBuildBatch batch, CancellationToken cancellationToken) - { - LastBatch = batch; - - if (_shouldThrow) - { - throw new InvalidOperationException("Simulated persistence failure"); - } - - return Task.CompletedTask; - } - } - - private sealed class CaptureMetrics : IPolicyOverlayMetrics - { - public MetricRecord? LastRecord { get; private set; } - - public void RecordBatch(string source, string tenant, int nodeCount, int edgeCount, TimeSpan duration, bool success) - { - LastRecord = new MetricRecord(source, tenant, nodeCount, edgeCount, duration, success); - } - } - - private sealed record MetricRecord( - string Source, - string Tenant, - int NodeCount, - int EdgeCount, - TimeSpan Duration, - bool Success); -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/PolicyOverlayTransformerTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/PolicyOverlayTransformerTests.cs deleted file mode 100644 index 544436a0c..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/PolicyOverlayTransformerTests.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Nodes; -using FluentAssertions; -using StellaOps.Graph.Indexer.Ingestion.Policy; -using Xunit; -using Xunit.Abstractions; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class PolicyOverlayTransformerTests -{ - private readonly ITestOutputHelper _output; - - public PolicyOverlayTransformerTests(ITestOutputHelper output) - { - _output = output; - } - - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - private static readonly HashSet ExpectedNodeKinds = new(StringComparer.Ordinal) - { - "policy_version" - }; - - private static readonly HashSet ExpectedEdgeKinds = new(StringComparer.Ordinal) - { - "GOVERNS_WITH" - }; - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Transform_projects_policy_nodes_and_governs_with_edges() - { - var snapshot = LoadSnapshot("policy-overlay.json"); - var transformer = new PolicyOverlayTransformer(); - - var batch = transformer.Transform(snapshot); - - var expectedNodes = LoadArray("nodes.json") - .Cast() - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var expectedEdges = LoadArray("edges.json") - .Cast() - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualNodes = batch.Nodes - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualEdges = batch.Edges - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - actualNodes.Length.Should().Be(expectedNodes.Length); - actualEdges.Length.Should().Be(expectedEdges.Length); - - for (var i = 0; i < expectedNodes.Length; i++) - { - if (!JsonNode.DeepEquals(expectedNodes[i], actualNodes[i])) - { - _output.WriteLine($"Expected Node: {expectedNodes[i]}"); - _output.WriteLine($"Actual Node: {actualNodes[i]}"); - } - - JsonNode.DeepEquals(expectedNodes[i], actualNodes[i]).Should().BeTrue(); - } - - for (var i = 0; i < expectedEdges.Length; i++) - { - if (!JsonNode.DeepEquals(expectedEdges[i], actualEdges[i])) - { - _output.WriteLine($"Expected Edge: {expectedEdges[i]}"); - _output.WriteLine($"Actual Edge: {actualEdges[i]}"); - } - - JsonNode.DeepEquals(expectedEdges[i], actualEdges[i]).Should().BeTrue(); - } - } - - private static PolicyOverlaySnapshot LoadSnapshot(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - })!; - } - - private static JsonArray LoadArray(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - return (JsonArray)JsonNode.Parse(File.ReadAllText(path))!; - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/README.md b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/README.md deleted file mode 100644 index 1703cb195..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# StellaOps Graph Indexer Tests - -The Graph Indexer tests now run entirely in-memory and no longer require MongoDB. -No special environment variables are needed to execute the suite locally or in CI. diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestProcessorTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestProcessorTests.cs deleted file mode 100644 index 9019133df..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestProcessorTests.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class SbomIngestProcessorTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ProcessAsync_writes_batch_and_records_success_metrics() - { - var snapshot = CreateSnapshot(); - var transformer = new SbomIngestTransformer(); - var writer = new CaptureWriter(); - var metrics = new CaptureMetrics(); - var snapshotExporter = new CaptureSnapshotExporter(); - var processor = new SbomIngestProcessor(transformer, writer, metrics, snapshotExporter, NullLogger.Instance); - - await processor.ProcessAsync(snapshot, CancellationToken.None); - - writer.LastBatch.Should().NotBeNull(); - metrics.LastRecord.Should().NotBeNull(); - metrics.LastRecord!.Success.Should().BeTrue(); - metrics.LastRecord.NodeCount.Should().Be(writer.LastBatch!.Nodes.Length); - metrics.LastRecord.EdgeCount.Should().Be(writer.LastBatch!.Edges.Length); - snapshotExporter.LastSnapshot.Should().BeSameAs(snapshot); - snapshotExporter.LastBatch.Should().BeSameAs(writer.LastBatch); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ProcessAsync_records_failure_when_writer_throws() - { - var snapshot = CreateSnapshot(); - var transformer = new SbomIngestTransformer(); - var writer = new CaptureWriter(shouldThrow: true); - var metrics = new CaptureMetrics(); - var snapshotExporter = new CaptureSnapshotExporter(); - var processor = new SbomIngestProcessor(transformer, writer, metrics, snapshotExporter, NullLogger.Instance); - - var act = () => processor.ProcessAsync(snapshot, CancellationToken.None); - - await act.Should().ThrowAsync(); - metrics.LastRecord.Should().NotBeNull(); - metrics.LastRecord!.Success.Should().BeFalse(); - snapshotExporter.LastSnapshot.Should().BeNull(); - snapshotExporter.LastBatch.Should().BeNull(); - } - - private static SbomSnapshot CreateSnapshot() - { - return new SbomSnapshot - { - Tenant = "tenant-alpha", - Source = "scanner.sbom.v1", - ArtifactDigest = "sha256:test-artifact", - SbomDigest = "sha256:test-sbom", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:00:00Z"), - EventOffset = 1000, - Artifact = new SbomArtifactMetadata - { - DisplayName = "registry.example.com/app:latest", - Environment = "prod", - Labels = new[] { "demo" }, - OriginRegistry = "registry.example.com", - SupplyChainStage = "deploy" - }, - Build = new SbomBuildMetadata - { - BuilderId = "builder://tekton/default", - BuildType = "https://slsa.dev/provenance/v1", - AttestationDigest = "sha256:attestation", - Source = "scanner.build.v1", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:00:05Z"), - EventOffset = 2000 - }, - Components = new[] - { - new SbomComponent - { - Purl = "pkg:nuget/Example.Primary@1.0.0", - Version = "1.0.0", - Ecosystem = "nuget", - Scope = "runtime", - License = new SbomLicense - { - Spdx = "MIT", - Name = "MIT License", - Classification = "permissive", - SourceDigest = "sha256:license001" - }, - Usage = "direct", - DetectedBy = "sbom.analyzer.transformer", - LayerDigest = "sha256:layer", - EvidenceDigest = "sha256:evidence", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:00:01Z"), - EventOffset = 1201, - Source = "scanner.component.v1", - Files = new[] - { - new SbomComponentFile - { - Path = "/src/app/Program.cs", - ContentSha256 = "sha256:file", - LanguageHint = "csharp", - SizeBytes = 1024, - Scope = "build", - DetectedBy = "sbom.analyzer.transformer", - EvidenceDigest = "sha256:file-evidence", - CollectedAt = DateTimeOffset.Parse("2025-10-30T12:00:02Z"), - EventOffset = 1202, - Source = "scanner.layer.v1" - } - }, - Dependencies = Array.Empty(), - SourceType = "inventory" - } - }, - BaseArtifacts = new[] - { - new SbomBaseArtifact - { - ArtifactDigest = "sha256:base", - SbomDigest = "sha256:base-sbom", - DisplayName = "registry.example.com/base:2025.09", - Environment = "prod", - Labels = new[] { "base-image" }, - OriginRegistry = "registry.example.com", - SupplyChainStage = "build", - CollectedAt = DateTimeOffset.Parse("2025-10-22T08:00:00Z"), - EventOffset = 800, - Source = "scanner.sbom.v1" - } - } - }; - } - - private sealed class CaptureWriter : IGraphDocumentWriter - { - private readonly bool _shouldThrow; - - public CaptureWriter(bool shouldThrow = false) - { - _shouldThrow = shouldThrow; - } - - public GraphBuildBatch? LastBatch { get; private set; } - - public Task WriteAsync(GraphBuildBatch batch, CancellationToken cancellationToken) - { - LastBatch = batch; - - if (_shouldThrow) - { - throw new InvalidOperationException("Simulated persistence failure"); - } - - return Task.CompletedTask; - } - } - - private sealed class CaptureMetrics : ISbomIngestMetrics - { - public MetricRecord? LastRecord { get; private set; } - - public void RecordBatch(string source, string tenant, int nodeCount, int edgeCount, TimeSpan duration, bool success) - { - LastRecord = new MetricRecord(source, tenant, nodeCount, edgeCount, duration, success); - } - } - - private sealed class CaptureSnapshotExporter : ISbomSnapshotExporter - { - public SbomSnapshot? LastSnapshot { get; private set; } - public GraphBuildBatch? LastBatch { get; private set; } - - public Task ExportAsync(SbomSnapshot snapshot, GraphBuildBatch batch, CancellationToken cancellationToken) - { - LastSnapshot = snapshot; - LastBatch = batch; - return Task.CompletedTask; - } - } - - private sealed record MetricRecord( - string Source, - string Tenant, - int NodeCount, - int EdgeCount, - TimeSpan Duration, - bool Success); -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestServiceCollectionExtensionsTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestServiceCollectionExtensionsTests.cs deleted file mode 100644 index b96d821e3..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestServiceCollectionExtensionsTests.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.IO; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using Xunit; - - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class SbomIngestServiceCollectionExtensionsTests : IDisposable -{ - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - private readonly string _tempDirectory; - - public SbomIngestServiceCollectionExtensionsTests() - { - _tempDirectory = Path.Combine(Path.GetTempPath(), $"graph-indexer-{Guid.NewGuid():N}"); - Directory.CreateDirectory(_tempDirectory); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task AddSbomIngestPipeline_exports_snapshots_to_configured_directory() - { - var services = new ServiceCollection(); - services.AddSingleton(); - services.AddSbomIngestPipeline(options => options.SnapshotRootDirectory = _tempDirectory); - - using var provider = services.BuildServiceProvider(); - var processor = provider.GetRequiredService(); - - var snapshot = LoadSnapshot(); - await processor.ProcessAsync(snapshot, CancellationToken.None); - - AssertSnapshotOutputs(_tempDirectory); - - var writer = provider.GetRequiredService() as CaptureWriter; - writer!.LastBatch.Should().NotBeNull(); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task AddSbomIngestPipeline_uses_environment_variable_when_not_configured() - { - var previous = Environment.GetEnvironmentVariable("STELLAOPS_GRAPH_SNAPSHOT_DIR"); - - try - { - Environment.SetEnvironmentVariable("STELLAOPS_GRAPH_SNAPSHOT_DIR", _tempDirectory); - - var services = new ServiceCollection(); - services.AddSingleton(); - services.AddSbomIngestPipeline(); - - using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; - var processor = provider.GetRequiredService(); - - var snapshot = LoadSnapshot(); - await processor.ProcessAsync(snapshot, CancellationToken.None); - - AssertSnapshotOutputs(_tempDirectory); - } - finally - { - Environment.SetEnvironmentVariable("STELLAOPS_GRAPH_SNAPSHOT_DIR", previous); - } - } - - private static SbomSnapshot LoadSnapshot() - { - var path = Path.Combine(FixturesRoot, "sbom-snapshot.json"); - var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - })!; - } - - private static void AssertSnapshotOutputs(string root) - { - var manifestPath = Path.Combine(root, "manifest.json"); - var adjacencyPath = Path.Combine(root, "adjacency.json"); - var nodesPath = Path.Combine(root, "nodes.jsonl"); - var edgesPath = Path.Combine(root, "edges.jsonl"); - - File.Exists(manifestPath).Should().BeTrue("manifest should be exported"); - File.Exists(adjacencyPath).Should().BeTrue("adjacency manifest should be exported"); - File.Exists(nodesPath).Should().BeTrue("node stream should be exported"); - File.Exists(edgesPath).Should().BeTrue("edge stream should be exported"); - - new FileInfo(manifestPath).Length.Should().BeGreaterThan(0); - new FileInfo(adjacencyPath).Length.Should().BeGreaterThan(0); - new FileInfo(nodesPath).Length.Should().BeGreaterThan(0); - new FileInfo(edgesPath).Length.Should().BeGreaterThan(0); - } - - public void Dispose() - { - try - { - if (Directory.Exists(_tempDirectory)) - { - Directory.Delete(_tempDirectory, recursive: true); - } - } - catch - { - // Ignore cleanup failures in CI environments. - } - } - - private sealed class CaptureWriter : IGraphDocumentWriter - { - public GraphBuildBatch? LastBatch { get; private set; } - - public Task WriteAsync(GraphBuildBatch batch, CancellationToken cancellationToken) - { - LastBatch = batch; - return Task.CompletedTask; - } - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestTransformerTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestTransformerTests.cs deleted file mode 100644 index ee8265506..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomIngestTransformerTests.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Nodes; -using FluentAssertions; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using Xunit; -using Xunit.Abstractions; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class SbomIngestTransformerTests -{ - private readonly ITestOutputHelper _output; - - public SbomIngestTransformerTests(ITestOutputHelper output) - { - _output = output; - } - - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - private static readonly HashSet ExpectedNodeKinds = new(StringComparer.Ordinal) - { - "artifact", - "component", - "file" - }; - - private static readonly HashSet ExpectedEdgeKinds = new(StringComparer.Ordinal) - { - "CONTAINS", - "DEPENDS_ON", - "DECLARED_IN", - "BUILT_FROM" - }; - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Transform_produces_expected_nodes_and_edges() - { - var snapshot = LoadSnapshot("sbom-snapshot.json"); - var transformer = new SbomIngestTransformer(); - - var batch = transformer.Transform(snapshot); - - var expectedNodes = LoadArray("nodes.json") - .Cast() - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var expectedEdges = LoadArray("edges.json") - .Cast() - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualNodes = batch.Nodes - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualEdges = batch.Edges - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - actualNodes.Length.Should().Be(expectedNodes.Length); - actualEdges.Length.Should().Be(expectedEdges.Length); - - for (var i = 0; i < expectedNodes.Length; i++) - { - if (!JsonNode.DeepEquals(expectedNodes[i], actualNodes[i])) - { - _output.WriteLine($"Expected Node: {expectedNodes[i]}"); - _output.WriteLine($"Actual Node: {actualNodes[i]}"); - } - - JsonNode.DeepEquals(expectedNodes[i], actualNodes[i]).Should().BeTrue(); - } - - for (var i = 0; i < expectedEdges.Length; i++) - { - if (!JsonNode.DeepEquals(expectedEdges[i], actualEdges[i])) - { - _output.WriteLine($"Expected Edge: {expectedEdges[i]}"); - _output.WriteLine($"Actual Edge: {actualEdges[i]}"); - } - - JsonNode.DeepEquals(expectedEdges[i], actualEdges[i]).Should().BeTrue(); - } - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Transform_deduplicates_license_nodes_case_insensitive() - { - var baseCollectedAt = DateTimeOffset.Parse("2025-10-30T12:00:00Z"); - var components = new[] - { - CreateComponent( - purl: "pkg:nuget/Example.Primary@1.0.0", - spdx: "MIT", - sourceDigest: "sha256:license001", - collectedAt: baseCollectedAt.AddSeconds(1), - eventOffset: 1201, - source: "scanner.component.v1"), - CreateComponent( - purl: "pkg:nuget/Example.Secondary@2.0.0", - spdx: "mit", - sourceDigest: "SHA256:LICENSE001", - collectedAt: baseCollectedAt.AddSeconds(2), - eventOffset: 1202, - usage: "transitive", - source: "scanner.component.v1") - }; - - var snapshot = CreateSnapshot(components: components); - var transformer = new SbomIngestTransformer(); - - var batch = transformer.Transform(snapshot); - - var licenseNodes = batch.Nodes - .Where(node => string.Equals(node["kind"]!.GetValue(), "license", StringComparison.Ordinal)) - .ToArray(); - - licenseNodes.Should().HaveCount(1); - var canonicalKey = licenseNodes[0]["canonical_key"]!.AsObject(); - canonicalKey["license_spdx"]!.GetValue().Should().Be("MIT"); - canonicalKey["source_digest"]!.GetValue().Should().Be("sha256:license001"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Transform_emits_built_from_edge_with_provenance() - { - var snapshot = LoadSnapshot("sbom-snapshot.json"); - var transformer = new SbomIngestTransformer(); - - var batch = transformer.Transform(snapshot); - - var builtFrom = batch.Edges.Single(edge => edge["kind"]!.GetValue() == "BUILT_FROM"); - - var attributes = builtFrom["attributes"]!.AsObject(); - attributes["build_type"]!.GetValue().Should().Be(snapshot.Build.BuildType); - attributes["builder_id"]!.GetValue().Should().Be(snapshot.Build.BuilderId); - attributes["attestation_digest"]!.GetValue().Should().Be(snapshot.Build.AttestationDigest); - - var provenance = builtFrom["provenance"]!.AsObject(); - provenance["source"]!.GetValue().Should().Be(snapshot.Build.Source); - provenance["collected_at"]!.GetValue() - .Should().Be(snapshot.Build.CollectedAt.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ")); - - var canonicalKey = builtFrom["canonical_key"]!.AsObject(); - canonicalKey.ContainsKey("parent_artifact_node_id").Should().BeTrue(); - canonicalKey.ContainsKey("child_artifact_digest").Should().BeTrue(); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Transform_normalizes_valid_from_to_utc() - { - var componentCollectedAt = new DateTimeOffset(2025, 11, 1, 15, 30, 45, TimeSpan.FromHours(2)); - var components = new[] - { - CreateComponent( - purl: "pkg:nuget/Example.Primary@1.0.0", - spdx: "Apache-2.0", - sourceDigest: "sha256:license002", - collectedAt: componentCollectedAt, - eventOffset: 2101, - source: "scanner.component.v1") - }; - - var snapshot = CreateSnapshot( - components: components, - collectedAt: componentCollectedAt.AddSeconds(-1), - eventOffset: 2000); - - var transformer = new SbomIngestTransformer(); - var batch = transformer.Transform(snapshot); - - var componentNode = batch.Nodes.Single(node => node["kind"]!.GetValue() == "component"); - componentNode["valid_from"]!.GetValue().Should().Be("2025-11-01T13:30:45Z"); - - var containsEdge = batch.Edges.Single(edge => edge["kind"]!.GetValue() == "CONTAINS"); - containsEdge["valid_from"]!.GetValue().Should().Be("2025-11-01T13:30:46Z"); - } - - private static SbomSnapshot CreateSnapshot( - IEnumerable? components = null, - IEnumerable? baseArtifacts = null, - DateTimeOffset? collectedAt = null, - long eventOffset = 1000, - string? source = null, - SbomArtifactMetadata? artifact = null, - SbomBuildMetadata? build = null) - { - return new SbomSnapshot - { - Tenant = "tenant-alpha", - Source = source ?? "scanner.sbom.v1", - ArtifactDigest = "sha256:test-artifact", - SbomDigest = "sha256:test-sbom", - CollectedAt = collectedAt ?? DateTimeOffset.Parse("2025-10-30T12:00:00Z"), - EventOffset = eventOffset, - Artifact = artifact ?? new SbomArtifactMetadata - { - DisplayName = "registry.example.com/app:latest", - Environment = "prod", - Labels = new[] { "critical" }, - OriginRegistry = "registry.example.com", - SupplyChainStage = "deploy" - }, - Build = build ?? new SbomBuildMetadata - { - BuilderId = "builder://tekton/default", - BuildType = "https://slsa.dev/provenance/v1", - AttestationDigest = "sha256:attestation", - Source = "scanner.build.v1", - CollectedAt = (collectedAt ?? DateTimeOffset.Parse("2025-10-30T12:00:00Z")).AddSeconds(5), - EventOffset = eventOffset + 100 - }, - Components = (components ?? Array.Empty()).ToArray(), - BaseArtifacts = (baseArtifacts ?? Array.Empty()).ToArray() - }; - } - - private static SbomComponent CreateComponent( - string purl, - string spdx, - string sourceDigest, - DateTimeOffset collectedAt, - long eventOffset, - string version = "1.0.0", - string usage = "direct", - string? source = null, - string detectedBy = "sbom.analyzer.transformer", - string scope = "runtime", - IEnumerable? files = null, - IEnumerable? dependencies = null) - { - return new SbomComponent - { - Purl = purl, - Version = version, - Ecosystem = "nuget", - Scope = scope, - License = new SbomLicense - { - Spdx = spdx, - Name = $"{spdx} License", - Classification = "permissive", - SourceDigest = sourceDigest, - NoticeUri = null - }, - Usage = usage, - DetectedBy = detectedBy, - LayerDigest = "sha256:layer", - EvidenceDigest = "sha256:evidence", - CollectedAt = collectedAt, - EventOffset = eventOffset, - Source = source ?? "scanner.component.v1", - Files = (files ?? Array.Empty()).ToArray(), - Dependencies = (dependencies ?? Array.Empty()).ToArray(), - SourceType = "inventory" - }; - } - - private static SbomSnapshot LoadSnapshot(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - })!; - } - - private static JsonArray LoadArray(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - return (JsonArray)JsonNode.Parse(File.ReadAllText(path))!; - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomSnapshotExporterTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomSnapshotExporterTests.cs deleted file mode 100644 index ba85efc5f..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/SbomSnapshotExporterTests.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Nodes; -using System.Threading; -using System.Threading.Tasks; -using FluentAssertions; -using StellaOps.Graph.Indexer.Documents; -using StellaOps.Graph.Indexer.Ingestion.Advisory; -using StellaOps.Graph.Indexer.Ingestion.Policy; -using StellaOps.Graph.Indexer.Ingestion.Sbom; -using StellaOps.Graph.Indexer.Ingestion.Vex; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class SbomSnapshotExporterTests -{ - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task ExportAsync_writes_manifest_adjacency_nodes_and_edges() - { - var sbomSnapshot = Load("sbom-snapshot.json"); - var linksetSnapshot = Load("concelier-linkset.json"); - var vexSnapshot = Load("excititor-vex.json"); - var policySnapshot = Load("policy-overlay.json"); - - var sbomBatch = new SbomIngestTransformer().Transform(sbomSnapshot); - var advisoryBatch = new AdvisoryLinksetTransformer().Transform(linksetSnapshot); - var vexBatch = new VexOverlayTransformer().Transform(vexSnapshot); - var policyBatch = new PolicyOverlayTransformer().Transform(policySnapshot); - - var combinedBatch = MergeBatches(sbomBatch, advisoryBatch, vexBatch, policyBatch); - - var builder = new GraphSnapshotBuilder(); - var writer = new InMemorySnapshotFileWriter(); - var exporter = new SbomSnapshotExporter(builder, writer); - - await exporter.ExportAsync(sbomSnapshot, combinedBatch, CancellationToken.None); - - writer.JsonFiles.Should().ContainKey("manifest.json"); - writer.JsonFiles.Should().ContainKey("adjacency.json"); - writer.JsonLinesFiles.Should().ContainKey("nodes.jsonl"); - writer.JsonLinesFiles.Should().ContainKey("edges.jsonl"); - - var manifest = writer.JsonFiles["manifest.json"]; - manifest["tenant"]!.GetValue().Should().Be("tenant-alpha"); - manifest["node_count"]!.GetValue().Should().Be(combinedBatch.Nodes.Length); - manifest["edge_count"]!.GetValue().Should().Be(combinedBatch.Edges.Length); - manifest["hash"]!.GetValue().Should().NotBeNullOrEmpty(); - - var adjacency = writer.JsonFiles["adjacency.json"]; - adjacency["tenant"]!.GetValue().Should().Be("tenant-alpha"); - adjacency["nodes"]!.AsArray().Should().HaveCount(combinedBatch.Nodes.Length); - - writer.JsonLinesFiles["nodes.jsonl"].Should().HaveCount(combinedBatch.Nodes.Length); - writer.JsonLinesFiles["edges.jsonl"].Should().HaveCount(combinedBatch.Edges.Length); - } - - private static GraphBuildBatch MergeBatches(params GraphBuildBatch[] batches) - { - var nodes = new Dictionary(StringComparer.Ordinal); - var edges = new Dictionary(StringComparer.Ordinal); - - foreach (var batch in batches) - { - foreach (var node in batch.Nodes) - { - nodes[node["id"]!.GetValue()] = node; - } - - foreach (var edge in batch.Edges) - { - edges[edge["id"]!.GetValue()] = edge; - } - } - - var orderedNodes = nodes.Values - .OrderBy(node => node["kind"]!.GetValue(), StringComparer.Ordinal) - .ThenBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToImmutableArray(); - - var orderedEdges = edges.Values - .OrderBy(edge => edge["kind"]!.GetValue(), StringComparer.Ordinal) - .ThenBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToImmutableArray(); - - return new GraphBuildBatch(orderedNodes, orderedEdges); - } - - private static T Load(string fixtureFile) - { - var path = Path.Combine(FixturesRoot, fixtureFile); - var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - })!; - } - - private sealed class InMemorySnapshotFileWriter : ISnapshotFileWriter - { - public Dictionary JsonFiles { get; } = new(StringComparer.Ordinal); - public Dictionary> JsonLinesFiles { get; } = new(StringComparer.Ordinal); - - public Task WriteJsonAsync(string relativePath, JsonObject content, CancellationToken cancellationToken) - { - JsonFiles[relativePath] = (JsonObject)content.DeepClone(); - return Task.CompletedTask; - } - - public Task WriteJsonLinesAsync(string relativePath, IEnumerable items, CancellationToken cancellationToken) - { - JsonLinesFiles[relativePath] = items - .Select(item => (JsonObject)item.DeepClone()) - .ToList(); - - return Task.CompletedTask; - } - } -} diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/StellaOps.Graph.Indexer.Tests.csproj b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/StellaOps.Graph.Indexer.Tests.csproj deleted file mode 100644 index fb8abd153..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/StellaOps.Graph.Indexer.Tests.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - net10.0 - enable - enable - preview - false - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - PreserveNewest - - - diff --git a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/VexOverlayTransformerTests.cs b/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/VexOverlayTransformerTests.cs deleted file mode 100644 index b8f4ab606..000000000 --- a/src/__Tests/Graph/StellaOps.Graph.Indexer.Tests/VexOverlayTransformerTests.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Nodes; -using FluentAssertions; -using StellaOps.Graph.Indexer.Ingestion.Vex; -using Xunit; -using Xunit.Abstractions; - -using StellaOps.TestKit; -namespace StellaOps.Graph.Indexer.Tests; - -public sealed class VexOverlayTransformerTests -{ - private readonly ITestOutputHelper _output; - - public VexOverlayTransformerTests(ITestOutputHelper output) - { - _output = output; - } - - private static readonly string FixturesRoot = - Path.Combine(AppContext.BaseDirectory, "Fixtures", "v1"); - - private static readonly HashSet ExpectedNodeKinds = new(StringComparer.Ordinal) - { - "vex_statement" - }; - - private static readonly HashSet ExpectedEdgeKinds = new(StringComparer.Ordinal) - { - "VEX_EXEMPTS" - }; - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Transform_projects_vex_nodes_and_exempt_edges() - { - var snapshot = LoadSnapshot("excititor-vex.json"); - var transformer = new VexOverlayTransformer(); - - var batch = transformer.Transform(snapshot); - var expectedNodes = LoadArray("nodes.json") - .Cast() - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var expectedEdges = LoadArray("edges.json") - .Cast() - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualNodes = batch.Nodes - .Where(node => ExpectedNodeKinds.Contains(node["kind"]!.GetValue())) - .OrderBy(node => node["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - var actualEdges = batch.Edges - .Where(edge => ExpectedEdgeKinds.Contains(edge["kind"]!.GetValue())) - .OrderBy(edge => edge["id"]!.GetValue(), StringComparer.Ordinal) - .ToArray(); - - actualNodes.Length.Should().Be(expectedNodes.Length); - actualEdges.Length.Should().Be(expectedEdges.Length); - - for (var i = 0; i < expectedNodes.Length; i++) - { - if (!JsonNode.DeepEquals(expectedNodes[i], actualNodes[i])) - { - _output.WriteLine($"Expected Node: {expectedNodes[i]}"); - _output.WriteLine($"Actual Node: {actualNodes[i]}"); - } - - JsonNode.DeepEquals(expectedNodes[i], actualNodes[i]).Should().BeTrue(); - } - - for (var i = 0; i < expectedEdges.Length; i++) - { - if (!JsonNode.DeepEquals(expectedEdges[i], actualEdges[i])) - { - _output.WriteLine($"Expected Edge: {expectedEdges[i]}"); - _output.WriteLine($"Actual Edge: {actualEdges[i]}"); - } - - JsonNode.DeepEquals(expectedEdges[i], actualEdges[i]).Should().BeTrue(); - } - } - - private static VexOverlaySnapshot LoadSnapshot(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - var json = File.ReadAllText(path); - return JsonSerializer.Deserialize(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - })!; - } - - private static JsonArray LoadArray(string fileName) - { - var path = Path.Combine(FixturesRoot, fileName); - return (JsonArray)JsonNode.Parse(File.ReadAllText(path))!; - } -} diff --git a/src/__Tests/Policy/StellaOps.Policy.Scoring.Tests/Fixtures/hashing/receipt-input.json b/src/__Tests/Policy/StellaOps.Policy.Scoring.Tests/Fixtures/hashing/receipt-input.json deleted file mode 100644 index 83e9465f6..000000000 --- a/src/__Tests/Policy/StellaOps.Policy.Scoring.Tests/Fixtures/hashing/receipt-input.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "baseMetrics": { - "ac": "Low", - "at": "None", - "av": "Network", - "pr": "None", - "sa": "High", - "sc": "High", - "si": "High", - "ui": "None", - "va": "High", - "vc": "High", - "vi": "High" - }, - "createdAt": "2025-12-03T00:00:00Z", - "createdBy": "policy-scorer@stella", - "environmentalMetrics": { - "ar": "Medium", - "cr": "High", - "ir": "Medium", - "mac": "Low", - "mat": "None", - "mav": "Network", - "mpr": "None", - "ms": "Unchanged", - "mui": "None", - "mva": "High", - "mvc": "High", - "mvi": "High" - }, - "policyRef": { - "hash": "3c1dff9075a14da4c6ae4e8b1e2c9f7569af5f5e90e78c9a0a82f86ccb63d4f9", - "id": "cvss-policy-v1", - "version": "1.2.0" - }, - "scores": { - "base": 9.8, - "environmental": 9.4, - "threat": 9.8 - }, - "supplementalMetrics": { - "safety": "Safe" - }, - "tenantId": "tenant-acme", - "threatMetrics": { - "ad": "High", - "rs": "Unreported" - }, - "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/AD:H/RS:X/CR:H/IR:M/AR:M/MAV:N/MAC:L/MAT:N/MPR:N/MUI:N/MVC:H/MVI:H/MVA:H/MS:U", - "vulnerabilityId": "CVE-2024-1234" -} \ No newline at end of file diff --git a/src/__Tests/Policy/StellaOps.Policy.Scoring.Tests/Fixtures/hashing/receipt-input.sha256 b/src/__Tests/Policy/StellaOps.Policy.Scoring.Tests/Fixtures/hashing/receipt-input.sha256 deleted file mode 100644 index 1377adee4..000000000 --- a/src/__Tests/Policy/StellaOps.Policy.Scoring.Tests/Fixtures/hashing/receipt-input.sha256 +++ /dev/null @@ -1 +0,0 @@ -bac7e113ad5a27a7fc013608ef3a3b90a3e4d98efbdedbc5953d2c29a3545fef diff --git a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/Fixtures/cosign.sig b/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/Fixtures/cosign.sig deleted file mode 100644 index 7eaab16a6..000000000 --- a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/Fixtures/cosign.sig +++ /dev/null @@ -1 +0,0 @@ -AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw== diff --git a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/PromotionAttestationBuilderTests.cs b/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/PromotionAttestationBuilderTests.cs deleted file mode 100644 index 203cee994..000000000 --- a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/PromotionAttestationBuilderTests.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.Text; -using StellaOps.Provenance.Attestation; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Provenance.Attestation.Tests; - -public sealed class PromotionAttestationBuilderTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task BuildAsync_SignsCanonicalPayloadAndAddsPredicateClaim() - { - var predicate = new PromotionPredicate( - ImageDigest: "sha256:deadbeef", - SbomDigest: "sha256:sbom", - VexDigest: "sha256:vex", - PromotionId: "promo-123", - RekorEntry: "rekor:entry", - Metadata: new Dictionary - { - { "z", "last" }, - { "a", "first" } - }); - - var signer = new RecordingSigner(); - - var attestation = await PromotionAttestationBuilder.BuildAsync(predicate, signer); - - Assert.Equal(predicate, attestation.Predicate); - Assert.NotNull(attestation.Payload); - Assert.Equal(PromotionAttestationBuilder.ContentType, signer.LastRequest?.ContentType); - Assert.Equal(PromotionAttestationBuilder.PredicateType, signer.LastRequest?.Claims!["predicateType"]); - Assert.Equal(attestation.Payload, signer.LastRequest?.Payload); - Assert.Equal(attestation.Signature, signer.LastResult); - - // verify canonical order is stable (metadata keys sorted, property names sorted) - var canonicalJson = Encoding.UTF8.GetString(attestation.Payload); - Assert.Equal( - "{\"ImageDigest\":\"sha256:deadbeef\",\"Metadata\":{\"a\":\"first\",\"z\":\"last\"},\"PromotionId\":\"promo-123\",\"RekorEntry\":\"rekor:entry\",\"SbomDigest\":\"sha256:sbom\",\"VexDigest\":\"sha256:vex\"}", - canonicalJson); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task BuildAsync_MergesClaimsWithoutOverwritingPredicateType() - { - var predicate = new PromotionPredicate( - ImageDigest: "sha256:x", - SbomDigest: "sha256:y", - VexDigest: "sha256:z", - PromotionId: "p-1"); - - var signer = new RecordingSigner(); - var customClaims = new Dictionary { { "env", "stage" }, { "predicateType", "custom" } }; - - await PromotionAttestationBuilder.BuildAsync(predicate, signer, customClaims); - - Assert.NotNull(signer.LastRequest); - Assert.Equal(PromotionAttestationBuilder.PredicateType, signer.LastRequest!.Claims!["predicateType"]); - Assert.Equal("stage", signer.LastRequest!.Claims!["env"]); - } - - private sealed class RecordingSigner : ISigner - { - public SignRequest? LastRequest { get; private set; } - public SignResult? LastResult { get; private set; } - - public Task SignAsync(SignRequest request, CancellationToken cancellationToken = default) - { - LastRequest = request; - LastResult = new SignResult( - Signature: Encoding.UTF8.GetBytes("sig"), - KeyId: "key-1", - SignedAt: DateTimeOffset.UtcNow, - Claims: request.Claims); - - return Task.FromResult(LastResult); - } - } -} diff --git a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/SignersTests.cs b/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/SignersTests.cs deleted file mode 100644 index 59c27e41a..000000000 --- a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/SignersTests.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System.Text; -using StellaOps.Provenance.Attestation; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Provenance.Attestation.Tests; - -public sealed class SignersTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task HmacSigner_SignsAndAudits() - { - var key = new InMemoryKeyProvider("k1", Convert.FromHexString("0f0e0d0c0b0a09080706050403020100")); - var audit = new InMemoryAuditSink(); - var time = new TestTimeProvider(new DateTimeOffset(2025, 11, 22, 12, 0, 0, TimeSpan.Zero)); - var signer = new HmacSigner(key, audit, time); - - var request = new SignRequest(Encoding.UTF8.GetBytes("payload"), "application/json", - Claims: new Dictionary { { "sub", "builder" } }); - - var result = await signer.SignAsync(request); - - Assert.Equal("k1", result.KeyId); - Assert.Equal(time.GetUtcNow(), result.SignedAt); - Assert.Equal( - Convert.FromHexString("b3ae92d9a593318d03d7c4b6dca9710c416f582e88cfc08196d8c2cdabb3c480"), - result.Signature); - Assert.Single(audit.Signed); - Assert.Empty(audit.Missing); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task HmacSigner_EnforcesRequiredClaims() - { - var key = new InMemoryKeyProvider("k-claims", Encoding.UTF8.GetBytes("secret")); - var audit = new InMemoryAuditSink(); - var signer = new HmacSigner(key, audit, new TestTimeProvider(DateTimeOffset.UtcNow)); - - var request = new SignRequest(Encoding.UTF8.GetBytes("payload"), "text/plain", - Claims: new Dictionary(), - RequiredClaims: new[] { "sub" }); - - await Assert.ThrowsAsync(() => signer.SignAsync(request)); - Assert.Contains(audit.Missing, x => x.keyId == "k-claims" && x.claim == "sub"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task RotatingKeyProvider_LogsRotationWhenNewKeyBecomesActive() - { - var now = new DateTimeOffset(2025, 11, 22, 10, 0, 0, TimeSpan.Zero); - var time = new TestTimeProvider(now); - var audit = new InMemoryAuditSink(); - - var expiring = new InMemoryKeyProvider("old", new byte[] { 0x01 }, now.AddMinutes(5)); - var longLived = new InMemoryKeyProvider("new", new byte[] { 0x02 }, now.AddHours(1)); - - var provider = new RotatingKeyProvider(new[] { expiring, longLived }, time, audit); - var signer = new HmacSigner(provider, audit, time); - - await signer.SignAsync(new SignRequest(new byte[] { 0xAB }, "demo")); - - Assert.Contains(audit.Rotations, r => r.previousKeyId == "old" && r.nextKeyId == "new"); - Assert.Equal("new", provider.KeyId); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task CosignSigner_UsesClientAndAudits() - { - var signatureBytes = Convert.FromBase64String(await File.ReadAllTextAsync(Path.Combine("Fixtures", "cosign.sig"))); // fixture is deterministic - var client = new FakeCosignClient(signatureBytes); - var audit = new InMemoryAuditSink(); - var time = new TestTimeProvider(new DateTimeOffset(2025, 11, 22, 13, 0, 0, TimeSpan.Zero)); - var signer = new CosignSigner("cosign://stella", client, audit, time); - - var request = new SignRequest(Encoding.UTF8.GetBytes("subject"), "application/vnd.stella+json", - Claims: new Dictionary { { "sub", "artifact" } }, - RequiredClaims: new[] { "sub" }); - - var result = await signer.SignAsync(request); - - Assert.Equal(signatureBytes, result.Signature); - Assert.Equal(time.GetUtcNow(), result.SignedAt); - Assert.Equal("cosign://stella", result.KeyId); - Assert.Single(audit.Signed); - Assert.Empty(audit.Missing); - - var call = Assert.Single(client.Calls); - Assert.Equal("cosign://stella", call.keyRef); - Assert.Equal("application/vnd.stella+json", call.contentType); - Assert.Equal(request.Payload, call.payload); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task KmsSigner_EnforcesRequiredClaims() - { - var signature = new byte[] { 0xCA, 0xFE, 0xBA, 0xBE }; - var client = new FakeKmsClient(signature); - var audit = new InMemoryAuditSink(); - var key = new InMemoryKeyProvider("kms-1", new byte[] { 0x00 }, DateTimeOffset.UtcNow.AddDays(1)); - var signer = new KmsSigner(client, key, audit, new TestTimeProvider(DateTimeOffset.UtcNow)); - - var request = new SignRequest(Encoding.UTF8.GetBytes("body"), "application/json", - Claims: new Dictionary { { "aud", "stella" } }, - RequiredClaims: new[] { "sub" }); - - await Assert.ThrowsAsync(() => signer.SignAsync(request)); - Assert.Contains(audit.Missing, x => x.keyId == "kms-1" && x.claim == "sub"); - - var validAudit = new InMemoryAuditSink(); - var validSigner = new KmsSigner(client, key, validAudit, new TestTimeProvider(DateTimeOffset.UtcNow)); - var validRequest = new SignRequest(Encoding.UTF8.GetBytes("body"), "application/json", - Claims: new Dictionary { { "aud", "stella" }, { "sub", "actor" } }, - RequiredClaims: new[] { "sub" }); - - var result = await validSigner.SignAsync(validRequest); - - Assert.Equal(signature, result.Signature); - Assert.Equal("kms-1", result.KeyId); - Assert.Empty(validAudit.Missing); - } - - private sealed class FakeCosignClient : ICosignClient - { - public List<(byte[] payload, string contentType, string keyRef)> Calls { get; } = new(); - private readonly byte[] _signature; - - public FakeCosignClient(byte[] signature) - { - _signature = signature ?? throw new ArgumentNullException(nameof(signature)); - } - - public Task SignAsync(byte[] payload, string contentType, string keyRef, CancellationToken cancellationToken) - { - Calls.Add((payload, contentType, keyRef)); - return Task.FromResult(_signature); - } - } - - private sealed class FakeKmsClient : IKmsClient - { - private readonly byte[] _signature; - public List<(byte[] payload, string contentType, string keyId)> Calls { get; } = new(); - - public FakeKmsClient(byte[] signature) => _signature = signature; - - public Task SignAsync(byte[] payload, string contentType, string keyId, CancellationToken cancellationToken) - { - Calls.Add((payload, contentType, keyId)); - return Task.FromResult(_signature); - } - } -} diff --git a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/StellaOps.Provenance.Attestation.Tests.csproj b/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/StellaOps.Provenance.Attestation.Tests.csproj deleted file mode 100644 index f8c388609..000000000 --- a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/StellaOps.Provenance.Attestation.Tests.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - net10.0 - false - enable - enable - true - - - - - - - - - - - - - - diff --git a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/TestTimeProvider.cs b/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/TestTimeProvider.cs deleted file mode 100644 index 7dafe93b3..000000000 --- a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/TestTimeProvider.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace StellaOps.Provenance.Attestation.Tests; - -internal sealed class TestTimeProvider : TimeProvider -{ - private DateTimeOffset _now; - - public TestTimeProvider(DateTimeOffset now) => _now = now; - - public override DateTimeOffset GetUtcNow() => _now; - public override TimeZoneInfo LocalTimeZone => TimeZoneInfo.Utc; - public override long GetTimestamp() => 0L; - - public void Advance(TimeSpan delta) => _now = _now.Add(delta); -} diff --git a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/ToolEntrypointTests.cs b/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/ToolEntrypointTests.cs deleted file mode 100644 index f4cfd0058..000000000 --- a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/ToolEntrypointTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Text; -using StellaOps.Provenance.Attestation; -using Xunit; - - -using StellaOps.TestKit; -namespace StellaOps.Provenance.Attestation.Tests; - -public sealed class ToolEntrypointTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task RunAsync_ReturnsInvalidOnMissingArgs() - { - var code = await ToolEntrypoint.RunAsync(Array.Empty(), TextWriter.Null, new StringWriter(), new TestTimeProvider(DateTimeOffset.UtcNow)); - Assert.Equal(1, code); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task RunAsync_VerifiesValidSignature() - { - var payload = Encoding.UTF8.GetBytes("payload"); - var key = Convert.ToHexString(Encoding.UTF8.GetBytes("secret")); - using var hmac = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes("secret")); -using StellaOps.TestKit; - var sig = Convert.ToHexString(hmac.ComputeHash(payload)); - - var tmp = Path.GetTempFileName(); - await File.WriteAllBytesAsync(tmp, payload); - - var stdout = new StringWriter(); - var code = await ToolEntrypoint.RunAsync(new[] - { - "--payload", tmp, - "--signature-hex", sig, - "--key-hex", key, - "--signed-at", "2025-11-22T00:00:00Z" - }, stdout, new StringWriter(), new TestTimeProvider(new DateTimeOffset(2025,11,22,0,0,0,TimeSpan.Zero))); - - Assert.Equal(0, code); - Assert.Contains("\"valid\":true", stdout.ToString()); - } -} diff --git a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/VerificationLibraryTests.cs b/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/VerificationLibraryTests.cs deleted file mode 100644 index 16285dbd6..000000000 --- a/src/__Tests/Provenance/StellaOps.Provenance.Attestation.Tests/VerificationLibraryTests.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Text; -using StellaOps.Provenance.Attestation; -using Xunit; - - -using StellaOps.TestKit; -namespace StellaOps.Provenance.Attestation.Tests; - -public sealed class VerificationLibraryTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task HmacVerifier_FailsWhenKeyExpired() - { - var key = new InMemoryKeyProvider("k1", Encoding.UTF8.GetBytes("secret"), DateTimeOffset.UtcNow.AddMinutes(-1)); - var verifier = new HmacVerifier(key, new TestTimeProvider(DateTimeOffset.UtcNow)); - - var request = new SignRequest(Encoding.UTF8.GetBytes("payload"), "ct"); - var signer = new HmacSigner(key, timeProvider: new TestTimeProvider(DateTimeOffset.UtcNow.AddMinutes(-2))); - var signature = await signer.SignAsync(request); - - var result = await verifier.VerifyAsync(request, signature); - - Assert.False(result.IsValid); - Assert.Contains("time", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task HmacVerifier_FailsWhenClockSkewTooLarge() - { - var now = new DateTimeOffset(2025, 11, 22, 12, 0, 0, TimeSpan.Zero); - var key = new InMemoryKeyProvider("k", Encoding.UTF8.GetBytes("secret")); - var signer = new HmacSigner(key, timeProvider: new TestTimeProvider(now.AddMinutes(10))); - var request = new SignRequest(Encoding.UTF8.GetBytes("payload"), "ct"); - var sig = await signer.SignAsync(request); - - var verifier = new HmacVerifier(key, new TestTimeProvider(now), TimeSpan.FromMinutes(5)); - var result = await verifier.VerifyAsync(request, sig); - - Assert.False(result.IsValid); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void MerkleRootVerifier_DetectsMismatch() - { - var leaves = new[] - { - Encoding.UTF8.GetBytes("a"), - Encoding.UTF8.GetBytes("b"), - Encoding.UTF8.GetBytes("c") - }; - var expected = Convert.FromHexString("00"); - - var result = MerkleRootVerifier.VerifyRoot(leaves, expected, new TestTimeProvider(DateTimeOffset.UtcNow)); - - Assert.False(result.IsValid); - Assert.Equal("merkle root mismatch", result.Reason); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void ChainOfCustodyVerifier_ComputesAggregate() - { - var hops = new[] - { - Encoding.UTF8.GetBytes("hop1"), - Encoding.UTF8.GetBytes("hop2") - }; - - using var sha = System.Security.Cryptography.SHA256.Create(); -using StellaOps.TestKit; - var aggregate = sha.ComputeHash(Array.Empty().Concat(hops[0]).ToArray()); - aggregate = sha.ComputeHash(aggregate.Concat(hops[1]).ToArray()); - - var result = ChainOfCustodyVerifier.Verify(hops, aggregate, new TestTimeProvider(DateTimeOffset.UtcNow)); - Assert.True(result.IsValid); - } -} diff --git a/src/__Tests/Replay/StellaOps.Replay.Core.Tests/PolicySimulationInputLockValidatorTests.cs b/src/__Tests/Replay/StellaOps.Replay.Core.Tests/PolicySimulationInputLockValidatorTests.cs deleted file mode 100644 index 1d6f7a726..000000000 --- a/src/__Tests/Replay/StellaOps.Replay.Core.Tests/PolicySimulationInputLockValidatorTests.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using FluentAssertions; -using StellaOps.Replay.Core; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Replay.Core.Tests; - -public class PolicySimulationInputLockValidatorTests -{ - private readonly PolicySimulationInputLock _lock = new() - { - PolicyBundleSha256 = new string('a', 64), - GraphSha256 = new string('b', 64), - SbomSha256 = new string('c', 64), - TimeAnchorSha256 = new string('d', 64), - DatasetSha256 = new string('e', 64), - GeneratedAt = DateTimeOffset.Parse("2025-12-02T00:00:00Z"), - ShadowIsolation = true, - RequiredScopes = new[] { "policy:simulate:shadow" } - }; - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Validate_passes_when_digests_match_and_shadow_scope_present() - { - var inputs = new PolicySimulationMaterializedInputs( - new string('a', 64), - new string('b', 64), - new string('c', 64), - new string('d', 64), - new string('e', 64), - "shadow", - new[] { "policy:simulate:shadow", "graph:read" }, - DateTimeOffset.Parse("2025-12-02T01:00:00Z")); - - var result = PolicySimulationInputLockValidator.Validate(_lock, inputs, TimeSpan.FromDays(2)); - - result.IsValid.Should().BeTrue(); - result.Reason.Should().Be("ok"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Validate_detects_digest_drift() - { - var inputs = new PolicySimulationMaterializedInputs( - new string('0', 64), - new string('b', 64), - new string('c', 64), - new string('d', 64), - new string('e', 64), - "shadow", - new[] { "policy:simulate:shadow" }, - DateTimeOffset.Parse("2025-12-02T00:10:00Z")); - - var result = PolicySimulationInputLockValidator.Validate(_lock, inputs, TimeSpan.FromDays(1)); - - result.IsValid.Should().BeFalse(); - result.Reason.Should().Be("policy-bundle-drift"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Validate_requires_shadow_mode_when_flagged() - { - var inputs = new PolicySimulationMaterializedInputs( - new string('a', 64), - new string('b', 64), - new string('c', 64), - new string('d', 64), - new string('e', 64), - "live", - Array.Empty(), - DateTimeOffset.Parse("2025-12-02T00:10:00Z")); - - var result = PolicySimulationInputLockValidator.Validate(_lock, inputs, TimeSpan.FromDays(1)); - - result.IsValid.Should().BeFalse(); - result.Reason.Should().Be("shadow-mode-required"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Validate_fails_when_lock_stale() - { - var inputs = new PolicySimulationMaterializedInputs( - new string('a', 64), - new string('b', 64), - new string('c', 64), - new string('d', 64), - new string('e', 64), - "shadow", - new[] { "policy:simulate:shadow" }, - DateTimeOffset.Parse("2025-12-05T00:00:00Z")); - - var result = PolicySimulationInputLockValidator.Validate(_lock, inputs, TimeSpan.FromDays(1)); - - result.IsValid.Should().BeFalse(); - result.Reason.Should().Be("inputs-lock-stale"); - } -} diff --git a/src/__Tests/Replay/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj b/src/__Tests/Replay/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj deleted file mode 100644 index c00188b78..000000000 --- a/src/__Tests/Replay/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/__Tests/StellaOps.Gateway.WebService.Tests/Authorization/AuthorizationMiddlewareTests.cs b/src/__Tests/StellaOps.Gateway.WebService.Tests/Authorization/AuthorizationMiddlewareTests.cs deleted file mode 100644 index 970cd3a69..000000000 --- a/src/__Tests/StellaOps.Gateway.WebService.Tests/Authorization/AuthorizationMiddlewareTests.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System.Security.Claims; -using FluentAssertions; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging.Abstractions; -using Moq; -using StellaOps.Gateway.WebService.Authorization; -using StellaOps.Router.Common; -using StellaOps.Router.Common.Models; -using Xunit; - -namespace StellaOps.Gateway.WebService.Tests.Authorization; - -/// -/// Tests for . -/// -public sealed class AuthorizationMiddlewareTests -{ - private readonly Mock _claimsStore; - private readonly Mock _next; - private readonly AuthorizationMiddleware _middleware; - - public AuthorizationMiddlewareTests() - { - _claimsStore = new Mock(); - _next = new Mock(); - _middleware = new AuthorizationMiddleware( - _next.Object, - _claimsStore.Object, - NullLogger.Instance); - } - - [Fact] - public async Task InvokeAsync_NoEndpointResolved_CallsNext() - { - // Arrange - var context = CreateHttpContext(); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(context), Times.Once); - } - - [Fact] - public async Task InvokeAsync_NoClaims_CallsNext() - { - // Arrange - var context = CreateHttpContextWithEndpoint(); - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(Array.Empty()); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(context), Times.Once); - context.Response.StatusCode.Should().NotBe(403); - } - - [Fact] - public async Task InvokeAsync_UserHasRequiredClaims_CallsNext() - { - // Arrange - var context = CreateHttpContextWithEndpoint(new[] - { - new Claim("scope", "read"), - new Claim("role", "user") - }); - - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(new List - { - new() { Type = "scope", Value = "read" }, - new() { Type = "role", Value = "user" } - }); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(context), Times.Once); - context.Response.StatusCode.Should().NotBe(403); - } - - [Fact] - public async Task InvokeAsync_UserMissingRequiredClaim_Returns403() - { - // Arrange - var context = CreateHttpContextWithEndpoint(new[] - { - new Claim("scope", "read") - }); - - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(new List - { - new() { Type = "scope", Value = "read" }, - new() { Type = "role", Value = "admin" } // User doesn't have this - }); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(It.IsAny()), Times.Never); - context.Response.StatusCode.Should().Be(403); - } - - [Fact] - public async Task InvokeAsync_UserHasClaimTypeButWrongValue_Returns403() - { - // Arrange - var context = CreateHttpContextWithEndpoint(new[] - { - new Claim("role", "user") - }); - - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(new List - { - new() { Type = "role", Value = "admin" } - }); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(It.IsAny()), Times.Never); - context.Response.StatusCode.Should().Be(403); - } - - [Fact] - public async Task InvokeAsync_ClaimWithNullValue_MatchesAnyValue() - { - // Arrange - user has claim of type "authenticated" with some value - var context = CreateHttpContextWithEndpoint(new[] - { - new Claim("authenticated", "true") - }); - - // Requirement only checks that type exists, any value is ok - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(new List - { - new() { Type = "authenticated", Value = null } - }); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(context), Times.Once); - } - - [Fact] - public async Task InvokeAsync_MultipleClaims_AllMustMatch() - { - // Arrange - user has 2 of 3 required claims - var context = CreateHttpContextWithEndpoint(new[] - { - new Claim("scope", "read"), - new Claim("role", "user") - }); - - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(new List - { - new() { Type = "scope", Value = "read" }, - new() { Type = "role", Value = "user" }, - new() { Type = "department", Value = "IT" } // Missing - }); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(It.IsAny()), Times.Never); - context.Response.StatusCode.Should().Be(403); - } - - [Fact] - public async Task InvokeAsync_UserHasExtraClaims_StillAuthorized() - { - // Arrange - user has more claims than required - var context = CreateHttpContextWithEndpoint(new[] - { - new Claim("scope", "read"), - new Claim("scope", "write"), - new Claim("role", "admin"), - new Claim("department", "IT") - }); - - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(new List - { - new() { Type = "scope", Value = "read" } - }); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - _next.Verify(n => n(context), Times.Once); - } - - [Fact] - public async Task InvokeAsync_ForbiddenResponse_ContainsErrorDetails() - { - // Arrange - var context = CreateHttpContextWithEndpoint(); - context.Response.Body = new MemoryStream(); - - _claimsStore - .Setup(s => s.GetEffectiveClaims("test-service", "GET", "/api/test")) - .Returns(new List - { - new() { Type = "admin", Value = "true" } - }); - - // Act - await _middleware.InvokeAsync(context); - - // Assert - context.Response.StatusCode.Should().Be(403); - context.Response.ContentType.Should().Contain("application/json"); - } - - private static HttpContext CreateHttpContext() - { - var context = new DefaultHttpContext(); - return context; - } - - private static HttpContext CreateHttpContextWithEndpoint(Claim[]? userClaims = null) - { - var context = new DefaultHttpContext(); - - // Set resolved endpoint - var endpoint = new EndpointDescriptor - { - ServiceName = "test-service", - Version = "1.0.0", - Method = "GET", - Path = "/api/test" - }; - context.Items[RouterHttpContextKeys.EndpointDescriptor] = endpoint; - - // Set user with claims - if (userClaims != null) - { - var identity = new ClaimsIdentity(userClaims, "Test"); - context.User = new ClaimsPrincipal(identity); - } - - return context; - } -} diff --git a/src/__Tests/StellaOps.Gateway.WebService.Tests/Authorization/EffectiveClaimsStoreTests.cs b/src/__Tests/StellaOps.Gateway.WebService.Tests/Authorization/EffectiveClaimsStoreTests.cs deleted file mode 100644 index 3a4302452..000000000 --- a/src/__Tests/StellaOps.Gateway.WebService.Tests/Authorization/EffectiveClaimsStoreTests.cs +++ /dev/null @@ -1,271 +0,0 @@ -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Gateway.WebService.Authorization; -using StellaOps.Router.Common.Models; -using Xunit; - -namespace StellaOps.Gateway.WebService.Tests.Authorization; - -/// -/// Tests for . -/// -public sealed class EffectiveClaimsStoreTests -{ - private readonly EffectiveClaimsStore _store; - - public EffectiveClaimsStoreTests() - { - _store = new EffectiveClaimsStore(NullLogger.Instance); - } - - [Fact] - public void GetEffectiveClaims_NoClaimsRegistered_ReturnsEmpty() - { - // Act - var claims = _store.GetEffectiveClaims("test-service", "GET", "/api/test"); - - // Assert - claims.Should().BeEmpty(); - } - - [Fact] - public void GetEffectiveClaims_MicroserviceClaimsOnly_ReturnsMicroserviceClaims() - { - // Arrange - var endpoint = CreateEndpoint("GET", "/api/test", [ - new ClaimRequirement { Type = "scope", Value = "read" } - ]); - _store.UpdateFromMicroservice("test-service", [endpoint]); - - // Act - var claims = _store.GetEffectiveClaims("test-service", "GET", "/api/test"); - - // Assert - claims.Should().HaveCount(1); - claims[0].Type.Should().Be("scope"); - claims[0].Value.Should().Be("read"); - } - - [Fact] - public void GetEffectiveClaims_AuthorityOverrideExists_ReturnsAuthorityClaims() - { - // Arrange - var endpoint = CreateEndpoint("GET", "/api/test", [ - new ClaimRequirement { Type = "scope", Value = "read" } - ]); - _store.UpdateFromMicroservice("test-service", [endpoint]); - - var authorityOverrides = new Dictionary> - { - [EndpointKey.Create("test-service", "GET", "/api/test")] = [ - new ClaimRequirement { Type = "role", Value = "admin" } - ] - }; - _store.UpdateFromAuthority(authorityOverrides); - - // Act - var claims = _store.GetEffectiveClaims("test-service", "GET", "/api/test"); - - // Assert - claims.Should().HaveCount(1); - claims[0].Type.Should().Be("role"); - claims[0].Value.Should().Be("admin"); - } - - [Fact] - public void GetEffectiveClaims_AuthorityTakesPrecedence_OverMicroservice() - { - // Arrange - microservice claims with different requirements - var endpoint = CreateEndpoint("POST", "/api/users", [ - new ClaimRequirement { Type = "scope", Value = "users:read" }, - new ClaimRequirement { Type = "role", Value = "user" } - ]); - _store.UpdateFromMicroservice("user-service", [endpoint]); - - // Authority overrides with stricter requirements - var authorityOverrides = new Dictionary> - { - [EndpointKey.Create("user-service", "POST", "/api/users")] = [ - new ClaimRequirement { Type = "scope", Value = "users:write" }, - new ClaimRequirement { Type = "role", Value = "admin" }, - new ClaimRequirement { Type = "department", Value = "IT" } - ] - }; - _store.UpdateFromAuthority(authorityOverrides); - - // Act - var claims = _store.GetEffectiveClaims("user-service", "POST", "/api/users"); - - // Assert - Authority claims completely replace microservice claims - claims.Should().HaveCount(3); - claims.Should().Contain(c => c.Type == "scope" && c.Value == "users:write"); - claims.Should().Contain(c => c.Type == "role" && c.Value == "admin"); - claims.Should().Contain(c => c.Type == "department" && c.Value == "IT"); - claims.Should().NotContain(c => c.Value == "users:read"); - claims.Should().NotContain(c => c.Value == "user"); - } - - [Fact] - public void GetEffectiveClaims_EndpointWithoutAuthority_FallsBackToMicroservice() - { - // Arrange - var endpoints = new[] - { - CreateEndpoint("GET", "/api/public", [ - new ClaimRequirement { Type = "scope", Value = "public" } - ]), - CreateEndpoint("GET", "/api/private", [ - new ClaimRequirement { Type = "scope", Value = "private" } - ]) - }; - _store.UpdateFromMicroservice("test-service", endpoints); - - // Authority only overrides /api/private - var authorityOverrides = new Dictionary> - { - [EndpointKey.Create("test-service", "GET", "/api/private")] = [ - new ClaimRequirement { Type = "role", Value = "admin" } - ] - }; - _store.UpdateFromAuthority(authorityOverrides); - - // Act - var publicClaims = _store.GetEffectiveClaims("test-service", "GET", "/api/public"); - var privateClaims = _store.GetEffectiveClaims("test-service", "GET", "/api/private"); - - // Assert - publicClaims.Should().HaveCount(1); - publicClaims[0].Type.Should().Be("scope"); - publicClaims[0].Value.Should().Be("public"); - - privateClaims.Should().HaveCount(1); - privateClaims[0].Type.Should().Be("role"); - privateClaims[0].Value.Should().Be("admin"); - } - - [Fact] - public void UpdateFromAuthority_ClearsPreviousAuthorityOverrides() - { - // Arrange - first Authority update - var firstOverrides = new Dictionary> - { - [EndpointKey.Create("svc", "GET", "/first")] = [ - new ClaimRequirement { Type = "claim1", Value = "value1" } - ] - }; - _store.UpdateFromAuthority(firstOverrides); - - // Second Authority update (different endpoint) - var secondOverrides = new Dictionary> - { - [EndpointKey.Create("svc", "GET", "/second")] = [ - new ClaimRequirement { Type = "claim2", Value = "value2" } - ] - }; - _store.UpdateFromAuthority(secondOverrides); - - // Act - var firstClaims = _store.GetEffectiveClaims("svc", "GET", "/first"); - var secondClaims = _store.GetEffectiveClaims("svc", "GET", "/second"); - - // Assert - first override should be gone - firstClaims.Should().BeEmpty(); - secondClaims.Should().HaveCount(1); - secondClaims[0].Type.Should().Be("claim2"); - } - - [Fact] - public void UpdateFromMicroservice_EmptyClaims_RemovesFromStore() - { - // Arrange - first register claims - var endpoint = CreateEndpoint("GET", "/api/test", [ - new ClaimRequirement { Type = "scope", Value = "read" } - ]); - _store.UpdateFromMicroservice("test-service", [endpoint]); - - // Then update with empty claims - var emptyEndpoint = CreateEndpoint("GET", "/api/test", []); - _store.UpdateFromMicroservice("test-service", [emptyEndpoint]); - - // Act - var claims = _store.GetEffectiveClaims("test-service", "GET", "/api/test"); - - // Assert - claims.Should().BeEmpty(); - } - - [Fact] - public void RemoveService_RemovesAllMicroserviceClaimsForService() - { - // Arrange - var endpoints = new[] - { - CreateEndpoint("GET", "/api/a", [new ClaimRequirement { Type = "scope", Value = "a" }]), - CreateEndpoint("GET", "/api/b", [new ClaimRequirement { Type = "scope", Value = "b" }]) - }; - _store.UpdateFromMicroservice("service-to-remove", endpoints); - - var otherEndpoint = CreateEndpoint("GET", "/api/other", [ - new ClaimRequirement { Type = "scope", Value = "other" } - ]); - _store.UpdateFromMicroservice("other-service", [otherEndpoint]); - - // Act - _store.RemoveService("service-to-remove"); - - // Assert - _store.GetEffectiveClaims("service-to-remove", "GET", "/api/a").Should().BeEmpty(); - _store.GetEffectiveClaims("service-to-remove", "GET", "/api/b").Should().BeEmpty(); - _store.GetEffectiveClaims("other-service", "GET", "/api/other").Should().HaveCount(1); - } - - [Fact] - public void GetEffectiveClaims_CaseInsensitiveServiceAndPath() - { - // Arrange - var endpoint = CreateEndpoint("GET", "/API/Test", [ - new ClaimRequirement { Type = "scope", Value = "read" } - ]); - _store.UpdateFromMicroservice("Test-Service", [endpoint]); - - // Act - query with different case - var claims = _store.GetEffectiveClaims("TEST-SERVICE", "get", "/api/test"); - - // Assert - claims.Should().HaveCount(1); - claims[0].Type.Should().Be("scope"); - } - - [Fact] - public void GetEffectiveClaims_ClaimWithNullValue_Matches() - { - // Arrange - claim that only requires type, any value - var endpoint = CreateEndpoint("GET", "/api/test", [ - new ClaimRequirement { Type = "authenticated", Value = null } - ]); - _store.UpdateFromMicroservice("test-service", [endpoint]); - - // Act - var claims = _store.GetEffectiveClaims("test-service", "GET", "/api/test"); - - // Assert - claims.Should().HaveCount(1); - claims[0].Type.Should().Be("authenticated"); - claims[0].Value.Should().BeNull(); - } - - private static EndpointDescriptor CreateEndpoint( - string method, - string path, - List claims) - { - return new EndpointDescriptor - { - ServiceName = "test-service", - Version = "1.0.0", - Method = method, - Path = path, - RequiringClaims = claims - }; - } -} diff --git a/src/__Tests/StellaOps.Gateway.WebService.Tests/GatewayHealthTests.cs b/src/__Tests/StellaOps.Gateway.WebService.Tests/GatewayHealthTests.cs deleted file mode 100644 index e9c8956b6..000000000 --- a/src/__Tests/StellaOps.Gateway.WebService.Tests/GatewayHealthTests.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.AspNetCore.Mvc.Testing; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Gateway.WebService.Tests; - -public class GatewayHealthTests : IClassFixture> -{ - private readonly WebApplicationFactory _factory; - - public GatewayHealthTests(WebApplicationFactory factory) - { - _factory = factory; - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task HealthEndpoint_ReturnsOk() - { - // Arrange - var client = _factory.CreateClient(); - - // Act - var response = await client.GetAsync("/health"); - - // Assert - response.EnsureSuccessStatusCode(); - } -} diff --git a/src/__Tests/StellaOps.Gateway.WebService.Tests/StellaOps.Gateway.WebService.Tests.csproj b/src/__Tests/StellaOps.Gateway.WebService.Tests/StellaOps.Gateway.WebService.Tests.csproj deleted file mode 100644 index 329f25999..000000000 --- a/src/__Tests/StellaOps.Gateway.WebService.Tests/StellaOps.Gateway.WebService.Tests.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - net10.0 - preview - enable - enable - true - false - - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - diff --git a/src/__Tests/StellaOps.Microservice.Tests/RequestDispatcherTests.cs b/src/__Tests/StellaOps.Microservice.Tests/RequestDispatcherTests.cs index 96edacd88..790741182 100644 --- a/src/__Tests/StellaOps.Microservice.Tests/RequestDispatcherTests.cs +++ b/src/__Tests/StellaOps.Microservice.Tests/RequestDispatcherTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Text.Json; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; @@ -108,7 +108,6 @@ public sealed class RequestDispatcherTests services.AddTransient(); using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var dispatcher = new RequestDispatcher( registry, provider, diff --git a/src/__Tests/StellaOps.Microservice.Tests/TypedEndpointAdapterTests.cs b/src/__Tests/StellaOps.Microservice.Tests/TypedEndpointAdapterTests.cs index 73475e664..e97d7966f 100644 --- a/src/__Tests/StellaOps.Microservice.Tests/TypedEndpointAdapterTests.cs +++ b/src/__Tests/StellaOps.Microservice.Tests/TypedEndpointAdapterTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Text.Json; using FluentAssertions; using StellaOps.Microservice; @@ -195,7 +195,6 @@ public class TypedEndpointAdapterTests response.Body.Position = 0; using var reader = new StreamReader(response.Body); -using StellaOps.TestKit; return await reader.ReadToEndAsync(); } } diff --git a/src/__Tests/StellaOps.Router.Config.Tests/RouterConfigTests.cs b/src/__Tests/StellaOps.Router.Config.Tests/RouterConfigTests.cs index 10de461ed..ad0fec79d 100644 --- a/src/__Tests/StellaOps.Router.Config.Tests/RouterConfigTests.cs +++ b/src/__Tests/StellaOps.Router.Config.Tests/RouterConfigTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -331,7 +331,6 @@ routing: var logger = NullLogger.Instance; using var provider = new RouterConfigProvider(options, logger); -using StellaOps.TestKit; provider.Current.Routing.LocalRegion.Should().Be("eu1"); // Act - update file and manually reload diff --git a/src/__Tests/StellaOps.Router.Gateway.Tests/MiddlewareErrorScenarioTests.cs b/src/__Tests/StellaOps.Router.Gateway.Tests/MiddlewareErrorScenarioTests.cs index c0e2c6365..5bcd37d9d 100644 --- a/src/__Tests/StellaOps.Router.Gateway.Tests/MiddlewareErrorScenarioTests.cs +++ b/src/__Tests/StellaOps.Router.Gateway.Tests/MiddlewareErrorScenarioTests.cs @@ -1,4 +1,4 @@ -using System.Security.Claims; +using System.Security.Claims; using System.Text.Json; using FluentAssertions; using Microsoft.AspNetCore.Http; @@ -179,7 +179,6 @@ public sealed class MiddlewareErrorScenarioTests { context.Response.Body.Position = 0; using var doc = JsonDocument.Parse(context.Response.Body); -using StellaOps.TestKit; return doc.RootElement.Clone(); } diff --git a/src/__Tests/StellaOps.Router.Gateway.Tests/RateLimitMiddlewareTests.cs b/src/__Tests/StellaOps.Router.Gateway.Tests/RateLimitMiddlewareTests.cs index 942f62adc..d4b918abb 100644 --- a/src/__Tests/StellaOps.Router.Gateway.Tests/RateLimitMiddlewareTests.cs +++ b/src/__Tests/StellaOps.Router.Gateway.Tests/RateLimitMiddlewareTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Text.Json; using FluentAssertions; using Microsoft.AspNetCore.Http; @@ -89,7 +89,6 @@ public sealed class RateLimitMiddlewareTests var body = await new StreamReader(context.Response.Body, Encoding.UTF8).ReadToEndAsync(); using var json = JsonDocument.Parse(body); -using StellaOps.TestKit; json.RootElement.GetProperty("error").GetString().Should().Be("rate_limit_exceeded"); json.RootElement.GetProperty("scope").GetString().Should().Be("environment"); json.RootElement.GetProperty("limit").GetInt64().Should().Be(1); diff --git a/src/__Tests/StellaOps.Router.Gateway.Tests/RouterNodeConfigValidationTests.cs b/src/__Tests/StellaOps.Router.Gateway.Tests/RouterNodeConfigValidationTests.cs index e4d68764a..39a405855 100644 --- a/src/__Tests/StellaOps.Router.Gateway.Tests/RouterNodeConfigValidationTests.cs +++ b/src/__Tests/StellaOps.Router.Gateway.Tests/RouterNodeConfigValidationTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using StellaOps.Router.Gateway.Configuration; @@ -35,7 +35,6 @@ public sealed class RouterNodeConfigValidationTests using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var config = provider.GetRequiredService>().Value; config.Region.Should().Be("test"); diff --git a/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs b/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs index 075ed8283..7e5705309 100644 --- a/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs +++ b/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryChannelTests.cs @@ -1,4 +1,4 @@ -using StellaOps.Router.Common.Enums; +using StellaOps.Router.Common.Enums; using StellaOps.Router.Common.Models; using StellaOps.Router.Transport.InMemory; using Xunit; @@ -99,7 +99,6 @@ public class InMemoryChannelTests { // Arrange using var channel = new InMemoryChannel("test-1"); -using StellaOps.TestKit; var instance = new InstanceDescriptor { InstanceId = "inst-1", diff --git a/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryConnectionRegistryTests.cs b/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryConnectionRegistryTests.cs index f37305345..cc74b0fa4 100644 --- a/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryConnectionRegistryTests.cs +++ b/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/InMemoryConnectionRegistryTests.cs @@ -1,4 +1,4 @@ -using StellaOps.Router.Transport.InMemory; +using StellaOps.Router.Transport.InMemory; using Xunit; @@ -88,7 +88,6 @@ public class InMemoryConnectionRegistryTests // Arrange using var registry = new InMemoryConnectionRegistry(); -using StellaOps.TestKit; // Act var removed = registry.RemoveChannel("unknown"); diff --git a/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/StreamingFlowTests.cs b/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/StreamingFlowTests.cs index df7a622d1..500d96980 100644 --- a/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/StreamingFlowTests.cs +++ b/src/__Tests/StellaOps.Router.Transport.InMemory.Tests/StreamingFlowTests.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using Microsoft.Extensions.DependencyInjection; using StellaOps.Router.Common.Enums; using StellaOps.Router.Common.Models; @@ -72,7 +72,6 @@ public class StreamingFlowTests var testData = Encoding.UTF8.GetBytes("Test streaming data"); using var requestBody = new MemoryStream(testData); -using StellaOps.TestKit; Func readResponse = _ => Task.CompletedTask; // Act - this will send header + data frames diff --git a/src/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportTests.cs b/src/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportTests.cs index 8ee60d0c9..326d281d0 100644 --- a/src/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportTests.cs +++ b/src/__Tests/StellaOps.Router.Transport.Udp.Tests/UdpTransportTests.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Text; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -495,7 +495,6 @@ public class UdpTransportTests }); await using var provider = services.BuildServiceProvider(); -using StellaOps.TestKit; var server = provider.GetRequiredService(); var client = provider.GetRequiredService(); diff --git a/src/__Tests/StellaOps.VulnExplorer.Api.Tests/StellaOps.VulnExplorer.Api.Tests.csproj b/src/__Tests/StellaOps.VulnExplorer.Api.Tests/StellaOps.VulnExplorer.Api.Tests.csproj index 82c374f34..aa8104509 100644 --- a/src/__Tests/StellaOps.VulnExplorer.Api.Tests/StellaOps.VulnExplorer.Api.Tests.csproj +++ b/src/__Tests/StellaOps.VulnExplorer.Api.Tests/StellaOps.VulnExplorer.Api.Tests.csproj @@ -8,12 +8,7 @@ true false - - - - - - + diff --git a/src/__Tests/__Libraries/StellaOps.Infrastructure.Postgres.Testing/MigrationTestAttribute.cs b/src/__Tests/__Libraries/StellaOps.Infrastructure.Postgres.Testing/MigrationTestAttribute.cs new file mode 100644 index 000000000..622370df7 --- /dev/null +++ b/src/__Tests/__Libraries/StellaOps.Infrastructure.Postgres.Testing/MigrationTestAttribute.cs @@ -0,0 +1,153 @@ +using System.Reflection; +using Xunit; +using Xunit.Sdk; + +namespace StellaOps.Infrastructure.Postgres.Testing; + +/// +/// Marks a test method as a migration test that requires database isolation. +/// When applied, the test will automatically truncate all tables before execution. +/// +/// +/// Use this attribute on test methods that modify database state and need isolation +/// from other tests. The attribute ensures a clean database state by truncating +/// all tables in the test schema before the test runs. +/// +/// Example: +/// +/// [MigrationTest] +/// public async Task Should_Insert_Record_Successfully() +/// { +/// // Database tables are empty when this test starts +/// await _fixture.ExecuteSqlAsync("INSERT INTO ..."); +/// } +/// +/// +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] +public sealed class MigrationTestAttribute : BeforeAfterTestAttribute +{ + + /// + /// Gets or sets whether to truncate tables before the test runs. + /// Default is true. + /// + public bool TruncateBefore { get; set; } = true; + + /// + /// Gets or sets whether to truncate tables after the test runs. + /// Default is false (let the next test with TruncateBefore handle cleanup). + /// + public bool TruncateAfter { get; set; } + + /// + /// Gets or sets specific table names to truncate. If null or empty, all tables are truncated. + /// + public string[]? Tables { get; set; } + + /// + /// Called before the test method runs. + /// + public override void Before(MethodInfo methodUnderTest) + { + if (!TruncateBefore) + { + return; + } + + // Try to find the fixture from the test class + var testClass = methodUnderTest.DeclaringType; + if (testClass is null) return; + + // Look for a field or property of type PostgresIntegrationFixture + var fixtureField = testClass + .GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) + .FirstOrDefault(f => typeof(PostgresIntegrationFixture).IsAssignableFrom(f.FieldType)); + + var fixtureProperty = testClass + .GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) + .FirstOrDefault(p => typeof(PostgresIntegrationFixture).IsAssignableFrom(p.PropertyType)); + + // Note: We can't access the instance here in xUnit's BeforeAfterTestAttribute + // This is a limitation - the actual truncation needs to be done via a different mechanism + // See MigrationTestFixture for a better approach + } + + /// + /// Called after the test method runs. + /// + public override void After(MethodInfo methodUnderTest) + { + // Cleanup is optional and typically not needed + } +} + +/// +/// A test fixture wrapper that provides automatic table truncation between tests. +/// +/// The underlying PostgreSQL integration fixture type. +public abstract class MigrationTestBase : IAsyncLifetime + where TFixture : PostgresIntegrationFixture +{ + private readonly TFixture _fixture; + + /// + /// Gets the underlying test fixture. + /// + protected TFixture Fixture => _fixture; + + /// + /// Gets the connection string for direct database access. + /// + protected string ConnectionString => _fixture.ConnectionString; + + /// + /// Gets the schema name for this test. + /// + protected string SchemaName => _fixture.SchemaName; + + /// + /// Creates a new migration test base with the specified fixture. + /// + protected MigrationTestBase(TFixture fixture) + { + _fixture = fixture ?? throw new ArgumentNullException(nameof(fixture)); + } + + /// + /// Called before each test. Override to customize initialization. + /// By default, truncates all tables for test isolation. + /// + public virtual async Task InitializeAsync() + { + await _fixture.TruncateAllTablesAsync().ConfigureAwait(false); + } + + /// + /// Called after each test. Override to customize cleanup. + /// + public virtual Task DisposeAsync() + { + return Task.CompletedTask; + } + + /// + /// Executes raw SQL for test setup. + /// + protected Task ExecuteSqlAsync(string sql, CancellationToken cancellationToken = default) + => _fixture.ExecuteSqlAsync(sql, cancellationToken); +} + +/// +/// Collection definition for migration tests that require database isolation. +/// +/// +/// Apply [Collection(MigrationTestCollection.Name)] to test classes that share a database fixture. +/// Tests within the collection run sequentially to avoid database conflicts. +/// +public static class MigrationTestCollection +{ + /// + /// The collection name for migration tests. + /// + public const string Name = "MigrationTests"; +} diff --git a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/CorpusFixtureTests.cs b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/CorpusFixtureTests.cs index 2f1669b10..292d9e14d 100644 --- a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/CorpusFixtureTests.cs +++ b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/CorpusFixtureTests.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; using System.Text.Json; using FluentAssertions; using Xunit; @@ -74,7 +74,6 @@ public class CorpusFixtureTests File.Exists(truthPath).Should().BeTrue($"{id} missing ground-truth.json"); using var truthDoc = JsonDocument.Parse(File.ReadAllBytes(truthPath)); -using StellaOps.TestKit; truthDoc.RootElement.GetProperty("schema_version").GetString().Should().Be(expectedSchemaVersion, $"{id} ground-truth schema_version mismatch"); truthDoc.RootElement.GetProperty("case_id").GetString().Should().Be(id, $"{id} ground-truth case_id must match manifest id"); diff --git a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/FixtureCoverageTests.cs b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/FixtureCoverageTests.cs index 3e47886e1..300216cc7 100644 --- a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/FixtureCoverageTests.cs +++ b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/FixtureCoverageTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using FluentAssertions; using Xunit; @@ -52,7 +52,6 @@ public sealed class FixtureCoverageTests File.Exists(manifestPath).Should().BeTrue($"{manifestPath} should exist"); using var doc = JsonDocument.Parse(File.ReadAllBytes(manifestPath)); -using StellaOps.TestKit; return doc.RootElement.EnumerateArray() .Select(entry => $"{entry.GetProperty("language").GetString()}/{entry.GetProperty("id").GetString()}") .ToArray(); diff --git a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchEvaluationHarnessTests.cs b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchEvaluationHarnessTests.cs index 8f22ab7ef..56612b6f1 100644 --- a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchEvaluationHarnessTests.cs +++ b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchEvaluationHarnessTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using FluentAssertions; using Xunit; @@ -66,7 +66,6 @@ public class ReachbenchEvaluationHarnessTests File.Exists(truthPath).Should().BeTrue(); using var truthDoc = JsonDocument.Parse(File.ReadAllBytes(truthPath)); -using StellaOps.TestKit; var paths = truthDoc.RootElement.GetProperty("paths"); paths.ValueKind.Should().Be(JsonValueKind.Array, $"{caseId}:{variant} should list truth paths as an array"); return paths.GetArrayLength(); diff --git a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchFixtureTests.cs b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchFixtureTests.cs index 820474e43..deabb0a5d 100644 --- a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchFixtureTests.cs +++ b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/ReachbenchFixtureTests.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using FluentAssertions; using Xunit; using System.Security.Cryptography; @@ -148,7 +148,6 @@ public class ReachbenchFixtureTests var manifestPath = Path.Combine(variantPath, "manifest.json"); using var manifestStream = File.OpenRead(manifestPath); using var manifestDoc = JsonDocument.Parse(manifestStream); -using StellaOps.TestKit; var files = manifestDoc.RootElement.GetProperty("files"); foreach (var file in requiredFiles.Where(f => f != "manifest.json")) diff --git a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/SamplesPublicFixtureTests.cs b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/SamplesPublicFixtureTests.cs index 46ef8fe52..c4ab1ada0 100644 --- a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/SamplesPublicFixtureTests.cs +++ b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/SamplesPublicFixtureTests.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; using System.Text.Json; using FluentAssertions; using Xunit; @@ -30,7 +30,6 @@ public class SamplesPublicFixtureTests using var stream = File.OpenRead(manifestPath); using var doc = JsonDocument.Parse(stream); -using StellaOps.TestKit; doc.RootElement.ValueKind.Should().Be(JsonValueKind.Array); var keys = doc.RootElement.EnumerateArray() diff --git a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/StellaOps.Reachability.FixtureTests.csproj b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/StellaOps.Reachability.FixtureTests.csproj index 604e627ae..06bdc15aa 100644 --- a/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/StellaOps.Reachability.FixtureTests.csproj +++ b/src/__Tests/reachability/StellaOps.Reachability.FixtureTests/StellaOps.Reachability.FixtureTests.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/CanonicalJsonTests.cs b/src/__Tests/reachability/StellaOps.Replay.Core.Tests/CanonicalJsonTests.cs deleted file mode 100644 index da58d26e2..000000000 --- a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/CanonicalJsonTests.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Text.Json; -using FluentAssertions; -using StellaOps.Replay.Core; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Replay.Core.Tests; - -public sealed class CanonicalJsonTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void CanonicalJson_OrdersPropertiesLexicographically() - { - var payload = new - { - zeta = 1, - alpha = new { z = 9, m = 7 }, - list = new[] { new { y = 2, x = 1 } } - }; - - var canonical = CanonicalJson.Serialize(payload); - - canonical.Should().Be("{\"alpha\":{\"m\":7,\"z\":9},\"list\":[{\"x\":1,\"y\":2}],\"zeta\":1}"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void CanonicalJson_PreservesNumbersAndBooleans() - { - var payload = JsonSerializer.Deserialize("{\"b\":true,\"a\":1.25}"); - - var canonical = CanonicalJson.Serialize(payload); - - canonical.Should().Be("{\"a\":1.25,\"b\":true}"); - } -} diff --git a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/DeterministicHashTests.cs b/src/__Tests/reachability/StellaOps.Replay.Core.Tests/DeterministicHashTests.cs deleted file mode 100644 index d64822058..000000000 --- a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/DeterministicHashTests.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Text; -using FluentAssertions; -using StellaOps.Replay.Core; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Replay.Core.Tests; - -public sealed class DeterministicHashTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void Sha256Hex_ComputesLowercaseDigest() - { - var digest = DeterministicHash.Sha256Hex("replay-core"); - - digest.Should().Be("a914f5ac6a57aab0189bb55bcb0ef6bcdbd86f77198c8669eab5ae38a325e41d"); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void MerkleRootHex_IsDeterministic() - { - var leaves = new[] { "alpha", "beta", "gamma" } - .Select(Encoding.UTF8.GetBytes) - .ToList(); - - var root = DeterministicHash.MerkleRootHex(leaves); - - root.Should().Be("50298939464ed02cbf2b587250a55746b3422e133ac4f09b7e2b07869023bc9e"); - DeterministicHash.MerkleRootHex(leaves).Should().Be(root); - } -} diff --git a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/DsseEnvelopeTests.cs b/src/__Tests/reachability/StellaOps.Replay.Core.Tests/DsseEnvelopeTests.cs deleted file mode 100644 index 0f0775f89..000000000 --- a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/DsseEnvelopeTests.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Text; -using FluentAssertions; -using StellaOps.Replay.Core; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Replay.Core.Tests; - -public sealed class DsseEnvelopeTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BuildUnsigned_ProducesCanonicalPayload() - { - var manifest = new ReplayManifest - { - Scan = new ReplayScanMetadata - { - Id = "scan-123", - Time = DateTimeOffset.UnixEpoch - } - }; - - var envelope = DssePayloadBuilder.BuildUnsigned(manifest); - - envelope.PayloadType.Should().Be(DssePayloadBuilder.ReplayPayloadType); - envelope.Signatures.Should().BeEmpty(); - - var payload = Convert.FromBase64String(envelope.Payload); - var json = Encoding.UTF8.GetString(payload); - - json.Should().Be("{\"reachability\":{\"graphs\":[],\"runtimeTraces\":[]},\"scan\":{\"id\":\"scan-123\",\"time\":\"1970-01-01T00:00:00+00:00\"},\"schemaVersion\":\"1.0\"}"); - envelope.DigestSha256.Should().Be(DeterministicHash.Sha256Hex(payload)); - } -} diff --git a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/ReplayBundleWriterTests.cs b/src/__Tests/reachability/StellaOps.Replay.Core.Tests/ReplayBundleWriterTests.cs deleted file mode 100644 index 92fc4646f..000000000 --- a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/ReplayBundleWriterTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Collections.Generic; -using System.Formats.Tar; -using System.IO; -using FluentAssertions; -using StellaOps.Replay.Core; -using ZstdSharp; -using Xunit; - - -using StellaOps.TestKit; -namespace StellaOps.Replay.Core.Tests; - -public sealed class ReplayBundleWriterTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public async Task WriteTarZstAsync_IsDeterministicAndSorted() - { - var entries = new[] - { - new ReplayBundleEntry("b.txt", "beta"u8.ToArray()), - new ReplayBundleEntry("a.txt", "alpha"u8.ToArray()) - }; - - await using var buffer = new MemoryStream(); - var first = await ReplayBundleWriter.WriteTarZstAsync(entries, buffer, compressionLevel: 3); - - var firstBytes = buffer.ToArray(); - - await using var buffer2 = new MemoryStream(); - var second = await ReplayBundleWriter.WriteTarZstAsync(entries.Reverse(), buffer2, compressionLevel: 3); - - first.ZstSha256.Should().Be(second.ZstSha256); - first.TarSha256.Should().Be(second.TarSha256); - firstBytes.Should().Equal(buffer2.ToArray()); - - // Decompress and verify ordering/content - buffer.Position = 0; - await using var decompressed = new MemoryStream(); - await using (var decompress = new DecompressionStream(buffer, 16 * 1024, leaveOpen: true, enableMultiThreaded: false)) - { - await decompress.CopyToAsync(decompressed); - } - - decompressed.Position = 0; - var reader = new TarReader(decompressed, leaveOpen: true); - var names = new List(); - TarEntry? entry; - while ((entry = reader.GetNextEntry()) != null) - { - names.Add(entry.Name); - using var ms = new MemoryStream(); -using StellaOps.TestKit; - entry.DataStream!.CopyTo(ms); - var text = System.Text.Encoding.UTF8.GetString(ms.ToArray()); - text.Should().Be(entry.Name.StartsWith("a") ? "alpha" : "beta"); - } - - names.Should().BeEquivalentTo(new[] { "a.txt", "b.txt" }, opts => opts.WithStrictOrdering()); - } - - [Trait("Category", TestCategories.Unit)] - [Fact] - public void BuildCasUri_UsesPrefixAndShard() - { - ReplayBundleWriter.BuildCasUri("abcdef", null).Should().Be("cas://replay/ab/abcdef.tar.zst"); - ReplayBundleWriter.BuildCasUri("1234", "custom").Should().Be("cas://custom/12/1234.tar.zst"); - } -} diff --git a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/ReplayManifestExtensionsTests.cs b/src/__Tests/reachability/StellaOps.Replay.Core.Tests/ReplayManifestExtensionsTests.cs deleted file mode 100644 index 965727489..000000000 --- a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/ReplayManifestExtensionsTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Text.Json; -using FluentAssertions; -using StellaOps.Replay.Core; -using Xunit; - -using StellaOps.TestKit; -namespace StellaOps.Replay.Core.Tests; - -public sealed class ReplayManifestExtensionsTests -{ - [Trait("Category", TestCategories.Unit)] - [Fact] - public void AddsReachabilityEvidence() - { - var manifest = new ReplayManifest - { - Scan = new ReplayScanMetadata { Id = "scan-1" } - }; - - manifest.AddReachabilityGraph(new ReplayReachabilityGraphReference - { - Kind = "static", - Analyzer = "scanner/java", - CasUri = "cas://replay/graph", - Sha256 = "abc", - Version = "1.0" - }); - - manifest.AddReachabilityTrace(new ReplayReachabilityTraceReference - { - Source = "zastava", - CasUri = "cas://replay/trace", - Sha256 = "def" - }); - - manifest.Reachability.Should().NotBeNull(); - manifest.Reachability!.Graphs.Should().HaveCount(1); - manifest.Reachability.RuntimeTraces.Should().HaveCount(1); - - var json = JsonSerializer.Serialize(manifest); - json.Should().Contain("\"reachability\""); - } -} diff --git a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj b/src/__Tests/reachability/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj deleted file mode 100644 index c200d3bd3..000000000 --- a/src/__Tests/reachability/StellaOps.Replay.Core.Tests/StellaOps.Replay.Core.Tests.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - net10.0 - enable - enable - preview - false - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - diff --git a/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/ScannerToSignalsReachabilityTests.cs b/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/ScannerToSignalsReachabilityTests.cs index 9f2142b41..d10d48d60 100644 --- a/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/ScannerToSignalsReachabilityTests.cs +++ b/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/ScannerToSignalsReachabilityTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -330,7 +330,6 @@ public sealed class ScannerToSignalsReachabilityTests if (request.ManifestContent is not null) { await using var manifestBuffer = new MemoryStream(); -using StellaOps.TestKit; await request.ManifestContent.CopyToAsync(manifestBuffer, cancellationToken).ConfigureAwait(false); manifests[computedHash] = manifestBuffer.ToArray(); } diff --git a/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/StellaOps.ScannerSignals.IntegrationTests.csproj b/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/StellaOps.ScannerSignals.IntegrationTests.csproj index 81e2f45ac..3e3e1c113 100644 --- a/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/StellaOps.ScannerSignals.IntegrationTests.csproj +++ b/src/__Tests/reachability/StellaOps.ScannerSignals.IntegrationTests/StellaOps.ScannerSignals.IntegrationTests.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/__Tests/reachability/StellaOps.Signals.Reachability.Tests/ReachabilityScoringTests.cs b/src/__Tests/reachability/StellaOps.Signals.Reachability.Tests/ReachabilityScoringTests.cs index 2012d37ac..566c19403 100644 --- a/src/__Tests/reachability/StellaOps.Signals.Reachability.Tests/ReachabilityScoringTests.cs +++ b/src/__Tests/reachability/StellaOps.Signals.Reachability.Tests/ReachabilityScoringTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -145,7 +145,6 @@ public sealed class ReachabilityScoringTests } using var doc = JsonDocument.Parse(line); -using StellaOps.TestKit; if (doc.RootElement.TryGetProperty("sid", out var sidProp)) { runtimeHits.Add(sidProp.GetString()!); diff --git a/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackBuilderTests.cs b/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackBuilderTests.cs deleted file mode 100644 index 0b6a4ea79..000000000 --- a/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackBuilderTests.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace StellaOps.AuditPack.Tests; - -using StellaOps.AuditPack.Models; -using StellaOps.AuditPack.Services; - -[Trait("Category", "Unit")] -public class AuditPackBuilderTests -{ - [Fact] - public async Task Build_FromScanResult_CreatesCompletePack() - { - // Arrange - var scanResult = new ScanResult("scan-123"); - var builder = new AuditPackBuilder(); - var options = new AuditPackOptions { Name = "test-pack" }; - - // Act - var pack = await builder.BuildAsync(scanResult, options); - - // Assert - pack.Should().NotBeNull(); - pack.PackId.Should().NotBeNullOrEmpty(); - pack.Name.Should().Be("test-pack"); - pack.RunManifest.Should().NotBeNull(); - pack.Verdict.Should().NotBeNull(); - pack.EvidenceIndex.Should().NotBeNull(); - pack.PackDigest.Should().NotBeNullOrEmpty(); - } - - [Fact] - public async Task Export_CreatesValidArchive() - { - // Arrange - var scanResult = new ScanResult("scan-123"); - var builder = new AuditPackBuilder(); - var pack = await builder.BuildAsync(scanResult, new AuditPackOptions()); - - var outputPath = Path.Combine(Path.GetTempPath(), $"test-pack-{Guid.NewGuid():N}.tar.gz"); - var exportOptions = new ExportOptions { Sign = false }; - - try - { - // Act - await builder.ExportAsync(pack, outputPath, exportOptions); - - // Assert - File.Exists(outputPath).Should().BeTrue(); - var fileInfo = new FileInfo(outputPath); - fileInfo.Length.Should().BeGreaterThan(0); - } - finally - { - if (File.Exists(outputPath)) - File.Delete(outputPath); - } - } - - [Fact] - public void PackDigest_IsComputedCorrectly() - { - // Arrange - var pack = new AuditPack - { - PackId = "test-pack", - Name = "Test Pack", - CreatedAt = new DateTimeOffset(2025, 1, 1, 0, 0, 0, TimeSpan.Zero), - RunManifest = new RunManifest("scan-1", DateTimeOffset.UtcNow), - EvidenceIndex = new EvidenceIndex([]), - Verdict = new Verdict("verdict-1", "pass"), - OfflineBundle = new BundleManifest("bundle-1", "1.0"), - Contents = new PackContents() - }; - - // Act - digest should be set during build - pack.PackDigest.Should().NotBeNull(); - } -} diff --git a/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackImporterTests.cs b/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackImporterTests.cs deleted file mode 100644 index 51765fc86..000000000 --- a/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackImporterTests.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace StellaOps.AuditPack.Tests; - -using StellaOps.AuditPack.Services; - -[Trait("Category", "Unit")] -public class AuditPackImporterTests -{ - [Fact] - public async Task Import_ValidPack_Succeeds() - { - // Arrange - var archivePath = await CreateTestArchiveAsync(); - var importer = new AuditPackImporter(); - var options = new ImportOptions { VerifySignatures = false }; - - try - { - // Act - var result = await importer.ImportAsync(archivePath, options); - - // Assert - result.Success.Should().BeTrue(); - result.Pack.Should().NotBeNull(); - result.IntegrityResult?.IsValid.Should().BeTrue(); - } - finally - { - if (File.Exists(archivePath)) - File.Delete(archivePath); - } - } - - [Fact] - public async Task Import_MissingManifest_Fails() - { - // Arrange - var archivePath = Path.Combine(Path.GetTempPath(), "invalid.tar.gz"); - await CreateEmptyArchiveAsync(archivePath); - - var importer = new AuditPackImporter(); - - try - { - // Act - var result = await importer.ImportAsync(archivePath, new ImportOptions()); - - // Assert - result.Success.Should().BeFalse(); - result.Errors.Should().Contain(e => e.Contains("Manifest")); - } - finally - { - if (File.Exists(archivePath)) - File.Delete(archivePath); - } - } - - private static async Task CreateTestArchiveAsync() - { - // Create a test pack and export it - var builder = new AuditPackBuilder(); - var pack = await builder.BuildAsync( - new ScanResult("test-scan"), - new AuditPackOptions()); - - var archivePath = Path.Combine(Path.GetTempPath(), $"test-{Guid.NewGuid():N}.tar.gz"); - await builder.ExportAsync(pack, archivePath, new ExportOptions { Sign = false }); - - return archivePath; - } - - private static async Task CreateEmptyArchiveAsync(string path) - { - // Create an empty tar.gz - using var fs = File.Create(path); - using var gz = new System.IO.Compression.GZipStream(fs, System.IO.Compression.CompressionLevel.Fastest); - await gz.WriteAsync(new byte[] { 0 }); - } -} diff --git a/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackReplayerTests.cs b/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackReplayerTests.cs deleted file mode 100644 index 79d838e78..000000000 --- a/src/__Tests/unit/StellaOps.AuditPack.Tests/AuditPackReplayerTests.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace StellaOps.AuditPack.Tests; - -using StellaOps.AuditPack.Models; -using StellaOps.AuditPack.Services; - -[Trait("Category", "Unit")] -public class AuditPackReplayerTests -{ - [Fact] - public async Task Replay_ValidPack_ProducesResult() - { - // Arrange - var pack = CreateTestPack(); - var importResult = new ImportResult - { - Success = true, - Pack = pack, - ExtractDirectory = Path.GetTempPath() - }; - - var replayer = new AuditPackReplayer(); - - // Act - var result = await replayer.ReplayAsync(importResult); - - // Assert - result.Success.Should().BeTrue(); - result.OriginalVerdictDigest.Should().NotBeNullOrEmpty(); - result.ReplayedVerdictDigest.Should().NotBeNullOrEmpty(); - } - - [Fact] - public async Task Replay_InvalidImport_Fails() - { - // Arrange - var importResult = new ImportResult { Success = false }; - var replayer = new AuditPackReplayer(); - - // Act - var result = await replayer.ReplayAsync(importResult); - - // Assert - result.Success.Should().BeFalse(); - result.Error.Should().Contain("Invalid import"); - } - - private static AuditPack CreateTestPack() - { - return new AuditPack - { - PackId = "test-pack", - Name = "Test Pack", - CreatedAt = DateTimeOffset.UtcNow, - RunManifest = new RunManifest("scan-1", DateTimeOffset.UtcNow), - EvidenceIndex = new EvidenceIndex([]), - Verdict = new Verdict("verdict-1", "pass"), - OfflineBundle = new BundleManifest("bundle-1", "1.0"), - Contents = new PackContents() - }; - } -} diff --git a/src/__Tests/unit/StellaOps.AuditPack.Tests/StellaOps.AuditPack.Tests.csproj b/src/__Tests/unit/StellaOps.AuditPack.Tests/StellaOps.AuditPack.Tests.csproj deleted file mode 100644 index 6b9841616..000000000 --- a/src/__Tests/unit/StellaOps.AuditPack.Tests/StellaOps.AuditPack.Tests.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - net10.0 - enable - enable - false - true - preview - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - - - -