Browse Source

Better samples and package builder wip

flabbet 1 year ago
parent
commit
135eec95bb

+ 27 - 0
samples/HelloWorld/HelloWorld.csproj

@@ -0,0 +1,27 @@
+<Project Sdk="Microsoft.NET.Sdk">
+    <PropertyGroup>
+        <TargetFramework>net8.0</TargetFramework>
+        <RuntimeIdentifier>wasi-wasm</RuntimeIdentifier>
+        <OutputType>Exe</OutputType>
+        <PublishTrimmed>true</PublishTrimmed>
+        <WasmSingleFileBundle>true</WasmSingleFileBundle>
+        <OutputPath>..\..\src\PixiEditor.AvaloniaUI.Desktop\bin\Debug\net8.0\Extensions</OutputPath>
+    </PropertyGroup>
+
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj" />
+    </ItemGroup>
+
+    <!--Below is not required if you use Nuget package, this sample references project directly, so it must be here-->
+    <Import Project="..\..\src\PixiEditor.Extensions.Wasm\build\PixiEditor.Extensions.Wasm.targets"/>
+    <Import Project="..\..\src\PixiEditor.Extensions.Wasm\build\PixiEditor.Extensions.Wasm.props"/>
+
+    <ItemGroup>
+        <None Remove="extension.json" />
+        <Content Include="extension.json">
+            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+        </Content>
+    </ItemGroup>
+
+</Project>

+ 24 - 0
samples/HelloWorld/HelloWorldExtension.cs

@@ -0,0 +1,24 @@
+using System;
+
+namespace HelloWorld;
+
+using PixiEditor.Extensions.Wasm;
+
+public class HelloWorldExtension : WasmExtension
+{
+    /// <summary>
+    ///     This method is called when extension is loaded.
+    ///  All extensions are first loaded and then initialized. This method is called before <see cref="OnInitialized"/>.
+    /// </summary>
+    public override void OnLoaded()
+    {
+    }
+
+    /// <summary>
+    ///     This method is called when extension is initialized. After this method is called, you can use Api property to access PixiEditor API.
+    /// </summary>
+    public override void OnInitialized()
+    {
+        Api.Logger.Log("Hello World!");
+    }
+}

+ 14 - 0
samples/HelloWorld/Program.cs

@@ -0,0 +1,14 @@
+namespace HelloWorld;
+
+public static class Program
+{
+    /// <summary>
+    ///     The entry point of the application. This will be executed when extension is loaded.
+    /// You can use this method, but there are special methods that are used for initialization. You won't be able to access PixiEditor Api at this point.
+    /// See <see cref="HelloWorldExtension"/> for more information.
+    /// </summary>
+    public static void Main()
+    {
+
+    }
+}

+ 27 - 0
samples/HelloWorld/extension.json

@@ -0,0 +1,27 @@
+{
+  "displayName": "Sample Extension - Hello World",
+  "uniqueName": "yourCompany.Samples.HelloWorld",
+  "description": "Sample extension for PixiEditor",
+  "version": "1.0.0",
+  "author": {
+    "name": "PixiEditor",
+    "email": "[email protected]",
+    "website": "https://pixieditor.net"
+  },
+  "publisher": {
+    "name": "PixiEditor",
+    "email": "[email protected]",
+    "website": "https://pixieditor.net"
+  },
+  "contributors": [
+    {
+      "name": "flabbet",
+      "email": "[email protected]",
+      "website": "https://github.com/flabbet"
+    }
+  ],
+  "license": "MIT",
+  "categories": [
+    "Extension"
+  ]
+}

+ 28 - 0
samples/PixiEditorExtensionSamples.sln

@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.Wasm", "..\src\PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj", "{FD9B4C32-4D2E-410E-BC6B-787779BEB6E2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorld", "HelloWorld\HelloWorld.csproj", "{82A85041-A666-42DB-8F84-7D91EF9A5C9D}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{FD9B4C32-4D2E-410E-BC6B-787779BEB6E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FD9B4C32-4D2E-410E-BC6B-787779BEB6E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FD9B4C32-4D2E-410E-BC6B-787779BEB6E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FD9B4C32-4D2E-410E-BC6B-787779BEB6E2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{82A85041-A666-42DB-8F84-7D91EF9A5C9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{82A85041-A666-42DB-8F84-7D91EF9A5C9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{82A85041-A666-42DB-8F84-7D91EF9A5C9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{82A85041-A666-42DB-8F84-7D91EF9A5C9D}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+EndGlobal

+ 1 - 0
src/PixiEditor.Api.CGlueMSBuild/PixiEditor.Api.CGlueMSBuild.csproj

@@ -8,6 +8,7 @@
     <OutputType>Library</OutputType>
     <OutputPath>../PixiEditor.Extensions.Wasm/build/</OutputPath>
     <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+    <DebugType>None</DebugType>
     <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
   </PropertyGroup>
 

+ 31 - 0
src/PixiEditor.Extensions.MSPackageBuilder/BuildPackageTask.cs

@@ -0,0 +1,31 @@
+using Microsoft.Build.Framework;
+
+namespace PixiEditor.Extensions.MSPackageBuilder;
+
+public class BuildPackageTask : Microsoft.Build.Utilities.Task
+{
+    [Required]
+    public string BuildResultDirectory { get; set; } = default!;
+    
+    [Required]
+    public string TargetDirectory { get; set; } = default!;
+    
+    public override bool Execute()
+    {
+        string absoluteBuildResultDirectory = Path.GetFullPath(BuildResultDirectory);
+        string absoluteTargetDirectory = Path.GetFullPath(TargetDirectory);
+
+        try
+        {
+            PackageBuilder.Build(absoluteBuildResultDirectory, absoluteTargetDirectory,
+                (message) => Log.LogMessage(message, MessageImportance.Normal));
+        }
+        catch (Exception e)
+        {
+            Log.LogErrorFromException(e, true, true, null);
+            return false;
+        }
+
+        return true;
+    }
+}

+ 119 - 0
src/PixiEditor.Extensions.MSPackageBuilder/PackageBuilder.cs

@@ -0,0 +1,119 @@
+using System.IO.Compression;
+
+namespace PixiEditor.Extensions.MSPackageBuilder;
+
+/// <summary>
+///   Class that is used to create .pixiext packages. 
+/// </summary>
+public static class PackageBuilder
+{
+    private static readonly ElementToInclude[] ElementsToInclude = new[]
+    {
+        new ElementToInclude("extension.json", true),
+        new ElementToInclude("AppBundle/*.wasm", true),
+        new ElementToInclude("Localization/", false),
+    };
+    
+    public static void Build(string buildResultDirectory, string targetDirectory, Action<string> log)
+    {
+        if (!Directory.Exists(buildResultDirectory))
+        {
+            throw new DirectoryNotFoundException($"Directory {buildResultDirectory} does not exist.");
+        }
+
+        if (!Directory.Exists(targetDirectory))
+        {
+            Directory.CreateDirectory(targetDirectory);
+        }
+
+        foreach (ElementToInclude element in ElementsToInclude)
+        {
+            log($"Copying {element.Path}...");
+            if (element.Type == ElementToIncludeType.File)
+            {
+                CopyFile(element.Path, buildResultDirectory, targetDirectory, element.IsRequired);
+            }
+            else
+            {
+                CopyDirectory(element.Path, buildResultDirectory, targetDirectory, element.IsRequired);
+            }
+        } 
+        
+        log("Copied all elements. Building package...");
+        
+        string packagePath = Path.Combine(targetDirectory, "package.pixiext");
+        if (File.Exists(packagePath))
+        {
+            File.Delete(packagePath);
+        }
+        
+        ZipFile.CreateFromDirectory(targetDirectory, packagePath);
+        
+        log($"Package created at {packagePath}.");
+        
+        Directory.Delete(targetDirectory, true);
+    }
+
+    private static void CopyFile(string elementPath, string buildResultDirectory, string targetDirectory, bool elementIsRequired)
+    {
+        string[] files = Directory.GetFiles(buildResultDirectory, elementPath);
+        if (files.Length == 0)
+        {
+            if (elementIsRequired)
+            {
+                throw new FileNotFoundException($"File {elementPath} was not found in {buildResultDirectory}.");
+            }
+            
+            return;
+        }
+
+        foreach (string file in files)
+        {
+            File.Copy(file, Path.Combine(targetDirectory, Path.GetFileName(file)), true);
+        }
+    }
+    
+    private static void CopyDirectory(string elementPath, string buildResultDirectory, string targetDirectory, bool elementIsRequired)
+    {
+        string[] directories = Directory.GetDirectories(buildResultDirectory, elementPath, SearchOption.AllDirectories);
+        if (directories.Length == 0)
+        {
+            if (elementIsRequired)
+            {
+                throw new DirectoryNotFoundException($"Directory {elementPath} was not found in {buildResultDirectory}.");
+            }
+            
+            return;
+        }
+
+        foreach (string directory in directories)
+        {
+            string targetDir = Path.Combine(targetDirectory, Path.GetFileName(directory));
+            Directory.CreateDirectory(targetDir);
+            foreach (string file in Directory.GetFiles(directory))
+            {
+                File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)), true);
+            }
+        }
+    }
+}
+
+record ElementToInclude
+{
+    public string Path { get; set; }
+    public bool IsRequired { get; set; }
+    
+    public ElementToIncludeType Type => Path.EndsWith("/") ? ElementToIncludeType.Directory : ElementToIncludeType.File;
+
+    public ElementToInclude(string path, bool isRequired)
+    {
+        Path = path;
+        IsRequired = isRequired;
+    }
+}
+
+enum ElementToIncludeType
+{
+    File,
+    Directory
+}

+ 17 - 0
src/PixiEditor.Extensions.MSPackageBuilder/PixiEditor.Extensions.MSPackageBuilder.csproj

@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>netstandard2.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+      <OutputType>Library</OutputType>
+      <LangVersion>default</LangVersion>
+      <OutputPath>../PixiEditor.Extensions.Wasm/build/</OutputPath>
+      <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+      <DebugType>None</DebugType>
+      <DebugType>None</DebugType>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.9.5" ExcludeAssets="Runtime" />
+    </ItemGroup>
+</Project>

+ 24 - 16
src/PixiEditor.Extensions.Wasm/PixiEditor.Extensions.Wasm.csproj

@@ -1,29 +1,37 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
-    <PropertyGroup>
-        <TargetFramework>net8.0</TargetFramework>
-       <RuntimeIdentifier>wasi-wasm</RuntimeIdentifier>
-        <ImplicitUsings>enable</ImplicitUsings>
-        <Nullable>disable</Nullable>
-        <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-      <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
-    </PropertyGroup>
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <RuntimeIdentifier>wasi-wasm</RuntimeIdentifier>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>disable</Nullable>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
+    <PublishTrimmed>true</PublishTrimmed>
+    <WasmBuildNative>true</WasmBuildNative>
+    <WasmSingleFileBundle>true</WasmSingleFileBundle>
+    <TrimMode>full</TrimMode>
+    <DebuggerSupport>false</DebuggerSupport>
+    <EventSourceSupport>false</EventSourceSupport>
+    <UseSystemResourceKeys>true</UseSystemResourceKeys>
+    <NativeDebugSymbols>false</NativeDebugSymbols>
+  </PropertyGroup>
 
-    <ItemGroup>
-      <ProjectReference Include="..\PixiEditor.Extensions.CommonApi\PixiEditor.Extensions.CommonApi.csproj" />
-    </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\PixiEditor.Extensions.CommonApi\PixiEditor.Extensions.CommonApi.csproj"/>
+  </ItemGroup>
 
-    <ItemGroup>
-      <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.8.3" />
-    </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.8.3"/>
+  </ItemGroup>
 
   <Import Project="build\PixiEditor.Extensions.Wasm.targets"/>
   <Import Project="build\PixiEditor.Extensions.Wasm.props"/>
 
   <Target Name="PackTaskDependencies" BeforeTargets="GenerateNuspec">
     <ItemGroup>
-      <_PackageFiles Include="build\**" BuildAction="Content" PackagePath="build" />
-      <_PackageFiles Include="native\**" BuildAction="Content" PackagePath="native" />
+      <_PackageFiles Include="build\**" BuildAction="Content" PackagePath="build"/>
+      <_PackageFiles Include="native\**" BuildAction="Content" PackagePath="native"/>
     </ItemGroup>
   </Target>
 

+ 8 - 0
src/PixiEditor.Extensions.Wasm/WasmExtension.cs

@@ -3,6 +3,14 @@
 public abstract class WasmExtension
 {
     public static PixiEditorApi Api { get; } = new PixiEditorApi();
+    
+    /// <summary>
+    ///     Called when extension is loaded. Api is not initialized at this point. All extensions are loaded before initialization.
+    /// </summary>
     public virtual void OnLoaded() { }
+    
+    /// <summary>
+    ///     Called when extension is initialized. Api is initialized and ready to use.
+    /// </summary>
     public virtual void OnInitialized() { }
 }

BIN
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Api.CGlueMSBuild.dll


+ 228 - 0
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Extensions.MSPackageBuilder.deps.json

@@ -0,0 +1,228 @@
+{
+  "runtimeTarget": {
+    "name": ".NETStandard,Version=v2.0/",
+    "signature": ""
+  },
+  "compilationOptions": {},
+  "targets": {
+    ".NETStandard,Version=v2.0": {},
+    ".NETStandard,Version=v2.0/": {
+      "PixiEditor.Extensions.MSPackageBuilder/1.0.0": {
+        "dependencies": {
+          "Microsoft.Build.Utilities.Core": "17.9.5",
+          "NETStandard.Library": "2.0.3",
+          "StyleCop.Analyzers": "1.1.118"
+        },
+        "runtime": {
+          "PixiEditor.Extensions.MSPackageBuilder.dll": {}
+        }
+      },
+      "Microsoft.Build.Framework/17.9.5": {
+        "dependencies": {
+          "Microsoft.Win32.Registry": "5.0.0",
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+          "System.Security.Principal.Windows": "5.0.0"
+        }
+      },
+      "Microsoft.Build.Utilities.Core/17.9.5": {
+        "dependencies": {
+          "Microsoft.Build.Framework": "17.9.5",
+          "Microsoft.NET.StringTools": "17.9.5",
+          "Microsoft.Win32.Registry": "5.0.0",
+          "System.Collections.Immutable": "8.0.0",
+          "System.Configuration.ConfigurationManager": "8.0.0",
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+          "System.Security.Principal.Windows": "5.0.0",
+          "System.Text.Encoding.CodePages": "7.0.0"
+        }
+      },
+      "Microsoft.NET.StringTools/17.9.5": {
+        "dependencies": {
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+        }
+      },
+      "Microsoft.NETCore.Platforms/1.1.0": {},
+      "Microsoft.Win32.Registry/5.0.0": {
+        "dependencies": {
+          "System.Buffers": "4.5.1",
+          "System.Memory": "4.5.5",
+          "System.Security.AccessControl": "5.0.0",
+          "System.Security.Principal.Windows": "5.0.0"
+        }
+      },
+      "NETStandard.Library/2.0.3": {
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0"
+        }
+      },
+      "StyleCop.Analyzers/1.1.118": {},
+      "System.Buffers/4.5.1": {},
+      "System.Collections.Immutable/8.0.0": {
+        "dependencies": {
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+        }
+      },
+      "System.Configuration.ConfigurationManager/8.0.0": {
+        "dependencies": {
+          "System.Security.Cryptography.ProtectedData": "8.0.0"
+        }
+      },
+      "System.Memory/4.5.5": {
+        "dependencies": {
+          "System.Buffers": "4.5.1",
+          "System.Numerics.Vectors": "4.4.0",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+        }
+      },
+      "System.Numerics.Vectors/4.4.0": {},
+      "System.Runtime.CompilerServices.Unsafe/6.0.0": {},
+      "System.Security.AccessControl/5.0.0": {
+        "dependencies": {
+          "System.Security.Principal.Windows": "5.0.0"
+        }
+      },
+      "System.Security.Cryptography.ProtectedData/8.0.0": {
+        "dependencies": {
+          "System.Memory": "4.5.5"
+        }
+      },
+      "System.Security.Principal.Windows/5.0.0": {},
+      "System.Text.Encoding.CodePages/7.0.0": {
+        "dependencies": {
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+        }
+      }
+    }
+  },
+  "libraries": {
+    "PixiEditor.Extensions.MSPackageBuilder/1.0.0": {
+      "type": "project",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "Microsoft.Build.Framework/17.9.5": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-CjRmqu9Wv2fyC1d7NKOuBDXcNMI8+GiXGM6izygB+skGGu4Vf0cBcoPq7AFqZCcMpn5DtZ+y7RpaLpB2qrzanQ==",
+      "path": "microsoft.build.framework/17.9.5",
+      "hashPath": "microsoft.build.framework.17.9.5.nupkg.sha512"
+    },
+    "Microsoft.Build.Utilities.Core/17.9.5": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-H2hpVdm7cX/uGJD1HOfab3RKgD5tlnvzQkFqvsrAqGHRi0sqb2w1+hRwERFm23witCjmERnqNgiQjYks6/ds8A==",
+      "path": "microsoft.build.utilities.core/17.9.5",
+      "hashPath": "microsoft.build.utilities.core.17.9.5.nupkg.sha512"
+    },
+    "Microsoft.NET.StringTools/17.9.5": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-C/oPRnjcIZBRzcpl1V06R1eEMCxOGt6mIm+8ioyblELgJEXLM8XjUPuCwljMO52VetsHw54xMcYwU8UEeHEIEg==",
+      "path": "microsoft.net.stringtools/17.9.5",
+      "hashPath": "microsoft.net.stringtools.17.9.5.nupkg.sha512"
+    },
+    "Microsoft.NETCore.Platforms/1.1.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
+      "path": "microsoft.netcore.platforms/1.1.0",
+      "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512"
+    },
+    "Microsoft.Win32.Registry/5.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
+      "path": "microsoft.win32.registry/5.0.0",
+      "hashPath": "microsoft.win32.registry.5.0.0.nupkg.sha512"
+    },
+    "NETStandard.Library/2.0.3": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
+      "path": "netstandard.library/2.0.3",
+      "hashPath": "netstandard.library.2.0.3.nupkg.sha512"
+    },
+    "StyleCop.Analyzers/1.1.118": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-Onx6ovGSqXSK07n/0eM3ZusiNdB6cIlJdabQhWGgJp3Vooy9AaLS/tigeybOJAobqbtggTamoWndz72JscZBvw==",
+      "path": "stylecop.analyzers/1.1.118",
+      "hashPath": "stylecop.analyzers.1.1.118.nupkg.sha512"
+    },
+    "System.Buffers/4.5.1": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==",
+      "path": "system.buffers/4.5.1",
+      "hashPath": "system.buffers.4.5.1.nupkg.sha512"
+    },
+    "System.Collections.Immutable/8.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==",
+      "path": "system.collections.immutable/8.0.0",
+      "hashPath": "system.collections.immutable.8.0.0.nupkg.sha512"
+    },
+    "System.Configuration.ConfigurationManager/8.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==",
+      "path": "system.configuration.configurationmanager/8.0.0",
+      "hashPath": "system.configuration.configurationmanager.8.0.0.nupkg.sha512"
+    },
+    "System.Memory/4.5.5": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==",
+      "path": "system.memory/4.5.5",
+      "hashPath": "system.memory.4.5.5.nupkg.sha512"
+    },
+    "System.Numerics.Vectors/4.4.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==",
+      "path": "system.numerics.vectors/4.4.0",
+      "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512"
+    },
+    "System.Runtime.CompilerServices.Unsafe/6.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
+      "path": "system.runtime.compilerservices.unsafe/6.0.0",
+      "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
+    },
+    "System.Security.AccessControl/5.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
+      "path": "system.security.accesscontrol/5.0.0",
+      "hashPath": "system.security.accesscontrol.5.0.0.nupkg.sha512"
+    },
+    "System.Security.Cryptography.ProtectedData/8.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==",
+      "path": "system.security.cryptography.protecteddata/8.0.0",
+      "hashPath": "system.security.cryptography.protecteddata.8.0.0.nupkg.sha512"
+    },
+    "System.Security.Principal.Windows/5.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==",
+      "path": "system.security.principal.windows/5.0.0",
+      "hashPath": "system.security.principal.windows.5.0.0.nupkg.sha512"
+    },
+    "System.Text.Encoding.CodePages/7.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-LSyCblMpvOe0N3E+8e0skHcrIhgV2huaNcjUUEa8hRtgEAm36aGkRoC8Jxlb6Ra6GSfF29ftduPNywin8XolzQ==",
+      "path": "system.text.encoding.codepages/7.0.0",
+      "hashPath": "system.text.encoding.codepages.7.0.0.nupkg.sha512"
+    }
+  }
+}

BIN
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Extensions.MSPackageBuilder.dll


+ 4 - 3
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Extensions.Wasm.props

@@ -1,5 +1,6 @@
 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
-
-
+  <PropertyGroup>
+    <DebugType>embedded</DebugType>
+    <GenerateDocumentationFile>true</GenerateDocumentationFile>
+  </PropertyGroup>
 </Project>

+ 5 - 0
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Extensions.Wasm.targets

@@ -13,4 +13,9 @@
       <_WasmNativeFileForLinking Include="@(NativeFileReference)" />
     </ItemGroup>
   </Target>
+  <UsingTask TaskName="BuildPackageTask"
+             AssemblyFile="$(MSBuildThisFileDirectory)PixiEditor.Extensions.MSPackageBuilder.dll" Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'"/>
+  <Target Name="BuildPackageTask" AfterTargets="Build" Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'">
+    <BuildPackageTask BuildResultDirectory="$(OutputPath)" TargetDirectory="$(OutputPath)" />
+  </Target>
 </Project>

+ 11 - 11
src/PixiEditor.Extensions.WasmRuntime/WasmExtensionInstance.cs

@@ -38,7 +38,7 @@ public partial class WasmExtensionInstance : Extension
         NativeObjectManager = new ObjectManager();
         AsyncHandleManager = new AsyncCallsManager();
         AsyncHandleManager.OnAsyncCallCompleted += OnAsyncCallCompleted;
-        AsyncHandleManager.OnAsyncCallFaulted += AsyncHandleManagerOnOnAsyncCallFaulted;
+        AsyncHandleManager.OnAsyncCallFaulted += OnAsyncCallFaulted;
         
         LinkApiFunctions();
         Linker.DefineModule(Store, Module);
@@ -48,16 +48,6 @@ public partial class WasmExtensionInstance : Extension
         memory = Instance.GetMemory("memory");
     }
 
-    private void OnAsyncCallCompleted(int handle, int result)
-    {
-        Instance.GetAction<int, int>("async_call_completed").Invoke(handle, result);
-    }
-    
-    private void AsyncHandleManagerOnOnAsyncCallFaulted(int handle, string exceptionMessage)
-    {
-        Instance.GetAction<int, string>("async_call_faulted").Invoke(handle, exceptionMessage);
-    }
-
     protected override void OnLoaded()
     {
         Instance.GetAction("load").Invoke();
@@ -72,6 +62,16 @@ public partial class WasmExtensionInstance : Extension
         Instance.GetAction("initialize").Invoke();
         base.OnInitialized();
     }
+    
+    private void OnAsyncCallCompleted(int handle, int result)
+    {
+        Instance.GetAction<int, int>("async_call_completed").Invoke(handle, result);
+    }
+    
+    private void OnAsyncCallFaulted(int handle, string exceptionMessage)
+    {
+        Instance.GetAction<int, string>("async_call_faulted").Invoke(handle, exceptionMessage);
+    }
 
     private void SetElementMap()
     {

+ 45 - 137
src/PixiEditor.sln

@@ -56,10 +56,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Platform.Standal
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions", "PixiEditor.Extensions\PixiEditor.Extensions.csproj", "{1249EE2B-EB0D-411C-B311-53A7A22B7743}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{E4FF4CE6-5831-450D-8006-0539353C030B}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleExtension", "SampleExtension\SampleExtension.csproj", "{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.UpdateInstaller.Desktop", "PixiEditor.UpdateInstaller\PixiEditor.UpdateInstaller.Desktop\PixiEditor.UpdateInstaller.Desktop.csproj", "{10BF4001-214C-4869-8F78-2B6BDBDC7E7D}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.UI.Common", "PixiEditor.UI.Common\PixiEditor.UI.Common.csproj", "{FA98BFA6-2E83-41C6-9102-76875B261F51}"
@@ -78,8 +74,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.AvaloniaUI.Deskt
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Tests", "PixiEditor.Tests\PixiEditor.Tests.csproj", "{427CE098-4B13-4E46-8C66-D924140B6CAE}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WasmSampleExtension", "WasmSampleExtension\WasmSampleExtension.csproj", "{F4436A16-9488-4BAB-B2F6-C1806278CE16}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.Wasm", "PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj", "{71907779-F1D1-4AA6-BA11-E990DB089841}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.WasmRuntime", "PixiEditor.Extensions.WasmRuntime\PixiEditor.Extensions.WasmRuntime.csproj", "{B30622ED-9177-4930-8E64-2B2352D4D8DC}"
@@ -94,8 +88,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.WasmR
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.CommonApi", "PixiEditor.Extensions.CommonApi\PixiEditor.Extensions.CommonApi.csproj", "{43C03D0E-EF50-4225-A268-CB9B8E0E8622}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleExtension.LayoutBuilder", "SampleExtension.LayoutBuilder\SampleExtension.LayoutBuilder.csproj", "{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OfficialExtensions", "OfficialExtensions", "{DF94111B-9D40-42D7-9416-4875E846FE8A}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.DevTools", "PixiEditor.DevTools\PixiEditor.DevTools.csproj", "{A0C4E418-467E-40E2-BAD6-35F953BA69E5}"
@@ -122,6 +114,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Linux", "PixiEdi
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.MacOs", "PixiEditor.MacOs\PixiEditor.MacOs.csproj", "{E46F2824-3CDA-40CB-AA57-8A4387E6B188}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.MSPackageBuilder", "PixiEditor.Extensions.MSPackageBuilder\PixiEditor.Extensions.MSPackageBuilder.csproj", "{AE200ADC-9E85-4275-A373-E975CD6D518C}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -963,48 +957,6 @@ Global
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Steam|x64.Build.0 = Debug|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Steam|x86.ActiveCfg = Debug|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Steam|x86.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Debug|x64.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Debug|x86.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevRelease|x64.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevRelease|x64.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevRelease|x86.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevRelease|x86.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevSteam|Any CPU.ActiveCfg = DevSteam|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevSteam|Any CPU.Build.0 = DevSteam|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevSteam|x64.ActiveCfg = DevSteam|x64
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevSteam|x64.Build.0 = DevSteam|x64
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevSteam|x86.ActiveCfg = DevSteam|x86
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.DevSteam|x86.Build.0 = DevSteam|x86
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX Debug|x64.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX Debug|x86.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX|Any CPU.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX|x64.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX|x64.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX|x86.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.MSIX|x86.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Release|Any CPU.Build.0 = Release|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Release|x64.ActiveCfg = Release|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Release|x64.Build.0 = Release|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Release|x86.ActiveCfg = Release|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Release|x86.Build.0 = Release|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Steam|Any CPU.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Steam|x64.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Steam|x64.Build.0 = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Steam|x86.ActiveCfg = Debug|Any CPU
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814}.Steam|x86.Build.0 = Debug|Any CPU
 		{10BF4001-214C-4869-8F78-2B6BDBDC7E7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{10BF4001-214C-4869-8F78-2B6BDBDC7E7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{10BF4001-214C-4869-8F78-2B6BDBDC7E7D}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -1341,48 +1293,6 @@ Global
 		{427CE098-4B13-4E46-8C66-D924140B6CAE}.Steam|x64.Build.0 = Debug|Any CPU
 		{427CE098-4B13-4E46-8C66-D924140B6CAE}.Steam|x86.ActiveCfg = Debug|Any CPU
 		{427CE098-4B13-4E46-8C66-D924140B6CAE}.Steam|x86.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x64.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Debug|x86.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x64.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x64.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x86.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevRelease|x86.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x64.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x64.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x86.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.DevSteam|x86.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x64.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX Debug|x86.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|Any CPU.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x64.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x64.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x86.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.MSIX|x86.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x64.ActiveCfg = Release|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x64.Build.0 = Release|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x86.ActiveCfg = Release|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Release|x86.Build.0 = Release|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|Any CPU.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x64.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x64.Build.0 = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x86.ActiveCfg = Debug|Any CPU
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16}.Steam|x86.Build.0 = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -1635,48 +1545,6 @@ Global
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Steam|x64.Build.0 = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Steam|x86.ActiveCfg = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Steam|x86.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Debug|x64.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Debug|x86.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevRelease|x64.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevRelease|x64.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevRelease|x86.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevRelease|x86.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevSteam|x64.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevSteam|x64.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevSteam|x86.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.DevSteam|x86.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX Debug|x64.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX Debug|x86.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX|Any CPU.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX|x64.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX|x64.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX|x86.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.MSIX|x86.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Release|x64.ActiveCfg = Release|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Release|x64.Build.0 = Release|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Release|x86.ActiveCfg = Release|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Release|x86.Build.0 = Release|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Steam|Any CPU.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Steam|x64.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Steam|x64.Build.0 = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Steam|x86.ActiveCfg = Debug|Any CPU
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}.Steam|x86.Build.0 = Debug|Any CPU
 		{A0C4E418-467E-40E2-BAD6-35F953BA69E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{A0C4E418-467E-40E2-BAD6-35F953BA69E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A0C4E418-467E-40E2-BAD6-35F953BA69E5}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -2139,6 +2007,48 @@ Global
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Steam|x64.Build.0 = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Steam|x86.ActiveCfg = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Steam|x86.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x64.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x86.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|x86.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|x86.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevSteam|x86.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevSteam|x86.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX|Any CPU.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX|x64.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX|x86.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.MSIX|x86.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|x64.ActiveCfg = Release|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|x64.Build.0 = Release|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|x86.ActiveCfg = Release|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|x86.Build.0 = Release|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|Any CPU.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x64.Build.0 = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x86.ActiveCfg = Debug|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x86.Build.0 = Debug|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -2162,7 +2072,6 @@ Global
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689} = {9A81B795-66AB-4743-9284-90565941343D}
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6} = {9A81B795-66AB-4743-9284-90565941343D}
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE} = {9A81B795-66AB-4743-9284-90565941343D}
-		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{10BF4001-214C-4869-8F78-2B6BDBDC7E7D} = {68C3DA2D-D2EA-426E-A866-0019E425C816}
 		{FA98BFA6-2E83-41C6-9102-76875B261F51} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C} = {2CC7ED59-C25E-4EED-8FED-D48E13EB9CC0}
@@ -2170,13 +2079,11 @@ Global
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{19704B2E-5EED-47CA-9258-89F246F50F19} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
-		{F4436A16-9488-4BAB-B2F6-C1806278CE16} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{71907779-F1D1-4AA6-BA11-E990DB089841} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
-		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{A0C4E418-467E-40E2-BAD6-35F953BA69E5} = {DF94111B-9D40-42D7-9416-4875E846FE8A}
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{221E745C-D21F-4725-BBB8-DFB2DE5CF61D} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
@@ -2191,6 +2098,7 @@ Global
 		{317B661B-23E8-43FE-A0D6-D3234DF155B1} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269} = {2CC7ED59-C25E-4EED-8FED-D48E13EB9CC0}
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188} = {2CC7ED59-C25E-4EED-8FED-D48E13EB9CC0}
+		{AE200ADC-9E85-4275-A373-E975CD6D518C} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {D04B4AB0-CA33-42FD-A909-79966F9255C5}