Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,30 @@
"Bash(wget:*)",
"Bash(chmod:*)",
"Bash(/tmp/dotnet-install.sh:*)",
"Bash(export PATH=\"$HOME/.dotnet:$PATH\")"
"Bash(export PATH=\"$HOME/.dotnet:$PATH\")",
"Bash(dotnet run:*)",
"WebFetch(domain:mermaid.js.org)",
"Bash(dotnet test:*)",
"Bash(echo:*)",
"Bash(dotnet restore:*)",
"Bash(dotnet sln:*)",
"Bash(dotnet clean:*)",
"Bash(unset ANTHROPIC_API_KEY)",
"Bash(export PATH=\"$HOME/.dotnet:$PATH:/usr/bin\")",
"Bash($HOME/.dotnet/dotnet restore DocFlow.sln --packages /tmp/nuget_packages)",
"Bash($HOME/.dotnet/dotnet build:*)",
"Bash(/root/.dotnet/dotnet restore:*)",
"Bash(/root/.dotnet/dotnet build:*)",
"Bash(/root/.dotnet/dotnet pack:*)",
"Bash(/root/.dotnet/dotnet nuget verify:*)",
"Bash(/root/.dotnet/dotnet tool install:*)",
"Bash(/root/.dotnet/dotnet tool update:*)",
"Bash(export PATH=\"$PATH:/root/.dotnet/tools\")",
"Bash(docflow --version:*)",
"Bash(unzip:*)",
"Bash(/root/.dotnet/dotnet run --project src/DocFlow.CLI/DocFlow.CLI.csproj -- codegen test-input.mmd -o test-output.cs -n TestNamespace)",
"Bash(/root/.dotnet/dotnet run:*)",
"Bash(/root/.dotnet/dotnet test:*)"
]
}
}
182 changes: 146 additions & 36 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,34 @@

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Status

DocFlow is an intelligent documentation and modeling toolkit. Current implementation status:

| Component | Status | Description |
|-----------|--------|-------------|
| C# β†’ Mermaid | **Complete** | Roslyn-based parsing, class diagram generation |
| Mermaid β†’ C# | **Complete** | DDD-style code generation with records |
| Round-trip | **Complete** | Bidirectional with semantic preservation |
| Whiteboard Scanner | **Complete** | Claude Vision API integration |
| CLI | **Complete** | System.CommandLine + Spectre.Console |
| Integration Module | **Scaffolded** | OpenAPI parsing, CDM mapping designed |
| IMS Learning | Designed | Pattern learning system (not implemented) |
| Document Pipeline | Planned | PDF/Word conversion |

## Build and Test Commands

```bash
# Build the entire solution
dotnet build

# Run all tests
# Run all tests (91+ tests across 3 projects)
dotnet test

# Run a specific test project
dotnet test tests/DocFlow.Core.Tests
# Run specific test project
dotnet test tests/DocFlow.CodeAnalysis.Tests # 20 tests
dotnet test tests/DocFlow.Diagrams.Tests # 52 tests
dotnet test tests/DocFlow.CodeGen.Tests # 19 tests

# Run a single test by filter
dotnet test --filter "FullyQualifiedName~TestMethodName"
Expand All @@ -21,68 +38,161 @@ dotnet test --filter "FullyQualifiedName~TestMethodName"
dotnet run --project src/DocFlow.CLI -- <command> [args]
```

## CLI Commands

```bash
# Generate Mermaid from C#
docflow diagram <input.cs> [-o output.mmd] [-r] [-v]

# Generate C# from Mermaid
docflow codegen <input.mmd> [-o output.cs] [-n namespace] [--style ddd|poco]

# Full round-trip test
docflow roundtrip <input.cs> [-o dir] [--compare] [-v]

# AI-powered whiteboard scanning
docflow scan <image> [-o output.mmd] [-c context] [-v]
```

## Architecture Overview

DocFlow transforms between diagrams, documentation, and code by routing everything through a **Canonical Semantic Model** - an ontology-grounded intermediate representation.
DocFlow transforms between diagrams, documentation, and code by routing everything through a **Canonical Semantic Model**.

### Core Data Flow

```
Source Format β†’ IModelParser β†’ SemanticModel β†’ IModelGenerator β†’ Target Format
```

All transformations are bidirectional. The semantic model captures **meaning**, not syntax - e.g., both `ICollection<LineItem>` in C# and a filled diamond in UML represent *composition*.
All transformations are bidirectional. The semantic model captures **meaning**, not syntax.

### Key Abstractions (DocFlow.Core)

- **SemanticModel** (`CanonicalModel/SemanticModel.cs`): The central model containing entities, relationships, and namespaces. All parsers write to it, all generators read from it.
- **SemanticEntity** (`CanonicalModel/SemanticEntity.cs`): Represents classes, interfaces, value objects, etc. with DDD-aware classification (`EntityClassification` enum).
- **SemanticRelationship** (`CanonicalModel/SemanticRelationship.cs`): Captures relationship semantics (Composition vs Aggregation vs Association, multiplicities, DDD patterns like `ReferenceById`).
- **IModelParser** / **IModelGenerator** (`Abstractions/IModelTransformers.cs`): Interfaces for format-specific transformers. `IBidirectionalTransformer` combines both for round-trip capable formats.

### Intelligent Mapping Service (DocFlow.IMS)

The IMS learns transformation patterns from examples and applies them to new inputs:
- Observes transformations and extracts `LearnedPattern` instances
- Suggests mappings with confidence scores (Bayesian-style with Laplace smoothing)
- Improves from user feedback via `MappingFeedback`
- Bidirectional by design: if A→B works, B→A should too
- **SemanticModel** (`CanonicalModel/SemanticModel.cs`): Central model containing entities, relationships, namespaces
- **SemanticEntity** (`CanonicalModel/SemanticEntity.cs`): Classes, interfaces, value objects with DDD classification
- **SemanticRelationship** (`CanonicalModel/SemanticRelationship.cs`): Relationship semantics (Composition, Aggregation, etc.)
- **IModelParser / IModelGenerator** (`Abstractions/IModelTransformers.cs`): Format-specific transformers

### Project Dependencies

```
DocFlow.CLI (entry point)
β”œβ”€β”€ DocFlow.Core (canonical model, abstractions)
β”œβ”€β”€ DocFlow.Diagrams (Mermaid, PlantUML)
β”œβ”€β”€ DocFlow.Documents (Markdown, PDF, Word)
β”œβ”€β”€ DocFlow.CodeAnalysis (Roslyn-based C# parsing)
β”œβ”€β”€ DocFlow.CodeGen (code generation from model)
β”œβ”€β”€ DocFlow.Vision (computer vision, whiteboard scanning)
β”œβ”€β”€ DocFlow.IMS (pattern learning)
β”œβ”€β”€ DocFlow.Ontology (DDD pattern classification)
└── DocFlow.AI (AI provider integrations)
β”œβ”€β”€ DocFlow.Core # Canonical model, abstractions
β”œβ”€β”€ DocFlow.Diagrams # Mermaid parsing & generation
β”œβ”€β”€ DocFlow.CodeAnalysis # Roslyn-based C# parsing
β”œβ”€β”€ DocFlow.CodeGen # C# code generation
β”œβ”€β”€ DocFlow.Vision # Whiteboard scanning (Claude Vision)
β”œβ”€β”€ DocFlow.AI # AI provider abstraction (Claude API)
β”œβ”€β”€ DocFlow.IMS # Intelligent Mapping Service
β”œβ”€β”€ DocFlow.Ontology # DDD pattern classification
β”œβ”€β”€ DocFlow.Documents # Document pipeline (planned)
β”œβ”€β”€ DocFlow.Integration # API integration (scaffolded)
└── DocFlow.Web # Web UI (planned)
```

### DDD Pattern Support

Entity classifications follow DDD tactical patterns: `AggregateRoot`, `Entity`, `ValueObject`, `DomainEvent`, `Repository`, etc. The model validates DDD invariants (e.g., entities should have identity, value objects should not).
Entity classifications follow DDD tactical patterns:
- `AggregateRoot` - Aggregate boundary with identity
- `Entity` - Has identity, lifecycle
- `ValueObject` - Immutable, equality by value
- `DomainService` - Stateless operations
- `DomainEvent` - Something that happened
- `Repository` - Collection-like persistence
- `Interface` - Contract definition
- `Enum` - Enumeration type

## Implemented Features

### Configuration
### 1. C# to Mermaid (DocFlow.CodeAnalysis + DocFlow.Diagrams)

Uses `docflow.json` in project root. Supports environment variable substitution (e.g., `${ANTHROPIC_API_KEY}`).
**Parser**: `CSharpModelParser` - Uses Roslyn to extract:
- Classes, records, interfaces, enums
- Properties with types and visibility
- Methods with signatures
- Inheritance and interface implementation
- Composition/aggregation from collection properties
- DDD stereotypes from naming conventions

## Flagship Feature: Whiteboard Scanning
The killer demo feature is `docflow scan` - photograph a whiteboard sketch and convert it to working code. The pipeline: Image β†’ Preprocessing (OpenCV) β†’ Shape/Text Detection β†’ AI Semantic Analysis (Claude API) β†’ SemanticModel β†’ Code/Diagram output. See `DocFlow.Vision/IWhiteboardScanner.cs` for the full interface.
**Generator**: `MermaidClassDiagramGenerator` - Produces:
- Valid Mermaid classDiagram syntax
- Property/method visibility markers (+, -, #)
- Relationship arrows (inheritance, composition, association)
- DDD stereotype annotations

## AI Strategy
Hybrid approach: Use local models (ONNX) for fast/cheap operations (shape detection, basic OCR), API calls (Claude/OpenAI) for semantic understanding. Provider abstraction in `DocFlow.AI/Providers/IAiProvider.cs`.
### 2. Mermaid to C# (DocFlow.Diagrams + DocFlow.CodeGen)

**Parser**: `MermaidClassDiagramParser` - Extracts:
- Class definitions with members
- Stereotypes (<<interface>>, <<abstract>>, <<AggregateRoot>>)
- Relationships and multiplicities

**Generator**: `CSharpModelGenerator` - Produces:
- Nullable-enabled C# 12 code
- Records for ValueObjects, classes for Entities
- Proper access modifiers
- XML documentation comments
- DDD-style aggregate boundaries

### 3. Whiteboard Scanner (DocFlow.Vision + DocFlow.AI)

**Components**:
- `WhiteboardScanner` - Orchestrates the scanning pipeline
- `ClaudeProvider` - Claude API client with vision support
- `IWhiteboardScanner` interface for abstraction

**Flow**: Image β†’ Base64 β†’ Claude Vision API β†’ Mermaid text β†’ MermaidParser β†’ SemanticModel

**API Key Resolution** (priority order):
1. Environment variable: `ANTHROPIC_API_KEY`
2. User config: `~/.docflow/config.json`
3. Project config: `./docflow.json`

### 4. Integration Module (DocFlow.Integration) - Scaffolded

Designed but not fully implemented. Extends the canonical model to API integrations:

- **OpenApiParser** - Parse OpenAPI 3.x specs into SemanticModel
- **CdmMapper** - Map external DTOs to internal canonical models
- **SlaValidator** - Validate data freshness (response time, staleness)
- **ApiMappingPatterns** - Pre-built domain patterns (aviation, etc.)

See `docs/design/integration-module.md` for full design.

## Code Style

- .NET 8, C# 12, nullable enabled everywhere
- Prefer records for immutable types (especially Value Objects)
- Use `required` keyword for mandatory properties
- Async all the way down with CancellationToken support
- Follow Microsoft naming conventions

## Current Priority
Phase 1 MVP: C# β†’ Mermaid class diagram generator. Proves the full pipeline (Roslyn parser β†’ SemanticModel β†’ Mermaid generator).
- Use collection expressions `[]` instead of `new List<T>()`

## Testing

91+ unit tests covering:
- C# parsing accuracy (class, record, interface, enum)
- Mermaid generation correctness
- Round-trip semantic preservation
- DDD pattern detection
- Relationship extraction

## Configuration

API keys can be configured via:
1. Environment variable: `ANTHROPIC_API_KEY`
2. User config: `~/.docflow/config.json` with `{"anthropicApiKey": "..."}`
3. Project config: `./docflow.json` with `{"anthropicApiKey": "..."}`

## Key Files

| File | Purpose |
|------|---------|
| `src/DocFlow.Core/CanonicalModel/SemanticModel.cs` | Central semantic model |
| `src/DocFlow.CodeAnalysis/CSharp/CSharpModelParser.cs` | C# β†’ SemanticModel |
| `src/DocFlow.Diagrams/Mermaid/MermaidClassDiagramGenerator.cs` | SemanticModel β†’ Mermaid |
| `src/DocFlow.Diagrams/Mermaid/MermaidClassDiagramParser.cs` | Mermaid β†’ SemanticModel |
| `src/DocFlow.CodeGen/CSharp/CSharpModelGenerator.cs` | SemanticModel β†’ C# |
| `src/DocFlow.Vision/WhiteboardScanner.cs` | Image β†’ SemanticModel |
| `src/DocFlow.AI/Providers/ClaudeProvider.cs` | Claude API integration |
| `src/DocFlow.CLI/Program.cs` | CLI entry point |
69 changes: 59 additions & 10 deletions DocFlow.sln
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.AI", "src\DocFlow.A
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.CLI", "src\DocFlow.CLI\DocFlow.CLI.csproj", "{D0E1F2A3-ABCD-EF01-2345-678901234567}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.Web", "src\DocFlow.Web\DocFlow.Web.csproj", "{E1F2A3B4-BCDE-F012-3456-789012345678}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.Integration", "src\DocFlow.Integration\DocFlow.Integration.csproj", "{F8A9B0C1-2345-6789-ABCD-456789012345}"
EndProject

# Test Projects
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.Core.Tests", "tests\DocFlow.Core.Tests\DocFlow.Core.Tests.csproj", "{F2A3B4C5-CDEF-0123-4567-890123456789}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.Vision.Tests", "tests\DocFlow.Vision.Tests\DocFlow.Vision.Tests.csproj", "{A3B4C5D6-DEF0-1234-5678-901234567890}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.CodeAnalysis.Tests", "tests\DocFlow.CodeAnalysis.Tests\DocFlow.CodeAnalysis.Tests.csproj", "{C5D6E7F8-F012-3456-789A-123456789012}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.IMS.Tests", "tests\DocFlow.IMS.Tests\DocFlow.IMS.Tests.csproj", "{B4C5D6E7-EF01-2345-6789-012345678901}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.Diagrams.Tests", "tests\DocFlow.Diagrams.Tests\DocFlow.Diagrams.Tests.csproj", "{D6E7F8A9-0123-4567-89AB-234567890123}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.CodeAnalysis.Tests", "tests\DocFlow.CodeAnalysis.Tests\DocFlow.CodeAnalysis.Tests.csproj", "{C5D6E7F8-F012-3456-789A-123456789012}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocFlow.CodeGen.Tests", "tests\DocFlow.CodeGen.Tests\DocFlow.CodeGen.Tests.csproj", "{E7F8A9B0-1234-5678-9ABC-345678901234}"
EndProject

# Solution Folders
Expand All @@ -54,6 +52,58 @@ Global
{A1B2C3D4-1234-5678-9ABC-DEF012345678}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1B2C3D4-1234-5678-9ABC-DEF012345678}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1B2C3D4-1234-5678-9ABC-DEF012345678}.Release|Any CPU.Build.0 = Release|Any CPU
{B2C3D4E5-2345-6789-ABCD-EF0123456789}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B2C3D4E5-2345-6789-ABCD-EF0123456789}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B2C3D4E5-2345-6789-ABCD-EF0123456789}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B2C3D4E5-2345-6789-ABCD-EF0123456789}.Release|Any CPU.Build.0 = Release|Any CPU
{C3D4E5F6-3456-789A-BCDE-F01234567890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3D4E5F6-3456-789A-BCDE-F01234567890}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C3D4E5F6-3456-789A-BCDE-F01234567890}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C3D4E5F6-3456-789A-BCDE-F01234567890}.Release|Any CPU.Build.0 = Release|Any CPU
{D4E5F6A7-4567-89AB-CDEF-012345678901}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D4E5F6A7-4567-89AB-CDEF-012345678901}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D4E5F6A7-4567-89AB-CDEF-012345678901}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D4E5F6A7-4567-89AB-CDEF-012345678901}.Release|Any CPU.Build.0 = Release|Any CPU
{E5F6A7B8-5678-9ABC-DEF0-123456789012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5F6A7B8-5678-9ABC-DEF0-123456789012}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E5F6A7B8-5678-9ABC-DEF0-123456789012}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5F6A7B8-5678-9ABC-DEF0-123456789012}.Release|Any CPU.Build.0 = Release|Any CPU
{F6A7B8C9-6789-ABCD-EF01-234567890123}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F6A7B8C9-6789-ABCD-EF01-234567890123}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6A7B8C9-6789-ABCD-EF01-234567890123}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6A7B8C9-6789-ABCD-EF01-234567890123}.Release|Any CPU.Build.0 = Release|Any CPU
{A7B8C9D0-789A-BCDE-F012-345678901234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A7B8C9D0-789A-BCDE-F012-345678901234}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A7B8C9D0-789A-BCDE-F012-345678901234}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A7B8C9D0-789A-BCDE-F012-345678901234}.Release|Any CPU.Build.0 = Release|Any CPU
{B8C9D0E1-89AB-CDEF-0123-456789012345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8C9D0E1-89AB-CDEF-0123-456789012345}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8C9D0E1-89AB-CDEF-0123-456789012345}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8C9D0E1-89AB-CDEF-0123-456789012345}.Release|Any CPU.Build.0 = Release|Any CPU
{C9D0E1F2-9ABC-DEF0-1234-567890123456}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C9D0E1F2-9ABC-DEF0-1234-567890123456}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C9D0E1F2-9ABC-DEF0-1234-567890123456}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9D0E1F2-9ABC-DEF0-1234-567890123456}.Release|Any CPU.Build.0 = Release|Any CPU
{D0E1F2A3-ABCD-EF01-2345-678901234567}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D0E1F2A3-ABCD-EF01-2345-678901234567}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D0E1F2A3-ABCD-EF01-2345-678901234567}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D0E1F2A3-ABCD-EF01-2345-678901234567}.Release|Any CPU.Build.0 = Release|Any CPU
{F8A9B0C1-2345-6789-ABCD-456789012345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8A9B0C1-2345-6789-ABCD-456789012345}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F8A9B0C1-2345-6789-ABCD-456789012345}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F8A9B0C1-2345-6789-ABCD-456789012345}.Release|Any CPU.Build.0 = Release|Any CPU
{C5D6E7F8-F012-3456-789A-123456789012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C5D6E7F8-F012-3456-789A-123456789012}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C5D6E7F8-F012-3456-789A-123456789012}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C5D6E7F8-F012-3456-789A-123456789012}.Release|Any CPU.Build.0 = Release|Any CPU
{D6E7F8A9-0123-4567-89AB-234567890123}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6E7F8A9-0123-4567-89AB-234567890123}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6E7F8A9-0123-4567-89AB-234567890123}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6E7F8A9-0123-4567-89AB-234567890123}.Release|Any CPU.Build.0 = Release|Any CPU
{E7F8A9B0-1234-5678-9ABC-345678901234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7F8A9B0-1234-5678-9ABC-345678901234}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7F8A9B0-1234-5678-9ABC-345678901234}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7F8A9B0-1234-5678-9ABC-345678901234}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -69,10 +119,9 @@ Global
{B8C9D0E1-89AB-CDEF-0123-456789012345} = {10000000-0000-0000-0000-000000000001}
{C9D0E1F2-9ABC-DEF0-1234-567890123456} = {10000000-0000-0000-0000-000000000001}
{D0E1F2A3-ABCD-EF01-2345-678901234567} = {10000000-0000-0000-0000-000000000001}
{E1F2A3B4-BCDE-F012-3456-789012345678} = {10000000-0000-0000-0000-000000000001}
{F2A3B4C5-CDEF-0123-4567-890123456789} = {20000000-0000-0000-0000-000000000002}
{A3B4C5D6-DEF0-1234-5678-901234567890} = {20000000-0000-0000-0000-000000000002}
{B4C5D6E7-EF01-2345-6789-012345678901} = {20000000-0000-0000-0000-000000000002}
{F8A9B0C1-2345-6789-ABCD-456789012345} = {10000000-0000-0000-0000-000000000001}
{C5D6E7F8-F012-3456-789A-123456789012} = {20000000-0000-0000-0000-000000000002}
{D6E7F8A9-0123-4567-89AB-234567890123} = {20000000-0000-0000-0000-000000000002}
{E7F8A9B0-1234-5678-9ABC-345678901234} = {20000000-0000-0000-0000-000000000002}
EndGlobalSection
EndGlobal
Loading