Skip to content

Commit e8a91ba

Browse files
committed
Releasing version v8.0.0
1 parent 848c729 commit e8a91ba

28 files changed

+95
-79
lines changed

Examples/SkiaSharp_(Maui)/KGySoft.Drawing.Examples.SkiaSharp.Maui.csproj

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
5-
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
4+
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
5+
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
66
<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
77
<!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->
88
<OutputType>Exe</OutputType>
@@ -11,7 +11,8 @@
1111
<SingleProject>true</SingleProject>
1212
<ImplicitUsings>disable</ImplicitUsings>
1313
<Nullable>enable</Nullable>
14-
14+
<!--<SelfContained>true</SelfContained>-->
15+
1516
<!-- Display name -->
1617
<ApplicationTitle>KGy SOFT Drawing SkiaSharp/MAUI Example</ApplicationTitle>
1718

@@ -53,8 +54,9 @@
5354
</ItemGroup>
5455

5556
<ItemGroup>
56-
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="2.88.3" />
57-
<PackageReference Include="KGySoft.Drawing.SkiaSharp" Version="7.2.0" />
57+
<PackageReference Include="Microsoft.Maui.Controls" Version="8.0.3" />
58+
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="2.88.6" />
59+
<PackageReference Include="KGySoft.Drawing.SkiaSharp" Version="8.0.0-rc.2" />
5860
</ItemGroup>
5961

6062
<ItemGroup>

Examples/SkiaSharp_(Maui)/ViewModel/MainViewModel.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ private async Task GenerateDisplayImage(Configuration cfg)
265265
SKBitmap? result = null;
266266
var asyncConfig = new TaskConfig { ThrowIfCanceled = false };
267267

268+
// ReSharper disable once MethodSupportsCancellation - ok but our token is not for this one (which is btw. default at this point)
268269
// This is essentially a lock. Achieved by a SemaphoreSlim because an actual lock cannot be used with awaits in the code.
269270
await syncRoot.WaitAsync();
270271
try
@@ -309,11 +310,11 @@ private async Task GenerateDisplayImage(Configuration cfg)
309310

310311
// ===== b.) There is an image overlay: demonstrating how to work directly with IReadWriteBitmapData in SkiaSharp =====
311312

312-
// Creating the temp 32 bpp bitmap data to work with. Will be converted back to SKBitmap in the end.
313-
// The Format32bppPArgb format is optimized for alpha blending in the sRGB color space but if linear working color space is selected
314-
// it would just cause an unnecessary overhead. So for working in the linear color space we use a non-premultiplied format.
313+
// Creating the temp bitmap data to work with. Will be converted back to SKBitmap in the end.
314+
// The Format128bppPRgba format is optimized for alpha blending in the linear color space, whereas Format64bppPArgb in the sRGB color space.
315+
// Any other format with enough colors would be alright, though.
315316
using IReadWriteBitmapData resultBitmapData = BitmapDataFactory.CreateBitmapData(new System.Drawing.Size(baseImage.Width, baseImage.Height),
316-
workingColorSpace == WorkingColorSpace.Linear ? KnownPixelFormat.Format32bppArgb : KnownPixelFormat.Format32bppPArgb,
317+
workingColorSpace == WorkingColorSpace.Linear ? KnownPixelFormat.Format128bppPRgba : KnownPixelFormat.Format64bppPArgb,
317318
workingColorSpace, cfg.BackColor, cfg.AlphaThreshold);
318319

319320
// b.1.) Drawing the source bitmap first. GetReadableBitmapData can be used for any SKBitmap with any actual pixel format.
@@ -359,7 +360,7 @@ private async Task GenerateDisplayImage(Configuration cfg)
359360
result = displayResult;
360361
}
361362
}
362-
// BUG WORKAROUND: SKBitmapImageSource handles SKBitmap incorrectly under a lot of conditions, which are also platform dependent
363+
// BUG WORKAROUND: SKBitmapImageSource handles SKBitmap incorrectly under a lot of conditions, which are also platform dependent - https://github.com/mono/SkiaSharp/issues/2466
363364
// - Everywhere, including Windows: only sRGB color space is displayed correctly so results with linear actual color space must be converted to sRGB
364365
// - On Android: ColorType.Argb4444 is displayed incorrectly
365366
// - On Mac/iOS: Everything but Rgba8888/Premul works incorrectly. Actually applying the workaround for all non-Windows/Android systems just for sure.

Examples/WinForms/KGySoft.Drawing.Examples.WinForms.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
<OutputType>WinExe</OutputType>
55

66
<!--You can use the .NET Framework 4.7 build to execute the application on Linux/Mono-->
7-
<TargetFrameworks>net6.0-windows;net47</TargetFrameworks>
7+
<TargetFrameworks>net8.0-windows;net47</TargetFrameworks>
88
<Nullable>enable</Nullable>
99
<UseWindowsForms>true</UseWindowsForms>
1010
<LangVersion>latest</LangVersion>
1111
</PropertyGroup>
1212

1313
<ItemGroup>
14-
<PackageReference Include="KGySoft.Drawing" Version="7.2.0" />
14+
<PackageReference Include="KGySoft.Drawing" Version="8.0.0-rc.2" />
1515
</ItemGroup>
1616

1717
<Import Project="..\_Shared\KGySoft.Drawing.Examples.Shared.projitems" Label="Shared" />

Examples/WinForms/ViewModel/MainViewModel.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -508,11 +508,11 @@ private async Task GenerateResult(Configuration cfg)
508508

509509
// ===== b.) There is an image overlay: demonstrating how to work directly with IReadWriteBitmapData in System.Drawing =====
510510

511-
// Creating the temp 32 bpp bitmap data to work with. Will be converted back to Bitmap in the end.
512-
// The Format32bppPArgb format is optimized for alpha blending in the sRGB color space but if linear color space is selected
513-
// it would just cause an unnecessary overhead. So for working in the linear color space we use a non-premultiplied format.
511+
// Creating the temp bitmap data to work with. Will be converted back to Bitmap in the end.
512+
// The Format128bppPRgba format is optimized for alpha blending in the linear color space, whereas Format64bppPArgb in the sRGB color space.
513+
// Any other format with enough colors would be alright, though.
514514
using IReadWriteBitmapData tempBitmapData = BitmapDataFactory.CreateBitmapData(new Size(cfg.Source!.Width, cfg.Source.Height),
515-
workingColorSpace == WorkingColorSpace.Linear ? KnownPixelFormat.Format32bppArgb : KnownPixelFormat.Format32bppPArgb,
515+
workingColorSpace == WorkingColorSpace.Linear ? KnownPixelFormat.Format128bppPRgba : KnownPixelFormat.Format64bppPArgb,
516516
workingColorSpace, cfg.BackColor, cfg.AlphaThreshold);
517517

518518
// b.1.) Drawing the source bitmap first. GetReadableBitmapData can be used for any Bitmap with any actual pixel format.

Examples/Wpf/KGySoft.Drawing.Examples.Wpf.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
<PropertyGroup>
44
<OutputType>WinExe</OutputType>
5-
<TargetFrameworks>net6.0-windows</TargetFrameworks>
5+
<TargetFrameworks>net8.0-windows</TargetFrameworks>
66
<Nullable>enable</Nullable>
77
<UseWPF>true</UseWPF>
88
<LangVersion>latest</LangVersion>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="KGySoft.Drawing.Wpf" Version="7.2.0" />
12+
<PackageReference Include="KGySoft.Drawing.Wpf" Version="8.0.0-rc.1" />
1313
</ItemGroup>
1414

1515
<Import Project="..\_Shared\KGySoft.Drawing.Examples.Shared.projitems" Label="Shared" />

Examples/Wpf/ViewModel/MainViewModel.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -539,11 +539,11 @@ private async Task GenerateResult(Configuration cfg)
539539

540540
// ===== b.) There is an image overlay: demonstrating how to work directly with IReadWriteBitmapData in WPF =====
541541

542-
// Creating the temp 32 bpp bitmap data to work with. Will be converted back to WriteableBitmap in the end.
543-
// The Format32bppPArgb format is optimized for alpha blending in the sRGB color space but if linear color space is selected
544-
// it would just cause an unnecessary overhead. So for working in the linear color space we use a non-premultiplied format.
542+
// Creating the temp bitmap data to work with. Will be converted back to WriteableBitmap in the end.
543+
// The Format128bppPRgba format is optimized for alpha blending in the linear color space, whereas Format64bppPArgb in the sRGB color space.
544+
// Any other format with enough colors would be alright, though.
545545
using IReadWriteBitmapData resultBitmapData = BitmapDataFactory.CreateBitmapData(new Size(cfg.Source!.PixelWidth, cfg.Source.PixelHeight),
546-
workingColorSpace == WorkingColorSpace.Linear ? KnownPixelFormat.Format32bppArgb : KnownPixelFormat.Format32bppPArgb,
546+
workingColorSpace == WorkingColorSpace.Linear ? KnownPixelFormat.Format128bppPRgba: KnownPixelFormat.Format64bppPArgb,
547547
workingColorSpace, cfg.BackColor.ToColor32(), cfg.AlphaThreshold);
548548

549549
// b.1.) Drawing the source bitmap first. GetReadableBitmapData can be used for any Bitmap with any actual pixel format.

KGySoft.Drawing.Core/.nuspec/KGySoft.Drawing.Core.nuspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package >
33
<metadata>
44
<id>KGySoft.Drawing.Core</id>
5-
<version>8.0.0-rc.1</version>
5+
<version>8.0.0</version>
66
<title>KGy SOFT Drawing Core Libraries</title>
77
<authors>György Kőszeg</authors>
88
<owners>György Kőszeg</owners>

KGySoft.Drawing.Core/.nuspec/readme.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Thank you for installing KGy SOFT Drawing Core Libraries 8.0.0-rc.1
1+
Thank you for installing KGy SOFT Drawing Core Libraries 8.0.0
22
KGy SOFT Drawing Core Libraries offer advanced drawing features for completely managed bitmap data on multiple platforms.
33

44
Release Notes: https://github.com/koszeggy/KGySoft.Drawing/blob/master/KGySoft.Drawing.Core/changelog.txt

KGySoft.Drawing.Core/KGySoft.Drawing.Core.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<!--<TargetFrameworks>net35;net40;net45;net46;netstandard2.0;netstandard2.1;netcoreapp2.0;netcoreapp3.0;net5.0;net6.0;net8.0</TargetFrameworks>-->
5-
<TargetFrameworks>net8.0</TargetFrameworks>
4+
<TargetFrameworks>net35;net40;net45;net46;netstandard2.0;netstandard2.1;netcoreapp2.0;netcoreapp3.0;net5.0;net6.0;net8.0</TargetFrameworks>
5+
<!--<TargetFrameworks>net8.0</TargetFrameworks>-->
66

77
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
88
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>

KGySoft.Drawing.Core/Properties/AssemblyInfo.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
[assembly: AssemblyVersion("8.0.0.0")]
3535
[assembly: AssemblyFileVersion("8.0.0.0")]
36-
[assembly: AssemblyInformationalVersion("8.0.0-rc.1")]
36+
[assembly: AssemblyInformationalVersion("8.0.0")]
3737

3838
[assembly: NeutralResourcesLanguage("en")]
3939
[assembly: InternalsVisibleTo("KGySoft.Drawing.Core.UnitTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001003928BADFAA8C02789566AB7AC64A59DCDE30B798589A68EF92CBB04C9DED3FCBFE41F644D424DCF82F8A13F9148D45EE15785450318388E01AA8C4CF645E81C772E39DCA0D14B33CF48167B70F5C34A0E7B763141ED3AFDDAD0373D9FCD2E153E78D201C5C4EB61DBBD586EC6291EABFBE11879865C3776088605FA8820387C2")]

KGySoft.Drawing.shfbproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<DocumentationSource sourceFile="Specific\SkiaSharp\KGySoft.Drawing.SkiaSharp\KGySoft.Drawing.SkiaSharp.csproj" />
3636
</DocumentationSources>
3737
<HelpTitle>KGy SOFT Drawing Libraries Help</HelpTitle>
38-
<HelpFileVersion>8.0.0-preview.1</HelpFileVersion>
38+
<HelpFileVersion>8.0.0</HelpFileVersion>
3939
<NamingMethod>MemberName</NamingMethod>
4040
<ContentPlacement>AboveNamespaces</ContentPlacement>
4141
<RootNamespaceContainer>False</RootNamespaceContainer>

README.md

+27-14
Original file line numberDiff line numberDiff line change
@@ -274,25 +274,38 @@ bitmap.Unlock();
274274
The previous example demonstrated how we can create a managed accessor for a `WriteableBitmap`. But it worked only because we used a pixel format that happens to have built-in support also in KGy SOFT Drawing Libraries. In fact, the libraries provide support for any custom pixel format. The [`CreateBitmapData`](https://docs.kgysoft.net/drawing/html/Overload_KGySoft_Drawing_Imaging_BitmapDataFactory_CreateBitmapData.htm) methods have several overloads that allow you to specify a custom pixel format along with a couple of delegates to be called when pixels are read or written:
275275
276276
```cs
277-
// Gray8 format has no built-in support in KGySoft.Drawing.Core
277+
// Though Gray8 format also has built-in support in KGySoft.Drawing.Core
278+
// (see KnownPixelFormat.Format8bppGrayScale) here we pretend as if it was no supported natively.
279+
// So this is our bitmap with the custom pixel format:
278280
var bitmap = new WriteableBitmap(width, height, dpiX, dpiY, PixelFormats.Gray8, null);
279281

280-
// But we can specify how to use it
281-
var customPixelFormat = new PixelFormatInfo { BitsPerPixel = 8, Grayscale = true };
282-
Func<ICustomBitmapDataRow, int, Color32> getPixel =
283-
(row, x) => Color32.FromGray(row.UnsafeGetRefAs<byte>(x));
284-
Action<ICustomBitmapDataRow, int, Color32> setPixel =
285-
(row, x, c) => row.UnsafeGetRefAs<byte>(x) = c.Blend(row.BitmapData.BackColor).GetBrightness();
286-
287-
// Now we specify also a dispose callback to be executed when the returned instance is disposed:
288-
return BitmapDataFactory.CreateBitmapData(
289-
bitmap.BackBuffer, new Size(bitmap.PixelWidth, bitmap.PixelHeight), bitmap.BackBufferStride,
290-
customPixelFormat, getPixel, setPixel,
291-
disposeCallback: () =>
282+
// We need to specify a configuration that tells some info about the pixel format
283+
// and how pixels can be got/set from known color formats.
284+
var customConfig = new CustomBitmapDataConfig
285+
{
286+
PixelFormat = new PixelFormatInfo { BitsPerPixel = 8, Grayscale = true },
287+
BackBufferIndependentPixelAccess = true,
288+
BackColor = Color.Silver.ToColor32(), // black if not specified
289+
290+
// In this example we specify Color32 access but you can use other color types
291+
// if they fit better for the format (eg. Color64, ColorF or their premultiplied counterparts).
292+
// Note that the setter blends possible alpha colors with the back color.
293+
RowGetColor32 = (row, x) => Color32.FromGray(row.UnsafeGetRefAs<byte>(x)),
294+
RowSetColor32 = (row, x, c) => row.UnsafeGetRefAs<byte>(x) =
295+
c.Blend(row.BitmapData.BackColor, row.BitmapData.WorkingColorSpace).GetBrightness(),
296+
297+
// Now we specify also a dispose callback to be executed when the returned instance is disposed:
298+
DisposeCallback = () =>
292299
{
293300
bitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
294301
bitmap.Unlock();
295-
});
302+
}
303+
};
304+
305+
// Returning an IReadWriteBitmapData instance that wraps our native bitmap with the custom format:
306+
return BitmapDataFactory.CreateBitmapData(
307+
bitmap.BackBuffer, new Size(bitmap.PixelWidth, bitmap.PixelHeight), bitmap.BackBufferStride,
308+
customConfig);
296309
```
297310

298311
> 💡 _Tip:_ See also the [Xamarin](Examples/Xamarin) and [MAUI](Examples/Maui) examples that demonstrate [how](https://github.com/koszeggy/KGySoft.Drawing/blob/8ac1a38317660a954ac6cf416c55d1fc3108c2fc/Examples/Maui/Extensions/SKBitmapExtensions.cs#L85) to create a bitmap data for SkiaSharp's `SKBitmap` type as if there was no dedicated package for SkiaSharp.

Specific/GdiPlus/KGySoft.Drawing/.nuspec/KGySoft.Drawing.nuspec

+10-10
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package >
33
<metadata>
44
<id>KGySoft.Drawing</id>
5-
<version>8.0.0-rc.1</version>
5+
<version>8.0.0</version>
66
<title>KGy SOFT Drawing Libraries</title>
77
<authors>György Kőszeg</authors>
88
<owners>György Kőszeg</owners>
@@ -43,36 +43,36 @@ SkiaSharp specific libraries: https://www.nuget.org/packages/KGySoft.Drawing.Ski
4343
<repository type="git" url="https://github.com/koszeggy/KGySoft.Drawing" />
4444
<dependencies>
4545
<group targetFramework=".NETFramework3.5">
46-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
46+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
4747
</group>
4848
<group targetFramework=".NETFramework4.0">
49-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
49+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
5050
</group>
5151
<group targetFramework=".NETFramework4.6">
52-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
52+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
5353
</group>
5454
<group targetFramework="netcoreapp2.0" >
55-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
55+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
5656
<dependency id="System.Drawing.Common" version="5.0.3" />
5757
</group>
5858
<group targetFramework="netcoreapp3.0" >
59-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
59+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
6060
<dependency id="System.Drawing.Common" version="5.0.3" />
6161
</group>
6262
<group targetFramework="netstandard2.0" >
63-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
63+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
6464
<dependency id="System.Drawing.Common" version="5.0.3" />
6565
</group>
6666
<group targetFramework="netstandard2.1" >
67-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
67+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
6868
<dependency id="System.Drawing.Common" version="5.0.3" />
6969
</group>
7070
<group targetFramework="net5.0" >
71-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
71+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
7272
<dependency id="System.Drawing.Common" version="6.0.0" />
7373
</group>
7474
<group targetFramework="net7.0" >
75-
<dependency id="KGySoft.Drawing.Core" version="8.0.0-rc.1" />
75+
<dependency id="KGySoft.Drawing.Core" version="8.0.0" />
7676
<dependency id="System.Drawing.Common" version="8.0.0 " />
7777
</group>
7878
</dependencies>

Specific/GdiPlus/KGySoft.Drawing/.nuspec/readme.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Thank you for installing KGy SOFT Drawing Libraries 8.0.0-rc.1
1+
Thank you for installing KGy SOFT Drawing Libraries 8.0.0
22
KGy SOFT Drawing Libraries offer advanced drawing features for System.Drawing types.
33

44
⚠️ Warning: Version 7.0.0 introduced several breaking changes. Most importantly, the technology-agnostic and

Specific/GdiPlus/KGySoft.Drawing/KGySoft.Drawing.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@
5353

5454
<!-- Release only package references -->
5555
<ItemGroup Condition="'$(Configuration)' == 'RELEASE'">
56-
<PackageReference Include="KGySoft.Drawing.Core" Version="8.0.0-rc.1" />
56+
<PackageReference Include="KGySoft.Drawing.Core" Version="8.0.0" />
5757
</ItemGroup>
5858

5959
<!-- .NET 7.0 or newer references: Unix is no longer supported -->
60-
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
60+
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0' OR '$(TargetFramework)' == 'net8.0'">
6161
<PackageReference Include="System.Drawing.Common" Version="8.0.0" />
6262
</ItemGroup>
6363

Specific/GdiPlus/KGySoft.Drawing/Properties/AssemblyInfo.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
[assembly: AssemblyVersion("8.0.0.0")]
3535
[assembly: AssemblyFileVersion("8.0.0.0")]
36-
[assembly: AssemblyInformationalVersion("8.0.0-rc.1")]
36+
[assembly: AssemblyInformationalVersion("8.0.0")]
3737

3838
[assembly: NeutralResourcesLanguage("en")]
3939
[assembly: InternalsVisibleTo("KGySoft.Drawing.UnitTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001003928BADFAA8C02789566AB7AC64A59DCDE30B798589A68EF92CBB04C9DED3FCBFE41F644D424DCF82F8A13F9148D45EE15785450318388E01AA8C4CF645E81C772E39DCA0D14B33CF48167B70F5C34A0E7B763141ED3AFDDAD0373D9FCD2E153E78D201C5C4EB61DBBD586EC6291EABFBE11879865C3776088605FA8820387C2")]

0 commit comments

Comments
 (0)