diff --git a/README.md b/README.md
index 62ef52a..ccc2b72 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1 @@
-internetpack
-============
-
-Internet Pack
\ No newline at end of file
+RemObjects Internet Pack
diff --git a/Samples/C#/FTP Sync/App.ico b/Samples/C#/FTP Sync/App.ico
new file mode 100644
index 0000000..4680a4e
Binary files /dev/null and b/Samples/C#/FTP Sync/App.ico differ
diff --git a/Samples/C#/FTP Sync/AssemblyInfo.cs b/Samples/C#/FTP Sync/AssemblyInfo.cs
new file mode 100644
index 0000000..4fb1f66
--- /dev/null
+++ b/Samples/C#/FTP Sync/AssemblyInfo.cs
@@ -0,0 +1,26 @@
+/*---------------------------------------------------------------------------
+ RemObjects Internet Pack for .NET - Samples
+
+ (c)opyright RemObjects Software, Inc. 2003-2004. All rights reserved.
+
+ Using this code requires a valid license of the RemObjects Internet Pack
+ which can be obtained at http://www.remobjects.com?ip.
+---------------------------------------------------------------------------*/
+
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly: AssemblyTitle("RemObjects Internet Pack for .NET - HttpFResponses Sample")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("RemObjects Software")]
+[assembly: AssemblyProduct("RemObjects Internet Pack for .NET")]
+[assembly: AssemblyCopyright("Copyright RemObjects Software 2003-2004. All Rights Reserved.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: AssemblyVersion("1.0.15.541")]
+[assembly: CLSCompliant(true)]
+#if REMOBJECTS_SIGN_ASSEMBLY
+[assembly: AssemblyKeyName("RemObjectsSoftware")]
+#endif
diff --git a/Samples/C#/FTP Sync/FtpSync.2008.csproj b/Samples/C#/FTP Sync/FtpSync.2008.csproj
new file mode 100644
index 0000000..8dde44c
--- /dev/null
+++ b/Samples/C#/FTP Sync/FtpSync.2008.csproj
@@ -0,0 +1,108 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {F95BF882-461F-4072-90C4-979893E0CD59}
+ Debug
+ AnyCPU
+ App.ico
+
+
+ FtpSync
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Exe
+ FtpSync
+ OnBuildSuccess
+
+
+
+
+
+
+ 2.0
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ ..\..\Bin\
+ false
+ 285212672
+ false
+
+
+ TRACE;REMOBJECTS_SIGN_ASSEMBLY
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.XML
+
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/C#/FTP Sync/FtpSync.2008.sln b/Samples/C#/FTP Sync/FtpSync.2008.sln
new file mode 100644
index 0000000..8b99682
--- /dev/null
+++ b/Samples/C#/FTP Sync/FtpSync.2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FtpSync", "FtpSync.2008.csproj", "{F95BF882-461F-4072-90C4-979893E0CD59}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/C#/FTP Sync/FtpSync.2010.csproj b/Samples/C#/FTP Sync/FtpSync.2010.csproj
new file mode 100644
index 0000000..57494f8
--- /dev/null
+++ b/Samples/C#/FTP Sync/FtpSync.2010.csproj
@@ -0,0 +1,111 @@
+
+
+ Local
+ 10.0.20506
+ 2.0
+ {F95BF882-461F-4072-90C4-979893E0CD59}
+ Debug
+ AnyCPU
+ App.ico
+
+
+ FtpSync
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Exe
+ FtpSync
+ OnBuildSuccess
+
+
+
+
+
+
+ 3.5
+ v2.0
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+ AllRules.ruleset
+
+
+ ..\..\Bin\
+ false
+ 285212672
+ false
+
+
+ TRACE;REMOBJECTS_SIGN_ASSEMBLY
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+ AllRules.ruleset
+
+
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.XML
+
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/C#/FTP Sync/FtpSync.2010.sln b/Samples/C#/FTP Sync/FtpSync.2010.sln
new file mode 100644
index 0000000..fa95bcd
--- /dev/null
+++ b/Samples/C#/FTP Sync/FtpSync.2010.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FtpSync", "FtpSync.2010.csproj", "{F95BF882-461F-4072-90C4-979893E0CD59}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F95BF882-461F-4072-90C4-979893E0CD59}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/C#/FTP Sync/FtpSync.Sample.html b/Samples/C#/FTP Sync/FtpSync.Sample.html
new file mode 100644
index 0000000..c7fe236
--- /dev/null
+++ b/Samples/C#/FTP Sync/FtpSync.Sample.html
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+ FtpSync Sample
+
+
+
+
Purpose
+
+ This sample shows how to use the FtpClient class to gain access to an ftp
+ site and download files from there.
+The
+FtpSync application compares files on the local computer against those on the ftp folder and downloads files that are new or have changed.
+
+FtpSync is a console application with following uasge:
+This example demonstrates how HTTP works.
+With help of the HttpClient components, we can send a HttpClientRequest and retrieve back a HttpClientResponse. The application shows us the request and response header parameters and the context of the response in text and hex view.
+ Also, you have the ability to add your custom request header parameter.
+
+
+
Examine the Code
+
+
+See the btnSubmit_Click handler. This is the main function where we create and configure the HttpClientRequest and send it to the server with the help of the
+ HttpClient component.
+In order to get response from the server we call the Dispatch function with our HttpClientRequest instance as a parameter.
+
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run the application.
+
Using an existing URL, click on the "Submit" button. See the response of the request on the Result page.
+This example shows how easy it is to create a simple custom Http server. The
+
+SimpleHttpServer class is a file-based HTTP Server that will make all files in (and below) the specified RootPath folder available via HTTP.
+
+
+
Examine the Code
+
+
look at the ActivateServers procedure to see how to create and configure the HTTP server. The
+RootPath property should reference the folder in our file system which we want to expose.
+
+
+See the OnHttpRequest handler. There we can catch and process any incoming requests that come to the server.
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run application.
+
Configure server properties and activate the servers.
+
Click link on the main window to open home page of our server in web browser.
+This example shows how easy it is to create a simple custom Http server. The
+
+SimpleHttpServer class is a file-based HTTP Server that will make all files in (and below) the specified RootPath folder available via HTTP.
+
+
+
Examine the Code
+
+
look at the ActivateServers procedure to see how to create and configure the HTTP server. The
+RootPath property should reference the folder in our file system which we want to expose.
+
+
+See the OnHttpRequest handler. There we can catch and process any incoming requests that come to the server.
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run application.
+
Configure server properties and activate the servers.
+
Click link on the main window to open home page of our server in web browser.
+This sample shows how to create and configure virtual FTP. This supports building
+ a virtual folder structure, similar to IIS, based on real and non-existing folders.
+
+Note:
+
+To connect to Virtual FTP, please use port 4444. (ftp://localhost:4444/)
+ UserName=test
+ Password=test
+
+
+
Examine the Code
+
+
Look at the StartServer function. There you can find how you can configure your ftp.
+You can add a VirtualFolder or a DiskFolder.
+
+
Also there you can see how to add the users allowed to use this ftp.
+
+
+
Getting started
+
+
Build the application.
+
Run the application and start the virtual FTP
+
With the help of the link on the form, open virtual FTP in your WebBrowser
+
Test virtual ftp.
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/C#/Virtual FTP/cVirtualFTP.csproj b/Samples/C#/Virtual FTP/cVirtualFTP.csproj
new file mode 100644
index 0000000..729fc70
--- /dev/null
+++ b/Samples/C#/Virtual FTP/cVirtualFTP.csproj
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Samples/Delphi for .NET/Sample Server/Main.TWinForm2.resources b/Samples/Delphi for .NET/Sample Server/Main.TWinForm2.resources
new file mode 100644
index 0000000..793206f
Binary files /dev/null and b/Samples/Delphi for .NET/Sample Server/Main.TWinForm2.resources differ
diff --git a/Samples/Delphi for .NET/Sample Server/Main.pas b/Samples/Delphi for .NET/Sample Server/Main.pas
new file mode 100644
index 0000000..2d0518d
--- /dev/null
+++ b/Samples/Delphi for .NET/Sample Server/Main.pas
@@ -0,0 +1,187 @@
+unit Main;
+
+interface
+
+uses
+ System.Drawing, System.Collections, System.ComponentModel,
+ System.Windows.Forms, System.Data, System.Resources,
+ System.IO, System.Diagnostics,
+ RemObjects.InternetPack.StandardServers,
+ RemObjects.InternetPack.Http;
+
+type
+ TWinForm2 = class(System.Windows.Forms.Form)
+ {$REGION 'Designer Managed Code'}
+ strict private
+ ///
+ /// Required designer variable.
+ ///
+ Components: System.ComponentModel.Container;
+ pictureBox1: System.Windows.Forms.PictureBox;
+ btn_Deactivate: System.Windows.Forms.Button;
+ btn_Activate: System.Windows.Forms.Button;
+ lbl_Link: System.Windows.Forms.LinkLabel;
+ SimpleHttpServer1: RemObjects.InternetPack.Http.SimpleHttpServer;
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ procedure InitializeComponent;
+ procedure btn_Activate_Click(sender: System.Object; e: System.EventArgs);
+ procedure btn_Deactivate_Click(sender: System.Object; e: System.EventArgs);
+ procedure TWinForm2_Closed(sender: System.Object; e: System.EventArgs);
+ procedure LinkLabel1_LinkClicked(sender: System.Object; e: System.Windows.Forms.LinkLabelLinkClickedEventArgs);
+ {$ENDREGION}
+ strict protected
+ ///
+ /// Clean up any resources being used.
+ ///
+ procedure Dispose(Disposing: Boolean); override;
+ private
+ fEchoServer:EchoServer;
+ fHttpServer:SimpleHttpServer;
+ public
+ constructor Create;
+ end;
+
+ [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm2))]
+
+implementation
+
+{$REGION 'Windows Form Designer generated code'}
+///
+/// Required method for Designer support -- do not modify
+/// the contents of this method with the code editor.
+///
+procedure TWinForm2.InitializeComponent;
+var
+ resources: System.Resources.ResourceManager;
+begin
+ resources := System.Resources.ResourceManager.Create(TypeOf(TWinForm2));
+ Self.pictureBox1 := System.Windows.Forms.PictureBox.Create;
+ Self.btn_Deactivate := System.Windows.Forms.Button.Create;
+ Self.btn_Activate := System.Windows.Forms.Button.Create;
+ Self.lbl_Link := System.Windows.Forms.LinkLabel.Create;
+ Self.SimpleHttpServer1 := RemObjects.InternetPack.Http.SimpleHttpServer.Create;
+ Self.SuspendLayout;
+ //
+ // pictureBox1
+ //
+ Self.pictureBox1.Anchor := (System.Windows.Forms.AnchorStyles((System.Windows.Forms.AnchorStyles.Bottom
+ or System.Windows.Forms.AnchorStyles.Left)));
+ Self.pictureBox1.Image := (System.Drawing.Image(resources.GetObject('pictureBox1.Image')));
+ Self.pictureBox1.Location := System.Drawing.Point.Create(8, 63);
+ Self.pictureBox1.Name := 'pictureBox1';
+ Self.pictureBox1.Size := System.Drawing.Size.Create(120, 30);
+ Self.pictureBox1.TabIndex := 6;
+ Self.pictureBox1.TabStop := False;
+ //
+ // btn_Deactivate
+ //
+ Self.btn_Deactivate.Enabled := False;
+ Self.btn_Deactivate.Location := System.Drawing.Point.Create(128, 8);
+ Self.btn_Deactivate.Name := 'btn_Deactivate';
+ Self.btn_Deactivate.Size := System.Drawing.Size.Create(112, 23);
+ Self.btn_Deactivate.TabIndex := 5;
+ Self.btn_Deactivate.Text := 'Deactivate Servers';
+ Include(Self.btn_Deactivate.Click, Self.btn_Deactivate_Click);
+ //
+ // btn_Activate
+ //
+ Self.btn_Activate.Location := System.Drawing.Point.Create(8, 8);
+ Self.btn_Activate.Name := 'btn_Activate';
+ Self.btn_Activate.Size := System.Drawing.Size.Create(112, 23);
+ Self.btn_Activate.TabIndex := 4;
+ Self.btn_Activate.Text := 'Activate Servers';
+ Include(Self.btn_Activate.Click, Self.btn_Activate_Click);
+ //
+ // lbl_Link
+ //
+ Self.lbl_Link.Location := System.Drawing.Point.Create(8, 40);
+ Self.lbl_Link.Name := 'lbl_Link';
+ Self.lbl_Link.Size := System.Drawing.Size.Create(160, 16);
+ Self.lbl_Link.TabIndex := 7;
+ Self.lbl_Link.TabStop := True;
+ Self.lbl_Link.Text := 'http://localhost:81/index.html';
+ Include(Self.lbl_Link.LinkClicked, Self.LinkLabel1_LinkClicked);
+ //
+ // SimpleHttpServer1
+ //
+ Self.SimpleHttpServer1.Active := False;
+ Self.SimpleHttpServer1.ConnectionClass := nil;
+ Self.SimpleHttpServer1.RootPath := '';
+ Self.SimpleHttpServer1.ValidateRequests := False;
+ //
+ // TWinForm2
+ //
+ Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13);
+ Self.ClientSize := System.Drawing.Size.Create(304, 101);
+ Self.Controls.Add(Self.lbl_Link);
+ Self.Controls.Add(Self.pictureBox1);
+ Self.Controls.Add(Self.btn_Deactivate);
+ Self.Controls.Add(Self.btn_Activate);
+ Self.Icon := (System.Drawing.Icon(resources.GetObject('$this.Icon')));
+ Self.Name := 'TWinForm2';
+ Self.Text := 'Internet Pack Sample Server (Delphi)';
+ Include(Self.Load, Self.btn_Activate_Click);
+ Include(Self.Closed, Self.TWinForm2_Closed);
+ Self.ResumeLayout(False);
+end;
+{$ENDREGION}
+
+procedure TWinForm2.Dispose(Disposing: Boolean);
+begin
+ if Disposing then
+ begin
+ if Components <> nil then
+ Components.Dispose();
+ end;
+ inherited Dispose(Disposing);
+end;
+
+constructor TWinForm2.Create;
+begin
+ inherited Create;
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent;
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+end;
+
+procedure TWinForm2.LinkLabel1_LinkClicked(sender: System.Object; e: System.Windows.Forms.LinkLabelLinkClickedEventArgs);
+begin
+ Process.Start(lbl_Link.Text);
+end;
+
+procedure TWinForm2.TWinForm2_Closed(sender: System.Object; e: System.EventArgs);
+begin
+ btn_Deactivate_Click(self, e);
+end;
+
+procedure TWinForm2.btn_Activate_Click(sender: System.Object; e: System.EventArgs);
+begin
+ fEchoServer := EchoServer.Create();
+ fEchoServer.Open();
+
+ fHttpServer := SimpleHttpServer.Create();
+ fHttpServer.Port := 81; // avoid conflict if IIS is installed, too
+ fHttpServer.RootPath := Path.GetDirectoryName(GetType().Assembly.Location)+'\HttpRoot';
+ fHttpServer.ServerName := 'Internet Pack HTTP Server';
+ fHttpServer.Open();
+
+ btn_Activate.Enabled := false;
+ btn_Deactivate.Enabled := true;
+end;
+
+procedure TWinForm2.btn_Deactivate_Click(sender: System.Object; e: System.EventArgs);
+begin
+ if (fEchoServer <> nil) then fEchoServer.Close();
+ if (fHttpServer <> nil) then fHttpServer.Close();
+ btn_Activate.Enabled := true;
+ btn_Deactivate.Enabled := false;
+end;
+
+end.
diff --git a/Samples/Delphi for .NET/Sample Server/Main.resx b/Samples/Delphi for .NET/Sample Server/Main.resx
new file mode 100644
index 0000000..c8f401f
--- /dev/null
+++ b/Samples/Delphi for .NET/Sample Server/Main.resx
@@ -0,0 +1,615 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ False
+
+
+ Private
+
+
+
+ Qk1GEgAAAAAAADYEAAAoAAAAeAAAAB4AAAABAAgAAAAAAAAAAADCHgAAwh4AAAABAAAAAQAAAAAA/wEB
+ Af8CAgL/AwMD/wQEBP8FBQX/BgYG/wcHB/8ICAj/CQkJ/woKCv8LCwv/DAwM/w0NDf8ODg7/Dw8P/xAQ
+ EP8RERH/EhIS/xMTE/8UFBT/FRUV/xYWFv8XFxf/GBgY/xkZGf8aGhr/Gxsb/xwcHP8dHR3/Hh4e/x8f
+ H/8gICD/ISEh/yIiIv8jIyP/JCQk/yUlJf8mJib/Jycn/ygoKP8pKSn/Kioq/ysrK/8sLCz/LS0t/y4u
+ Lv8vLy//MDAw/zExMf8yMjL/MzMz/zQ0NP81NTX/NjY2/zc3N/84ODj/OTk5/zo6Ov87Ozv/PDw8/z09
+ Pf8+Pj7/Pz8//0BAQP9BQUH/QkJC/0NDQ/9ERET/RUVF/0ZGRv9HR0f/SEhI/0lJSf9KSkr/S0tL/0xM
+ TP9NTU3/Tk5O/09PT/9QUFD/UVFR/1JSUv9TU1P/VFRU/1VVVf9WVlb/V1dX/1hYWP9ZWVn/Wlpa/1tb
+ W/9cXFz/XV1d/15eXv9fX1//YGBg/2FhYf9iYmL/Y2Nj/2RkZP9lZWX/ZmZm/2dnZ/9oaGj/aWlp/2pq
+ av9ra2v/bGxs/21tbf9ubm7/b29v/3BwcP9xcXH/cnJy/3Nzc/90dHT/dXV1/3Z2dv93d3f/eHh4/3l5
+ ef96enr/e3t7/3x8fP99fX3/fn5+/39/f/+AgID/gYGB/4KCgv+Dg4P/hISE/4WFhf+Ghob/h4eH/4iI
+ iP+JiYn/ioqK/4uLi/+MjIz/jY2N/46Ojv+Pj4//kJCQ/5GRkf+SkpL/k5OT/5SUlP+VlZX/lpaW/5eX
+ l/+YmJj/mZmZ/5qamv+bm5v/nJyc/52dnf+enp7/n5+f/6CgoP+hoaH/oqKi/6Ojo/+kpKT/paWl/6am
+ pv+np6f/qKio/6mpqf+qqqr/q6ur/6ysrP+tra3/rq6u/6+vr/+wsLD/sbGx/7Kysv+zs7P/tLS0/7W1
+ tf+2trb/t7e3/7i4uP+5ubn/urq6/7u7u/+8vLz/vb29/76+vv+/v7//wMDA/8HBwf/CwsL/w8PD/8TE
+ xP/FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83Nzf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT
+ 0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li
+ 4v/j4+P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t/+7u7v/v7+//8PDw//Hx
+ 8f/y8vL/8/Pz//T09P/19fX/9vb2//f39//4+Pj/+fn5//r6+v/7+/v//Pz8//39/f/+/v7//////wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu
+ LCspKCYkKDI5Pz07OTg2LCIWDw4MCwkIBhOr9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AAAw
+ LiwrKTlJU1FPTUpIRkRCQT88MB4ODAsJCAYEfff39/f39/f399Du9+Xb9/f32+X39/fO5vf3993L6vf3
+ 5dv39/fb5ff399Du9/f37cvb9/f398/b9/f39+7Q9/f39/f3983q99D39/f3zcv39+Xb9/f3zff3AAAx
+ MC4+VFhWVVNRT01KSEZEQkE/PDozHQwLCQgGBF/39/f39/f39yDC94tW9/f3Vov391QmcffiPihBOYb3
+ i1b39/dWi/f39yDC9/dfHkFETff3jx1E9/f398Ig9/f39/f2RDI5gyD397osMkE/94tW9/duN/f3AAAz
+ N1RfXVtYVlVTUU9NSkhGREJBPzw6OCwRCwkIBgRu9/f39/f39wC493g49/f3OHj3yQSw0fdKRLzGwNT3
+ eDj39/c4ePf39wC494csqsbFw/f3FX3F9/f397gA9/f39/ePJsTAegD36B9nwca/93g697MKmvf3AABA
+ YWNhX11bWFZVU1FPTUpIRkRCQT88OjgzFgsJCAYEnPf39/f39wC693w+9/f3Pnz3twD399kA4ff39/f3
+ fD739/c+fPf39wC69yGd9/f39/f3AL739/f397oA9/f39/ebDvf3vQD3owrj9/f393w29ydk8ff3AABp
+ ZmRjYV9dW1hWVVNRT01KSEZEQkE/PDo4NhsLCQgGE8r39/f39wC693xA9/f3QHz3ugD397cAR0BASVj3
+ fEH39/c+fvf39wC69wA1QUBCW833ALv39/f397oA3t739/flRT5mWwD3dzr39/f393wUTzjf9/f3AABr
+ aWZkY2FfXVtYVlVTUU9NSkhGREJBPzw6ODYWCwkIBkH39/f39wC693w49/f3OnT3ugD399IAeXp6WAD3
+ fC339/c+e/f39wCz9w1Xfnl+AMT3ALr39/f397oAW1tVi/f30YN8XwD3jSP39/f393woG2j39/f3AABv
+ a2lmZGNhX11bWFZVU1FPTUpIRkRCQT88OjgzEQsJCAad9/f39wC693wTxPfoCp/3ywD39/Qqm/f3gUb3
+ fBOp6fc+N+P3ugDY92pg9/fFEer3AMv39/f397oAjo5nK6H37Pf3dhv31Qmq9/f293xCsTSv9/f3AAB0
+ b2tpZmRjYV9dW1hWVVNRT01KSEZEQkE/PDo4LgwLCQgk9/f39wC693IxaIFYJ+XYWwB5mPezNndvM7P3
+ cj1JT/cvTXd5N03399hAank9ffd5AFt59/f397oA9/f3gBv3f4F8MYj394FBd3mF93w+93ghqff3AAB4
+ dG9raWZkY2FfXVtYVlVTUU9NSkhGREJBPzw6OB8MCwkInvf39wC696q1nExSt/fJLgBAbvf3pU1Cmff3
+ qrOiR/eC1oBAZdj39/fKXEB96fdAAC9A9/f397oA9/f3xAD3i0xAgej39/eWTUBx93w+9/dohff3AAB9
+ eHRva2lmZGNhX11bWFZVU1FPTUpIRkJAQT88OjUQDAsJJvf39wC59/f39/f39/f33Bn39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f3JNH39/f397gA6+vZZyz39/f39/f39/f39/f393w+9/f39/f3AACB
+ fXh0b2tpZmRjYV9dW1hWVVNRT01KSEYmNUE/PDohDgwLCcv39wi89/f39/f39/f38Zr39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f3tNb3m9n398ENjo5uH6b39/f39/f39/f39/f393g49/f39/f3AACF
+ gX14dG9raWZkY2FfXVtYVlVTUU9NSkg1GSU9Pzw1Dw4MC4H392XT9/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f3ui669+JzU1N0uff39/f39/f39/f39/f394tW9/f39/f3AACK
+ hYF9eHRva2lmZGNhX11bWFZVU1FPTUpIIBkaMz88GQ8ODEb39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f396pN9/f39/f39/f39/f39/f39/f39/f39+Xb9/f39/f3AACO
+ ioWBfXh0b2tpZmRjYV9dW1hWVVNRT01KNRsZFyA5JREPDgz39/f39/f39/f39/f3APf39w/o6F0+TYv3
+ fHz39z669/cA9/eqLj4ufPf3umxNLk3o97o+9+hdPk2L9+hdLj6q96oufLo+Pmz39/f39/f39/f3AACS
+ aYWFgX14dG9raWZkY2FfXVtYVlVTUU9NRx4bGRcYHxMRDw7M9/f39/f39/f39/f3APf3yS73XYv39/f3
+ fHz39z669/cA97ou2ffoXXz3ug/o94td97o+912L9/f3911s9/f39z6q9+j39y7J9/f39/f39/f3AABW
+ Yo6KhYFpSkhGREJAPz07OTg2NDMxMC4sKiAcGxkXFhQTEQ+99/f39/f39/f39/f3APf3fGz3D7q6urr3
+ fHz39z669/cA902b9/f32Q/3uj739/cP97o+9w+6urq69w/39/f39z669/fofA/o9/f39/f39/f3AABJ
+ h5KOioV1RTw7OURCQD89Ozk4NzUzMTAuLB8eHBsZFxYUExGS9/f39/f39/f39/f3AHxsLtn3H3x8fAD3
+ fHz39z669/cA9wD39/f39z66uj739/cP97o+9x98fHwA9x/o9/f39z669+guXdn39/f39/f39/f3AABg
+ m5eSjoqFgW1TOzxNYmZkY2FfXVtYVlVTRCEfHhwlPxcWFBOF9/f39/f39/f39/f3ALq6TZv3XYv3uj73
+ fD736B9897of9wD39/f39z66ugDZ94tN97o+912L97o+92xs9/f39z6698ku9/f39/f39/f39/f3AACD
+ oJuXko6KhYF9dFtAOEJTZGNhX11bWFZVNSMhITdIRhkXFhSF9/f39/f39/f39/f3APf36A/36F0uPsn3
+ fHxNH2ybPi669y669/f36A/ouj58Lk3Z97o+9+hdLj7J9+hsPj6qbA8ubPdsPk339/f39/f39/f3AACR
+ joqGg398d3RwbWllVD42N0hcYV9dW1hRJiQuSU1KSBsZFxaG9/f39/f39/f39/f3APf32Q/39/f39/f3
+ 9/f39/f39/f396pN9/f3i133uj739/f39/f39/f39/f39/f39/f39z669/f39/f39/f39/f39/f3AABP
+ TkxLSUdGRUNBQD48Ozk4NjQzY2FfXVtAKkBTUU9NRBwbGRe/9/f39/f39/f39/f3AHx8H4v39/f39/f3
+ 9/f39/f39/f39/d8H3w+Puj3uj739/f399kf9/f39/f39/f39/f399no9/f39/f39/f39/f39/f3AACZ
+ lZKOioeDf3x4dHFtamViXlxdZGNhX108UlZVU1FPQR4cGxnA9/f39/f39/f39/f32bq69/f39/f39/f3
+ 9/f39/f39/f39/f36LrZ9/f3yWz39/f39/fo9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AACQ
+ sa2opKCbl5KOioWBfXh0b2tpZmRjYVtdW1hWVVNRNx8eHBv39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AABt
+ tbGtqKSgm5eSjoqFgX14dG9raWZkY2FfXVtYVlVTMSEfHkX39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AABW
+ oLWxraikoJuXko6KhYF9eHRva2lmZGNhX11bWFZRJCMhH3D39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AACH
+ fbq1sa2opKCbl5KOioWBfXh0b2tpZmRjYV9dW1hCJiQjIbT39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AADH
+ qLe6tbGtqKSgm5eSjoqFgX14dG9raWZkY2FfXVsvKCYkMPf39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+
+
+ False
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ 17, 17
+
+
+ Private
+
+
+ False
+
+
+ (Default)
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ True
+
+
+ 80
+
+
+ True
+
+
+
+ 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
+ KwB7ezUASEhIAExMTABUVEwAX19XAFtbWwBeXl4Ae3tMAGppUgByclMAenpUAGNjYwBlZWUAaWlpAH5+
+ YgBxcXEAdXV1AH5+fgCDgwAAi4sAAJSUAACenggAi4sRAKmpGAC0tCoAuLg7AMC/OwCDg0AAi4pKAIGB
+ XACSkl8AhYVqAJubYACVlHUAo6JrAK6tcQCoqHwAy8pLAM7NXADW1VwA2dhsANvaewDh4W4A7ex/AIqK
+ igCSkpIAlZWVAJycnACioqIAqqqqAMXEhgDk44gA7u2MAPj3jwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9
+ DwYFAzEAAAAAAAAAAD8PEBwXDAoEAxEAAAAAADYRKEIlJCAfGwkCBQAAAF4UKURDQiUkIB8bFgMRAAAx
+ MEdFRENCJSQgHxsWAwBfMUlIR0VEQ0IlJCAaGgQTQTlVSkhHRURDQiUkGQ0IAz1OVjdKSC8rJyYjIhwO
+ CgU/PjQ4TEswLiwrQ0IeIBkGXE9TTVdVSkhHRURDQiUcBgA9Y1lYV1VKSEdFRENCED0APVFlW1pXVUpI
+ R0VEKA8AAAA9YmVbWldVSkhHRhM9AAAAYD1UZFtaV1VKMC02AAAAAAAAPT1PUlA6MzFBAAAAAAAAAABh
+ XDY2P14AAAAAAPgfAADgBwAAwAMAAIABAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAEAAMAB
+ AADAAwAA8AcAAPgfAAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAACAgIB8eHh5vHR0drxsbG98ZGRn/FxcX/xYWFv8UFBT/ExMT/xEREf8PDw//Dg4O/wwM
+ DN8LCwuvCgoKbwkJCR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAlJSVfIyMjvyEhIf8fHx//Hh4e/xwcHP8bGxv/GRkZ/xcXF/8WFhb/FBQU/xMT
+ E/8RERH/Dw8P/w4ODv8MDAz/CwsL/wkJCf8ICAi/BwcHXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAKSkpTygoKN8mJib/JCQk/yMjI/8hISH/Hx8f/x4eHv8cHBz/Gxsb/xkZ
+ Gf8XFxf/FhYW/xQUFP8TExP/ERER/w8PD/8ODg7/DAwM/wsLC/8JCQn/CAgI/wYGBt8FBQVPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLh8sLCy/Kysr/ykpKf8oKCj/JiYm/yQkJP8jIyP/ISEh/x8f
+ H/8eHh7/HBwc/xsbG/8ZGRn/FxcX/xYWFv8UFBT/ExMT/xEREf8PDw//Dg4O/wwMDP8LCwv/CQkJ/wgI
+ CP8GBgb/BAQEvwQEBB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExTzAwMO8uLi7/LCws/ysrK/8pKSn/KCgo/yYm
+ Jv8kJCT/LS0e/z8/FP9MTA3/WFgH/1VVB/9TUwb/UFAG/05OBf9LSwX/PDwI/ywsC/8aGg//Dw8P/w4O
+ Dv8MDAz/CwsL/wkJCf8ICAj/BgYG/wQEBO8DAwNPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1NTV/MzMz/zExMf8wMDD/Li4u/yws
+ LP8rKyv/KSkp/0hIGf9lZQn/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1pa
+ AP9XVwD/Q0ME/ygoCf8ODg7/DAwM/wsLC/8JCQn/CAgI/wYGBv8EBAT/AwMDfwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OJ82Njb/NDQ0/zMz
+ M/8xMTH/MDAw/y4uLv9OThv/d3cF/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2Vl
+ AP9iYgD/X18A/11dAP9aWgD/V1cA/1RUAP9JSQH/JiYI/wwMDP8LCwv/CQkJ/wgICP8GBgb/BAQE/wMD
+ A58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7jzk5
+ Of84ODj/NjY2/zQ0NP8zMzP/PT0r/3R0C/+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3Fx
+ AP9ubgD/a2sA/2hoAP9lZQD/YmIA/19fAP9dXQD/WloA/1dXAP9UVAD/UVEA/z4+A/8UFAv/CwsL/wkJ
+ Cf8ICAj/BgYG/wQEBP8DAwOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAA+Pj5fPDw8/zs7O/85OTn/ODg4/zY2Nv9MTCf/iooD/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8
+ AP96egD/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1paAP9XVwD/VFQA/1FR
+ AP9KSgD/HBwJ/wsLC/8JCQn/CAgI/wYGBv8EBAT/AwMDXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAEFBQS9AQEDvPj4+/zw8PP87Ozv/OTk5/1xcI/+WlgD/k5MA/5CQAP+OjgD/i4sA/4iI
+ AP+FhQD/goIA/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP9iYgD/X18A/11d
+ AP9aWgD/V1cA/1RUAP9RUQD/Tk4A/yQkB/8LCwv/CQkJ/wgICP8GBgb/BAQE7wQEBC8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQ79BQUH/QEBA/z4+Pv88PDz/VFQv/52dBv+ZmQH/lpYA/5OT
+ AP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2ho
+ AP9lZQD/YmIA/19fAP9dXQD/WloA/1dXAP9UVAD/UVEA/05OAP8cHAn/CwsL/wkJCf8ICAj/BgYG/wQE
+ BL8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZGX0VFRf9DQ0P/QUFB/0BAQP9LSzn/np4U/6Gh
+ DP+dnQb/mZkB/5aWAP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0
+ AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1paAP9XVwD/VFQA/1FRAP9KSgD/FBQL/wsL
+ C/8JCQn/CAgI/wYGBv8FBQVfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0dH30ZGRv9FRUX/Q0ND/0FB
+ Qf+YmCP/qakX/6WlEv+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/
+ AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP9iYgD/X18A/11dAP9aWgD/V1cA/1RU
+ AP9RUQD/QkIC/wwMDP8LCwv/CQkJ/wgICP8GBgbfAAAAAAAAAAAAAAAAAAAAAAAAAABKSkpfSUlJ/0dH
+ R/9GRkb/RUVF/3R0N/+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uL
+ AP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2hoAP9lZQD/YmIA/19f
+ AP9dXQD/WloA/1dXAP9UVAD/UVEA/yoqB/8MDAz/CwsL/wkJCf8ICAj/BwcHXwAAAAAAAAAAAAAAAAAA
+ AABMTEzfS0tL/0lJSf9HR0f/TU1F/7CwMP+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aW
+ AP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0AP9xcQD/bm4A/2tr
+ AP9oaAD/ZWUA/15eAf9bWwH/XV0A/1paAP9XVwD/VFQA/01NAP8SEg3/DAwM/wsLC/8JCQn/CAgI3wAA
+ AAAAAAAAAAAAAE9PTy9OTk7/TExM/0tLS/9JSUn/fHtB/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6Wl
+ Ev+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP98fAD/enoA/3d3
+ AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP8wMBH/SUkH/11dAP9aWgD/V1cA/1RUAP8sLAj/Dg4O/wwM
+ DP8LCwv/CQkJ/wgICC8AAAAAAAAAAFFRUX9PT0//Tk5O/0xMTP9LS0v/tLNB/7+/Ov+8uzT/uLgv/7S0
+ Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KC
+ AP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2hoAP9JSQn/GRkZ/y4uEP9YWAH/WloA/1dX
+ AP9MTAL/Dw8P/w4ODv8MDAz/CwsL/woKCn8AAAAAAAAAAFNTU79RUVH/T09P/05OTv9kZEz/x8dG/8PD
+ QP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP+TkwD/kJAA/46O
+ AP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/JCQX/xkZ
+ Gf8cHBb/RkYH/1paAP9XVwD/Hh4O/w8PD/8ODg7/DAwM/wsLC78AAAAAAAAAAFRUVP9TU1P/UVFR/09P
+ T/+Ghk//y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZ
+ Af+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25u
+ AP9rawD/R0cM/xsbG/8ZGRn/FxcX/ycnEP9RUQL/MTEK/xEREf8PDw//Dg4O/wwMDP8AAAAAV1dXL1ZW
+ Vv9UVFT/U1NT/1FRUf+pqVT/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/fn45/6ysK/+wsCP/rawd/6mp
+ F/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6
+ AP93dwD/dHQA/3FxAP9ubgD/ZmYB/yEhGv8bGxv/GRkZ/xcXF/8aGhT/JiYP/xMTE/8RERH/Dw8P/w4O
+ Dv8NDQ0vWVlZP1hYWP9WVlb/VFRU/1NTU/+9vVr/09JX/8/OUf/Lykz/x8dG/6ysQv9eXkX/cnI//7i4
+ L/+0tCn/sLAj/62sHf+HhyP/VlYx/1RUL/9SUiz/UFAq/05OKP9MTCf/Skom/0hIJf9GRiT/REQi/0JC
+ If9AQCD/Pj4f/z09Hv87Oxz/OTkb/zc3Gv81NRn/MzMY/yMjHP8cHBz/Gxsb/xkZGf8XFxf/FhYW/xQU
+ FP8TExP/ERER/w8PD/8ODg4/Wlpab1lZWf9YWFj/VlZW/1RUVP/a2WL/1tZc/9PSV//PzlH/i4tM/0tL
+ S/9JSUn/qag8/7y7NP+4uC//tLQp/7CwI/+YmCT/S0s5/zw8PP87Ozv/OTk5/1BQKv9OTij/TEwn/0pK
+ Jv9ISCX/RkYj/0REIv9DQyH/QUEg/z8/Hv89PR7/Ozsc/zk5G/83Nxr/NTUY/x8fH/8eHh7/HBwc/xsb
+ G/8ZGRn/FxcX/xYWFv8UFBT/ExMT/xEREf8QEBBvXFxcf1tbW/9ZWVn/WFhY/1ZWVv/e3Wj/2tli/729
+ Wv9oaFH/Tk5O/0xMTP9qakn/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/46OIf9kZC3/Ozs7/z8/
+ Nv9iYh//iooG/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/X18I/yEh
+ If8fHx//Hh4e/xwcHP8tLRT/WVkD/xcXF/8WFhb/FBQU/xMTE/8SEhJ/Xl5ef1xcXP9bW1v/WVlZ/1hY
+ WP/i4W7/mZle/1NTU/9RUVH/T09P/05OTv+bm0z/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/62s
+ Hf+pqRf/np4V/3R0If9GRjP/ODg4/05OKP9vbxT/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8
+ AP96egD/Q0MW/yMjI/8hISH/JCQd/0lJDf9oaAD/ZWUA/xkZGf8XFxf/FhYW/xQUFP8TExN/X19ff15e
+ Xv9cXFz/W1tb/1lZWf9paVv/VlZW/1RUVP9TU1P/UVFR/1hXUP+urlD/q6tL/6enR/+kpEL/oaE9/56e
+ OP+bmzT/l5cv/5SUKv+RkSX/jo4h/4qKHP+Hhxf/a2sg/0REMf82Njb/Ojox/1tbHP+Cggb/i4sA/4iI
+ AP+FhQD/goIA/39/AP9ycgX/JiYm/yQkJP83Nxr/Z2cE/25uAP9rawD/aGgA/xsbG/8ZGRn/FxcX/xYW
+ Fv8VFRV/YWFhP2BgYP9eXl7/XFxc/1tbW/9ZWVn/WFhY/1ZWVv9UVFT/U1NT/1FRUf9PT0//Tk5O/0xM
+ TP9LS0v/SUlJ/0dHR/9GRkb/RUVF/0NDQ/9BQUH/QEBA/z4+Pv88PDz/Ozs7/zk5Of84ODj/NjY2/zQ0
+ NP8zMzP/jo4A/4uLAP+IiAD/hYUA/4KCAP9UVBT/LS0l/1VVEP93dwD/dHQA/3FxAP9ubgD/YWED/xwc
+ HP8bGxv/GRkZ/xcXF/8WFhY/YmJiP2FhYf9gYGD/Xl5e/1xcXP9tbV//WVlZ/1hYWP9WVlb/VFRU/1NT
+ U/+1tVr/srFV/6+uUf+rq0z/qKhH/6WkQ/+ioT7/np45/5ubNf+YmDD/lZQr/5KRJv+OjiH/i4sd/4eH
+ GP+EhBP/gYEP/35+Df+BgQn/kJAA/46OAP+LiwD/iIgA/4WFAP9LSxr/dHQF/3x8AP96egD/d3cA/3R0
+ AP9xcQD/WloH/x4eHv8cHBz/Gxsb/xkZGf8YGBg/AAAAAGNjY/9hYWH/YGBg/15eXv+mpnD/v790/2Ji
+ W/9YWFj/VlZW/1RUVP+np1z/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7Cw
+ I/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4KCAv+FhQD/goIA/39/
+ AP98fAD/enoA/3d3AP90dAD/SUkQ/x8fH/8eHh7/HBwc/xsbG/8AAAAAAAAAAGRkZM9jY2P/YWFh/2Bg
+ YP+Dg2n/8fCF/+Tjff+GhmT/WFhY/1ZWVv92dln/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/
+ Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uL
+ AP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/PDwY/yEhIf8fHx//Hh4e/xwcHM8AAAAAAAAAAGZm
+ Zp9kZGT/Y2Nj/2FhYf9gYGD/6+qI//Hwhf/t7H//xsVy/2pqXP9WVlb/u7tj/9rZYv/W1lz/09JX/8/O
+ Uf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aW
+ AP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP90dAL/JCQk/yMjI/8hISH/Hx8f/x4e
+ Hp8AAAAAAAAAAGdnZ09mZmb/ZGRk/2NjY/9hYWH/tbV6//X0i//x8IX/7ex//+HgeP+WlmT/iopf/97d
+ aP/a2WL/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6Wl
+ Ev+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP9XVxH/JiYm/yQk
+ JP8jIyP/ISEh/yAgIE8AAAAAAAAAAAAAAABnZ2fvZmZm/2RkZP9jY2P/dXRo//n4kP/19Iv/8fCF/+3s
+ f//p6Xn/wsJt/9nYbP/e3Wj/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0
+ Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KC
+ AP80NCT/KCgo/yYmJv8kJCT/IyMj7wAAAAAAAAAAAAAAAAAAAABpaWl/aGho/2ZmZv9kZGT/Y2Nj/8LB
+ gv/5+JD/9fSL//Hwhf/t7H//6el5/+bldP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PD
+ QP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP+TkwD/kJAA/46O
+ AP+LiwD/iIgA/2RkEP8rKyv/KSkp/ygoKP8mJib/JSUlfwAAAAAAAAAAAAAAAAAAAABqamofaWlp/2ho
+ aP9mZmb/ZGRk/2xsZv/z8pL/+fiQ//X0i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PS
+ V//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZ
+ Af+WlgD/k5MA/5CQAP+OjgD/hYUD/zQ0K/8sLCz/Kysr/ykpKf8oKCj/JiYmHwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAampqf2lpaf9oaGj/ZmZm/2RkZP+Tk3T//PuW//n4kP/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lh
+ bv/e3Wj/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mp
+ F/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/Tk4i/zAwMP8uLi7/LCws/ysrK/8pKSmPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trD2pqau9paWn/aGho/2ZmZv9kZGT/sbB+//z7lv/5+JD/9fSL//Hw
+ hf/t7H//6el5/+bldP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4
+ L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP9kZBr/MzMz/zExMf8wMDD/Li4u/yws
+ LO8rKysPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtra09qamr/aWlp/2hoaP9mZmb/ZGRk/8TE
+ hf/8+5b/+fiQ//X0i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PSV//PzlH/y8pM/8fH
+ Rv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/3V1Ff82Njb/NDQ0/zMz
+ M/8xMTH/MDAw/y4uLk8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABra2uPampq/2lp
+ af9oaGj/ZmZm/2RkZP+6uoH//PuW//n4kP/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lhbv/e3Wj/2tli/9bW
+ XP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mpF/+lpRL/dHQg/zk5
+ Of84ODj/NjY2/zQ0NP8zMzP/MTExjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa2trz2pqav9paWn/aGho/2ZmZv9kZGT/k5N0//Pykv/5+JD/9fSL//Hwhf/t7H//6el5/+bl
+ dP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/6al
+ H/9fXzL/PDw8/zs7O/85OTn/ODg4/zY2Nv80NDTPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trD2tra89qamr/aWlp/2hoaP9mZmb/ZGRk/3Z2af/CwYL/+fiQ//X0
+ i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7
+ NP+4uC//iYky/09PPf9AQED/Pj4+/zw8PP87Ozv/OTk5/zg4OM82NjYPAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtraw9ra2vPampq/2lpaf9oaGj/ZmZm/2Rk
+ ZP9jY2P/iIhu/7++fv/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lhbv/e3Wj/2tli/9bWXP/T0lf/z85R/8vK
+ TP/Hx0b/w8NA/5KSP/9jY0H/RUVF/0NDQ/9BQUH/QEBA/z4+Pv88PDz/Ozs7zzo6Og8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trn2pq
+ av9paWn/aGho/2ZmZv9kZGT/Y2Nj/2FhYf9paWP/lpZu/7m4df/R0Xj/6el5/+bldP/i4W7/3t1o/9rZ
+ Yv/W1lz/urlV/56eUP97e0z/UlJK/0lJSf9HR0f/RkZG/0VFRf9DQ0P/QUFB/0BAQP8+Pj6fAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGtra09qamrvaWlp/2hoaP9mZmb/ZGRk/2NjY/9hYWH/YGBg/15eXv9cXFz/W1tb/1lZ
+ Wf97e17/eXlc/1RUVP9TU1P/UVFR/09PT/9OTk7/TExM/0tLS/9JSUn/R0dH/0ZGRv9FRUX/Q0ND70FB
+ QU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABra2sPampqn2lpaf9oaGj/ZmZm/2RkZP9jY2P/YWFh/2Bg
+ YP9eXl7/XFxc/1tbW/9ZWVn/WFhY/1ZWVv9UVFT/U1NT/1FRUf9PT0//Tk5O/0xMTP9LS0v/SUlJ/0dH
+ R/9GRkafRUVFDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpqah9paWmfaGho/2Zm
+ Zv9kZGT/Y2Nj/2FhYf9gYGD/Xl5e/1xcXP9bW1v/WVlZ/1hYWP9WVlb/VFRU/1NTU/9RUVH/T09P/05O
+ Tv9MTEz/S0tLn0lJSR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAaGhoD2dnZ19mZmavZGRk72NjY/9hYWH/YGBg/15eXv9cXFz/W1tb/1lZWf9YWFj/VlZW/1RU
+ VP9TU1PvUVFRr09PT19PT08PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNjYy9iYmJPYWFhf19fX39eXl5/XFxcf1pa
+ Wn9ZWVl/V1dXT1ZWVi8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD//wAA//8AAP/8AAA//wAA//AAAA//
+ AAD/wAAAA/8AAP+AAAAB/wAA/wAAAAD/AAD+AAAAAH8AAPwAAAAAPwAA+AAAAAAfAADwAAAAAA8AAPAA
+ AAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAD8AAP4A
+ AAAAfwAA/4AAAAH/AAD/wAAAA/8AAP/gAAAH/wAA//gAAB//AAD//gAAf/8AAP//4Af//wAAKAAAACAA
+ AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAhISEPHx8fXx0dHZ8aGhrPGBgY/xUVFf8TExP/ERER/w4ODu8MDAy/CgoKfwgI
+ CC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAApKSkfJiYmnyQkJO8hISH/Hx8f/x0dHf8aGhr/GBgY/xUVFf8TExP/ERER/w4O
+ Dv8MDAz/CQkJ/wcHB88GBgZfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAALS0tfysrK/8oKCj/JiYm/yQkJP8hISH/Hx8f/x0dHf8aGhr/GBgY/xUV
+ Ff8TExP/ERER/w4ODv8MDAz/CQkJ/wcHB/8FBQW/BAQELwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAANTU1DzIyMs8vLy//LS0t/ysrK/8oKCj/NjYf/1JSD/9dXQj/bW0A/2lp
+ AP9kZAD/YGAA/1NTAv9CQgX/KioK/xISDf8MDAz/CQkJ/wcHB/8FBQXvAwMDXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OQ83NzfPNDQ0/zIyMv8vLy//Q0Mi/2xsCv9+fgD/enoA/3V1
+ AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/T08A/y8vBv8MDAz/CQkJ/wcHB/8FBQX/AwMDXwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4POzs7zzk5Of83Nzf/NDQ0/2BgGP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/0NDAv8YGAn/CQkJ/wcH
+ B/8FBQX/AwMDXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQK8+Pj7/Ozs7/zk5Of9zcxT/k5MA/4+P
+ AP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/0tL
+ AP8YGAn/CQkJ/wcHB/8FBQX/BAQELwAAAAAAAAAAAAAAAAAAAABFRUVPQkJC/0BAQP8+Pj7/fHsf/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xc
+ AP9YWAD/U1MA/0tLAP8YGAn/CQkJ/wcHB/8FBQXPAAAAAAAAAAAAAAAAAAAAAEdHR99FRUX/QkJC/3Bw
+ Mf+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lp
+ AP9kZAD/YGAA/1xcAP9YWAD/U1MA/0dHAf8QEAv/CQkJ/wcHB/8GBgZfAAAAAAAAAABLS0tfSUlJ/0dH
+ R/9MTEP/rKwp/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1
+ AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/y8vBv8MDAz/CQkJ/wcHB98AAAAAAAAAAE5O
+ Ts9MTEz/SUlJ/4KCP/+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9bWwP/TU0G/1xcAP9YWAD/T08A/xISDf8MDAz/CQkJ/wgI
+ CD9TU1MPUVFR/05OTv9MTEz/vLxB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+P
+ AP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP8tLRP/NzcN/1dXAf9YWAD/Li4J/w4O
+ Dv8MDAz/CgoKj1VVVU9TU1P/UVFR/25uTv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/1FRCP8aGhr/HBwW/0VF
+ B/9HRwT/ERER/w4ODv8MDAzPV1dXf1VVVf9TU1P/kpJV/8/OUv/JyUn/xMNB/7a2Of+UlDb/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/yYm
+ Gf8aGhr/GBgY/ysrD/8TExP/ERER/w4ODv9aWlqPWFhY/1VVVf+fnlv/1dRa/8/OUv+qqkr/WVlI/5iY
+ PP+5uDD/s7Mn/62tH/9LSzn/Ozs7/zk5Of9PTyn/TEwn/0lJJf9GRiP/REQi/0FBIP8+Ph7/Ozsc/zg4
+ Gv81NRj/Hx8f/x0dHf8aGhr/GBgY/xUVFf8TExP/ERER/1xcXL9aWlr/WFhY/728Zf/S0WL/iopV/05O
+ Tv9bW0v/xMNB/76+OP+5uDD/s7Mn/62tH/+HhyP/XFwu/1hYKP95eRH/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/2trBP8hISH/Hx8f/yYmGf9SUgb/KioR/xUVFf8TExP/Xl5ev1xcXP9aWlr/np5l/2dn
+ WP9TU1P/UVFR/5aWUP/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/lpUU/2trIP9JSS3/XV0d/4OD
+ Bv+LiwD/hoYA/4KCAP9+fgD/UFAT/yQkJP9ERBL/aGgB/2lpAP8oKBX/GBgY/xUVFf9hYWF/X19f/1xc
+ XP9aWlr/WFhY/1VVVf9TU1P/UVFR/05OTv9MTEz/SUlJ/0dHR/9FRUX/QkJC/0BAQP8+Pj7/Ozs7/zk5
+ Of83Nzf/NDQ0/4ODBv+LiwD/hoYA/4KCAP84OCH/ZWUJ/3V1AP9xcQD/bW0A/x0dHf8aGhr/GBgY/2Nj
+ Y39hYWH/X19f/4uKaf+Ih2X/WFhY/1VVVf+Wllr/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/gYEC/3x8Av9+fgD/enoA/3V1AP9nZwT/Hx8f/x0d
+ Hf8aGhr/ZWVlP2RkZP9hYWH/e3tn//Hwhf++vnP/YWFa/2ZmWP/a2mP/1dRa/8/OUv/JyUn/xMNB/76+
+ OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/1dX
+ Df8hISH/Hx8f/x0dHb8AAAAAZmZm/2RkZP9hYWH/4+KH//Hwhf/i4Xv/hIRh/6yrYv/a2mP/1dRa/8/O
+ Uv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/QEAa/yQkJP8hISH/Hx8fbwAAAABoaGifZmZm/2RkZP+bmnT/9vaN//Hwhf/r6nz/y8pv/+Df
+ a//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+P
+ AP+LiwD/hoYA/3d3Bf8oKCj/JiYm/yQkJP8hISEfAAAAAGpqaj9oaGj/ZmZm/2RkZP/p6I//9vaN//Hw
+ hf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/T08c/ysrK/8oKCj/JiYmvwAAAAAAAAAAAAAAAGpqar9oaGj/ZmZm/4GB
+ bv/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/3JyD/8vLy//LS0t/ysrK/8pKSk/AAAAAAAAAAAAAAAAa2trL2pq
+ av9oaGj/ZmZm/56eeP/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+
+ OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+FhQr/Ojox/zIyMv8vLy//LS0trwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa2trb2pqav9oaGj/ZmZm/56eeP/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/O
+ Uv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/j48W/z8/Nv83Nzf/NDQ0/zIyMt8wMDAPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trn2pqav9oaGj/ZmZm/4uKcf/p6I//9vaN//Hwhf/r6nz/5uV0/+Df
+ a//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/319Lf9ERDv/Ozs7/zk5Of83NzfvNDQ0LwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trn2pqav9oaGj/ZmZm/21tZ/+urnr/4+KH//Hw
+ hf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/5iYPP9aWkH/QkJC/0BAQP8+Pj7/Ozs77zk5
+ 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
+
+
+
\ No newline at end of file
diff --git a/Samples/Delphi for .NET/Sample Server/SampleServer.bdsproj b/Samples/Delphi for .NET/Sample Server/SampleServer.bdsproj
new file mode 100644
index 0000000..2bcb691
--- /dev/null
+++ b/Samples/Delphi for .NET/Sample Server/SampleServer.bdsproj
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 7.0
+
+
+ 0
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+ 0
+ 0
+ 1
+ True
+ False
+ False
+ 4096
+ 1048576
+ 4194304
+
+
+
+ ..\..\Bin\Samples
+
+
+
+ c:\windows\microsoft.net\framework\v1.1.4322;..\..\Bin;r:\internet pack\bin;R:\Internet Pack\bin
+ r:\internet pack\bin\RemObjects.InternetPack.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.XML.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Data.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.dll
+
+
+ True
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Samples/Delphi for .NET/Sample Server/SampleServer.cfg b/Samples/Delphi for .NET/Sample Server/SampleServer.cfg
new file mode 100644
index 0000000..63b34c0
--- /dev/null
+++ b/Samples/Delphi for .NET/Sample Server/SampleServer.cfg
@@ -0,0 +1,48 @@
+-$A-
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-vn
+-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M4096,1048576
+-K$00400000
+-E"..\..\Bin\Samples"
+-U"c:\windows\microsoft.net\framework\v1.1.4322;..\..\Bin;r:\internet pack\bin"
+-O"c:\windows\microsoft.net\framework\v1.1.4322;..\..\Bin"
+-I"c:\windows\microsoft.net\framework\v1.1.4322;..\..\Bin"
+-R"c:\windows\microsoft.net\framework\v1.1.4322;..\..\Bin"
+-LU"r:\internet pack\bin\RemObjects.InternetPack.Core.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.XML.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Data.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.dll"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-SYMBOL_EXPERIMENTAL
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNIT_EXPERIMENTAL
diff --git a/Samples/Delphi for .NET/Sample Server/SampleServer.dpr b/Samples/Delphi for .NET/Sample Server/SampleServer.dpr
new file mode 100644
index 0000000..cf740da
--- /dev/null
+++ b/Samples/Delphi for .NET/Sample Server/SampleServer.dpr
@@ -0,0 +1,86 @@
+program SampleServer;
+
+{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.dll'}
+{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Data.dll'}
+{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Drawing.dll'}
+{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll'}
+{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.XML.dll'}
+{$R 'Main.TWinForm2.resources' 'Main.resx'}
+{%DelphiDotNetAssemblyCompiler '..\..\bin\RemObjects.InternetPack.Core.dll'}
+
+uses
+ System.Reflection,
+ System.Runtime.CompilerServices,
+ System.Windows.Forms,
+ Main in 'Main.pas' {Main.TWinForm2: System.Windows.Forms.Form};
+
+{$R *.res}
+
+{$REGION 'Program/Assembly Information'}
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyDescription('')]
+[assembly: AssemblyConfiguration('')]
+[assembly: AssemblyCompany('')]
+[assembly: AssemblyProduct('')]
+[assembly: AssemblyCopyright('')]
+[assembly: AssemblyTrademark('')]
+[assembly: AssemblyCulture('')]
+
+// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription.
+// You can set this in the IDE via the Project Options.
+// Manually setting the AssemblyTitle attribute below will override the IDE
+// setting.
+// [assembly: AssemblyTitle('')]
+
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion('1.0.*')]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output
+// directory is the project directory (the default).
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile('')]
+[assembly: AssemblyKeyName('')]
+{$ENDREGION}
+
+[STAThread]
+begin
+ Application.Run(TWinForm2.Create);
+end.
diff --git a/Samples/Delphi for .NET/Sample Server/SampleServer.res b/Samples/Delphi for .NET/Sample Server/SampleServer.res
new file mode 100644
index 0000000..56b23d8
Binary files /dev/null and b/Samples/Delphi for .NET/Sample Server/SampleServer.res differ
diff --git a/Samples/Oxygene/FTP Sync/App.ico b/Samples/Oxygene/FTP Sync/App.ico
new file mode 100644
index 0000000..f8971dc
Binary files /dev/null and b/Samples/Oxygene/FTP Sync/App.ico differ
diff --git a/Samples/Oxygene/FTP Sync/AssemblyInfo.pas b/Samples/Oxygene/FTP Sync/AssemblyInfo.pas
new file mode 100644
index 0000000..c5feb4a
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/AssemblyInfo.pas
@@ -0,0 +1,49 @@
+namespace FtpSync;
+
+interface
+
+uses
+ System.Reflection;
+
+[assembly: AssemblyTitle('')]
+[assembly: AssemblyDescription('')]
+[assembly: AssemblyConfiguration('')]
+[assembly: AssemblyCompany('')]
+[assembly: AssemblyProduct('')]
+[assembly: AssemblyCopyright('')]
+[assembly: AssemblyTrademark('')]
+[assembly: AssemblyCulture('')]
+[assembly: AssemblyVersion('1.0.0.1')]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory, which in Chrome by default is the
+// same as the project directory. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile('mykey.snk')]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile('')]
+[assembly: AssemblyKeyName('')]
+
+implementation
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/FTP Sync/FtpSync.2008.sln b/Samples/Oxygene/FTP Sync/FtpSync.2008.sln
new file mode 100644
index 0000000..181b11f
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/FtpSync.2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "FtpSync", "FtpSync.oxygene", "{23407C77-DAB9-4100-A34D-3746A890944E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Debug|Default.ActiveCfg = Debug
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Debug|Default.Build.0 = Debug
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Release|Default.ActiveCfg = Release
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/FTP Sync/FtpSync.2010.sln b/Samples/Oxygene/FTP Sync/FtpSync.2010.sln
new file mode 100644
index 0000000..a8cdcf0
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/FtpSync.2010.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "FtpSync", "FtpSync.oxygene", "{23407C77-DAB9-4100-A34D-3746A890944E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Debug|Default.ActiveCfg = Debug
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Debug|Default.Build.0 = Debug
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Release|Default.ActiveCfg = Release
+ {23407C77-DAB9-4100-A34D-3746A890944E}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/FTP Sync/FtpSync.Sample.html b/Samples/Oxygene/FTP Sync/FtpSync.Sample.html
new file mode 100644
index 0000000..2822611
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/FtpSync.Sample.html
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+ FtpSync Sample
+
+
+
+
Purpose
+
+ This sample shows how to use the FtpClient class to gain access to an ftp
+ site and download files from there.
+The
+FtpSync application compares files on the local computer against those on the ftp folder and downloads files that are new or have changed.
+
+FtpSync is a console application with following uasge:
+
+
+
+FtpSync local user:pass@server/remote [-delete] [-passive] [-l]
+
+
+
+
+where:
+
+
+
+
local
:
local directory - long file names with spaces should be quoted
+
user/pass
:
ftp username & password
+
server
:
ftp server (i.e., ftp.whatever.com)
+
remote
:
directory on the remote server
+
-delete
:
delete local files that don't exist on the server
+
-passive
:
turn on 'Passive' mode
+
-l
:
log - show FTP commands
+
+
+
+
+
+
Getting started
+
+
Build the application.
+
Run the application with your parameters. Try to synchronize your local folder with an ftp folder
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/FTP Sync/FtpSync.oxygene b/Samples/Oxygene/FTP Sync/FtpSync.oxygene
new file mode 100644
index 0000000..82b8f22
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/FtpSync.oxygene
@@ -0,0 +1,46 @@
+
+
+ FtpSync
+ Exe
+ FtpSync
+ False
+ False
+ App.ico
+ Release
+ {23407C77-DAB9-4100-A34D-3746A890944E}
+ v2.0
+
+
+ DEBUG;TRACE;
+ .\bin\Debug
+ True
+ True
+
+
+ .\bin\Release
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/FTP Sync/FtpSyncWorker.pas b/Samples/Oxygene/FTP Sync/FtpSyncWorker.pas
new file mode 100644
index 0000000..820c421
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/FtpSyncWorker.pas
@@ -0,0 +1,418 @@
+namespace FtpSync;
+
+interface
+
+uses
+ System.IO,
+ System.Collections.Generic,
+ System.Collections.Specialized,
+ System.Text.RegularExpressions,
+ RemObjects.InternetPack.Ftp;
+
+type
+ SyncMode = public enum(Local, Remote);
+
+ FtpSyncWorker = public class
+ private
+ fLocalDirectory : string;
+ fServer: String;
+ fServerDirectory: String;
+ fUsername: string;
+ fPassword: string;
+ fDoNotDeleteMissingItems: boolean;
+ fRecursiveSync: boolean;
+ fPassiveMode: boolean;
+ fDoShowFtpClientLog: boolean;
+ fSyncMode: SyncMode := SyncMode.Local;
+ fFtpClient: FtpClient;
+ method fFtpClient_OnTransferProgress(aSender: object; ea: RemObjects.InternetPack.Events.TransferProgressEventArgs);
+ method SetLocalDirectory(value: String);
+ method SetServer(value: String);
+ method SetServerDirectory(value: String);
+ method SetDoNotDeleteMissingItems(value: boolean);
+ method SetRecursiveSync(value: Boolean);
+ method SetPassiveMode(value: Boolean);
+
+ method ServerLog(Sender: object; ea: RemObjects.InternetPack.CommandBased.ClientLogArgs);
+ method ClientLog(aMessage: String);
+ protected
+ public
+ property LocalDirectory: String read fLocalDirectory write SetLocalDirectory;
+ property Server: String read fServer write SetServer;
+ property ServerDirectory: String read fServerDirectory write SetServerDirectory;
+ property DeleteMissing: boolean read fDoNotDeleteMissingItems write SetDoNotDeleteMissingItems;
+ property Subdirectories: Boolean read fRecursiveSync write SetRecursiveSync;
+ property Passive: Boolean read fPassiveMode write SetPassiveMode;
+
+ method Log(Sender: object; ea: RemObjects.InternetPack.CommandBased.ClientLogArgs);
+ method CheckArgs(args: array of string): Boolean;
+ method SyncDirectory(aLocalDirectory: string; aRemoteDirectory: string);
+ method Sync();
+ end;
+
+implementation
+
+method FtpSyncWorker.ServerLog(Sender: object; ea: RemObjects.InternetPack.CommandBased.ClientLogArgs);
+begin
+ if (fDoShowFtpClientLog) then begin
+ var lIcon: String := ' ';
+ case ea.Direction of
+ RemObjects.InternetPack.CommandBased.LogDirection.Receive: lIcon := '<';
+ RemObjects.InternetPack.CommandBased.LogDirection.Send: lIcon := '>';
+ RemObjects.InternetPack.CommandBased.LogDirection.Status: lIcon := '!';
+ end;
+
+ Console.WriteLine('[{0}] {1}', lIcon, ea.Text);
+ end;
+end;
+
+method FtpSyncWorker.ClientLog(aMessage: String);
+begin
+ Console.WriteLine('[i] {0}', aMessage);
+end;
+
+method FtpSyncWorker.fFtpClient_OnTransferProgress(aSender: object; ea: RemObjects.InternetPack.Events.TransferProgressEventArgs);
+begin
+ Console.Write('.');
+end;
+
+
+method FtpSyncWorker.SetLocalDirectory(value: String);
+begin
+ if (fLocalDirectory = value) then Exit;
+ fLocalDirectory := value;
+end;
+
+method FtpSyncWorker.SetServer(value: String);
+begin
+ if (fServer = value) then Exit;
+ fServer := value;
+end;
+
+method FtpSyncWorker.SetServerDirectory(value: String);
+begin
+ if (fServerDirectory = value) then Exit;
+ fServerDirectory := value;
+end;
+
+method FtpSyncWorker.SetDoNotDeleteMissingItems(value: Boolean);
+begin
+ if (fDoNotDeleteMissingItems = value) then Exit;
+ fDoNotDeleteMissingItems := value;
+end;
+
+method FtpSyncWorker.SetRecursiveSync(value: Boolean);
+begin
+ if (fRecursiveSync = value) then Exit;
+ fRecursiveSync := value;
+end;
+
+method FtpSyncWorker.SetPassiveMode(value: Boolean);
+begin
+ if (fPassiveMode = value) then Exit;
+ fPassiveMode := value;
+end;
+
+method FtpSyncWorker.Log(Sender: object; ea: RemObjects.InternetPack.CommandBased.ClientLogArgs);
+begin
+ if (fDoShowFtpClientLog) then Console.WriteLine(ea.Text);
+end;
+
+method FtpSyncWorker.CheckArgs(args: array of string): Boolean;
+begin
+ var lCount: Integer := args.Length;
+ var lBadParam: Boolean := false;
+ if (lCount > 0) then
+ fLocalDirectory := args[0]
+ else
+ lBadParam := true;
+
+ if (lCount > 1) then begin
+ var lMatch: Match := Regex.Match(args[1], '(?\S+):(?\S+)@(?[^/\s]+)/(?\S*)');
+ if (lMatch.Success) then begin
+ fUsername := lMatch.Groups['user'].Value;
+ fPassword := lMatch.Groups['pass'].Value;
+ fServer := lMatch.Groups['server'].Value;
+ fServerDirectory := lMatch.Groups['dir'].Value;
+ end else begin
+ lBadParam := true;
+ Console.WriteLine('Invalid server parameters');
+ Console.WriteLine('');
+ end;
+ end else
+ lBadParam := true;
+
+ for i: Integer := 2 to lCount - 1 do begin
+ case args[i].ToLower() of
+ '-local': fSyncMode := SyncMode.Local;
+ '-remote': fSyncMode := SyncMode.Remote;
+ '-nodelete': fDoNotDeleteMissingItems := true;
+ '-passive': fPassiveMode := true;
+ '-r': fRecursiveSync := true;
+ '-l': fDoShowFtpClientLog := true;
+ '-help': lBadParam := true;
+ '/help': lBadParam := true;
+ else begin
+ Console.WriteLine('Invalid command line paramter ''+args[i]+''');
+ Console.WriteLine('');
+ lBadParam := true;
+ end;
+ end;
+ end;
+
+ if (lBadParam) then begin
+ Console.WriteLine('RemObjects Internet Pack - FtpSync Sample');
+ Console.WriteLine('');
+ Console.WriteLine(' Usage: FtpSync local user:pass@server/remote [-local] [-remote] [-nodelete] [-passive] [-l] [-r]');
+ Console.WriteLine();
+ Console.WriteLine(' Compares files on local computer against those on the remote server, ');
+ Console.WriteLine(' downloading those that are new or have changed.');
+ Console.WriteLine();
+ Console.WriteLine(' local : local directory - long file names with spaces should be quoted');
+ Console.WriteLine(' user/pass : ftp username & password');
+ Console.WriteLine(' server : ftp server (i.e., ftp.whatever.com');
+ Console.WriteLine(' remote : directory on remote server');
+ Console.WriteLine();
+ Console.WriteLine(' -nodelete : forbid to delete missing files');
+ Console.WriteLine(' -passive : turn on ''Passive mode''');
+ Console.WriteLine(' -r : recursive synchronization (through subdirectories)');
+ Console.WriteLine(' -l : log - show FTP commands');
+ Console.WriteLine(' -local : Local mode of sync (Master = ftp; slave = localhost). By default');
+ Console.WriteLine(' -remote : Remote mode of sync (Master = localhost; slave = ftp)');
+ Console.WriteLine();
+ Console.WriteLine('Press enter to exit.');
+ Console.ReadLine();
+ end;
+ exit (not lBadParam);
+ end;
+
+method FtpSyncWorker.Sync();
+begin
+ try
+ fFtpClient := new FtpClient();
+ fFtpClient.HostName := fServer;
+ fFtpClient.UserName := fUsername;
+ fFtpClient.Password := fPassword;
+ fFtpClient.Passive := fPassiveMode;
+ fFtpClient.Port := 21;
+
+ fFtpClient.OnLog += new RemObjects.InternetPack.CommandBased.ClientLogEvent(ServerLog);
+ fFtpClient.OnTransferProgress +=new RemObjects.InternetPack.Events.TransferProgressEventHandler(fFtpClient_OnTransferProgress);
+ ClientLog('Connecting to ' + fServer);
+ fFtpClient.Open();
+ try
+ fFtpClient.Login();
+ SyncDirectory(fLocalDirectory, '/' + fServerDirectory);
+ finally
+ ClientLog('Disconnecting');
+ fFtpClient.Quit();
+ fFtpClient.Close();
+ end
+ except
+ on ex: Exception do begin
+ ClientLog(String.Format('Error syncing directory ({0})', ex.Message));
+ if (Assigned(ex.StackTrace) and fDoShowFtpClientLog) then ClientLog(ex.StackTrace);
+
+ end;
+ end;
+ ClientLog('Press enter to continue...');
+ Console.ReadLine();
+end;
+
+
+method FtpSyncWorker.SyncDirectory(aLocalDirectory: string; aRemoteDirectory: string);
+begin
+ var lOriginalLocalDirectory: String := Directory.GetCurrentDirectory();
+ var lOriginalRemoteDirectory: String := fFtpClient.GetCurrentDirectory();
+
+ try
+ {$REGION Step into synchronized directories}
+ ClientLog(String.Format('Local change directory to {0}', aLocalDirectory));
+ Directory.SetCurrentDirectory(aLocalDirectory);
+
+ ClientLog(String.Format('Remote change directory to {0}', aRemoteDirectory));
+ fFtpClient.ChangeDirectory(aRemoteDirectory);
+ {$ENDREGION}
+
+ {$REGION Retrieve content}
+ ClientLog('Retrieving directory contents');
+ fFtpClient.List();
+ {$ENDREGION}
+
+ {$REGION Get Local Folders List}
+ var lLocalFolders: Dictionary := new Dictionary();
+ if (fRecursiveSync) then begin
+ for each lName: String in Directory.GetDirectories(aLocalDirectory) do begin
+ var d: DirectoryInfo := new DirectoryInfo(lName);
+ lLocalFolders.Add(d.Name, d);
+ end;
+ end;
+ {$ENDREGION}
+
+ {$REGION Get Local Files List}
+ var lLocalFiles: Dictionary := new Dictionary();
+ for each lName: String in Directory.GetFiles(aLocalDirectory) do begin
+ var f: FileInfo := new FileInfo(lName);
+ lLocalFiles.Add(f.Name, f);
+ end;
+ {$ENDREGION}
+
+ {$REGION Get Remote Files and Directories List}
+ var lRemoteFolders: Dictionary := new Dictionary();
+ var lRemoteFiles: Dictionary := new Dictionary();
+ for each lRemoteItem: FtpListingItem in fFtpClient.CurrentDirectoryContents do begin
+ if lRemoteItem.Directory then begin
+ if fRecursiveSync then begin
+ if (lRemoteItem.FileName <> '..') then
+ lRemoteFolders.Add(lRemoteItem.FileName, lRemoteItem);
+ end;
+ end
+ else
+ lRemoteFiles.Add(lRemoteItem.FileName, lRemoteItem);
+ end;
+ {$ENDREGION}
+
+ {$REGION Synchronization...}
+ case fSyncMode of
+ {$REGION Local Synchronization. Master: ftp; slave: local;}
+ SyncMode.Local: begin
+ {$REGION Folders synchronization}
+ for each lName: String in lRemoteFolders.Keys do begin
+ ClientLog(String.Format('Synchronizing folder "{0}"...', lName));
+ var lLocalItemName: String := Path.Combine(aLocalDirectory, lName);
+
+ if (not Directory.Exists(lLocalItemName)) then
+ Directory.CreateDirectory(lLocalItemName);
+
+ SyncDirectory(lLocalItemName, lName);
+
+ ClientLog(String.Format('Folder "{0}" has been synchronized', lName));
+ lLocalFolders.Remove(lName);
+ end;
+
+ {$REGION Delete local folders that doesn't exists on FTP}
+ if (not fDoNotDeleteMissingItems) then begin
+ for each toDelete: DirectoryInfo in lLocalFolders.Values do
+ toDelete.Delete(true);//delete recursive
+
+ lLocalFolders.Clear();
+ end;
+ {$ENDREGION}
+
+ {$ENDREGION}
+
+ {$REGION Files synchronization}
+ for each lName: String in lRemoteFiles.Keys do begin
+ var lRemoteItem: FtpListingItem := lRemoteFiles[lName];
+ var lNeedSync: Boolean := true;
+ if (lLocalFiles.ContainsKey(lName)) then begin
+ var lLocalItem: FileInfo := lLocalFiles[lName];
+ lNeedSync := (
+ (lLocalItem.Length <> lRemoteItem.Size) OR
+ (lLocalItem.LastWriteTime <> lRemoteItem.FileDate));
+ end;
+ ClientLog(
+ String.Format(
+ 'File {0} {1}',
+ lRemoteItem.FileName,
+ iif(lNeedSync, 'requires synchronization.', 'doesn''t require synchronization.')));
+ if lNeedSync then begin
+ ClientLog(String.Format('Downloading {0}...', lRemoteItem.FileName));
+ with lStream: Stream := File.Open(Path.Combine(aLocalDirectory, lName), FileMode.Create) do begin
+ fFtpClient.Retrieve(lRemoteItem, lStream);
+ lStream.Close();
+ File.SetLastWriteTime(lRemoteItem.FileName, lRemoteItem.FileDate);
+ end;
+ ClientLog(String.Format('File {0} has been downloaded.', lRemoteItem.FileName));
+ end;
+ lLocalFiles.Remove(lName);
+ end;
+
+ {$REGION Delete local files that doesn't exists on FTP}
+ if (not fDoNotDeleteMissingItems) then begin
+ for each toDelete: FileInfo in lLocalFiles.Values do
+ toDelete.Delete();
+ lLocalFiles.Clear();
+ end;
+ {$ENDREGION}
+
+ {$ENDREGION}
+ end;
+ {$ENDREGION}
+
+ {$REGION Remote Synchronization. Master: local; slave: ftp;}
+ SyncMode.Remote: begin
+
+ {$REGION Folders Synchronization.}
+ for each lName: String in lLocalFolders.Keys do begin
+ ClientLog(String.Format("Synchronizing folder '{0}'...", lName));
+ var lLocalItemName: String := Path.Combine(aLocalDirectory, lName);
+
+ if not lRemoteFolders.ContainsKey(lName) then fFtpClient.MakeDirectory(lName);
+ SyncDirectory(lLocalItemName, lName);
+ ClientLog(String.Format("Folder '{0}' has been synchronized", lName));
+ lRemoteFolders.Remove(lName);
+ end;
+ {$REGION Delete FTP folders that doesn't exists locally}
+ if not fDoNotDeleteMissingItems then begin
+ for each toDelete: FtpListingItem in lRemoteFolders.Values do
+ fFtpClient.RemoveDirectory(toDelete.FileName);
+ lRemoteFolders.Clear();
+ end;
+ {$ENDREGION}
+ {$ENDREGION}
+
+ {$REGION Files Synchronization.}
+ for each lName: String in lLocalFiles.Keys do begin
+ var lLocalItemName: String := Path.Combine(aLocalDirectory, lName);
+
+ var lNeedSync: Boolean := true;
+ if lRemoteFiles.ContainsKey(lName) then begin
+ var lLocalItem: FileInfo := new FileInfo(lLocalItemName);
+ var lRemoteItem: FtpListingItem := lRemoteFiles[lName];
+ lNeedSync := (
+ (lLocalItem.Length <> lRemoteItem.Size) OR
+ (lLocalItem.LastWriteTime <> lRemoteItem.FileDate));
+ end;
+ ClientLog(
+ String.Format(
+ 'File {0} {1}',
+ lName,
+ iif(lNeedSync, 'requires synchronization.', 'doesn''t require synchronization.')));
+ if lNeedSync then begin
+ ClientLog(String.Format('Uploading {0}...', lName));
+ if (File.Exists(lLocalItemName)) then
+ with fs: FileStream := new FileStream(lLocalItemName, FileMode.Open, FileAccess.Read) do
+ fFtpClient.Store(lName, fs);
+
+ ClientLog(String.Format('File {0} has been uploaded.', lName));
+ end;
+ lRemoteFiles.Remove(lName);
+ end;
+
+ {$REGION Delete FTP files that doesn't exist locally}
+ if not fDoNotDeleteMissingItems then begin
+ for each toDelete: FtpListingItem in lRemoteFiles.Values do
+ fFtpClient.Delete(toDelete.FileName);
+ lRemoteFiles.Clear();
+ end;
+ {$ENDREGION}
+
+ {$ENDREGION}
+ end;
+ {$ENDREGION}
+ end;//case
+ {$ENDREGION}
+ finally
+ {$REGION Step out of synchronized directories}
+ Directory.SetCurrentDirectory(lOriginalLocalDirectory);
+ ClientLog(String.Format('Local change directory to {0}', lOriginalLocalDirectory));
+ fFtpClient.ChangeDirectory(lOriginalRemoteDirectory);
+ ClientLog(String.Format('Remote change directory to {0}', lOriginalRemoteDirectory));
+ {$ENDREGION}
+ end;
+end;
+
+
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/FTP Sync/FtpSyncWorker.resx b/Samples/Oxygene/FTP Sync/FtpSyncWorker.resx
new file mode 100644
index 0000000..65e523c
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/FtpSyncWorker.resx
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ AAABAAQAICAQAAEABADoAgAARgAAABAQEAABAAQAKAEAAC4DAAAgIAAAAQAgAKgQAABWBAAAEBAAAAEA
+ IABoBAAA/hQAACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAAAAAAAAAAAAAAB4iIiIiIgAAAAAAAAAAAAAf//////4AAAAAAAAAAAAAH//////+AAAAAAAAAAAB/
+ t///////gAAAAAAAAAAAe/f0RERET4AAAAAAAAAAAH+3//////+AiIiIiIiIAAB79/RERERPgI+Pj4+P
+ iAAAf7f//////4D4+Pj4+PgAAHv39ERERE+Aj4+Pj4+IAAB/t///////gPj////4+AAAe/f0RERET4CP
+ cAAA/4gAAH+3//////+A9wB4AA/4AAB79///////j/APj4cH+AAAf7d3d3d3d3+AiPj4APgAAHv7+/v7
+ 94+PcI+PjwD4AAB/v7+/v7f4/4B4+PgA+AAAd3d3d3d3j4/wD4+PcPgAAAB////////49wf48AD4AAAA
+ f///////j/AAgHAA+AAAAH/////////wAHAAAPgAAAB/////////cAAAAHD4AAAAf////////wBwAACH
+ fwAAAH////////8HgAAAj/gAAAB/////////D3AHAA/4AAAAZmZmaGhmj38ADwAI+AAAAGZmZoZmhm//
+ APj3B/gAAABmZmZmhmaGjwD4jwf4AAAAd3d3d3d3d39w93949wAAAAAAAAAAAAAAgAAAcAAAAAAAAAAA
+ AAAAAAdwAAAAAAAAAAAAAAAAAAAAAAAAAAD4AD//+AA///gAP//AAD//wAA//8AAAAHAAAABwAAAAcAA
+ AAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAA
+ AAHwAAAB8AAAAfAAAAHwAAAB8AAAAf//89////n//////ygAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD/
+ /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAf///8AAAAAB/RETwAAAAe3////AAAAB/f0RE8HAAAHt/
+ ///////wf39ERP8HD/B7f///8I+A8H93d3fw/4Dwe/v78Pd/d/B3d3dw9wcH8AB////wAAfwAA////cA
+ D/AAZmZm/wgH8ABmZmZvD4fwAAAAAABwAADAPwAAwD8AAAA/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAD/3wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtmIj/qZOE/6SPfv+giXj/m4Rz/5Z/
+ bf+Remj/jHVj/4dwXf+Da1j/f2ZS/3phTv92XUn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCom//56uP/8dPF//HR
+ wf/xz8D/8M29/+/Muv/vyrn/78i2/+/HtP/uxrP/7cWx/3lgTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwqyf//nt
+ 5//56+T/+Oni//jo4P/45d3/9+Pa//bh1//239X/9d3S//Tc0P/uxrP/fWRR/wAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtmIj/qZOE/6SP
+ fv/Fr6P/+u/q//rt6P/57OX/+Onj//jo4P/45t3/9uPb//bi2P/24Nb/9d7T/+7Htf+AZ1X/cVhE/3BW
+ Qv9vVED/blM//21SPf9rUT3/ak87/2lOOf9oTTj/Z0w4/2ZLNv9lSjX/ZEk0/2NJM/9jSDP/AAAAAMCo
+ m/973PP/Y87u/8mzqf/78u7/+/Dr/9hqMv/IYSz/tVcn/6JOJP+RRiL/hkEg/4ZBIP/24Nf/78q4/4Nq
+ Wf/GsKT/xK2i/8OsoP/Bqp3/wKic/7+mmf+9pJf/u6KV/7mhk/+4npD/tpyO/7SbjP+ymYr/sZeH/2NI
+ NP8AAAAAwqyf/4Hf9P983fP/zLiu//z08P/78u7/+vDs//vv6v/67ef/+ezl//nq4v/45+D/9+Xd//fj
+ 2//vzLv/hm5d//bh1//239T/9d7S//Xc0P/02s7/9NnM//PXyv/z1cj/8tTG//HTxP/y0cL/8dDA//DO
+ vv+zmYv/ZUk1/wAAAADFr6P/huH0/4Lf9f/PvLP//Pbz//z08f/YajL/x2Es/7VXJ/+hTiX/kUYj/4ZB
+ IP+GQSD/+Ofe//DOvv+Lc2D/9uLY//Xg1//239X/9d7S//Tc0P/02s7/89nM//PXyf/y1cf/8tTF//LT
+ w//y0cL/8dDA/7Wcjf9mSzb/AAAAAMmzqf+M4/X/h+H0/9PCuf/9+fb//ff0//z28v/89PD/+/Lu//vx
+ 6//67+n/+e3m//nq5P/56eH/8tHB/453Zf/35Nr/9+LY//bh1v/239T/9d7S//Xc0P/02s7/89nL//PW
+ yv/y1cj/8tPF//LTxP/x0cL/uJ6Q/2dNOP8AAAAAzLiu/5Ll9f+M4/X/18e+//36+f/++Pf/2Goy/8hg
+ LP+1Vyj/ok4k/5FGIv+GQSD/hkEg//nr5f/y1Mb/kXpp//jm3P/349r/9uLY////////////////////
+ //////////////LXyf/z1sf/8tPG//LSw/+6oZP/aE46/wAAAADPvLP/l+j1/5Ll9f/bzMT//vz7//37
+ +v/9+vj//fj1//z39P/89fL//PPv//vx7f/68Or/+u7o//PXyf+Vfm3/+Obf//fl3P//////gICA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD///////PWyf/z1cf/8tTG/7ykl/9qTzv/AAAAANPCuf+c6vb/l+j2/97R
+ y//+/f3//vz8/9hqMv/IYSz/tVYn/6JOJP+RRiL/hkEg/4ZBIP/68ez/9NnN/5mCcf/46OD//////4CA
+ gP8AAAD/AAAA/4CAgP/AwMD/AAAA/wAAAP8AAAD///////PXyf/z1cf/vqea/2tSPf8AAAAA18e+/6Hs
+ 9v+d6vb/4tbQ/////v/+/f3//v38//78+v/++vn//fn3//339v/99vP//PXx//vz7//13dH/nIZ1////
+ ////////AAAA/wAAAP/249n/9+HX//bg1f/13tT/gICA/wAAAP+AgID///////LWyP/AqZ3/bVQ//wAA
+ AADbzMT/pe73/6Hs9v/m3Nb////////////+/v7///39//78+//++/r//fn3//359v/89/T//Pby//Xf
+ 1f+ginr//////8DAwP8AAAD/wMDA//fk2//249n/9uHX//Xg1v/13tP/AAAA/wAAAP//////89jL/8Or
+ n/9vVUH/AAAAAN7Ry/+o7/f/pO33/+ng3P///////////////////v////39///8+//9/Pr//fv4//34
+ 9v/9+PX//Pbz/7Silf//////gICA/wAAAP/45+D/9+bd//fk2//349n/9uDX//bf1f8AAAD/AAAA////
+ ///02c3/xK6i/3FXQ/8AAAAA4tbQ/6vw9/+o7/f/7eXi/+vi3v/p39z/593Y/+Ta1P/j19L/4dXO/9/R
+ y//cz8j/2svF/9jJwf/YysH/+u/q///////AwMD/AAAA/4CAgP/459//9+bd//fk2//24tn/9uHX/wAA
+ AP8AAAD///////Tazv/HsaX/c1lF/wAAAADm3Nb/q/D3/6vw9/+o7/f/pu72/6Ls9/+f6/b/mun2/5Xn
+ 9f+Q5fX/jOP1/4Da9f+ginr/+/Pv//vy7v/68Oz///////////8AAAD/AAAA//jp4f/459//9+bd//fj
+ 2v/34tj/gICA/wAAAP//////9NzQ/8mzqP91W0j/AAAAAOng3P+r8Pf/q/D3/6vw9/+p7/f/pu32/6Ls
+ 9v+f6/b/m+n2/5bn9f+S5fX/jOP0/6SOfv/79PH/+/Lv//vx7f/78Ov//////4CAgP8AAAD/gICA//jp
+ 4f/AwMD/9+Xc/wAAAP8AAAD/AAAA///////13tL/y7as/3deSv8AAAAA7eXi/+vi3v/p39z/593Y/+Ta
+ 1P/j19L/4dXO/9/Ry//cz8j/2svF/9jJwf/Wx77/p5KC//z18v/89PH/+/Lu//vy7f//////AAAA/wAA
+ AP8AAAD/+erj/wAAAP+AgID/AAAA/wAAAP8AAAD///////Xe1P/Nuq//eWBN/wAAAAAAAAAAAAAAAAAA
+ AAC3opP//////////v/+/v3//vz8//78+//++/n//fr4//359//9+PX//Pb0//z18v/79PH/+/Lu////
+ //8AAAD/AAAA/wAAAP+AgID/AAAA/wAAAP8AAAD/AAAA/wAAAP//////9eDV/8+8s/97Yk//AAAAAAAA
+ AAAAAAAAAAAAALeik//////////////+/v/+/f3//v38//78+//++vn//fr4//359//99/X//ff0//z1
+ 8f//////gICA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+AgID/AAAA///////24tj/0cC3/35k
+ Uv8AAAAAAAAAAAAAAAAAAAAAt6KT///////////////////+/v///f3//vz8//78+v/9+/r//fn4//35
+ 9v/9+PT//Pfz//////8AAAD/AAAA/4CAgP8AAAD/AAAA/wAAAP8AAAD/AAAA/8DAwP+AgID/gICA////
+ ///Uw7r/gGdU/wAAAAAAAAAAAAAAAAAAAAC3opP//////////////////////////v/+/f3//vz8//77
+ +//9+/r//vr4//349v/99/X//////wAAAP+AgID/wMDA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA////
+ ////////9+Tc/9fHvv+CaVf/AAAAAAAAAAAAAAAAAAAAALeik//////////////////////////////+
+ /v/+/f3//v38//77+//++vn//fn4//359v//////AAAA//////+AgID/AAAA/wAAAP+AgID/AAAA/wAA
+ AP8AAAD///////jn3//35t3/9+Tb/4RsWv8AAAAAAAAAAAAAAAAAAAAA0ZFy/9GRcv/RkXL/0Ixr/9CG
+ Yf/OflX/zXVJ/8xtPf/KZDH/yl0n/8lZIP/JWSD/yVkg//////+AgID//////wAAAP8AAAD/AAAA////
+ //8AAAD/AAAA/wAAAP/AwMD//////8lZIP/JWSD/yVkg/wAAAAAAAAAAAAAAAAAAAADRkXL//sCf//6+
+ nf/9vJv//bqY//25lv/8t5P/+7WQ//uzjf/7sIr/+q6G//mrg//4qYD/////////////////AAAA/wAA
+ AP//////9Jpt//////+AgID/AAAA/4CAgP//////85Vl//OVZf/JWSD/AAAAAAAAAAAAAAAAAAAAANGR
+ cv/+wJ///r6d//29m//9u5j//bmV//y2k//7tZD/+7KN//uwiv/5rob/+auE//ipgP/4p37/96V6////
+ //8AAAD/AAAA///////0mm3/9Jhq//////8AAAD/gICA///////zlWX/85Vl/8lZIP8AAAAAAAAAAAAA
+ AAAAAAAA0ZFy//7Anv/+v53//rya//27mP/9uZX//LaT//y1kP/7s43/+rGK//muh//5q4P/+aqB//en
+ ff/3pXr//////4CAgP8AAAD///////SabP/0mGr//////4CAgP/AwMD///////OVZf/zlWX/yVkg/wAA
+ AAAAAAAAAAAAAAAAAADRkXL/0ZFy/9GRcv/QjGv/0IZh/85+Vf/NdUn/zG09/8pkMf/KXSf/yVkg/8lZ
+ IP/JWSD/yVkg/8lZIP//////wMDA/wAAAP//////yVkg/8lZIP//////gICA///////JWSD/yVkg/8lZ
+ IP/JWSD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA/4CAgP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////+AA///gAP//4AD//wAAAAEAAAABAAAAAQAA
+ AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAeAAAAHgAAAB4AAAAeAA
+ AAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAH///P//////ygAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3opP/Y0k1/2NJNf9jSTX/Y0k1/2NJNf9jSTX/Y0k1/wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt6KT//Xe0//d0Mn/2szE/9fHv//Uw7r/0b+1/2NJ
+ Nf9jSTX/Y0k1/2NJNf9jSTX/Y0k1/2NJNf+3opP/Y0k1/7eik//35Nv/6ptz/+qVa//qkGL/6opa/9TD
+ u/9jSTX/27+t/9u7p//bu6f/27un/8+0o/9jSTX/t6KT/wGn6P+7ppf/+eni//jl3f/24tj/9d/T//Tb
+ zv/ZycH/Y0k1//fk2//24df/9d3T//Tbzv/PtKP/Y0k1/7eik/8Tsez/wauc//rv6v/qm3P/6pVr/+qS
+ ZP/rj2D/9NvO/2ZNOf/3597/9+Pb//bg1v/13tL/z7Sj/2NJNf+7ppf/NcHw/8eyo//89PD//ff1/+Lt
+ 4f/56eL/+OXd//bi2P9kSjb/+eri//fn3v/249n/9uDW/8+0o/9jSTX/wauc/1/R8//Puan//fn2/+qb
+ c//qlWv/6pJk/+uPYP/l29b/Zk05//rs5//46eL/9+bd//bi2f/Quav/Y0k1/8eyo/+H4fX/2MKy//78
+ +////f3//vz5//359v/89fP/+/Lv/2RKNv/67un/+erk//jo4f/35dz/0cG2/2NJNf/Puan/pe73/9jC
+ sv/YwrL/1L+u/9jCsv/YwrL/2MKy/9jCsv9kSjb/+/Lu//rv6f/56+X/+Ojh/9HBtv9jSTX/2MKy/6vw
+ 9/+r8Pf/q/D3/6vw9/+r8Pf/q/D3/2RKNv/9+/n//fj1//z18f/78u3/+u7p//nq5P/Rwbb/Y0k1/9jC
+ sv/YwrL/1L+u/9jCsv/YwrL/2MKy/9jCsv9kSjb//vz8//76+f/99/X/+/Tx//vx7f/67uj/+erj/2NJ
+ Nf8AAAAAAAAAAOqqi//qqov/6qqL/+mlhP/pn3r/55du/+aOYv/lhlb/431K/+N2QP/icjn/4nI5/+Jy
+ Of/IYi//AAAAAAAAAADqqov//8Ki//7An//9vZr//LmW//u1kP/6sIv/+auE//inff/2onf/9Z1x//WZ
+ av/zlWX/zWUx/wAAAAAAAAAA6qqL/+qqi//qqov/6qqL/+qmhv/poX//6Jt2/+eUbP/mjmL/5YdY/+SB
+ Tv/ke0b/43Y+/+JyOf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA//8AAMA/AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAwAAAAMAAAADAAAAA//8AAA==
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/FTP Sync/Main.pas b/Samples/Oxygene/FTP Sync/Main.pas
new file mode 100644
index 0000000..35cd448
--- /dev/null
+++ b/Samples/Oxygene/FTP Sync/Main.pas
@@ -0,0 +1,19 @@
+namespace FtpSync;
+
+interface
+
+type
+ ConsoleApp = class
+ public
+ class method Main(args: array of string);
+ end;
+
+implementation
+
+class method ConsoleApp.Main(args: array of string);
+begin
+ with lWorker := new FtpSyncWorker() do
+ if (lWorker.CheckArgs(args)) then lWorker.Sync();
+end;
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/HTTP Responses/App.ico b/Samples/Oxygene/HTTP Responses/App.ico
new file mode 100644
index 0000000..4680a4e
Binary files /dev/null and b/Samples/Oxygene/HTTP Responses/App.ico differ
diff --git a/Samples/Oxygene/HTTP Responses/AssemblyInfo.pas b/Samples/Oxygene/HTTP Responses/AssemblyInfo.pas
new file mode 100644
index 0000000..71812a7
--- /dev/null
+++ b/Samples/Oxygene/HTTP Responses/AssemblyInfo.pas
@@ -0,0 +1,49 @@
+namespace HTTPResponses;
+
+interface
+
+uses
+ System.Reflection;
+
+[assembly: AssemblyTitle('')]
+[assembly: AssemblyDescription('')]
+[assembly: AssemblyConfiguration('')]
+[assembly: AssemblyCompany('')]
+[assembly: AssemblyProduct('')]
+[assembly: AssemblyCopyright('')]
+[assembly: AssemblyTrademark('')]
+[assembly: AssemblyCulture('')]
+[assembly: AssemblyVersion('1.0.0.1')]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory, which in Chrome by default is the
+// same as the project directory. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile('mykey.snk')]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile('')]
+[assembly: AssemblyKeyName('')]
+
+implementation
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/HTTP Responses/HTTPResponses.2008.sln b/Samples/Oxygene/HTTP Responses/HTTPResponses.2008.sln
new file mode 100644
index 0000000..1ceac09
--- /dev/null
+++ b/Samples/Oxygene/HTTP Responses/HTTPResponses.2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "HTTPResponses", "HTTPResponses.oxygene", "{7F2AEC27-045A-4023-BF01-488C214D4A3D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Debug|Default.ActiveCfg = Debug
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Debug|Default.Build.0 = Debug
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Release|Default.ActiveCfg = Release
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/HTTP Responses/HTTPResponses.2010.sln b/Samples/Oxygene/HTTP Responses/HTTPResponses.2010.sln
new file mode 100644
index 0000000..987a9f5
--- /dev/null
+++ b/Samples/Oxygene/HTTP Responses/HTTPResponses.2010.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "HTTPResponses", "HTTPResponses.oxygene", "{7F2AEC27-045A-4023-BF01-488C214D4A3D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Debug|Default.ActiveCfg = Debug
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Debug|Default.Build.0 = Debug
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Release|Default.ActiveCfg = Release
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/HTTP Responses/HTTPResponses.oxygene b/Samples/Oxygene/HTTP Responses/HTTPResponses.oxygene
new file mode 100644
index 0000000..8f83312
--- /dev/null
+++ b/Samples/Oxygene/HTTP Responses/HTTPResponses.oxygene
@@ -0,0 +1,47 @@
+
+
+ HTTPResponses
+ WinExe
+ HTTPResponses
+ False
+ App.ico
+ Release
+ {7F2AEC27-045A-4023-BF01-488C214D4A3D}
+ v2.0
+
+
+ DEBUG;TRACE;
+ .\bin\Debug
+ True
+
+
+ .\bin\Release
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+ HTTPResponses.MainForm
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/HTTP Responses/HttpResponses.Sample.html b/Samples/Oxygene/HTTP Responses/HttpResponses.Sample.html
new file mode 100644
index 0000000..3fa0428
--- /dev/null
+++ b/Samples/Oxygene/HTTP Responses/HttpResponses.Sample.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+ HTTP Responses Sample
+
+
+
+
Purpose
+
+This sample shows how to create and configure a simple HTTP server.
+
+
+
Examine the Code
+
+
+See the httpServer_OnHttpRequest handler, where all possible RequestPaths
+ are processed.
+The options possible are as follows:
+
+
/ or /home - load home page with all available links.
+
/file - download the HttpResponses application.
+
/bytes - download random.bin file that contains random generated data.
+
/error - shows a custom error with code 555.
+
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run the application.
+
Click the link on the top of the application window to open the home page of our server in your web browser.
+
Try all the links on the home page.
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/HTTP Responses/Main.pas b/Samples/Oxygene/HTTP Responses/Main.pas
new file mode 100644
index 0000000..7ccb791
--- /dev/null
+++ b/Samples/Oxygene/HTTP Responses/Main.pas
@@ -0,0 +1,222 @@
+namespace HTTPResponses;
+
+interface
+
+uses
+ System.Windows.Forms,
+ System.Drawing,
+ System.Diagnostics,
+ System.IO;
+
+type
+ ///
+ /// Summary description for MainForm.
+ ///
+ MainForm = class(System.Windows.Forms.Form)
+ {$REGION Windows Form Designer generated fields}
+ private
+ components: System.ComponentModel.IContainer;
+ lb_Log: System.Windows.Forms.ListBox;
+ httpServer: RemObjects.InternetPack.Http.HttpServer;
+ llblinkLabel1: System.Windows.Forms.LinkLabel;
+ method InitializeComponent;
+ {$ENDREGION}
+ private
+ method httpServer_OnHttpRequest(aSender: System.Object; ea: RemObjects.InternetPack.Http.OnHttpRequestArgs);
+ method MainForm_Closed(sender: System.Object; e: System.EventArgs);
+ method MainForm_Load(sender: System.Object; e: System.EventArgs);
+ method llblinkLabel1_LinkClicked(sender: System.Object; e: System.Windows.Forms.LinkLabelLinkClickedEventArgs);
+ protected
+ method Dispose(aDisposing: boolean); override;
+ public
+ constructor;
+ class method Main;
+ end;
+
+implementation
+
+{$REGION Construction and Disposition}
+constructor MainForm;
+begin
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+end;
+
+method MainForm.Dispose(aDisposing: boolean);
+begin
+ if aDisposing then begin
+ if assigned(components) then
+ components.Dispose();
+
+ //
+ // TODO: Add custom disposition code here
+ //
+ end;
+ inherited Dispose(aDisposing);
+end;
+{$ENDREGION}
+
+{$REGION Windows Form Designer generated code}
+method MainForm.InitializeComponent;
+begin
+ self.components := new System.ComponentModel.Container();
+ var resources: System.ComponentModel.ComponentResourceManager := new System.ComponentModel.ComponentResourceManager(typeOf(MainForm));
+ self.llblinkLabel1 := new System.Windows.Forms.LinkLabel();
+ self.httpServer := new RemObjects.InternetPack.Http.HttpServer(self.components);
+ self.lb_Log := new System.Windows.Forms.ListBox();
+ self.SuspendLayout();
+ //
+ // llblinkLabel1
+ //
+ self.llblinkLabel1.Location := new System.Drawing.Point(8, 10);
+ self.llblinkLabel1.Name := 'llblinkLabel1';
+ self.llblinkLabel1.Size := new System.Drawing.Size(100, 23);
+ self.llblinkLabel1.TabIndex := 2;
+ self.llblinkLabel1.TabStop := true;
+ self.llblinkLabel1.Text := 'http://localhost:82';
+ self.llblinkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(@self.llblinkLabel1_LinkClicked);
+ //
+ // httpServer
+ //
+ self.httpServer.Port := 82;
+ self.httpServer.ValidateRequests := false;
+ self.httpServer.OnHttpRequest += new RemObjects.InternetPack.Http.OnHttpRequestHandler(@self.httpServer_OnHttpRequest);
+ //
+ // lb_Log
+ //
+ self.lb_Log.Anchor := ((((System.Windows.Forms.AnchorStyles.Top or System.Windows.Forms.AnchorStyles.Bottom)
+ or System.Windows.Forms.AnchorStyles.Left)
+ or System.Windows.Forms.AnchorStyles.Right) as System.Windows.Forms.AnchorStyles);
+ self.lb_Log.IntegralHeight := false;
+ self.lb_Log.Location := new System.Drawing.Point(11, 32);
+ self.lb_Log.Name := 'lb_Log';
+ self.lb_Log.Size := new System.Drawing.Size(371, 228);
+ self.lb_Log.TabIndex := 3;
+ //
+ // MainForm
+ //
+ self.AutoScaleBaseSize := new System.Drawing.Size(5, 13);
+ self.ClientSize := new System.Drawing.Size(394, 272);
+ self.Controls.Add(self.lb_Log);
+ self.Controls.Add(self.llblinkLabel1);
+ self.Icon := (resources.GetObject('$this.Icon') as System.Drawing.Icon);
+ self.MinimumSize := new System.Drawing.Size(410, 310);
+ self.Name := 'MainForm';
+ self.Text := 'Internet Pack HTTP Response Sample';
+ self.Load += new System.EventHandler(@self.MainForm_Load);
+ self.Closed += new System.EventHandler(@self.MainForm_Closed);
+ self.ResumeLayout(false);
+end;
+{$ENDREGION}
+
+{$REGION Application Entry Point}
+[STAThread]
+class method MainForm.Main;
+begin
+ Application.EnableVisualStyles();
+
+ try
+ with lForm := new MainForm() do
+ Application.Run(lForm);
+ except
+ on E: Exception do begin
+ MessageBox.Show(E.Message);
+ end;
+ end;
+end;
+{$ENDREGION}
+
+const sWelcome: String =
+ 'Internet Pack HTTP Responses Test App'+
+ '
'+
+ 'Valid links:'+
+ ' '+
+ '/home show this page'+
+ ' '+
+ '/file send back a file (this .exe)'+
+ ' '+
+ '/bytes send back a buffer of random bytes'+
+ ' '+
+ '/error Display a custom error';
+
+method MainForm.llblinkLabel1_LinkClicked(sender: System.Object; e: System.Windows.Forms.LinkLabelLinkClickedEventArgs);
+begin
+ Process.Start(llblinkLabel1.Text);
+end;
+
+method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs);
+begin
+ httpServer.Active := true;
+end;
+
+method MainForm.MainForm_Closed(sender: System.Object; e: System.EventArgs);
+begin
+ httpServer.Active := false;
+end;
+
+method MainForm.httpServer_OnHttpRequest(aSender: System.Object; ea: RemObjects.InternetPack.Http.OnHttpRequestArgs);
+var
+ lBuffer: array of byte;
+ lExeName: String;
+ lRandom: Random;
+begin
+ lb_Log.Invoke(method begin
+ lb_Log.Items.Add(ea.Request.Header.RequestPath);
+ end);
+
+ case (ea.Request.Header.RequestPath) of
+ //---------------------------------------------------
+ '/', '/home': begin
+ ea.Response.ContentString := sWelcome;
+ ea.Response.Header.SetHeaderValue('Content-Type', 'text/html');
+ end;
+ //---------------------------------------------------
+ '/bytes': begin
+ lBuffer := new byte[256];
+ lRandom := new Random();
+ lRandom.NextBytes(lBuffer);
+ ea.Response.ContentBytes := lBuffer;
+ ea.Response.Header.SetHeaderValue('Content-Disposition', 'filename=random.bin');
+ ea.Response.Header.SetHeaderValue('Content-Type', 'application/binary');
+ end;
+ //---------------------------------------------------
+ '/error': begin
+ ea.Response.SendError(555, 'Custom Error', 'A custom error message');
+ end;
+ //---------------------------------------------------
+ '/file': begin
+ lExeName := Self.GetType().Assembly.Location;
+ try
+ ea.Response.ContentStream :=
+ new FileStream(
+ lExeName,
+ FileMode.Open,
+ FileAccess.Read,
+ FileShare.Read
+ );
+ ea.Response.Header.SetHeaderValue(
+ 'Content-Disposition',
+ String.Format('filename="{0}"',
+ Path.GetFileName(lExeName))
+ );
+ ea.Response.Header.SetHeaderValue('Content-Type', 'application/binary');
+ ea.Response.CloseStream := true;
+ except
+ on e: Exception do begin
+ ea.Response.SendError(404, String.Format('File {0} not found', lExeName), e);
+ end;
+ end;
+ end
+ //---------------------------------------------------
+ else ea.Response.SendError(404, 'Requested path not found');
+ //---------------------------------------------------
+ end;
+end;
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/HTTP Responses/Main.resx b/Samples/Oxygene/HTTP Responses/Main.resx
new file mode 100644
index 0000000..cf05be8
--- /dev/null
+++ b/Samples/Oxygene/HTTP Responses/Main.resx
@@ -0,0 +1,503 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ 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
+ KwB7ezUASEhIAExMTABUVEwAX19XAFtbWwBeXl4Ae3tMAGppUgByclMAenpUAGNjYwBlZWUAaWlpAH5+
+ YgBxcXEAdXV1AH5+fgCDgwAAi4sAAJSUAACenggAi4sRAKmpGAC0tCoAuLg7AMC/OwCDg0AAi4pKAIGB
+ XACSkl8AhYVqAJubYACVlHUAo6JrAK6tcQCoqHwAy8pLAM7NXADW1VwA2dhsANvaewDh4W4A7ex/AIqK
+ igCSkpIAlZWVAJycnACioqIAqqqqAMXEhgDk44gA7u2MAPj3jwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9
+ DwYFAzEAAAAAAAAAAD8PEBwXDAoEAxEAAAAAADYRKEIlJCAfGwkCBQAAAF4UKURDQiUkIB8bFgMRAAAx
+ MEdFRENCJSQgHxsWAwBfMUlIR0VEQ0IlJCAaGgQTQTlVSkhHRURDQiUkGQ0IAz1OVjdKSC8rJyYjIhwO
+ CgU/PjQ4TEswLiwrQ0IeIBkGXE9TTVdVSkhHRURDQiUcBgA9Y1lYV1VKSEdFRENCED0APVFlW1pXVUpI
+ R0VEKA8AAAA9YmVbWldVSkhHRhM9AAAAYD1UZFtaV1VKMC02AAAAAAAAPT1PUlA6MzFBAAAAAAAAAABh
+ XDY2P14AAAAAAPgfAADgBwAAwAMAAIABAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAEAAMAB
+ AADAAwAA8AcAAPgfAAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAACAgIB8eHh5vHR0drxsbG98ZGRn/FxcX/xYWFv8UFBT/ExMT/xEREf8PDw//Dg4O/wwM
+ DN8LCwuvCgoKbwkJCR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAlJSVfIyMjvyEhIf8fHx//Hh4e/xwcHP8bGxv/GRkZ/xcXF/8WFhb/FBQU/xMT
+ E/8RERH/Dw8P/w4ODv8MDAz/CwsL/wkJCf8ICAi/BwcHXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAKSkpTygoKN8mJib/JCQk/yMjI/8hISH/Hx8f/x4eHv8cHBz/Gxsb/xkZ
+ Gf8XFxf/FhYW/xQUFP8TExP/ERER/w8PD/8ODg7/DAwM/wsLC/8JCQn/CAgI/wYGBt8FBQVPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLh8sLCy/Kysr/ykpKf8oKCj/JiYm/yQkJP8jIyP/ISEh/x8f
+ H/8eHh7/HBwc/xsbG/8ZGRn/FxcX/xYWFv8UFBT/ExMT/xEREf8PDw//Dg4O/wwMDP8LCwv/CQkJ/wgI
+ CP8GBgb/BAQEvwQEBB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExTzAwMO8uLi7/LCws/ysrK/8pKSn/KCgo/yYm
+ Jv8kJCT/LS0e/z8/FP9MTA3/WFgH/1VVB/9TUwb/UFAG/05OBf9LSwX/PDwI/ywsC/8aGg//Dw8P/w4O
+ Dv8MDAz/CwsL/wkJCf8ICAj/BgYG/wQEBO8DAwNPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1NTV/MzMz/zExMf8wMDD/Li4u/yws
+ LP8rKyv/KSkp/0hIGf9lZQn/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1pa
+ AP9XVwD/Q0ME/ygoCf8ODg7/DAwM/wsLC/8JCQn/CAgI/wYGBv8EBAT/AwMDfwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OJ82Njb/NDQ0/zMz
+ M/8xMTH/MDAw/y4uLv9OThv/d3cF/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2Vl
+ AP9iYgD/X18A/11dAP9aWgD/V1cA/1RUAP9JSQH/JiYI/wwMDP8LCwv/CQkJ/wgICP8GBgb/BAQE/wMD
+ A58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7jzk5
+ Of84ODj/NjY2/zQ0NP8zMzP/PT0r/3R0C/+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3Fx
+ AP9ubgD/a2sA/2hoAP9lZQD/YmIA/19fAP9dXQD/WloA/1dXAP9UVAD/UVEA/z4+A/8UFAv/CwsL/wkJ
+ Cf8ICAj/BgYG/wQEBP8DAwOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAA+Pj5fPDw8/zs7O/85OTn/ODg4/zY2Nv9MTCf/iooD/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8
+ AP96egD/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1paAP9XVwD/VFQA/1FR
+ AP9KSgD/HBwJ/wsLC/8JCQn/CAgI/wYGBv8EBAT/AwMDXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAEFBQS9AQEDvPj4+/zw8PP87Ozv/OTk5/1xcI/+WlgD/k5MA/5CQAP+OjgD/i4sA/4iI
+ AP+FhQD/goIA/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP9iYgD/X18A/11d
+ AP9aWgD/V1cA/1RUAP9RUQD/Tk4A/yQkB/8LCwv/CQkJ/wgICP8GBgb/BAQE7wQEBC8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQ79BQUH/QEBA/z4+Pv88PDz/VFQv/52dBv+ZmQH/lpYA/5OT
+ AP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2ho
+ AP9lZQD/YmIA/19fAP9dXQD/WloA/1dXAP9UVAD/UVEA/05OAP8cHAn/CwsL/wkJCf8ICAj/BgYG/wQE
+ BL8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZGX0VFRf9DQ0P/QUFB/0BAQP9LSzn/np4U/6Gh
+ DP+dnQb/mZkB/5aWAP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0
+ AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1paAP9XVwD/VFQA/1FRAP9KSgD/FBQL/wsL
+ C/8JCQn/CAgI/wYGBv8FBQVfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0dH30ZGRv9FRUX/Q0ND/0FB
+ Qf+YmCP/qakX/6WlEv+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/
+ AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP9iYgD/X18A/11dAP9aWgD/V1cA/1RU
+ AP9RUQD/QkIC/wwMDP8LCwv/CQkJ/wgICP8GBgbfAAAAAAAAAAAAAAAAAAAAAAAAAABKSkpfSUlJ/0dH
+ R/9GRkb/RUVF/3R0N/+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uL
+ AP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2hoAP9lZQD/YmIA/19f
+ AP9dXQD/WloA/1dXAP9UVAD/UVEA/yoqB/8MDAz/CwsL/wkJCf8ICAj/BwcHXwAAAAAAAAAAAAAAAAAA
+ AABMTEzfS0tL/0lJSf9HR0f/TU1F/7CwMP+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aW
+ AP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0AP9xcQD/bm4A/2tr
+ AP9oaAD/ZWUA/15eAf9bWwH/XV0A/1paAP9XVwD/VFQA/01NAP8SEg3/DAwM/wsLC/8JCQn/CAgI3wAA
+ AAAAAAAAAAAAAE9PTy9OTk7/TExM/0tLS/9JSUn/fHtB/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6Wl
+ Ev+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP98fAD/enoA/3d3
+ AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP8wMBH/SUkH/11dAP9aWgD/V1cA/1RUAP8sLAj/Dg4O/wwM
+ DP8LCwv/CQkJ/wgICC8AAAAAAAAAAFFRUX9PT0//Tk5O/0xMTP9LS0v/tLNB/7+/Ov+8uzT/uLgv/7S0
+ Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KC
+ AP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2hoAP9JSQn/GRkZ/y4uEP9YWAH/WloA/1dX
+ AP9MTAL/Dw8P/w4ODv8MDAz/CwsL/woKCn8AAAAAAAAAAFNTU79RUVH/T09P/05OTv9kZEz/x8dG/8PD
+ QP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP+TkwD/kJAA/46O
+ AP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/JCQX/xkZ
+ Gf8cHBb/RkYH/1paAP9XVwD/Hh4O/w8PD/8ODg7/DAwM/wsLC78AAAAAAAAAAFRUVP9TU1P/UVFR/09P
+ T/+Ghk//y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZ
+ Af+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25u
+ AP9rawD/R0cM/xsbG/8ZGRn/FxcX/ycnEP9RUQL/MTEK/xEREf8PDw//Dg4O/wwMDP8AAAAAV1dXL1ZW
+ Vv9UVFT/U1NT/1FRUf+pqVT/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/fn45/6ysK/+wsCP/rawd/6mp
+ F/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6
+ AP93dwD/dHQA/3FxAP9ubgD/ZmYB/yEhGv8bGxv/GRkZ/xcXF/8aGhT/JiYP/xMTE/8RERH/Dw8P/w4O
+ Dv8NDQ0vWVlZP1hYWP9WVlb/VFRU/1NTU/+9vVr/09JX/8/OUf/Lykz/x8dG/6ysQv9eXkX/cnI//7i4
+ L/+0tCn/sLAj/62sHf+HhyP/VlYx/1RUL/9SUiz/UFAq/05OKP9MTCf/Skom/0hIJf9GRiT/REQi/0JC
+ If9AQCD/Pj4f/z09Hv87Oxz/OTkb/zc3Gv81NRn/MzMY/yMjHP8cHBz/Gxsb/xkZGf8XFxf/FhYW/xQU
+ FP8TExP/ERER/w8PD/8ODg4/Wlpab1lZWf9YWFj/VlZW/1RUVP/a2WL/1tZc/9PSV//PzlH/i4tM/0tL
+ S/9JSUn/qag8/7y7NP+4uC//tLQp/7CwI/+YmCT/S0s5/zw8PP87Ozv/OTk5/1BQKv9OTij/TEwn/0pK
+ Jv9ISCX/RkYj/0REIv9DQyH/QUEg/z8/Hv89PR7/Ozsc/zk5G/83Nxr/NTUY/x8fH/8eHh7/HBwc/xsb
+ G/8ZGRn/FxcX/xYWFv8UFBT/ExMT/xEREf8QEBBvXFxcf1tbW/9ZWVn/WFhY/1ZWVv/e3Wj/2tli/729
+ Wv9oaFH/Tk5O/0xMTP9qakn/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/46OIf9kZC3/Ozs7/z8/
+ Nv9iYh//iooG/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/X18I/yEh
+ If8fHx//Hh4e/xwcHP8tLRT/WVkD/xcXF/8WFhb/FBQU/xMTE/8SEhJ/Xl5ef1xcXP9bW1v/WVlZ/1hY
+ WP/i4W7/mZle/1NTU/9RUVH/T09P/05OTv+bm0z/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/62s
+ Hf+pqRf/np4V/3R0If9GRjP/ODg4/05OKP9vbxT/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8
+ AP96egD/Q0MW/yMjI/8hISH/JCQd/0lJDf9oaAD/ZWUA/xkZGf8XFxf/FhYW/xQUFP8TExN/X19ff15e
+ Xv9cXFz/W1tb/1lZWf9paVv/VlZW/1RUVP9TU1P/UVFR/1hXUP+urlD/q6tL/6enR/+kpEL/oaE9/56e
+ OP+bmzT/l5cv/5SUKv+RkSX/jo4h/4qKHP+Hhxf/a2sg/0REMf82Njb/Ojox/1tbHP+Cggb/i4sA/4iI
+ AP+FhQD/goIA/39/AP9ycgX/JiYm/yQkJP83Nxr/Z2cE/25uAP9rawD/aGgA/xsbG/8ZGRn/FxcX/xYW
+ Fv8VFRV/YWFhP2BgYP9eXl7/XFxc/1tbW/9ZWVn/WFhY/1ZWVv9UVFT/U1NT/1FRUf9PT0//Tk5O/0xM
+ TP9LS0v/SUlJ/0dHR/9GRkb/RUVF/0NDQ/9BQUH/QEBA/z4+Pv88PDz/Ozs7/zk5Of84ODj/NjY2/zQ0
+ NP8zMzP/jo4A/4uLAP+IiAD/hYUA/4KCAP9UVBT/LS0l/1VVEP93dwD/dHQA/3FxAP9ubgD/YWED/xwc
+ HP8bGxv/GRkZ/xcXF/8WFhY/YmJiP2FhYf9gYGD/Xl5e/1xcXP9tbV//WVlZ/1hYWP9WVlb/VFRU/1NT
+ U/+1tVr/srFV/6+uUf+rq0z/qKhH/6WkQ/+ioT7/np45/5ubNf+YmDD/lZQr/5KRJv+OjiH/i4sd/4eH
+ GP+EhBP/gYEP/35+Df+BgQn/kJAA/46OAP+LiwD/iIgA/4WFAP9LSxr/dHQF/3x8AP96egD/d3cA/3R0
+ AP9xcQD/WloH/x4eHv8cHBz/Gxsb/xkZGf8YGBg/AAAAAGNjY/9hYWH/YGBg/15eXv+mpnD/v790/2Ji
+ W/9YWFj/VlZW/1RUVP+np1z/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7Cw
+ I/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4KCAv+FhQD/goIA/39/
+ AP98fAD/enoA/3d3AP90dAD/SUkQ/x8fH/8eHh7/HBwc/xsbG/8AAAAAAAAAAGRkZM9jY2P/YWFh/2Bg
+ YP+Dg2n/8fCF/+Tjff+GhmT/WFhY/1ZWVv92dln/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/
+ Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uL
+ AP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/PDwY/yEhIf8fHx//Hh4e/xwcHM8AAAAAAAAAAGZm
+ Zp9kZGT/Y2Nj/2FhYf9gYGD/6+qI//Hwhf/t7H//xsVy/2pqXP9WVlb/u7tj/9rZYv/W1lz/09JX/8/O
+ Uf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aW
+ AP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP90dAL/JCQk/yMjI/8hISH/Hx8f/x4e
+ Hp8AAAAAAAAAAGdnZ09mZmb/ZGRk/2NjY/9hYWH/tbV6//X0i//x8IX/7ex//+HgeP+WlmT/iopf/97d
+ aP/a2WL/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6Wl
+ Ev+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP9XVxH/JiYm/yQk
+ JP8jIyP/ISEh/yAgIE8AAAAAAAAAAAAAAABnZ2fvZmZm/2RkZP9jY2P/dXRo//n4kP/19Iv/8fCF/+3s
+ f//p6Xn/wsJt/9nYbP/e3Wj/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0
+ Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KC
+ AP80NCT/KCgo/yYmJv8kJCT/IyMj7wAAAAAAAAAAAAAAAAAAAABpaWl/aGho/2ZmZv9kZGT/Y2Nj/8LB
+ gv/5+JD/9fSL//Hwhf/t7H//6el5/+bldP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PD
+ QP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP+TkwD/kJAA/46O
+ AP+LiwD/iIgA/2RkEP8rKyv/KSkp/ygoKP8mJib/JSUlfwAAAAAAAAAAAAAAAAAAAABqamofaWlp/2ho
+ aP9mZmb/ZGRk/2xsZv/z8pL/+fiQ//X0i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PS
+ V//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZ
+ Af+WlgD/k5MA/5CQAP+OjgD/hYUD/zQ0K/8sLCz/Kysr/ykpKf8oKCj/JiYmHwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAampqf2lpaf9oaGj/ZmZm/2RkZP+Tk3T//PuW//n4kP/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lh
+ bv/e3Wj/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mp
+ F/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/Tk4i/zAwMP8uLi7/LCws/ysrK/8pKSmPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trD2pqau9paWn/aGho/2ZmZv9kZGT/sbB+//z7lv/5+JD/9fSL//Hw
+ hf/t7H//6el5/+bldP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4
+ L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP9kZBr/MzMz/zExMf8wMDD/Li4u/yws
+ LO8rKysPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtra09qamr/aWlp/2hoaP9mZmb/ZGRk/8TE
+ hf/8+5b/+fiQ//X0i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PSV//PzlH/y8pM/8fH
+ Rv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/3V1Ff82Njb/NDQ0/zMz
+ M/8xMTH/MDAw/y4uLk8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABra2uPampq/2lp
+ af9oaGj/ZmZm/2RkZP+6uoH//PuW//n4kP/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lhbv/e3Wj/2tli/9bW
+ XP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mpF/+lpRL/dHQg/zk5
+ Of84ODj/NjY2/zQ0NP8zMzP/MTExjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa2trz2pqav9paWn/aGho/2ZmZv9kZGT/k5N0//Pykv/5+JD/9fSL//Hwhf/t7H//6el5/+bl
+ dP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/6al
+ H/9fXzL/PDw8/zs7O/85OTn/ODg4/zY2Nv80NDTPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trD2tra89qamr/aWlp/2hoaP9mZmb/ZGRk/3Z2af/CwYL/+fiQ//X0
+ i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7
+ NP+4uC//iYky/09PPf9AQED/Pj4+/zw8PP87Ozv/OTk5/zg4OM82NjYPAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtraw9ra2vPampq/2lpaf9oaGj/ZmZm/2Rk
+ ZP9jY2P/iIhu/7++fv/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lhbv/e3Wj/2tli/9bWXP/T0lf/z85R/8vK
+ TP/Hx0b/w8NA/5KSP/9jY0H/RUVF/0NDQ/9BQUH/QEBA/z4+Pv88PDz/Ozs7zzo6Og8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trn2pq
+ av9paWn/aGho/2ZmZv9kZGT/Y2Nj/2FhYf9paWP/lpZu/7m4df/R0Xj/6el5/+bldP/i4W7/3t1o/9rZ
+ Yv/W1lz/urlV/56eUP97e0z/UlJK/0lJSf9HR0f/RkZG/0VFRf9DQ0P/QUFB/0BAQP8+Pj6fAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGtra09qamrvaWlp/2hoaP9mZmb/ZGRk/2NjY/9hYWH/YGBg/15eXv9cXFz/W1tb/1lZ
+ Wf97e17/eXlc/1RUVP9TU1P/UVFR/09PT/9OTk7/TExM/0tLS/9JSUn/R0dH/0ZGRv9FRUX/Q0ND70FB
+ QU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABra2sPampqn2lpaf9oaGj/ZmZm/2RkZP9jY2P/YWFh/2Bg
+ YP9eXl7/XFxc/1tbW/9ZWVn/WFhY/1ZWVv9UVFT/U1NT/1FRUf9PT0//Tk5O/0xMTP9LS0v/SUlJ/0dH
+ R/9GRkafRUVFDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpqah9paWmfaGho/2Zm
+ Zv9kZGT/Y2Nj/2FhYf9gYGD/Xl5e/1xcXP9bW1v/WVlZ/1hYWP9WVlb/VFRU/1NTU/9RUVH/T09P/05O
+ Tv9MTEz/S0tLn0lJSR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAaGhoD2dnZ19mZmavZGRk72NjY/9hYWH/YGBg/15eXv9cXFz/W1tb/1lZWf9YWFj/VlZW/1RU
+ VP9TU1PvUVFRr09PT19PT08PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNjYy9iYmJPYWFhf19fX39eXl5/XFxcf1pa
+ Wn9ZWVl/V1dXT1ZWVi8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD//wAA//8AAP/8AAA//wAA//AAAA//
+ AAD/wAAAA/8AAP+AAAAB/wAA/wAAAAD/AAD+AAAAAH8AAPwAAAAAPwAA+AAAAAAfAADwAAAAAA8AAPAA
+ AAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAD8AAP4A
+ AAAAfwAA/4AAAAH/AAD/wAAAA/8AAP/gAAAH/wAA//gAAB//AAD//gAAf/8AAP//4Af//wAAKAAAACAA
+ AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAhISEPHx8fXx0dHZ8aGhrPGBgY/xUVFf8TExP/ERER/w4ODu8MDAy/CgoKfwgI
+ CC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAApKSkfJiYmnyQkJO8hISH/Hx8f/x0dHf8aGhr/GBgY/xUVFf8TExP/ERER/w4O
+ Dv8MDAz/CQkJ/wcHB88GBgZfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAALS0tfysrK/8oKCj/JiYm/yQkJP8hISH/Hx8f/x0dHf8aGhr/GBgY/xUV
+ Ff8TExP/ERER/w4ODv8MDAz/CQkJ/wcHB/8FBQW/BAQELwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAANTU1DzIyMs8vLy//LS0t/ysrK/8oKCj/NjYf/1JSD/9dXQj/bW0A/2lp
+ AP9kZAD/YGAA/1NTAv9CQgX/KioK/xISDf8MDAz/CQkJ/wcHB/8FBQXvAwMDXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OQ83NzfPNDQ0/zIyMv8vLy//Q0Mi/2xsCv9+fgD/enoA/3V1
+ AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/T08A/y8vBv8MDAz/CQkJ/wcHB/8FBQX/AwMDXwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4POzs7zzk5Of83Nzf/NDQ0/2BgGP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/0NDAv8YGAn/CQkJ/wcH
+ B/8FBQX/AwMDXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQK8+Pj7/Ozs7/zk5Of9zcxT/k5MA/4+P
+ AP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/0tL
+ AP8YGAn/CQkJ/wcHB/8FBQX/BAQELwAAAAAAAAAAAAAAAAAAAABFRUVPQkJC/0BAQP8+Pj7/fHsf/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xc
+ AP9YWAD/U1MA/0tLAP8YGAn/CQkJ/wcHB/8FBQXPAAAAAAAAAAAAAAAAAAAAAEdHR99FRUX/QkJC/3Bw
+ Mf+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lp
+ AP9kZAD/YGAA/1xcAP9YWAD/U1MA/0dHAf8QEAv/CQkJ/wcHB/8GBgZfAAAAAAAAAABLS0tfSUlJ/0dH
+ R/9MTEP/rKwp/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1
+ AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/y8vBv8MDAz/CQkJ/wcHB98AAAAAAAAAAE5O
+ Ts9MTEz/SUlJ/4KCP/+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9bWwP/TU0G/1xcAP9YWAD/T08A/xISDf8MDAz/CQkJ/wgI
+ CD9TU1MPUVFR/05OTv9MTEz/vLxB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+P
+ AP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP8tLRP/NzcN/1dXAf9YWAD/Li4J/w4O
+ Dv8MDAz/CgoKj1VVVU9TU1P/UVFR/25uTv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/1FRCP8aGhr/HBwW/0VF
+ B/9HRwT/ERER/w4ODv8MDAzPV1dXf1VVVf9TU1P/kpJV/8/OUv/JyUn/xMNB/7a2Of+UlDb/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/yYm
+ Gf8aGhr/GBgY/ysrD/8TExP/ERER/w4ODv9aWlqPWFhY/1VVVf+fnlv/1dRa/8/OUv+qqkr/WVlI/5iY
+ PP+5uDD/s7Mn/62tH/9LSzn/Ozs7/zk5Of9PTyn/TEwn/0lJJf9GRiP/REQi/0FBIP8+Ph7/Ozsc/zg4
+ Gv81NRj/Hx8f/x0dHf8aGhr/GBgY/xUVFf8TExP/ERER/1xcXL9aWlr/WFhY/728Zf/S0WL/iopV/05O
+ Tv9bW0v/xMNB/76+OP+5uDD/s7Mn/62tH/+HhyP/XFwu/1hYKP95eRH/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/2trBP8hISH/Hx8f/yYmGf9SUgb/KioR/xUVFf8TExP/Xl5ev1xcXP9aWlr/np5l/2dn
+ WP9TU1P/UVFR/5aWUP/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/lpUU/2trIP9JSS3/XV0d/4OD
+ Bv+LiwD/hoYA/4KCAP9+fgD/UFAT/yQkJP9ERBL/aGgB/2lpAP8oKBX/GBgY/xUVFf9hYWF/X19f/1xc
+ XP9aWlr/WFhY/1VVVf9TU1P/UVFR/05OTv9MTEz/SUlJ/0dHR/9FRUX/QkJC/0BAQP8+Pj7/Ozs7/zk5
+ Of83Nzf/NDQ0/4ODBv+LiwD/hoYA/4KCAP84OCH/ZWUJ/3V1AP9xcQD/bW0A/x0dHf8aGhr/GBgY/2Nj
+ Y39hYWH/X19f/4uKaf+Ih2X/WFhY/1VVVf+Wllr/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/gYEC/3x8Av9+fgD/enoA/3V1AP9nZwT/Hx8f/x0d
+ Hf8aGhr/ZWVlP2RkZP9hYWH/e3tn//Hwhf++vnP/YWFa/2ZmWP/a2mP/1dRa/8/OUv/JyUn/xMNB/76+
+ OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/1dX
+ Df8hISH/Hx8f/x0dHb8AAAAAZmZm/2RkZP9hYWH/4+KH//Hwhf/i4Xv/hIRh/6yrYv/a2mP/1dRa/8/O
+ Uv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/QEAa/yQkJP8hISH/Hx8fbwAAAABoaGifZmZm/2RkZP+bmnT/9vaN//Hwhf/r6nz/y8pv/+Df
+ a//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+P
+ AP+LiwD/hoYA/3d3Bf8oKCj/JiYm/yQkJP8hISEfAAAAAGpqaj9oaGj/ZmZm/2RkZP/p6I//9vaN//Hw
+ hf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/T08c/ysrK/8oKCj/JiYmvwAAAAAAAAAAAAAAAGpqar9oaGj/ZmZm/4GB
+ bv/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/3JyD/8vLy//LS0t/ysrK/8pKSk/AAAAAAAAAAAAAAAAa2trL2pq
+ av9oaGj/ZmZm/56eeP/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+
+ OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+FhQr/Ojox/zIyMv8vLy//LS0trwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa2trb2pqav9oaGj/ZmZm/56eeP/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/O
+ Uv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/j48W/z8/Nv83Nzf/NDQ0/zIyMt8wMDAPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trn2pqav9oaGj/ZmZm/4uKcf/p6I//9vaN//Hwhf/r6nz/5uV0/+Df
+ a//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/319Lf9ERDv/Ozs7/zk5Of83NzfvNDQ0LwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trn2pqav9oaGj/ZmZm/21tZ/+urnr/4+KH//Hw
+ hf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/5iYPP9aWkH/QkJC/0BAQP8+Pj7/Ozs77zk5
+ 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
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/HTTP Spy/App.ico b/Samples/Oxygene/HTTP Spy/App.ico
new file mode 100644
index 0000000..2103830
Binary files /dev/null and b/Samples/Oxygene/HTTP Spy/App.ico differ
diff --git a/Samples/Oxygene/HTTP Spy/AssemblyInfo.pas b/Samples/Oxygene/HTTP Spy/AssemblyInfo.pas
new file mode 100644
index 0000000..c03946c
--- /dev/null
+++ b/Samples/Oxygene/HTTP Spy/AssemblyInfo.pas
@@ -0,0 +1,49 @@
+namespace HTTPSpy;
+
+interface
+
+uses
+ System.Reflection;
+
+[assembly: AssemblyTitle('')]
+[assembly: AssemblyDescription('')]
+[assembly: AssemblyConfiguration('')]
+[assembly: AssemblyCompany('')]
+[assembly: AssemblyProduct('')]
+[assembly: AssemblyCopyright('')]
+[assembly: AssemblyTrademark('')]
+[assembly: AssemblyCulture('')]
+[assembly: AssemblyVersion('1.0.0.1')]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory, which in Chrome by default is the
+// same as the project directory. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile('mykey.snk')]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile('')]
+[assembly: AssemblyKeyName('')]
+
+implementation
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/HTTP Spy/HTTPSpy.2008.sln b/Samples/Oxygene/HTTP Spy/HTTPSpy.2008.sln
new file mode 100644
index 0000000..78db54c
--- /dev/null
+++ b/Samples/Oxygene/HTTP Spy/HTTPSpy.2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "HTTPSpy", "HTTPSpy.oxygene", "{68032377-D8D8-4FEB-88F9-92658A6A56A2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Debug|Default.ActiveCfg = Debug
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Debug|Default.Build.0 = Debug
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Release|Default.ActiveCfg = Release
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/HTTP Spy/HTTPSpy.2010.sln b/Samples/Oxygene/HTTP Spy/HTTPSpy.2010.sln
new file mode 100644
index 0000000..22f1453
--- /dev/null
+++ b/Samples/Oxygene/HTTP Spy/HTTPSpy.2010.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "HTTPSpy", "HTTPSpy.oxygene", "{68032377-D8D8-4FEB-88F9-92658A6A56A2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Debug|Default.ActiveCfg = Debug
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Debug|Default.Build.0 = Debug
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Release|Default.ActiveCfg = Release
+ {68032377-D8D8-4FEB-88F9-92658A6A56A2}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/HTTP Spy/HTTPSpy.Sample.html b/Samples/Oxygene/HTTP Spy/HTTPSpy.Sample.html
new file mode 100644
index 0000000..781cf29
--- /dev/null
+++ b/Samples/Oxygene/HTTP Spy/HTTPSpy.Sample.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+ HTTPSpy Sample
+
+
+
+
Purpose
+
+This example demonstrates how HTTP works.
+With help of the HttpClient components, we can send a HttpClientRequest and retrieve back a HttpClientResponse. The application shows us the request and response header parameters and the context of the response in text and hex view.
+ Also, you have the ability to add your custom request header parameter.
+
+
+
Examine the Code
+
+
+See the btnSubmit_Click handler. This is the main function where we create and configure the HttpClientRequest and send it to the server with the help of the
+ HttpClient component.
+In order to get response from the server we call the Dispatch function with our HttpClientRequest instance as a parameter.
+
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run the application.
+
Using an existing URL, click on the "Submit" button. See the response of the request on the Result page.
+ The sample shows how we can use the SMTP client component for sending emails.
+
+
+
+
Examine the code
+
+
Sending emails is pretty simple (see MainForm's btnSendEMail_Click handler).
+ We create and configure an instance of MailMessage.
+
Next we put the SmtpClient component onto the form and configure it.
+
After configuring these components we can send the message (smtpClient.SendMessage(msg);).
+
+
+
Getting started
+
+
Compile the solution.
+
Run the Smtp client application.
+
Specify the outgoing mail server (if your mail server requires authentication you
+ will need to specify login and password).
+
Create an email and send it
+
+
+
+
+
diff --git a/Samples/Oxygene/SMTP Client/SMTP Client.oxygene b/Samples/Oxygene/SMTP Client/SMTP Client.oxygene
new file mode 100644
index 0000000..0d38206
--- /dev/null
+++ b/Samples/Oxygene/SMTP Client/SMTP Client.oxygene
@@ -0,0 +1,48 @@
+
+
+ SMTP Client Sample
+ WinExe
+ SMTP Client Sample
+ False
+ False
+ App.ico
+ Release
+ {CF645DB2-9A6A-45D1-ADBA-59FEF96B5103}
+ v2.0
+
+
+ DEBUG;TRACE;
+ .\bin\Debug
+ True
+
+
+ .\bin\Release
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+ SMTP_Client_Sample.MainForm
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/Sample Server/App.ico b/Samples/Oxygene/Sample Server/App.ico
new file mode 100644
index 0000000..4680a4e
Binary files /dev/null and b/Samples/Oxygene/Sample Server/App.ico differ
diff --git a/Samples/Oxygene/Sample Server/AssemblyInfo.pas b/Samples/Oxygene/Sample Server/AssemblyInfo.pas
new file mode 100644
index 0000000..66f4faf
--- /dev/null
+++ b/Samples/Oxygene/Sample Server/AssemblyInfo.pas
@@ -0,0 +1,49 @@
+namespace SampleServer;
+
+interface
+
+uses
+ System.Reflection;
+
+[assembly: AssemblyTitle('')]
+[assembly: AssemblyDescription('')]
+[assembly: AssemblyConfiguration('')]
+[assembly: AssemblyCompany('')]
+[assembly: AssemblyProduct('')]
+[assembly: AssemblyCopyright('')]
+[assembly: AssemblyTrademark('')]
+[assembly: AssemblyCulture('')]
+[assembly: AssemblyVersion('1.0.0.1')]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory, which in Chrome by default is the
+// same as the project directory. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile('mykey.snk')]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile('')]
+[assembly: AssemblyKeyName('')]
+
+implementation
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/Sample Server/HttpRoot/Styles.css b/Samples/Oxygene/Sample Server/HttpRoot/Styles.css
new file mode 100644
index 0000000..c8e0628
--- /dev/null
+++ b/Samples/Oxygene/Sample Server/HttpRoot/Styles.css
@@ -0,0 +1,103 @@
+body
+{
+ background-color: #f7f7f7;
+ margin-top: 15px;
+ margin-bottom: 15px;
+ margin-left: 15px;
+ margin-right: 15px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-family: tahoma, verdana, sans-serif;
+ font-size: 10pt;
+ width: 700px;
+ color: #000000;
+}
+p
+{
+ padding-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0.5em;
+}
+ul
+{
+ padding-top: 0;
+ padding-bottom: 0;
+ list-style-type: disc;
+}
+li
+{
+ padding-top: 0;
+ padding-bottom: 0;
+}
+img
+{
+ margin: 5px;
+ border-width: 0;
+}
+table
+{
+ background-color: #f7f7f7;
+ margin: 15px;
+ padding: 0px;
+ font-size: 10pt;
+}
+tr
+{
+ background-color: #f7f7f7;
+ margin: 15px;
+ padding: 0px;
+ font-size: 10pt;
+}
+td, th
+{
+ background-color: #f7f7f7;
+ margin: 0;
+ padding: 5px;
+ font-size: 10pt;
+}
+td ul
+{
+ padding-left: 2em;
+}
+
+img:left { margin-left: 0; }
+img:right { margin-right: 0; }
+p.h1
+{
+ margin-top: 1em;
+ margin-bottom: 0.5px;
+ padding-bottom:0px;
+ font-size:13pt;
+ font-weight:bold;
+}
+p.h2
+{
+ margin-top: 1em;
+ margin-bottom: 0.5px;
+ padding-bottom:0px;
+ font-size:11pt;
+ font-weight:bold;
+}
+p.h3
+{
+ margin-top: 1em;
+ margin-bottom: 0.5px;
+ padding-bottom:0px;
+ font-size:10pt;
+ font-weight:bold;
+}
+pre
+{
+ margin-top:0px;
+ margin-bottom:0px;
+ margin-left:0px;
+ margin-right:0px;
+}
+.spaced
+{
+ letter-spacing:1px;
+ color:#000060;
+}
diff --git a/Samples/Oxygene/Sample Server/HttpRoot/index.html b/Samples/Oxygene/Sample Server/HttpRoot/index.html
new file mode 100644
index 0000000..ffaee1e
--- /dev/null
+++ b/Samples/Oxygene/Sample Server/HttpRoot/index.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+ Sample Server
+
+
+
+
Purpose
+
+This example shows how easy it is to create a simple custom Http server. The
+
+SimpleHttpServer class is a file-based HTTP Server that will make all files in (and below) the specified RootPath folder available via HTTP.
+
+
+
Examine the Code
+
+
look at the ActivateServers procedure to see how to create and configure the HTTP server. The
+RootPath property should reference the folder in our file system which we want to expose.
+
+
+See the OnHttpRequest handler. There we can catch and process any incoming requests that come to the server.
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run application.
+
Configure server properties and activate the servers.
+
Click link on the main window to open home page of our server in web browser.
+This example shows how easy it is to create a simple custom Http server. The
+
+SimpleHttpServer class is a file-based HTTP Server that will make all files in (and below) the specified RootPath folder available via HTTP.
+
+
+
Examine the Code
+
+
look at the ActivateServers procedure to see how to create and configure the HTTP server. The
+RootPath property should reference the folder in our file system which we want to expose.
+
+
+See the OnHttpRequest handler. There we can catch and process any incoming requests that come to the server.
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run application.
+
Configure server properties and activate the servers.
+
Click link on the main window to open home page of our server in web browser.
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/Sample Server/SampleServer.oxygene b/Samples/Oxygene/Sample Server/SampleServer.oxygene
new file mode 100644
index 0000000..b088e21
--- /dev/null
+++ b/Samples/Oxygene/Sample Server/SampleServer.oxygene
@@ -0,0 +1,57 @@
+
+
+
+ SampleServer
+ WinExe
+ SampleServer
+ False
+ False
+ App.ico
+ Release
+ {90E5FBCE-0445-40DB-BEC8-933B393487FE}
+ v2.0
+
+
+ DEBUG;TRACE;
+ .\bin\Debug
+ True
+
+
+ .\bin\Release
+ False
+
+
+
+
+ $(ProgramFiles)\RemObjects Software\Internet Pack for .NET\Bin\RemObjects.InternetPack.dll
+
+
+
+
+
+
+
+
+
+
+
+ Form
+ SampleServer.MainForm
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/Virtual FTP/App.ico b/Samples/Oxygene/Virtual FTP/App.ico
new file mode 100644
index 0000000..2103830
Binary files /dev/null and b/Samples/Oxygene/Virtual FTP/App.ico differ
diff --git a/Samples/Oxygene/Virtual FTP/AssemblyInfo.pas b/Samples/Oxygene/Virtual FTP/AssemblyInfo.pas
new file mode 100644
index 0000000..448c14e
--- /dev/null
+++ b/Samples/Oxygene/Virtual FTP/AssemblyInfo.pas
@@ -0,0 +1,49 @@
+namespace VirtualFTP;
+
+interface
+
+uses
+ System.Reflection;
+
+[assembly: AssemblyTitle('')]
+[assembly: AssemblyDescription('')]
+[assembly: AssemblyConfiguration('')]
+[assembly: AssemblyCompany('')]
+[assembly: AssemblyProduct('')]
+[assembly: AssemblyCopyright('')]
+[assembly: AssemblyTrademark('')]
+[assembly: AssemblyCulture('')]
+[assembly: AssemblyVersion('1.0.0.1')]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory, which in Chrome by default is the
+// same as the project directory. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile('mykey.snk')]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile('')]
+[assembly: AssemblyKeyName('')]
+
+implementation
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/Virtual FTP/Main.pas b/Samples/Oxygene/Virtual FTP/Main.pas
new file mode 100644
index 0000000..d422698
--- /dev/null
+++ b/Samples/Oxygene/Virtual FTP/Main.pas
@@ -0,0 +1,271 @@
+namespace VirtualFTP;
+
+interface
+
+uses
+ System.Windows.Forms,
+ System.Drawing,
+ System.IO,
+ RemObjects.InternetPack.Ftp.VirtualFtp;
+
+type
+ ///
+ /// Summary description for MainForm.
+ ///
+ MainForm = class(System.Windows.Forms.Form)
+ {$REGION Windows Form Designer generated fields}
+ private
+ components: System.ComponentModel.Container := nil;
+ method InitializeComponent;
+ assembly
+ pictureBox1: System.Windows.Forms.PictureBox;
+ llShortcut: System.Windows.Forms.LinkLabel;
+ label1: System.Windows.Forms.Label;
+ txtLog: System.Windows.Forms.TextBox;
+ GroupBox1: System.Windows.Forms.GroupBox;
+ btnStartStop: System.Windows.Forms.Button;
+ {$ENDREGION}
+ private
+ fRootFolder: VirtualFolder;
+ fUserManager: IFtpUserManager;
+ fFtpServer: VirtualFtpServer;
+ port: Integer := 4444;
+ method MainForm_Closed(sender: System.Object; e: System.EventArgs);
+ method llShortcut_LinkClicked(sender: System.Object; e: System.Windows.Forms.LinkLabelLinkClickedEventArgs);
+ method addToLog(line: String);
+ method btnStartStop_Click(sender: System.Object; e: System.EventArgs);
+ protected
+ method Dispose(aDisposing: boolean); override;
+ public
+ constructor;
+ class method Main;
+ method StartServer(aPort: Integer);
+ method StopServer();
+ end;
+
+implementation
+
+{$REGION Construction and Disposition}
+constructor MainForm;
+begin
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+end;
+
+method MainForm.Dispose(aDisposing: boolean);
+begin
+ if aDisposing then begin
+ if assigned(components) then
+ components.Dispose();
+
+ //
+ // TODO: Add custom disposition code here
+ //
+ end;
+ inherited Dispose(aDisposing);
+end;
+{$ENDREGION}
+
+{$REGION Windows Form Designer generated code}
+method MainForm.InitializeComponent;
+begin
+ var resources: System.ComponentModel.ComponentResourceManager := new System.ComponentModel.ComponentResourceManager(typeOf(MainForm));
+ self.btnStartStop := new System.Windows.Forms.Button();
+ self.GroupBox1 := new System.Windows.Forms.GroupBox();
+ self.txtLog := new System.Windows.Forms.TextBox();
+ self.label1 := new System.Windows.Forms.Label();
+ self.llShortcut := new System.Windows.Forms.LinkLabel();
+ self.pictureBox1 := new System.Windows.Forms.PictureBox();
+ self.GroupBox1.SuspendLayout();
+ (self.pictureBox1 as System.ComponentModel.ISupportInitialize).BeginInit();
+ self.SuspendLayout();
+ //
+ // btnStartStop
+ //
+ self.btnStartStop.Anchor := ((System.Windows.Forms.AnchorStyles.Top or System.Windows.Forms.AnchorStyles.Right) as System.Windows.Forms.AnchorStyles);
+ self.btnStartStop.Location := new System.Drawing.Point(231, 8);
+ self.btnStartStop.Name := 'btnStartStop';
+ self.btnStartStop.Size := new System.Drawing.Size(75, 23);
+ self.btnStartStop.TabIndex := 13;
+ self.btnStartStop.Text := 'Start';
+ self.btnStartStop.Click += new System.EventHandler(@self.btnStartStop_Click);
+ //
+ // GroupBox1
+ //
+ self.GroupBox1.Anchor := ((((System.Windows.Forms.AnchorStyles.Top or System.Windows.Forms.AnchorStyles.Bottom)
+ or System.Windows.Forms.AnchorStyles.Left)
+ or System.Windows.Forms.AnchorStyles.Right) as System.Windows.Forms.AnchorStyles);
+ self.GroupBox1.Controls.Add(self.txtLog);
+ self.GroupBox1.Location := new System.Drawing.Point(8, 103);
+ self.GroupBox1.Name := 'GroupBox1';
+ self.GroupBox1.Size := new System.Drawing.Size(298, 132);
+ self.GroupBox1.TabIndex := 12;
+ self.GroupBox1.TabStop := false;
+ self.GroupBox1.Text := 'Log';
+ //
+ // txtLog
+ //
+ self.txtLog.Anchor := ((((System.Windows.Forms.AnchorStyles.Top or System.Windows.Forms.AnchorStyles.Bottom)
+ or System.Windows.Forms.AnchorStyles.Left)
+ or System.Windows.Forms.AnchorStyles.Right) as System.Windows.Forms.AnchorStyles);
+ self.txtLog.Location := new System.Drawing.Point(8, 16);
+ self.txtLog.Multiline := true;
+ self.txtLog.Name := 'txtLog';
+ self.txtLog.ScrollBars := System.Windows.Forms.ScrollBars.Both;
+ self.txtLog.Size := new System.Drawing.Size(282, 108);
+ self.txtLog.TabIndex := 6;
+ self.txtLog.WordWrap := false;
+ //
+ // label1
+ //
+ self.label1.Anchor := (((System.Windows.Forms.AnchorStyles.Top or System.Windows.Forms.AnchorStyles.Left)
+ or System.Windows.Forms.AnchorStyles.Right) as System.Windows.Forms.AnchorStyles);
+ self.label1.Location := new System.Drawing.Point(3, 38);
+ self.label1.Name := 'label1';
+ self.label1.Size := new System.Drawing.Size(309, 24);
+ self.label1.TabIndex := 11;
+ self.label1.Text := 'In order to login on ftp please use login: test; password: test.';
+ self.label1.TextAlign := System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // llShortcut
+ //
+ self.llShortcut.Anchor := (((System.Windows.Forms.AnchorStyles.Top or System.Windows.Forms.AnchorStyles.Left)
+ or System.Windows.Forms.AnchorStyles.Right) as System.Windows.Forms.AnchorStyles);
+ self.llShortcut.Location := new System.Drawing.Point(4, 62);
+ self.llShortcut.Name := 'llShortcut';
+ self.llShortcut.Size := new System.Drawing.Size(300, 33);
+ self.llShortcut.TabIndex := 10;
+ self.llShortcut.TextAlign := System.Drawing.ContentAlignment.MiddleCenter;
+ self.llShortcut.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(@self.llShortcut_LinkClicked);
+ //
+ // pictureBox1
+ //
+ self.pictureBox1.Image := (resources.GetObject('pictureBox1.Image') as System.Drawing.Image);
+ self.pictureBox1.Location := new System.Drawing.Point(8, 7);
+ self.pictureBox1.Name := 'pictureBox1';
+ self.pictureBox1.Size := new System.Drawing.Size(120, 30);
+ self.pictureBox1.SizeMode := System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+ self.pictureBox1.TabIndex := 9;
+ self.pictureBox1.TabStop := false;
+ //
+ // MainForm
+ //
+ self.AutoScaleBaseSize := new System.Drawing.Size(5, 13);
+ self.ClientSize := new System.Drawing.Size(314, 242);
+ self.Controls.Add(self.btnStartStop);
+ self.Controls.Add(self.GroupBox1);
+ self.Controls.Add(self.label1);
+ self.Controls.Add(self.llShortcut);
+ self.Controls.Add(self.pictureBox1);
+ self.Icon := (resources.GetObject('$this.Icon') as System.Drawing.Icon);
+ self.MinimumSize := new System.Drawing.Size(330, 280);
+ self.Name := 'MainForm';
+ self.Text := 'Virtual FTP';
+ self.Closed += new System.EventHandler(@self.MainForm_Closed);
+ self.GroupBox1.ResumeLayout(false);
+ self.GroupBox1.PerformLayout();
+ (self.pictureBox1 as System.ComponentModel.ISupportInitialize).EndInit();
+ self.ResumeLayout(false);
+ self.PerformLayout();
+end;
+{$ENDREGION}
+
+{$REGION Application Entry Point}
+[STAThread]
+class method MainForm.Main;
+begin
+ Application.EnableVisualStyles();
+
+ try
+ with lForm := new MainForm() do
+ Application.Run(lForm);
+ except
+ on E: Exception do begin
+ MessageBox.Show(E.Message);
+ end;
+ end;
+end;
+{$ENDREGION}
+
+method MainForm.btnStartStop_Click(sender: System.Object; e: System.EventArgs);
+begin
+ If (btnStartStop.Text = 'Start') Then Begin
+ addToLog('Starting Virtual FTP on ' + port.ToString() + ' port...');
+ StartServer(port);
+ llShortcut.Text := String.Format('ftp://localhost:{0}/', port);
+ addToLog('Virtual FTP is running under ' + Environment.OSVersion.ToString());
+ btnStartStop.Text := 'Stop';
+ End Else Begin
+ addToLog('Shutting down Virtual FTP ...');
+ StopServer();
+ llShortcut.Text := '';
+ addToLog('Virtual FTP is stopped.');
+ btnStartStop.Text := 'Start';
+ End
+end;
+
+method MainForm.addToLog(line: String);
+begin
+ txtLog.Invoke(method begin
+ txtLog.Text := txtLog.Text +
+ System.DateTime.Now.ToLongTimeString() +
+ ': ' +
+ line +
+ Environment.NewLine;
+ end);
+end;
+
+method MainForm.StartServer(aPort: Integer);
+var lDiskFolder: String;
+begin
+ lDiskFolder := Path.GetDirectoryName(typeof(Self).Assembly.Location) + '..\..\..\';
+
+ fRootFolder := New VirtualFolder(nil, '[ROOT]');
+ fRootFolder.Add(New VirtualFolder(nil, 'virtual'));
+ fRootFolder.Add(New DiscFolder(nil, 'drive-c', 'c:\'));
+ fRootFolder.Add(New DiscFolder(nil, 'disc', lDiskFolder));
+ fRootFolder.Add(New EmptyFile(nil, '=== Welcome to the FTP ==='));
+
+ fUserManager := New UserManager();
+ UserManager(fUserManager).AddUser('test', 'test');
+
+ fFtpServer := New VirtualFtpServer();
+ fFtpServer.Port := aPort;
+ fFtpServer.Timeout := 60 * 1000; {* 1 minute *}
+ if fFtpServer.BindingV4<>nil then
+ fFtpServer.BindingV4.ListenerThreadCount := 10
+ else
+ fFtpServer.BindingV6.ListenerThreadCount := 10;
+ fFtpServer.RootFolder := fRootFolder;
+ fFtpServer.UserManager := fUserManager;
+ fFtpServer.ServerName := 'VirtualFTP Sample - powered by RemObjects Internet Pack for .NET';
+
+ fFtpServer.Open();
+
+ addToLog('VirtualFTP 0.3 BETA - started up');
+ end;
+
+method MainForm.StopServer();
+begin
+ If (fFTPServer<>nil) Then
+ fFtpServer.Close()
+end;
+
+method MainForm.llShortcut_LinkClicked(sender: System.Object; e: System.Windows.Forms.LinkLabelLinkClickedEventArgs);
+begin
+ If llShortcut.Text <> '' Then
+ System.Diagnostics.Process.Start(llShortcut.Text);
+end;
+
+method MainForm.MainForm_Closed(sender: System.Object; e: System.EventArgs);
+begin
+ StopServer();
+end;
+
+end.
\ No newline at end of file
diff --git a/Samples/Oxygene/Virtual FTP/Main.resx b/Samples/Oxygene/Virtual FTP/Main.resx
new file mode 100644
index 0000000..a726801
--- /dev/null
+++ b/Samples/Oxygene/Virtual FTP/Main.resx
@@ -0,0 +1,582 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ Qk1GEgAAAAAAADYEAAAoAAAAeAAAAB4AAAABAAgAAAAAAAAAAADCHgAAwh4AAAABAAAAAQAAAAAA/wEB
+ Af8CAgL/AwMD/wQEBP8FBQX/BgYG/wcHB/8ICAj/CQkJ/woKCv8LCwv/DAwM/w0NDf8ODg7/Dw8P/xAQ
+ EP8RERH/EhIS/xMTE/8UFBT/FRUV/xYWFv8XFxf/GBgY/xkZGf8aGhr/Gxsb/xwcHP8dHR3/Hh4e/x8f
+ H/8gICD/ISEh/yIiIv8jIyP/JCQk/yUlJf8mJib/Jycn/ygoKP8pKSn/Kioq/ysrK/8sLCz/LS0t/y4u
+ Lv8vLy//MDAw/zExMf8yMjL/MzMz/zQ0NP81NTX/NjY2/zc3N/84ODj/OTk5/zo6Ov87Ozv/PDw8/z09
+ Pf8+Pj7/Pz8//0BAQP9BQUH/QkJC/0NDQ/9ERET/RUVF/0ZGRv9HR0f/SEhI/0lJSf9KSkr/S0tL/0xM
+ TP9NTU3/Tk5O/09PT/9QUFD/UVFR/1JSUv9TU1P/VFRU/1VVVf9WVlb/V1dX/1hYWP9ZWVn/Wlpa/1tb
+ W/9cXFz/XV1d/15eXv9fX1//YGBg/2FhYf9iYmL/Y2Nj/2RkZP9lZWX/ZmZm/2dnZ/9oaGj/aWlp/2pq
+ av9ra2v/bGxs/21tbf9ubm7/b29v/3BwcP9xcXH/cnJy/3Nzc/90dHT/dXV1/3Z2dv93d3f/eHh4/3l5
+ ef96enr/e3t7/3x8fP99fX3/fn5+/39/f/+AgID/gYGB/4KCgv+Dg4P/hISE/4WFhf+Ghob/h4eH/4iI
+ iP+JiYn/ioqK/4uLi/+MjIz/jY2N/46Ojv+Pj4//kJCQ/5GRkf+SkpL/k5OT/5SUlP+VlZX/lpaW/5eX
+ l/+YmJj/mZmZ/5qamv+bm5v/nJyc/52dnf+enp7/n5+f/6CgoP+hoaH/oqKi/6Ojo/+kpKT/paWl/6am
+ pv+np6f/qKio/6mpqf+qqqr/q6ur/6ysrP+tra3/rq6u/6+vr/+wsLD/sbGx/7Kysv+zs7P/tLS0/7W1
+ tf+2trb/t7e3/7i4uP+5ubn/urq6/7u7u/+8vLz/vb29/76+vv+/v7//wMDA/8HBwf/CwsL/w8PD/8TE
+ xP/FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83Nzf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT
+ 0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li
+ 4v/j4+P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t/+7u7v/v7+//8PDw//Hx
+ 8f/y8vL/8/Pz//T09P/19fX/9vb2//f39//4+Pj/+fn5//r6+v/7+/v//Pz8//39/f/+/v7//////wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu
+ LCspKCYkKDI5Pz07OTg2LCIWDw4MCwkIBhOr9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AAAw
+ LiwrKTlJU1FPTUpIRkRCQT88MB4ODAsJCAYEfff39/f39/f399Du9+Xb9/f32+X39/fO5vf3993L6vf3
+ 5dv39/fb5ff399Du9/f37cvb9/f398/b9/f39+7Q9/f39/f3983q99D39/f3zcv39+Xb9/f3zff3AAAx
+ MC4+VFhWVVNRT01KSEZEQkE/PDozHQwLCQgGBF/39/f39/f39yDC94tW9/f3Vov391QmcffiPihBOYb3
+ i1b39/dWi/f39yDC9/dfHkFETff3jx1E9/f398Ig9/f39/f2RDI5gyD397osMkE/94tW9/duN/f3AAAz
+ N1RfXVtYVlVTUU9NSkhGREJBPzw6OCwRCwkIBgRu9/f39/f39wC493g49/f3OHj3yQSw0fdKRLzGwNT3
+ eDj39/c4ePf39wC494csqsbFw/f3FX3F9/f397gA9/f39/ePJsTAegD36B9nwca/93g697MKmvf3AABA
+ YWNhX11bWFZVU1FPTUpIRkRCQT88OjgzFgsJCAYEnPf39/f39wC693w+9/f3Pnz3twD399kA4ff39/f3
+ fD739/c+fPf39wC69yGd9/f39/f3AL739/f397oA9/f39/ebDvf3vQD3owrj9/f393w29ydk8ff3AABp
+ ZmRjYV9dW1hWVVNRT01KSEZEQkE/PDo4NhsLCQgGE8r39/f39wC693xA9/f3QHz3ugD397cAR0BASVj3
+ fEH39/c+fvf39wC69wA1QUBCW833ALv39/f397oA3t739/flRT5mWwD3dzr39/f393wUTzjf9/f3AABr
+ aWZkY2FfXVtYVlVTUU9NSkhGREJBPzw6ODYWCwkIBkH39/f39wC693w49/f3OnT3ugD399IAeXp6WAD3
+ fC339/c+e/f39wCz9w1Xfnl+AMT3ALr39/f397oAW1tVi/f30YN8XwD3jSP39/f393woG2j39/f3AABv
+ a2lmZGNhX11bWFZVU1FPTUpIRkRCQT88OjgzEQsJCAad9/f39wC693wTxPfoCp/3ywD39/Qqm/f3gUb3
+ fBOp6fc+N+P3ugDY92pg9/fFEer3AMv39/f397oAjo5nK6H37Pf3dhv31Qmq9/f293xCsTSv9/f3AAB0
+ b2tpZmRjYV9dW1hWVVNRT01KSEZEQkE/PDo4LgwLCQgk9/f39wC693IxaIFYJ+XYWwB5mPezNndvM7P3
+ cj1JT/cvTXd5N03399hAank9ffd5AFt59/f397oA9/f3gBv3f4F8MYj394FBd3mF93w+93ghqff3AAB4
+ dG9raWZkY2FfXVtYVlVTUU9NSkhGREJBPzw6OB8MCwkInvf39wC696q1nExSt/fJLgBAbvf3pU1Cmff3
+ qrOiR/eC1oBAZdj39/fKXEB96fdAAC9A9/f397oA9/f3xAD3i0xAgej39/eWTUBx93w+9/dohff3AAB9
+ eHRva2lmZGNhX11bWFZVU1FPTUpIRkJAQT88OjUQDAsJJvf39wC59/f39/f39/f33Bn39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f3JNH39/f397gA6+vZZyz39/f39/f39/f39/f393w+9/f39/f3AACB
+ fXh0b2tpZmRjYV9dW1hWVVNRT01KSEYmNUE/PDohDgwLCcv39wi89/f39/f39/f38Zr39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f3tNb3m9n398ENjo5uH6b39/f39/f39/f39/f393g49/f39/f3AACF
+ gX14dG9raWZkY2FfXVtYVlVTUU9NSkg1GSU9Pzw1Dw4MC4H392XT9/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f3ui669+JzU1N0uff39/f39/f39/f39/f394tW9/f39/f3AACK
+ hYF9eHRva2lmZGNhX11bWFZVU1FPTUpIIBkaMz88GQ8ODEb39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f396pN9/f39/f39/f39/f39/f39/f39/f39+Xb9/f39/f3AACO
+ ioWBfXh0b2tpZmRjYV9dW1hWVVNRT01KNRsZFyA5JREPDgz39/f39/f39/f39/f3APf39w/o6F0+TYv3
+ fHz39z669/cA9/eqLj4ufPf3umxNLk3o97o+9+hdPk2L9+hdLj6q96oufLo+Pmz39/f39/f39/f3AACS
+ aYWFgX14dG9raWZkY2FfXVtYVlVTUU9NRx4bGRcYHxMRDw7M9/f39/f39/f39/f3APf3yS73XYv39/f3
+ fHz39z669/cA97ou2ffoXXz3ug/o94td97o+912L9/f3911s9/f39z6q9+j39y7J9/f39/f39/f3AABW
+ Yo6KhYFpSkhGREJAPz07OTg2NDMxMC4sKiAcGxkXFhQTEQ+99/f39/f39/f39/f3APf3fGz3D7q6urr3
+ fHz39z669/cA902b9/f32Q/3uj739/cP97o+9w+6urq69w/39/f39z669/fofA/o9/f39/f39/f3AABJ
+ h5KOioV1RTw7OURCQD89Ozk4NzUzMTAuLB8eHBsZFxYUExGS9/f39/f39/f39/f3AHxsLtn3H3x8fAD3
+ fHz39z669/cA9wD39/f39z66uj739/cP97o+9x98fHwA9x/o9/f39z669+guXdn39/f39/f39/f3AABg
+ m5eSjoqFgW1TOzxNYmZkY2FfXVtYVlVTRCEfHhwlPxcWFBOF9/f39/f39/f39/f3ALq6TZv3XYv3uj73
+ fD736B9897of9wD39/f39z66ugDZ94tN97o+912L97o+92xs9/f39z6698ku9/f39/f39/f39/f3AACD
+ oJuXko6KhYF9dFtAOEJTZGNhX11bWFZVNSMhITdIRhkXFhSF9/f39/f39/f39/f3APf36A/36F0uPsn3
+ fHxNH2ybPi669y669/f36A/ouj58Lk3Z97o+9+hdLj7J9+hsPj6qbA8ubPdsPk339/f39/f39/f3AACR
+ joqGg398d3RwbWllVD42N0hcYV9dW1hRJiQuSU1KSBsZFxaG9/f39/f39/f39/f3APf32Q/39/f39/f3
+ 9/f39/f39/f396pN9/f3i133uj739/f39/f39/f39/f39/f39/f39z669/f39/f39/f39/f39/f3AABP
+ TkxLSUdGRUNBQD48Ozk4NjQzY2FfXVtAKkBTUU9NRBwbGRe/9/f39/f39/f39/f3AHx8H4v39/f39/f3
+ 9/f39/f39/f39/d8H3w+Puj3uj739/f399kf9/f39/f39/f39/f399no9/f39/f39/f39/f39/f3AACZ
+ lZKOioeDf3x4dHFtamViXlxdZGNhX108UlZVU1FPQR4cGxnA9/f39/f39/f39/f32bq69/f39/f39/f3
+ 9/f39/f39/f39/f36LrZ9/f3yWz39/f39/fo9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AACQ
+ sa2opKCbl5KOioWBfXh0b2tpZmRjYVtdW1hWVVNRNx8eHBv39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AABt
+ tbGtqKSgm5eSjoqFgX14dG9raWZkY2FfXVtYVlVTMSEfHkX39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AABW
+ oLWxraikoJuXko6KhYF9eHRva2lmZGNhX11bWFZRJCMhH3D39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AACH
+ fbq1sa2opKCbl5KOioWBfXh0b2tpZmRjYV9dW1hCJiQjIbT39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AADH
+ qLe6tbGtqKSgm5eSjoqFgX14dG9raWZkY2FfXVsvKCYkMPf39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+
+
+
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAFBQUACQkJAA0NDQAUFAsAEhINABwcCQAaGg8AHh4OABIS
+ EgAVFRUAGhoUABwcFgAZGRkAHR0dACQkBwAqKgcAJiYIACYmDwAoKAkALCwJAD4+AwAxMQoAPDwIACcn
+ EAAkJBcALi4QAC0tFAAhIRoAIyMcACQkHQAtLR4AMDARAD8/FAAzMxgANjYZADk5GwA8PBgAOzscAD09
+ HgAhISEAJSUlAC0tJQApKSkALS0tADQ0JAA0NCsAPT0rADExMQA1NTUAOjoxAD8/NgA5OTkAPDw8AEJC
+ AgBDQwQARkYHAElJAABNTQAASkoGAE5OBQBHRwwASUkJAElJDQBMTA0AUVEAAFVVAABRUQYAVVUHAFlZ
+ AABdXQAAWVkHAF9fCABDQxYASUkQAElJGQBOThsAVlYQAFRUFABbWxwAYWEAAGVlAABnZwQAaWkAAG5u
+ AABlZQkAcXEAAHV1AABycgUAdXUFAHp6AAB9fQAAdHQLAH5+DQBkZBAAb28UAGRkGgBiYh8AdXUVAEFB
+ IABERCIARkYkAE5OIgBJSSUATEwnAE5OKABcXCMAUFAqAFJSLABUVC8ARUUyAEtLOQBPTz0AVlYxAF9f
+ MgBrayAAZGQtAHR0IAB0dDcAcnI/AH5+OQBBQUEARUVFAE1NRQBJSUkATU1NAF5eRQBSUkoAUlJSAFVV
+ VQBYV1AAWVlZAF1dXQBjY0EAZGRMAGpqSQB8e0EAe3tMAGhoUQBiYlsAaWlbAGpqXABtbV8AdnZZAHp6
+ XQBhYWEAZGRkAGpqZABoaGgAdXVoAHFxcQB+fn4AgoIAAIWFAACCggYAiYkAAI6OAACKigYAgYEMAJGR
+ AACWlgAAmZkBAJ2dBgCEhBMAh4cXAIeHGACKihwAnp4UAKGhDAClpRIAqakXAKalHwCtrB0Ah4cjAI6O
+ IQCRkSUAmJgjAJiYJACUlCoAl5cvAImJMgCYmDAAm5s0AJKSPwCenjgArKwrALCwIwC0tCkAuLgvAKGh
+ PQCpqDwAsLAwALy7NAC/vzoAhoZPAIuLTACbm0wAiopfAJ6eUACZmV4ApKRCAKenRwCsrEIAqKhHAKur
+ SwCrq0wAtLNBAK6uUACpqVQAp6dcALKxVQC6uVUAtbVaAL29WgCGhmQAg4NpAIiIbgCWlmQAlpZuAJOT
+ dAC7u2MApqZwALy7dACzsnwAv75+AMPDQADHx0YAy8pMAM/OUQDT0lcA1tZcAMLCbQDa2WIA3t1oANnY
+ bADGxXIA0dF4AOLhbgDm5XQA4uF6AOvqfACBgYEAhoaGAIyMjACRkZEAlpaWAJ+fnwC6uoEAoaGhAKys
+ rADCwoMA6+qIAPHwhQD19IsA8/KSAPn4kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSMQ0KCgoKCgMDK4MAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACDKA0oDQ0NDQoKCgMKAwMDA3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAeigoKCgoKA0NDQoKCgoDAwMDAwADKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJIrKysrKCgoKCgN
+ DQ0KCgoKCgMDAwMDAAN6AAAAAAAAAAAAAAAAAAAAAAAAAAAANSsrKysrKygtIUBHR0REPDwXEwcDAwMD
+ AwAACgAAAAAAAAAAAAAAAAAAAAAAAAAxMTErMSsrS1VXV1dUVFJSUFBQQkI4EwMDAwMDAAAAAAAAAAAA
+ AAAAAAAAAAAA8TExMSsxK0taWlpaV1dXVFRSUlBQUEJQQjgPAwIDAwADgwAAAAAAAAAAAAAAAAD0NTEx
+ MTEvXJ2ZmZlaWldXVFRUUlJQUEJCQkJCFQQCAgMAA5YAAAAAAAAAAAAAAAA1NTUxMWidnZ2dmZlaWlpX
+ V1RUUlJSUFBQUEJCPDwGAwADAAAAAAAAAAAAAAAAAHw1NTU1aqCgoJ2dnZmZWlpaWldUVFRSUlBQQkJC
+ Qjw8DwMDAwAKAAAAAAAAAAAAlnp6NTVsoqKgoJ2gnZmZmZlaWldXV1RSUlJQUFBQQkI8PAYDAAMAegAA
+ AAAAAAAAeno1em+nqKKgoKCdnZ2dmZlaWlpXV1RUVFJSUFBCUEJCQjgEAwMDAAAAAAAAAACDenp6NbCq
+ qaiioqCgoJ2dnZmZWlpaV1dXVFJSUlBQQlBCQjw4AgMAAygAAAAAAAB8fHp6drqsqqmooqKgoJ2gnZmZ
+ mZlaWldXVFRUUlJQUEJCQkI8EAMDAwMAAAAAAJJ8fHp7v7u6rKqpqKKgoKCdnZ2dmZlaWlpXV1dUUlJS
+ UFBQQkJCPAQDAwArAAAAAHx8fHyIwLy7uqyqqaiioqCgoJ2dnZmZWlpaV1dUVFRSUBs4UFBCQhADAwMD
+ AAAAAIN8g3zOwcC8u7qsqqmooqCgoJ2gnZmZmZlaWldXV1RUUjgNG0JQQjwDAwMDAAAAl3x8fIbi4sDA
+ vLu6rKqpqKKgoKCdnZ2dmZlaWlpXV1RUVFIZDQ04UEIHBAMDegAAg4ODfMLj4uLBwLy7uqyqqaiioqCg
+ oJ2dnZmZWlpaV1dUVFQ9DQ0KGUITCgMDAwAAg3yDg9Dk4+LhwcB4ubqsqqmooqKgoJ2gnZmZmZlaWldX
+ VFRSHA0NCg0SCgoDAwAAg4N8g9Pl5OPiyn53vLu6rK1xbGtraGhoZGRkZCcnJycnIyMiHA0NDQ0KCgQJ
+ AwAAg4ODg+bm5eTDfHy+wLy7urFvNTU1a2hoaGhkZGRkJycnIyMjKCgNDQ0KCgoKCQAAg4ODg+jo1Yp8
+ fIfiwcC8u7qsrnQ1M2GdoJ2dnZ2ZmVpaWldHKCgoDSJQCgoKCgAAg4ODg+nHg3yDfMbi4cHAvLu6rKqn
+ dW40aF+gnZ2ZmZlaWlpLKCgcSlJSCgoKCgAAg4ODg4yDg4N8g8/PyMi9uLazs7CupqRzbjEzT5mdmZmZ
+ mVcoKCdSVFRSDQ0KCgAAkpKDg4ODfIODfIB8fHx8e3p6ejV5NTU1NTExMTGdnZ2ZmU4rT1dXV1RQDSgK
+ DQAAkoOSg4yDg4N9g9LS0s/JyL24trOzr66mpKSeXZmgnZ2dmUtXWlpXV1RHKA0NDQAAkpKDkt3ei4OD
+ g9Hm5ePj4uLBwLu7uqyqqaiioqCdoJ2dmZmZWlpaV1dKKCgNDQAA8ZKSktf879eDgI/o5uXk4+LhwcDA
+ u7qsqqmooqKgoKCdnZmZmZlaWlcnDSgofAAA9pKSg5L7/PDrioPc6Obl5OPi4sDAvLu6rKqpqKKgoKCd
+ nZ2dmZlaWlcoKCgolgAAAJKSkpLf/fzw79nF6Ojm5eTj4uLBwLy7uqyqqaiioKCgoJ2dnZmZWk8pKSgo
+ AAAAAJaSkpKV//388PDr6eno5uXk4+LhwcC8u7qsqqmooqKgoKCdnZmZmS0pKSgxAAAAAACUkpKS+v/9
+ /PDu7+3p6Obl5OPi4sDAvLu6rKqpqKKgoKCdoJ2dVSsrKykAAAAAAACUlJKSk/7//fz78O7t6Ojm5eTj
+ 4uLBwLy7uqyqqaiioKCgnZ2ZLisrKysAAAAAAAAAlJSSktv///388PDu7eno5uXk4+LhwcC8u7qsqqmo
+ oqKgoKBoLjErLvEAAAAAAAAAlpSUk5Lf///9/PDw7u3p6Obl5OPi4sDAvLu6rKqpqKKgoGEuMDArNQAA
+ AAAAAAAAAJSUlJSS+v///fzw8O7t6ejm5eTj4uLBwLy7uqyqqaiiXzMwMTAxAAAAAAAAAAAAAPmUlJSU
+ kvf///388PDu7eno5uXk4+LhwcC8u7qsqql1NTQxMTDyAAAAAAAAAAAAAADylJSUlJLb/v/9/PDw7u3p
+ 6Obl5OPi4sDAvLu6q3I1NTQ0MYMAAAAAAAAAAAAAAAAA8pSUlJSSlfr//fzw8O7t6ejm5eTj4uLBwLy0
+ b3o1NTU0gwAAAAAAAAAAAAAAAAAAAPKUlJSUkpLY4P388PDu7eno5uXk4+Lht4V6ejV6NTWEAAAAAAAA
+ AAAAAAAAAAAAAAD4lJSUlJKSkpPa3uzw7u3p6ObTxomAe3p6eno1efEAAAAAAAAAAAAAAAAAAAAAAAAA
+ AJaUlJSSkpGRg4ODg5CQg4N8g3x8fHx8enp8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4lJSSkpKSkpGD
+ g4ODg3yDfHyDfHx8evIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPiUkpKSg5KRg4ODg4ODg3x9fIDy
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPSWkpKRkYODg4N9g4PyAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP//
+ wAP//wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/gAAAAf8AAP4AAAAAfwAA/AAAAAA/
+ AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADwAAAAAA8AAOAAAAAABwAA4AAAAAAHAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAMAA
+ AAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAf
+ AAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/gAAAH/wAA//AAAA//AAD//AAAP/8AAP//
+ gAH//wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAAAAAAAYG
+ BgAJCQkADAwMABAQCwASEg0AGBgJABISEgAUFBQAHBwWABkZGQAeHh4ALy8GACoqCgAuLgkAKysPADc3
+ DQAqKhEALS0TACgoFQAmJhkANTUYADY2HwA4OBoAOzscAD4+HgAhISEAJCQkACkpKQAuLi4AODghADEx
+ MQA1NTUAOjoxAD8/NgA5OTkAPj4+AENDAgBHRwEAQkIFAEZGBQBLSwAAT08AAE1NBgBTUwAAV1cBAFJS
+ BgBYWAAAXFwAAFFRCABSUg8AV1cNAF1dCABERBIAQEAaAE9PHABQUBMAXV0dAGBgAABkZAAAZ2cEAGho
+ AABtbQAAa2sEAGVlCQBsbAoAcXEAAHV1AAB3dwUAenoAAH19AABycg8AYGAYAHNzFAB5eREAfHsfAEJC
+ IQBFRSIASUklAExMJwBPTykASUktAFhYKABcXC4AREQ7AEtLOQBrayAAfX0tAHBwMQBBQUEARkZGAExM
+ QwBJSUkATU1NAFpaQQBUVEwAWlpJAFJSUgBVVVUAWFhYAF1dXQBubk4Afn5PAGFhWgBmZlgAYWFhAGVl
+ ZQBtbWcAaGhoAG5ubgB7e2cAcnJyAHZ2dgB7e3sAgYEAAIaGAACDgwYAi4sAAI+PAACFhQoAk5MAAJeX
+ AACcnAUAj48WAJaVFACiog4AqKcWAK2tHwCHhyMAgoI/AJSUNgCYmDwArKwpALOzJwC5uDAAtrY5AL6+
+ OACKilUAlpZQAJKSVQCbmlUAlpZaAJ+eWwCqqkoAvLxBALi4XgCEhGEAiIdlAIGBbgCLimkAnp5lAIuK
+ cQCbmnQAnp54AKyrYgC9vGUApqZwAK6uegC9vXIAxMNBAMnJSQDPzlIA1dRaAMLBbADLym8A0tFiANra
+ YwDg32sA5uV0AOLhewDr6nwAg4ODAIWFhQCIiIgAj4+PAJaWlgChoaEA4+KHAOnojwDx8IUA9vaNAPz7
+ lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAG9aCggICApcAAAAAAAAAAAAAAAAAAAAAAAAAAAAbyAaChoKCggICAMDAyAAAAAAAAAA
+ AAAAAAAAAAAAAB0dGhoaGgoKCggICAMDAwBaAAAAAAAAAAAAAAAAAGMdHR0aHjI0Qj87OyonDQQDAwAI
+ AAAAAAAAAAAAAABjICAdTEdyckJCPz87OjotKgwDAwMAAAAAAAAAAAAAaSMgIEh1c3JyckJCPz87Ojot
+ LScGAwADAAAAAAAAAHEjIyNJeHV1c3JyQkJCPz87OjotLSoEAwACAAAAAAAAWlojS3p6eHV1c3JyckJC
+ Pzs7OjotLSoEAwIgAAAAAGNaWlh+fXp6eHV1c3JyckJCPz87Oi0tLScGAAMAAAAAXFpbhH9+fXp6eHV1
+ c3JyQnI/Pzs7OzotLQwDAxoAAG1cXIGGhX9+fXp6eHV1c3JyQkJCQj8tKi0tKgQDAwAAYVxhkIiGhX9+
+ fXp6eHV1c3NyckJCPz8REC0tDQQDbwBhYWWgn4iGhX9+fXp6eHV1c3JyckJCPy0KCicqBwcjAGFhi6Gg
+ n4eChX9+fXp6eHV1c3JyQkJCPxQKChEIBwOwY2GOoqGPYIOGhX9VIyNQT09MTB5MGBgVGgoKCggICKxj
+ Y6OliVxgn4aGhX+AU1NKeHV1dXNycjsaGhQxEQgIrGNjlmhhYYqgn4iGhX9+fFZROXN1c3JyOBo1Pz8T
+ CAgAaWNjY2NhYWFcXFtaWiMjIyMjIHR1c3IeQEJCPwoKCgBpaZWVY2GNoqGgn4aGhYV+fXp4eHV1c3Jy
+ ckI/GgoKAGlpbrOeZ2imoqGgn4iGhX9+fXp4eHV1c3JyQjQaGmEAbWlpsbOpkpqmoqGgn4iGhX9+fXp6
+ eHV1c3JyGBoaAACwaWmZtLOqpKemoqGgn4iGhX9+fXp4eHV1c0IdGxsAAABtaWmytLOqqKemoqGgn4iG
+ hX9+fXp6eHV1Nx0bZAAAAK5tbW61tLOqqKemoqGgn4iGhX9+fXp4eEkdHR0AAAAAAG1pbZm1tLOqqKem
+ oqGgn4iGhX9+fXp0Ix8dbQAAAAAAAG1paZm1tLOqqKemoqGgn4iGhX9+fCMjH1wAAAAAAAAAsG1taZey
+ tLOqqKemoqGgn4iGhVdUIyNbAAAAAAAAAAAAsG1pbWudsbOqqKemoqGgn4NeWiNaWgAAAAAAAAAAAAAA
+ AG1paWlpbpyeo5uRimZfXFpaWmcAAAAAAAAAAAAAAAAAAK5tbWlpY2NjY2FhYVxcXGEAAAAAAAAAAAAA
+ AAAAAAAAAACubWlpaWNjY2NhYW0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACurK6srgAAAAAAAAAAAAAA
+ AAD/8A///4AB//8AAH/8AAA/+AAAH/AAAA/gAAAH4AAAA8AAAAPAAAABgAAAAYAAAACAAAAAgAAAAAAA
+ AAAAAAAAAAAAAIAAAACAAAAAgAAAAIAAAAGAAAABwAAAAcAAAAPgAAAD8AAAB/AAAA/4AAAf/gAAP/8A
+ AP//wAP///wf/ygAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAACgoKAA4O
+ CQAPDw8AGxsLABQUFAAYGBgAHR0dAC4uDAA8PAQANjYJADQ0DgA9PQsAKioTACIiGwArKysAMTEiADQ0
+ NAA7OzEAODg4AD4+PgBAQAMAREQCAEREDgBNTQoASUkMAFNTBABZWQAARUUSAEFBFABWVhAAYWEAAGlp
+ AABtbQIAZmYJAG1tCgBycgAAe3sAAHV1CwB9fQ0AZGQUAHh4GwBYWCEAX18nAFlZKgBFRTwAc3MqAHt7
+ KwB7ezUASEhIAExMTABUVEwAX19XAFtbWwBeXl4Ae3tMAGppUgByclMAenpUAGNjYwBlZWUAaWlpAH5+
+ YgBxcXEAdXV1AH5+fgCDgwAAi4sAAJSUAACenggAi4sRAKmpGAC0tCoAuLg7AMC/OwCDg0AAi4pKAIGB
+ XACSkl8AhYVqAJubYACVlHUAo6JrAK6tcQCoqHwAy8pLAM7NXADW1VwA2dhsANvaewDh4W4A7ex/AIqK
+ igCSkpIAlZWVAJycnACioqIAqqqqAMXEhgDk44gA7u2MAPj3jwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OJ82Njb/NDQ0/zMz
+ M/8xMTH/MDAw/y4uLv9OThv/d3cF/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2Vl
+ AP9iYgD/X18A/11dAP9aWgD/V1cA/1RUAP9JSQH/JiYI/wwMDP8LCwv/CQkJ/wgICP8GBgb/BAQE/wMD
+ A58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7jzk5
+ Of84ODj/NjY2/zQ0NP8zMzP/PT0r/3R0C/+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3Fx
+ AP9ubgD/a2sA/2hoAP9lZQD/YmIA/19fAP9dXQD/WloA/1dXAP9UVAD/UVEA/z4+A/8UFAv/CwsL/wkJ
+ Cf8ICAj/BgYG/wQEBP8DAwOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAA+Pj5fPDw8/zs7O/85OTn/ODg4/zY2Nv9MTCf/iooD/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8
+ AP96egD/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1paAP9XVwD/VFQA/1FR
+ AP9KSgD/HBwJ/wsLC/8JCQn/CAgI/wYGBv8EBAT/AwMDXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAEFBQS9AQEDvPj4+/zw8PP87Ozv/OTk5/1xcI/+WlgD/k5MA/5CQAP+OjgD/i4sA/4iI
+ AP+FhQD/goIA/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP9iYgD/X18A/11d
+ AP9aWgD/V1cA/1RUAP9RUQD/Tk4A/yQkB/8LCwv/CQkJ/wgICP8GBgb/BAQE7wQEBC8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQ79BQUH/QEBA/z4+Pv88PDz/VFQv/52dBv+ZmQH/lpYA/5OT
+ AP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2ho
+ AP9lZQD/YmIA/19fAP9dXQD/WloA/1dXAP9UVAD/UVEA/05OAP8cHAn/CwsL/wkJCf8ICAj/BgYG/wQE
+ BL8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZGX0VFRf9DQ0P/QUFB/0BAQP9LSzn/np4U/6Gh
+ DP+dnQb/mZkB/5aWAP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0
+ AP9xcQD/bm4A/2trAP9oaAD/ZWUA/2JiAP9fXwD/XV0A/1paAP9XVwD/VFQA/1FRAP9KSgD/FBQL/wsL
+ C/8JCQn/CAgI/wYGBv8FBQVfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0dH30ZGRv9FRUX/Q0ND/0FB
+ Qf+YmCP/qakX/6WlEv+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/
+ AP98fAD/enoA/3d3AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP9iYgD/X18A/11dAP9aWgD/V1cA/1RU
+ AP9RUQD/QkIC/wwMDP8LCwv/CQkJ/wgICP8GBgbfAAAAAAAAAAAAAAAAAAAAAAAAAABKSkpfSUlJ/0dH
+ R/9GRkb/RUVF/3R0N/+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uL
+ AP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2hoAP9lZQD/YmIA/19f
+ AP9dXQD/WloA/1dXAP9UVAD/UVEA/yoqB/8MDAz/CwsL/wkJCf8ICAj/BwcHXwAAAAAAAAAAAAAAAAAA
+ AABMTEzfS0tL/0lJSf9HR0f/TU1F/7CwMP+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aW
+ AP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0AP9xcQD/bm4A/2tr
+ AP9oaAD/ZWUA/15eAf9bWwH/XV0A/1paAP9XVwD/VFQA/01NAP8SEg3/DAwM/wsLC/8JCQn/CAgI3wAA
+ AAAAAAAAAAAAAE9PTy9OTk7/TExM/0tLS/9JSUn/fHtB/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6Wl
+ Ev+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP98fAD/enoA/3d3
+ AP90dAD/cXEA/25uAP9rawD/aGgA/2VlAP8wMBH/SUkH/11dAP9aWgD/V1cA/1RUAP8sLAj/Dg4O/wwM
+ DP8LCwv/CQkJ/wgICC8AAAAAAAAAAFFRUX9PT0//Tk5O/0xMTP9LS0v/tLNB/7+/Ov+8uzT/uLgv/7S0
+ Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KC
+ AP9/fwD/fHwA/3p6AP93dwD/dHQA/3FxAP9ubgD/a2sA/2hoAP9JSQn/GRkZ/y4uEP9YWAH/WloA/1dX
+ AP9MTAL/Dw8P/w4ODv8MDAz/CwsL/woKCn8AAAAAAAAAAFNTU79RUVH/T09P/05OTv9kZEz/x8dG/8PD
+ QP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP+TkwD/kJAA/46O
+ AP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP96egD/d3cA/3R0AP9xcQD/bm4A/2trAP9oaAD/JCQX/xkZ
+ Gf8cHBb/RkYH/1paAP9XVwD/Hh4O/w8PD/8ODg7/DAwM/wsLC78AAAAAAAAAAFRUVP9TU1P/UVFR/09P
+ T/+Ghk//y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZ
+ Af+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP98fAD/enoA/3d3AP90dAD/cXEA/25u
+ AP9rawD/R0cM/xsbG/8ZGRn/FxcX/ycnEP9RUQL/MTEK/xEREf8PDw//Dg4O/wwMDP8AAAAAV1dXL1ZW
+ Vv9UVFT/U1NT/1FRUf+pqVT/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/fn45/6ysK/+wsCP/rawd/6mp
+ F/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6
+ AP93dwD/dHQA/3FxAP9ubgD/ZmYB/yEhGv8bGxv/GRkZ/xcXF/8aGhT/JiYP/xMTE/8RERH/Dw8P/w4O
+ Dv8NDQ0vWVlZP1hYWP9WVlb/VFRU/1NTU/+9vVr/09JX/8/OUf/Lykz/x8dG/6ysQv9eXkX/cnI//7i4
+ L/+0tCn/sLAj/62sHf+HhyP/VlYx/1RUL/9SUiz/UFAq/05OKP9MTCf/Skom/0hIJf9GRiT/REQi/0JC
+ If9AQCD/Pj4f/z09Hv87Oxz/OTkb/zc3Gv81NRn/MzMY/yMjHP8cHBz/Gxsb/xkZGf8XFxf/FhYW/xQU
+ FP8TExP/ERER/w8PD/8ODg4/Wlpab1lZWf9YWFj/VlZW/1RUVP/a2WL/1tZc/9PSV//PzlH/i4tM/0tL
+ S/9JSUn/qag8/7y7NP+4uC//tLQp/7CwI/+YmCT/S0s5/zw8PP87Ozv/OTk5/1BQKv9OTij/TEwn/0pK
+ Jv9ISCX/RkYj/0REIv9DQyH/QUEg/z8/Hv89PR7/Ozsc/zk5G/83Nxr/NTUY/x8fH/8eHh7/HBwc/xsb
+ G/8ZGRn/FxcX/xYWFv8UFBT/ExMT/xEREf8QEBBvXFxcf1tbW/9ZWVn/WFhY/1ZWVv/e3Wj/2tli/729
+ Wv9oaFH/Tk5O/0xMTP9qakn/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/46OIf9kZC3/Ozs7/z8/
+ Nv9iYh//iooG/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/X18I/yEh
+ If8fHx//Hh4e/xwcHP8tLRT/WVkD/xcXF/8WFhb/FBQU/xMTE/8SEhJ/Xl5ef1xcXP9bW1v/WVlZ/1hY
+ WP/i4W7/mZle/1NTU/9RUVH/T09P/05OTv+bm0z/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/62s
+ Hf+pqRf/np4V/3R0If9GRjP/ODg4/05OKP9vbxT/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8
+ AP96egD/Q0MW/yMjI/8hISH/JCQd/0lJDf9oaAD/ZWUA/xkZGf8XFxf/FhYW/xQUFP8TExN/X19ff15e
+ Xv9cXFz/W1tb/1lZWf9paVv/VlZW/1RUVP9TU1P/UVFR/1hXUP+urlD/q6tL/6enR/+kpEL/oaE9/56e
+ OP+bmzT/l5cv/5SUKv+RkSX/jo4h/4qKHP+Hhxf/a2sg/0REMf82Njb/Ojox/1tbHP+Cggb/i4sA/4iI
+ AP+FhQD/goIA/39/AP9ycgX/JiYm/yQkJP83Nxr/Z2cE/25uAP9rawD/aGgA/xsbG/8ZGRn/FxcX/xYW
+ Fv8VFRV/YWFhP2BgYP9eXl7/XFxc/1tbW/9ZWVn/WFhY/1ZWVv9UVFT/U1NT/1FRUf9PT0//Tk5O/0xM
+ TP9LS0v/SUlJ/0dHR/9GRkb/RUVF/0NDQ/9BQUH/QEBA/z4+Pv88PDz/Ozs7/zk5Of84ODj/NjY2/zQ0
+ NP8zMzP/jo4A/4uLAP+IiAD/hYUA/4KCAP9UVBT/LS0l/1VVEP93dwD/dHQA/3FxAP9ubgD/YWED/xwc
+ HP8bGxv/GRkZ/xcXF/8WFhY/YmJiP2FhYf9gYGD/Xl5e/1xcXP9tbV//WVlZ/1hYWP9WVlb/VFRU/1NT
+ U/+1tVr/srFV/6+uUf+rq0z/qKhH/6WkQ/+ioT7/np45/5ubNf+YmDD/lZQr/5KRJv+OjiH/i4sd/4eH
+ GP+EhBP/gYEP/35+Df+BgQn/kJAA/46OAP+LiwD/iIgA/4WFAP9LSxr/dHQF/3x8AP96egD/d3cA/3R0
+ AP9xcQD/WloH/x4eHv8cHBz/Gxsb/xkZGf8YGBg/AAAAAGNjY/9hYWH/YGBg/15eXv+mpnD/v790/2Ji
+ W/9YWFj/VlZW/1RUVP+np1z/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7Cw
+ I/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4KCAv+FhQD/goIA/39/
+ AP98fAD/enoA/3d3AP90dAD/SUkQ/x8fH/8eHh7/HBwc/xsbG/8AAAAAAAAAAGRkZM9jY2P/YWFh/2Bg
+ YP+Dg2n/8fCF/+Tjff+GhmT/WFhY/1ZWVv92dln/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/
+ Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uL
+ AP+IiAD/hYUA/4KCAP9/fwD/fHwA/3p6AP93dwD/PDwY/yEhIf8fHx//Hh4e/xwcHM8AAAAAAAAAAGZm
+ Zp9kZGT/Y2Nj/2FhYf9gYGD/6+qI//Hwhf/t7H//xsVy/2pqXP9WVlb/u7tj/9rZYv/W1lz/09JX/8/O
+ Uf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aW
+ AP+TkwD/kJAA/46OAP+LiwD/iIgA/4WFAP+CggD/f38A/3x8AP90dAL/JCQk/yMjI/8hISH/Hx8f/x4e
+ Hp8AAAAAAAAAAGdnZ09mZmb/ZGRk/2NjY/9hYWH/tbV6//X0i//x8IX/7ex//+HgeP+WlmT/iopf/97d
+ aP/a2WL/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6Wl
+ Ev+hoQz/nZ0G/5mZAf+WlgD/k5MA/5CQAP+OjgD/i4sA/4iIAP+FhQD/goIA/39/AP9XVxH/JiYm/yQk
+ JP8jIyP/ISEh/yAgIE8AAAAAAAAAAAAAAABnZ2fvZmZm/2RkZP9jY2P/dXRo//n4kP/19Iv/8fCF/+3s
+ f//p6Xn/wsJt/9nYbP/e3Wj/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0
+ Kf+wsCP/rawd/6mpF/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/jo4A/4uLAP+IiAD/hYUA/4KC
+ AP80NCT/KCgo/yYmJv8kJCT/IyMj7wAAAAAAAAAAAAAAAAAAAABpaWl/aGho/2ZmZv9kZGT/Y2Nj/8LB
+ gv/5+JD/9fSL//Hwhf/t7H//6el5/+bldP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PD
+ QP+/vzr/vLs0/7i4L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP+TkwD/kJAA/46O
+ AP+LiwD/iIgA/2RkEP8rKyv/KSkp/ygoKP8mJib/JSUlfwAAAAAAAAAAAAAAAAAAAABqamofaWlp/2ho
+ aP9mZmb/ZGRk/2xsZv/z8pL/+fiQ//X0i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PS
+ V//PzlH/y8pM/8fHRv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/5mZ
+ Af+WlgD/k5MA/5CQAP+OjgD/hYUD/zQ0K/8sLCz/Kysr/ykpKf8oKCj/JiYmHwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAampqf2lpaf9oaGj/ZmZm/2RkZP+Tk3T//PuW//n4kP/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lh
+ bv/e3Wj/2tli/9bWXP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mp
+ F/+lpRL/oaEM/52dBv+ZmQH/lpYA/5OTAP+QkAD/Tk4i/zAwMP8uLi7/LCws/ysrK/8pKSmPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trD2pqau9paWn/aGho/2ZmZv9kZGT/sbB+//z7lv/5+JD/9fSL//Hw
+ hf/t7H//6el5/+bldP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4
+ L/+0tCn/sLAj/62sHf+pqRf/paUS/6GhDP+dnQb/mZkB/5aWAP9kZBr/MzMz/zExMf8wMDD/Li4u/yws
+ LO8rKysPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtra09qamr/aWlp/2hoaP9mZmb/ZGRk/8TE
+ hf/8+5b/+fiQ//X0i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PSV//PzlH/y8pM/8fH
+ Rv/Dw0D/v786/7y7NP+4uC//tLQp/7CwI/+trB3/qakX/6WlEv+hoQz/nZ0G/3V1Ff82Njb/NDQ0/zMz
+ M/8xMTH/MDAw/y4uLk8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABra2uPampq/2lp
+ af9oaGj/ZmZm/2RkZP+6uoH//PuW//n4kP/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lhbv/e3Wj/2tli/9bW
+ XP/T0lf/z85R/8vKTP/Hx0b/w8NA/7+/Ov+8uzT/uLgv/7S0Kf+wsCP/rawd/6mpF/+lpRL/dHQg/zk5
+ Of84ODj/NjY2/zQ0NP8zMzP/MTExjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa2trz2pqav9paWn/aGho/2ZmZv9kZGT/k5N0//Pykv/5+JD/9fSL//Hwhf/t7H//6el5/+bl
+ dP/i4W7/3t1o/9rZYv/W1lz/09JX/8/OUf/Lykz/x8dG/8PDQP+/vzr/vLs0/7i4L/+0tCn/sLAj/6al
+ H/9fXzL/PDw8/zs7O/85OTn/ODg4/zY2Nv80NDTPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trD2tra89qamr/aWlp/2hoaP9mZmb/ZGRk/3Z2af/CwYL/+fiQ//X0
+ i//x8IX/7ex//+npef/m5XT/4uFu/97daP/a2WL/1tZc/9PSV//PzlH/y8pM/8fHRv/Dw0D/v786/7y7
+ NP+4uC//iYky/09PPf9AQED/Pj4+/zw8PP87Ozv/OTk5/zg4OM82NjYPAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtraw9ra2vPampq/2lpaf9oaGj/ZmZm/2Rk
+ ZP9jY2P/iIhu/7++fv/19Iv/8fCF/+3sf//p6Xn/5uV0/+Lhbv/e3Wj/2tli/9bWXP/T0lf/z85R/8vK
+ TP/Hx0b/w8NA/5KSP/9jY0H/RUVF/0NDQ/9BQUH/QEBA/z4+Pv88PDz/Ozs7zzo6Og8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trn2pq
+ av9paWn/aGho/2ZmZv9kZGT/Y2Nj/2FhYf9paWP/lpZu/7m4df/R0Xj/6el5/+bldP/i4W7/3t1o/9rZ
+ Yv/W1lz/urlV/56eUP97e0z/UlJK/0lJSf9HR0f/RkZG/0VFRf9DQ0P/QUFB/0BAQP8+Pj6fAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGtra09qamrvaWlp/2hoaP9mZmb/ZGRk/2NjY/9hYWH/YGBg/15eXv9cXFz/W1tb/1lZ
+ Wf97e17/eXlc/1RUVP9TU1P/UVFR/09PT/9OTk7/TExM/0tLS/9JSUn/R0dH/0ZGRv9FRUX/Q0ND70FB
+ QU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABra2sPampqn2lpaf9oaGj/ZmZm/2RkZP9jY2P/YWFh/2Bg
+ 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
+ AP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/0NDAv8YGAn/CQkJ/wcH
+ B/8FBQX/AwMDXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQK8+Pj7/Ozs7/zk5Of9zcxT/k5MA/4+P
+ AP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/0tL
+ AP8YGAn/CQkJ/wcHB/8FBQX/BAQELwAAAAAAAAAAAAAAAAAAAABFRUVPQkJC/0BAQP8+Pj7/fHsf/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xc
+ AP9YWAD/U1MA/0tLAP8YGAn/CQkJ/wcHB/8FBQXPAAAAAAAAAAAAAAAAAAAAAEdHR99FRUX/QkJC/3Bw
+ Mf+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lp
+ AP9kZAD/YGAA/1xcAP9YWAD/U1MA/0dHAf8QEAv/CQkJ/wcHB/8GBgZfAAAAAAAAAABLS0tfSUlJ/0dH
+ R/9MTEP/rKwp/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1
+ AP9xcQD/bW0A/2lpAP9kZAD/YGAA/1xcAP9YWAD/U1MA/y8vBv8MDAz/CQkJ/wcHB98AAAAAAAAAAE5O
+ Ts9MTEz/SUlJ/4KCP/+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP9bWwP/TU0G/1xcAP9YWAD/T08A/xISDf8MDAz/CQkJ/wgI
+ CD9TU1MPUVFR/05OTv9MTEz/vLxB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+P
+ AP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/2lpAP8tLRP/NzcN/1dXAf9YWAD/Li4J/w4O
+ Dv8MDAz/CgoKj1VVVU9TU1P/UVFR/25uTv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/1FRCP8aGhr/HBwW/0VF
+ B/9HRwT/ERER/w4ODv8MDAzPV1dXf1VVVf9TU1P/kpJV/8/OUv/JyUn/xMNB/7a2Of+UlDb/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/3V1AP9xcQD/bW0A/yYm
+ Gf8aGhr/GBgY/ysrD/8TExP/ERER/w4ODv9aWlqPWFhY/1VVVf+fnlv/1dRa/8/OUv+qqkr/WVlI/5iY
+ PP+5uDD/s7Mn/62tH/9LSzn/Ozs7/zk5Of9PTyn/TEwn/0lJJf9GRiP/REQi/0FBIP8+Ph7/Ozsc/zg4
+ Gv81NRj/Hx8f/x0dHf8aGhr/GBgY/xUVFf8TExP/ERER/1xcXL9aWlr/WFhY/728Zf/S0WL/iopV/05O
+ Tv9bW0v/xMNB/76+OP+5uDD/s7Mn/62tH/+HhyP/XFwu/1hYKP95eRH/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/enoA/2trBP8hISH/Hx8f/yYmGf9SUgb/KioR/xUVFf8TExP/Xl5ev1xcXP9aWlr/np5l/2dn
+ WP9TU1P/UVFR/5aWUP/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/lpUU/2trIP9JSS3/XV0d/4OD
+ Bv+LiwD/hoYA/4KCAP9+fgD/UFAT/yQkJP9ERBL/aGgB/2lpAP8oKBX/GBgY/xUVFf9hYWF/X19f/1xc
+ XP9aWlr/WFhY/1VVVf9TU1P/UVFR/05OTv9MTEz/SUlJ/0dHR/9FRUX/QkJC/0BAQP8+Pj7/Ozs7/zk5
+ Of83Nzf/NDQ0/4ODBv+LiwD/hoYA/4KCAP84OCH/ZWUJ/3V1AP9xcQD/bW0A/x0dHf8aGhr/GBgY/2Nj
+ Y39hYWH/X19f/4uKaf+Ih2X/WFhY/1VVVf+Wllr/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/gYEC/3x8Av9+fgD/enoA/3V1AP9nZwT/Hx8f/x0d
+ Hf8aGhr/ZWVlP2RkZP9hYWH/e3tn//Hwhf++vnP/YWFa/2ZmWP/a2mP/1dRa/8/OUv/JyUn/xMNB/76+
+ OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KCAP9+fgD/enoA/1dX
+ Df8hISH/Hx8f/x0dHb8AAAAAZmZm/2RkZP9hYWH/4+KH//Hwhf/i4Xv/hIRh/6yrYv/a2mP/1dRa/8/O
+ Uv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+PAP+LiwD/hoYA/4KC
+ AP9+fgD/QEAa/yQkJP8hISH/Hx8fbwAAAABoaGifZmZm/2RkZP+bmnT/9vaN//Hwhf/r6nz/y8pv/+Df
+ a//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+XlwD/k5MA/4+P
+ AP+LiwD/hoYA/3d3Bf8oKCj/JiYm/yQkJP8hISEfAAAAAGpqaj9oaGj/ZmZm/2RkZP/p6I//9vaN//Hw
+ hf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/oqIO/5yc
+ Bf+XlwD/k5MA/4+PAP+LiwD/T08c/ysrK/8oKCj/JiYmvwAAAAAAAAAAAAAAAGpqar9oaGj/ZmZm/4GB
+ bv/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/62t
+ H/+opxb/oqIO/5ycBf+XlwD/k5MA/3JyD/8vLy//LS0t/ysrK/8pKSk/AAAAAAAAAAAAAAAAa2trL2pq
+ av9oaGj/ZmZm/56eeP/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/76+
+ OP+5uDD/s7Mn/62tH/+opxb/oqIO/5ycBf+FhQr/Ojox/zIyMv8vLy//LS0trwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa2trb2pqav9oaGj/ZmZm/56eeP/8+5X/9vaN//Hwhf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/O
+ Uv/JyUn/xMNB/76+OP+5uDD/s7Mn/62tH/+opxb/j48W/z8/Nv83Nzf/NDQ0/zIyMt8wMDAPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAa2trn2pqav9oaGj/ZmZm/4uKcf/p6I//9vaN//Hwhf/r6nz/5uV0/+Df
+ a//a2mP/1dRa/8/OUv/JyUn/xMNB/76+OP+5uDD/s7Mn/319Lf9ERDv/Ozs7/zk5Of83NzfvNDQ0LwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trn2pqav9oaGj/ZmZm/21tZ/+urnr/4+KH//Hw
+ hf/r6nz/5uV0/+Dfa//a2mP/1dRa/8/OUv/JyUn/xMNB/5iYPP9aWkH/QkJC/0BAQP8+Pj7/Ozs77zk5
+ OS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trf2pqav9oaGj/ZmZm/2Rk
+ ZP9hYWH/e3tn/6amcP+9vXH/wsFs/728Zf+4uF7/m5pV/35+T/9UVEz/SUlJ/0dHR/9FRUX/QkJC/0BA
+ QM8+Pj4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trL2pq
+ ar9oaGj/ZmZm/2RkZP9hYWH/X19f/1xcXP9aWlr/WFhY/1VVVf9TU1P/UVFR/05OTv9MTEz/SUlJ/0dH
+ R+9ERER/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGpqak9oaGivZmZm/2RkZP9hYWH/X19f/1xcXP9aWlr/WFhY/1VVVf9TU1P/UVFR/05O
+ Tt9LS0t/SkpKDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnZ2cPZWVlT2NjY39hYWG/Xl5ev1xcXL9aWlq/V1dXn1VV
+ VW9SUlIvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAP//wAA//4A
+ AD/4AAAf8AAAD+AAAAfgAAADwAAAA8AAAAGAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAIAAAACAAAAAgAAAAcAAAAHAAAAD4AAAA/AAAAf4AAAP/AAAH/4AAH//gAD//+AH/ygA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJycnPyIi
+ Iq8dHR3vGBgY/xQUFP8PDw//CwsLvwcHB18AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1NTUPMDAwrysr
+ K/8xMSL/RUUS/0REDv89PQv/NjYJ/xsbC/8KCgr/BgYGzwMDAy8AAAAAAAAAAAAAAAA/Pz8POTk5zzU1
+ Nf9kZBT/g4MA/3t7AP9ycgD/aWkA/2FhAP9ZWQD/PDwE/w4OCf8GBgbvAwMDLwAAAAAAAAAAQ0NDjz4+
+ Pv94eBv/lJQA/4uLAP+DgwD/e3sA/3JyAP9paQD/YWEA/1lZAP9ERAL/Dg4J/wYGBs8AAAAATExMH0hI
+ SP97ezb/qakY/56eCP+UlAD/i4sA/4ODAP97ewD/cnIA/2lpAP9hYQD/WVkA/0BAA/8KCgr/BwcHX1BQ
+ UI9MTEz/uLg7/7S0Kv+pqRj/np4I/5SUAP+LiwD/g4MA/3t7AP9ycgD/aWkA/1NTBP9ZWQD/GxsL/woK
+ Cs9VVVW/cnJT/8vKS//Avzv/tLQq/6mpGP+engj/lJQA/4uLAP+DgwD/e3sA/3JyAP9JSQz/KioT/y4u
+ DP8PDw//W1tb75KSX//OzVz/e3tM/8C/O/+0tCr/e3sr/19fJ/99fQ3/dXUL/21tCv9mZgn/QUEU/yIi
+ G/80NA7/FBQU/19fX99+fmL/X19X/2ppUv+Likr/g4NA/3t7Nf9zcyr/WVkq/1hYIf+LiwD/g4MA/1ZW
+ EP9tbQL/TU0K/xgYGP9kZGS/hYVq/66tcf+BgVz/1tVc/8vKS//Avzv/tLQq/6mpGP+engj/lJQA/4uL
+ AP+DgwD/e3sA/0VFEv8dHR3/Z2dnb2RkZP/k44j/29p7/9nYbP/W1Vz/y8pL/8C/O/+0tCr/qakY/56e
+ CP+UlAD/i4sA/4ODAP8xMSL/IiIir2trax9paWn/lZR1//j3j//t7H//4eFu/9bVXP/Lykv/wL87/7S0
+ Kv+pqRj/np4I/5SUAP9kZBT/Kysr/ygoKF8AAAAAa2trf2lpaf/FxIb/+PeP/+3sf//h4W7/1tVc/8vK
+ S//Avzv/tLQq/6mpGP+LixH/Ozsx/zAwML8AAAAAAAAAAAAAAABra2ufaWlp/6iofP/u7Yz/7ex//+Hh
+ bv/W1Vz/y8pL/8C/O/97ezb/RUU8/zk5Oc81NTUPAAAAAAAAAAAAAAAAAAAAAGtra39paWn/ZGRk/4WF
+ av+jomv/m5tg/3p6VP9UVEz/SEhI/0NDQ68/Pz8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2trH2ho
+ aI9kZGS/X19f/1tbW/9WVlbPUVFRn0xMTD8AAAAAAAAAAAAAAAAAAAAA8A8AAMADAACAAQAAgAEAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAMABAADgAwAA8A8AAA==
+
+
+
\ No newline at end of file
diff --git a/Samples/Oxygene/Virtual FTP/VirtualFTP.2008.sln b/Samples/Oxygene/Virtual FTP/VirtualFTP.2008.sln
new file mode 100644
index 0000000..40fef59
--- /dev/null
+++ b/Samples/Oxygene/Virtual FTP/VirtualFTP.2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "VirtualFTP", "VirtualFTP.oxygene", "{71130CD9-002B-49BC-811A-1F172BFBAA28}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Debug|Default.ActiveCfg = Debug
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Debug|Default.Build.0 = Debug
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Release|Default.ActiveCfg = Release
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/Virtual FTP/VirtualFTP.2010.sln b/Samples/Oxygene/Virtual FTP/VirtualFTP.2010.sln
new file mode 100644
index 0000000..353a1c8
--- /dev/null
+++ b/Samples/Oxygene/Virtual FTP/VirtualFTP.2010.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2008
+Project("{656346D9-4656-40DA-A068-22D5425D4639}") = "VirtualFTP", "VirtualFTP.oxygene", "{71130CD9-002B-49BC-811A-1F172BFBAA28}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Debug|Default.ActiveCfg = Debug
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Debug|Default.Build.0 = Debug
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Release|Default.ActiveCfg = Release
+ {71130CD9-002B-49BC-811A-1F172BFBAA28}.Release|Default.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Oxygene/Virtual FTP/VirtualFTP.Sample.html b/Samples/Oxygene/Virtual FTP/VirtualFTP.Sample.html
new file mode 100644
index 0000000..17a3adf
--- /dev/null
+++ b/Samples/Oxygene/Virtual FTP/VirtualFTP.Sample.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+ Virtual FTP Sample
+
+
+
+
Purpose
+
+This sample shows how to create and configure virtual FTP. This supports building
+ a virtual folder structure, similar to IIS, based on real and non-existing folders.
+
+Note:
+
+To connect to Virtual FTP, please use port 4444. (ftp://localhost:4444/)
+ UserName=test
+ Password=test
+
+
+
Examine the Code
+
+
Look at the StartServer function. There you can find how you can configure your ftp.
+You can add a VirtualFolder or a DiskFolder.
+
+
Also there you can see how to add the users allowed to use this ftp.
+
+
+
Getting started
+
+
Build the application.
+
Run the application and start the virtual FTP
+
With the help of the link on the form, open virtual FTP in your WebBrowser
+ Please keep the following things in mind when working with the samples:
+
+
+ To help you find the sample you need and also to provide a suggested start order,
+ the samples are listed in one or more categories followed by the actual sample descriptions
+ in alphabetical order.
+
There is an html file provided in the top level folder of each sample. These files
+ contain useful notes and we recommend that you read the appropriate file before
+ running a sample.
+
There may be samples shipped that are not listed below. Samples are
+ not added to the list until they have passed our final quality inspection. This
+ doesn't mean they are faulty, only that they are still pending final inspection.
+
+
+
+ Sample Categories
+
+
+
+
+
+ Category
+
+
+
+
+ Samples
+
+
+
+
+
+ Introduction
+
+ HTTP Responses
+ HTTP Spy
+
+
+
+
+
+
+ Intermediate
+
+ Sample Server
+ SMTP Client
+
+
+
+
+
+ Advanced
+
+ FTP Sync
+ Virtual FTP
+
+
+
+
+
+ Sample Descriptions
+
+
Samples are provided for more than one language.
+
The versions below relate to
+ the folders under the ..\Samples folder.
+
+
+
+
+
+ Name
+
+ Versions
+
+ Category
+
+ Description
+
+
+
+
+ FtpSync
+
+ C#, Oxygene, VB
+
+ Advanced
+
+ This sample compares files on the local computer against those on an ftp folder
+ and downloads files that are new or have changed.
+
+
+
+
+ HTTP Responses
+
+ C#, Oxygene, VB
+
+ Introduction
+
+ This sample shows how to create and configure a simple HTTP server.
+
+
+
+
+ HTTP Spy
+
+ C#, Oxygene, VB
+
+ Introduction
+
+ This example demonstrates how HTTP works. With help of the HttpClient components,
+ we can send a HttpClientRequest and retrieve back a HttpClientResponse.
+
+
+
+
+ Sample Server
+
+ C#, Oxygene, Delphi, VB
+
+ Intermediate
+
+ This example shows how easy it is to create a simple custom Http server.
+
+
+
+
+ SMTP Client
+
+ C#, Oxygene, VB
+
+ Intermediate
+
+ The sample shows how we can use the SMTP client component for sending emails.
+
+
+
+
+ Virtual FTP
+
+ C#, Oxygene, VB
+
+ Advanced
+
+ This sample shows how to create and configure virtual FTP.
+
+
\ No newline at end of file
diff --git a/Samples/Styles.css b/Samples/Styles.css
new file mode 100644
index 0000000..c8e0628
--- /dev/null
+++ b/Samples/Styles.css
@@ -0,0 +1,103 @@
+body
+{
+ background-color: #f7f7f7;
+ margin-top: 15px;
+ margin-bottom: 15px;
+ margin-left: 15px;
+ margin-right: 15px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-family: tahoma, verdana, sans-serif;
+ font-size: 10pt;
+ width: 700px;
+ color: #000000;
+}
+p
+{
+ padding-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0.5em;
+}
+ul
+{
+ padding-top: 0;
+ padding-bottom: 0;
+ list-style-type: disc;
+}
+li
+{
+ padding-top: 0;
+ padding-bottom: 0;
+}
+img
+{
+ margin: 5px;
+ border-width: 0;
+}
+table
+{
+ background-color: #f7f7f7;
+ margin: 15px;
+ padding: 0px;
+ font-size: 10pt;
+}
+tr
+{
+ background-color: #f7f7f7;
+ margin: 15px;
+ padding: 0px;
+ font-size: 10pt;
+}
+td, th
+{
+ background-color: #f7f7f7;
+ margin: 0;
+ padding: 5px;
+ font-size: 10pt;
+}
+td ul
+{
+ padding-left: 2em;
+}
+
+img:left { margin-left: 0; }
+img:right { margin-right: 0; }
+p.h1
+{
+ margin-top: 1em;
+ margin-bottom: 0.5px;
+ padding-bottom:0px;
+ font-size:13pt;
+ font-weight:bold;
+}
+p.h2
+{
+ margin-top: 1em;
+ margin-bottom: 0.5px;
+ padding-bottom:0px;
+ font-size:11pt;
+ font-weight:bold;
+}
+p.h3
+{
+ margin-top: 1em;
+ margin-bottom: 0.5px;
+ padding-bottom:0px;
+ font-size:10pt;
+ font-weight:bold;
+}
+pre
+{
+ margin-top:0px;
+ margin-bottom:0px;
+ margin-left:0px;
+ margin-right:0px;
+}
+.spaced
+{
+ letter-spacing:1px;
+ color:#000060;
+}
diff --git a/Samples/VB/FTP Sync/AssemblyInfo.vb b/Samples/VB/FTP Sync/AssemblyInfo.vb
new file mode 100644
index 0000000..705ac1e
--- /dev/null
+++ b/Samples/VB/FTP Sync/AssemblyInfo.vb
@@ -0,0 +1,32 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+
+
+
+
+
+
+
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+
+
+' Version information for an assembly consists of the following four values:
+'
+' Major Version
+' Minor Version
+' Build Number
+' Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+
+
diff --git a/Samples/VB/FTP Sync/FtpSync.2008.sln b/Samples/VB/FTP Sync/FtpSync.2008.sln
new file mode 100644
index 0000000..64aa84c
--- /dev/null
+++ b/Samples/VB/FTP Sync/FtpSync.2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "FtpSync", "FtpSync.2008.vbproj", "{3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/VB/FTP Sync/FtpSync.2008.vbproj b/Samples/VB/FTP Sync/FtpSync.2008.vbproj
new file mode 100644
index 0000000..a391775
--- /dev/null
+++ b/Samples/VB/FTP Sync/FtpSync.2008.vbproj
@@ -0,0 +1,110 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}
+ Debug
+ AnyCPU
+
+
+
+
+ FtpSync
+
+
+ None
+ JScript
+ Grid
+ IE50
+ false
+ Exe
+ Binary
+ On
+ Off
+ FtpSync
+ FtpSync.FtpSyncMain
+
+
+ Console
+
+
+ 2.0
+
+
+ bin\
+ FtpSync.xml
+ 285212672
+
+
+
+
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ full
+
+
+ bin\
+ FtpSync.xml
+ 285212672
+
+
+
+
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ none
+
+
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.XML
+
+
+
+
+
+
+
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/VB/FTP Sync/FtpSync.2010.sln b/Samples/VB/FTP Sync/FtpSync.2010.sln
new file mode 100644
index 0000000..00bf712
--- /dev/null
+++ b/Samples/VB/FTP Sync/FtpSync.2010.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "FtpSync", "FtpSync.2010.vbproj", "{3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/VB/FTP Sync/FtpSync.2010.vbproj b/Samples/VB/FTP Sync/FtpSync.2010.vbproj
new file mode 100644
index 0000000..0b9454b
--- /dev/null
+++ b/Samples/VB/FTP Sync/FtpSync.2010.vbproj
@@ -0,0 +1,116 @@
+
+
+ Local
+ 10.0.20506
+ 2.0
+ {3AD70679-57DE-4CF2-B7AF-BB9F320E9DB8}
+ Debug
+ AnyCPU
+
+
+
+
+ FtpSync
+
+
+ None
+ JScript
+ Grid
+ IE50
+ false
+ Exe
+ Binary
+ On
+ Off
+ FtpSync
+ FtpSync.FtpSyncMain
+
+
+ Console
+
+
+ 3.5
+ v2.0
+
+
+ bin\
+ FtpSync.xml
+ 285212672
+
+
+
+
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ full
+ AllRules.ruleset
+
+
+ bin\
+ FtpSync.xml
+ 285212672
+
+
+
+
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ none
+ AllRules.ruleset
+
+
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.XML
+
+
+
+
+
+
+
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/VB/FTP Sync/FtpSync.Sample.html b/Samples/VB/FTP Sync/FtpSync.Sample.html
new file mode 100644
index 0000000..2822611
--- /dev/null
+++ b/Samples/VB/FTP Sync/FtpSync.Sample.html
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+ FtpSync Sample
+
+
+
+
Purpose
+
+ This sample shows how to use the FtpClient class to gain access to an ftp
+ site and download files from there.
+The
+FtpSync application compares files on the local computer against those on the ftp folder and downloads files that are new or have changed.
+
+FtpSync is a console application with following uasge:
+
+
+
+FtpSync local user:pass@server/remote [-delete] [-passive] [-l]
+
+
+
+
+where:
+
+
+
+
local
:
local directory - long file names with spaces should be quoted
+
user/pass
:
ftp username & password
+
server
:
ftp server (i.e., ftp.whatever.com)
+
remote
:
directory on the remote server
+
-delete
:
delete local files that don't exist on the server
+
-passive
:
turn on 'Passive' mode
+
-l
:
log - show FTP commands
+
+
+
+
+
+
Getting started
+
+
Build the application.
+
Run the application with your parameters. Try to synchronize your local folder with an ftp folder
+
+
+
+
\ No newline at end of file
diff --git a/Samples/VB/FTP Sync/FtpSyncMain.vb b/Samples/VB/FTP Sync/FtpSyncMain.vb
new file mode 100644
index 0000000..3ce7921
--- /dev/null
+++ b/Samples/VB/FTP Sync/FtpSyncMain.vb
@@ -0,0 +1,10 @@
+Module FtpSyncMain
+
+ Sub Main(ByVal args As String())
+ Dim lWorker As FtpSyncWorker
+ lWorker = New FtpSyncWorker
+ If lWorker.CheckArgs(args) Then
+ lWorker.Sync()
+ End If
+ End Sub
+End Module
diff --git a/Samples/VB/FTP Sync/FtpSyncWorker.vb b/Samples/VB/FTP Sync/FtpSyncWorker.vb
new file mode 100644
index 0000000..251a149
--- /dev/null
+++ b/Samples/VB/FTP Sync/FtpSyncWorker.vb
@@ -0,0 +1,284 @@
+Imports System
+Imports System.IO
+Imports System.Collections.Specialized
+Imports System.Text.RegularExpressions
+Imports RemObjects.InternetPack.Ftp
+Public Class FtpSyncWorker
+
+ Public Sub New()
+
+ End Sub
+
+#Region " private fields... "
+ Private _LocalDirectory As String
+ Private _Server As String
+ Private _ServerDirectory As String
+ Private _Username As String
+ Private _Password As String
+ Private _DeleteMissing As Boolean
+ Private _Upload As Boolean
+ Private _Subdirectories As Boolean
+ Private _Passive As Boolean
+ Private _ShowLog As Boolean
+ Private WithEvents _Ftp As FtpClient
+#End Region
+
+
+ Public Sub Log(ByVal Sender As Object, ByVal ea As RemObjects.InternetPack.CommandBased.ClientLogArgs) Handles _Ftp.OnLog
+ If _ShowLog Then
+ Console.WriteLine(ea.Text)
+ End If
+ End Sub
+
+ Private Sub _Ftp_OnTransferProgress(ByVal aSender As Object, ByVal ea As RemObjects.InternetPack.Events.TransferProgressEventArgs) Handles _Ftp.OnTransferProgress
+ Console.Write(".")
+ End Sub
+
+ Public Sub Sync()
+
+ Try
+ _Ftp = New FtpClient
+ _Ftp.HostName = _Server
+ _Ftp.UserName = _Username
+ _Ftp.Password = _Password
+ _Ftp.Passive = _Passive
+ _Ftp.Port = 21
+
+ '_Ftp.OnLog += new RemObjects.InternetPack.CommandBased.ClientLogEvent(Log);
+ ' _Ftp.OnTransferProgress +=new RemObjects.InternetPack.Events.TransferProgressEventHandler(_Ftp_OnTransferProgress);
+ Console.WriteLine("Connecting to " & _Server)
+ _Ftp.Open()
+ Try
+ _Ftp.Login()
+ SyncDirectory(_LocalDirectory, "/" & _ServerDirectory)
+ Finally
+ Console.WriteLine("Disconnecting")
+ _Ftp.Quit()
+ _Ftp.Close()
+ End Try
+
+ Catch ex As Exception
+ Console.WriteLine("Error syncing directory ({0})", ex.Message)
+ If ex.StackTrace <> Nothing And _ShowLog Then
+ Console.WriteLine(ex.StackTrace)
+ End If
+ Console.WriteLine("Press enter to continue...")
+ Console.ReadLine()
+ End Try
+ End Sub
+
+ Public Sub SyncDirectory(ByVal aLocalDirectory As String, ByVal aRemoteDirectory As String)
+ Dim lOriginalLocalDirectory As String
+ lOriginalLocalDirectory = Directory.GetCurrentDirectory()
+ Dim lOriginalRemoteDirectory As String
+ lOriginalRemoteDirectory = _Ftp.GetCurrentDirectory()
+ Try
+ Console.WriteLine("Local change directory to " + aLocalDirectory)
+ Directory.SetCurrentDirectory(aLocalDirectory)
+ Console.WriteLine("Remote change directory to " + aRemoteDirectory)
+ _Ftp.ChangeDirectory(aRemoteDirectory)
+ Console.WriteLine("")
+
+ Console.WriteLine("Retrieving directory contents")
+ _Ftp.List()
+ Console.WriteLine("")
+
+ Dim localFiles As StringCollection
+ localFiles = New StringCollection
+ localFiles.AddRange(Directory.GetFiles(aLocalDirectory))
+
+ If _Upload Then
+ Console.WriteLine("Upload not yet implemented")
+ End If
+
+ Dim i As Integer
+ For i = 0 To _Ftp.CurrentDirectoryContents.Count - 1
+ Dim lItem As FtpListingItem
+ lItem = _Ftp.CurrentDirectoryContents(i)
+
+ If Not lItem.Directory Then
+ Dim lDownload As Boolean
+ lDownload = False
+ If File.Exists(lItem.FileName) Then
+ Dim lInfo As FileInfo
+ lInfo = New FileInfo(lItem.FileName)
+
+ If lInfo.LastWriteTime <> lItem.FileDate Then
+ lDownload = True
+ End If
+
+ If lInfo.Length <> lItem.Size Then
+ lDownload = True
+ End If
+
+ localFiles.Remove(Path.Combine(aLocalDirectory, lItem.FileName))
+ Else
+ lDownload = True
+ End If
+
+ If lDownload Then
+ Console.WriteLine("Downloading " & lItem.FileName)
+ Dim lStream As Stream
+ lStream = File.Open(lItem.FileName, FileMode.Create)
+
+ With lStream
+ _Ftp.Retrieve(lItem, lStream)
+ lStream.Close()
+ File.SetLastWriteTime(lItem.FileName, lItem.FileDate)
+ End With
+ Console.WriteLine("")
+ End If
+ End If
+ Next
+
+ If _DeleteMissing Then
+ Dim ii As Integer
+ For ii = 0 To localFiles.Count - 1
+ File.Delete(localFiles(ii))
+ Next
+ End If
+
+ Finally
+ Directory.SetCurrentDirectory(lOriginalLocalDirectory)
+ _Ftp.ChangeDirectory(lOriginalRemoteDirectory)
+ Console.WriteLine("")
+ End Try
+ End Sub
+
+ Public Function CheckArgs(ByVal args As String()) As Boolean
+ Dim lCount As Integer
+ lCount = args.Length
+ Dim lBadParam As Boolean
+ lBadParam = False
+
+ If (lCount > 0) Then
+ _LocalDirectory = args(0)
+ Else
+ lBadParam = True
+ End If
+
+ If (lCount > 1) Then
+ Dim lMatch As Match
+ lMatch = Regex.Match(args(1), "(?\S+):(?\S+)@(?[^/\s]+)/(?\S*)")
+ If lMatch.Success Then
+ _Username = lMatch.Groups("user").Value
+ _Password = lMatch.Groups("pass").Value
+ _Server = lMatch.Groups("server").Value
+ _ServerDirectory = lMatch.Groups("dir").Value
+ Else
+ lBadParam = True
+ Console.WriteLine("Invalid server parameters")
+ Console.WriteLine("")
+ End If
+ Else
+ lBadParam = True
+ End If
+ Dim i As Integer
+ For i = 2 To lCount - 1
+ Select Case args(i).ToLower()
+ Case "-delete"
+ _DeleteMissing = True
+ Case "-upload"
+ _Upload = True
+ Case "-passive"
+ _Passive = True
+ Case "-s"
+ _Subdirectories = True
+ Case "-l"
+ _ShowLog = True
+ Case "-help"
+ lBadParam = True
+ Case "/help"
+ lBadParam = True
+ Case Else
+ Console.WriteLine("Invalid command line paramter '" & args(i) & "'")
+ Console.WriteLine("")
+ lBadParam = True
+ End Select
+ Next
+
+ If lBadParam Then
+ Console.WriteLine("RemObjects Internet Pack - FtpSync Sample")
+ Console.WriteLine("")
+ Console.WriteLine(" Usage: FtpSync local user:pass@server/remote [-delete] [-passive] [-l]")
+ Console.WriteLine()
+ Console.WriteLine(" Compares files on local computer against those on the remote server, ")
+ Console.WriteLine(" downloading those that are new or have changed.")
+ Console.WriteLine()
+ Console.WriteLine(" local : local directory - long file names with spaces should be quoted")
+ Console.WriteLine(" user/pass : ftp username & password")
+ Console.WriteLine(" server : ftp server (i.e., ftp.whatever.com")
+ Console.WriteLine(" remote : directory on remote server")
+ Console.WriteLine()
+ Console.WriteLine(" -delete : delete local files that don't exist on server")
+ Console.WriteLine(" -passive : turn on 'Passive mode'")
+ 'Console.WriteLine(" -upload : reverse comparision & transfer direction")
+ 'Console.WriteLine(" -s : recurse through subdirectories")
+ Console.WriteLine(" -l : log - show FTP commands")
+ Console.WriteLine()
+ Console.WriteLine("Press enter to exit.")
+ Console.ReadLine()
+ End If
+ Return Not lBadParam
+ End Function
+
+#Region "public properties..."
+
+ Property LocalDirectory() As String
+ Get
+ Return _LocalDirectory
+ End Get
+ Set(ByVal Value As String)
+ _LocalDirectory = Value
+ End Set
+ End Property
+ Property Server() As String
+ Get
+ Return _Server
+ End Get
+ Set(ByVal Value As String)
+ _Server = Value
+ End Set
+ End Property
+ Property ServerDirectory() As String
+ Get
+ Return _ServerDirectory
+ End Get
+ Set(ByVal Value As String)
+ _ServerDirectory = Value
+ End Set
+ End Property
+ Property DeleteMissing() As Boolean
+ Get
+ Return _DeleteMissing
+ End Get
+ Set(ByVal Value As Boolean)
+ _DeleteMissing = Value
+ End Set
+ End Property
+ Property Upload() As Boolean
+ Get
+ Return _Upload
+ End Get
+ Set(ByVal Value As Boolean)
+ _Upload = Value
+ End Set
+ End Property
+ Property Subdirectories() As Boolean
+ Get
+ Return _Subdirectories
+ End Get
+ Set(ByVal Value As Boolean)
+ _Subdirectories = Value
+ End Set
+ End Property
+ Property Passive() As Boolean
+ Get
+ Return _Passive
+ End Get
+ Set(ByVal Value As Boolean)
+ _Passive = Value
+ End Set
+ End Property
+#End Region
+End Class
diff --git a/Samples/VB/HTTP Responses/App.ico b/Samples/VB/HTTP Responses/App.ico
new file mode 100644
index 0000000..4680a4e
Binary files /dev/null and b/Samples/VB/HTTP Responses/App.ico differ
diff --git a/Samples/VB/HTTP Responses/AssemblyInfo.vb b/Samples/VB/HTTP Responses/AssemblyInfo.vb
new file mode 100644
index 0000000..490d2bc
--- /dev/null
+++ b/Samples/VB/HTTP Responses/AssemblyInfo.vb
@@ -0,0 +1,32 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+
+
+
+
+
+
+
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+
+
+' Version information for an assembly consists of the following four values:
+'
+' Major Version
+' Minor Version
+' Build Number
+' Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+
+
diff --git a/Samples/VB/HTTP Responses/HTTPResponses.2008.sln b/Samples/VB/HTTP Responses/HTTPResponses.2008.sln
new file mode 100644
index 0000000..ec955aa
--- /dev/null
+++ b/Samples/VB/HTTP Responses/HTTPResponses.2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HTTPResponses", "HTTPResponses.2008.vbproj", "{0665746D-617A-40CB-9A20-BC7A1B297CB6}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/VB/HTTP Responses/HTTPResponses.2008.vbproj b/Samples/VB/HTTP Responses/HTTPResponses.2008.vbproj
new file mode 100644
index 0000000..7256b87
--- /dev/null
+++ b/Samples/VB/HTTP Responses/HTTPResponses.2008.vbproj
@@ -0,0 +1,118 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}
+ Debug
+ AnyCPU
+ App.ico
+
+
+ HTTPResponses
+
+
+ None
+ JScript
+ Grid
+ IE50
+ false
+ WinExe
+ Binary
+ On
+ Off
+ HTTPResponses
+ HTTPResponses.MainForm
+
+
+ WindowsFormsWithCustomSubMain
+
+
+ 2.0
+
+
+ bin\
+ HTTPResponses.xml
+ 285212672
+
+
+
+
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ full
+
+
+ bin\
+ HTTPResponses.xml
+ 285212672
+
+
+
+
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ none
+
+
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Drawing
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Code
+
+
+ Form
+
+
+ MainForm.vb
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/VB/HTTP Responses/HTTPResponses.2010.sln b/Samples/VB/HTTP Responses/HTTPResponses.2010.sln
new file mode 100644
index 0000000..ac8e542
--- /dev/null
+++ b/Samples/VB/HTTP Responses/HTTPResponses.2010.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HTTPResponses", "HTTPResponses.2010.vbproj", "{0665746D-617A-40CB-9A20-BC7A1B297CB6}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/VB/HTTP Responses/HTTPResponses.2010.vbproj b/Samples/VB/HTTP Responses/HTTPResponses.2010.vbproj
new file mode 100644
index 0000000..e56c263
--- /dev/null
+++ b/Samples/VB/HTTP Responses/HTTPResponses.2010.vbproj
@@ -0,0 +1,124 @@
+
+
+ Local
+ 10.0.20506
+ 2.0
+ {0665746D-617A-40CB-9A20-BC7A1B297CB6}
+ Debug
+ AnyCPU
+ App.ico
+
+
+ HTTPResponses
+
+
+ None
+ JScript
+ Grid
+ IE50
+ false
+ WinExe
+ Binary
+ On
+ Off
+ HTTPResponses
+ HTTPResponses.MainForm
+
+
+ WindowsFormsWithCustomSubMain
+
+
+ 3.5
+ v2.0
+
+
+ bin\
+ HTTPResponses.xml
+ 285212672
+
+
+
+
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ full
+ AllRules.ruleset
+
+
+ bin\
+ HTTPResponses.xml
+ 285212672
+
+
+
+
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+ 1
+ 42016,42017,42018,42019,42032
+ none
+ AllRules.ruleset
+
+
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Drawing
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Code
+
+
+ Form
+
+
+ MainForm.vb
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/VB/HTTP Responses/HttpResponses.Sample.html b/Samples/VB/HTTP Responses/HttpResponses.Sample.html
new file mode 100644
index 0000000..3fa0428
--- /dev/null
+++ b/Samples/VB/HTTP Responses/HttpResponses.Sample.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+ HTTP Responses Sample
+
+
+
+
Purpose
+
+This sample shows how to create and configure a simple HTTP server.
+
+
+
Examine the Code
+
+
+See the httpServer_OnHttpRequest handler, where all possible RequestPaths
+ are processed.
+The options possible are as follows:
+
+
/ or /home - load home page with all available links.
+
/file - download the HttpResponses application.
+
/bytes - download random.bin file that contains random generated data.
+
/error - shows a custom error with code 555.
+
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run the application.
+
Click the link on the top of the application window to open the home page of our server in your web browser.
" & _
+ "Valid links:" & _
+ " " & _
+ "/home show this page" & _
+ " " & _
+ "/file send back a file (this .exe)" & _
+ " " & _
+ "/bytes send back a buffer of random bytes" & _
+ " " & _
+ "/error Display a custom error"
+
+#Region " Windows Form Designer generated code "
+
+ Public Sub New()
+ MyBase.New()
+
+ Application.EnableVisualStyles()
+
+ 'This call is required by the Windows Form Designer.
+ InitializeComponent()
+
+ 'Add any initialization after the InitializeComponent() call
+ End Sub
+
+ 'Form overrides dispose to clean up the component list.
+ Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
+ If disposing Then
+ If Not (components Is Nothing) Then
+ components.Dispose()
+ End If
+ End If
+ MyBase.Dispose(disposing)
+ End Sub
+
+ 'Required by the Windows Form Designer
+ Private components As System.ComponentModel.IContainer
+
+ 'NOTE: The following procedure is required by the Windows Form Designer
+ 'It can be modified using the Windows Form Designer.
+ 'Do not modify it using the code editor.
+ Friend WithEvents lb_Log As System.Windows.Forms.ListBox
+ Friend WithEvents llblinkLabel1 As System.Windows.Forms.LinkLabel
+ Friend WithEvents HttpServer As RemObjects.InternetPack.Http.HttpServer
+ Private Sub InitializeComponent()
+ Me.components = New System.ComponentModel.Container
+ Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainForm))
+ Me.lb_Log = New System.Windows.Forms.ListBox
+ Me.llblinkLabel1 = New System.Windows.Forms.LinkLabel
+ Me.HttpServer = New RemObjects.InternetPack.Http.HttpServer(Me.components)
+ Me.SuspendLayout()
+ '
+ 'lb_Log
+ '
+ Me.lb_Log.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
+ Or System.Windows.Forms.AnchorStyles.Left) _
+ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
+ Me.lb_Log.IntegralHeight = False
+ Me.lb_Log.Location = New System.Drawing.Point(11, 34)
+ Me.lb_Log.Name = "lb_Log"
+ Me.lb_Log.Size = New System.Drawing.Size(371, 226)
+ Me.lb_Log.TabIndex = 3
+ '
+ 'llblinkLabel1
+ '
+ Me.llblinkLabel1.Location = New System.Drawing.Point(8, 10)
+ Me.llblinkLabel1.Name = "llblinkLabel1"
+ Me.llblinkLabel1.Size = New System.Drawing.Size(100, 23)
+ Me.llblinkLabel1.TabIndex = 2
+ Me.llblinkLabel1.TabStop = True
+ Me.llblinkLabel1.Text = "http://localhost:82"
+ '
+ 'HttpServer
+ '
+ Me.HttpServer.Port = 82
+ Me.HttpServer.ValidateRequests = False
+ '
+ 'MainForm
+ '
+ Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
+ Me.ClientSize = New System.Drawing.Size(394, 272)
+ Me.Controls.Add(Me.lb_Log)
+ Me.Controls.Add(Me.llblinkLabel1)
+ Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
+ Me.MinimumSize = New System.Drawing.Size(410, 310)
+ Me.Name = "MainForm"
+ Me.Text = "Internet Pack HTTP Response Sample"
+ Me.ResumeLayout(False)
+
+ End Sub
+
+#End Region
+
+ Private Sub llblinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles llblinkLabel1.LinkClicked
+ Process.Start(llblinkLabel1.Text)
+ End Sub
+
+ Public Sub Invoke_LogMessage(ByVal aString As String)
+ lb_Log.Items.Add(aString)
+ End Sub
+
+ Private Delegate Sub InvokeDelegate(ByVal aString As String)
+
+ Private Sub HttpServer_OnHttpRequest(ByVal aSender As Object, ByVal ea As RemObjects.InternetPack.Http.OnHttpRequestArgs) Handles HttpServer.OnHttpRequest
+ Invoke(New InvokeDelegate(AddressOf Invoke_LogMessage), ea.Request.Header.RequestPath)
+ Select Case ea.Request.Header.RequestPath
+ Case "/", "/home"
+ ea.Response.ContentString = sWelcome
+ ea.Response.Header.SetHeaderValue("Content-Type", "text/html")
+
+
+ Case "/bytes"
+ Dim lBuffer(256) As Byte
+ Dim lRandom As Random
+ lRandom = New Random
+
+ lRandom.NextBytes(lBuffer)
+ ea.Response.ContentBytes = lBuffer
+ ea.Response.Header.SetHeaderValue("Content-Disposition", "filename=random.bin")
+ ea.Response.Header.SetHeaderValue("Content-Type", "application/binary")
+
+ Case "/error"
+ ea.Response.SendError(555, "Custom Error", "A custom error message")
+
+ Case "/file"
+ Dim lExeName As String = Me.GetType().Assembly.Location
+ Try
+ ea.Response.ContentStream = New System.IO.FileStream(lExeName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
+ ea.Response.Header.SetHeaderValue("Content-Disposition", String.Format("filename={0}", System.IO.Path.GetFileName(lExeName)))
+ ea.Response.Header.SetHeaderValue("Content-Type", "application/binary")
+ ea.Response.CloseStream = True ' default, anyway
+ Catch e As Exception
+ ea.Response.SendError(404, String.Format("File {0} not found", lExeName), e)
+ End Try
+
+ Case Else
+ ea.Response.SendError(404, "requested path not found")
+ End Select
+
+ End Sub
+
+ Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
+ HttpServer.Active = True
+ End Sub
+
+ Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
+ HttpServer.Active = False
+ End Sub
+
+End Class
diff --git a/Samples/VB/HTTP Spy/App.ico b/Samples/VB/HTTP Spy/App.ico
new file mode 100644
index 0000000..4680a4e
Binary files /dev/null and b/Samples/VB/HTTP Spy/App.ico differ
diff --git a/Samples/VB/HTTP Spy/AssemblyInfo.vb b/Samples/VB/HTTP Spy/AssemblyInfo.vb
new file mode 100644
index 0000000..40cb8a5
--- /dev/null
+++ b/Samples/VB/HTTP Spy/AssemblyInfo.vb
@@ -0,0 +1,32 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+
+
+
+
+
+
+
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+
+
+' Version information for an assembly consists of the following four values:
+'
+' Major Version
+' Minor Version
+' Build Number
+' Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+
+
diff --git a/Samples/VB/HTTP Spy/HTTPSpy.Sample.html b/Samples/VB/HTTP Spy/HTTPSpy.Sample.html
new file mode 100644
index 0000000..781cf29
--- /dev/null
+++ b/Samples/VB/HTTP Spy/HTTPSpy.Sample.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+ HTTPSpy Sample
+
+
+
+
Purpose
+
+This example demonstrates how HTTP works.
+With help of the HttpClient components, we can send a HttpClientRequest and retrieve back a HttpClientResponse. The application shows us the request and response header parameters and the context of the response in text and hex view.
+ Also, you have the ability to add your custom request header parameter.
+
+
+
Examine the Code
+
+
+See the btnSubmit_Click handler. This is the main function where we create and configure the HttpClientRequest and send it to the server with the help of the
+ HttpClient component.
+In order to get response from the server we call the Dispatch function with our HttpClientRequest instance as a parameter.
+
+
+
+
+
Getting started
+
+
+
Compile the project.
+
Run the application.
+
Using an existing URL, click on the "Submit" button. See the response of the request on the Result page.