WebApi.Client

This commit is contained in:
mgesing 2022-09-29 16:10:00 +02:00
parent f5a8d45e10
commit 719e267e71
20 changed files with 2454 additions and 0 deletions

View File

@ -25,6 +25,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{5135A2B0
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smartstore.Packager", "tools\Smartstore.Packager\Smartstore.Packager.csproj", "{4BFFDE97-4EC0-423E-91C6-A202FD0A5978}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smartstore.WebApi.Client", "tools\Smartstore.WebApi.Client\Smartstore.WebApi.Client.csproj", "{784C2C99-F3D5-4B70-B571-C5A944C7DC96}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -50,6 +52,12 @@ Global
{4BFFDE97-4EC0-423E-91C6-A202FD0A5978}.DebugNoRazorCompile|Any CPU.Build.0 = Debug|Any CPU
{4BFFDE97-4EC0-423E-91C6-A202FD0A5978}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4BFFDE97-4EC0-423E-91C6-A202FD0A5978}.Release|Any CPU.Build.0 = Release|Any CPU
{784C2C99-F3D5-4B70-B571-C5A944C7DC96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{784C2C99-F3D5-4B70-B571-C5A944C7DC96}.Debug|Any CPU.Build.0 = Debug|Any CPU
{784C2C99-F3D5-4B70-B571-C5A944C7DC96}.DebugNoRazorCompile|Any CPU.ActiveCfg = Debug|Any CPU
{784C2C99-F3D5-4B70-B571-C5A944C7DC96}.DebugNoRazorCompile|Any CPU.Build.0 = Debug|Any CPU
{784C2C99-F3D5-4B70-B571-C5A944C7DC96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{784C2C99-F3D5-4B70-B571-C5A944C7DC96}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -57,6 +65,7 @@ Global
GlobalSection(NestedProjects) = preSolution
{1DE93C7F-22CE-462C-BB6E-7282F4403F2E} = {4C0385CB-1ABE-4569-AA9D-0C3DCBE44479}
{4BFFDE97-4EC0-423E-91C6-A202FD0A5978} = {5135A2B0-95B5-46AD-906A-70A2364B892B}
{784C2C99-F3D5-4B70-B571-C5A944C7DC96} = {5135A2B0-95B5-46AD-906A-70A2364B892B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A0A0B995-5D0B-458E-BCC0-1071B76949D1}

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="Smartstore.WebApi.Client.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<Smartstore.WebApi.Client.Properties.Settings>
<setting name="ApiPublicKey" serializeAs="String">
<value />
</setting>
<setting name="ApiSecretKey" serializeAs="String">
<value />
</setting>
<setting name="ApiUrl" serializeAs="String">
<value />
</setting>
<setting name="ApiPaths" serializeAs="String">
<value />
</setting>
<setting name="ApiContent" serializeAs="String">
<value />
</setting>
<setting name="ApiQuery" serializeAs="String">
<value />
</setting>
<setting name="ApiPaths2" serializeAs="String">
<value />
</setting>
<setting name="ApiVersion" serializeAs="String">
<value />
</setting>
<setting name="ApiHeaders" serializeAs="String">
<value />
</setting>
<setting name="FileUpload" serializeAs="String">
<value />
</setting>
<setting name="ApiProxyPort" serializeAs="String">
<value />
</setting>
</Smartstore.WebApi.Client.Properties.Settings>
</userSettings>
</configuration>

View File

@ -0,0 +1,62 @@
using System.Text;
namespace Smartstore.WebApi.Client
{
internal static class ComboBoxExtensions
{
private const char _delimiter = '¶';
public static void InsertRolled(this ComboBox combo, string str, int max)
{
if (!string.IsNullOrEmpty(str))
{
int i;
for (i = combo.Items.Count - 1; i >= 0; --i)
{
if (string.Compare(combo.Items[i].ToString(), str, true) == 0)
combo.Items.RemoveAt(i);
}
combo.Items.Insert(0, str);
for (i = combo.Items.Count - 1; i > max; --i)
{
combo.Items.RemoveAt(i);
}
combo.Text = str;
}
}
public static void FromString(this ComboBox.ObjectCollection coll, string values)
{
if (!string.IsNullOrWhiteSpace(values))
{
string[] items = values.Split(new[] { _delimiter }, StringSplitOptions.RemoveEmptyEntries);
coll.AddRange(items);
}
}
public static string IntoString(this ComboBox.ObjectCollection coll)
{
if (coll.Count <= 0)
return string.Empty;
var sb = new StringBuilder();
foreach (var item in coll)
{
if (sb.Length > 0)
sb.Append(_delimiter);
sb.Append(item);
}
return string.Join(_delimiter.ToString(), sb.ToString());
}
public static void RemoveCurrent(this ComboBox combo)
{
combo.Items.Remove(combo.Text);
combo.ResetText();
}
}
}

View File

@ -0,0 +1,49 @@
using System.Diagnostics;
using System.Globalization;
namespace Smartstore.WebApi.Client
{
internal static class StringExtensions
{
public static void Dump(this string value, bool appendMarks = false)
{
Debug.WriteLine(value);
Debug.WriteLineIf(appendMarks, "------------------------------------------------");
}
public static DialogResult Box(this string message, MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.Information)
{
return MessageBox.Show(message, Program.AppName, buttons, icon);
}
public static int ToInt(this string value, int defaultValue = 0)
{
int result;
if (int.TryParse(value, out result))
{
return result;
}
return defaultValue;
}
public static string EmptyNull(this string value)
{
return (value ?? string.Empty).Trim();
}
public static bool IsEmpty(this string value)
{
return string.IsNullOrWhiteSpace(value);
}
public static bool HasValue(this string value)
{
return !string.IsNullOrWhiteSpace(value);
}
public static string FormatInvariant(this string format, params object[] objects)
{
return string.Format(CultureInfo.InvariantCulture, format, objects);
}
}
}

View File

@ -0,0 +1,34 @@
using System.Text;
namespace Smartstore.WebApi.Client
{
public class WebApiRequestContext
{
public string PublicKey { get; set; }
public string SecretKey { get; set; }
public string Url { get; set; }
public int ProxyPort { get; set; }
public string HttpMethod { get; set; }
public string HttpAcceptType { get; set; }
public string AdditionalHeaders { get; set; }
public bool IsValid => !string.IsNullOrWhiteSpace(PublicKey) && !string.IsNullOrWhiteSpace(SecretKey) &&
!string.IsNullOrWhiteSpace(Url) &&
!string.IsNullOrWhiteSpace(HttpMethod) && !string.IsNullOrWhiteSpace(HttpAcceptType);
public override string ToString()
{
var sb = new StringBuilder();
sb.AppendLine("PublicKey: " + PublicKey);
sb.AppendLine("SecretKey: " + SecretKey);
sb.AppendLine("Url: " + Url);
sb.AppendLine("Proxy Port: " + (ProxyPort > 0 ? ProxyPort.ToString() : string.Empty));
sb.AppendLine("HttpMethod: " + HttpMethod);
sb.AppendLine("HttpAcceptType: " + HttpAcceptType);
return sb.ToString();
}
}
}

View File

@ -0,0 +1,44 @@
using Newtonsoft.Json.Linq;
using Smartstore.WebApi.Client.Models;
namespace Smartstore.WebApi.Client
{
public class WebApiResponse
{
public string Status { get; set; }
public string Headers { get; set; }
public string Content { get; set; }
public string ContentType { get; set; }
public long ContentLength { get; set; }
/// <seealso cref="http://weblog.west-wind.com/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing" />
/// <seealso cref="http://james.newtonking.com/json/help/index.html?topic=html/QueryJsonDynamic.htm" />
/// <seealso cref="http://james.newtonking.com/json/help/index.html?topic=html/LINQtoJSON.htm" />
public List<Customer> ParseCustomers()
{
if (string.IsNullOrWhiteSpace(Content))
{
return null;
}
// dynamic dynamicJson = JObject.Parse(response.Content);
// foreach (dynamic customer in dynamicJson.value)
// {
// string str = string.Format("{0} {1} {2}", customer.Id, customer.CustomerGuid, customer.Email);
//str.Dump();
// }
var json = JObject.Parse(Content);
string metadata = (string)json["@odata.context"];
if (!string.IsNullOrWhiteSpace(metadata) && metadata.EndsWith("#Customers"))
{
var customers = json["value"].Select(x => x.ToObject<Customer>()).ToList();
return customers;
}
return null;
}
}
}

View File

@ -0,0 +1,231 @@
using System.Net;
using System.Text;
using Microsoft.AspNetCore.StaticFiles;
using Smartstore.WebApi.Client.Models;
namespace Smartstore.WebApi.Client
{
public class WebApiClient
{
public static string JsonAcceptType => "application/json";
public static bool BodySupported(string method)
=> !string.IsNullOrWhiteSpace(method) && string.Compare(method, "GET", true) != 0 && string.Compare(method, "DELETE", true) != 0;
// So far all API methods with multipart support are POST methods.
public static bool MultipartSupported(string method)
=> string.Compare(method, "POST", true) == 0;
public Task<HttpWebRequest> StartRequestAsync(
WebApiRequestContext context,
string content,
Dictionary<string, object> multipartData,
out StringBuilder requestContent)
{
throw new NotImplementedException();
}
public Task<bool> ProcessResponseAsync(
HttpWebRequest webRequest,
WebApiResponse response,
FolderBrowserDialog folderBrowserDialog)
{
throw new NotImplementedException();
}
public Dictionary<string, object> CreateMultipartData(FileUploadModel model)
{
if (!(model?.Files?.Any() ?? false))
{
return null;
}
var result = new Dictionary<string, object>();
var isValid = false;
var count = 0;
// Identify entity by its identifier.
if (model.Id != 0)
{
result.Add("Id", model.Id);
}
// Custom properties like SKU etc.
foreach (var kvp in model.CustomProperties)
{
if (kvp.Key.HasValue() && kvp.Value != null)
{
result.Add(kvp.Key, kvp.Value);
}
}
// File data.
foreach (var file in model.Files)
{
if (File.Exists(file.LocalPath))
{
using var fstream = new FileStream(file.LocalPath, FileMode.Open, FileAccess.Read);
byte[] data = new byte[fstream.Length];
fstream.Read(data, 0, data.Length);
var name = Path.GetFileName(file.LocalPath);
var id = $"my-file-{++count}";
new FileExtensionContentTypeProvider().TryGetContentType(name, out string contentType);
var apiFile = new ApiFileParameter(data, name, contentType);
// Add file parameters. Omit default values (let the server apply them).
if (file.Id != 0)
{
apiFile.Parameters.Add("PictureId", file.Id.ToString());
}
if (file.Path.HasValue())
{
apiFile.Parameters.Add("Path", file.Path);
}
if (!file.IsTransient)
{
apiFile.Parameters.Add("IsTransient", file.IsTransient.ToString());
}
if (file.DuplicateFileHandling != DuplicateFileHandling.ThrowError)
{
apiFile.Parameters.Add("DuplicateFileHandling", ((int)file.DuplicateFileHandling).ToString());
}
// Test pass through of custom parameters but the API ignores them anyway.
//apiFile.Parameters.Add("CustomValue1", string.Format("{0:N}", Guid.NewGuid()));
//apiFile.Parameters.Add("CustomValue2", string.Format("say hello to {0}", id));
result.Add(id, apiFile);
isValid = true;
fstream.Close();
}
}
if (!isValid)
{
return null;
}
return result;
}
private async Task GetResponse(HttpWebResponse webResponse, WebApiResponse response, FolderBrowserDialog dialog)
{
if (webResponse == null)
{
return;
}
response.Status = $"{(int)webResponse.StatusCode} {webResponse.StatusDescription}";
response.Headers = webResponse.Headers.ToString();
response.ContentType = webResponse.ContentType;
response.ContentLength = webResponse.ContentLength;
var ct = response.ContentType;
if (ct.HasValue() && (ct.StartsWith("image/") || ct.StartsWith("video/") || ct == "application/pdf"))
{
dialog.Description = "Please select a folder to save the file return by Web API.";
var dialogResult = dialog.ShowDialog();
if (dialogResult == DialogResult.OK)
{
string fileName = null;
if (webResponse.Headers["Content-Disposition"] != null)
{
fileName = webResponse.Headers["Content-Disposition"].Replace("inline; filename=", "").Replace("\"", "");
}
if (fileName.IsEmpty())
{
fileName = "web-api-response";
}
var path = Path.Combine(dialog.SelectedPath, fileName);
using (var stream = File.Create(path))
{
await webResponse.GetResponseStream().CopyToAsync(stream);
}
System.Diagnostics.Process.Start(path);
}
}
else
{
using var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
response.Content = await reader.ReadToEndAsync();
}
}
/// <see cref="http://stackoverflow.com/questions/219827/multipart-forms-from-c-sharp-client" />
private static async Task<byte[]> GetMultipartFormData(Dictionary<string, object> postParameters, string boundary, StringBuilder requestContent)
{
var needsCLRF = false;
var sb = new StringBuilder();
using var stream = new MemoryStream();
foreach (var param in postParameters)
{
if (needsCLRF)
{
await WriteToStream(stream, requestContent, "\r\n");
}
needsCLRF = true;
if (param.Value is ApiFileParameter file)
{
sb.Clear();
sb.AppendFormat("--{0}\r\n", boundary);
sb.AppendFormat("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"", param.Key, file.FileName ?? param.Key);
foreach (var key in file.Parameters.AllKeys)
{
sb.AppendFormat("; {0}=\"{1}\"", key, file.Parameters[key].Replace('"', '\''));
}
sb.AppendFormat("\r\nContent-Type: {0}\r\n\r\n", file.ContentType ?? "application/octet-stream");
await WriteToStream(stream, requestContent, sb.ToString());
await stream.WriteAsync(file.Data.AsMemory(0, file.Data.Length));
requestContent.AppendFormat("<Binary file data here (length {0} bytes)...>", file.Data.Length);
}
else
{
var postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",
boundary,
param.Key,
param.Value);
await WriteToStream(stream, requestContent, postData);
}
}
await WriteToStream(stream, requestContent, "\r\n--" + boundary + "--\r\n");
stream.Position = 0;
byte[] formData = new byte[stream.Length];
await stream.ReadAsync(formData);
return formData;
}
private static async Task WriteToStream(MemoryStream stream, StringBuilder requestContent, string data)
{
await stream.WriteAsync(Encoding.UTF8.GetBytes(data).AsMemory(0, Encoding.UTF8.GetByteCount(data)));
requestContent.Append(data);
}
private static void SetTimeout(HttpWebRequest webRequest)
{
#if DEBUG
// Just for debugging.
webRequest.Timeout = 1000 * 60 * 5;
#endif
}
}
}

View File

@ -0,0 +1,587 @@
namespace Smartstore.WebApi.Client
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
Smartstore.WebApi.Client.Properties.Settings settings1 = new Smartstore.WebApi.Client.Properties.Settings();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.chkIEEE754Compatible = new System.Windows.Forms.CheckBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.callApi = new System.Windows.Forms.Button();
this.cboPath = new System.Windows.Forms.ComboBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.cboMethod = new System.Windows.Forms.ComboBox();
this.txtResponse = new System.Windows.Forms.RichTextBox();
this.clear = new System.Windows.Forms.Button();
this.txtSecretKey = new System.Windows.Forms.TextBox();
this.txtPublicKey = new System.Windows.Forms.TextBox();
this.cboContent = new System.Windows.Forms.ComboBox();
this.btnDeletePath = new System.Windows.Forms.Button();
this.btnDeleteContent = new System.Windows.Forms.Button();
this.txtRequest = new System.Windows.Forms.RichTextBox();
this.btnDeleteQuery = new System.Windows.Forms.Button();
this.cboQuery = new System.Windows.Forms.ComboBox();
this.label8 = new System.Windows.Forms.Label();
this.radioOdata = new System.Windows.Forms.RadioButton();
this.radioApi = new System.Windows.Forms.RadioButton();
this.panel1 = new System.Windows.Forms.Panel();
this.label4 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.lblRequest = new System.Windows.Forms.TextBox();
this.lblResponse = new System.Windows.Forms.TextBox();
this.lblFile = new System.Windows.Forms.Label();
this.btnFileOpen = new System.Windows.Forms.Button();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();
this.btnDeleteHeaders = new System.Windows.Forms.Button();
this.cboHeaders = new System.Windows.Forms.ComboBox();
this.label10 = new System.Windows.Forms.Label();
this.cboFileUpload = new System.Windows.Forms.ComboBox();
this.txtVersion = new System.Windows.Forms.TextBox();
this.txtUrl = new System.Windows.Forms.TextBox();
this.btnDeleteFileUpload = new System.Windows.Forms.Button();
this.txtProxyPort = new System.Windows.Forms.TextBox();
this.label11 = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// chkIEEE754Compatible
//
this.chkIEEE754Compatible.AutoSize = true;
this.chkIEEE754Compatible.Location = new System.Drawing.Point(1023, 405);
this.chkIEEE754Compatible.Name = "chkIEEE754Compatible";
this.chkIEEE754Compatible.Size = new System.Drawing.Size(119, 17);
this.chkIEEE754Compatible.TabIndex = 50;
this.chkIEEE754Compatible.Text = "IEEE754Compatible";
this.chkIEEE754Compatible.UseVisualStyleBackColor = true;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(516, 12);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(29, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Path";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(25, 13);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(56, 13);
this.label2.TabIndex = 2;
this.label2.Text = "Public-Key";
this.label2.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(21, 39);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(60, 13);
this.label3.TabIndex = 4;
this.label3.Text = "Secret-Key";
//
// callApi
//
this.callApi.AutoSize = true;
this.callApi.Location = new System.Drawing.Point(17, 832);
this.callApi.Name = "callApi";
this.callApi.Size = new System.Drawing.Size(75, 23);
this.callApi.TabIndex = 8;
this.callApi.Text = "Call API";
this.callApi.UseVisualStyleBackColor = true;
this.callApi.Click += new System.EventHandler(this.callApi_Click);
//
// cboPath
//
this.cboPath.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.cboPath.FormattingEnabled = true;
this.cboPath.Location = new System.Drawing.Point(551, 9);
this.cboPath.Name = "cboPath";
this.cboPath.Size = new System.Drawing.Size(571, 22);
this.cboPath.TabIndex = 5;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(26, 65);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(55, 13);
this.label5.TabIndex = 11;
this.label5.Text = "Store URL";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(20, 139);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(60, 13);
this.label6.TabIndex = 13;
this.label6.Text = "JSON Body";
//
// cboMethod
//
this.cboMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboMethod.FormattingEnabled = true;
this.cboMethod.Items.AddRange(new object[] {
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"});
this.cboMethod.Location = new System.Drawing.Point(370, 9);
this.cboMethod.Name = "cboMethod";
this.cboMethod.Size = new System.Drawing.Size(89, 21);
this.cboMethod.TabIndex = 3;
this.cboMethod.SelectionChangeCommitted += new System.EventHandler(this.cboMethod_changeCommitted);
//
// txtResponse
//
this.txtResponse.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txtResponse.DetectUrls = false;
this.txtResponse.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtResponse.HideSelection = false;
this.txtResponse.Location = new System.Drawing.Point(18, 424);
this.txtResponse.Name = "txtResponse";
this.txtResponse.ReadOnly = true;
this.txtResponse.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
this.txtResponse.Size = new System.Drawing.Size(1126, 402);
this.txtResponse.TabIndex = 10;
this.txtResponse.Text = "";
//
// clear
//
this.clear.AutoSize = true;
this.clear.Location = new System.Drawing.Point(1074, 832);
this.clear.Name = "clear";
this.clear.Size = new System.Drawing.Size(70, 23);
this.clear.TabIndex = 9;
this.clear.Text = "Clear";
this.clear.UseVisualStyleBackColor = true;
this.clear.Click += new System.EventHandler(this.clear_Click);
//
// txtSecretKey
//
this.txtSecretKey.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtSecretKey.Location = new System.Drawing.Point(84, 36);
this.txtSecretKey.Name = "txtSecretKey";
this.txtSecretKey.Size = new System.Drawing.Size(225, 20);
this.txtSecretKey.TabIndex = 1;
//
// txtPublicKey
//
this.txtPublicKey.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtPublicKey.Location = new System.Drawing.Point(84, 10);
this.txtPublicKey.Name = "txtPublicKey";
this.txtPublicKey.Size = new System.Drawing.Size(225, 20);
this.txtPublicKey.TabIndex = 0;
//
// cboContent
//
this.cboContent.FormattingEnabled = true;
this.cboContent.Location = new System.Drawing.Point(84, 136);
this.cboContent.Name = "cboContent";
this.cboContent.Size = new System.Drawing.Size(1038, 21);
this.cboContent.TabIndex = 7;
//
// btnDeletePath
//
this.btnDeletePath.AutoSize = true;
this.btnDeletePath.Font = new System.Drawing.Font("Arial", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnDeletePath.Location = new System.Drawing.Point(1124, 9);
this.btnDeletePath.Name = "btnDeletePath";
this.btnDeletePath.Size = new System.Drawing.Size(20, 22);
this.btnDeletePath.TabIndex = 8;
this.btnDeletePath.Text = "x";
this.btnDeletePath.UseVisualStyleBackColor = true;
this.btnDeletePath.Click += new System.EventHandler(this.btnDeletePath_Click);
//
// btnDeleteContent
//
this.btnDeleteContent.AutoSize = true;
this.btnDeleteContent.Font = new System.Drawing.Font("Arial", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnDeleteContent.Location = new System.Drawing.Point(1124, 136);
this.btnDeleteContent.Name = "btnDeleteContent";
this.btnDeleteContent.Size = new System.Drawing.Size(20, 22);
this.btnDeleteContent.TabIndex = 9;
this.btnDeleteContent.Text = "x";
this.btnDeleteContent.UseVisualStyleBackColor = true;
this.btnDeleteContent.Click += new System.EventHandler(this.btnDeleteContent_Click);
//
// txtRequest
//
this.txtRequest.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txtRequest.DetectUrls = false;
this.txtRequest.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtRequest.HideSelection = false;
this.txtRequest.Location = new System.Drawing.Point(18, 213);
this.txtRequest.Name = "txtRequest";
this.txtRequest.ReadOnly = true;
this.txtRequest.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
this.txtRequest.Size = new System.Drawing.Size(1126, 187);
this.txtRequest.TabIndex = 20;
this.txtRequest.Text = "";
//
// btnDeleteQuery
//
this.btnDeleteQuery.AutoSize = true;
this.btnDeleteQuery.Font = new System.Drawing.Font("Arial", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnDeleteQuery.Location = new System.Drawing.Point(1124, 35);
this.btnDeleteQuery.Name = "btnDeleteQuery";
this.btnDeleteQuery.Size = new System.Drawing.Size(20, 22);
this.btnDeleteQuery.TabIndex = 9;
this.btnDeleteQuery.Text = "x";
this.btnDeleteQuery.UseVisualStyleBackColor = true;
this.btnDeleteQuery.Click += new System.EventHandler(this.btnDeleteQuery_Click);
//
// cboQuery
//
this.cboQuery.FormattingEnabled = true;
this.cboQuery.Location = new System.Drawing.Point(551, 35);
this.cboQuery.Name = "cboQuery";
this.cboQuery.Size = new System.Drawing.Size(571, 21);
this.cboQuery.TabIndex = 6;
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(510, 38);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(37, 13);
this.label8.TabIndex = 24;
this.label8.Text = "Query";
//
// radioOdata
//
this.radioOdata.AutoSize = true;
this.radioOdata.Location = new System.Drawing.Point(3, 3);
this.radioOdata.Margin = new System.Windows.Forms.Padding(0);
this.radioOdata.Name = "radioOdata";
this.radioOdata.Size = new System.Drawing.Size(53, 17);
this.radioOdata.TabIndex = 0;
this.radioOdata.TabStop = true;
this.radioOdata.Text = "odata";
this.radioOdata.UseVisualStyleBackColor = true;
this.radioOdata.Click += new System.EventHandler(this.odata_Click);
//
// radioApi
//
this.radioApi.AutoSize = true;
this.radioApi.Location = new System.Drawing.Point(58, 3);
this.radioApi.Margin = new System.Windows.Forms.Padding(0);
this.radioApi.Name = "radioApi";
this.radioApi.Size = new System.Drawing.Size(39, 17);
this.radioApi.TabIndex = 1;
this.radioApi.TabStop = true;
this.radioApi.Text = "api";
this.radioApi.UseVisualStyleBackColor = true;
this.radioApi.CheckedChanged += new System.EventHandler(this.radioApi_CheckedChanged);
this.radioApi.Click += new System.EventHandler(this.api_Click);
//
// panel1
//
this.panel1.Controls.Add(this.radioApi);
this.panel1.Controls.Add(this.radioOdata);
this.panel1.Location = new System.Drawing.Point(367, 62);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(103, 23);
this.panel1.TabIndex = 25;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(323, 11);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(43, 13);
this.label4.TabIndex = 27;
this.label4.Text = "Method";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(323, 39);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(42, 13);
this.label7.TabIndex = 29;
this.label7.Text = "Version";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(324, 67);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(42, 13);
this.label9.TabIndex = 30;
this.label9.Text = "Service";
//
// lblRequest
//
this.lblRequest.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.lblRequest.Location = new System.Drawing.Point(19, 197);
this.lblRequest.Name = "lblRequest";
this.lblRequest.ReadOnly = true;
this.lblRequest.Size = new System.Drawing.Size(1123, 14);
this.lblRequest.TabIndex = 31;
this.lblRequest.Text = "Request";
//
// lblResponse
//
this.lblResponse.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.lblResponse.Location = new System.Drawing.Point(19, 409);
this.lblResponse.Name = "lblResponse";
this.lblResponse.ReadOnly = true;
this.lblResponse.Size = new System.Drawing.Size(813, 14);
this.lblResponse.TabIndex = 32;
this.lblResponse.Text = "Response";
//
// lblFile
//
this.lblFile.AutoSize = true;
this.lblFile.Location = new System.Drawing.Point(22, 166);
this.lblFile.Name = "lblFile";
this.lblFile.Size = new System.Drawing.Size(58, 13);
this.lblFile.TabIndex = 34;
this.lblFile.Text = "File upload";
//
// btnFileOpen
//
this.btnFileOpen.AutoSize = true;
this.btnFileOpen.Location = new System.Drawing.Point(1075, 161);
this.btnFileOpen.Name = "btnFileOpen";
this.btnFileOpen.Size = new System.Drawing.Size(69, 24);
this.btnFileOpen.TabIndex = 35;
this.btnFileOpen.Text = "Open file";
this.btnFileOpen.UseVisualStyleBackColor = true;
this.btnFileOpen.Click += new System.EventHandler(this.btnFileOpen_Click);
//
// openFileDialog1
//
this.openFileDialog1.FileName = "openFileDialog1";
//
// btnDeleteHeaders
//
this.btnDeleteHeaders.AutoSize = true;
this.btnDeleteHeaders.Font = new System.Drawing.Font("Arial", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnDeleteHeaders.Location = new System.Drawing.Point(1124, 61);
this.btnDeleteHeaders.Name = "btnDeleteHeaders";
this.btnDeleteHeaders.Size = new System.Drawing.Size(20, 22);
this.btnDeleteHeaders.TabIndex = 9;
this.btnDeleteHeaders.Text = "x";
this.btnDeleteHeaders.UseVisualStyleBackColor = true;
this.btnDeleteHeaders.Click += new System.EventHandler(this.btnDeleteHeaders_Click);
//
// cboHeaders
//
this.cboHeaders.FormattingEnabled = true;
this.cboHeaders.Location = new System.Drawing.Point(551, 61);
this.cboHeaders.Name = "cboHeaders";
this.cboHeaders.Size = new System.Drawing.Size(571, 21);
this.cboHeaders.TabIndex = 7;
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(500, 64);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(47, 13);
this.label10.TabIndex = 46;
this.label10.Text = "Headers";
//
// cboFileUpload
//
this.cboFileUpload.FormattingEnabled = true;
this.cboFileUpload.Location = new System.Drawing.Point(84, 163);
this.cboFileUpload.Name = "cboFileUpload";
this.cboFileUpload.Size = new System.Drawing.Size(965, 21);
this.cboFileUpload.TabIndex = 48;
//
// txtVersion
//
settings1.ApiContent = "";
settings1.ApiHeaders = "";
settings1.ApiPaths = "";
settings1.ApiPaths2 = "";
settings1.ApiProxyPort = "";
settings1.ApiPublicKey = "";
settings1.ApiQuery = "";
settings1.ApiSecretKey = "";
settings1.ApiUrl = "";
settings1.ApiVersion = "";
settings1.FileUpload = "";
settings1.SettingsKey = "";
this.txtVersion.DataBindings.Add(new System.Windows.Forms.Binding("Text", settings1, "ApiVersion", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.txtVersion.Location = new System.Drawing.Point(370, 36);
this.txtVersion.Name = "txtVersion";
this.txtVersion.Size = new System.Drawing.Size(89, 21);
this.txtVersion.TabIndex = 4;
//
// txtUrl
//
this.txtUrl.DataBindings.Add(new System.Windows.Forms.Binding("Text", settings1, "ApiUrl", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.txtUrl.Location = new System.Drawing.Point(84, 62);
this.txtUrl.Name = "txtUrl";
this.txtUrl.Size = new System.Drawing.Size(225, 21);
this.txtUrl.TabIndex = 2;
//
// btnDeleteFileUpload
//
this.btnDeleteFileUpload.AutoSize = true;
this.btnDeleteFileUpload.Font = new System.Drawing.Font("Arial", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnDeleteFileUpload.Location = new System.Drawing.Point(1051, 162);
this.btnDeleteFileUpload.Name = "btnDeleteFileUpload";
this.btnDeleteFileUpload.Size = new System.Drawing.Size(20, 22);
this.btnDeleteFileUpload.TabIndex = 49;
this.btnDeleteFileUpload.Text = "x";
this.btnDeleteFileUpload.UseVisualStyleBackColor = true;
this.btnDeleteFileUpload.Click += new System.EventHandler(this.btnDeleteFileUpload_Click);
//
// txtProxyPort
//
this.txtProxyPort.DataBindings.Add(new System.Windows.Forms.Binding("Text", settings1, "ApiProxyPort", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.txtProxyPort.Location = new System.Drawing.Point(84, 89);
this.txtProxyPort.Name = "txtProxyPort";
this.txtProxyPort.Size = new System.Drawing.Size(63, 21);
this.txtProxyPort.TabIndex = 51;
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(23, 92);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(58, 13);
this.label11.TabIndex = 52;
this.label11.Text = "Proxy Port";
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1154, 861);
this.Controls.Add(this.txtProxyPort);
this.Controls.Add(this.label11);
this.Controls.Add(this.chkIEEE754Compatible);
this.Controls.Add(this.btnDeleteFileUpload);
this.Controls.Add(this.cboFileUpload);
this.Controls.Add(this.btnDeleteHeaders);
this.Controls.Add(this.cboHeaders);
this.Controls.Add(this.label10);
this.Controls.Add(this.btnFileOpen);
this.Controls.Add(this.lblFile);
this.Controls.Add(this.lblResponse);
this.Controls.Add(this.lblRequest);
this.Controls.Add(this.label9);
this.Controls.Add(this.txtVersion);
this.Controls.Add(this.label7);
this.Controls.Add(this.label4);
this.Controls.Add(this.panel1);
this.Controls.Add(this.btnDeleteQuery);
this.Controls.Add(this.cboQuery);
this.Controls.Add(this.label8);
this.Controls.Add(this.txtRequest);
this.Controls.Add(this.btnDeleteContent);
this.Controls.Add(this.btnDeletePath);
this.Controls.Add(this.cboContent);
this.Controls.Add(this.clear);
this.Controls.Add(this.txtResponse);
this.Controls.Add(this.cboMethod);
this.Controls.Add(this.label6);
this.Controls.Add(this.txtUrl);
this.Controls.Add(this.label5);
this.Controls.Add(this.cboPath);
this.Controls.Add(this.callApi);
this.Controls.Add(this.txtSecretKey);
this.Controls.Add(this.label3);
this.Controls.Add(this.txtPublicKey);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(1170, 900);
this.MinimumSize = new System.Drawing.Size(1170, 900);
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "MainForm";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtSecretKey;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button callApi;
private System.Windows.Forms.TextBox txtPublicKey;
private System.Windows.Forms.ComboBox cboPath;
private System.Windows.Forms.TextBox txtUrl;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.ComboBox cboMethod;
private System.Windows.Forms.RichTextBox txtResponse;
private System.Windows.Forms.Button clear;
private System.Windows.Forms.ComboBox cboContent;
private System.Windows.Forms.Button btnDeletePath;
private System.Windows.Forms.Button btnDeleteContent;
private System.Windows.Forms.RichTextBox txtRequest;
private System.Windows.Forms.Button btnDeleteQuery;
private System.Windows.Forms.ComboBox cboQuery;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.RadioButton radioOdata;
private System.Windows.Forms.RadioButton radioApi;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox txtVersion;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TextBox lblRequest;
private System.Windows.Forms.TextBox lblResponse;
private System.Windows.Forms.Label lblFile;
private System.Windows.Forms.Button btnFileOpen;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;
private System.Windows.Forms.Button btnDeleteHeaders;
private System.Windows.Forms.ComboBox cboHeaders;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.ComboBox cboFileUpload;
private System.Windows.Forms.Button btnDeleteFileUpload;
private System.Windows.Forms.CheckBox chkIEEE754Compatible;
private System.Windows.Forms.TextBox txtProxyPort;
private System.Windows.Forms.Label label11;
}
}

View File

@ -0,0 +1,332 @@
using System.Diagnostics;
using System.Text;
using Newtonsoft.Json;
using Smartstore.WebApi.Client.Models;
using Smartstore.WebApi.Client.Properties;
using Smartstore.WebApi.Client.Utilities;
namespace Smartstore.WebApi.Client
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
this.Text = Program.AppName;
this.Load += (object sender, EventArgs e) =>
{
var s = Settings.Default;
s.Reload();
cboMethod.SelectedIndex = 0;
radioOdata.Checked = true;
txtPublicKey.Text = s.ApiPublicKey;
txtSecretKey.Text = s.ApiSecretKey;
txtUrl.Text = s.ApiUrl;
txtProxyPort.Text = s.ApiProxyPort;
txtVersion.Text = s.ApiVersion;
cboPath.Items.FromString(s.ApiPaths);
cboQuery.Items.FromString(s.ApiQuery);
cboContent.Items.FromString(s.ApiContent);
cboHeaders.Items.FromString(s.ApiHeaders);
cboFileUpload.Items.FromString(s.FileUpload);
if (cboPath.Items.Count <= 0)
{
cboPath.Items.Add("/Customers");
}
if (cboHeaders.Items.Count <= 0)
{
cboHeaders.Items.Add("{\"Prefer\":\"return=representation\"}");
}
if (cboFileUpload.Items.Count <= 0)
{
var model = new FileUploadModel
{
Files = new List<FileUploadModel.FileModel>
{
new FileUploadModel.FileModel { LocalPath = @"C:\my-upload-picture.jpg" }
}
};
var serializedModel = JsonConvert.SerializeObject(model);
cboFileUpload.Items.Add(serializedModel);
}
cboMethod_changeCommitted(null, null);
radioApi_CheckedChanged(null, null);
openFileDialog1.Filter = "Supported files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png, *.csv, *.xlsx, *.txt, *.tab, *.zip) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png; *.csv; *.xlsx; *.txt; *.tab; *.zip";
openFileDialog1.DefaultExt = ".jpg";
openFileDialog1.FileName = "";
openFileDialog1.Title = "Please select files to upload";
openFileDialog1.Multiselect = true;
};
this.FormClosing += (object sender, FormClosingEventArgs e) =>
{
var s = Settings.Default;
s.ApiPublicKey = txtPublicKey.Text;
s.ApiSecretKey = txtSecretKey.Text;
s.ApiUrl = txtUrl.Text;
s.ApiProxyPort = txtProxyPort.Text;
s.ApiVersion = txtVersion.Text;
Settings.Default[radioOdata.Checked ? "ApiPaths" : "ApiPaths2"] = cboPath.Items.IntoString();
s.ApiQuery = cboQuery.Items.IntoString();
s.ApiContent = cboContent.Items.IntoString();
s.ApiHeaders = cboHeaders.Items.IntoString();
s.FileUpload = cboFileUpload.Items.IntoString();
s.Save();
};
}
private async Task Execute()
{
if (txtUrl.Text.HasValue() && !txtUrl.Text.EndsWith("/"))
{
txtUrl.Text += "/";
}
if (cboPath.Text.HasValue() && !cboPath.Text.StartsWith("/"))
{
cboPath.Text = "/" + cboPath.Text;
}
_ = int.TryParse(txtProxyPort.Text, out var proxyPort);
var context = new WebApiRequestContext
{
PublicKey = txtPublicKey.Text,
SecretKey = txtSecretKey.Text,
Url = txtUrl.Text + (radioOdata.Checked ? "odata/" : "api/") + txtVersion.Text + cboPath.Text,
ProxyPort = proxyPort,
HttpMethod = cboMethod.Text,
HttpAcceptType = WebApiClient.JsonAcceptType,
AdditionalHeaders = cboHeaders.Text
};
if (chkIEEE754Compatible.Checked)
{
context.HttpAcceptType += ";IEEE754Compatible=true";
}
if (cboQuery.Text.HasValue())
{
context.Url = string.Format("{0}?{1}", context.Url, cboQuery.Text);
}
if (!context.IsValid)
{
"Please enter Public-Key, Secret-Key, URL and method.".Box(MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Debug.WriteLine(context.ToString());
return;
}
var apiClient = new WebApiClient();
var response = new WebApiResponse();
var sb = new StringBuilder();
Dictionary<string, object> multiPartData = null;
lblRequest.Text = "Request: " + context.HttpMethod + " " + context.Url;
lblRequest.Refresh();
// Create multipart form data.
if (cboFileUpload.Text.HasValue())
{
try
{
var fileUploadModel = JsonConvert.DeserializeObject(cboFileUpload.Text, typeof(FileUploadModel)) as FileUploadModel;
multiPartData = apiClient.CreateMultipartData(fileUploadModel);
}
catch
{
cboFileUpload.RemoveCurrent();
cboFileUpload.Text = string.Empty;
"File upload data is invalid.".Box(MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
}
var webRequest = await apiClient.StartRequestAsync(context, cboContent.Text, multiPartData, out StringBuilder requestContent);
txtRequest.Text = requestContent.ToString();
var success = await apiClient.ProcessResponseAsync(webRequest, response, folderBrowserDialog1);
lblResponse.Text = "Response: " + response.Status;
sb.Append(response.Headers);
if (success && response.Content.HasValue() && radioOdata.Checked)
{
var customers = response.ParseCustomers();
if (customers != null)
{
sb.AppendLine($"Parsed {customers.Count} customer(s):");
customers.ForEach(x => sb.AppendLine(x.ToString()));
sb.Append("\r\n");
}
}
sb.Append(response.Content);
txtResponse.Text = sb.ToString();
cboPath.InsertRolled(cboPath.Text, 64);
cboQuery.InsertRolled(cboQuery.Text, 64);
cboContent.InsertRolled(cboContent.Text, 64);
cboHeaders.InsertRolled(cboHeaders.Text, 64);
cboFileUpload.InsertRolled(cboFileUpload.Text, 64);
}
private void SavePathItems(bool odata)
{
Settings.Default[odata ? "ApiPaths2" : "ApiPaths"] = cboPath.Items.IntoString();
Settings.Default.Save();
cboPath.Text = "";
cboPath.Items.Clear();
cboPath.Items.FromString(odata ? Settings.Default.ApiPaths : Settings.Default.ApiPaths2);
}
private void MainForm_Shown(object sender, EventArgs e)
{
if (txtVersion.Text.Length == 0)
txtVersion.Text = "v1";
if (txtUrl.Text.Length == 0)
txtUrl.Text = "http://www.my-store.com/";
cboPath.Focus();
}
private void callApi_Click(object sender, EventArgs e)
{
clear_Click(null, null);
using (new HourGlass())
{
Execute().GetAwaiter().GetResult();
}
}
private void cboMethod_changeCommitted(object sender, EventArgs e)
{
var isBodySupported = WebApiClient.BodySupported(cboMethod.Text);
var isMultipartSupported = WebApiClient.MultipartSupported(cboMethod.Text);
cboContent.Enabled = isBodySupported;
btnDeleteContent.Enabled = isBodySupported;
cboFileUpload.Enabled = isMultipartSupported;
btnDeleteFileUpload.Enabled = isMultipartSupported;
btnFileOpen.Enabled = isMultipartSupported;
}
private void btnDeletePath_Click(object sender, EventArgs e)
{
cboPath.RemoveCurrent();
}
private void btnDeleteQuery_Click(object sender, EventArgs e)
{
cboQuery.RemoveCurrent();
}
private void btnDeleteContent_Click(object sender, EventArgs e)
{
cboContent.RemoveCurrent();
}
private void btnDeleteHeaders_Click(object sender, EventArgs e)
{
cboHeaders.RemoveCurrent();
}
private void btnDeleteFileUpload_Click(object sender, EventArgs e)
{
cboFileUpload.RemoveCurrent();
}
private void clear_Click(object sender, EventArgs e)
{
txtRequest.Clear();
lblRequest.Text = "Request";
txtResponse.Clear();
lblResponse.Text = "Response";
txtRequest.Refresh();
lblRequest.Refresh();
txtResponse.Refresh();
lblResponse.Refresh();
}
private void odata_Click(object sender, EventArgs e)
{
SavePathItems(true);
}
private void api_Click(object sender, EventArgs e)
{
SavePathItems(false);
}
private void radioApi_CheckedChanged(object sender, EventArgs e)
{
//var show = radioApi.Checked;
}
private void btnFileOpen_Click(object sender, EventArgs e)
{
var result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK && openFileDialog1.FileNames.Any())
{
FileUploadModel model = null;
// Deserialize current model.
if (cboFileUpload.Text.HasValue())
{
try
{
model = JsonConvert.DeserializeObject(cboFileUpload.Text, typeof(FileUploadModel)) as FileUploadModel;
}
catch
{
cboFileUpload.RemoveCurrent();
cboFileUpload.Text = string.Empty;
}
}
if (model == null)
{
model = new FileUploadModel();
}
// Remove files that no longer exist.
for (var i = model.Files.Count - 1; i >= 0; --i)
{
if (!File.Exists(model.Files[i].LocalPath))
{
model.Files.RemoveAt(i);
}
}
// Add new selected files.
foreach (var fileName in openFileDialog1.FileNames)
{
if (!model.Files.Any(x => x.LocalPath != null && x.LocalPath == fileName))
{
model.Files.Add(new FileUploadModel.FileModel
{
LocalPath = fileName
});
}
}
cboFileUpload.Text = JsonConvert.SerializeObject(model);
}
}
}
}

View File

@ -0,0 +1,646 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="folderBrowserDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>157, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAUAQEAAAAEAIAAoQgAAVgAAADAwAAABACAAqCUAAH5CAAAgIAAAAQAgAKgQAAAmaAAAGBgAAAEA
IACICQAAzngAABAQAAABACAAaAQAAFaCAAAoAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAISxRAyEsUQ+hLFEfoSxRJ+EsUSnhLFElISxRGGEsUQlAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9eS8MvXkvkb15L5q9eS+DvXkvXb15LzO9eS8QAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAhLFED4SxRNuEsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRHUAAAAAAAAAALV/MRO9eS/fvXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/+vXkvgQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAISxRBmEsUTlhLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUSJAAAAAAAAAAC1fzETvXkv3715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/i9eS85AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEsUQWhLFE4oSxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFEgwAA
AAAAAAAAtX8xE715L9+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkvzb15Lw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhLFECISx
RNOEsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRGUAAAAAAAAAALV/MRO9eS/fvXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/29eS9pAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACEsUSdhLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRPeEsUQvAAAAAAAAAAC3fjATvXkv3715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv4715
LwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhLFER4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUTIhLFECAAAAAAAAAAAuHwwE715
L9+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS9XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEsUTDhLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT+hLFETwAA
AAAAAAAAAAAAALp7LxO9eS/fvXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkvuL15LwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAhLFENoSxRO6EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFErYSxRAIAAAAAAAAAAAAAAAC7eS8TvXkv3715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L+q9eS8eAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEsURNhLFE8oSxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFEuYSxRBEAAAAAAAAAAAAAAAAAAAAAvHkvE715L9+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkvUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISxREWEsUTbhLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT7hLFEn4SxRA8AAAAAAAAAAAAAAAAAAAAAAAAAAL15
LxO9eS/fvXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L4UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAhLFECoSxRHOEsUTKhLFE8YSxRP6EsUT/hLFE+4SxROKEsUSrhLFEOAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC9eS8TvXkv3715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS+xAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhLFEB4SxRCWEsUQ5hLFEQISxRDGEsUQWhLFEAQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvXkvE715L9+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkvzwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALl5MhO9eS/fvXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAC2ejcTvXkv3715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/pM6j3HDOo9yYzqPcmM6j3JjOo9yYzqPcmM6j3JjOo
9yYzqPcmM6j3JjOo9yYzqPcmM6j3JjOo9yYzqPcmM6j3JjOo9yYzqPcmM6j3JjOo9yYzqPcmM6j3JjOo
9yYzqPcmM6j2JjOo9CY1qPEmNqjsJjio6SY5qOgmOajnJjmo6CY4qOkmNqjtJjSo8iYzqPQmM6j2JjOo
9yYzqPcmM6j3EQAAAAAAAAAAsns9E715L9+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv5DOo96YzqPfyM6j38jOo
9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo
9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo
9/IzqPfyM6j38jOo9/IzqPfyM6j38jOo920AAAAAAAAAAK99QRO9eS/fvXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L9UzqPeTM6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAACsfkYTvXkv3715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS+3M6j3czOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAA
AAAAAAAAqX9JE715L9+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkvkTOo90ozqPf+M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo93MAAAAAAAAAAKd/TRO9eS/fvXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L1szqPcoM6j38zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAACnf00TvXkv3715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/K9eS8oM6j3DTOo99gzqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAAAAAAAAAAp39NE715
L9+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS/EvXkvBQAAAAAzqPeqM6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
93MAAAAAAAAAAKd/TRO9eS/fvXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkvcAAAAAAAAAAAM6j3ZzOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAACnf00TvXkv3715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv8L15LxAAAAAAAAAAADOo
9x8zqPf+M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAAAAAAAAAAp39NE715L9+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L4kAAAAAAAAAAAAAAAAAAAAAM6j3yjOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo93MAAAAAAAAAAKd/
TRO9eS/fvXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L929eS8YAAAAAAAAAAAAAAAAAAAAADOo93UzqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPdzAAAAAAAAAACnf00TvXkv3715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS9eAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPcjM6j37TOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAAAAAAAAAAp39NE715L9+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/69eS+iAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAM6j3ATOo96szqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo93MAAAAAAAAAAKd/TRO9eS/fvXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/IvXkvFQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPc5M6j3/TOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAA
AACnf00TvXkv3715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS/VvXkvGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6j3ATOo98MzqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3cwAAAAAAAAAAp39NE715L9+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS/MvXkvIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAzqPdEM6j3+DOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo93MAAAAAAAAAAKd/TRO9eS/fvXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/u9eS+qvXkvDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAM6j3BTOo97IzqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAACnf00TvXkv3715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L++9eS9lvXkvBwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPcoM6j39jOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAA
AAAAAAAApn9OE715L9+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv7L15L5G9eS8ZAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo
94YzqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo93MAAAAAAAAAAKOBUhO9eS/fvXkv/715L/+9eS//vXkv/715L/69eS/XvXkveb15
LyQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAzqPcOM6j3xzOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAACfglkQvXkvub15L869eS+6vXkvlL15
L2W9eS8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo9zIzqPf3M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAAAAAAAAAAAAAAAL18
MQe9fDECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6j3ZjOo
9/ozqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
93MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADOo9wUzqPeWM6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6j3BDOo97QzqPf+M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAAAAAAAAAAobiFCMW+YV/Fv2Fsxb9hbMW/
YmzFwGJsxsFjbMbBY2zGwWNsxsFjbMbBY2zGwWNsxsFjbMbBY2kAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPcVM6j3wTOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo93MAAAAAAAAAAKa7
gRPGwWPfxsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWPwAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADOo9w4zqPfCM6j3/jOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPdzAAAAAAAAAACrvH0TxsFj38bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bB
Y//GwWP/xsFj1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6j3FzOo97czqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAAAAAAAAAArrx5E8bBY9/GwWP/xsFj/8bBY//GwWP/xsFj/8bB
Y//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPcGM6j3njOo
9/szqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo93MAAAAAAAAAAK+8eRPGwWPfxsFj/8bB
Y//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY/7GwWNiAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADOo9wYzqPdxM6j3+TOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAA
AACvvHkTxsFj38bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWPrxsFjIQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo9zszqPfRM6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3cwAAAAAAAAAAr7x5E8bBY9/GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bB
Y//GwWP/xsFjlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6j3EzOo
95czqPf5M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo93MAAAAAAAAAAK+8eRPGwWPfxsFj/8bBY//GwWP/xsFj/8bB
Y//GwWP/xsFj/8bBY//GwWP/xsFj8sbBYxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAM6j3NTOo98AzqPf7M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAACvvHkTxsFj38bB
Y//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj+cbBY2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPcJM6j3VDOo99EzqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAA
AAAAAAAAr7x5E8bBY9/GwWP/xsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj/8bBY5DGwWMFAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAzqPcDM6j3SjOo97kzqPfzM6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo93MAAAAAAAAAAK+8eRPGwWPfxsFj/8bBY//GwWP/xsFj/8bBY//GwWP/xsFj+cbB
Y43GwWMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPcEM6j3LDOo94QzqPfWM6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPdzAAAAAAAAAACvvHkTxsFj38bBY//GwWP/xsFj/8bB
Y//GwWP/xsFj68bBY1vGwWMEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo
9yozqPduM6j3sTOo99kzqPfzM6j3/jOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3cwAAAAAAAAAAr7x5E8bB
Y9/GwWP/xsFj/8bBY/3GwWPfxsFjg8bBYxUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPcOM6j3JzOo90YzqPdqM6j3hzOo950zqPeuM6j3tjOo
91MAAAAAAAAAAK+8eQ7GwWOjxsFjqMbBY4PGwWNFxsFjEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP/////////////////////////AP8B//////wAPwA/////+AAfAA/////wAA8AB////
/AABwAB////4AAHAAD////gAAMAAH///+AAAwAAP///wAADAAA////AAAMAAB///8AAAwAAD///wAADA
AAP///gAAMAAAf//+AAAwAAB///8AAHAAAD///wAAcAAAP///gADwAAA////AAfAAAD///+AH8AAAP//
/+A/wAAA///////AAAD//////8AAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADA
AAAAAAAAAMAAAAAAAAAAwAAAgAAAAADAAAGAAAAAAMAAAYAAAAAAwAADwAAAAADAAAPAAAAAAMAAB8AA
AAAAwAAPwAAAAADAAA/gAAAAAMAAH+AAAAAAwAA/8AAAAADAAH/wAAAAAMAA//gAAAAAwAP//AAAAADA
D//8AAAAAMB///4AAAAA5////wAAAAD/////AAAAAP////+AAAAAwAD//8AAAADAAP//4AAAAMAA///w
AAAAwAD///gAAADAAP///AAAAMAA////AAAAwAH///+AAADAAf///+AAAMAD////8AAAwAP////8AADA
B/////8AAMAP//////AAwD///////gDA////////////////////////KAAAADAAAABgAAAAAQAgAAAA
AACAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAba1zDoSxRI2DsEPxg7BD/oSxRP+DsEP+g7BD/oSxRP+DsEP9g7BDyIOt
SCyHoFcCAAAAAAAAAACsgzwJvXkvrLx4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4
Lv68eC7+vXkv/7x4Lv68eC7+vHgumQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGetgQF6r1gue7BXiISxRMGEsUTOhLFEyoKx
SKN7sFVVcapwCgAAAAAAAAAAAAAAAAAAAACqg0EJvXkvrL15L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkvygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXayXAnCu
bxVwrm4ecK5uGmyudwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACng0YJvHkvrLx4Lv68eC7+vXkv/7x4
Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vHgu4gAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjg0wJu3kwrLx4
Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vHgu7TOo
90UzqPdZM6j3WTOo91kzqPdZM6j3WTOo91kzqPdZM6j3WTOo91kzqPdZM6j3WTOo91kzqPdZM6j3WTOo
91kzqPdZM6j3WTOo9lkzqPNZNajvWTeo7Fk3qOtZN6jrWTao7Vk0qPFZM6j0WTOo9lkzqPdZM6j3NAAA
AACehFYJunkyrL15L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv6DOo97Myp/b4Mqf2+DOo9/gyp/b4Mqf2+DOo9/gyp/b4Mqf2+DOo9/gyp/b4M6j3+DKn
9vgyp/b4Mqf2+DOo9/gyp/b4Mqf2+DOo9/gyp/b4Mqf2+DOo9/gyp/b4Mqf2+DOo9/gyp/b4Mqf2+DOo
9/gyp/b4Mqf2kgAAAACahVwJuXo0rLx4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4
Lv68eC7+vXkv/7x4Lv68eC7+vHgu1DOo95wyp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAAAACWhWMJuHo1rLx4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4
Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vHguszOo93AzqPf9M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3lgAAAACThmkJt3o2rL15L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/9vXkveTOo900yp/byMqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAAAACRhmwJt3o2rLx4
Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7svHguRzOo
9y8yp/baMqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAA
AACPh24Jt3o2rLx4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4
Lv68eC7BvHguIjOo9xUzqPeqM6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3lgAAAACOh3AJt3o2rL15L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/S9eS9xvXkvAjOo9wMyp/Z5Mqf2+DOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAAAACOh3AJt3o2rLx4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4
Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lsa8eC4oAAAAAAAAAAAyp/ZFMqf24TOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAAAACOh3AJt3o2rLx4Lv68eC7+vXkv/7x4
Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Ll+8eC4CAAAAAAAAAAAzqPcNM6j3rDOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3lgAAAACOh3EJt3o2rL15
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/3vXkvmwAAAAAAAAAAAAAAAAAA
AAAAAAAAMqf2VTOo9/4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAA
AACOh3EJt3o2rLx4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lvm8eC6svXkvIwAA
AAAAAAAAAAAAAAAAAAAAAAAAMqf2CzOo990yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+M6j3/zKn
9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2lQAAAACMiHMJt3o2rLx4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4Lv68eC7+vXkv/7x4
Lra8eC4qvXkvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo92AzqPfyM6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3lgAAAACLiXYJt3o2rL15L/+9eS//vXkv/715L/+9eS//vXkv/715
L/69eS/ovXkvlr16LwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo9x0yp/azMqf2/TOo
9/8yp/b+Mqf2/jOo9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAAAACKincJt3o2rLx4Lv68eC7+vXkv/7x4
Lv68eC7+vXkv+Lx4Lra9ezBbvX8zDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo
9wIzqPdWM6j35zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3lgAAAACJjXoJtns3rL15
L/+9eS//vXkv/715L/a9eS+9vXkvZ76FNxy+hTgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAyp/YFMqf2ezOo9/0yp/b+Mqf2/jOo9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAA
AACCkocFqINPbLKBQpa1gT59uYA5VL2EOBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqf2EjOo98Iyp/b9Mqf2/jOo9/8yp/b+M6j3/zKn
9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2lQAAAAAAAAAAgZ6TAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo90EzqPfXM6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3lgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAyp/ZHMqf21jOo9/8yp/b+M6j3/zKn9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAAAACJr5gFvL1qYsW/YZDFv2GQxcBikMXA
YpDFwGKQxsFjkMXAYpDFwGKQxsFjjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAyp/YFMqf2UDOo9+gyp/b+M6j3/zKn9v4yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo
9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2/jOo9/8yp/b+Mqf2lQAAAACNspcJvr9qrMXA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA///gPgf/AAD//8AeAf8AAP//gAYAPwAA//8AAgAfAAD//gACAA8AAP/+AAIABwAA//4AAgAH
AAD//gACAAMAAP/+AAIAAQAA//4AAgABAAD//gACAAAAAP//AAIAAAAA//8ABgAAAAD//4AGAAAAAP//
wB4AAAAA///wfgAAAAD////+AAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAA
AAAAAAACAAAAAAAAAAIAAAAAAAAAAgABAACAAAACAAEAAIAAAAIABwAAwAAAAgAHAADAAAACAAcAAOAA
AAIAHwAA4AAAAgA/AADgAAACAH8AAPAAAAIH/wAA+AAAA3//AAD8AAAD//8AAP4AAAIAPwAA/gAAAgA/
AAD/AAACAD8AAP+AAAIAPwAA/8AAAgA/AAD/8AACAD8AAP/8AAIAfwAA//4AAgB/AAD//4ACAf8AAP//
+AID/wAA///+Ag//AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISx
RBSEsUSEhLFExoSxRM6EsUScha9DLQAAAAAAAAAAAAAAAL15L2O9eS/GvXkvorx5L2O8eS8RAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACEsUQqhLFE5oSxRP+EsUT/hLFE/4SxRP+EsUT5h61CWwAAAAAAAAAAvHkveb15L/+9eS//vXkv/715
L/W9eS+KvXkvDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAhLFEA4SxRNWEsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT4j6U/JgAAAAC7eS95vXkv/715
L/+9eS//vXkv/715L/+9eS/bvXkvKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACEsURJhLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUSOAAAAALp7
L3m9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/svXkvLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAISxRHqEsUT/hLFE/4SxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RL8AAAAAuXwweb15L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/dvXkvDgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhLFEdISxRP+EsUT/hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFEuQAAAAC5fDB5vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS+QAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEsUQ5hLFE/4SxRP+EsUT/hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUR9AAAAALp7L3m9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/i9eS8XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEsUS5hLFE/4Sx
RP+EsUT/hLFE/4SxRP+EsUT/hLFE6pKfQhQAAAAAu3kveb15L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCu
bhOEsUTEhLFE/4SxRP+EsUT/hLFE/4SxROaDrEo2AAAAAAAAAAC8eS95vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkvtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGitgAJyrmpRhLFEk4SxRJp7sFVpcKtyDgAAAAAAAAAAAAAAAL15L3m9eS//vXkv/715
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAunkxeb15
L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/IzqPd2M6j3jDOo94wzqPeMM6j3jDOo
94wzqPeMM6j3jDOo94wzqPeMM6j3jDOo94wzqPaMNKjyjDWo74w2qO+MNajxjDOo9YwzqPaMM6j3ZQAA
AAC2ejd5vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv7TOo98EzqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPe5AAAAALN7O3m9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS/RM6j3mDOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo97kAAAAAsnw+eb15L/+9eS//vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L50zqPdjM6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j3/zOo9/8zqPf/M6j3uQAAAACyfD55vXkv/715L/+9eS//vXkv/715L/+9eS//vXkv/715
L/+9eS//vXkvTjOo9yEzqPf+M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
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
Q/6DsEOnpo42BLx5L9W8eC7+vHgu/rx4Lv68eC7+vHgu/rx4Lvi8eC5BAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAB/sE1vhLFE/YSxRP+EsUT/g7BD/oSxRO2OokQ0pos6BLx5L9W8eC7+vXkv/715
L/+8eC7+vXkv/715L/+8eC6eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjrIoDeq9Ya4Gw
SNKEsUTlgbBJvXyrWz8AAAAAoIpIBL15L9W8eC7+vXkv/715L/+8eC7+vXkv/715L/+8eC7YAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF6slQVkrYgOXqyUAgAAAAAAAAAAmYpXBLx5
L9W8eC7+vHgu/rx4Lv68eC7+vHgu/rx4Lv68eC7zM6j3kjOo96gyp/aoM6j3qDOo96gyp/aoM6j3qDOo
96gyp/aoM6j1qDSo8qg1qPGoNKfzqDOo9qgyp/aFj4pqBLt5MdW8eC7+vXkv/715L/+8eC7+vXkv/715
L/+8eC7uM6j3wjOo9/8yp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8zqPf/Mqf2/jOo
9/8yp/bKh4t5BLp5MtW8eC7+vXkv/715L/+8eC7+vXkv/715L/+8eC7KM6j3kjOo9/8yp/b+M6j3/zOo
9/8yp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8zqPf/Mqf2/jOo9/8yp/bKgYyDBLp5MtW8eC7+vXkv/715
L/+8eC7+vXkv/715L/+8eC6GMqf2TzKn9v0yp/b+Mqf2/jKn9v4yp/b+Mqf2/jKn9v4yp/b+Mqf2/jKn
9v4yp/b+Mqf2/jKn9v4yp/bKfo2IBLp5MtW8eC7+vHgu/rx4Lv68eC7+vHgu/rx4Lu68eC4nM6j3FDOo
9+Myp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8zqPf/Mqf2/jOo9/8yp/bKfo2IBLp5
MtW8eC7+vXkv/715L/+8eC7+vXkv/b15L34AAAAAAAAAADKn9o8yp/b+Mqf2/jKn9v4yp/b+Mqf2/jKn
9v4yp/b+Mqf2/jKn9v4yp/b+Mqf2/jKn9v4yp/bKfI2KBLp5MtW8eC7+vHgu/rx4Lv68eC7+vHguobx4
LgkAAAAAAAAAADOo9x8yp/boM6j3/zOo9/8yp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8zqPf/Mqf2/jOo
9/8yp/bKeZCQBLp5MtW8eC7+vXkv/715L+u9ezB6vXwxAQAAAAAAAAAAAAAAAAAAAAAyp/ZvM6j3/jOo
9/8yp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8zqPf/Mqf2/jOo9/8yp/bKd5aXA7N+Pqu6fDWzvYE2cr6H
OSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyp/YEMqf2tjKn9v4yp/b+Mqf2/jKn9v4yp/b+Mqf2/jKn
9v4yp/b+Mqf2/jKn9v4yp/bKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAM6j3EzOo98Myp/b+M6j3/zOo9/8yp/b+M6j3/zOo9/8zqPf/Mqf2/jOo9/8yp/bKeqynA8G/
ZqfFwGLHxsFjx8bBY8fFwGLBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo9xkyp/a4M6j3/jOo
9/8yp/b+M6j3/zOo9/8zqPf/Mqf2/jOo9/8yp/bKfbGoBMPAZdXFwGL+xsFj/8bBY//FwGLOAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyp/YLMqf2jTKn9vkyp/b+Mqf2/jKn9v4yp/b+Mqf2/jKn
9v4yp/bKf7SoBMPAZdXFwGL+xcBi/sXAYv7FwGJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADOo9zMyp/avM6j39zOo9/8zqPf/Mqf2/jOo9/8yp/bKg7WlBMPAZdXFwGL+xsFj/sbB
Y7DFwGIJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyp/YDM6j3LzOo
938zqPfBMqf25TOo9/Eyp/bCg7WlBMPAZczFwGLixcBjgsXAYw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyp/YBMqf2ED2p6yRRrNYjAAAAAJ65
iiOyvXUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8cfAP8ABwD/AAMA/gABAP4AAAD+AAAA/wAAAP8C
AAD/xgAAAAAAAAAAAAAAAAAAAAAAAAAAAQCAAAEAgAADAMAADwDAAf8A4AAHAPAABwD4AAcA/gAHAP8A
DwD/4T8AKAAAABAAAAAgAAAAAQAgAAAAAABABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAISxRCaEsURlhLBDMgAAAACsiDQYunovWrx5Lx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAISxREGEsUT4hLFE/4SxRP2MqEBeroYzPL15L/+9eS/8vXkvnL15LwoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACEsUSwhLFE/4SxRP+EsUT/hLFE0qyHNDy9eS//vXkv/715L/+9eS+9vXkvAwAA
AAAAAAAAAAAAAAAAAAAAAAAAhLFEqoSxRP+EsUT/hLFE/4SxRM2thzQ8vXkv/715L/+9eS//vXkv/715
L2gAAAAAAAAAAAAAAAAAAAAAAAAAAHavYTOEsUTwhLFE/4SxRPiKpUhNrYU4PL15L/+9eS//vXkv/715
L/+9eS/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYKyQFG6ucktorIEdAAAAAKaESDy9eS//vXkv/715
L/+9eS//vXkv8zOo97AzqPfFM6j3xTOo98UzqPfFM6j3xTOo9cU0qPPFM6j1xTOo9qqchVo8vXkv/715
L/+9eS//vXkv/715L+8zqPe+M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPfclIZoPL15
L/+9eS//vXkv/715L/+9eS+6M6j3ezOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j33JGH
bDy9eS//vXkv/715L/+9eS//vXkvTTOo9x8zqPf7M6j3/zOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
99yQh248vXkv/715L/+9eS//vXkvlQAAAAAAAAAAM6j3mTOo9/8zqPf/M6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPfcjYpzPL15L/+9eS/lvX4yagAAAAAAAAAAAAAAADOo9xAzqPfeM6j3/zOo9/8zqPf/M6j3/zOo
9/8zqPf/M6j33HucmA2nlF8ov5dGAgAAAAAAAAAAAAAAAAAAAAAAAAAAM6j3KTOo9+gzqPf/M6j3/zOo
9/8zqPf/M6j3/zOo99yRs5MzxcBi2sbBY9rGwWPQAAAAAAAAAAAAAAAAAAAAAAAAAAAzqPchM6j3yTOo
9/8zqPf/M6j3/zOo9/8zqPfclLeTPMbBY//GwWP/xcBisAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOo
9wMzqPdjM6j30jOo9/8zqPf/M6j33Je4kTzGwWP/xsFj3MXAYh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAzqPcjNKj1VESq5FyLtp0atr5yVcTAZAkAAAAAAAAAAAAAAAD8RwAA+AEAAPgA
AAD4AAAA+AAAAPxAAAAAAAAAAAAAAAAAAAAAAQAAgAMAAIAHAADAAwAA4AMAAPADAAD+BwAA
</value>
</data>
</root>

View File

@ -0,0 +1,31 @@
using System.Collections.Specialized;
namespace Smartstore.WebApi.Client.Models
{
public class ApiFileParameter
{
public ApiFileParameter(byte[] data)
: this(data, null)
{
}
public ApiFileParameter(byte[] data, string fileName)
: this(data, fileName, null)
{
}
public ApiFileParameter(byte[] data, string fileName, string contentType)
{
Data = data;
FileName = fileName;
ContentType = contentType;
Parameters = new NameValueCollection();
}
public byte[] Data { get; set; }
public string FileName { get; set; }
public string ContentType { get; set; }
public NameValueCollection Parameters { get; set; }
}
}

View File

@ -0,0 +1,12 @@
namespace Smartstore.WebApi.Client.Models
{
public class Customer
{
public string Id { get; set; }
public string CustomerGuid { get; set; }
public string Email { get; set; }
public override string ToString()
=> $"Id: {Id}, Guid: {CustomerGuid}, Email: {Email}";
}
}

View File

@ -0,0 +1,64 @@
namespace Smartstore.WebApi.Client.Models
{
public enum DuplicateFileHandling
{
ThrowError,
Overwrite,
Rename
}
/// <summary>
/// Represents file upload data to be used for multipart form data.
/// </summary>
[Serializable]
public class FileUploadModel
{
/// <summary>
/// Entity identifier to which the files belong.
/// </summary>
public int Id { get; set; }
/// <summary>
/// Paths of files to upload.
/// </summary>
public List<FileModel> Files { get; set; } = new();
/// <summary>
/// Any custom properties to be added to multipart form data. Examples:
/// Identify product by SKU: Sku = "my SKU"
/// Delete existing import files: deleteExisting = true
/// Start import: startImport = true
/// </summary>
public Dictionary<string, object> CustomProperties { get; set; } = new();
[Serializable]
public class FileModel
{
/// <summary>
/// File identifier for updating files.
/// </summary>
public int Id { get; set; }
/// <summary>
/// Absolute local path of file to be uploaded.
/// </summary>
public string LocalPath { get; set; }
/// <summary>
/// Media service path in shop.
/// </summary>
public string Path { get; set; }
/// <summary>
/// Whether the file in shop is marked as transient.
/// </summary>
public bool IsTransient { get; set; } = true;
/// <summary>
/// Duplicate file handling.
/// </summary>
public DuplicateFileHandling DuplicateFileHandling { get; set; } = DuplicateFileHandling.ThrowError;
}
}
}

View File

@ -0,0 +1,17 @@
namespace Smartstore.WebApi.Client
{
internal static class Program
{
public static string AppName => "Smartstore Web API Client v.5.0";
public static string ConsumerName => "My shopping data consumer v.5.0";
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@ -0,0 +1,158 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Smartstore.WebApi.Client.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiPublicKey {
get {
return ((string)(this["ApiPublicKey"]));
}
set {
this["ApiPublicKey"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiSecretKey {
get {
return ((string)(this["ApiSecretKey"]));
}
set {
this["ApiSecretKey"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiUrl {
get {
return ((string)(this["ApiUrl"]));
}
set {
this["ApiUrl"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiPaths {
get {
return ((string)(this["ApiPaths"]));
}
set {
this["ApiPaths"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiContent {
get {
return ((string)(this["ApiContent"]));
}
set {
this["ApiContent"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiQuery {
get {
return ((string)(this["ApiQuery"]));
}
set {
this["ApiQuery"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiPaths2 {
get {
return ((string)(this["ApiPaths2"]));
}
set {
this["ApiPaths2"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiVersion {
get {
return ((string)(this["ApiVersion"]));
}
set {
this["ApiVersion"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiHeaders {
get {
return ((string)(this["ApiHeaders"]));
}
set {
this["ApiHeaders"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string FileUpload {
get {
return ((string)(this["FileUpload"]));
}
set {
this["FileUpload"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ApiProxyPort {
get {
return ((string)(this["ApiProxyPort"]));
}
set {
this["ApiProxyPort"] = value;
}
}
}
}

View File

@ -0,0 +1,39 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Smartstore.WebApi.Client.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="ApiPublicKey" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiSecretKey" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiUrl" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiPaths" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiContent" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiQuery" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiPaths2" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiVersion" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiHeaders" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="FileUpload" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ApiProxyPort" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

View File

@ -0,0 +1,17 @@
namespace Smartstore.WebApi.Client.Properties
{
internal sealed partial class Settings
{
public Settings()
{
}
private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e)
{
}
private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e)
{
}
}
}

View File

@ -0,0 +1,43 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<Version>5.0.0.0</Version>
<Authors>Smartstore AG</Authors>
<Company>Smartstore AG</Company>
<Product />
<Copyright>Copyright © Smartstore AG</Copyright>
<PackageProjectUrl>https://smartstore.com/</PackageProjectUrl>
<RepositoryUrl>https://github.com/smartstore/Smartstore</RepositoryUrl>
<RepositoryType>Git</RepositoryType>
<ApplicationIcon>favicon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Content Include="favicon.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,34 @@
namespace Smartstore.WebApi.Client.Utilities
{
public class HourGlass : IDisposable
{
public HourGlass()
{
Enabled = true;
}
public void Dispose()
{
Enabled = false;
}
public static bool Enabled
{
get => Application.UseWaitCursor;
set
{
if (value == Application.UseWaitCursor)
{
return;
}
Application.UseWaitCursor = value;
Form f = Form.ActiveForm;
if (f != null) // Send WM_SETCURSOR
{
SendMessage(f.Handle, 0x20, f.Handle, (IntPtr)1);
}
}
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB