Files
raton4.0-source/Raton RAT/windows/plugintutorial.xaml
T
2026-08-27 11:23:13 -06:00

744 lines
69 KiB
XML

<Window x:Class="Raton.Windows.PluginTutorial"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Plugin Tutorial" Height="700" Width="980" Background="#131313"
WindowStartupLocation="CenterScreen" ResizeMode="CanResize">
<FrameworkElement.Resources>
<Style x:Key="ThinScrollThumb" TargetType="{x:Type Thumb}">
<Setter Property="Control.Background" Value="#333"/>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Border Background="{TemplateBinding Control.Background}" CornerRadius="3" Margin="2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type ScrollBar}">
<Setter Property="FrameworkElement.Width" Value="6"/>
<Setter Property="Control.Background" Value="Transparent"/>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ScrollBar}">
<Grid Background="Transparent">
<Track x:Name="PART_Track" IsDirectionReversed="true">
<Track.DecreaseRepeatButton>
<RepeatButton Opacity="0" Command="ScrollBar.LineUpCommand"/>
</Track.DecreaseRepeatButton>
<Track.Thumb>
<Thumb Style="{StaticResource ThinScrollThumb}"/>
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Opacity="0" Command="ScrollBar.LineDownCommand"/>
</Track.IncreaseRepeatButton>
</Track>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="SectionTitle" TargetType="{x:Type TextBlock}">
<Setter Property="TextBlock.FontFamily" Value="Consolas"/>
<Setter Property="TextBlock.FontSize" Value="13"/>
<Setter Property="TextBlock.FontWeight" Value="Bold"/>
<Setter Property="TextBlock.Foreground" Value="#E0E0E0"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="FrameworkElement.Margin" Value="0,22,0,8"/>
</Style>
<Style x:Key="Body" TargetType="{x:Type TextBlock}">
<Setter Property="TextBlock.FontFamily" Value="Segoe UI"/>
<Setter Property="TextBlock.FontSize" Value="12.5"/>
<Setter Property="TextBlock.Foreground" Value="#999"/>
<Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
<Setter Property="TextBlock.LineHeight" Value="20"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="FrameworkElement.Margin" Value="0,0,0,6"/>
</Style>
<Style x:Key="TipCard" TargetType="{x:Type Border}">
<Setter Property="Border.Background" Value="#1A1F2E"/>
<Setter Property="Border.CornerRadius" Value="6"/>
<Setter Property="Border.Padding" Value="14,10"/>
<Setter Property="FrameworkElement.Margin" Value="0,0,0,10"/>
</Style>
<Style x:Key="WarnCard" TargetType="{x:Type Border}">
<Setter Property="Border.Background" Value="#1F1A10"/>
<Setter Property="Border.BorderBrush" Value="#5A4010"/>
<Setter Property="Border.BorderThickness" Value="2,0,0,0"/>
<Setter Property="Border.CornerRadius" Value="4"/>
<Setter Property="Border.Padding" Value="14,10"/>
<Setter Property="FrameworkElement.Margin" Value="0,0,0,10"/>
</Style>
<Style x:Key="StepBadge" TargetType="{x:Type Border}">
<Setter Property="FrameworkElement.Width" Value="22"/>
<Setter Property="FrameworkElement.Height" Value="22"/>
<Setter Property="Border.CornerRadius" Value="11"/>
<Setter Property="Border.Background" Value="#252525"/>
<Setter Property="Border.BorderBrush" Value="#3A3A3A"/>
<Setter Property="Border.BorderThickness" Value="1"/>
<Setter Property="FrameworkElement.Margin" Value="0,0,10,0"/>
</Style>
<Style x:Key="SideTab" TargetType="{x:Type Border}">
<Setter Property="Border.Padding" Value="12,9"/>
<Setter Property="FrameworkElement.Cursor" Value="Hand"/>
<Setter Property="Border.Background" Value="Transparent"/>
<Setter Property="Border.CornerRadius" Value="5"/>
<Setter Property="FrameworkElement.Margin" Value="4,2"/>
<Style.Triggers>
<Trigger Property="UIElement.IsMouseOver" Value="true">
<Setter Property="Border.Background" Value="#1E1E1E"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="CL" TargetType="{x:Type TextBlock}">
<Setter Property="TextBlock.FontFamily" Value="Consolas"/>
<Setter Property="TextBlock.FontSize" Value="12"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="FrameworkElement.Margin" Value="0,1.5,0,1.5"/>
</Style>
<Style x:Key="CLBlank" TargetType="{x:Type Border}">
<Setter Property="FrameworkElement.Height" Value="10"/>
</Style>
<Style x:Key="CopyBtn" TargetType="{x:Type Border}">
<Setter Property="Border.Background" Value="#1E2A1E"/>
<Setter Property="Border.CornerRadius" Value="3"/>
<Setter Property="Border.Padding" Value="6,2"/>
<Setter Property="FrameworkElement.Margin" Value="10,0,0,0"/>
<Setter Property="FrameworkElement.Cursor" Value="Hand"/>
</Style>
</FrameworkElement.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="#0F0F0F" BorderBrush="#1F1F1F" BorderThickness="0,0,1,0">
<DockPanel>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Margin="0,8,0,0"
Foreground="#FF181818">
<StackPanel Margin="8,0">
<TextBlock Text="GETTING STARTED" FontFamily="Consolas" FontSize="9.5" Foreground="#383838" FontWeight="Bold"
Margin="12,8,0,4" TextAlignment="Left"/>
<Border MouseLeftButtonUp="Nav_Welcome" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#4CAF50"
VerticalAlignment="Center" Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Welcome" FontFamily="Consolas" FontSize="12" Foreground="#BBBBBB" VerticalAlignment="Center"
TextAlignment="Left"/>
</StackPanel>
</Border>
<Border MouseLeftButtonUp="Nav_Structure" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#64B5F6"
VerticalAlignment="Center" Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Structure" FontFamily="Consolas" FontSize="12" Foreground="#777" VerticalAlignment="Center"
TextAlignment="Left"/>
</StackPanel>
</Border>
<Border MouseLeftButtonUp="Nav_PluginInfo" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#CE93D8"
VerticalAlignment="Center" Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Plugin data" FontFamily="Consolas" FontSize="12" Foreground="#777" VerticalAlignment="Center"
TextAlignment="Left"/>
</StackPanel>
</Border>
<Border MouseLeftButtonUp="Nav_EntryPoint" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#FFB74D"
VerticalAlignment="Center" Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Entry Point" FontFamily="Consolas" FontSize="12" Foreground="#777" VerticalAlignment="Center"
TextAlignment="Left"/>
</StackPanel>
</Border>
<Border MouseLeftButtonUp="Nav_Pack" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#EF5350"
VerticalAlignment="Center" Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Pack &amp; Send" FontFamily="Consolas" FontSize="12" Foreground="#777"
VerticalAlignment="Center" TextAlignment="Left"/>
</StackPanel>
</Border>
<Border MouseLeftButtonUp="Nav_Args" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#80CBC4"
VerticalAlignment="Center" Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Arguments" FontFamily="Consolas" FontSize="12" Foreground="#777" VerticalAlignment="Center"
TextAlignment="Left"/>
</StackPanel>
</Border>
<TextBlock Text="REFERENCE" FontFamily="Consolas" FontSize="9.5" Foreground="#383838" FontWeight="Bold"
Margin="12,14,0,4" TextAlignment="Left"/>
<Border MouseLeftButtonUp="Nav_PackRef" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#555" VerticalAlignment="Center"
Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Pack Method" FontFamily="Consolas" FontSize="12" Foreground="#777" VerticalAlignment="Center"
TextAlignment="Left"/>
</StackPanel>
</Border>
<Border MouseLeftButtonUp="Nav_Example" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#555" VerticalAlignment="Center"
Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Full example" FontFamily="Consolas" FontSize="12" Foreground="#777"
VerticalAlignment="Center" TextAlignment="Left"/>
</StackPanel>
</Border>
<Border MouseLeftButtonUp="Nav_Tips" Style="{StaticResource SideTab}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12" Foreground="#555" VerticalAlignment="Center"
Margin="0,0,8,0" TextAlignment="Left"/>
<TextBlock Text="Tips &amp; tricks" FontFamily="Consolas" FontSize="12" Foreground="#777"
VerticalAlignment="Center" TextAlignment="Left"/>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</DockPanel>
</Border>
<ScrollViewer x:Name="MainScroll" Grid.Column="1" VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled" Background="#FF202020">
<StackPanel x:Name="ContentPanel" Margin="40,32,40,40">
<StackPanel x:Name="Sec_Welcome">
<Border Background="#161616" CornerRadius="8" Padding="24,20" Margin="0,0,0,24" BorderBrush="#252525"
BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="Plugin Development" FontFamily="Consolas" FontSize="22" FontWeight="Bold"
Foreground="#E0E0E0" TextAlignment="Left"/>
<TextBlock Text="Build powerful plugins for Raton in minutes." FontFamily="Segoe UI" FontSize="13"
Foreground="#666" Margin="0,6,0,0" TextAlignment="Left"/>
</StackPanel>
<Border Grid.Column="1" Background="#1A1A1A" CornerRadius="6" Padding="12,6" VerticalAlignment="Center">
<TextBlock Text="C# 7.3 on NET 4.7.2" FontFamily="Consolas" FontSize="11" Foreground="#4CAF50"
TextAlignment="Left"/>
</Border>
</Grid>
</Border>
<TextBlock Style="{StaticResource SectionTitle}" Text="Welcome"/>
<TextBlock Style="{StaticResource Body}"
Text="Welcome to the Raton Plugin Guide. This guide walks you through everything needed to create, test, and publish plugins that extend Raton's functionality. Plugins are compiled C# assemblies loaded at runtime, also, they can receive arguments from the UI and communicate back through a structured packet system :)"/>
<Border Background="#161616" CornerRadius="6" Padding="18,14" Margin="0,8,0,16" BorderBrush="#222"
BorderThickness="1">
<StackPanel>
<TextBlock Text="Quick start" FontFamily="Consolas" FontSize="11" Foreground="#555" Margin="0,0,0,12"
TextAlignment="Left"/>
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<Border Style="{StaticResource StepBadge}">
<TextBlock Text="1" FontFamily="Consolas" FontSize="11" Foreground="#777" HorizontalAlignment="Center"
VerticalAlignment="Center" TextAlignment="Center"/>
</Border>
<TextBlock Text="Create a new .NET Class Library project" FontFamily="Segoe UI" FontSize="12.5"
Foreground="#888" VerticalAlignment="Center" TextAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<Border Style="{StaticResource StepBadge}">
<TextBlock Text="2" FontFamily="Consolas" FontSize="11" Foreground="#777" HorizontalAlignment="Center"
VerticalAlignment="Center" TextAlignment="Center"/>
</Border>
<TextBlock Text="Use the test plugin source to guide yourself" FontFamily="Segoe UI" FontSize="12.5"
Foreground="#888" VerticalAlignment="Center" TextAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<Border Style="{StaticResource StepBadge}">
<TextBlock Text="3" FontFamily="Consolas" FontSize="11" Foreground="#777" HorizontalAlignment="Center"
VerticalAlignment="Center" TextAlignment="Center"/>
</Border>
<TextBlock Text="Decorate your class with [PluginInfo] and implement Main" FontFamily="Segoe UI"
FontSize="12.5" Foreground="#888" VerticalAlignment="Center" TextAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Border Style="{StaticResource StepBadge}">
<TextBlock Text="4" FontFamily="Consolas" FontSize="11" Foreground="#777" HorizontalAlignment="Center"
VerticalAlignment="Center" TextAlignment="Center"/>
</Border>
<TextBlock Text="Compile, drop the .dll into Raton's /plugins folder, done" FontFamily="Segoe UI"
FontSize="12.5" Foreground="#888" VerticalAlignment="Center" TextAlignment="Left"/>
</StackPanel>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_Structure">
<TextBlock Style="{StaticResource SectionTitle}" Text="01 — Project structure"/>
<TextBlock Style="{StaticResource Body}"
Text="Your plugin is a standard .NET Class Library project. Raton discovers it as a compiled DLL. Minimum layout:"/>
<Border Background="#0D0D0D" CornerRadius="6" Margin="0,4,0,14" BorderBrush="#222" BorderThickness="1">
<StackPanel>
<Border Background="#161616" CornerRadius="6,6,0,0" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A"/>
</StackPanel>
<TextBlock Grid.Column="1" Text="folder structure" FontFamily="Consolas" FontSize="10.5" Foreground="#444"
VerticalAlignment="Center" TextAlignment="Left"/>
</Grid>
</Border>
<StackPanel xml:space="preserve" Margin="18,14,18,14"><TextBlock Style="{StaticResource CL}"><Run Foreground="#9CDCFE">MyPlugin/</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#555">├── </Run><Run Foreground="#9CDCFE">MyPlugin.csproj</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#555">├── </Run><Run Foreground="#9CDCFE">Main.cs</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#555">└── Networking/</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#555"> └── </Run><Run Foreground="LimeGreen">Default classes</Run></TextBlock></StackPanel>
</StackPanel>
</Border>
<Border Style="{StaticResource TipCard}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#64B5F6" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<TextBlock TextWrapping="Wrap" FontFamily="Segoe UI" FontSize="12.5" Foreground="#7A9CC8" LineHeight="19"
TextAlignment="Left">
<Run FontWeight="SemiBold">Tip:</Run>
<Run>
Set output type to Class Library in your .csproj so the compiler emits a .dll instead of an .exe
</Run>
</TextBlock>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_PluginInfo">
<TextBlock Style="{StaticResource SectionTitle}" Text="02 — [PluginInfo] Attribute"/>
<TextBlock Style="{StaticResource Body}"
Text="Every plugin class must be decorated with [PluginInfo]. Raton reads this to register your plugin in the UI and display a description to the user."/>
<Border Background="#0D0D0D" CornerRadius="6" Margin="0,4,0,10" BorderBrush="#222" BorderThickness="1">
<StackPanel>
<Border Background="#161616" CornerRadius="6,6,0,0" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="PluginInfoAttribute.cs" FontFamily="Consolas" FontSize="10.5" Foreground="#444"
VerticalAlignment="Center" TextAlignment="Left"/>
<Border MouseLeftButtonUp="CopyCode_PluginInfoAttr" Style="{StaticResource CopyBtn}">
<TextBlock FontFamily="Segoe UI" FontSize="10" Foreground="#4CAF50" TextAlignment="Left" Text="Copy"/>
</Border>
</StackPanel>
</Grid>
</Border>
<StackPanel xml:space="preserve" Margin="18,14,18,14"><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">using </Run><Run Foreground="#D4D4D4">System;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">[</Run><Run Foreground="#DCDCAA">AttributeUsage</Run><Run Foreground="#D4D4D4">(AttributeTargets.</Run><Run Foreground="#9CDCFE">Class</Run><Run Foreground="#D4D4D4">)]</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">public class </Run><Run Foreground="#4EC9B0">PluginInfoAttribute </Run><Run Foreground="#D4D4D4">: </Run><Run Foreground="#4EC9B0">Attribute</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">{</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">public string </Run><Run Foreground="#9CDCFE">Description </Run><Run Foreground="#D4D4D4">{ </Run><Run Foreground="#569CD6">get</Run><Run Foreground="#D4D4D4">; }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">public string </Run><Run Foreground="#9CDCFE">Provider </Run><Run Foreground="#D4D4D4">{ </Run><Run Foreground="#569CD6">get</Run><Run Foreground="#D4D4D4">; }</Run></TextBlock><Border Style="{StaticResource CLBlank}"/><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">public </Run><Run Foreground="#DCDCAA">PluginInfoAttribute</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#569CD6">string </Run><Run Foreground="#9CDCFE">description</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#9CDCFE">Provider </Run><Run Foreground="#D4D4D4">= </Run><Run Foreground="#CE9178">"Raton"</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#9CDCFE">Description </Run><Run Foreground="#D4D4D4">= description;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">}</Run></TextBlock></StackPanel>
</StackPanel>
</Border>
<Border Style="{StaticResource WarnCard}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#FFB74D" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<TextBlock TextWrapping="Wrap" FontFamily="Segoe UI" FontSize="12.5" Foreground="#A08050" LineHeight="19"
TextAlignment="Left">
<Run FontWeight="SemiBold">Warning:</Run>
<Run>
Never change Provider = "Raton". Raton uses this field to verify the plugin origin.
</Run>
</TextBlock>
</StackPanel>
</Border>
<TextBlock Style="{StaticResource Body}" Text="Usage on your own class:" Margin="0,4,0,4"/>
<Border Background="#0D0D0D" CornerRadius="6" Margin="0,4,0,14" BorderBrush="#222" BorderThickness="1">
<StackPanel>
<Border Background="#161616" CornerRadius="6,6,0,0" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="Program.cs" FontFamily="Consolas" FontSize="10.5" Foreground="#444"
VerticalAlignment="Center" TextAlignment="Left"/>
<Border MouseLeftButtonUp="CopyCode_PluginInfoUsage" Style="{StaticResource CopyBtn}">
<TextBlock FontFamily="Segoe UI" FontSize="10" Foreground="#4CAF50" TextAlignment="Left" Text="Copy"/>
</Border>
</StackPanel>
</Grid>
</Border>
<StackPanel xml:space="preserve" Margin="18,14,18,14"><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">[</Run><Run Foreground="#4EC9B0">PluginInfo</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Example plugin for testing"</Run><Run Foreground="#D4D4D4">)]</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">class </Run><Run Foreground="#4EC9B0">Program</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">{</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#6A9955">// ...</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">}</Run></TextBlock></StackPanel>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_EntryPoint">
<TextBlock Style="{StaticResource SectionTitle}" Text="03 — Entry point: Main"/>
<TextBlock Style="{StaticResource Body}"
Text="Raton calls a static Main method on your class. The signature is different — Raton injects two parameters"/>
<Border Background="#161616" CornerRadius="6" Padding="16,12" Margin="0,4,0,14" BorderBrush="#222"
BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="1"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Action&lt;byte[]&gt; send" FontFamily="Consolas" FontSize="12"
Foreground="#CE9178" VerticalAlignment="Center" TextAlignment="Left" Margin="0,4"/>
<TextBlock Grid.Row="0" Grid.Column="1" TextWrapping="Wrap"
Text="Delegate to send a serialized Pack back to the client. Store it in a static field."
FontFamily="Segoe UI" FontSize="12" Foreground="#777" VerticalAlignment="Center"
TextAlignment="Left" Margin="12,4"/>
<Border Grid.Row="1" Grid.ColumnSpan="2" Background="#222" Height="1" Margin="0,4"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="string[] args" FontFamily="Consolas" FontSize="12"
Foreground="#9CDCFE" VerticalAlignment="Center" TextAlignment="Left" Margin="0,4"/>
<TextBlock Grid.Row="2" Grid.Column="1" TextWrapping="Wrap"
Text="Arguments the user typed in the plugin prompt. May be null if invoked with no arguments."
FontFamily="Segoe UI" FontSize="12" Foreground="#777" VerticalAlignment="Center"
TextAlignment="Left" Margin="12,4"/>
</Grid>
</Border>
<Border Background="#0D0D0D" CornerRadius="6" Margin="0,4,0,14" BorderBrush="#222" BorderThickness="1">
<StackPanel>
<Border Background="#161616" CornerRadius="6,6,0,0" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="Program.cs — Main" FontFamily="Consolas" FontSize="10.5" Foreground="#444"
VerticalAlignment="Center" TextAlignment="Left"/>
<Border MouseLeftButtonUp="CopyCode_Main" Style="{StaticResource CopyBtn}">
<TextBlock FontFamily="Segoe UI" FontSize="10" Foreground="#4CAF50" TextAlignment="Left" Text="Copy"/>
</Border>
</StackPanel>
</Grid>
</Border>
<StackPanel xml:space="preserve" Margin="18,14,18,14"><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">public static </Run><Run Foreground="#4EC9B0">Action</Run><Run Foreground="#D4D4D4">&lt;</Run><Run Foreground="#569CD6">byte</Run><Run Foreground="#D4D4D4">[]&gt; </Run><Run Foreground="#9CDCFE">_send</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><Border Style="{StaticResource CLBlank}"/><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">static void </Run><Run Foreground="#DCDCAA">Main</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#4EC9B0">Action</Run><Run Foreground="#D4D4D4">&lt;</Run><Run Foreground="#569CD6">byte</Run><Run Foreground="#D4D4D4">[]&gt; </Run><Run Foreground="#9CDCFE">send</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#569CD6">string</Run><Run Foreground="#D4D4D4">[] </Run><Run Foreground="#9CDCFE">args</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">{</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#9CDCFE">_send </Run><Run Foreground="#D4D4D4">= send;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(args == </Run><Run Foreground="#569CD6">null </Run><Run Foreground="#D4D4D4">|| args.Length == </Run><Run Foreground="#B5CEA8">0</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ExecuteArg</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"default"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">""</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">return</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ParseArgs</Run><Run Foreground="#D4D4D4">(args);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">}</Run></TextBlock></StackPanel>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_Pack">
<TextBlock Style="{StaticResource SectionTitle}" Text="04 — Pack &amp; Send"/>
<TextBlock Style="{StaticResource Body}"
Text="Communication back to the client is done through the Pack class (from Stuff.dll). Fill key-value pairs, serialize with .Pacc(), and pass the resulting byte[] to _send."/>
<Border Background="#0D0D0D" CornerRadius="6" Margin="0,4,0,10" BorderBrush="#222" BorderThickness="1">
<StackPanel>
<Border Background="#161616" CornerRadius="6,6,0,0" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="Sending a message" FontFamily="Consolas" FontSize="10.5" Foreground="#444"
VerticalAlignment="Center" TextAlignment="Left"/>
<Border MouseLeftButtonUp="CopyCode_Pack" Style="{StaticResource CopyBtn}">
<TextBlock FontFamily="Segoe UI" FontSize="10" Foreground="#4CAF50" TextAlignment="Left" Text="Copy"/>
</Border>
</StackPanel>
</Grid>
</Border>
<StackPanel xml:space="preserve" Margin="18,14,18,14"><TextBlock Style="{StaticResource CL}"><Run Foreground="#4EC9B0">Pack </Run><Run Foreground="#D4D4D4">pack = </Run><Run Foreground="#C586C0">new </Run><Run Foreground="#4EC9B0">Pack</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">pack.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Packet"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"UserMessage"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">pack.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Message"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"Hello from my plugin!"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">pack.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Status"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"Success"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#9CDCFE">_send</Run><Run Foreground="#D4D4D4">(pack.</Run><Run Foreground="#DCDCAA">Pacc</Run><Run Foreground="#D4D4D4">());</Run></TextBlock></StackPanel>
</StackPanel>
</Border>
<TextBlock Style="{StaticResource Body}" Text="Available Status values:" Margin="0,4,0,6"/>
<Border Background="#161616" CornerRadius="6" Margin="0,0,0,14" BorderBrush="#222" BorderThickness="1"
ClipToBounds="true">
<StackPanel>
<Border Background="#1A1A1A" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="Value" FontFamily="Consolas" FontSize="11" Foreground="#555" TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Logs information" FontFamily="Consolas" FontSize="11" Foreground="#555"
TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1F1F1F" Height="1"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="&quot;Information&quot;" FontFamily="Consolas" FontSize="12" Foreground="LightSkyBlue"
TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Sky blue log entry — Send information or current status"
FontFamily="Segoe UI" FontSize="12" Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1F1F1F" Height="1"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="&quot;Success&quot;" FontFamily="Consolas" FontSize="12" Foreground="#4CAF50"
TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Green log entry — operation completed successfully" FontFamily="Segoe UI"
FontSize="12" Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1A1A1A" Height="1" Margin="14,0"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="&quot;Warning&quot;" FontFamily="Consolas" FontSize="12" Foreground="#FFB74D"
TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Yellow log entry — non-critical notice" FontFamily="Segoe UI" FontSize="12"
Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1A1A1A" Height="1" Margin="14,0"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="&quot;Error&quot;" FontFamily="Consolas" FontSize="12" Foreground="#EF5350"
TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Red log entry — something went wrong" FontFamily="Segoe UI" FontSize="12"
Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_Args">
<TextBlock Style="{StaticResource SectionTitle}" Text="05 — Parsing arguments"/>
<TextBlock Style="{StaticResource Body}"
Text="Arguments follow a -flag value convention. Iterate the args array, detect tokens starting with '-' as flag names, and accumulate subsequent tokens as the value. Use a StringBuilder for multi-word values."/>
<Border Background="#0D0D0D" CornerRadius="6" Margin="0,4,0,10" BorderBrush="#222" BorderThickness="1">
<StackPanel>
<Border Background="#161616" CornerRadius="6,6,0,0" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#3A3A3A"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="ParseArgs helper" FontFamily="Consolas" FontSize="10.5" Foreground="#444"
VerticalAlignment="Center" TextAlignment="Left"/>
<Border MouseLeftButtonUp="CopyCode_ParseArgs" Style="{StaticResource CopyBtn}">
<TextBlock FontFamily="Segoe UI" FontSize="10" Foreground="#4CAF50" TextAlignment="Left" Text="Copy"/>
</Border>
</StackPanel>
</Grid>
</Border>
<StackPanel xml:space="preserve" Margin="18,14,18,14"><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">static void </Run><Run Foreground="#DCDCAA">ParseArgs</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#569CD6">string</Run><Run Foreground="#D4D4D4">[] </Run><Run Foreground="#9CDCFE">args</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">{</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">string </Run><Run Foreground="#9CDCFE">currentArg </Run><Run Foreground="#D4D4D4">= </Run><Run Foreground="#569CD6">null</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#4EC9B0">StringBuilder </Run><Run Foreground="#9CDCFE">valueBuilder </Run><Run Foreground="#D4D4D4">= </Run><Run Foreground="#C586C0">new </Run><Run Foreground="#4EC9B0">StringBuilder</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><Border Style="{StaticResource CLBlank}"/><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">for </Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#569CD6">int </Run><Run Foreground="#9CDCFE">i </Run><Run Foreground="#D4D4D4">= </Run><Run Foreground="#B5CEA8">0</Run><Run Foreground="#D4D4D4">; i &lt; args.Length; i++)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">string </Run><Run Foreground="#9CDCFE">arg </Run><Run Foreground="#D4D4D4">= args[i];</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(arg.</Run><Run Foreground="#DCDCAA">StartsWith</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"-"</Run><Run Foreground="#D4D4D4">))</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(currentArg != </Run><Run Foreground="#569CD6">null</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ExecuteArg</Run><Run Foreground="#D4D4D4">(currentArg, valueBuilder.</Run><Run Foreground="#DCDCAA">ToString</Run><Run Foreground="#D4D4D4">());</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> currentArg = arg.</Run><Run Foreground="#DCDCAA">ToLower</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> valueBuilder.</Run><Run Foreground="#DCDCAA">Clear</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">else</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(valueBuilder.Length &gt; </Run><Run Foreground="#B5CEA8">0</Run><Run Foreground="#D4D4D4">) valueBuilder.</Run><Run Foreground="#DCDCAA">Append</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">" "</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> valueBuilder.</Run><Run Foreground="#DCDCAA">Append</Run><Run Foreground="#D4D4D4">(arg);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(currentArg != </Run><Run Foreground="#569CD6">null</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ExecuteArg</Run><Run Foreground="#D4D4D4">(currentArg, valueBuilder.</Run><Run Foreground="#DCDCAA">ToString</Run><Run Foreground="#D4D4D4">());</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">}</Run></TextBlock></StackPanel>
</StackPanel>
</Border>
<Border Style="{StaticResource TipCard}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#64B5F6" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<TextBlock TextWrapping="Wrap" FontFamily="Segoe UI" FontSize="12.5" Foreground="#7A9CC8" LineHeight="19"
TextAlignment="Left">
<Run FontWeight="SemiBold">Tip:</Run>
<Run>
Always use the "default" case in your switch. When invoked with no args, use it to print a usage hint.
</Run>
</TextBlock>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_PackRef">
<TextBlock Style="{StaticResource SectionTitle}" Text="06 — Pack method"/>
<Border Background="#161616" CornerRadius="6" Margin="0,4,0,14" BorderBrush="#222" BorderThickness="1"
ClipToBounds="true">
<StackPanel>
<Border Background="#1A1A1A" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="Method" FontFamily="Consolas" FontSize="11" Foreground="#555" TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Description" FontFamily="Consolas" FontSize="11" Foreground="#555"
TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1F1F1F" Height="1"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="SetString(key, value)" FontFamily="Consolas" FontSize="11.5" Foreground="#9CDCFE"
TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Store a string value under key" FontFamily="Segoe UI" FontSize="12"
Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1A1A1A" Height="1" Margin="14,0"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="SetInt(key, value)" FontFamily="Consolas" FontSize="11.5" Foreground="#9CDCFE"
TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Store an integer value under key" FontFamily="Segoe UI" FontSize="12"
Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1A1A1A" Height="1" Margin="14,0"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="SetBytes(key, value)" FontFamily="Consolas" FontSize="11.5" Foreground="#9CDCFE"
TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Store a byte array under key (e.g. file data)" FontFamily="Segoe UI"
FontSize="12" Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
<Border Background="#1A1A1A" Height="1" Margin="14,0"/>
<Border Padding="14,9">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="Pacc()" FontFamily="Consolas" FontSize="11.5" Foreground="#DCDCAA" TextAlignment="Left"/>
<TextBlock Grid.Column="1" Text="Serialize the Pack to byte[] — pass result to _send()" FontFamily="Segoe UI"
FontSize="12" Foreground="#777" TextAlignment="Left"/>
</Grid>
</Border>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_Example">
<TextBlock Style="{StaticResource SectionTitle}" Text="07 — Full example"/>
<TextBlock Style="{StaticResource Body}"
Text="The complete example plugin. Responds to -msg &lt;text&gt; and prints a usage hint when called without arguments."/>
<Border Background="#0D0D0D" CornerRadius="6" Margin="0,4,0,14" BorderBrush="#2A3A2A" BorderThickness="1">
<StackPanel>
<Border Background="#141A14" CornerRadius="6,6,0,0" Padding="14,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="#1E3A1E" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#1E3A1E" Margin="0,0,5,0"/>
<Ellipse Width="10" Height="10" Fill="#1E3A1E"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="TestPlugin/Program.cs" FontFamily="Consolas" FontSize="10.5" Foreground="#3A6A3A"
VerticalAlignment="Center" TextAlignment="Left"/>
<Border MouseLeftButtonUp="CopyCode_Full" Style="{StaticResource CopyBtn}">
<TextBlock FontFamily="Segoe UI" FontSize="10" Foreground="#4CAF50" TextAlignment="Left" Text="Copy all"/>
</Border>
</StackPanel>
</Grid>
</Border>
<StackPanel xml:space="preserve" Margin="18,14,18,14"><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">using </Run><Run Foreground="#D4D4D4">Stuff;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">using </Run><Run Foreground="#D4D4D4">System;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">using </Run><Run Foreground="#D4D4D4">System.Text;</Run></TextBlock><Border Style="{StaticResource CLBlank}"/><TextBlock Style="{StaticResource CL}"><Run Foreground="#569CD6">namespace </Run><Run Foreground="#D4D4D4">TestPlugin</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">{</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> [</Run><Run Foreground="#4EC9B0">PluginInfo</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Example plugin for testing"</Run><Run Foreground="#D4D4D4">)]</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">class </Run><Run Foreground="#4EC9B0">Program</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">public static </Run><Run Foreground="#4EC9B0">Action</Run><Run Foreground="#D4D4D4">&lt;</Run><Run Foreground="#569CD6">byte</Run><Run Foreground="#D4D4D4">[]&gt; </Run><Run Foreground="#9CDCFE">_send</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><Border Style="{StaticResource CLBlank}"/><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">static void </Run><Run Foreground="#DCDCAA">Main</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#4EC9B0">Action</Run><Run Foreground="#D4D4D4">&lt;</Run><Run Foreground="#569CD6">byte</Run><Run Foreground="#D4D4D4">[]&gt; </Run><Run Foreground="#9CDCFE">send</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#569CD6">string</Run><Run Foreground="#D4D4D4">[] </Run><Run Foreground="#9CDCFE">args</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#9CDCFE">_send </Run><Run Foreground="#D4D4D4">= send;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(args == </Run><Run Foreground="#569CD6">null </Run><Run Foreground="#D4D4D4">|| args.Length == </Run><Run Foreground="#B5CEA8">0</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ExecuteArg</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"default"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">""</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">return</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ParseArgs</Run><Run Foreground="#D4D4D4">(args);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><Border Style="{StaticResource CLBlank}"/><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">static void </Run><Run Foreground="#DCDCAA">ParseArgs</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#569CD6">string</Run><Run Foreground="#D4D4D4">[] </Run><Run Foreground="#9CDCFE">args</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">string </Run><Run Foreground="#D4D4D4">currentArg = </Run><Run Foreground="#569CD6">null</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#4EC9B0">StringBuilder </Run><Run Foreground="#D4D4D4">valueBuilder = </Run><Run Foreground="#C586C0">new </Run><Run Foreground="#4EC9B0">StringBuilder</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">for </Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#569CD6">int </Run><Run Foreground="#D4D4D4">i = </Run><Run Foreground="#B5CEA8">0</Run><Run Foreground="#D4D4D4">; i &lt; args.Length; i++)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">string </Run><Run Foreground="#D4D4D4">arg = args[i];</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(arg.</Run><Run Foreground="#DCDCAA">StartsWith</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"-"</Run><Run Foreground="#D4D4D4">))</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(currentArg != </Run><Run Foreground="#569CD6">null</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ExecuteArg</Run><Run Foreground="#D4D4D4">(currentArg, valueBuilder.</Run><Run Foreground="#DCDCAA">ToString</Run><Run Foreground="#D4D4D4">());</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> currentArg = arg.</Run><Run Foreground="#DCDCAA">ToLower</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> valueBuilder.</Run><Run Foreground="#DCDCAA">Clear</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">else</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(valueBuilder.Length &gt; </Run><Run Foreground="#B5CEA8">0</Run><Run Foreground="#D4D4D4">) valueBuilder.</Run><Run Foreground="#DCDCAA">Append</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">" "</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> valueBuilder.</Run><Run Foreground="#DCDCAA">Append</Run><Run Foreground="#D4D4D4">(arg);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">if </Run><Run Foreground="#D4D4D4">(currentArg != </Run><Run Foreground="#569CD6">null</Run><Run Foreground="#D4D4D4">)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#DCDCAA">ExecuteArg</Run><Run Foreground="#D4D4D4">(currentArg, valueBuilder.</Run><Run Foreground="#DCDCAA">ToString</Run><Run Foreground="#D4D4D4">());</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><Border Style="{StaticResource CLBlank}"/><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#569CD6">static void </Run><Run Foreground="#DCDCAA">ExecuteArg</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#569CD6">string </Run><Run Foreground="#D4D4D4">arg, </Run><Run Foreground="#569CD6">string </Run><Run Foreground="#D4D4D4">value)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">switch </Run><Run Foreground="#D4D4D4">(arg)</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> {</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">case </Run><Run Foreground="#CE9178">"-msg"</Run><Run Foreground="#D4D4D4">:</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#4EC9B0">Pack </Run><Run Foreground="#D4D4D4">pack = </Run><Run Foreground="#C586C0">new </Run><Run Foreground="#4EC9B0">Pack</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> pack.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Packet"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"UserMessage"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> pack.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Message"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"Your message was: "</Run><Run Foreground="#D4D4D4"> + value);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> pack.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Status"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"Success"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#9CDCFE">_send</Run><Run Foreground="#D4D4D4">(pack.</Run><Run Foreground="#DCDCAA">Pacc</Run><Run Foreground="#D4D4D4">());</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">break</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">default</Run><Run Foreground="#D4D4D4">:</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#4EC9B0">Pack </Run><Run Foreground="#D4D4D4">pack2 = </Run><Run Foreground="#C586C0">new </Run><Run Foreground="#4EC9B0">Pack</Run><Run Foreground="#D4D4D4">();</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> pack2.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Packet"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"UserMessage"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> pack2.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Message"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"Try: -msg &lt;text&gt;"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> pack2.</Run><Run Foreground="#DCDCAA">SetString</Run><Run Foreground="#D4D4D4">(</Run><Run Foreground="#CE9178">"Status"</Run><Run Foreground="#D4D4D4">, </Run><Run Foreground="#CE9178">"Warning"</Run><Run Foreground="#D4D4D4">);</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#9CDCFE">_send</Run><Run Foreground="#D4D4D4">(pack2.</Run><Run Foreground="#DCDCAA">Pacc</Run><Run Foreground="#D4D4D4">());</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> </Run><Run Foreground="#C586C0">break</Run><Run Foreground="#D4D4D4">;</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4"> }</Run></TextBlock><TextBlock Style="{StaticResource CL}"><Run Foreground="#D4D4D4">}</Run></TextBlock></StackPanel>
</StackPanel>
</Border>
</StackPanel>
<StackPanel x:Name="Sec_Tips">
<TextBlock Style="{StaticResource SectionTitle}" Text="08 — Tips &amp; tricks"/>
<Border Style="{StaticResource TipCard}" Margin="0,0,0,8">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#FFD54F" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<StackPanel>
<TextBlock Text="Always guard args for null" FontFamily="Segoe UI" FontSize="12.5" FontWeight="SemiBold"
Foreground="#CCC" TextAlignment="Left"/>
<TextBlock Text="Raton may call your plugin with a null array when no input is given. Check args == null before everything"
FontFamily="Segoe UI" FontSize="12" Foreground="#7A9CC8" TextWrapping="Wrap" Margin="0,3,0,0"
TextAlignment="Left"/>
</StackPanel>
</StackPanel>
</Border>
<Border Style="{StaticResource TipCard}" Margin="0,0,0,8">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#FFD54F" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<StackPanel>
<TextBlock Text="Store _send as static" FontFamily="Segoe UI" FontSize="12.5" FontWeight="SemiBold"
Foreground="#CCC" TextAlignment="Left"/>
<TextBlock Text="The delegate is injected once in Main. Store it as a static field so all your methods can call it without passing it around"
FontFamily="Segoe UI" FontSize="12" Foreground="#7A9CC8" TextWrapping="Wrap" Margin="0,3,0,0"
TextAlignment="Left"/>
</StackPanel>
</StackPanel>
</Border>
<Border Style="{StaticResource TipCard}" Margin="0,0,0,8">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#FFD54F" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<StackPanel>
<TextBlock Text="Use Status semantically" FontFamily="Segoe UI" FontSize="12.5" FontWeight="SemiBold"
Foreground="#CCC" TextAlignment="Left"/>
<TextBlock Text="Success, Warning, and Error map to colored log entries. Don't mark everything as Success"
FontFamily="Segoe UI" FontSize="12" Foreground="#7A9CC8" TextWrapping="Wrap" Margin="0,3,0,0"
TextAlignment="Left"/>
</StackPanel>
</StackPanel>
</Border>
<Border Style="{StaticResource TipCard}" Margin="0,0,0,8">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#FFD54F" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<StackPanel>
<TextBlock Text="Keep plugins focused" FontFamily="Segoe UI" FontSize="12.5" FontWeight="SemiBold"
Foreground="#CCC" TextAlignment="Left"/>
<TextBlock Text="One plugin = one purpose. Small, composable plugins are easier to debug and update. Or whatever"
FontFamily="Segoe UI" FontSize="12" Foreground="#7A9CC8" TextWrapping="Wrap" Margin="0,3,0,0"
TextAlignment="Left"/>
</StackPanel>
</StackPanel>
</Border>
<Border Style="{StaticResource TipCard}" Margin="0,0,0,8">
<StackPanel Orientation="Horizontal">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13" Foreground="#FFD54F" VerticalAlignment="Top"
Margin="0,1,10,0" TextAlignment="Left"/>
<StackPanel>
<TextBlock Text="Keep it safe" FontFamily="Segoe UI" FontSize="12.5" FontWeight="SemiBold" Foreground="#CCC"
TextAlignment="Left"/>
<TextBlock Text="Be carefully when executing code from other people, this may cause RCE attempts or client stealing"
FontFamily="Segoe UI" FontSize="12" Foreground="#7A9CC8" TextWrapping="Wrap" Margin="0,3,0,0"
TextAlignment="Left"/>
</StackPanel>
</StackPanel>
</Border>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>
</Window>