Skip to content

Commit dc74943

Browse files
committed
refactor: merge 21 Abstractions/Runtime pairs and unify core types
- Merge all 21 .Abstractions/.Runtime module pairs into single project each with Abstractions/ subfolder pattern; update all ProjectReferences and slnx - Move EntityChangeType/EntityChangeInfo/PropertyChangeInfo/IEntityChangeCollector/ NullEntityChangeCollector to ChengYuan.Core.Data.Auditing - Decouple ChengYuan.EntityFrameworkCore from ChengYuan.Auditing via IEntityChangeCollector; add AuditScopeEntityChangeCollector bridge in Auditing - Merge BusinessException into ChengYuan.Core with Details, LogLevel, WithData(); remove duplicate from ExceptionHandling - Remove duplicate IHasLogLevel from ExceptionHandling; use Core.Logging version - Move AesStringEncryptionService from Core/Primitives to Core/Runtime/Security - Delete 42 stale .Abstractions/.Runtime project directories
1 parent 71a65e1 commit dc74943

403 files changed

Lines changed: 1154 additions & 1957 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ChengYuan.slnx

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,54 +5,33 @@
55
<Project Path="src/Framework/Data/ChengYuan.Data.Sqlite/ChengYuan.Data.Sqlite.csproj" />
66
<Project Path="src/Framework/Data/ChengYuan.Data.PostgreSql/ChengYuan.Data.PostgreSql.csproj" />
77
<Project Path="src/Framework/Hosting/ChengYuan.Hosting.csproj" />
8-
<Project Path="src/Framework/Caching/ChengYuan.Caching.Abstractions/ChengYuan.Caching.Abstractions.csproj" />
9-
<Project Path="src/Framework/Caching/ChengYuan.Caching.Runtime/ChengYuan.Caching.Runtime.csproj" />
8+
<Project Path="src/Framework/Auditing/ChengYuan.Auditing/ChengYuan.Auditing.csproj" />
9+
<Project Path="src/Framework/Authorization/ChengYuan.Authorization/ChengYuan.Authorization.csproj" />
10+
<Project Path="src/Framework/BackgroundJobs/ChengYuan.BackgroundJobs/ChengYuan.BackgroundJobs.csproj" />
11+
<Project Path="src/Framework/BackgroundWorkers/ChengYuan.BackgroundWorkers/ChengYuan.BackgroundWorkers.csproj" />
12+
<Project Path="src/Framework/BlobStoring/ChengYuan.BlobStoring/ChengYuan.BlobStoring.csproj" />
13+
<Project Path="src/Framework/Caching/ChengYuan.Caching/ChengYuan.Caching.csproj" />
1014
<Project Path="src/Framework/Caching/ChengYuan.Caching.Memory/ChengYuan.Caching.Memory.csproj" />
1115
<Project Path="src/Framework/Caching/ChengYuan.Caching.StackExchangeRedis/ChengYuan.Caching.StackExchangeRedis.csproj" />
12-
<Project Path="src/Framework/Outbox/ChengYuan.Outbox.Abstractions/ChengYuan.Outbox.Abstractions.csproj" />
13-
<Project Path="src/Framework/Outbox/ChengYuan.Outbox.Runtime/ChengYuan.Outbox.Runtime.csproj" />
16+
<Project Path="src/Framework/DistributedLocking/ChengYuan.DistributedLocking/ChengYuan.DistributedLocking.csproj" />
17+
<Project Path="src/Framework/Emailing/ChengYuan.Emailing/ChengYuan.Emailing.csproj" />
18+
<Project Path="src/Framework/EventBus/ChengYuan.EventBus/ChengYuan.EventBus.csproj" />
19+
<Project Path="src/Framework/ExceptionHandling/ChengYuan.ExceptionHandling/ChengYuan.ExceptionHandling.csproj" />
20+
<Project Path="src/Framework/ExecutionContext/ChengYuan.ExecutionContext/ChengYuan.ExecutionContext.csproj" />
21+
<Project Path="src/Framework/Features/ChengYuan.Features/ChengYuan.Features.csproj" />
22+
<Project Path="src/Framework/Interceptors/ChengYuan.Interceptors/ChengYuan.Interceptors.csproj" />
23+
<Project Path="src/Framework/MultiTenancy/ChengYuan.MultiTenancy/ChengYuan.MultiTenancy.csproj" />
24+
<Project Path="src/Framework/Notifications/ChengYuan.Notifications/ChengYuan.Notifications.csproj" />
25+
<Project Path="src/Framework/ObjectMapping/ChengYuan.ObjectMapping/ChengYuan.ObjectMapping.csproj" />
26+
<Project Path="src/Framework/Outbox/ChengYuan.Outbox/ChengYuan.Outbox.csproj" />
1427
<Project Path="src/Framework/Outbox/ChengYuan.Outbox.Persistence/ChengYuan.Outbox.Persistence.csproj" />
1528
<Project Path="src/Framework/Outbox/ChengYuan.Outbox.Worker/ChengYuan.Outbox.Worker.csproj" />
16-
<Project Path="src/Framework/ExecutionContext/ChengYuan.ExecutionContext.Abstractions/ChengYuan.ExecutionContext.Abstractions.csproj" />
17-
<Project Path="src/Framework/ExecutionContext/ChengYuan.ExecutionContext.Runtime/ChengYuan.ExecutionContext.Runtime.csproj" />
18-
<Project Path="src/Framework/MultiTenancy/ChengYuan.MultiTenancy.Abstractions/ChengYuan.MultiTenancy.Abstractions.csproj" />
19-
<Project Path="src/Framework/MultiTenancy/ChengYuan.MultiTenancy.Runtime/ChengYuan.MultiTenancy.Runtime.csproj" />
20-
<Project Path="src/Framework/Auditing/ChengYuan.Auditing.Abstractions/ChengYuan.Auditing.Abstractions.csproj" />
21-
<Project Path="src/Framework/Auditing/ChengYuan.Auditing.Runtime/ChengYuan.Auditing.Runtime.csproj" />
22-
<Project Path="src/Framework/Authorization/ChengYuan.Authorization.Abstractions/ChengYuan.Authorization.Abstractions.csproj" />
23-
<Project Path="src/Framework/Authorization/ChengYuan.Authorization.Runtime/ChengYuan.Authorization.Runtime.csproj" />
24-
<Project Path="src/Framework/Features/ChengYuan.Features.Abstractions/ChengYuan.Features.Abstractions.csproj" />
25-
<Project Path="src/Framework/Features/ChengYuan.Features.Runtime/ChengYuan.Features.Runtime.csproj" />
26-
<Project Path="src/Framework/Settings/ChengYuan.Settings.Abstractions/ChengYuan.Settings.Abstractions.csproj" />
27-
<Project Path="src/Framework/Settings/ChengYuan.Settings.Runtime/ChengYuan.Settings.Runtime.csproj" />
28-
<Project Path="src/Framework/EventBus/ChengYuan.EventBus.Abstractions/ChengYuan.EventBus.Abstractions.csproj" />
29-
<Project Path="src/Framework/EventBus/ChengYuan.EventBus.Runtime/ChengYuan.EventBus.Runtime.csproj" />
30-
<Project Path="src/Framework/ExceptionHandling/ChengYuan.ExceptionHandling.Abstractions/ChengYuan.ExceptionHandling.Abstractions.csproj" />
31-
<Project Path="src/Framework/ExceptionHandling/ChengYuan.ExceptionHandling.Runtime/ChengYuan.ExceptionHandling.Runtime.csproj" />
32-
<Project Path="src/Framework/BackgroundWorkers/ChengYuan.BackgroundWorkers.Abstractions/ChengYuan.BackgroundWorkers.Abstractions.csproj" />
33-
<Project Path="src/Framework/BackgroundWorkers/ChengYuan.BackgroundWorkers.Runtime/ChengYuan.BackgroundWorkers.Runtime.csproj" />
34-
<Project Path="src/Framework/DistributedLocking/ChengYuan.DistributedLocking.Abstractions/ChengYuan.DistributedLocking.Abstractions.csproj" />
35-
<Project Path="src/Framework/DistributedLocking/ChengYuan.DistributedLocking.Runtime/ChengYuan.DistributedLocking.Runtime.csproj" />
36-
<Project Path="src/Framework/BackgroundJobs/ChengYuan.BackgroundJobs.Abstractions/ChengYuan.BackgroundJobs.Abstractions.csproj" />
37-
<Project Path="src/Framework/BackgroundJobs/ChengYuan.BackgroundJobs.Runtime/ChengYuan.BackgroundJobs.Runtime.csproj" />
38-
<Project Path="src/Framework/BlobStoring/ChengYuan.BlobStoring.Abstractions/ChengYuan.BlobStoring.Abstractions.csproj" />
39-
<Project Path="src/Framework/BlobStoring/ChengYuan.BlobStoring.Runtime/ChengYuan.BlobStoring.Runtime.csproj" />
40-
<Project Path="src/Framework/Emailing/ChengYuan.Emailing.Abstractions/ChengYuan.Emailing.Abstractions.csproj" />
41-
<Project Path="src/Framework/Emailing/ChengYuan.Emailing.Runtime/ChengYuan.Emailing.Runtime.csproj" />
42-
<Project Path="src/Framework/ObjectMapping/ChengYuan.ObjectMapping.Abstractions/ChengYuan.ObjectMapping.Abstractions.csproj" />
43-
<Project Path="src/Framework/ObjectMapping/ChengYuan.ObjectMapping.Runtime/ChengYuan.ObjectMapping.Runtime.csproj" />
44-
<Project Path="src/Framework/TextTemplating/ChengYuan.TextTemplating.Abstractions/ChengYuan.TextTemplating.Abstractions.csproj" />
45-
<Project Path="src/Framework/TextTemplating/ChengYuan.TextTemplating.Runtime/ChengYuan.TextTemplating.Runtime.csproj" />
46-
<Project Path="src/Framework/Sms/ChengYuan.Sms.Abstractions/ChengYuan.Sms.Abstractions.csproj" />
47-
<Project Path="src/Framework/Sms/ChengYuan.Sms.Runtime/ChengYuan.Sms.Runtime.csproj" />
48-
<Project Path="src/Framework/VirtualFileSystem/ChengYuan.VirtualFileSystem.Abstractions/ChengYuan.VirtualFileSystem.Abstractions.csproj" />
49-
<Project Path="src/Framework/VirtualFileSystem/ChengYuan.VirtualFileSystem.Runtime/ChengYuan.VirtualFileSystem.Runtime.csproj" />
50-
<Project Path="src/Framework/Interceptors/ChengYuan.Interceptors.Abstractions/ChengYuan.Interceptors.Abstractions.csproj" />
51-
<Project Path="src/Framework/Interceptors/ChengYuan.Interceptors.Runtime/ChengYuan.Interceptors.Runtime.csproj" />
29+
<Project Path="src/Framework/Settings/ChengYuan.Settings/ChengYuan.Settings.csproj" />
30+
<Project Path="src/Framework/Sms/ChengYuan.Sms/ChengYuan.Sms.csproj" />
31+
<Project Path="src/Framework/TextTemplating/ChengYuan.TextTemplating/ChengYuan.TextTemplating.csproj" />
32+
<Project Path="src/Framework/VirtualFileSystem/ChengYuan.VirtualFileSystem/ChengYuan.VirtualFileSystem.csproj" />
5233
<Project Path="src/Framework/AspNetCore/ChengYuan.AspNetCore/ChengYuan.AspNetCore.csproj" />
5334
<Project Path="src/Framework/AspNetCore/ChengYuan.HealthChecks/ChengYuan.HealthChecks.csproj" />
54-
<Project Path="src/Framework/Notifications/ChengYuan.Notifications.Abstractions/ChengYuan.Notifications.Abstractions.csproj" />
55-
<Project Path="src/Framework/Notifications/ChengYuan.Notifications.Runtime/ChengYuan.Notifications.Runtime.csproj" />
5635
<Project Path="src/Framework/HttpResilience/ChengYuan.HttpResilience/ChengYuan.HttpResilience.csproj" />
5736
</Folder>
5837
<Folder Name="/src/Applications/">

src/Applications/AuditLogging/ChengYuan.AuditLogging.Application/ChengYuan.AuditLogging.Application.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<ItemGroup>
88
<ProjectReference Include="..\..\..\Framework\Core\ChengYuan.Core.csproj" />
99
<ProjectReference Include="..\ChengYuan.AuditLogging.Contracts\ChengYuan.AuditLogging.Contracts.csproj" />
10-
<ProjectReference Include="..\..\..\Framework\Auditing\ChengYuan.Auditing.Runtime\ChengYuan.Auditing.Runtime.csproj" />
10+
<ProjectReference Include="..\..\..\Framework\Auditing\ChengYuan.Auditing\ChengYuan.Auditing.csproj" />
1111
</ItemGroup>
1212

1313
</Project>

src/Applications/AuditLogging/ChengYuan.AuditLogging.Application/packages.lock.json

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@
77
"resolved": "10.0.0",
88
"contentHash": "inRnbpCS0nwO/RuoZIAqxQUuyjaknOOnCEZB55KSMMjRhl0RQDttSmLSGsUJN3RQ3ocf5NDLFd2mOQViHqMK5w=="
99
},
10-
"chengyuan.auditing.abstractions": {
11-
"type": "Project"
12-
},
13-
"chengyuan.auditing.runtime": {
10+
"chengyuan.auditing": {
1411
"type": "Project",
1512
"dependencies": {
16-
"ChengYuan.Auditing.Abstractions": "[0.2.10-local, )",
1713
"ChengYuan.Core": "[0.2.10-local, )",
18-
"ChengYuan.ExecutionContext.Runtime": "[0.2.10-local, )",
19-
"ChengYuan.MultiTenancy.Runtime": "[0.2.10-local, )"
14+
"ChengYuan.ExecutionContext": "[0.2.10-local, )",
15+
"ChengYuan.MultiTenancy": "[0.2.10-local, )"
2016
}
2117
},
2218
"chengyuan.auditlogging.contracts": {
@@ -31,25 +27,17 @@
3127
"Microsoft.Extensions.Options": "[10.0.0, )"
3228
}
3329
},
34-
"chengyuan.executioncontext.abstractions": {
35-
"type": "Project"
36-
},
37-
"chengyuan.executioncontext.runtime": {
30+
"chengyuan.executioncontext": {
3831
"type": "Project",
3932
"dependencies": {
40-
"ChengYuan.Core": "[0.2.10-local, )",
41-
"ChengYuan.ExecutionContext.Abstractions": "[0.2.10-local, )"
33+
"ChengYuan.Core": "[0.2.10-local, )"
4234
}
4335
},
44-
"chengyuan.multitenancy.abstractions": {
45-
"type": "Project"
46-
},
47-
"chengyuan.multitenancy.runtime": {
36+
"chengyuan.multitenancy": {
4837
"type": "Project",
4938
"dependencies": {
5039
"ChengYuan.Core": "[0.2.10-local, )",
51-
"ChengYuan.ExecutionContext.Runtime": "[0.2.10-local, )",
52-
"ChengYuan.MultiTenancy.Abstractions": "[0.2.10-local, )"
40+
"ChengYuan.ExecutionContext": "[0.2.10-local, )"
5341
}
5442
},
5543
"Microsoft.Extensions.Configuration.Abstractions": {

src/Applications/AuditLogging/ChengYuan.AuditLogging.Persistence/packages.lock.json

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -371,23 +371,19 @@
371371
"resolved": "9.0.0",
372372
"contentHash": "U9msthvnH2Fsw7xwAvIhNHOdnIjOQTwOc8Vd0oGOsiRcGMGoBFlUD6qtYawRUoQdKH9ysxesZ9juFElt1Jw/7A=="
373373
},
374-
"chengyuan.auditing.abstractions": {
375-
"type": "Project"
376-
},
377-
"chengyuan.auditing.runtime": {
374+
"chengyuan.auditing": {
378375
"type": "Project",
379376
"dependencies": {
380-
"ChengYuan.Auditing.Abstractions": "[0.2.10-local, )",
381377
"ChengYuan.Core": "[0.2.10-local, )",
382-
"ChengYuan.ExecutionContext.Runtime": "[0.2.10-local, )",
383-
"ChengYuan.MultiTenancy.Runtime": "[0.2.10-local, )"
378+
"ChengYuan.ExecutionContext": "[0.2.10-local, )",
379+
"ChengYuan.MultiTenancy": "[0.2.10-local, )"
384380
}
385381
},
386382
"chengyuan.auditlogging.application": {
387383
"type": "Project",
388384
"dependencies": {
389385
"ChengYuan.AuditLogging.Contracts": "[0.2.10-local, )",
390-
"ChengYuan.Auditing.Runtime": "[0.2.10-local, )",
386+
"ChengYuan.Auditing": "[0.2.10-local, )",
391387
"ChengYuan.Core": "[0.2.10-local, )"
392388
}
393389
},
@@ -414,39 +410,31 @@
414410
"chengyuan.entityframeworkcore": {
415411
"type": "Project",
416412
"dependencies": {
417-
"ChengYuan.Auditing.Abstractions": "[0.2.10-local, )",
413+
"ChengYuan.Auditing": "[0.2.10-local, )",
418414
"ChengYuan.Core": "[0.2.10-local, )",
419415
"Microsoft.EntityFrameworkCore": "[10.0.0, )",
420416
"Microsoft.EntityFrameworkCore.Design": "[10.0.0, )"
421417
}
422418
},
423-
"chengyuan.executioncontext.abstractions": {
424-
"type": "Project"
425-
},
426-
"chengyuan.executioncontext.runtime": {
419+
"chengyuan.executioncontext": {
427420
"type": "Project",
428421
"dependencies": {
429-
"ChengYuan.Core": "[0.2.10-local, )",
430-
"ChengYuan.ExecutionContext.Abstractions": "[0.2.10-local, )"
422+
"ChengYuan.Core": "[0.2.10-local, )"
431423
}
432424
},
433425
"chengyuan.hosting": {
434426
"type": "Project",
435427
"dependencies": {
436428
"ChengYuan.Core": "[0.2.10-local, )",
437-
"ChengYuan.MultiTenancy.Runtime": "[0.2.10-local, )",
429+
"ChengYuan.MultiTenancy": "[0.2.10-local, )",
438430
"Microsoft.Extensions.Hosting.Abstractions": "[10.0.0, )"
439431
}
440432
},
441-
"chengyuan.multitenancy.abstractions": {
442-
"type": "Project"
443-
},
444-
"chengyuan.multitenancy.runtime": {
433+
"chengyuan.multitenancy": {
445434
"type": "Project",
446435
"dependencies": {
447436
"ChengYuan.Core": "[0.2.10-local, )",
448-
"ChengYuan.ExecutionContext.Runtime": "[0.2.10-local, )",
449-
"ChengYuan.MultiTenancy.Abstractions": "[0.2.10-local, )"
437+
"ChengYuan.ExecutionContext": "[0.2.10-local, )"
450438
}
451439
},
452440
"Microsoft.EntityFrameworkCore": {

src/Applications/FeatureManagement/ChengYuan.FeatureManagement.Application/ChengYuan.FeatureManagement.Application.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<ItemGroup>
88
<ProjectReference Include="..\..\..\Framework\Core\ChengYuan.Core.csproj" />
99
<ProjectReference Include="..\ChengYuan.FeatureManagement.Contracts\ChengYuan.FeatureManagement.Contracts.csproj" />
10-
<ProjectReference Include="..\..\..\Framework\Features\ChengYuan.Features.Runtime\ChengYuan.Features.Runtime.csproj" />
10+
<ProjectReference Include="..\..\..\Framework\Features\ChengYuan.Features\ChengYuan.Features.csproj" />
1111
</ItemGroup>
1212

1313
</Project>

src/Applications/FeatureManagement/ChengYuan.FeatureManagement.Application/packages.lock.json

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,44 +16,32 @@
1616
"Microsoft.Extensions.Options": "[10.0.0, )"
1717
}
1818
},
19-
"chengyuan.executioncontext.abstractions": {
20-
"type": "Project"
21-
},
22-
"chengyuan.executioncontext.runtime": {
19+
"chengyuan.executioncontext": {
2320
"type": "Project",
2421
"dependencies": {
25-
"ChengYuan.Core": "[0.2.10-local, )",
26-
"ChengYuan.ExecutionContext.Abstractions": "[0.2.10-local, )"
22+
"ChengYuan.Core": "[0.2.10-local, )"
2723
}
2824
},
2925
"chengyuan.featuremanagement.contracts": {
3026
"type": "Project",
3127
"dependencies": {
3228
"ChengYuan.Core": "[0.2.10-local, )",
33-
"ChengYuan.Features.Abstractions": "[0.2.10-local, )"
29+
"ChengYuan.Features": "[0.2.10-local, )"
3430
}
3531
},
36-
"chengyuan.features.abstractions": {
37-
"type": "Project"
38-
},
39-
"chengyuan.features.runtime": {
32+
"chengyuan.features": {
4033
"type": "Project",
4134
"dependencies": {
4235
"ChengYuan.Core": "[0.2.10-local, )",
43-
"ChengYuan.ExecutionContext.Runtime": "[0.2.10-local, )",
44-
"ChengYuan.Features.Abstractions": "[0.2.10-local, )",
45-
"ChengYuan.MultiTenancy.Runtime": "[0.2.10-local, )"
36+
"ChengYuan.ExecutionContext": "[0.2.10-local, )",
37+
"ChengYuan.MultiTenancy": "[0.2.10-local, )"
4638
}
4739
},
48-
"chengyuan.multitenancy.abstractions": {
49-
"type": "Project"
50-
},
51-
"chengyuan.multitenancy.runtime": {
40+
"chengyuan.multitenancy": {
5241
"type": "Project",
5342
"dependencies": {
5443
"ChengYuan.Core": "[0.2.10-local, )",
55-
"ChengYuan.ExecutionContext.Runtime": "[0.2.10-local, )",
56-
"ChengYuan.MultiTenancy.Abstractions": "[0.2.10-local, )"
44+
"ChengYuan.ExecutionContext": "[0.2.10-local, )"
5745
}
5846
},
5947
"Microsoft.Extensions.Configuration.Abstractions": {

src/Applications/FeatureManagement/ChengYuan.FeatureManagement.Contracts/ChengYuan.FeatureManagement.Contracts.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<ItemGroup>
88
<ProjectReference Include="..\..\..\Framework\Core\ChengYuan.Core.csproj" />
9-
<ProjectReference Include="..\..\..\Framework\Features\ChengYuan.Features.Abstractions\ChengYuan.Features.Abstractions.csproj" />
9+
<ProjectReference Include="..\..\..\Framework\Features\ChengYuan.Features\ChengYuan.Features.csproj" />
1010
</ItemGroup>
1111

1212
</Project>

src/Applications/FeatureManagement/ChengYuan.FeatureManagement.Contracts/packages.lock.json

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,26 @@
1616
"Microsoft.Extensions.Options": "[10.0.0, )"
1717
}
1818
},
19-
"chengyuan.features.abstractions": {
20-
"type": "Project"
19+
"chengyuan.executioncontext": {
20+
"type": "Project",
21+
"dependencies": {
22+
"ChengYuan.Core": "[0.2.10-local, )"
23+
}
24+
},
25+
"chengyuan.features": {
26+
"type": "Project",
27+
"dependencies": {
28+
"ChengYuan.Core": "[0.2.10-local, )",
29+
"ChengYuan.ExecutionContext": "[0.2.10-local, )",
30+
"ChengYuan.MultiTenancy": "[0.2.10-local, )"
31+
}
32+
},
33+
"chengyuan.multitenancy": {
34+
"type": "Project",
35+
"dependencies": {
36+
"ChengYuan.Core": "[0.2.10-local, )",
37+
"ChengYuan.ExecutionContext": "[0.2.10-local, )"
38+
}
2139
},
2240
"Microsoft.Extensions.Configuration.Abstractions": {
2341
"type": "CentralTransitive",

0 commit comments

Comments
 (0)