diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..e8ee8da
Binary files /dev/null and b/.DS_Store differ
diff --git a/katas/.DS_Store b/katas/.DS_Store
new file mode 100644
index 0000000..cbaff65
Binary files /dev/null and b/katas/.DS_Store differ
diff --git a/katas/LangtonAnt/.DS_Store b/katas/LangtonAnt/.DS_Store
new file mode 100644
index 0000000..10705eb
Binary files /dev/null and b/katas/LangtonAnt/.DS_Store differ
diff --git a/katas/LangtonAnt/solutions/.DS_Store b/katas/LangtonAnt/solutions/.DS_Store
new file mode 100644
index 0000000..73d7d56
Binary files /dev/null and b/katas/LangtonAnt/solutions/.DS_Store differ
diff --git a/katas/LangtonAnt/solutions/hsto-code/.DS_Store b/katas/LangtonAnt/solutions/hsto-code/.DS_Store
new file mode 100644
index 0000000..cfc248f
Binary files /dev/null and b/katas/LangtonAnt/solutions/hsto-code/.DS_Store differ
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/.DS_Store b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/.DS_Store
new file mode 100644
index 0000000..cd31b4b
Binary files /dev/null and b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/.DS_Store differ
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/.DS_Store b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/.DS_Store
new file mode 100644
index 0000000..9496d78
Binary files /dev/null and b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/.DS_Store differ
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/LangtonAnt.Backend.csproj b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/LangtonAnt.Backend.csproj
new file mode 100644
index 0000000..55fbaad
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/LangtonAnt.Backend.csproj
@@ -0,0 +1,13 @@
+
+
+
+ Exe
+ net7.0
+ enable
+ enable
+
+
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/Program.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/Program.cs
new file mode 100644
index 0000000..1e4454e
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Backend/Program.cs
@@ -0,0 +1,7 @@
+// See https://aka.ms/new-console-template for more information
+using LangtonAnt;
+
+Playfield playfield = new Playfield(11, new Point(5, 5), Direction.West, "/Users/stephanetolale/Projects/LangtonAnt.Frontend/LangtonAnt.Backend/bin/Debug/net7.0", false);
+playfield.Start(30);
+
+Console.ReadKey();
\ No newline at end of file
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/App.xaml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/App.xaml
new file mode 100644
index 0000000..9f84db5
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/App.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/App.xaml.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/App.xaml.cs
new file mode 100644
index 0000000..98f2b68
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/App.xaml.cs
@@ -0,0 +1,12 @@
+namespace LangtonAnt.Frontend;
+
+public partial class App : Application
+{
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new AppShell();
+ }
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/AppShell.xaml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/AppShell.xaml
new file mode 100644
index 0000000..6037192
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/AppShell.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/AppShell.xaml.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/AppShell.xaml.cs
new file mode 100644
index 0000000..b3c1021
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/AppShell.xaml.cs
@@ -0,0 +1,10 @@
+namespace LangtonAnt.Frontend;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/LangtonAnt.Frontend.csproj b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/LangtonAnt.Frontend.csproj
new file mode 100644
index 0000000..ce693bd
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/LangtonAnt.Frontend.csproj
@@ -0,0 +1,60 @@
+
+
+
+ net7.0-android;net7.0-ios;net7.0-maccatalyst
+ $(TargetFrameworks);net7.0-windows10.0.19041.0
+
+
+ Exe
+ LangtonAnt.Frontend
+ true
+ true
+ enable
+
+ LangtonAnt.Frontend
+
+ com.companyname.langtonant.frontend
+ 09520bb0-33db-4a8b-897b-7b254d23f30b
+
+ 1.0
+ 1
+ 11.0
+ 13.1
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MainPage.xaml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MainPage.xaml
new file mode 100644
index 0000000..e152e50
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MainPage.xaml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MainPage.xaml.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MainPage.xaml.cs
new file mode 100644
index 0000000..4125c6d
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MainPage.xaml.cs
@@ -0,0 +1,18 @@
+using LangtonAnt.Frontend.ViewModels;
+
+namespace LangtonAnt.Frontend;
+
+public partial class MainPage : ContentPage
+{
+
+ private MainPageViewModel viewModel;
+
+ public MainPage()
+ {
+ InitializeComponent();
+ viewModel = new MainPageViewModel(this.chessGrid);
+ BindingContext = viewModel;
+ }
+}
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MauiProgram.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MauiProgram.cs
new file mode 100644
index 0000000..f7e31d1
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/MauiProgram.cs
@@ -0,0 +1,25 @@
+using Microsoft.Extensions.Logging;
+
+namespace LangtonAnt.Frontend;
+
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ });
+
+#if DEBUG
+ builder.Logging.AddDebug();
+#endif
+
+ return builder.Build();
+ }
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/AndroidManifest.xml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000..def1282
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/MainActivity.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000..bd6374f
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace LangtonAnt.Frontend;
+
+[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+public class MainActivity : MauiAppCompatActivity
+{
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/MainApplication.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000..e80b09e
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+using Android.App;
+using Android.Runtime;
+
+namespace LangtonAnt.Frontend;
+
+[Application]
+public class MainApplication : MauiApplication
+{
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/Resources/values/colors.xml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000..c2794f7
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/AppDelegate.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000..cd1243d
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace LangtonAnt.Frontend;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/Info.plist b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000..c96dd0a
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/Program.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000..f15ac5b
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace LangtonAnt.Frontend;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Tizen/Main.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Tizen/Main.cs
new file mode 100644
index 0000000..9d8ef70
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Tizen/Main.cs
@@ -0,0 +1,17 @@
+using System;
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+
+namespace LangtonAnt.Frontend;
+
+class Program : MauiApplication
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+
+ static void Main(string[] args)
+ {
+ var app = new Program();
+ app.Run(args);
+ }
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Tizen/tizen-manifest.xml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Tizen/tizen-manifest.xml
new file mode 100644
index 0000000..bf0e7e3
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Tizen/tizen-manifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ maui-appicon-placeholder
+
+
+
+
+ http://tizen.org/privilege/internet
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/App.xaml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/App.xaml
new file mode 100644
index 0000000..d1d236d
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/App.xaml.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000..f521f34
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,25 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace LangtonAnt.Frontend.WinUI;
+
+///
+/// Provides application-specific behavior to supplement the default Application class.
+///
+public partial class App : MauiWinUIApplication
+{
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/Package.appxmanifest b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000..258a4bd
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+ $placeholder$
+ User Name
+ $placeholder$.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/app.manifest b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/app.manifest
new file mode 100644
index 0000000..ceba222
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/Windows/app.manifest
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/AppDelegate.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000..cd1243d
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace LangtonAnt.Frontend;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/Info.plist b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/Info.plist
new file mode 100644
index 0000000..0004a4f
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/Program.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/Program.cs
new file mode 100644
index 0000000..f15ac5b
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Platforms/iOS/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace LangtonAnt.Frontend;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Properties/launchSettings.json b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Properties/launchSettings.json
new file mode 100644
index 0000000..90f92d9
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Windows Machine": {
+ "commandName": "MsixPackage",
+ "nativeDebugging": false
+ }
+ }
+}
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/AppIcon/appicon.svg b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/AppIcon/appicon.svg
new file mode 100644
index 0000000..49f9800
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/AppIcon/appicon.svg
@@ -0,0 +1,5 @@
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/AppIcon/appiconfg.svg b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 0000000..e9b7139
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Fonts/OpenSans-Regular.ttf b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000..e248a95
Binary files /dev/null and b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Fonts/OpenSans-Semibold.ttf b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 0000000..dbc9572
Binary files /dev/null and b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Images/dotnet_bot.svg b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Images/dotnet_bot.svg
new file mode 100644
index 0000000..e19b012
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,95 @@
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Raw/AboutAssets.txt b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Raw/AboutAssets.txt
new file mode 100644
index 0000000..808d6d3
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,17 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with you package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Splash/splash.svg b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Splash/splash.svg
new file mode 100644
index 0000000..4b71383
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Splash/splash.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Styles/Colors.xaml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Styles/Colors.xaml
new file mode 100644
index 0000000..e4a7a43
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Styles/Colors.xaml
@@ -0,0 +1,44 @@
+
+
+
+
+ #512BD4
+ #DFD8F7
+ #2B0B98
+ White
+ Black
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #F7B548
+ #FFD590
+ #FFE5B9
+ #28C2D1
+ #7BDDEF
+ #C3F2F4
+ #3E8EED
+ #72ACF1
+ #A7CBF6
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Styles/Styles.xaml b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Styles/Styles.xaml
new file mode 100644
index 0000000..d23a11d
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/Resources/Styles/Styles.xaml
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/ViewModels/MainPageViewModel.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/ViewModels/MainPageViewModel.cs
new file mode 100644
index 0000000..e5b68d7
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.Frontend/ViewModels/MainPageViewModel.cs
@@ -0,0 +1,215 @@
+using System;
+using System.Runtime.ConstrainedExecution;
+
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+
+namespace LangtonAnt.Frontend.ViewModels
+{
+ public partial class MainPageViewModel : ObservableObject
+ {
+ private class AntPosition
+ {
+ public Direction Direction { get; set; }
+ public int X { get; set; }
+ public int Y { get; set; }
+ }
+
+ private List antPositions = new List();
+
+
+ private readonly Grid playgroudGrid;
+ [ObservableProperty]
+ private string inputFile;
+
+ [ObservableProperty]
+ private int moveSpeed = 3;
+
+ [ObservableProperty]
+ private int playfieldLength;
+
+ [ObservableProperty]
+ private Point startPosition;
+
+ [ObservableProperty]
+ private Direction direction;
+
+ [ObservableProperty]
+ private int moveCount;
+
+ public MainPageViewModel(Grid playgroudGrid)
+ {
+ this.playgroudGrid = playgroudGrid;
+ }
+
+ [RelayCommand]
+ private async Task Start()
+ {
+ foreach (var item in antPositions.Skip(1))
+ {
+ await Delay();
+
+ await DrawAsync(item);
+ }
+
+
+ await DrawAsync(antPositions.ElementAt(0));
+ }
+
+ private async Task Delay()
+ {
+ var delay = TimeSpan.FromMilliseconds(500);
+ switch (MoveSpeed)
+ {
+ case 1:
+ default:
+ delay = TimeSpan.FromMilliseconds(1000);
+ break;
+ case 2:
+ delay = TimeSpan.FromMilliseconds(900);
+ break;
+ case 3:
+ delay = TimeSpan.FromMilliseconds(800);
+ break;
+ case 4:
+ delay = TimeSpan.FromMilliseconds(700);
+ break;
+ case 5:
+ delay = TimeSpan.FromMilliseconds(500);
+ break;
+ }
+
+ await Task.Delay(delay);
+ }
+
+ private async Task DrawAsync(AntPosition antMove)
+ {
+ Grid grid = new Grid()
+ {
+ };
+ for (int i = 0; i < PlayfieldLength; i++)
+ {
+ grid.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(70)));
+ }
+
+ for (int i = 0; i < PlayfieldLength; i++)
+ {
+ grid.RowDefinitions.Add(new RowDefinition(new GridLength(70)));
+ }
+
+
+ for (int i = 0; i < PlayfieldLength; i++)
+ {
+ for (int j = 0; j < PlayfieldLength; j++)
+ {
+ StackLayout stack = new StackLayout()
+ {
+ BackgroundColor = Colors.LightGray,
+ Spacing = 0,
+ Margin = new Thickness(2)
+ };
+
+ Grid.SetRow(stack, i);
+ Grid.SetColumn(stack, j);
+
+ stack.Children.Add(new Label()
+ {
+ Text = i == antMove.Y && j == antMove.X ? $"Ant" : "",
+ TextColor = Colors.Red,
+ BackgroundColor = Colors.Red,
+ HorizontalTextAlignment = TextAlignment.Center,
+ VerticalTextAlignment = TextAlignment.Center,
+ VerticalOptions = LayoutOptions.Center,
+ HorizontalOptions = LayoutOptions.Center
+ });
+
+ grid.Children.Add(stack);
+ }
+ }
+
+ await MainThread.InvokeOnMainThreadAsync(() =>
+ {
+ playgroudGrid.Children.Clear();
+ playgroudGrid.Children.Add(grid);
+ });
+ }
+
+ [RelayCommand]
+ private async Task ImportFile()
+ {
+ antPositions.Clear();
+ try
+ {
+ PickOptions options = new()
+ {
+ PickerTitle = "Please select a LangtonAnt file",
+ };
+ var result = await FilePicker.Default.PickAsync(options);
+ if (result != null)
+ {
+ if (result.FileName.EndsWith("txt", StringComparison.OrdinalIgnoreCase))
+ {
+ using var stream = await result.OpenReadAsync();
+ using var streamReader = new StreamReader(stream);
+ int lineCount = 0;
+ while (streamReader.EndOfStream == false)
+ {
+ var line = await streamReader.ReadLineAsync();
+ if (string.IsNullOrWhiteSpace(line))
+ continue;
+
+ var lineSplit = line.Split(",");
+ if (lineCount == 0)
+ {
+ PlayfieldLength = Convert.ToInt32(Math.Sqrt(lineSplit.Length));
+ }
+
+ var playfieldSplit = lineSplit.Chunk(PlayfieldLength);
+ for (int i = 0; i < playfieldSplit.Count(); i++)
+ {
+ var items = playfieldSplit.ElementAt(i).ToList();
+ var positionEntry = items.SingleOrDefault(p => p.Length > 1);
+ var indexOfAnt = items.IndexOf(positionEntry);
+
+ if (indexOfAnt != -1)
+ {
+ AntPosition antPosition = new AntPosition()
+ {
+ Direction = positionEntry[0].FromChar(),
+ X = i,
+ Y = indexOfAnt
+ };
+
+ antPositions.Add(antPosition);
+ break;
+ }
+ }
+
+
+ lineCount++;
+ }
+
+ MoveCount = lineCount - 1;
+ if (MoveCount > 0)
+ {
+ AntPosition antMove = antPositions.ElementAt(0);
+ this.Direction = antMove.Direction;
+ this.StartPosition = new Point(antMove.X, antMove.Y);
+
+
+ await DrawAsync(antPositions.ElementAt(0));
+
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ // The user canceled or something went wrong
+ }
+ }
+
+
+ }
+}
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.sln b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.sln
new file mode 100644
index 0000000..646e9b6
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt.sln
@@ -0,0 +1,39 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 17.0.31611.283
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangtonAnt.Frontend", "LangtonAnt.Frontend\LangtonAnt.Frontend.csproj", "{E46F7BEF-3BD9-4C04-B018-1D929EE1CF58}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangtonAnt", "LangtonAnt\LangtonAnt.csproj", "{E3E85003-76E4-4923-8B0F-505A669C7F3C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangtonAnt.Backend", "LangtonAnt.Backend\LangtonAnt.Backend.csproj", "{D90546DD-9B0B-402F-80EC-F55D085E35C6}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E46F7BEF-3BD9-4C04-B018-1D929EE1CF58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E46F7BEF-3BD9-4C04-B018-1D929EE1CF58}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E46F7BEF-3BD9-4C04-B018-1D929EE1CF58}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {E46F7BEF-3BD9-4C04-B018-1D929EE1CF58}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E46F7BEF-3BD9-4C04-B018-1D929EE1CF58}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E46F7BEF-3BD9-4C04-B018-1D929EE1CF58}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {E3E85003-76E4-4923-8B0F-505A669C7F3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E3E85003-76E4-4923-8B0F-505A669C7F3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E3E85003-76E4-4923-8B0F-505A669C7F3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E3E85003-76E4-4923-8B0F-505A669C7F3C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D90546DD-9B0B-402F-80EC-F55D085E35C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D90546DD-9B0B-402F-80EC-F55D085E35C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D90546DD-9B0B-402F-80EC-F55D085E35C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D90546DD-9B0B-402F-80EC-F55D085E35C6}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
+ EndGlobalSection
+EndGlobal
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Ant.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Ant.cs
new file mode 100644
index 0000000..9dc8f5b
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Ant.cs
@@ -0,0 +1,112 @@
+namespace LangtonAnt;
+
+public class Ant
+{
+ private Direction direction;
+ private readonly IList cells;
+ private Cell currentCell;
+ private Cell previousCell;
+ public Cell CurrentCell { get => currentCell; }
+
+ public Direction Direction { get => direction; }
+
+ public Ant(IList cells, Cell antStartCell, Direction antStartDirection)
+ {
+ this.cells = cells;
+ this.currentCell = antStartCell;
+ this.previousCell = antStartCell;
+ this.direction = antStartDirection;
+ }
+
+ public void Move()
+ {
+ /*Auf einem weißen Feld drehe 90 Grad nach rechts; auf einem schwarzen Feld drehe 90 Grad nach links.
+ Wechsle die Farbe des Feldes (weiß nach schwarz oder schwarz nach weiß).
+ Schreite ein Feld in der aktuellen Blickrichtung fort.
+ */
+ previousCell = currentCell;
+ switch (direction)
+ {
+ case Direction.North:
+ switch (currentCell.Color)
+ {
+ case CellColor.White:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Right());
+ direction = Direction.East;
+ break;
+
+ case CellColor.Black:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Left());
+ direction = Direction.West;
+ break;
+ default:
+ break;
+ }
+
+ break;
+
+ case Direction.South:
+ switch (currentCell.Color)
+ {
+ case CellColor.White:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Left());
+ direction = Direction.West;
+ break;
+
+ case CellColor.Black:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Right());
+ direction = Direction.East;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case Direction.West:
+ switch (currentCell.Color)
+ {
+ case CellColor.White:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Top());
+ direction = Direction.North;
+ break;
+
+ case CellColor.Black:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Bottom());
+ direction = Direction.South;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case Direction.East:
+ switch (currentCell.Color)
+ {
+ case CellColor.White:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Bottom());
+ direction = Direction.South;
+ break;
+
+ case CellColor.Black:
+ currentCell = cells.SingleOrDefault(p => p.Point == currentCell.Top());
+ direction = Direction.North;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if(currentCell == null)
+ {
+ //TODO
+ }
+ else
+ {
+ previousCell.ChangeColor();
+ }
+ }
+}
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Cell.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Cell.cs
new file mode 100644
index 0000000..b44ca77
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Cell.cs
@@ -0,0 +1,50 @@
+namespace LangtonAnt;
+
+public class Cell
+{
+ public Point Point { get; set; }
+ public CellColor Color { get; set; } = CellColor.White;
+ public bool IsTagged { get; set; }
+
+ internal Point Right()
+ {
+ return new Point(Point.X + 1, Point.Y);
+ }
+
+ internal Point Left()
+ {
+ return new Point(Point.X - 1, Point.Y);
+ }
+
+ internal Point Top()
+ {
+ return new Point(Point.X, Point.Y - 1);
+ }
+
+ internal Point Bottom()
+ {
+ return new Point(Point.X, Point.Y + 1);
+ }
+
+ internal void ChangeColor()
+ {
+ switch (Color)
+ {
+ case CellColor.White:
+ Color = CellColor.Black;
+ break;
+
+ case CellColor.Black:
+ Color = CellColor.White;
+ break;
+ default:
+ break;
+ }
+ }
+
+ public override string ToString()
+ {
+ string color = Color == CellColor.White ? "w" : "s";
+ return color;
+ }
+}
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/CellColor.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/CellColor.cs
new file mode 100644
index 0000000..fad2993
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/CellColor.cs
@@ -0,0 +1,7 @@
+namespace LangtonAnt;
+
+public enum CellColor
+{
+ White,
+ Black
+}
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Direction.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Direction.cs
new file mode 100644
index 0000000..0fce9b5
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Direction.cs
@@ -0,0 +1,9 @@
+namespace LangtonAnt;
+
+public enum Direction
+{
+ North,
+ East,
+ South,
+ West
+}
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/DirectionExtensions.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/DirectionExtensions.cs
new file mode 100644
index 0000000..54da032
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/DirectionExtensions.cs
@@ -0,0 +1,39 @@
+namespace LangtonAnt;
+
+public static class DirectionExtensions
+{
+
+ public static string AsString(this Direction self)
+ {
+ switch (self)
+ {
+ case Direction.North:
+ return "n";
+ case Direction.South:
+ return "s";
+ case Direction.West:
+ return "w";
+ case Direction.East:
+ return "o";
+ default:
+ throw new NotSupportedException(self.ToString());
+ }
+ }
+
+ public static Direction FromChar(this char self)
+ {
+ switch (self)
+ {
+ case 'n':
+ return Direction.North;
+ case 's':
+ return Direction.South;
+ case 'w':
+ return Direction.West;
+ case 'o':
+ return Direction.East;
+ default:
+ throw new NotSupportedException(self.ToString());
+ }
+ }
+}
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/LangtonAnt.csproj b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/LangtonAnt.csproj
new file mode 100644
index 0000000..1346798
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/LangtonAnt.csproj
@@ -0,0 +1,8 @@
+
+
+
+ net7.0
+ enable
+
+
+
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Playfield.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Playfield.cs
new file mode 100644
index 0000000..7ea8a2d
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Playfield.cs
@@ -0,0 +1,92 @@
+using System.Numerics;
+using System.Text;
+
+namespace LangtonAnt;
+
+public class Playfield
+{
+ private readonly Ant ant;
+ private readonly int playFieldCellNumber;
+ private readonly string outputPath;
+ private readonly bool appendPointInFile;
+ private readonly IList cells;
+
+ public Playfield( int playFieldCellNumber,Point startPoint, Direction direction, string outputPath, bool appendPointInFile = false)
+ {
+ if (string.IsNullOrWhiteSpace(outputPath))
+ {
+ throw new ArgumentException($"'{nameof(outputPath)}' cannot be null or whitespace.", nameof(outputPath));
+ }
+
+ if(playFieldCellNumber < 3)
+ {
+ throw new ArgumentException("tbdl");
+ }
+
+ if(Directory.Exists(outputPath) == false)
+ {
+ throw new DirectoryNotFoundException(outputPath);
+ }
+
+ this.playFieldCellNumber = playFieldCellNumber;
+ this.outputPath = outputPath;
+ this.appendPointInFile = appendPointInFile;
+ this.cells = new List| (playFieldCellNumber * playFieldCellNumber);
+ for (int x = 0; x < playFieldCellNumber; x++)
+ {
+ for (int y = 0; y < playFieldCellNumber; y++)
+ {
+ this.cells.Add ( new Cell()
+ {
+ Point = new Point(x,y),
+ });
+ }
+ }
+ //???
+ Cell antStartCell = cells.SingleOrDefault(p=> p.Point == startPoint);
+ ant = new Ant(cells,antStartCell ,direction);
+ }
+
+
+ public override string ToString()
+ {
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < cells.Count; i++)
+ {
+ Cell item = this.cells[i];
+ if (item.Point == this.ant.CurrentCell.Point)
+ {
+ builder.Append($"{this.ant.Direction.AsString()}");
+ }
+
+ builder.Append($"{item.ToString()}");
+ if (appendPointInFile)
+ {
+ builder.Append($"[X={item.Point.X},Y={item.Point.Y}]");
+ }
+ if(i != cells.Count - 1)
+ {
+ builder.Append(",");
+ }
+ }
+
+ return builder.ToString();
+ }
+
+ public void Start(int moveCount)
+ {
+ using StreamWriter streamWriter = new StreamWriter(Path.Combine(this.outputPath, "LangtonAnt.txt"));
+ int move = 0;
+ string text = ToString();
+ Console.WriteLine(text);
+ streamWriter.WriteLine(text);
+ while (move < moveCount)
+ {
+ this.ant.Move();
+ text = ToString();
+ Console.WriteLine(text);
+ streamWriter.WriteLine(text);
+ move++;
+ }
+ }
+}
diff --git a/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Point.cs b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Point.cs
new file mode 100644
index 0000000..cd6943e
--- /dev/null
+++ b/katas/LangtonAnt/solutions/hsto-code/LangtonAnt.Frontend/LangtonAnt/Point.cs
@@ -0,0 +1,3 @@
+namespace LangtonAnt;
+
+public record class Point(int X, int Y);
diff --git a/katas/StrangeChessboard/.DS_Store b/katas/StrangeChessboard/.DS_Store
new file mode 100644
index 0000000..7d9358e
Binary files /dev/null and b/katas/StrangeChessboard/.DS_Store differ
diff --git a/katas/StrangeChessboard/solutions/.DS_Store b/katas/StrangeChessboard/solutions/.DS_Store
new file mode 100644
index 0000000..cf44082
Binary files /dev/null and b/katas/StrangeChessboard/solutions/.DS_Store differ
diff --git a/katas/StrangeChessboard/solutions/hsto-code/.DS_Store b/katas/StrangeChessboard/solutions/hsto-code/.DS_Store
new file mode 100644
index 0000000..022e859
Binary files /dev/null and b/katas/StrangeChessboard/solutions/hsto-code/.DS_Store differ
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/.DS_Store b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/.DS_Store
new file mode 100644
index 0000000..2889e33
Binary files /dev/null and b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/.DS_Store differ
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard.sln b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard.sln
new file mode 100644
index 0000000..7bf76ea
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard.sln
@@ -0,0 +1,27 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 17.0.31611.283
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StrangeChessboard", "StrangeChessboard\StrangeChessboard.csproj", "{B8F38410-CFC6-49E4-9D5D-E39E3943C1D7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B8F38410-CFC6-49E4-9D5D-E39E3943C1D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B8F38410-CFC6-49E4-9D5D-E39E3943C1D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B8F38410-CFC6-49E4-9D5D-E39E3943C1D7}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {B8F38410-CFC6-49E4-9D5D-E39E3943C1D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B8F38410-CFC6-49E4-9D5D-E39E3943C1D7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B8F38410-CFC6-49E4-9D5D-E39E3943C1D7}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
+ EndGlobalSection
+EndGlobal
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/.DS_Store b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/.DS_Store
new file mode 100644
index 0000000..78d5956
Binary files /dev/null and b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/.DS_Store differ
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/App.xaml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/App.xaml
new file mode 100644
index 0000000..5b793f0
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/App.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/App.xaml.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/App.xaml.cs
new file mode 100644
index 0000000..6aaf9d8
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/App.xaml.cs
@@ -0,0 +1,12 @@
+namespace StrangeChessboard;
+
+public partial class App : Application
+{
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new AppShell();
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/AppShell.xaml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/AppShell.xaml
new file mode 100644
index 0000000..f6378f2
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/AppShell.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/AppShell.xaml.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/AppShell.xaml.cs
new file mode 100644
index 0000000..761e755
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/AppShell.xaml.cs
@@ -0,0 +1,10 @@
+namespace StrangeChessboard;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MainPage.xaml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MainPage.xaml
new file mode 100644
index 0000000..7315b36
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MainPage.xaml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MainPage.xaml.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MainPage.xaml.cs
new file mode 100644
index 0000000..0e323d3
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MainPage.xaml.cs
@@ -0,0 +1,18 @@
+using StrangeChessboard.Models;
+using StrangeChessboard.ViewModels;
+
+namespace StrangeChessboard;
+
+public partial class MainPage : ContentPage
+{
+ private MainPageViewModel viewModel;
+
+ public MainPage()
+ {
+ InitializeComponent();
+ viewModel = new MainPageViewModel(this.chessGrid);
+ BindingContext = viewModel;
+ }
+}
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MauiProgram.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MauiProgram.cs
new file mode 100644
index 0000000..5fd890b
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/MauiProgram.cs
@@ -0,0 +1,25 @@
+using Microsoft.Extensions.Logging;
+
+namespace StrangeChessboard;
+
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ });
+
+#if DEBUG
+ builder.Logging.AddDebug();
+#endif
+
+ return builder.Build();
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/Builder/ChessBuilder.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/Builder/ChessBuilder.cs
new file mode 100644
index 0000000..dbcce0a
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/Builder/ChessBuilder.cs
@@ -0,0 +1,11 @@
+namespace StrangeChessboard.Models
+{
+ public static class ChessBuilder
+ {
+ internal static ChessBuilderSized New(int size)
+ {
+ return new ChessBuilderSized(size);
+ }
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/Builder/ChessBuilderSized.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/Builder/ChessBuilderSized.cs
new file mode 100644
index 0000000..7ab42c1
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/Builder/ChessBuilderSized.cs
@@ -0,0 +1,72 @@
+namespace StrangeChessboard.Models
+{
+ public class ChessBuilderSized
+ {
+ private int size;
+ private int[] cs;
+ private int[] rs;
+
+ public ChessBuilderSized(int size)
+ {
+ this.size = size;
+ }
+
+ internal ChessBoard Build()
+ {
+ ChessBoard chessBoard = new ChessBoard(size);
+ CellColor cellColor = CellColor.White;
+ for (int i = 0; i < rs.Length; i++)
+ {
+ ChessLine chessLine = new ChessLine(size);
+ for (int j = 0; j < cs.Length; j++)
+ {
+ chessLine.Cells.Add(new ChessCell
+ {
+ Color = cellColor,
+ Height = rs[i],
+ Width = cs[j],
+ X = i,
+ Y = j
+ });
+ cellColor = NextColor(cellColor);
+ }
+ chessBoard.Lines.Add(chessLine);
+ }
+
+ return chessBoard;
+ }
+
+ private CellColor NextColor(CellColor cellColor)
+ {
+ switch (cellColor)
+ {
+ case CellColor.White:
+ return CellColor.Back;
+
+ case CellColor.Back:
+ return CellColor.White;
+ default:
+ throw new NotSupportedException(cellColor.ToString("F"));
+ }
+ }
+
+ internal ChessBuilderSized WithCS(params int[] cs)
+ {
+ if (cs.Length != size)
+ throw new ArgumentException("tbdl");
+
+ this.cs = cs;
+ return this;
+ }
+
+ internal ChessBuilderSized WithRS(params int[] rs)
+ {
+ if (rs.Length != size)
+ throw new ArgumentException("tbdl");
+
+ this.rs = rs;
+ return this;
+ }
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/CellColor.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/CellColor.cs
new file mode 100644
index 0000000..2c95c41
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/CellColor.cs
@@ -0,0 +1,9 @@
+namespace StrangeChessboard.Models
+{
+ public enum CellColor
+ {
+ White = 0,
+ Back = 1
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessBoard.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessBoard.cs
new file mode 100644
index 0000000..d389c94
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessBoard.cs
@@ -0,0 +1,38 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace StrangeChessboard.Models
+{
+ public partial class ChessBoard : ObservableObject
+ {
+ public ChessBoard(int maxLine)
+ {
+ Lines = new List(maxLine);
+ }
+
+ [ObservableProperty]
+ private IList lines;
+
+ public int BlackSurface() => Surface(CellColor.Back);
+
+ public int WhiteSurface() => Surface(CellColor.White);
+
+ public int Surface() => Lines.Sum(p => p.Cells.Select(p => p.GetSurface())
+ .Sum());
+
+
+ private int Surface(CellColor cellColor)
+ {
+ return Lines.Sum(p => p.Cells.Where(p => p.Color == cellColor)
+ .Select(p => p.GetSurface())
+ .Sum());
+ }
+
+ internal void RaisePropertiesChanged()
+ {
+ OnPropertyChanged(nameof(Lines));
+ OnPropertyChanged();
+ }
+
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessCell.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessCell.cs
new file mode 100644
index 0000000..e4134b9
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessCell.cs
@@ -0,0 +1,27 @@
+using System;
+
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace StrangeChessboard.Models
+{
+ public partial class ChessCell : ObservableObject
+ {
+ [ObservableProperty]
+ private int x;
+
+ [ObservableProperty]
+ private int y;
+
+ [ObservableProperty]
+ private CellColor color;
+
+ [ObservableProperty]
+ private int width;
+
+ [ObservableProperty]
+ private int height;
+
+ public int GetSurface() => Width * Height;
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessLine.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessLine.cs
new file mode 100644
index 0000000..0aa6e18
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Models/ChessLine.cs
@@ -0,0 +1,16 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace StrangeChessboard.Models
+{
+ public partial class ChessLine : ObservableObject
+ {
+ public ChessLine(int maxLime)
+ {
+ Cells = new List(maxLime);
+ }
+
+ [ObservableProperty]
+ private IList cells;
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/AndroidManifest.xml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000..def1282
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/MainActivity.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000..c5a7dfb
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace StrangeChessboard;
+
+[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+public class MainActivity : MauiAppCompatActivity
+{
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/MainApplication.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000..ddb0bd7
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+using Android.App;
+using Android.Runtime;
+
+namespace StrangeChessboard;
+
+[Application]
+public class MainApplication : MauiApplication
+{
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/Resources/values/colors.xml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000..c2794f7
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/AppDelegate.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000..06b76a6
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace StrangeChessboard;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/Info.plist b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000..c96dd0a
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/Program.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000..b397e53
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace StrangeChessboard;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Tizen/Main.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Tizen/Main.cs
new file mode 100644
index 0000000..e611e00
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Tizen/Main.cs
@@ -0,0 +1,17 @@
+using System;
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+
+namespace StrangeChessboard;
+
+class Program : MauiApplication
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+
+ static void Main(string[] args)
+ {
+ var app = new Program();
+ app.Run(args);
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Tizen/tizen-manifest.xml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Tizen/tizen-manifest.xml
new file mode 100644
index 0000000..e0e5f46
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Tizen/tizen-manifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ maui-appicon-placeholder
+
+
+
+
+ http://tizen.org/privilege/internet
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/App.xaml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/App.xaml
new file mode 100644
index 0000000..262b011
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/App.xaml.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000..8c93713
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,25 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace StrangeChessboard.WinUI;
+
+///
+/// Provides application-specific behavior to supplement the default Application class.
+///
+public partial class App : MauiWinUIApplication
+{
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/Package.appxmanifest b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000..8493cf5
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+ $placeholder$
+ User Name
+ $placeholder$.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/app.manifest b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/app.manifest
new file mode 100644
index 0000000..7d92444
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/Windows/app.manifest
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/AppDelegate.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000..06b76a6
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace StrangeChessboard;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/Info.plist b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/Info.plist
new file mode 100644
index 0000000..0004a4f
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/Program.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/Program.cs
new file mode 100644
index 0000000..b397e53
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Platforms/iOS/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace StrangeChessboard;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Properties/launchSettings.json b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Properties/launchSettings.json
new file mode 100644
index 0000000..90f92d9
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Windows Machine": {
+ "commandName": "MsixPackage",
+ "nativeDebugging": false
+ }
+ }
+}
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/AppIcon/appicon.svg b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/AppIcon/appicon.svg
new file mode 100644
index 0000000..49f9800
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/AppIcon/appicon.svg
@@ -0,0 +1,5 @@
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/AppIcon/appiconfg.svg b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 0000000..e9b7139
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Fonts/OpenSans-Regular.ttf b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000..e248a95
Binary files /dev/null and b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Fonts/OpenSans-Semibold.ttf b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 0000000..dbc9572
Binary files /dev/null and b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Images/dotnet_bot.svg b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Images/dotnet_bot.svg
new file mode 100644
index 0000000..e19b012
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,95 @@
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Raw/AboutAssets.txt b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Raw/AboutAssets.txt
new file mode 100644
index 0000000..808d6d3
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,17 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with you package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Splash/splash.svg b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Splash/splash.svg
new file mode 100644
index 0000000..4b71383
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Splash/splash.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Styles/Colors.xaml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Styles/Colors.xaml
new file mode 100644
index 0000000..e4a7a43
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Styles/Colors.xaml
@@ -0,0 +1,44 @@
+
+
+
+
+ #512BD4
+ #DFD8F7
+ #2B0B98
+ White
+ Black
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #F7B548
+ #FFD590
+ #FFE5B9
+ #28C2D1
+ #7BDDEF
+ #C3F2F4
+ #3E8EED
+ #72ACF1
+ #A7CBF6
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Styles/Styles.xaml b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Styles/Styles.xaml
new file mode 100644
index 0000000..d23a11d
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/Resources/Styles/Styles.xaml
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/StrangeChessboard.csproj b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/StrangeChessboard.csproj
new file mode 100644
index 0000000..ff241cc
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/StrangeChessboard.csproj
@@ -0,0 +1,69 @@
+
+
+
+ net7.0-android;net7.0-ios;net7.0-maccatalyst
+ $(TargetFrameworks);net7.0-windows10.0.19041.0
+
+
+ Exe
+ StrangeChessboard
+ true
+ true
+ enable
+
+
+ StrangeChessboard
+
+
+ com.companyname.strangechessboard
+ 749c808b-2b4a-460b-8d40-7a4a1c8be4b9
+
+
+ 1.0
+ 1
+
+ 11.0
+ 13.1
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/ViewModels/MainPageViewModel.cs b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/ViewModels/MainPageViewModel.cs
new file mode 100644
index 0000000..db95c45
--- /dev/null
+++ b/katas/StrangeChessboard/solutions/hsto-code/StrangeChessboard/StrangeChessboard/ViewModels/MainPageViewModel.cs
@@ -0,0 +1,150 @@
+using System;
+
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+
+using StrangeChessboard.Models;
+
+namespace StrangeChessboard.ViewModels
+{
+ public partial class MainPageViewModel : ObservableObject
+ {
+ [ObservableProperty]
+ private int chessBoardize = 5;
+
+ [ObservableProperty]
+ private string cs = "3, 1, 2, 7, 1";
+
+ [ObservableProperty]
+ private string rs = "1, 8, 4, 5, 2";
+
+ [ObservableProperty]
+ private int whiteSurface;
+
+ [ObservableProperty]
+ private int blackSurface;
+
+ [ObservableProperty]
+ private int chessBoardSurface;
+
+ [ObservableProperty]
+ private ChessBoard chessBoard;
+ private Grid chessGrid;
+
+ public MainPageViewModel(Grid chessGrid)
+ {
+ this.chessGrid = chessGrid;
+ }
+
+ [RelayCommand(CanExecute = nameof(CanGenerate))]
+ private void Generate()
+ {
+ int[] csArray = Cs.Split(',', StringSplitOptions.TrimEntries).Select(p => int.Parse(p)).ToArray();
+ int[] rsArray = Rs.Split(',', StringSplitOptions.TrimEntries).Select(p => int.Parse(p)).ToArray();
+ ChessBoard = ChessBuilder.New(ChessBoardize)
+ .WithCS(csArray)
+ .WithRS(rsArray)
+ .Build();
+
+ ChessBoard.RaisePropertiesChanged();
+
+ BlackSurface = ChessBoard.BlackSurface();
+ WhiteSurface = ChessBoard.WhiteSurface();
+ ChessBoardSurface = ChessBoard.Surface();
+
+
+ Grid grid = new Grid()
+ {
+ };
+ for (int i = 0; i < csArray.Sum(); i++)
+ {
+ grid.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(70)));
+ }
+
+ for (int i = 0; i < rsArray.Sum(); i++)
+ {
+ grid.RowDefinitions.Add(new RowDefinition(new GridLength(70)));
+ }
+
+
+ for (int i = 0; i < ChessBoard.Lines.Count; i++)
+ {
+ ChessLine line = ChessBoard.Lines[i];
+ int shiftBottom = 0;
+ if (i > 0)
+ {
+ shiftBottom = ChessBoard.Lines.TakeWhile(p => ChessBoard.Lines.IndexOf(p) < i).Sum(p => p.Cells[0].Height );
+ }
+
+ for (int j = 0; j < line.Cells.Count; j++)
+ {
+ ChessCell cell = line.Cells[j];
+ var shiftRight = line.Cells.TakeWhile(p => line.Cells.IndexOf(p) < j).Sum(p => p.Width);
+
+
+ StackLayout stack = new StackLayout()
+ {
+ BackgroundColor = ConvertColor(cell.Color),
+ Spacing = 0,
+
+ };
+
+ Grid.SetRow(stack, shiftBottom);
+ Grid.SetColumn(stack, shiftRight);
+
+ Grid.SetRowSpan(stack, cell.Height );
+ Grid.SetColumnSpan(stack, cell.Width);
+
+
+ stack.Children.Add(new Label()
+ {
+ Text = $"{cell.Width} * {cell.Height}",
+ TextColor = Colors.Red,
+ BackgroundColor = ConvertColor(cell.Color),
+ HorizontalTextAlignment = TextAlignment.Center,
+ VerticalTextAlignment = TextAlignment.Center,
+ VerticalOptions = LayoutOptions.Center,
+ HorizontalOptions = LayoutOptions.Center
+ });
+
+ grid.Children.Add(stack);
+ }
+ }
+
+ MainThread.BeginInvokeOnMainThread(() =>
+ {
+ chessGrid.Children.Clear();
+ chessGrid.Children.Add(grid);
+ });
+ }
+
+ private Color ConvertColor(CellColor color)
+ {
+ switch (color)
+ {
+ case CellColor.White:
+ return Colors.White;
+
+ case CellColor.Back:
+ return Colors.Black;
+ default:
+ throw new NotSupportedException(color.ToString("F"));
+ }
+ }
+
+ private bool CanGenerate()
+ {
+ string[] csArray = Cs.Split(',', StringSplitOptions.TrimEntries);
+ int csLength = csArray.Length;
+ string[] rsArray = Rs.Split(',', StringSplitOptions.TrimEntries);
+ int rsLength = rsArray.Length;
+ return string.IsNullOrWhiteSpace(Cs) == false
+ && string.IsNullOrWhiteSpace(Rs) == false
+ && rsLength == csLength
+ && csLength == ChessBoardize
+ && rsArray.All(p => int.TryParse(p, out int value))
+ && csArray.All(p => int.TryParse(p, out int value));
+ }
+ }
+}
+
| | | |