Added Background and BackgroundVerticalOffset to Mod. Added more XML comments. Added LICENSE and README files.
Added Background and BackgroundVerticalOffset to Mod. Added more XML comments. Added LICENSE and README files.

--- a/KerbalStuff/KerbalStuff.cs
+++ b/KerbalStuff/KerbalStuff.cs
@@ -35,6 +35,8 @@
 // This software uses the FormUpload multipart/form-data library,
 // http://www.briangrinstead.com/blog/multipart-form-post-in-c.
 //
+// KerbalStuff is copyright © 2014 Drew DeVault.  Used under license.
+//
 
 using MiniJSON;
 using System;
@@ -46,6 +48,10 @@
 
 namespace KerbalStuff
 {
+	/// <summary>
+	/// <para>Class of static methods for accessing the read-write elements of the KerbalStuff API.</para>
+	/// <para>https://github.com/KerbalStuff/KerbalStuff/blob/master/api.md</para>
+	/// </summary>
 	public class KerbalStuff : KerbalStuffReadOnly
 	{
 
@@ -62,7 +68,7 @@
 		/// <summary>
 		/// <para>Performs a Login request to KerbalStuff with the given username and password, returning a Dictionary of
 		/// deserialized JSON objects received from KerbalStuff after the request, or null if an error occurs.</para>
-		/// <para>Sets <see cref="KerbalStuff.KerbalStuff.Cookies"/> on success.</para>
+		/// <para>Sets KerbalStuff.Cookies on success.</para>
 		/// </summary>
 		/// <param name="username">A valid KerbalStuff username, exact and case-sensitive.</param>
 		/// <param name="password">A valid KerbalStuff password associated with the username, exact and case-sensitive.</param>
@@ -220,6 +226,14 @@
 			return null;
 		}
 
+		/// <summary>
+		/// Executes an HTTP post request to the given URI, including the given Dictionary of post parameters as
+		/// multipart/form-data.  If cookieCollection is not null, includes the given cookies as a part of the request.
+		/// <seealso cref="FormUpload"/>
+		/// </summary>
+		/// <param name="uri">Absolute URI</param>
+		/// <param name="postParams">String-keyed dictionary of objects to be serialized into multipart/form-data</param>
+		/// <param name="cookieCollection">Optional, cookies to be included with the request.</param>
 		protected static void ExecutePostRequest(string uri, Dictionary<string, object> postParams, CookieCollection cookieCollection = null)
 		{
 			currentJson = null;
@@ -257,6 +271,13 @@
 			}
 		}
 
+		/// <summary>
+		/// Reads in the file at the given path and generates a FormUpload.FileParameter object for use in postParam
+		/// Dictionaries.
+		/// </summary>
+		/// <returns>The zipball parameter.</returns>
+		/// <param name="fileName">Name of the file to be read</param>
+		/// <param name="filePath">Program-relative path of the file to be read</param>
 		protected static FormUpload.FileParameter ReadZipballParameter(string fileName, string filePath)
 		{
 			using (FileStream file = File.OpenRead(filePath))
@@ -281,6 +302,10 @@
 			}
 		}
 
+		/// <summary>
+		/// Constructor is protected to allow class inheritance, but the class is static and should not be instatiated.
+		/// </summary>
+		[Obsolete("Do not instantiate KerbalStuff objects; all class members are static.")]
 		protected KerbalStuff() {}
 	}
 }

--- a/KerbalStuff/KerbalStuff.csproj
+++ b/KerbalStuff/KerbalStuff.csproj
@@ -13,13 +13,13 @@
     <UseMSBuildEngine>False</UseMSBuildEngine>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>full</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>bin\Release</OutputPath>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <ConsolePause>false</ConsolePause>
     <PlatformTarget>x86</PlatformTarget>
+    <DocumentationFile>bin\Release\KerbalStuff.xml</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>

--- a/KerbalStuffReadOnly/KerbalStuffReadOnly.cs
+++ b/KerbalStuffReadOnly/KerbalStuffReadOnly.cs
@@ -35,6 +35,18 @@
 // This software uses the FormUpload multipart/form-data library,
 // http://www.briangrinstead.com/blog/multipart-form-post-in-c.
 //
+// KerbalStuff is copyright © 2014 Drew DeVault.  Used under license.
+//
+
+/*
+ * PATH NOTE:
+ * 
+ * All partial URI path string should end without a slash, and begin with a slash or protocol identifier.
+ * 
+ * GOOD: "https://kerbalstuff.com", "/api", "/mod/{0:s}"
+ * 
+ * BAD:  "kerbalstuff.com/", "api", "mod/{0:s}"
+ * */
 
 using MiniJSON;
 using System;
@@ -46,6 +58,10 @@
 
 namespace KerbalStuff
 {
+	/// <summary>
+	/// <para>Class of static methods for accessing the read-only elements of the KerbalStuff API.</para>
+	/// <para>https://github.com/KerbalStuff/KerbalStuff/blob/master/api.md</para>
+	/// </summary>
 	public class KerbalStuffReadOnly
 	{
 		/// <summary>
@@ -89,9 +105,7 @@
 		/// <param name="modId">The Id of Mod to be queried on KerbalStuff.</param>
 		public static Mod ModInfo(long modId)
 		{
-			string uri = string.Format(KerbalStuffAction.ModInfo.UriFormat, modId);
-
-			ExecuteGetRequest(uri, KerbalStuffAction.ModInfo.RequestMethod);
+			ExecuteGetRequest(KerbalStuffAction.ModInfo, modId);
 
 			Mod mod = null;
 
@@ -110,9 +124,7 @@
 		/// <param name="modId">The Id of the Mod to be queried on KerbalStuff.</param>
 		public static ModVersion ModLatest(long modId)
 		{
-			string uri = string.Format(KerbalStuffAction.ModLatest.UriFormat, modId);
-
-			ExecuteGetRequest(uri, KerbalStuffAction.ModLatest.RequestMethod);
+			ExecuteGetRequest(KerbalStuffAction.ModLatest, modId);
 
 			ModVersion ver = null;
 
@@ -131,9 +143,7 @@
 		/// <param name="query">The search query</param>
 		public static List<Mod> ModSearch(string query)
 		{
-			string uri = string.Format(KerbalStuffAction.ModSearch.UriFormat, query);
-
-			ExecuteGetRequest(uri, KerbalStuffAction.ModSearch.RequestMethod);
+			ExecuteGetRequest(KerbalStuffAction.ModSearch, query);
 
 			List<Mod> rList = new List<Mod>();
 
@@ -158,7 +168,7 @@
 		/// <param name="username">The exact, case-sensitive username to query.</param>
 		public static User UserInfo(string username)
 		{
-			ExecuteGetRequest(KerbalStuffAction.UserInfo, false, username);
+			ExecuteGetRequest(KerbalStuffAction.UserInfo, username);
 
 
 			User user = null;
@@ -179,7 +189,7 @@
 		/// <param name="query">Query.</param>
 		public static List<User> UserSearch(string query)
 		{
-			ExecuteGetRequest(KerbalStuffAction.UserSearch, false, query);
+			ExecuteGetRequest(KerbalStuffAction.UserSearch, query);
 
 			List<User> users = new List<User>();
 
@@ -194,16 +204,29 @@
 			return users;
 		}
 
+		/// <summary>
+		/// The current HTTP request delivered in an API action.  Reset to null at the beginning of each new action.
+		/// </summary>
 		protected static HttpWebRequest currentRequest;
 
-		protected static void ExecuteGetRequest(KerbalStuffAction action, bool assignCookies, params object[] formatArgs)
+		/// <summary>
+		/// Executes an HTTP GET request using the URI format from the specified
+		/// <see cref="KerbalStuff.KerbalStuffAction"/> and objects for inclusion in the formatted URI string.
+		/// </summary>
+		/// <param name="action">A KerbalStuffAction object describing the desired API action.</param>
+		/// <param name="formatArgs">Format arguments</param>
+		protected static void ExecuteGetRequest(KerbalStuffAction action, params object[] formatArgs)
 		{
 			string uri = string.Format(action.UriFormat, formatArgs);
 
-			ExecuteGetRequest(uri, action.RequestMethod);
-		}
-
-		protected static void ExecuteGetRequest(string uri, string method)
+			ExecuteGetRequest(uri);
+		}
+
+		/// <summary>
+		/// Executes an HTTP GET request to the specified uri.
+		/// </summary>
+		/// <param name="uri">Absolute URI</param>
+		protected static void ExecuteGetRequest(string uri)
 		{
 			currentJson = null;
 			currentRequest = null;
@@ -216,15 +239,9 @@
 
 			uri = Uri.EscapeUriString(uri);
 
-			method = method.ToUpper();
-
-			if (method != "POST" && method != "GET")
-			{
-				throw new ArgumentOutOfRangeException("KerbalStuffWrapper.ExecuteRequest: method must be POST or GET.");
-			}
-
 			currentRequest = (HttpWebRequest)WebRequest.Create(uri);
-			currentRequest.Method = method;
+			currentRequest.Method = "GET";
+			currentRequest.UserAgent = UserAgent;
 
 			try
 			{
@@ -245,38 +262,82 @@
 			}
 		}
 
+		/// <summary>
+		/// Constructor is protected to allow class inheritance, but the class is static and should not be instatiated.
+		/// </summary>
+		[Obsolete("Do not instantiate KerbalStuffReadOnly objects; all class members are static.")]
 		protected KerbalStuffReadOnly() {}
 	}
 
+	/// <summary>
+	/// Struct describing a KerbalStuff API action.
+	/// </summary>
 	public struct KerbalStuffAction
 	{
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff create API action.
+		/// </summary>
 		public static readonly KerbalStuffAction Create = new KerbalStuffAction("create", "/mod/create", "POST");
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff login API action.
+		/// </summary>
 		public static readonly KerbalStuffAction Login = new KerbalStuffAction("login", "/login", "POST");
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff mod/&lt;mod_id&gt; API action.
+		/// </summary>
 		public static readonly KerbalStuffAction ModInfo = new KerbalStuffAction("modinfo", "/mod/{0:d}", "GET");
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff mod/&lt;mod_id&gt;/latest API action.
+		/// </summary>
 		public static readonly KerbalStuffAction ModLatest = new KerbalStuffAction(
 			"modlatest",
 			"/mod/{0:d}/latest",
 			"GET"
 		);
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff search/mod API action.
+		/// </summary>
 		public static readonly KerbalStuffAction ModSearch = new KerbalStuffAction(
 			"modsearch",
 			"/search/mod?query={0}",
 			"GET"
 		);
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff update API action.
+		/// </summary>
 		public static readonly KerbalStuffAction Update = new KerbalStuffAction("update", "/mod/{0:d}/update", "POST");
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff user/&lt;username&gt; API action.
+		/// </summary>
 		public static readonly KerbalStuffAction UserInfo = new KerbalStuffAction("userinfo", "/user/{0}", "GET");
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff search/user API action.
+		/// </summary>
 		public static readonly KerbalStuffAction UserSearch = new KerbalStuffAction(
 			"usersearch",
 			"/search/user?query={0}",
 			"GET"
 		);
 
+		/// <summary>
+		/// The name of the action, currently unused.
+		/// </summary>
 		public string Action;
 
+		/// <summary>
+		/// A format string for generating a URI path relative to the KerbalStuff root URI.
+		/// </summary>
 		public string UriPathFormat;
 
+		/// <summary>
+		/// The HTTP request method, "GET" or "POST".
+		/// </summary>
 		public string RequestMethod;
 
+		/// <summary>
+		/// Read-only access to the absolute URI format string containing the protocol and KerbalStuff root URI.
+		/// </summary>
+		/// <value>The URI format.</value>
 		public string UriFormat
 		{
 			get
@@ -285,10 +346,24 @@
 			}
 		}
 
-		public KerbalStuffAction(string action, string uriFormat, string requestMethod) : this()
-		{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="KerbalStuff.KerbalStuffAction"/> struct.
+		/// </summary>
+		/// <param name="action">The name of the action, currently unused.</param>
+		/// <param name="uriPathFormat">A format string for generating a URI path relative to the KerbalStuff root URI.</param>
+		/// <param name="requestMethod">The HTTP request method, "GET" or "POST".</param>
+		public KerbalStuffAction(string action, string uriPathFormat, string requestMethod) : this()
+		{
+			requestMethod = requestMethod.ToUpper();
+
+			if (requestMethod != "GET" && requestMethod != "POST")
+			{
+				throw new ArgumentOutOfRangeException(
+					"KerbalStuffAction.ctor: 'requestMethod' must be one of \"GET\" or \"POST\"");
+			}
+
 			this.Action = action;
-			this.UriPathFormat = uriFormat;
+			this.UriPathFormat = uriPathFormat;
 			this.RequestMethod = requestMethod;
 		}
 	}

--- a/KerbalStuffReadOnly/KerbalStuffReadOnly.csproj
+++ b/KerbalStuffReadOnly/KerbalStuffReadOnly.csproj
@@ -13,13 +13,13 @@
     <UseMSBuildEngine>False</UseMSBuildEngine>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>full</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>bin\Release</OutputPath>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <ConsolePause>false</ConsolePause>
     <PlatformTarget>x86</PlatformTarget>
+    <DocumentationFile>bin\Release\KerbalStuffReadOnly.xml</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>

--- a/KerbalStuffReadOnly/Mod.cs
+++ b/KerbalStuffReadOnly/Mod.cs
@@ -35,6 +35,8 @@
 // This software uses the FormUpload multipart/form-data library,
 // http://www.briangrinstead.com/blog/multipart-form-post-in-c.
 //
+// KerbalStuff is copyright © 2014 Drew DeVault.  Used under license.
+//
 
 using System;
 using System.Collections.Generic;
@@ -114,6 +116,25 @@
 		}
 
 		/// <summary>
+		/// The URI of the Mod's background image, relative to the mediacru.sh CDN root.
+		/// </summary>
+		public string Background
+		{
+			get;
+			private set;
+		}
+
+		/// <summary>
+		/// Gets the vertical offset of the Mod's background image, in pixels.
+		/// </summary>
+		/// <value>The background vertical offset.</value>
+		public long BackgroundVerticalOffset
+		{
+			get;
+			private set;
+		}
+
+		/// <summary>
 		/// A short (1000 characters or less) description of this Mod.
 		/// </summary>
 		public string ShortDescription
@@ -146,6 +167,8 @@
 			this.DefaultVersionId = (long)jsonDict["default_version_id"];
 			this.Id = (long)jsonDict["id"];
 			this.ShortDescription = (string)jsonDict["short_description"];
+			this.Background = (string)jsonDict["background"];
+			this.BackgroundVerticalOffset = (long)jsonDict["bg_offset_y"];
 
 			if (jsonDict.ContainsKey("versions"))
 			{

--- a/KerbalStuffReadOnly/User.cs
+++ b/KerbalStuffReadOnly/User.cs
@@ -34,6 +34,8 @@
 //
 // This software uses the FormUpload multipart/form-data library,
 // http://www.briangrinstead.com/blog/multipart-form-post-in-c.
+//
+// KerbalStuff is copyright © 2014 Drew DeVault.  Used under license.
 //
 
 using System;
@@ -140,7 +142,7 @@
 		/// Initializes a new instance of the <see cref="KerbalStuff.User"/> class from an ambiguously-typed dictionary
 		/// of JSON objects.
 		/// </summary>
-		/// <param name="jsonDict">Dictionary containing the JSON response from KerbalStuff.</param>
+		/// <param name="jsonObj">Dictionary containing the JSON response from KerbalStuff.</param>
 		public User(object jsonObj) : this((Dictionary<string, object>)jsonObj) {}
 
 		private User() {}

--- a/KerbalStuffWrapper.sln
+++ b/KerbalStuffWrapper.sln
@@ -7,7 +7,7 @@
 EndProject

 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KerbalStuff", "KerbalStuff\KerbalStuff.csproj", "{0CA12F64-AD3B-41E6-8A35-8781A8DAD1C1}"

 EndProject

-Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "Packages", "Packages.mdproj", "{8D7818A4-B406-46CD-855D-88457014F717}"

+Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "Packages", "Packages.mdproj", "{2CC7FF76-5C09-4329-92C1-DF48B954F1CE}"

 EndProject

 Global

 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

@@ -23,12 +23,12 @@
 		{1E93CDA7-56A8-410F-A5A2-0ABB9210CA58}.Debug|Any CPU.Build.0 = Debug|Any CPU

 		{1E93CDA7-56A8-410F-A5A2-0ABB9210CA58}.Release|Any CPU.ActiveCfg = Release|Any CPU

 		{1E93CDA7-56A8-410F-A5A2-0ABB9210CA58}.Release|Any CPU.Build.0 = Release|Any CPU

+		{2CC7FF76-5C09-4329-92C1-DF48B954F1CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

+		{2CC7FF76-5C09-4329-92C1-DF48B954F1CE}.Release|Any CPU.ActiveCfg = Release|Any CPU

 		{720FA70F-D785-48ED-BA45-561921E0EEEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

 		{720FA70F-D785-48ED-BA45-561921E0EEEC}.Debug|Any CPU.Build.0 = Debug|Any CPU

 		{720FA70F-D785-48ED-BA45-561921E0EEEC}.Release|Any CPU.ActiveCfg = Release|Any CPU

 		{720FA70F-D785-48ED-BA45-561921E0EEEC}.Release|Any CPU.Build.0 = Release|Any CPU

-		{8D7818A4-B406-46CD-855D-88457014F717}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{8D7818A4-B406-46CD-855D-88457014F717}.Release|Any CPU.ActiveCfg = Release|Any CPU

 	EndGlobalSection

 	GlobalSection(MonoDevelopProperties) = preSolution

 		StartupItem = KerbalStuffWrapper\KerbalStuffWrapper.csproj


--- a/KerbalStuffWrapper/KerbalStuffWrapper.cs
+++ b/KerbalStuffWrapper/KerbalStuffWrapper.cs
@@ -37,6 +37,8 @@
 // This software uses the FormUpload multipart/form-data library,
 // http://www.briangrinstead.com/blog/multipart-form-post-in-c.
 //
+// KerbalStuff is copyright © 2014 Drew DeVault.  Used under license.
+//
 
 using CLAP;
 using CLAP.Interception;

--- a/KerbalStuffWrapper/KerbalStuffWrapper.csproj
+++ b/KerbalStuffWrapper/KerbalStuffWrapper.csproj
@@ -55,4 +55,8 @@
       <Name>KerbalStuffReadOnly</Name>
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <None Include="README" />
+    <None Include="LICENSE" />
+  </ItemGroup>
 </Project>

--- /dev/null
+++ b/KerbalStuffWrapper/LICENSE
@@ -1,1 +1,45 @@
+KerbalStuffWrapper
 
+Author:
+	toadicus
+
+Copyright © 2014, toadicus
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+following conditions are met:
+
+	* Redistributions of source code must retain the above copyright notice, this list of conditions and the
+	  following disclaimer.
+	* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
+	  following disclaimer in the documentation and/or other materials provided with the distribution.
+	* Neither the name of the author nor the names of other contributors may be used to endorse or promote products
+	  derived from this software without specific prior written permission.
+ 	* Neither the name of the author nor the names of other contributors may be used to endorse or promote products
+ 	  derived from this software without specific prior written permission.¹
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+This software uses the CLAP .NET Command-Line Parser, Copyright © 2011 Adrian Aisemberg, SharpRegion.
+Used under license.
+
+This software uses the MiniJSON .NET JSON Parser, Copyright © 2013 Calvin Rien.  Used under license.
+
+This software uses the FormUpload multipart/form-data library,
+http:www.briangrinstead.com/blog/multipart-form-post-in-c.
+
+KerbalStuff is copyright © 2014 Drew DeVault.  Used under license.
+
+¹3rd clause applies only to KerbalStuffWrapper.exe; see README and full source at
+http://git.toad.homelinux.net/projects/KerbalStuffWrapper.git for more information.

--- /dev/null
+++ b/KerbalStuffWrapper/README
@@ -1,1 +1,17 @@
+KerbalStuffWrapper
 
+Author:
+	toadicus
+
+KerbalStuffWrapper is a suite of .NET-compatible utilities that provides access to the KerbalStuff API.  The suite is
+broken into three parts:
+
+ *	KerbalStuffReadOnly.dll	-	A library implementing access to the documented, read-only KerbalStuff API members.
+								This should be suitable for use in KSP mods for version checking and other purposes.
+								Released under the BSD 2-Clause license.
+ *	KerbalStuff.dll	-			A library implementing access to the document, read-write KerbalStuff API members.
+								Depends on and inherits from KerbalStuffReadOnly.dll.  This should be suitable for use
+								in external applications performing mod management for KerbalStuff users.  Released
+								under the BSD 2-Clause license.
+ *	KerbalStuffWrapper.exe -	A proof-of-concept console application providing command-line access to all documented
+								KerbalStuff API members.  Released under the BSD 3-Clause license.

--- a/KerbalStuffWrapper/Utils.cs
+++ b/KerbalStuffWrapper/Utils.cs
@@ -37,6 +37,8 @@
 // This software uses the FormUpload multipart/form-data library,
 // http://www.briangrinstead.com/blog/multipart-form-post-in-c.
 //
+// KerbalStuff is copyright © 2014 Drew DeVault.  Used under license.
+//
 
 using System;
 using System.Collections.Generic;