commit 2002a53fb5c06ddcab8457c5227432ae20ff3f4e Author: Mike Schwörer Date: Fri Oct 6 17:20:58 2017 +0200 Disassembled CarotDav v1.14.7 with dotPeek 2017.2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0c6f89f --- /dev/null +++ b/.gitignore @@ -0,0 +1,456 @@ + +# Created by https://www.gitignore.io/api/csharp,windows,visualstudio + +### Csharp ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Uncomment the next line to ignore your web deploy settings. +# By default, sensitive information, such as encrypted password +# should be stored in the .pubxml.user file. +#*.pubxml +*.pubxml.user +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files + +# User-specific files (MonoDevelop/Xamarin Studio) + +# Build results + +# Visual Studio 2015 cache/options directory +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results + +# NUNIT + +# Build Results of an ATL Project + +# .NET Core + + +# Chutzpah Test files + +# Visual C++ cache files + +# Visual Studio profiler + +# TFS 2012 Local Workspace + +# Guidance Automation Toolkit + +# ReSharper is a .NET coding add-in + +# JustCode is a .NET coding add-in + +# TeamCity is a build add-in + +# DotCover is a Code Coverage Tool + +# Visual Studio code coverage results + +# NCrunch + +# MightyMoose + +# Web workbench (sass) + +# Installshield output folder + +# DocProject is a documentation generator add-in + +# Click-Once directory + +# Publish Web Output +# TODO: Uncomment the next line to ignore your web deploy settings. +# By default, sensitive information, such as encrypted password +# should be stored in the .pubxml.user file. +#*.pubxml + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted + +# NuGet Packages +# The packages folder can be ignored because of Package Restore +# except build/, which is used as an MSBuild target. +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files + +# Microsoft Azure Build Output + +# Microsoft Azure Emulator + +# Windows Store app package directories and files + +# Visual Studio cache files +# files ending in .cache can be ignored +# but keep track of directories ending in .cache + +# Others + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) + +# SQL Server files + +# Business Intelligence projects + +# Microsoft Fakes + +# GhostDoc plugin setting file + +# Node.js Tools for Visual Studio + +# Typescript v1 declaration files + +# Visual Studio 6 build log + +# Visual Studio 6 workspace options file + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) + +# Visual Studio LightSwitch build output + +# Paket dependency manager + +# FAKE - F# Make + +# JetBrains Rider + +# CodeRush + +# Python Tools for Visual Studio (PTVS) + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file + +# BizTalk build output + +### VisualStudio Patch ### +# By default, sensitive information, such as encrypted password +# should be stored in the .pubxml.user file. + +# End of https://www.gitignore.io/api/csharp,windows,visualstudio + diff --git a/CarotDAV/AboutForm.cs b/CarotDAV/AboutForm.cs new file mode 100644 index 0000000..3b94ab0 --- /dev/null +++ b/CarotDAV/AboutForm.cs @@ -0,0 +1,233 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.AboutForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class AboutForm : Form + { + private IContainer components; + [AccessedThroughProperty("lblSoftwareName")] + private Label _lblSoftwareName; + [AccessedThroughProperty("lblCopy")] + private Label _lblCopy; + [AccessedThroughProperty("PictureBox1")] + private PictureBox _PictureBox1; + [AccessedThroughProperty("SupportLinkLabel")] + private LinkLabel _SupportLinkLabel; + + public AboutForm() + { + this.Load += new EventHandler(this.AboutForm_Load); + this.InitializeComponent(); + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + internal virtual Label lblSoftwareName + { + get + { + return this._lblSoftwareName; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._lblSoftwareName = value; + } + } + + internal virtual Label lblCopy + { + get + { + return this._lblCopy; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._lblCopy = value; + } + } + + internal virtual PictureBox PictureBox1 + { + get + { + return this._PictureBox1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PictureBox1_Click); + if (this._PictureBox1 != null) + this._PictureBox1.Click -= eventHandler; + this._PictureBox1 = value; + if (this._PictureBox1 == null) + return; + this._PictureBox1.Click += eventHandler; + } + } + + internal virtual LinkLabel SupportLinkLabel + { + get + { + return this._SupportLinkLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SupportLinkLabel_Click); + if (this._SupportLinkLabel != null) + this._SupportLinkLabel.Click -= eventHandler; + this._SupportLinkLabel = value; + if (this._SupportLinkLabel == null) + return; + this._SupportLinkLabel.Click += eventHandler; + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.lblSoftwareName = new Label(); + this.lblCopy = new Label(); + this.PictureBox1 = new PictureBox(); + this.SupportLinkLabel = new LinkLabel(); + ((ISupportInitialize) this.PictureBox1).BeginInit(); + this.SuspendLayout(); + this.lblSoftwareName.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + this.lblSoftwareName.BackColor = Color.Transparent; + Label lblSoftwareName1 = this.lblSoftwareName; + Point point1 = new Point(8, 12); + Point point2 = point1; + lblSoftwareName1.Location = point2; + this.lblSoftwareName.Name = "lblSoftwareName"; + Label lblSoftwareName2 = this.lblSoftwareName; + Size size1 = new Size(238, 16); + Size size2 = size1; + lblSoftwareName2.Size = size2; + this.lblSoftwareName.TabIndex = 0; + this.lblSoftwareName.Text = "Software Name"; + this.lblCopy.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + this.lblCopy.BackColor = Color.Transparent; + Label lblCopy1 = this.lblCopy; + point1 = new Point(8, 36); + Point point3 = point1; + lblCopy1.Location = point3; + this.lblCopy.Name = "lblCopy"; + Label lblCopy2 = this.lblCopy; + size1 = new Size(238, 16); + Size size3 = size1; + lblCopy2.Size = size3; + this.lblCopy.TabIndex = 1; + this.lblCopy.Text = "Copyright"; + this.PictureBox1.Cursor = Cursors.Hand; + this.PictureBox1.Image = (Image) CarotDAV.My.Resources.Resources.logo_w; + PictureBox pictureBox1_1 = this.PictureBox1; + point1 = new Point(248, 0); + Point point4 = point1; + pictureBox1_1.Location = point4; + this.PictureBox1.Name = "PictureBox1"; + PictureBox pictureBox1_2 = this.PictureBox1; + size1 = new Size(100, 82); + Size size4 = size1; + pictureBox1_2.Size = size4; + this.PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; + this.PictureBox1.TabIndex = 5; + this.PictureBox1.TabStop = false; + LinkLabel supportLinkLabel1 = this.SupportLinkLabel; + point1 = new Point(8, 60); + Point point5 = point1; + supportLinkLabel1.Location = point5; + this.SupportLinkLabel.Name = "SupportLinkLabel"; + LinkLabel supportLinkLabel2 = this.SupportLinkLabel; + size1 = new Size(216, 16); + Size size5 = size1; + supportLinkLabel2.Size = size5; + this.SupportLinkLabel.TabIndex = 2; + this.SupportLinkLabel.TabStop = true; + this.SupportLinkLabel.Text = "Support URI"; + size1 = new Size(5, 12); + this.AutoScaleBaseSize = size1; + this.BackColor = Color.White; + size1 = new Size(354, 82); + this.ClientSize = size1; + this.Controls.Add((Control) this.SupportLinkLabel); + this.Controls.Add((Control) this.PictureBox1); + this.Controls.Add((Control) this.lblCopy); + this.Controls.Add((Control) this.lblSoftwareName); + this.FormBorderStyle = FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = nameof (AboutForm); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = FormStartPosition.CenterScreen; + this.Text = "About"; + ((ISupportInitialize) this.PictureBox1).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + } + + private void AboutForm_Load(object sender, EventArgs e) + { + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + string str = executingAssembly.GetName().Version.ToString(3); + string product = ((AssemblyProductAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false)[0]).Product; + string copyright = ((AssemblyCopyrightAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyCopyrightAttribute), false)[0]).Copyright; + string description = ((AssemblyDescriptionAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyDescriptionAttribute), false)[0]).Description; + this.lblSoftwareName.Text = product + " " + str; + this.lblCopy.Text = copyright; + this.SupportLinkLabel.Text = "http://rei.to/"; + this.PictureBox1.Location = new Point(checked (this.ClientRectangle.Width - this.PictureBox1.Width), checked (this.ClientRectangle.Height - this.PictureBox1.Height)); + } + + private void SupportLinkLabel_Click(object sender, EventArgs e) + { + this.SupportLinkLabel.LinkVisited = true; + try + { + Process.Start(this.SupportLinkLabel.Text); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + private void PictureBox1_Click(object sender, EventArgs e) + { + try + { + Process.Start(this.SupportLinkLabel.Text); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + } +} diff --git a/CarotDAV/AboutForm.resx b/CarotDAV/AboutForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/AboutForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/AssemblyInfo.cs b/CarotDAV/AssemblyInfo.cs new file mode 100644 index 0000000..f52ff88 --- /dev/null +++ b/CarotDAV/AssemblyInfo.cs @@ -0,0 +1,12 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyProduct("CarotDAV")] +[assembly: ComVisible(false)] +[assembly: AssemblyDescription("WebDAV Client")] +[assembly: Guid("6942ff74-9153-4b3f-a978-d5d07508ee33")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCompany("Rei Software")] +[assembly: AssemblyCopyright("(C) 2007-2016 Rei HOBARA")] +[assembly: AssemblyTitle("CarotDAV")] +[assembly: AssemblyVersion("1.13.2.18337")] diff --git a/CarotDAV/AsyncCopy.cs b/CarotDAV/AsyncCopy.cs new file mode 100644 index 0000000..29edc0d --- /dev/null +++ b/CarotDAV/AsyncCopy.cs @@ -0,0 +1,2277 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.AsyncCopy +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Com; +using Rei.Fs; +using Rei.Fs.IO; +using Rei.Fs.Webdav; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class AsyncCopy : Component + { + private static DateTime win32timeorigin = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc); + private IContainer components; + private object pLock; + private int pWorkerState; + private bool pStopAfterFile; + private LinkedList pTaskList; + private FsBase pFS; + private CacheManager pCache; + private UCSNormalization pUploadFilenameNormalization; + private UCSNormalization pDownloadFilenameNormalization; + private SendOrPostCallback pServerResourceChangedCallback; + private SendOrPostCallback pCompleteCallback; + private AsyncCopy.DavCopyWorkerDelegate pDavCopyWorkerDelegate; + private AsyncCopy.DavCopyStateType pCurrentState; + private long pTotalCost; + private long pTotalProgress; + private double pTotalTransferSeconds; + private long pCurrentCost; + private long pCurrentProgress; + private double pCurrentSeconds; + private string pCurrentDesc; + private long pTotalFiles; + private long pTotalFolders; + private long pCurrentFiles; + private long pCurrentFolders; + private bool pCancelled; + private Exception pLastException; + private AsyncOperation pAsyncOp; + + [DebuggerNonUserCode] + public AsyncCopy(IContainer container) + : this() + { + if (container == null) + return; + container.Add((IComponent) this); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + } + + public event EventHandler RemoteResourceChanged; + + public event AsyncCompletedEventHandler CopyCompleted; + + public event EventHandler ConflictionOccurred; + + public event EventHandler ExceptionOccurred; + + [DebuggerNonUserCode] + public AsyncCopy() + { + this.Disposed += new EventHandler(this.AsyncCopy_Disposed); + this.pServerResourceChangedCallback = new SendOrPostCallback(this.ServerResourceChangedCallback); + this.pCompleteCallback = new SendOrPostCallback(this.DavCopyCompletedCallback); + this.pDavCopyWorkerDelegate = new AsyncCopy.DavCopyWorkerDelegate(this.Worker); + this.InitializeComponent(); + this.pLock = RuntimeHelpers.GetObjectValue(new object()); + this.pTaskList = new LinkedList(); + this.pUploadFilenameNormalization = UCSNormalization.None; + this.pDownloadFilenameNormalization = UCSNormalization.None; + } + + public int TaskCount + { + get + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + return this.pTaskList.Count; + } + finally + { + Monitor.Exit(pLock); + } + } + } + + public int UncompleteTaskCount + { + get + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + int num; + try + { + LinkedList.Enumerator enumerator; + try + { + enumerator = this.pTaskList.GetEnumerator(); + while (enumerator.MoveNext()) + { + AsyncCopy.DavCopyTask current = enumerator.Current; + if (current.State != AsyncCopy.TaskStateType.Complete && current.State != AsyncCopy.TaskStateType.ErrorIgnore && current.State != AsyncCopy.TaskStateType.Skipped) + checked { ++num; } + } + } + finally + { + enumerator.Dispose(); + } + } + finally + { + Monitor.Exit(pLock); + } + return num; + } + } + + public int FinishedTaskCount + { + get + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + int num; + try + { + LinkedList.Enumerator enumerator; + try + { + enumerator = this.pTaskList.GetEnumerator(); + while (enumerator.MoveNext()) + { + AsyncCopy.DavCopyTask current = enumerator.Current; + if (current.State == AsyncCopy.TaskStateType.Complete) + checked { ++num; } + if (current.State == AsyncCopy.TaskStateType.ErrorIgnore) + checked { ++num; } + if (current.State == AsyncCopy.TaskStateType.Skipped) + checked { ++num; } + } + } + finally + { + enumerator.Dispose(); + } + } + finally + { + Monitor.Exit(pLock); + } + return num; + } + } + + public void SetClient(FsBase fs, CacheManager cm, UCSNormalization downnormalization, UCSNormalization uploadnormalization) + { + this.pFS = fs; + this.pCache = cm; + this.pDownloadFilenameNormalization = downnormalization; + this.pUploadFilenameNormalization = uploadnormalization; + } + + public void Download(ResourceId[] remoteids, string localdir) + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + ResourceId[] resourceIdArray = remoteids; + int index = 0; + while (index < resourceIdArray.Length) + { + this.pTaskList.AddLast(new AsyncCopy.DavCopyTask(AsyncCopy.TaskType.Download, resourceIdArray[index], localdir)); + checked { ++index; } + } + this.pTotalCost = -1L; + } + finally + { + Monitor.Exit(pLock); + } + } + + public void Upload(string[] localfiles, ResourceId remoteid, IDataObject dobj, DragDropEffects finisheffect) + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + int num1 = 0; + int num2 = checked (localfiles.Length - 1); + int index = num1; + while (index <= num2) + { + this.pTaskList.AddLast(new AsyncCopy.DavCopyTask(AsyncCopy.TaskType.Upload, remoteid, localfiles[index])); + checked { ++index; } + } + this.pTaskList.Last.Value.DataObject = dobj; + this.pTaskList.Last.Value.FinishEffect = finisheffect; + this.pTotalCost = -1L; + } + finally + { + Monitor.Exit(pLock); + } + } + + public void UploadDescriptors(VirtualFileInfo[] vfinfos, ResourceId remoteid, IDataObject dobj, DragDropEffects finisheffect) + { + List davCopyTaskList = new List(); + int num1 = 0; + int num2 = checked (vfinfos.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + bool flag = (vfinfos[index1].FileAttributes & FileAttributes.Directory) != (FileAttributes) 0; + string[] strArray = vfinfos[index1].FileName.Split(new char[2] + { + '\\', + '/' + }, StringSplitOptions.RemoveEmptyEntries); + AsyncCopy.DavCopyTask parenttask = (AsyncCopy.DavCopyTask) null; + int num3 = 0; + int num4 = checked (strArray.Length - 2); + int index2 = num3; + while (index2 <= num4) + { + AsyncCopy.DavCopyTask davCopyTask = (AsyncCopy.DavCopyTask) null; + AsyncCopy.DavCopyTask[] davCopyTaskArray = parenttask != null ? parenttask.SubTasks : davCopyTaskList.ToArray(); + int num5 = 0; + int num6 = checked (davCopyTaskArray.Length - 1); + int index3 = num5; + while (index3 <= num6) + { + if (Operators.CompareString(davCopyTaskArray[index3].LocalPath, strArray[index2], false) == 0 && davCopyTaskArray[index3].IsCollection) + { + davCopyTask = davCopyTaskArray[index3]; + break; + } + checked { ++index3; } + } + if (davCopyTask == null) + { + if (parenttask == null) + { + davCopyTask = new AsyncCopy.DavCopyTask(AsyncCopy.TaskType.Upload, remoteid, strArray[index2]); + davCopyTaskList.Add(davCopyTask); + } + else + davCopyTask = new AsyncCopy.DavCopyTask(parenttask, strArray[index2]); + davCopyTask.Size = -1L; + davCopyTask.IsCollection = true; + davCopyTask.LastModifiedTime = DateTime.MinValue; + davCopyTask.CreationDate = DateTime.MinValue; + davCopyTask.LastModifiedTime = DateTime.MinValue; + davCopyTask.State = AsyncCopy.TaskStateType.PropertyAcquired; + } + parenttask = davCopyTask; + checked { ++index2; } + } + AsyncCopy.DavCopyTask davCopyTask1 = (AsyncCopy.DavCopyTask) null; + AsyncCopy.DavCopyTask[] davCopyTaskArray1 = parenttask != null ? parenttask.SubTasks : davCopyTaskList.ToArray(); + int num7 = 0; + int num8 = checked (davCopyTaskArray1.Length - 1); + int index4 = num7; + while (index4 <= num8) + { + if (Operators.CompareString(davCopyTaskArray1[index4].LocalPath, strArray[index2], false) == 0 && davCopyTaskArray1[index4].IsCollection == flag) + { + davCopyTask1 = davCopyTaskArray1[index4]; + break; + } + checked { ++index4; } + } + if (davCopyTask1 == null) + { + if (parenttask == null) + { + davCopyTask1 = new AsyncCopy.DavCopyTask(AsyncCopy.TaskType.Upload, remoteid, vfinfos[index1]); + davCopyTaskList.Add(davCopyTask1); + } + else + davCopyTask1 = new AsyncCopy.DavCopyTask(parenttask, strArray[index2], vfinfos[index1]); + } + if ((vfinfos[index1].Flags & FDFlags.FD_CREATETIME) != (FDFlags) 0) + davCopyTask1.CreationDate = vfinfos[index1].CreationTime; + if ((vfinfos[index1].Flags & FDFlags.FD_ACCESSTIME) != (FDFlags) 0) + davCopyTask1.LastAccessTime = vfinfos[index1].LastAccessTime; + if ((vfinfos[index1].Flags & FDFlags.FD_WRITESTIME) != (FDFlags) 0) + davCopyTask1.LastModifiedTime = vfinfos[index1].LastWriteTime; + davCopyTask1.Size = (vfinfos[index1].Flags & FDFlags.FD_FILESIZE) == (FDFlags) 0 ? -1L : checked ((long) vfinfos[index1].FileSize); + davCopyTask1.IsCollection = flag; + davCopyTask1.State = AsyncCopy.TaskStateType.PropertyAcquired; + checked { ++index1; } + } + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + int num3 = 0; + int num4 = checked (davCopyTaskList.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + this.pTaskList.AddLast(davCopyTaskList[index2]); + checked { ++index2; } + } + this.pTaskList.Last.Value.DataObject = dobj; + this.pTaskList.Last.Value.FinishEffect = finisheffect; + this.pTotalCost = -1L; + } + finally + { + Monitor.Exit(pLock); + } + } + + public void Clear() + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + this.pTotalCost = -1L; + this.pTaskList.Clear(); + } + finally + { + Monitor.Exit(pLock); + } + } + + public void DavCopyAsync() + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + if (this.pWorkerState != 0) + throw new InvalidOperationException(); + this.pWorkerState = 1; + this.pCancelled = false; + } + finally + { + Monitor.Exit(pLock); + } + if (this.pFS == null) + throw new InvalidOperationException(); + this.pDavCopyWorkerDelegate.BeginInvoke(AsyncOperationManager.CreateOperation(RuntimeHelpers.GetObjectValue(this.pLock)), (AsyncCallback) null, (object) null); + } + + public bool IsBusy + { + get + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + return this.pWorkerState != 0; + } + finally + { + Monitor.Exit(pLock); + } + } + } + + public bool StopAfterFile + { + get + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + return this.pStopAfterFile; + } + finally + { + Monitor.Exit(pLock); + } + } + set + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + this.pStopAfterFile = value; + } + finally + { + Monitor.Exit(pLock); + } + } + } + + public void DavCopyAsyncCancel() + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + if (this.pWorkerState != 1) + return; + this.pWorkerState = 2; + } + finally + { + Monitor.Exit(pLock); + } + } + + protected void OnServerResourceChanged(ResourceChangedEventArgs e) + { + try + { + EventHandler resourceChangedEvent = this.RemoteResourceChangedEvent; + if (resourceChangedEvent == null) + return; + resourceChangedEvent((object) null, e); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + protected void OnDavCopyCompleted(AsyncCompletedEventArgs e) + { + try + { + this.pWorkerState = 0; + this.pFS.ResetConnection(); + AsyncCompletedEventHandler copyCompletedEvent = this.CopyCompletedEvent; + if (copyCompletedEvent == null) + return; + copyCompletedEvent((object) null, e); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Error\r\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand); + ProjectData.ClearProjectError(); + } + } + + public AsyncCopy.StateContainer GetState() + { + AsyncCopy.StateContainer stateContainer = new AsyncCopy.StateContainer(); + stateContainer.CurrentState = this.pCurrentState; + stateContainer.TotalCost = this.pTotalCost; + stateContainer.TotalProgress = this.pTotalProgress; + stateContainer.TotalSeconds = this.pTotalTransferSeconds; + stateContainer.CurrentCost = this.pCurrentCost; + stateContainer.CurrentProgress = this.pCurrentProgress; + stateContainer.CurrentSeconds = this.pCurrentSeconds; + stateContainer.CurrentDesc = this.pCurrentDesc; + stateContainer.TotalFiles = this.pTotalFiles; + stateContainer.CurrentFiles = this.pCurrentFiles; + stateContainer.TotalFolders = this.pTotalFolders; + stateContainer.CurrentFolders = this.pCurrentFolders; + if (stateContainer.CurrentProgress >= 0L && stateContainer.TotalProgress >= 0L) + stateContainer.TotalProgress = checked (stateContainer.TotalProgress + stateContainer.CurrentProgress); + if (stateContainer.TotalSeconds >= 0.0 && stateContainer.CurrentSeconds >= 0.0) + stateContainer.TotalSeconds = stateContainer.TotalSeconds + stateContainer.CurrentSeconds; + return stateContainer; + } + + private void Worker(AsyncOperation asyncop) + { + this.pLastException = (Exception) null; + this.pAsyncOp = asyncop; + try + { + while (true) + { + if (this.pWorkerState == 2) + this.pCancelled = true; + if (this.pStopAfterFile) + this.pCancelled = true; + if (!this.pCancelled) + { + long num1 = 0; + long num2 = 0; + double num3 = 0.0; + long num4 = 0; + long num5 = 0; + long num6 = 0; + long num7 = 0; + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + LinkedList.Enumerator enumerator; + try + { + enumerator = this.pTaskList.GetEnumerator(); + while (enumerator.MoveNext()) + { + AsyncCopy.DavCopyTask current = enumerator.Current; + if (current.State != AsyncCopy.TaskStateType.ErrorIgnore && current.State != AsyncCopy.TaskStateType.Skipped) + { + if (current.Size < 0L || num1 < 0L) + num1 = -1L; + else + checked { num1 += current.Size; } + if (current.IsCollection) + checked { ++num5; } + else + checked { ++num4; } + if (current.State == AsyncCopy.TaskStateType.Complete) + { + if (current.Size < 0L || num2 < 0L) + num2 = -1L; + else + checked { num2 += current.Size; } + if (current.IsCollection) + checked { ++num7; } + else + checked { ++num6; } + num3 += current.TransferSeconds; + } + } + } + } + finally + { + enumerator.Dispose(); + } + this.pTotalCost = num1; + this.pTotalProgress = num2; + this.pTotalTransferSeconds = num3; + this.pTotalFiles = num4; + this.pTotalFolders = num5; + this.pCurrentFiles = num6; + this.pCurrentFolders = num7; + } + finally + { + Monitor.Exit(pLock); + } + AsyncCopy.DavCopyTask task = this.Worker_GetTask(); + if (task != null) + { + switch (task.TaskType) + { + case AsyncCopy.TaskType.Download: + switch (task.State) + { + case AsyncCopy.TaskStateType.Initialized: + this.Worker_Download_GetProperty(task); + continue; + case AsyncCopy.TaskStateType.PropertyAcquired: + if (task.IsCollection) + { + this.Worker_Download_ConfirmFolder(task); + continue; + } + this.Worker_Download_DownloadFile(task); + continue; + case AsyncCopy.TaskStateType.FolderConfirmed: + this.Worker_Download_SetFolderProperty(task); + continue; + default: + goto label_35; + } + case AsyncCopy.TaskType.Upload: + switch (task.State) + { + case AsyncCopy.TaskStateType.Initialized: + this.Worker_Upload_GetProperty(task); + continue; + case AsyncCopy.TaskStateType.PropertyAcquired: + if (task.IsCollection) + { + this.Worker_Upload_ConfirmFolder(task); + continue; + } + this.Worker_Upload_UploadFile(task); + continue; + case AsyncCopy.TaskStateType.FolderConfirmed: + this.Worker_Upload_SetFolderProperty(task); + continue; + default: + goto label_42; + } + default: + goto label_43; + } + } + else + goto label_45; + } + else + goto label_45; + } +label_35: + throw new Exception(); +label_42: + throw new Exception(); +label_43: + throw new Exception(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pLastException = ex; + ProjectData.ClearProjectError(); + } +label_45: + this.pAsyncOp.PostOperationCompleted(this.pCompleteCallback, (object) new AsyncCompletedEventArgs(this.pLastException, this.pCancelled, (object) null)); + } + + private AsyncCopy.DavCopyTask Worker_GetTask() + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + LinkedList.Enumerator enumerator1; + try + { + enumerator1 = this.pTaskList.GetEnumerator(); + while (enumerator1.MoveNext()) + { + AsyncCopy.DavCopyTask current = enumerator1.Current; + if (current.State == AsyncCopy.TaskStateType.Initialized) + return current; + } + } + finally + { + enumerator1.Dispose(); + } + LinkedList.Enumerator enumerator2; + try + { + enumerator2 = this.pTaskList.GetEnumerator(); + while (enumerator2.MoveNext()) + { + AsyncCopy.DavCopyTask davCopyTask1 = enumerator2.Current; + if (davCopyTask1.IsRootTask) + { + if (davCopyTask1.State == AsyncCopy.TaskStateType.PropertyAcquired) + return davCopyTask1; + if (davCopyTask1.State == AsyncCopy.TaskStateType.FolderConfirmed) + { +label_11: + AsyncCopy.DavCopyTask[] subTasks1 = davCopyTask1.SubTasks; + int index1 = 0; + while (index1 < subTasks1.Length) + { + AsyncCopy.DavCopyTask davCopyTask2 = subTasks1[index1]; + if (!davCopyTask2.IsCollection && davCopyTask2.State == AsyncCopy.TaskStateType.PropertyAcquired) + return davCopyTask2; + checked { ++index1; } + } + AsyncCopy.DavCopyTask[] subTasks2 = davCopyTask1.SubTasks; + int index2 = 0; + while (index2 < subTasks2.Length) + { + AsyncCopy.DavCopyTask davCopyTask2 = subTasks2[index2]; + if (davCopyTask2.State == AsyncCopy.TaskStateType.FolderConfirmed) + { + davCopyTask1 = davCopyTask2; + goto label_11; + } + else + checked { ++index2; } + } + AsyncCopy.DavCopyTask[] subTasks3 = davCopyTask1.SubTasks; + int index3 = 0; + while (index3 < subTasks3.Length) + { + AsyncCopy.DavCopyTask davCopyTask2 = subTasks3[index3]; + if (davCopyTask2.State == AsyncCopy.TaskStateType.PropertyAcquired) + return davCopyTask2; + checked { ++index3; } + } + return davCopyTask1; + } + } + } + } + finally + { + enumerator2.Dispose(); + } + } + finally + { + Monitor.Exit(pLock); + } + return (AsyncCopy.DavCopyTask) null; + } + + private void Worker_Download_GetProperty(AsyncCopy.DavCopyTask task) + { + int retryminutes = 1; + this.pCurrentState = AsyncCopy.DavCopyStateType.DownloadProperty; + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentDesc = task.GetDownloadFileName(); + ResourceInfo[] resourceInfoArray; + while (true) + { + try + { + resourceInfoArray = !task.IsRootTask ? this.pCache.GetEntries(this.pFS, task.RemoteId, false) : this.pCache.GetInfoAndEntries(this.pFS, task.RemoteId, false); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.pFS.ResetConnection(); + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during downloading property.", task.GetDownloadFileName(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + task.State = AsyncCopy.TaskStateType.ErrorIgnore; + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + return; + } + } + } + if (task.IsRootTask) + { + task.RemoteId = resourceInfoArray[0].Id; + task.UriDic.Add(resourceInfoArray[0].Id.Uri, true); + task.Info = resourceInfoArray[0]; + task.LastModifiedTime = resourceInfoArray[0].LastModifiedTime; + task.IsCollection = resourceInfoArray[0].IsCollection; + task.CreationDate = resourceInfoArray[0].CreationTime; + task.LastAccessTime = resourceInfoArray[0].LastAccessTime; + task.Size = !task.IsCollection ? resourceInfoArray[0].Size : 0L; + } + task.State = AsyncCopy.TaskStateType.PropertyAcquired; + int num1 = 0; + int num2 = checked (resourceInfoArray.Length - 1); + int index = num1; + while (index <= num2) + { + if (!task.UriDic.ContainsKey(resourceInfoArray[index].Id.Uri)) + { + task.UriDic.Add(resourceInfoArray[index].Id.Uri, true); + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + AsyncCopy.DavCopyTask davCopyTask = new AsyncCopy.DavCopyTask(task, resourceInfoArray[index].Id); + davCopyTask.Info = resourceInfoArray[index]; + davCopyTask.LastModifiedTime = resourceInfoArray[index].LastModifiedTime; + davCopyTask.IsCollection = resourceInfoArray[index].IsCollection; + davCopyTask.CreationDate = resourceInfoArray[index].CreationTime; + davCopyTask.LastAccessTime = resourceInfoArray[index].LastAccessTime; + davCopyTask.Size = !davCopyTask.IsCollection ? resourceInfoArray[index].Size : 0L; + if (!davCopyTask.IsCollection) + davCopyTask.State = AsyncCopy.TaskStateType.PropertyAcquired; + this.pTaskList.AddLast(davCopyTask); + } + finally + { + Monitor.Exit(pLock); + } + } + checked { ++index; } + } + } + + private void Worker_Download_ConfirmFolder(AsyncCopy.DavCopyTask task) + { + int namecount = 0; + int retryminutes = 1; + while (true) + { + string path2 = task.CalcLocalPathForDownload(this.pDownloadFilenameNormalization, namecount); + string str = Path.Combine(task.BaseLocalPath, path2); + this.pCurrentState = AsyncCopy.DavCopyStateType.ConfirmFolder; + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentDesc = task.GetDownloadFileName(); + try + { + SimpleResourceInfo localFileInfo = SimpleResourceInfo.CreateLocalFileInfo(str); + ConflictType type; + if (localFileInfo == null) + { + type = ConflictType.NoConfliction; + } + else + { + if (namecount > 0) + { + checked { ++namecount; } + continue; + } + type = !localFileInfo.IsCollection ? ConflictType.FolderToFile : ConflictType.FolderToFolder; + } + ConflictAction conflictAction; + if (type == ConflictType.NoConfliction) + { + conflictAction = ConflictAction.NoConfliction; + } + else + { + AsyncCopy.CopyConflictedEventArgs e = new AsyncCopy.CopyConflictedEventArgs(new SimpleResourceInfo(task.GetDownloadFileName(), task.Size, task.LastModifiedTime, true), localFileInfo, type, (this.pFS.Ability & FsAbility.PartialRead) != FsAbility.None, FsAbility.All, retryminutes); + EventHandler conflictionOccurredEvent = this.ConflictionOccurredEvent; + if (conflictionOccurredEvent != null) + conflictionOccurredEvent((object) this, e); + conflictAction = e.Result.Action; + } + switch (conflictAction) + { + case ConflictAction.NoConfliction: + Directory.CreateDirectory(str); + goto case ConflictAction.Integrate; + case ConflictAction.Integrate: + task.LocalPath = str; + task.State = AsyncCopy.TaskStateType.FolderConfirmed; + return; + case ConflictAction.DeleteTarget: + if (type == ConflictType.FileToFile) + File.Delete(str); + else + Directory.Delete(str, true); + Directory.CreateDirectory(str); + goto case ConflictAction.Integrate; + case ConflictAction.Retry: + continue; + case ConflictAction.AutoRetry: + checked { retryminutes *= 2; } + continue; + case ConflictAction.ChangeName: + checked { ++namecount; } + continue; + case ConflictAction.Skip: + LinkedList linkedList = new LinkedList(); + linkedList.AddFirst(task); + while (linkedList.Count > 0) + { + AsyncCopy.DavCopyTask davCopyTask1 = linkedList.First.Value; + linkedList.RemoveFirst(); + davCopyTask1.State = AsyncCopy.TaskStateType.Skipped; + AsyncCopy.DavCopyTask[] subTasks = davCopyTask1.SubTasks; + int index = 0; + while (index < subTasks.Length) + { + AsyncCopy.DavCopyTask davCopyTask2 = subTasks[index]; + linkedList.AddLast(davCopyTask2); + checked { ++index; } + } + } + return; + case ConflictAction.CancelAll: + this.pCancelled = true; + return; + default: + throw new InvalidOperationException(); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during confirming folder property.", str, ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + LinkedList linkedList = new LinkedList(); + linkedList.AddLast(task); + while (linkedList.Count > 0) + { + AsyncCopy.DavCopyTask davCopyTask1 = linkedList.First.Value; + linkedList.RemoveFirst(); + davCopyTask1.State = AsyncCopy.TaskStateType.ErrorIgnore; + AsyncCopy.DavCopyTask[] subTasks = davCopyTask1.SubTasks; + int index = 0; + while (index < subTasks.Length) + { + AsyncCopy.DavCopyTask davCopyTask2 = subTasks[index]; + linkedList.AddLast(davCopyTask2); + checked { ++index; } + } + } + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + namecount = 0; + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + namecount = 0; + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + return; + } + } + } + } + + private void Worker_Download_DownloadFile(AsyncCopy.DavCopyTask task) + { + int namecount = 0; + int retryminutes = 1; + while (true) + { + string path2 = task.CalcLocalPathForDownload(this.pDownloadFilenameNormalization, namecount); + string path = Path.Combine(task.BaseLocalPath, path2); + this.pCurrentState = AsyncCopy.DavCopyStateType.ConfirmFile; + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentDesc = task.GetDownloadFileName(); + try + { + long start = 0; + SimpleResourceInfo localFileInfo = SimpleResourceInfo.CreateLocalFileInfo(path); + ConflictType type; + if (localFileInfo == null) + { + type = ConflictType.NoConfliction; + } + else + { + if (namecount > 0) + { + checked { ++namecount; } + continue; + } + type = !localFileInfo.IsCollection ? ConflictType.FileToFile : ConflictType.FileToFolder; + } + ConflictAction conflictAction; + if (type == ConflictType.NoConfliction) + { + conflictAction = ConflictAction.NoConfliction; + } + else + { + AsyncCopy.CopyConflictedEventArgs e = new AsyncCopy.CopyConflictedEventArgs(new SimpleResourceInfo(task.GetDownloadFileName(), task.Size, task.LastModifiedTime, false), localFileInfo, type, (this.pFS.Ability & FsAbility.PartialRead) != FsAbility.None, FsAbility.All, retryminutes); + EventHandler conflictionOccurredEvent = this.ConflictionOccurredEvent; + if (conflictionOccurredEvent != null) + conflictionOccurredEvent((object) this, e); + conflictAction = e.Result.Action; + } + switch (conflictAction) + { + case ConflictAction.NoConfliction: + case ConflictAction.Overwrite: + task.LocalPath = path; + byte[] buffer = new byte[65536]; + DateTime now = DateTime.Now; + this.pCurrentCost = task.Size; + this.pCurrentProgress = 0L; + this.pCurrentState = AsyncCopy.DavCopyStateType.DownloadFile; + CacheManager pCache = this.pCache; + FsBase pFs = this.pFS; + ResourceId remoteId = task.RemoteId; + long length = -1; + using (Stream stream1 = pCache.OpenRead(pFs, remoteId, ref start, ref length)) + { + using (Stream stream2 = (Stream) File.OpenWrite(task.LocalPath)) + { + if (start > 0L) + { + stream2.Seek(start, SeekOrigin.Begin); + if (task.Size >= 0L) + this.pCurrentCost = checked (task.Size - start); + } + while (true) + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + if (this.pWorkerState == 2) + { + this.pCancelled = true; + stream1.Close(); + throw new Exception(); + } + } + finally + { + Monitor.Exit(pLock); + } + int count = stream1.Read(buffer, 0, buffer.Length); + if (count != 0) + { + stream2.Write(buffer, 0, count); + this.pCurrentProgress = checked (this.pCurrentProgress + (long) count); + this.pCurrentSeconds = DateTime.Now.Subtract(now).TotalSeconds; + } + else + break; + } + } + } + this.SetTimes(task.LocalPath, task.LastModifiedTime, task.CreationDate, task.LastAccessTime); + if (this.pCurrentCost >= 0L) + { + if (this.pCurrentProgress < this.pCurrentCost) + throw new ApplicationException("Cannot receive whole contents. Resource may be changed."); + if (this.pCurrentProgress > this.pCurrentCost) + throw new ApplicationException("Received stream is too long. Resource may be changed."); + } + task.State = AsyncCopy.TaskStateType.Complete; + goto label_62; + case ConflictAction.OverwriteNewer: + if (DateTime.Compare(File.GetLastWriteTime(path), task.Info.LastModifiedTime) >= 0) + { + task.State = AsyncCopy.TaskStateType.Skipped; + goto label_62; + } + else + goto case ConflictAction.NoConfliction; + case ConflictAction.Resume: + if (localFileInfo.Size < 0L || task.Size < 0L) + throw new InvalidOperationException("Cannot Resume."); + if (localFileInfo.Size >= task.Size) + { + task.State = AsyncCopy.TaskStateType.Skipped; + goto label_62; + } + else + { + start = localFileInfo.Size; + goto case ConflictAction.NoConfliction; + } + case ConflictAction.DeleteTarget: + if (type == ConflictType.FileToFile) + { + File.Delete(path); + goto case ConflictAction.NoConfliction; + } + else + { + Directory.Delete(path, true); + goto case ConflictAction.NoConfliction; + } + case ConflictAction.Retry: + continue; + case ConflictAction.AutoRetry: + checked { retryminutes *= 2; } + continue; + case ConflictAction.ChangeName: + checked { ++namecount; } + continue; + case ConflictAction.Skip: + task.State = AsyncCopy.TaskStateType.Skipped; + goto label_62; + case ConflictAction.CancelAll: + this.pCancelled = true; + return; + default: + throw new InvalidOperationException(); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.pFS.ResetConnection(); + if (this.pCancelled) + { + ProjectData.ClearProjectError(); + return; + } + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during downloading file.", task.RemoteId.Uri, ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + task.State = AsyncCopy.TaskStateType.ErrorIgnore; + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + goto label_62; + } + } + } +label_62: + task.TransferSeconds = this.pCurrentSeconds; + this.pTotalTransferSeconds = this.pTotalTransferSeconds + this.pCurrentSeconds; + this.pCurrentSeconds = 0.0; + if (task.State == AsyncCopy.TaskStateType.Skipped) + { + this.pCurrentProgress = 0L; + this.pCurrentCost = 0L; + } + else + { + if (this.pTotalProgress < 0L) + return; + this.pTotalProgress = checked (this.pTotalProgress + this.pCurrentProgress); + this.pCurrentProgress = 0L; + } + } + + private void Worker_Download_SetFolderProperty(AsyncCopy.DavCopyTask task) + { + int retryminutes = 1; + this.pCurrentState = AsyncCopy.DavCopyStateType.SetFolderAttribute; + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentDesc = task.GetDownloadFileName(); + while (true) + { + try + { + this.SetTimes(task.LocalPath, task.LastModifiedTime, task.CreationDate, task.LastAccessTime); + task.State = AsyncCopy.TaskStateType.Complete; + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during updating folder property.", task.LocalPath, ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + task.State = AsyncCopy.TaskStateType.ErrorIgnore; + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + return; + } + } + } + } + + private void Worker_Upload_GetProperty(AsyncCopy.DavCopyTask task) + { + int retryminutes = 1; + while (true) + { + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentState = AsyncCopy.DavCopyStateType.SearchDirectory; + this.pCurrentDesc = task.LocalPath; + try + { + if (task.VirtualFileInfo != null) + { + if ((task.VirtualFileInfo.Flags & FDFlags.FD_CREATETIME) != (FDFlags) 0) + task.CreationDate = task.VirtualFileInfo.CreationTime; + if ((task.VirtualFileInfo.Flags & FDFlags.FD_ACCESSTIME) != (FDFlags) 0) + task.LastAccessTime = task.VirtualFileInfo.LastAccessTime; + if ((task.VirtualFileInfo.Flags & FDFlags.FD_WRITESTIME) != (FDFlags) 0) + task.LastModifiedTime = task.VirtualFileInfo.LastWriteTime; + task.Size = (task.VirtualFileInfo.Flags & FDFlags.FD_FILESIZE) == (FDFlags) 0 ? -1L : checked ((long) task.VirtualFileInfo.FileSize); + task.IsCollection = task.VirtualFileInfo.IStreamCreator == null; + task.State = AsyncCopy.TaskStateType.PropertyAcquired; + break; + } + if (File.Exists(task.LocalPath)) + { + System.IO.FileInfo fileInfo = new System.IO.FileInfo(task.LocalPath); + task.Size = fileInfo.Length; + task.LastModifiedTime = fileInfo.LastWriteTime; + task.IsCollection = false; + task.CreationDate = fileInfo.CreationTime; + task.LastAccessTime = fileInfo.LastAccessTime; + task.State = AsyncCopy.TaskStateType.PropertyAcquired; + break; + } + if (Directory.Exists(task.LocalPath)) + { + DirectoryInfo directoryInfo = new DirectoryInfo(task.LocalPath); + task.Size = 0L; + task.LastModifiedTime = directoryInfo.LastWriteTime; + task.IsCollection = true; + task.CreationDate = directoryInfo.CreationTime; + task.LastAccessTime = directoryInfo.LastAccessTime; + task.State = AsyncCopy.TaskStateType.PropertyAcquired; + FileSystemInfo[] fileSystemInfos = directoryInfo.GetFileSystemInfos(); + int index = 0; + while (index < fileSystemInfos.Length) + { + FileSystemInfo fileSystemInfo = fileSystemInfos[index]; + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + this.pTaskList.AddLast(new AsyncCopy.DavCopyTask(task, fileSystemInfo.FullName)); + } + finally + { + Monitor.Exit(pLock); + } + checked { ++index; } + } + break; + } + task.State = AsyncCopy.TaskStateType.Skipped; + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during reading file property.", task.LocalPath, ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + task.State = AsyncCopy.TaskStateType.ErrorIgnore; + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + return; + } + } + } + } + + private void Worker_Upload_ConfirmFolder(AsyncCopy.DavCopyTask task) + { + int namecount = 0; + int retryminutes = 1; + while (true) + { + string name = task.CalcRemoteUriForUpload(this.pUploadFilenameNormalization, namecount); + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentState = AsyncCopy.DavCopyStateType.MakingCollection; + this.pCurrentDesc = task.GetUploadFileName(name); + try + { + ResourceInfo ri; + try + { + ri = this.pCache.GetInfo(this.pFS, task.BaseRemoteId, name, false); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ri = (ResourceInfo) null; + ProjectData.ClearProjectError(); + } + ConflictType type; + ResourceId resourceId; + if (ri == null) + { + type = ConflictType.NoConfliction; + resourceId = (ResourceId) null; + } + else + { + if (namecount > 0) + { + checked { ++namecount; } + continue; + } + if (ri.IsCollection) + { + type = ConflictType.FolderToFolder; + resourceId = ri.Id; + } + else + { + type = ConflictType.FolderToFile; + resourceId = ri.Id; + } + } + ConflictAction conflictAction; + if (type == ConflictType.NoConfliction) + { + conflictAction = ConflictAction.NoConfliction; + } + else + { + AsyncCopy.CopyConflictedEventArgs e = new AsyncCopy.CopyConflictedEventArgs(new SimpleResourceInfo(task.LocalPath, task.Size, task.LastModifiedTime, true), new SimpleResourceInfo(ri), type, (this.pFS.Ability & FsAbility.PartialWrite) != FsAbility.None, this.pFS.Ability, retryminutes); + EventHandler conflictionOccurredEvent = this.ConflictionOccurredEvent; + if (conflictionOccurredEvent != null) + conflictionOccurredEvent((object) this, e); + conflictAction = e.Result.Action; + } + switch (conflictAction) + { + case ConflictAction.NoConfliction: + ReturnedInfo collection1 = this.pCache.CreateCollection(this.pFS, task.BaseRemoteId, name); + ResourceInfo resourceInfo1 = collection1 as ResourceInfo; + resourceId = resourceInfo1 == null ? (ResourceId) collection1 : resourceInfo1.Id; + goto case ConflictAction.Integrate; + case ConflictAction.Integrate: + task.RemoteId = resourceId; + task.State = AsyncCopy.TaskStateType.FolderConfirmed; + return; + case ConflictAction.DeleteTarget: + this.pCache.Delete(this.pFS, ri.Id); + ReturnedInfo collection2 = this.pCache.CreateCollection(this.pFS, task.BaseRemoteId, name); + ResourceInfo resourceInfo2 = collection2 as ResourceInfo; + resourceId = resourceInfo2 == null ? (ResourceId) collection2 : resourceInfo2.Id; + goto case ConflictAction.Integrate; + case ConflictAction.Retry: + continue; + case ConflictAction.AutoRetry: + checked { retryminutes *= 2; } + continue; + case ConflictAction.ChangeName: + checked { ++namecount; } + continue; + case ConflictAction.Skip: + LinkedList linkedList = new LinkedList(); + linkedList.AddLast(task); + while (linkedList.Count > 0) + { + AsyncCopy.DavCopyTask davCopyTask1 = linkedList.First.Value; + linkedList.RemoveFirst(); + davCopyTask1.State = AsyncCopy.TaskStateType.Skipped; + AsyncCopy.DavCopyTask[] subTasks = davCopyTask1.SubTasks; + int index = 0; + while (index < subTasks.Length) + { + AsyncCopy.DavCopyTask davCopyTask2 = subTasks[index]; + linkedList.AddLast(davCopyTask2); + checked { ++index; } + } + } + return; + case ConflictAction.CancelAll: + this.pCancelled = true; + return; + default: + throw new InvalidOperationException(); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.pFS.ResetConnection(); + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during confirming collection.", task.GetUploadFileName(name), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + LinkedList linkedList = new LinkedList(); + linkedList.AddLast(task); + while (linkedList.Count > 0) + { + AsyncCopy.DavCopyTask davCopyTask1 = linkedList.First.Value; + linkedList.RemoveFirst(); + davCopyTask1.State = AsyncCopy.TaskStateType.ErrorIgnore; + AsyncCopy.DavCopyTask[] subTasks = davCopyTask1.SubTasks; + int index = 0; + while (index < subTasks.Length) + { + AsyncCopy.DavCopyTask davCopyTask2 = subTasks[index]; + linkedList.AddLast(davCopyTask2); + checked { ++index; } + } + } + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + namecount = 0; + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + namecount = 0; + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + return; + } + } + } + } + + private void Worker_Upload_UploadFile(AsyncCopy.DavCopyTask task) + { + int namecount = 0; + int retryminutes = 1; + while (true) + { + string name = task.CalcRemoteUriForUpload(this.pUploadFilenameNormalization, namecount); + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentState = AsyncCopy.DavCopyStateType.UploadFile; + this.pCurrentDesc = task.GetUploadFileName(name); + try + { + long start = 0; + ResourceInfo ri; + try + { + ri = this.pCache.GetInfo(this.pFS, task.BaseRemoteId, name, false); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ri = (ResourceInfo) null; + ProjectData.ClearProjectError(); + } + ConflictType type; + if (ri == null) + { + type = ConflictType.NoConfliction; + } + else + { + if (namecount > 0) + { + checked { ++namecount; } + continue; + } + type = !ri.IsCollection ? ConflictType.FileToFile : ConflictType.FileToFolder; + } + ConflictAction conflictAction; + if (type == ConflictType.NoConfliction) + { + conflictAction = ConflictAction.NoConfliction; + } + else + { + AsyncCopy.CopyConflictedEventArgs e = new AsyncCopy.CopyConflictedEventArgs(new SimpleResourceInfo(task.LocalPath, task.Size, task.LastModifiedTime, true), new SimpleResourceInfo(ri), type, (this.pFS.Ability & FsAbility.PartialWrite) != FsAbility.None, this.pFS.Ability, retryminutes); + EventHandler conflictionOccurredEvent = this.ConflictionOccurredEvent; + if (conflictionOccurredEvent != null) + conflictionOccurredEvent((object) this, e); + conflictAction = e.Result.Action; + } + switch (conflictAction) + { + case ConflictAction.NoConfliction: + case ConflictAction.Overwrite: + if (ri != null) + task.RemoteId = ri.Id; + byte[] buffer = new byte[131072]; + DateTime now = DateTime.Now; + long size = task.Size; + while (true) + { + try + { + this.pCurrentCost = size; + this.pCurrentProgress = 0L; + this.pCurrentState = AsyncCopy.DavCopyStateType.UploadFile; + using (Stream stream1 = task.VirtualFileInfo == null ? (Stream) File.OpenRead(task.LocalPath) : task.VirtualFileInfo.ManageStream) + { + Stream st; + if (start == 0L) + { + st = (object) task.RemoteId == null ? this.pCache.OpenWrite(this.pFS, task.BaseRemoteId, name, size) : this.pCache.OpenWriteOver(this.pFS, task.RemoteId, size); + } + else + { + if (size >= 0L) + checked { size -= start; } + st = this.pCache.OpenWriteResume(this.pFS, task.RemoteId, ref start, ref size); + stream1.Seek(start, SeekOrigin.Begin); + this.pCurrentCost = size; + } + using (Stream stream2 = st) + { + while (true) + { + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + if (this.pWorkerState == 2) + { + this.pCancelled = true; + stream2.Close(); + } + } + finally + { + Monitor.Exit(pLock); + } + int count = stream1.Read(buffer, 0, buffer.Length); + if (count != 0) + { + stream2.Write(buffer, 0, count); + this.pCurrentProgress = checked (this.pCurrentProgress + (long) count); + this.pCurrentSeconds = DateTime.Now.Subtract(now).TotalSeconds; + } + else + break; + } + } + ReturnedInfo returnedInfo = this.pCache.CloseWrite(this.pFS, st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + task.RemoteId = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + break; + } + } + catch (UnauthorizedException ex) + { + ProjectData.SetProjectError((Exception) ex); + this.pFS.ResetConnection(); + WebdavFs pFs = this.pFS as WebdavFs; + if (pFs == null) + throw; + else if (pFs.SendEmptyPUT) + { + throw; + } + else + { + pFs.SendEmptyPUT = true; + ProjectData.ClearProjectError(); + } + } + } + if ((this.pFS.Ability & FsAbility.Times) != FsAbility.None) + { + DateTime lastmodifiedtime = DateTime.MinValue; + DateTime creationtime = DateTime.MinValue; + DateTime lastaccesstime = DateTime.MinValue; + if ((this.pFS.Ability & FsAbility.LastModifiedTime) != FsAbility.None) + lastmodifiedtime = task.LastModifiedTime; + if ((this.pFS.Ability & FsAbility.CreationTime) != FsAbility.None) + creationtime = task.CreationDate; + if ((this.pFS.Ability & FsAbility.LastAccessTime) != FsAbility.None) + lastaccesstime = task.LastAccessTime; + this.pCache.SetTimes(this.pFS, task.RemoteId, lastmodifiedtime, creationtime, lastaccesstime); + } + if (this.pCurrentCost >= 0L) + { + if (this.pCurrentProgress < this.pCurrentCost) + throw new ApplicationException("Cannot send whole contents. Resource may be changed."); + if (this.pCurrentProgress > this.pCurrentCost) + throw new ApplicationException("Send stream is too long. Resource may be changed."); + } + task.FinishTask(); + goto label_83; + case ConflictAction.OverwriteNewer: + if (DateTime.Compare(ri.LastModifiedTime.AddSeconds(1.0), File.GetLastWriteTime(task.LocalPath)) >= 0) + { + task.State = AsyncCopy.TaskStateType.Skipped; + goto label_83; + } + else + goto case ConflictAction.NoConfliction; + case ConflictAction.Resume: + if (ri.Size < 0L || task.Size < 0L) + throw new InvalidOperationException("Cannot Resume."); + if (ri.Size >= task.Size) + { + task.State = AsyncCopy.TaskStateType.Skipped; + goto label_83; + } + else + { + start = ri.Size; + if (start < 0L) + { + start = 0L; + goto case ConflictAction.NoConfliction; + } + else + goto case ConflictAction.NoConfliction; + } + case ConflictAction.DeleteTarget: + this.pCache.Delete(this.pFS, ri.Id); + ri = (ResourceInfo) null; + goto case ConflictAction.NoConfliction; + case ConflictAction.Retry: + continue; + case ConflictAction.AutoRetry: + checked { retryminutes *= 2; } + continue; + case ConflictAction.ChangeName: + checked { ++namecount; } + continue; + case ConflictAction.Skip: + task.State = AsyncCopy.TaskStateType.Skipped; + goto label_83; + case ConflictAction.CancelAll: + this.pCancelled = true; + return; + default: + throw new InvalidOperationException(); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.pFS.ResetConnection(); + if (this.pCancelled) + { + ProjectData.ClearProjectError(); + return; + } + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during uploading resource.", task.GetUploadFileName(name), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + task.State = AsyncCopy.TaskStateType.ErrorIgnore; + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + namecount = 0; + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + namecount = 0; + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + goto label_83; + } + } + } +label_83: + task.TransferSeconds = this.pCurrentSeconds; + this.pTotalTransferSeconds = this.pTotalTransferSeconds + this.pCurrentSeconds; + this.pCurrentSeconds = 0.0; + if (task.State == AsyncCopy.TaskStateType.Skipped) + { + this.pCurrentProgress = 0L; + this.pCurrentCost = 0L; + } + else + { + if (this.pTotalProgress < 0L) + return; + this.pTotalProgress = checked (this.pTotalProgress + this.pCurrentProgress); + this.pCurrentProgress = 0L; + } + } + + private void Worker_Upload_SetFolderProperty(AsyncCopy.DavCopyTask task) + { + int retryminutes = 1; + this.pCurrentCost = -1L; + this.pCurrentProgress = 0L; + this.pCurrentState = AsyncCopy.DavCopyStateType.UploadProperty; + this.pCurrentDesc = task.GetUploadFileName((string) null); + while (true) + { + try + { + if ((this.pFS.Ability & FsAbility.Times) != FsAbility.None) + { + DateTime lastmodifiedtime = DateTime.MinValue; + DateTime creationtime = DateTime.MinValue; + DateTime lastaccesstime = DateTime.MinValue; + if ((this.pFS.Ability & FsAbility.LastModifiedTime) != FsAbility.None) + lastmodifiedtime = task.LastModifiedTime; + if ((this.pFS.Ability & FsAbility.CreationTime) != FsAbility.None) + creationtime = task.CreationDate; + if ((this.pFS.Ability & FsAbility.LastAccessTime) != FsAbility.None) + lastaccesstime = task.LastAccessTime; + this.pCache.SetTimes(this.pFS, task.RemoteId, lastmodifiedtime, creationtime, lastaccesstime); + } + task.FinishTask(); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.pFS.ResetConnection(); + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during updating collection property.", task.GetUploadFileName((string) null), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + switch (e.Result.Action) + { + case ErrorAction.Ignore: + task.State = AsyncCopy.TaskStateType.ErrorIgnore; + ProjectData.ClearProjectError(); + return; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + this.pCancelled = true; + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + return; + } + } + } + } + + private void ServerResourceChangedCallback(object state) + { + this.OnServerResourceChanged((ResourceChangedEventArgs) state); + } + + private void DavCopyCompletedCallback(object state) + { + this.OnDavCopyCompleted((AsyncCompletedEventArgs) state); + } + + private void AsyncCopy_Disposed(object sender, EventArgs e) + { + if (this.pFS == null) + return; + this.pFS.ResetConnection(); + } + + private void SetTimes(string path, DateTime lastmodifiedtime, DateTime creationtime, DateTime lastaccesstime) + { + FileSystem.SetFileTime(path, creationtime, lastaccesstime, lastmodifiedtime); + } + + private delegate void DavCopyWorkerDelegate(AsyncOperation asyncop); + + public class DavCopyCompletedEventArgs : AsyncCompletedEventArgs + { + private long pTotalBytes; + private TimeSpan pTotalTime; + private long pTransferBytes; + + public DavCopyCompletedEventArgs(Exception error, bool cancelled, long total, long transfer, TimeSpan totaltime) + : base(error, cancelled, (object) null) + { + this.pTotalBytes = total; + this.pTransferBytes = transfer; + this.pTotalTime = this.pTotalTime; + } + + public long TotalBytes + { + get + { + return this.pTotalBytes; + } + } + + public long TransferBytes + { + get + { + return this.pTransferBytes; + } + } + + public TimeSpan TotalTime + { + get + { + return this.pTotalTime; + } + } + } + + public class CopyConflictedEventArgs : EventArgs + { + private SimpleResourceInfo pSource; + private SimpleResourceInfo pDestination; + private ConflictType pType; + private ConflictPromptFormResult pResult; + private bool pEnableResume; + private FsAbility pDestinationAbility; + private int pRetryMinutes; + + public CopyConflictedEventArgs(SimpleResourceInfo source, SimpleResourceInfo destination, ConflictType type, bool enableresume, FsAbility destability, int retryminutes) + { + this.pSource = source; + this.pDestination = destination; + this.pType = type; + this.pResult = new ConflictPromptFormResult(); + this.pResult.ToAll = false; + this.pResult.Action = ConflictAction.Skip; + this.pEnableResume = enableresume; + this.pDestinationAbility = destability; + this.pRetryMinutes = retryminutes; + } + + public SimpleResourceInfo Source + { + get + { + return this.pSource; + } + } + + public SimpleResourceInfo Destination + { + get + { + return this.pDestination; + } + } + + public ConflictType Type + { + get + { + return this.pType; + } + } + + public bool EnableResume + { + get + { + return this.pEnableResume; + } + } + + public FsAbility DestinationAbility + { + get + { + return this.pDestinationAbility; + } + } + + public ConflictPromptFormResult Result + { + get + { + return this.pResult; + } + set + { + this.pResult = value; + } + } + + public int RetryMinutes + { + get + { + return this.pRetryMinutes; + } + } + } + + public enum DavCopyStateType + { + DownloadProperty, + ConfirmFolder, + SetFolderAttribute, + ConfirmFile, + DownloadFile, + SearchDirectory, + MakingCollection, + UploadFile, + UploadProperty, + Finished, + } + + public class StateContainer + { + public AsyncCopy.DavCopyStateType CurrentState; + public long TotalCost; + public long TotalProgress; + public double TotalSeconds; + public long CurrentCost; + public long CurrentProgress; + public double CurrentSeconds; + public string CurrentDesc; + public long TotalFiles; + public long TotalFolders; + public long CurrentFiles; + public long CurrentFolders; + } + + private enum TaskType + { + Download, + Upload, + } + + private enum TaskStateType + { + Initialized, + PropertyAcquired, + FolderConfirmed, + Complete, + Skipped, + ErrorIgnore, + } + + private class DavCopyTask + { + private AsyncCopy.DavCopyTask pParentTask; + private List pSubTasks; + private AsyncCopy.TaskType pTaskType; + private Dictionary pUriDic; + private string pLocalPath; + private VirtualFileInfo pvirtualfileinfo; + private ResourceId pRemoteId; + private string pBaseLocalPath; + private ResourceId pBaseRemoteId; + public AsyncCopy.TaskStateType State; + public double TransferSeconds; + public long Size; + public DateTime LastModifiedTime; + public bool IsCollection; + public DateTime CreationDate; + public DateTime LastAccessTime; + public ResourceInfo Info; + internal IDataObject DataObject; + internal DragDropEffects FinishEffect; + + public AsyncCopy.TaskType TaskType + { + get + { + return this.pTaskType; + } + } + + public AsyncCopy.DavCopyTask ParentTask + { + get + { + return this.pParentTask; + } + } + + public AsyncCopy.DavCopyTask[] SubTasks + { + get + { + return this.pSubTasks.ToArray(); + } + } + + public bool IsRootTask + { + get + { + return this.pParentTask == null; + } + } + + public Dictionary UriDic + { + get + { + return this.pUriDic; + } + } + + public string LocalPath + { + get + { + return this.pLocalPath; + } + set + { + this.pLocalPath = value; + } + } + + public ResourceId RemoteId + { + get + { + return this.pRemoteId; + } + set + { + this.pRemoteId = value; + } + } + + public string BaseLocalPath + { + get + { + if (this.IsRootTask) + return this.pBaseLocalPath; + return this.pParentTask.pLocalPath; + } + } + + public ResourceId BaseRemoteId + { + get + { + if (this.IsRootTask) + return this.pBaseRemoteId; + return this.pParentTask.pRemoteId; + } + } + + public VirtualFileInfo VirtualFileInfo + { + get + { + return this.pvirtualfileinfo; + } + } + + internal DavCopyTask(AsyncCopy.TaskType type, ResourceId remoteid, string localpath_1) + { + this.pSubTasks = new List(); + this.pParentTask = (AsyncCopy.DavCopyTask) null; + this.pTaskType = type; + this.pUriDic = new Dictionary(); + this.State = AsyncCopy.TaskStateType.Initialized; + if (this.pTaskType == AsyncCopy.TaskType.Download) + { + this.pBaseLocalPath = localpath_1; + this.pRemoteId = remoteid; + this.pLocalPath = (string) null; + } + else + { + if (this.pTaskType != AsyncCopy.TaskType.Upload) + throw new Exception(); + this.pBaseRemoteId = remoteid; + this.pLocalPath = localpath_1; + this.pRemoteId = (ResourceId) null; + this.pvirtualfileinfo = (VirtualFileInfo) null; + } + } + + internal DavCopyTask(AsyncCopy.TaskType type, ResourceId remoteid, VirtualFileInfo vfinfo) + { + this.pSubTasks = new List(); + this.pParentTask = (AsyncCopy.DavCopyTask) null; + this.pTaskType = type; + this.pUriDic = new Dictionary(); + this.State = AsyncCopy.TaskStateType.Initialized; + this.pBaseRemoteId = remoteid; + this.pLocalPath = vfinfo.FileName; + this.pvirtualfileinfo = vfinfo; + this.pRemoteId = (ResourceId) null; + } + + internal DavCopyTask(AsyncCopy.DavCopyTask parenttask, ResourceId id) + { + this.pSubTasks = new List(); + this.pParentTask = parenttask; + this.pParentTask.pSubTasks.Add(this); + this.pTaskType = this.pParentTask.TaskType; + this.pUriDic = this.pParentTask.UriDic; + this.State = AsyncCopy.TaskStateType.Initialized; + this.pLocalPath = (string) null; + this.pRemoteId = id; + } + + public string CalcLocalPathForDownload(UCSNormalization normalization, int namecount) + { + string path = UriUtil.GetLastName(this.pRemoteId.Uri); + if (namecount > 0) + path = Path.GetFileNameWithoutExtension(path) + " (" + namecount.ToString() + ")." + Path.GetExtension(path); + if (normalization != UCSNormalization.None) + path = path.Normalize((NormalizationForm) normalization); + return path; + } + + internal DavCopyTask(AsyncCopy.DavCopyTask parenttask, string filepath) + { + this.pSubTasks = new List(); + this.pParentTask = parenttask; + this.pParentTask.pSubTasks.Add(this); + this.pTaskType = this.pParentTask.TaskType; + this.pUriDic = this.pParentTask.UriDic; + this.State = AsyncCopy.TaskStateType.Initialized; + this.pLocalPath = filepath; + this.pRemoteId = (ResourceId) null; + } + + internal DavCopyTask(AsyncCopy.DavCopyTask parenttask, string filepath, VirtualFileInfo vfinfo) + { + this.pSubTasks = new List(); + this.pParentTask = parenttask; + this.pParentTask.pSubTasks.Add(this); + this.pTaskType = this.pParentTask.TaskType; + this.pUriDic = this.pParentTask.UriDic; + this.State = AsyncCopy.TaskStateType.Initialized; + this.pLocalPath = filepath; + this.pvirtualfileinfo = vfinfo; + this.pRemoteId = (ResourceId) null; + } + + public string CalcRemoteUriForUpload(UCSNormalization normalization, int namecount) + { + string path = Path.GetFileName(this.pLocalPath); + if (namecount > 0) + path = Path.GetFileNameWithoutExtension(path) + " (" + namecount.ToString() + ")." + Path.GetExtension(path); + if (normalization != UCSNormalization.None) + path = path.Normalize((NormalizationForm) normalization); + return path; + } + + public string GetDownloadFileName() + { + return this.RemoteId.Uri.ToString(); + } + + public string GetUploadFileName(string name = null) + { + if (string.IsNullOrEmpty(name)) + return this.BaseRemoteId.Uri.ToString(); + return UriUtil.CombineName(this.BaseRemoteId.Uri, name).ToString(); + } + + public void FinishTask() + { + this.State = AsyncCopy.TaskStateType.Complete; + if (this.DataObject != null) + { + DataObjectHelper.SetPerformedDragEffect(this.DataObject, this.FinishEffect); + DataObjectHelper.SetLogicalPerformedDragEffect(this.DataObject, this.FinishEffect); + if (this.FinishEffect == DragDropEffects.Move) + DataObjectHelper.SetPasteSucceeded(this.DataObject, this.FinishEffect); + DataObjectHelper.EndAsyncOperation(this.DataObject, this.FinishEffect); + this.DataObject = (IDataObject) null; + } + if (this.pvirtualfileinfo == null) + return; + if (this.pvirtualfileinfo.IStreamCreator != null) + { + this.pvirtualfileinfo.IStreamCreator.Dispose(); + this.pvirtualfileinfo.IStreamCreator = (IStreamCreator) null; + } + if (this.pvirtualfileinfo.ManageStream != null) + { + this.pvirtualfileinfo.ManageStream.Dispose(); + this.pvirtualfileinfo.ManageStream = (Stream) null; + } + this.pvirtualfileinfo = (VirtualFileInfo) null; + } + } + } +} diff --git a/CarotDAV/CacheManager.cs b/CarotDAV/CacheManager.cs new file mode 100644 index 0000000..d6abcf5 --- /dev/null +++ b/CarotDAV/CacheManager.cs @@ -0,0 +1,840 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.CacheManager +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.IO; + +namespace CarotDAV +{ + public class CacheManager + { + public Dictionary infodic; + public Dictionary> entriesdic; + public Uri watchuri; + + public CacheManager() + { + this.infodic = new Dictionary(); + this.entriesdic = new Dictionary>(); + } + + public event CacheManager.ResourceChangedEventHandler ResourceChanged; + + public void RegisterWatchUri(Uri target) + { + lock (this.infodic) + this.watchuri = target; + } + + public void Clear() + { + lock (this.infodic) + { + this.infodic.Clear(); + this.entriesdic.Clear(); + } + } + + public ResourceInfo GetInfo(FsBase fs, ResourceId id, bool enablecache) + { + lock (this.infodic) + { + if (enablecache) + { + if (this.infodic.ContainsKey(id.Uri)) + return this.infodic[id.Uri]; + } + } + Uri parent = UriUtil.GetParent(id.Uri); + ResourceInfo info; + try + { + info = fs.GetInfo(id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateNotFound(id.Uri); + throw; + } + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + if (this.infodic.ContainsKey(info.Id.Uri)) + this.infodic[info.Id.Uri] = info; + else + this.infodic.Add(info.Id.Uri, info); + if (this.entriesdic.ContainsKey(parent) && !this.entriesdic[parent].Contains(info.Id.Uri)) + this.entriesdic.Remove(parent); + if (!(this.watchuri == id.Uri)) + { + if (!(this.watchuri == parent)) + goto label_21; + } + e = new ResourceChangedEventArgs((ReturnedInfo) info); + } +label_21: + if (e != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e); + } + return info; + } + + public ResourceInfo GetInfo(FsBase fs, ResourceId parentid, string name, bool enablecache) + { + if (enablecache) + { + lock (this.infodic) + { + if (this.entriesdic.ContainsKey(parentid.Uri)) + { + int num1 = 0; + int num2 = checked (this.entriesdic[parentid.Uri].Count - 1); + int index = num1; + while (index <= num2) + { + if (Operators.CompareString(name, UriUtil.GetLastName(this.entriesdic[parentid.Uri][index]), false) == 0) + { + if (this.infodic.ContainsKey(this.entriesdic[parentid.Uri][index])) + return this.infodic[this.entriesdic[parentid.Uri][index]]; + goto label_11; + } + else + checked { ++index; } + } + throw new RemoteResourceNotFoundException(UriUtil.CombineName(parentid.Uri, name), (Exception) null); + } + } + } +label_11: + ResourceInfo info; + try + { + info = fs.GetInfo(parentid, name); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + Uri target = UriUtil.CombineName(parentid.Uri, name); + lock (this.infodic) + this.InnerUpdateNotFound(target); + throw; + } + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + if (this.infodic.ContainsKey(info.Id.Uri)) + this.infodic[info.Id.Uri] = info; + else + this.infodic.Add(info.Id.Uri, info); + if (this.entriesdic.ContainsKey(parentid.Uri) && !this.entriesdic[parentid.Uri].Contains(info.Id.Uri)) + this.entriesdic.Remove(parentid.Uri); + if (!(this.watchuri == info.Id.Uri)) + { + if (!(this.watchuri == parentid.Uri)) + goto label_27; + } + e = new ResourceChangedEventArgs((ReturnedInfo) info); + } +label_27: + if (e != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e); + } + return info; + } + + public ResourceInfo[] GetEntries(FsBase fs, ResourceId id, bool enablecache) + { + if (enablecache) + { + lock (this.infodic) + { + if (this.entriesdic.ContainsKey(id.Uri)) + { + List resourceInfoList = new List(); + int num1 = 0; + int num2 = checked (this.entriesdic[id.Uri].Count - 1); + int index = num1; + while (index <= num2) + { + if (this.infodic.ContainsKey(this.entriesdic[id.Uri][index])) + { + resourceInfoList.Add(this.infodic[this.entriesdic[id.Uri][index]]); + checked { ++index; } + } + else + goto label_9; + } + return resourceInfoList.ToArray(); + } + } + } +label_9: + ResourceInfo[] entries; + try + { + entries = fs.GetEntries(id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateInfoAndEntries_NotFound(id.Uri); + throw; + } + List changedEventArgsList = new List(); + lock (this.infodic) + { + if (this.entriesdic.ContainsKey(id.Uri)) + this.entriesdic[id.Uri].Clear(); + else + this.entriesdic.Add(id.Uri, new List()); + int num1 = 0; + int num2 = checked (entries.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + this.entriesdic[id.Uri].Add(entries[index1].Id.Uri); + if (this.infodic.ContainsKey(entries[index1].Id.Uri)) + this.infodic[entries[index1].Id.Uri] = entries[index1]; + else + this.infodic.Add(entries[index1].Id.Uri, entries[index1]); + checked { ++index1; } + } + int num3 = 0; + int num4 = checked (entries.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + if (this.watchuri == id.Uri || this.watchuri == entries[index2].Id.Uri) + changedEventArgsList.Add(new ResourceChangedEventArgs((ReturnedInfo) entries[index2])); + checked { ++index2; } + } + } + int num5 = 0; + int num6 = checked (changedEventArgsList.Count - 1); + int index3 = num5; + while (index3 <= num6) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, changedEventArgsList[index3]); + checked { ++index3; } + } + return entries; + } + + public ResourceInfo[] GetInfoAndEntries(FsBase fs, Uri targeturi, bool enablecache) + { + if (enablecache) + { + ResourceInfo[] infoAndEntries; + lock (this.infodic) + infoAndEntries = this.InnerFindInfoAndEntries(targeturi); + if (infoAndEntries != null) + return infoAndEntries; + } + ResourceInfo[] infoAndEntries1; + try + { + infoAndEntries1 = fs.GetInfoAndEntries(targeturi); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateInfoAndEntries_NotFound(targeturi); + throw; + } + List changedEventArgsList = new List(); + lock (this.infodic) + { + this.InnerUpdateInfoAndEntries_Success(infoAndEntries1); + if (this.watchuri == UriUtil.GetParent(infoAndEntries1[0].Id.Uri) || this.watchuri == infoAndEntries1[0].Id.Uri) + changedEventArgsList.Add(new ResourceChangedEventArgs((ReturnedInfo) infoAndEntries1[0])); + int num1 = 1; + int num2 = checked (infoAndEntries1.Length - 1); + int index = num1; + while (index <= num2) + { + if (this.watchuri == targeturi || this.watchuri == infoAndEntries1[index].Id.Uri) + changedEventArgsList.Add(new ResourceChangedEventArgs((ReturnedInfo) infoAndEntries1[index])); + checked { ++index; } + } + } + int num3 = 0; + int num4 = checked (changedEventArgsList.Count - 1); + int index1 = num3; + while (index1 <= num4) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, changedEventArgsList[index1]); + checked { ++index1; } + } + return infoAndEntries1; + } + + public ResourceInfo[] GetInfoAndEntries(FsBase fs, ResourceId id, bool enablecache) + { + if (enablecache) + { + ResourceInfo[] infoAndEntries; + lock (this.infodic) + infoAndEntries = this.InnerFindInfoAndEntries(id.Uri); + if (infoAndEntries != null) + return infoAndEntries; + } + ResourceInfo[] infoAndEntries1; + try + { + infoAndEntries1 = fs.GetInfoAndEntries(id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateInfoAndEntries_NotFound(id.Uri); + throw; + } + List changedEventArgsList = new List(); + lock (this.infodic) + { + this.InnerUpdateInfoAndEntries_Success(infoAndEntries1); + if (this.watchuri == UriUtil.GetParent(infoAndEntries1[0].Id.Uri) || this.watchuri == infoAndEntries1[0].Id.Uri) + changedEventArgsList.Add(new ResourceChangedEventArgs((ReturnedInfo) infoAndEntries1[0])); + int num1 = 1; + int num2 = checked (infoAndEntries1.Length - 1); + int index = num1; + while (index <= num2) + { + if (this.watchuri == id.Uri || this.watchuri == infoAndEntries1[index].Id.Uri) + changedEventArgsList.Add(new ResourceChangedEventArgs((ReturnedInfo) infoAndEntries1[index])); + checked { ++index; } + } + } + int num3 = 0; + int num4 = checked (changedEventArgsList.Count - 1); + int index1 = num3; + while (index1 <= num4) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, changedEventArgsList[index1]); + checked { ++index1; } + } + return infoAndEntries1; + } + + public ResourceInfo[] GetParentInfoAndEntries(FsBase fs, ResourceId childid, bool enablecache) + { + Uri parent = UriUtil.GetParent(childid.Uri); + if (enablecache) + { + ResourceInfo[] infoAndEntries; + lock (this.infodic) + infoAndEntries = this.InnerFindInfoAndEntries(parent); + if (infoAndEntries != null) + return infoAndEntries; + } + ResourceInfo[] parentInfoAndEntries; + try + { + parentInfoAndEntries = fs.GetParentInfoAndEntries(childid); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateInfoAndEntries_NotFound(parent); + throw; + } + List changedEventArgsList = new List(); + lock (this.infodic) + { + this.InnerUpdateInfoAndEntries_Success(parentInfoAndEntries); + if (this.watchuri == UriUtil.GetParent(parentInfoAndEntries[0].Id.Uri) || this.watchuri == parentInfoAndEntries[0].Id.Uri) + changedEventArgsList.Add(new ResourceChangedEventArgs((ReturnedInfo) parentInfoAndEntries[0])); + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index = num1; + while (index <= num2) + { + if (this.watchuri == parentInfoAndEntries[0].Id.Uri || this.watchuri == parentInfoAndEntries[index].Id.Uri) + changedEventArgsList.Add(new ResourceChangedEventArgs((ReturnedInfo) parentInfoAndEntries[index])); + checked { ++index; } + } + } + int num3 = 0; + int num4 = checked (changedEventArgsList.Count - 1); + int index1 = num3; + while (index1 <= num4) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, changedEventArgsList[index1]); + checked { ++index1; } + } + return parentInfoAndEntries; + } + + public ReturnedInfo CreateCollection(FsBase fs, ResourceId parentid, string name) + { + ReturnedInfo collection; + try + { + collection = fs.CreateCollection(parentid, name); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateNotFound(parentid.Uri); + throw; + } + ResourceInfo resourceInfo = collection as ResourceInfo; + ResourceId resourceId = resourceInfo != null ? resourceInfo.Id : collection as ResourceId; + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + if (resourceInfo != null) + { + if (this.infodic.ContainsKey(resourceInfo.Id.Uri)) + this.infodic[resourceInfo.Id.Uri] = resourceInfo; + else + this.infodic.Add(resourceInfo.Id.Uri, resourceInfo); + if (!this.entriesdic.ContainsKey(parentid.Uri)) + this.entriesdic.Add(parentid.Uri, new List()); + if (this.entriesdic[parentid.Uri].Contains(resourceInfo.Id.Uri)) + this.entriesdic[parentid.Uri].Remove(resourceInfo.Id.Uri); + this.entriesdic[parentid.Uri].Add(resourceInfo.Id.Uri); + } + else + this.entriesdic.Remove(parentid.Uri); + if (!(this.watchuri == resourceId.Uri)) + { + if (!(this.watchuri == parentid.Uri)) + goto label_20; + } + e = new ResourceChangedEventArgs(collection, ResourceChangedEventArgs.ChangeType.Create); + } +label_20: + if (e != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e); + } + return collection; + } + + public void Delete(FsBase fs, ResourceId id) + { + try + { + fs.Delete(id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateNotFound(id.Uri); + throw; + } + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + this.InnerDiscardList(UriUtil.GetParent(id.Uri)); + this.InnerDiscardInfo(id.Uri); + this.InnerDiscardList(id.Uri); + if (!(this.watchuri == id.Uri)) + { + if (!(this.watchuri == UriUtil.GetParent(id.Uri))) + goto label_11; + } + e = new ResourceChangedEventArgs((ReturnedInfo) id, ResourceChangedEventArgs.ChangeType.Delete); + } +label_11: + if (e == null) + return; + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent == null) + return; + resourceChangedEvent((object) this, e); + } + + public ReturnedInfo Move(FsBase fs, ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + ReturnedInfo re; + try + { + re = fs.Move(id, newparentid, newname, overwrite); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateNotFound(id.Uri); + throw; + } + ResourceInfo resourceInfo = re as ResourceInfo; + ResourceId resourceId = resourceInfo != null ? resourceInfo.Id : re as ResourceId; + ResourceChangedEventArgs e1 = (ResourceChangedEventArgs) null; + ResourceChangedEventArgs e2 = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + this.infodic.Remove(id.Uri); + this.entriesdic.Remove(id.Uri); + if ((object) newparentid != null) + { + Uri parent = UriUtil.GetParent(id.Uri); + if (this.entriesdic.ContainsKey(parent)) + this.entriesdic[parent].Remove(id.Uri); + } + if (resourceInfo != null) + { + if (this.infodic.ContainsKey(resourceInfo.Id.Uri)) + this.infodic[resourceInfo.Id.Uri] = resourceInfo; + else + this.infodic.Add(resourceInfo.Id.Uri, resourceInfo); + if ((object) newparentid != null && this.entriesdic.ContainsKey(newparentid.Uri)) + { + if (this.entriesdic[newparentid.Uri].Contains(resourceInfo.Id.Uri)) + this.entriesdic[newparentid.Uri].Remove(resourceInfo.Id.Uri); + this.entriesdic[newparentid.Uri].Add(resourceInfo.Id.Uri); + } + } + else if ((object) newparentid != null) + this.entriesdic.Remove(newparentid.Uri); + if (this.watchuri == id.Uri || this.watchuri == UriUtil.GetParent(id.Uri)) + e1 = new ResourceChangedEventArgs((ReturnedInfo) id, ResourceChangedEventArgs.ChangeType.Delete); + if (!(this.watchuri == resourceId.Uri)) + { + if (!(this.watchuri == UriUtil.GetParent(resourceId.Uri))) + goto label_25; + } + e2 = new ResourceChangedEventArgs(re, ResourceChangedEventArgs.ChangeType.Create); + } +label_25: + if (e1 != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e1); + } + if (e2 != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e2); + } + return re; + } + + public ReturnedInfo Copy(FsBase fs, ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + ReturnedInfo re; + try + { + re = fs.Copy(id, newparentid, newname, overwrite); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateNotFound(id.Uri); + throw; + } + ResourceInfo resourceInfo = re as ResourceInfo; + ResourceId resourceId = resourceInfo != null ? resourceInfo.Id : re as ResourceId; + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + if (resourceInfo != null) + { + if (this.infodic.ContainsKey(resourceInfo.Id.Uri)) + this.infodic[resourceInfo.Id.Uri] = resourceInfo; + else + this.infodic.Add(resourceInfo.Id.Uri, resourceInfo); + if ((object) newparentid != null && this.entriesdic.ContainsKey(newparentid.Uri)) + { + if (this.entriesdic[newparentid.Uri].Contains(resourceInfo.Id.Uri)) + this.entriesdic[newparentid.Uri].Remove(resourceInfo.Id.Uri); + this.entriesdic[newparentid.Uri].Add(resourceInfo.Id.Uri); + } + } + else if ((object) newparentid != null) + this.entriesdic.Remove(newparentid.Uri); + if (!(this.watchuri == resourceId.Uri)) + { + if (!(this.watchuri == UriUtil.GetParent(resourceId.Uri))) + goto label_20; + } + e = new ResourceChangedEventArgs(re, ResourceChangedEventArgs.ChangeType.Create); + } +label_20: + if (e != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e); + } + return re; + } + + public ReturnedInfo SetResourceInfo(FsBase fs, ResourceInfo newinfo, ResourceInfo originalinfo) + { + ReturnedInfo returnedInfo; + try + { + returnedInfo = fs.SetResourceInfo(newinfo, originalinfo); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateNotFound(originalinfo.Id.Uri); + throw; + } + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId resourceId = resourceInfo != null ? resourceInfo.Id : returnedInfo as ResourceId; + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + if (resourceInfo != null) + { + if (this.infodic.ContainsKey(resourceInfo.Id.Uri)) + this.infodic[resourceInfo.Id.Uri] = resourceInfo; + else + this.infodic.Add(resourceInfo.Id.Uri, resourceInfo); + } + else + this.infodic.Remove(resourceId.Uri); + if (!(this.watchuri == originalinfo.Id.Uri)) + { + if (!(this.watchuri == UriUtil.GetParent(originalinfo.Id.Uri))) + goto label_15; + } + e = new ResourceChangedEventArgs((ReturnedInfo) originalinfo.Id, ResourceChangedEventArgs.ChangeType.PropertyChange); + } +label_15: + if (e != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e); + } + return returnedInfo; + } + + public ReturnedInfo SetTimes(FsBase fs, ResourceId id, DateTime lastmodifiedtime, DateTime creationtime, DateTime lastaccesstime) + { + ReturnedInfo re; + try + { + re = fs.SetTimes(id, lastmodifiedtime, creationtime, lastaccesstime); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + lock (this.infodic) + this.InnerUpdateNotFound(id.Uri); + throw; + } + ResourceInfo resourceInfo = re as ResourceInfo; + ResourceId resourceId = resourceInfo != null ? resourceInfo.Id : re as ResourceId; + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + if (resourceInfo != null) + { + if (this.infodic.ContainsKey(resourceInfo.Id.Uri)) + this.infodic[resourceInfo.Id.Uri] = resourceInfo; + else + this.infodic.Add(resourceInfo.Id.Uri, resourceInfo); + } + else + this.infodic.Remove(resourceId.Uri); + if (!(this.watchuri == id.Uri)) + { + if (!(this.watchuri == UriUtil.GetParent(id.Uri))) + goto label_15; + } + e = new ResourceChangedEventArgs(re, ResourceChangedEventArgs.ChangeType.PropertyUpdate); + } +label_15: + if (e != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e); + } + return re; + } + + public Stream OpenRead(FsBase fs, Uri targeturi) + { + return fs.OpenRead(targeturi); + } + + public Stream OpenRead(FsBase fs, ResourceId id, ref long start, ref long length) + { + return fs.OpenRead(id, ref start, ref length); + } + + public Stream OpenWrite(FsBase fs, ResourceId parentid, string name, long length) + { + return fs.OpenWrite(parentid, name, length); + } + + public Stream OpenWriteOver(FsBase fs, ResourceId id, long length) + { + return fs.OpenWriteOver(id, length); + } + + public Stream OpenWriteResume(FsBase fs, ResourceId id, ref long start, ref long length) + { + return fs.OpenWriteResume(id, ref start, ref length); + } + + public ReturnedInfo CloseWrite(FsBase fs, Stream st) + { + ReturnedInfo re = fs.CloseWrite(st); + ResourceInfo resourceInfo = re as ResourceInfo; + ResourceId resourceId = resourceInfo != null ? resourceInfo.Id : re as ResourceId; + ResourceChangedEventArgs e = (ResourceChangedEventArgs) null; + lock (this.infodic) + { + Uri parent = UriUtil.GetParent(resourceId.Uri); + if (resourceInfo != null) + { + if (this.infodic.ContainsKey(resourceInfo.Id.Uri)) + this.infodic[resourceInfo.Id.Uri] = resourceInfo; + else + this.infodic.Add(resourceInfo.Id.Uri, resourceInfo); + if (!this.entriesdic.ContainsKey(parent)) + this.entriesdic.Add(parent, new List()); + if (this.entriesdic[parent].Contains(resourceInfo.Id.Uri)) + this.entriesdic[parent].Remove(resourceInfo.Id.Uri); + this.entriesdic[parent].Add(resourceInfo.Id.Uri); + } + else + this.entriesdic.Remove(parent); + if (!(this.watchuri == resourceId.Uri)) + { + if (!(this.watchuri == UriUtil.GetParent(resourceId.Uri))) + goto label_15; + } + e = new ResourceChangedEventArgs(re, ResourceChangedEventArgs.ChangeType.Create); + } +label_15: + if (e != null) + { + CacheManager.ResourceChangedEventHandler resourceChangedEvent = this.ResourceChangedEvent; + if (resourceChangedEvent != null) + resourceChangedEvent((object) this, e); + } + return re; + } + + private void InnerUpdateNotFound(Uri target) + { + Uri parent = UriUtil.GetParent(target); + this.infodic.Remove(target); + if (!this.entriesdic.ContainsKey(parent) || !this.entriesdic[parent].Contains(target)) + return; + this.entriesdic.Remove(parent); + } + + private ResourceInfo[] InnerFindInfoAndEntries(Uri target) + { + if (!this.infodic.ContainsKey(target) || !this.entriesdic.ContainsKey(target)) + return (ResourceInfo[]) null; + List resourceInfoList = new List(); + resourceInfoList.Add(this.infodic[target]); + int num1 = 0; + int num2 = checked (this.entriesdic[target].Count - 1); + int index = num1; + while (index <= num2) + { + if (!this.infodic.ContainsKey(this.entriesdic[target][index])) + return (ResourceInfo[]) null; + resourceInfoList.Add(this.infodic[this.entriesdic[target][index]]); + checked { ++index; } + } + return resourceInfoList.ToArray(); + } + + private void InnerUpdateInfoAndEntries_Success(ResourceInfo[] ris) + { + Uri parent = UriUtil.GetParent(ris[0].Id.Uri); + if (this.infodic.ContainsKey(ris[0].Id.Uri)) + this.infodic[ris[0].Id.Uri] = ris[0]; + else + this.infodic.Add(ris[0].Id.Uri, ris[0]); + if (this.entriesdic.ContainsKey(parent) && !this.entriesdic[parent].Contains(ris[0].Id.Uri)) + this.entriesdic.Remove(parent); + if (this.entriesdic.ContainsKey(ris[0].Id.Uri)) + this.entriesdic[ris[0].Id.Uri].Clear(); + else + this.entriesdic.Add(ris[0].Id.Uri, new List()); + int num1 = 1; + int num2 = checked (ris.Length - 1); + int index = num1; + while (index <= num2) + { + this.entriesdic[ris[0].Id.Uri].Add(ris[index].Id.Uri); + if (this.infodic.ContainsKey(ris[index].Id.Uri)) + this.infodic[ris[index].Id.Uri] = ris[index]; + else + this.infodic.Add(ris[index].Id.Uri, ris[index]); + checked { ++index; } + } + } + + private void InnerUpdateInfoAndEntries_NotFound(Uri targeturi) + { + Uri parent = UriUtil.GetParent(targeturi); + if (this.infodic.ContainsKey(targeturi)) + this.infodic.Remove(targeturi); + if (this.entriesdic.ContainsKey(parent) && this.entriesdic[parent].Contains(targeturi)) + this.entriesdic.Remove(targeturi); + if (!this.entriesdic.ContainsKey(targeturi)) + return; + int num1 = 0; + int num2 = checked (this.entriesdic[targeturi].Count - 1); + int index = num1; + while (index <= num2) + { + this.infodic.Remove(this.entriesdic[targeturi][index]); + checked { ++index; } + } + this.entriesdic.Remove(targeturi); + } + + private void InnerDiscardInfo(Uri targeturi) + { + this.infodic.Remove(targeturi); + } + + private void InnerDiscardList(Uri targeturi) + { + this.entriesdic.Remove(targeturi); + } + + public delegate void ResourceChangedEventHandler(object sender, ResourceChangedEventArgs e); + } +} diff --git a/CarotDAV/CarotDAV.csproj b/CarotDAV/CarotDAV.csproj new file mode 100644 index 0000000..1f70da5 --- /dev/null +++ b/CarotDAV/CarotDAV.csproj @@ -0,0 +1,126 @@ + + + + + Debug + AnyCPU + {1B177F3B-4B5D-4434-9BFE-EB1C7E07EDEC} + WinExe + CarotDAV + v3.5 + 1.13.2.18337 + 512 + CarotDAV + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + lib\Rei.Fs.dll + + + lib\Rei.Com.dll + + + lib\Rei.Net.HttpServer.dll + + + + + lib\Rei.Fs.Webdav.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CarotDAV/CarotDAVDataObject.cs b/CarotDAV/CarotDAVDataObject.cs new file mode 100644 index 0000000..fd0e7db --- /dev/null +++ b/CarotDAV/CarotDAVDataObject.cs @@ -0,0 +1,902 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.CarotDAVDataObject +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Com; +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class CarotDAVDataObject : Rei.Com.DataObject + { + private ConnectionSettingBase pCs; + private FsBase pFs; + private CarotDAVDataObject.CarotDAVDataObjectType pType; + internal DragDropEffects pReturn; + private List pFileList; + private List pUriList; + private bool pDirty; + private ResourceInfo[] pResources; + private CacheManager pCache; + private bool threadcomp; + private bool pCanCopyInternally; + private bool pCanMoveInternally; + internal int files; + internal long sizes; + internal int folders; + internal int restfolders; + internal ResourceId targetid; + internal object syncobject; + internal Exception ex; + private CarotDAVDataObject.CarotDAVDataObjectState pState; + public ErrorPromptManager pErrorManager; + private EventHandler pExceptionHandler; + public bool IsInUsebymyself; + private bool pDisposed; + + public event CarotDAVDataObject.LogMessageEventHandler LogMessage; + + public event CarotDAVDataObject.ReleaseEventHandler Release; + + public ResourceInfo[] Resources + { + get + { + return this.pResources; + } + } + + public CarotDAVDataObject.CarotDAVDataObjectType Type + { + get + { + return this.pType; + } + } + + public bool CanCopyInternally + { + get + { + return this.pCanCopyInternally; + } + } + + public bool CanMoveInternally + { + get + { + return this.pCanMoveInternally; + } + } + + public CarotDAVDataObject.CarotDAVDataObjectState State + { + get + { + return this.pState; + } + set + { + if (this.pState == value) + return; + if (this.pState == CarotDAVDataObject.CarotDAVDataObjectState.Cancelled) + throw new InvalidOperationException(); + switch (value) + { + case CarotDAVDataObject.CarotDAVDataObjectState.WaitTransfer: + this.pState = CarotDAVDataObject.CarotDAVDataObjectState.WaitTransfer; + break; + case CarotDAVDataObject.CarotDAVDataObjectState.Finished: + case CarotDAVDataObject.CarotDAVDataObjectState.Cancelled: + lock (this.pFileList) + { + this.pFileList.Clear(); + this.pUriList.Clear(); + this.RemoveAll(); + this.pDirty = false; + this.pState = value; + break; + } + default: + throw new InvalidOperationException(); + } + } + } + + public CarotDAVDataObject(ConnectionSettingBase cs, ResourceInfo[] resources, CarotDAVDataObject.CarotDAVDataObjectType type, CacheManager cache) + { + this.AsyncOperationStart += new EventHandler(this.CarotDAVDataObject_AsyncOperationStart); + this.AsyncOperationFinished += new EventHandler(this.CarotDAVDataObject_AsyncOperationFinished); + this.DataQueried += new EventHandler(this.CarotDAVDataObject_DataQueried); + this.DataRequested += new EventHandler(this.CarotDAVDataObject_DataRequested); + this.Release += new CarotDAVDataObject.ReleaseEventHandler(this.CarotDAVDataObject_Release); + this.pFileList = new List(); + this.pUriList = new List(); + this.syncobject = RuntimeHelpers.GetObjectValue(new object()); + this.pErrorManager = new ErrorPromptManager(); + this.pExceptionHandler = new EventHandler(this.OnExceptionOccurred); + this.pDisposed = false; + this.AsyncSupported = true; + this.IsInUsebymyself = false; + this.pCs = cs; + this.pDirty = true; + this.pFs = cs.GetClient(); + this.pFs.GroupName = "OLE" + DateTime.Now.ToString(); + this.pResources = resources; + this.pState = CarotDAVDataObject.CarotDAVDataObjectState.WaitListing; + this.pType = type; + this.pCache = cache; + switch (type) + { + case CarotDAVDataObject.CarotDAVDataObjectType.Cut: + this.SetPreferredDropEffect(DragDropEffects.Move); + break; + case CarotDAVDataObject.CarotDAVDataObjectType.Copy: + this.SetPreferredDropEffect(DragDropEffects.Copy); + break; + case CarotDAVDataObject.CarotDAVDataObjectType.DragDrop: + this.SetPreferredDropEffect(DragDropEffects.Copy); + break; + } + if (this.pResources.Length == 1) + this.SetUri(this.pResources[0].Id.Uri); + string[] strs = new string[checked (this.pResources.Length - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.pResources.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + strs[index1] = this.pResources[index1].Id.Uri.ToString(); + checked { ++index1; } + } + this.SetTexts(strs); + CarotDAVDataObject.InterAppDataStore interAppDataStore = new CarotDAVDataObject.InterAppDataStore(); + int num3 = 0; + int num4 = checked (resources.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + interAppDataStore.Files.Add(resources[index2].Id); + checked { ++index2; } + } + interAppDataStore.Type = this.pType; + interAppDataStore.ConnectionSetting = this.pCs; + interAppDataStore.ID = (long) Process.GetCurrentProcess().Id; + this.SetManagedObject((object) interAppDataStore); + this.pCanCopyInternally = true; + this.pCanMoveInternally = true; + int num5 = 0; + int num6 = checked (this.pResources.Length - 1); + int index3 = num5; + while (index3 <= num6) + { + if (!this.pResources[index3].CanCopy) + this.pCanCopyInternally = false; + if (!this.pResources[index3].CanMove) + this.pCanMoveInternally = false; + checked { ++index3; } + } + this.pFs.LogMessage += new EventHandler(this.pFS_LogMessage); + } + + protected override void Dispose(bool disposing) + { + try + { + if (!this.pDisposed) + return; + int num = disposing ? 1 : 0; + } + finally + { + base.Dispose(disposing); + } + } + + public override FORMATETC[] SupportedFormats() + { + List formatetcList = new List(); + formatetcList.AddRange((IEnumerable) base.SupportedFormats()); + FORMATETC formatetc; + formatetc.dwAspect = DVASPECT.DVASPECT_CONTENT; + formatetc.lindex = -1; + formatetc.tymed = TYMED.TYMED_HGLOBAL; + formatetc.cfFormat = Rei.Com.DataObject.MakecfFormat(ShellClipboardFormats.FileGroupDescriptorW); + formatetcList.Add(formatetc); + formatetc.cfFormat = Rei.Com.DataObject.MakecfFormat(ShellClipboardFormats.FileContents); + formatetc.tymed = TYMED.TYMED_ISTREAM; + formatetcList.Add(formatetc); + formatetc.cfFormat = Rei.Com.DataObject.MakecfFormat(ShellClipboardFormats.ShellIDListArray); + formatetc.tymed = TYMED.TYMED_HGLOBAL; + formatetcList.Add(formatetc); + formatetc.cfFormat = Rei.Com.DataObject.MakecfFormat(ShellClipboardFormats.PasteSucceeded); + formatetc.tymed = TYMED.TYMED_HGLOBAL; + formatetcList.Add(formatetc); + return formatetcList.ToArray(); + } + + public void Add(ResourceInfo ri, string name) + { + if (this.pCs.DownloadFilenameNormalization != UCSNormalization.None) + name = name.Normalize((NormalizationForm) this.pCs.DownloadFilenameNormalization); + VirtualFileInfo virtualFileInfo = new VirtualFileInfo(); + virtualFileInfo.FileName = name; + if (ri.IsCollection) + { + virtualFileInfo.FileAttributes = FileAttributes.Directory; + virtualFileInfo.Flags = virtualFileInfo.Flags | FDFlags.FD_ATTRIBUTES; + } + else + { + virtualFileInfo.FileAttributes = FileAttributes.Normal; + virtualFileInfo.Flags = virtualFileInfo.Flags | FDFlags.FD_ATTRIBUTES; + } + if (DateTime.Compare(ri.CreationTime, DateTime.MinValue) != 0) + { + virtualFileInfo.CreationTime = ri.CreationTime; + virtualFileInfo.Flags = virtualFileInfo.Flags | FDFlags.FD_CREATETIME; + } + if (DateTime.Compare(ri.LastAccessTime, DateTime.MinValue) != 0) + { + virtualFileInfo.LastAccessTime = ri.LastAccessTime; + virtualFileInfo.Flags = virtualFileInfo.Flags | FDFlags.FD_ACCESSTIME; + } + if (DateTime.Compare(ri.LastModifiedTime, DateTime.MinValue) != 0) + { + virtualFileInfo.LastWriteTime = ri.LastModifiedTime; + virtualFileInfo.Flags = virtualFileInfo.Flags | FDFlags.FD_WRITESTIME; + } + if (ri.IsCollection) + { + virtualFileInfo.FileSize = 0UL; + virtualFileInfo.Flags = virtualFileInfo.Flags | FDFlags.FD_FILESIZE; + } + else if (ri.Size >= 0L) + { + virtualFileInfo.FileSize = checked ((ulong) ri.Size); + virtualFileInfo.Flags = virtualFileInfo.Flags | FDFlags.FD_FILESIZE; + } + if (!ri.IsCollection) + { + OleStreamCreator oleStreamCreator = new OleStreamCreator(ri, name, this.pFs, this.pErrorManager); + oleStreamCreator.ExceptionOccurred += this.pExceptionHandler; + virtualFileInfo.IStreamCreator = (IStreamCreator) oleStreamCreator; + } + lock (this.pFileList) + { + this.pFileList.Add(virtualFileInfo); + this.pUriList.Add(ri.Id.Uri); + this.pDirty = true; + } + } + + public void Update() + { + lock (this.pFileList) + { + if (!this.pDirty) + return; + string[] strs = new string[checked (this.pUriList.Count - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.pUriList.Count - 1); + int index = num1; + while (index <= num2) + { + strs[index] = this.pUriList[index].ToString(); + checked { ++index; } + } + this.SetVirtualFiles(this.pFileList.ToArray(), true); + this.SetTexts(strs); + this.pDirty = false; + } + } + + public void SetDragDropResult(DragDropEffects r) + { + this.pReturn = r; + if (this.IsInOperation) + return; + this.OnTransferFinish(); + } + + protected override void OnDataRequested(Rei.Com.DataObject.DataEventArgs e) + { + if (((int) e.Format.cfFormat == (int) Rei.Com.DataObject.MakecfFormat(ShellClipboardFormats.FileGroupDescriptorW) || (int) e.Format.cfFormat == (int) Rei.Com.DataObject.MakecfFormat(ShellClipboardFormats.FileGroupDescriptor) || ((int) e.Format.cfFormat == (int) Rei.Com.DataObject.MakecfFormat(DataFormats.UnicodeText) || (int) e.Format.cfFormat == (int) Rei.Com.DataObject.MakecfFormat(DataFormats.Text))) && this.State == CarotDAVDataObject.CarotDAVDataObjectState.WaitListing) + { + this.threadcomp = false; + Thread thread = new Thread(new ParameterizedThreadStart(this.ThreadStartPoint)); + thread.Start((object) this); + DateTime now = DateTime.Now; + DialogResult dialogResult = DialogResult.OK; + while (!thread.Join(100)) + { + if (DateTime.Now.Subtract(now).TotalSeconds > 1.0) + { + using (ResouceListingForm resouceListingForm = new ResouceListingForm()) + { + resouceListingForm.Thread = thread; + resouceListingForm.pDataObject = this; + dialogResult = resouceListingForm.ShowDialog(); + thread.Abort(); + break; + } + } + } + thread.Join(); + if (this.ex != null) + throw this.ex; + if (dialogResult != DialogResult.OK || !this.threadcomp) + { + this.State = CarotDAVDataObject.CarotDAVDataObjectState.Cancelled; + this.pFs.ResetConnection(); + } + else + this.State = CarotDAVDataObject.CarotDAVDataObjectState.WaitTransfer; + } + base.OnDataRequested(e); + } + + private void ThreadStartPoint(object param) + { + try + { + ErrorPromptManager pDragErrorManager = new ErrorPromptManager(); + LinkedList> linkedList1 = new LinkedList>(); + Dictionary dictionary1 = new Dictionary(); + this.targetid = this.Resources[0].Id; + ResourceInfo[] resources = this.Resources; + List stringList = new List(); + Dictionary> dictionary2 = new Dictionary>(); + int num1 = 0; + int num2 = checked (resources.Length - 1); + int index1 = num1; + KeyValuePair keyValuePair1; + while (index1 <= num2) + { + if (resources[index1].Id.Uri.Segments.Length <= 1) + { + LinkedList> linkedList2 = linkedList1; + keyValuePair1 = new KeyValuePair(resources[index1], "root"); + KeyValuePair keyValuePair2 = keyValuePair1; + linkedList2.AddFirst(keyValuePair2); + Interlocked.Increment(ref this.folders); + Interlocked.Increment(ref this.restfolders); + } + else + { + string absolutePath = UriUtil.GetParent(resources[index1].Id.Uri).AbsolutePath; + if (!dictionary2.ContainsKey(absolutePath)) + { + stringList.Add(absolutePath); + dictionary2.Add(absolutePath, new List()); + } + dictionary2[absolutePath].Add(index1); + } + checked { ++index1; } + } + int num3 = 0; + int num4 = checked (stringList.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + string index3 = stringList[index2]; + if (dictionary2[index3].Count < 3) + { + int num5 = 0; + int num6 = checked (dictionary2[index3].Count - 1); + int index4 = num5; + while (index4 <= num6) + { + ResourceInfo[] info = this.InnerGetInfo(resources[dictionary2[index3][index4]].Id, pDragErrorManager); + if (info == null) + return; + ResourceInfo key = info[0]; + string lastName = UriUtil.GetLastName(key.Id.Uri); + if (!key.IsCollection) + { + dictionary1.Add(key, lastName); + Interlocked.Increment(ref this.files); + Interlocked.Add(ref this.sizes, key.Size); + } + else + { + LinkedList> linkedList2 = linkedList1; + keyValuePair1 = new KeyValuePair(key, lastName); + KeyValuePair keyValuePair2 = keyValuePair1; + linkedList2.AddFirst(keyValuePair2); + Interlocked.Increment(ref this.folders); + Interlocked.Increment(ref this.restfolders); + } + checked { ++index4; } + } + } + else + { + ResourceInfo[] parentInfoAndEntries = this.InnerGetParentInfoAndEntries(resources[dictionary2[index3][0]].Id, pDragErrorManager); + if (parentInfoAndEntries == null) + return; + int num5 = 0; + int num6 = checked (dictionary2[index3].Count - 1); + int index4 = num5; + while (index4 <= num6) + { + int num7 = 1; + int num8 = checked (parentInfoAndEntries.Length - 1); + int index5 = num7; + while (index5 <= num8) + { + if (parentInfoAndEntries[index5].Id.Uri == resources[dictionary2[index3][index4]].Id.Uri) + { + ResourceInfo key = parentInfoAndEntries[index5]; + string lastName = UriUtil.GetLastName(key.Id.Uri); + if (!key.IsCollection) + { + dictionary1.Add(key, lastName); + Interlocked.Increment(ref this.files); + Interlocked.Add(ref this.sizes, key.Size); + } + else + { + LinkedList> linkedList2 = linkedList1; + keyValuePair1 = new KeyValuePair(key, lastName); + KeyValuePair keyValuePair2 = keyValuePair1; + linkedList2.AddFirst(keyValuePair2); + Interlocked.Increment(ref this.folders); + Interlocked.Increment(ref this.restfolders); + } + } + checked { ++index5; } + } + checked { ++index4; } + } + } + checked { ++index2; } + } + while (linkedList1.First != null) + { + KeyValuePair keyValuePair2 = linkedList1.First.Value; + linkedList1.RemoveFirst(); + ResourceInfo[] entries = this.InnerGetEntries(keyValuePair2.Key.Id, pDragErrorManager); + dictionary1.Add(keyValuePair2.Key, keyValuePair2.Value); + int num5 = 0; + int num6 = checked (entries.Length - 1); + int index3 = num5; + while (index3 <= num6) + { + string str = Path.Combine(keyValuePair2.Value, UriUtil.GetLastName(entries[index3].Id.Uri)); + if (!entries[index3].IsCollection) + { + dictionary1.Add(entries[index3], str); + Interlocked.Increment(ref this.files); + Interlocked.Add(ref this.sizes, entries[index3].Size); + } + else + { + LinkedList> linkedList2 = linkedList1; + keyValuePair1 = new KeyValuePair(entries[index3], str); + KeyValuePair keyValuePair3 = keyValuePair1; + linkedList2.AddFirst(keyValuePair3); + Interlocked.Increment(ref this.folders); + Interlocked.Increment(ref this.restfolders); + } + checked { ++index3; } + } + Interlocked.Decrement(ref this.restfolders); + } + Dictionary.Enumerator enumerator; + try + { + enumerator = dictionary1.GetEnumerator(); + while (enumerator.MoveNext()) + { + KeyValuePair current = enumerator.Current; + this.Add(current.Key, current.Value); + } + } + finally + { + enumerator.Dispose(); + } + this.Update(); + this.threadcomp = true; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.ex = ex; + ProjectData.ClearProjectError(); + } + finally + { + } + } + + private ResourceInfo[] InnerGetParentInfoAndEntries(ResourceId id, ErrorPromptManager pDragErrorManager) + { + this.targetid = id; + int retryminutes = 1; + ResourceInfo[] resourceInfoArray; + while (true) + { + try + { + return this.pCache.GetParentInfoAndEntries(this.pFs, id, false); + } + catch (ThreadAbortException ex) + { + ProjectData.SetProjectError((Exception) ex); + throw; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + if (ex2.InnerException is ThreadAbortException) + { + throw; + } + else + { + ErrorAction errorAction; + if (pDragErrorManager.IgnoreAll()) + { + errorAction = ErrorAction.Ignore; + } + else + { + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during retrieving properties.", id.ToString(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + this.OnExceptionOccurred((object) this, e); + pDragErrorManager.RegisterAction(e.Result); + errorAction = e.Result.Action; + } + switch (errorAction) + { + case ErrorAction.Ignore: + resourceInfoArray = new ResourceInfo[0]; + ProjectData.ClearProjectError(); + goto label_15; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + resourceInfoArray = (ResourceInfo[]) null; + ProjectData.ClearProjectError(); + goto label_15; + default: + throw; + } + } + } + } +label_15: + return resourceInfoArray; + } + + private ResourceInfo[] InnerGetInfo(ResourceId id, ErrorPromptManager pDragErrorManager) + { + this.targetid = id; + int retryminutes = 1; + ResourceInfo info; + ResourceInfo[] resourceInfoArray; + while (true) + { + try + { + info = this.pCache.GetInfo(this.pFs, id, false); + break; + } + catch (ThreadAbortException ex) + { + ProjectData.SetProjectError((Exception) ex); + throw; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + if (ex2.InnerException is ThreadAbortException) + { + throw; + } + else + { + ErrorAction errorAction; + if (pDragErrorManager.IgnoreAll()) + { + errorAction = ErrorAction.Ignore; + } + else + { + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during retrieving properties.", id.ToString(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + this.OnExceptionOccurred((object) this, e); + pDragErrorManager.RegisterAction(e.Result); + errorAction = e.Result.Action; + } + switch (errorAction) + { + case ErrorAction.Ignore: + resourceInfoArray = new ResourceInfo[0]; + ProjectData.ClearProjectError(); + goto label_16; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + resourceInfoArray = (ResourceInfo[]) null; + ProjectData.ClearProjectError(); + goto label_16; + default: + throw; + } + } + } + } + return new ResourceInfo[1]{ info }; +label_16: + return resourceInfoArray; + } + + private ResourceInfo[] InnerGetEntries(ResourceId id, ErrorPromptManager pDragErrorManager) + { + this.targetid = id; + int retryminutes = 1; + ResourceInfo[] resourceInfoArray; + while (true) + { + try + { + return this.pCache.GetEntries(this.pFs, id, false); + } + catch (ThreadAbortException ex) + { + ProjectData.SetProjectError((Exception) ex); + throw; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + if (ex2.InnerException is ThreadAbortException) + { + throw; + } + else + { + ErrorAction errorAction; + if (pDragErrorManager.IgnoreAll()) + { + errorAction = ErrorAction.Ignore; + } + else + { + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during retrieving properties.", id.ToString(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + this.OnExceptionOccurred((object) this, e); + pDragErrorManager.RegisterAction(e.Result); + errorAction = e.Result.Action; + } + switch (errorAction) + { + case ErrorAction.Ignore: + Interlocked.Decrement(ref this.restfolders); + resourceInfoArray = new ResourceInfo[0]; + ProjectData.ClearProjectError(); + goto label_15; + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + resourceInfoArray = (ResourceInfo[]) null; + ProjectData.ClearProjectError(); + goto label_15; + default: + throw; + } + } + } + } +label_15: + return resourceInfoArray; + } + + protected override void OnDataStored(Rei.Com.DataObject.DataEventArgs e) + { + base.OnDataStored(e); + if ((int) e.Format.cfFormat != (int) Rei.Com.DataObject.MakecfFormat(ShellClipboardFormats.PasteSucceeded)) + return; + this.pReturn = this.GetPasteSucceeded(); + if (this.IsInOperation) + return; + this.OnTransferFinish(); + } + + protected virtual void PerformDeleteOnPaste() + { + if (this.GetPerformedDropEffect() != DragDropEffects.Move) + return; + int num1 = 0; + int num2 = checked (this.Resources.Length - 1); + int index = num1; + while (index <= num2) + { + int retryminutes = 1; + while (true) + { + ResourceId id = this.Resources[index].Id; + try + { + this.pCache.Delete(this.pFs, id); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + ErrorAction errorAction; + if (this.pErrorManager.IgnoreAll()) + { + errorAction = ErrorAction.Ignore; + } + else + { + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during deleting resource.", id.ToString(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + this.OnExceptionOccurred((object) this, e); + this.pErrorManager.RegisterAction(e.Result); + errorAction = e.Result.Action; + } + switch (errorAction) + { + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + ProjectData.ClearProjectError(); + return; + default: + ProjectData.ClearProjectError(); + goto label_14; + } + } + } +label_14: + checked { ++index; } + } + } + + private void OnExceptionOccurred(object sender, ExceptionOccurredEventArgs e) + { + e.Result = ErrorPromptForm.ShowDialog((IWin32Window) null, e.Message, e.Target, e.Exception, e.Type, e.RetryMinutes); + } + + private void pFS_LogMessage(object sender, LogMessageEventArgs e) + { + CarotDAVDataObject.LogMessageEventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent == null) + return; + logMessageEvent(RuntimeHelpers.GetObjectValue(sender), e); + } + + public void OnTransferFinish() + { + this.PerformDeleteOnPaste(); + this.State = CarotDAVDataObject.CarotDAVDataObjectState.Finished; + CarotDAVDataObject.ReleaseEventHandler releaseEvent = this.ReleaseEvent; + if (releaseEvent == null) + return; + releaseEvent((object) this, EventArgs.Empty); + } + + private void CarotDAVDataObject_AsyncOperationStart(object sender, EventArgs e) + { + } + + private void CarotDAVDataObject_AsyncOperationFinished(object sender, Rei.Com.DataObject.AsyncOperationFinishedEventArgs e) + { + this.OnTransferFinish(); + } + + private void CarotDAVDataObject_DataQueried(object sender, Rei.Com.DataObject.DataEventArgs e) + { + if (e.Format.ptd != IntPtr.Zero) + return; + FORMATETC format = e.Format; + if (format.dwAspect != DVASPECT.DVASPECT_CONTENT) + return; + format = e.Format; + if (format.lindex != -1) + return; + format = e.Format; + if ((int) format.cfFormat == (int) BitConverter.ToInt16(BitConverter.GetBytes(DataFormats.GetFormat("FileContents").Id), 0) && (e.Format.tymed & TYMED.TYMED_ISTREAM) != TYMED.TYMED_NULL) + { + e.QueryResult = Rei.Com.DataObject.QueryGetDataResultType.Exists; + } + else + { + if ((int) e.Format.cfFormat == (int) BitConverter.ToInt16(BitConverter.GetBytes(DataFormats.GetFormat("FileGroupDescriptorW").Id), 0)) + { + format = e.Format; + if ((format.tymed & TYMED.TYMED_HGLOBAL) != TYMED.TYMED_NULL) + { + e.QueryResult = Rei.Com.DataObject.QueryGetDataResultType.Exists; + return; + } + } + if ((int) e.Format.cfFormat != (int) BitConverter.ToInt16(BitConverter.GetBytes(DataFormats.GetFormat("FileGroupDescriptor").Id), 0)) + return; + format = e.Format; + if ((format.tymed & TYMED.TYMED_HGLOBAL) == TYMED.TYMED_NULL) + return; + e.QueryResult = Rei.Com.DataObject.QueryGetDataResultType.Exists; + } + } + + private void CarotDAVDataObject_DataRequested(object sender, Rei.Com.DataObject.DataEventArgs e) + { + } + + private void CarotDAVDataObject_Release(object sender, EventArgs e) + { + } + + public enum CarotDAVDataObjectState + { + WaitListing, + WaitTransfer, + Finished, + Cancelled, + } + + public enum CarotDAVDataObjectType + { + Cut, + Copy, + DragDrop, + } + + public delegate void LogMessageEventHandler(object sender, LogMessageEventArgs e); + + public delegate void ReleaseEventHandler(object sender, EventArgs e); + + [Serializable] + public class InterAppDataStore + { + public List Files; + public CarotDAVDataObject.CarotDAVDataObjectType Type; + public ConnectionSettingBase ConnectionSetting; + public long ID; + + public InterAppDataStore() + { + this.Files = new List(); + } + } + } +} diff --git a/CarotDAV/ConflictAction.cs b/CarotDAV/ConflictAction.cs new file mode 100644 index 0000000..40317f2 --- /dev/null +++ b/CarotDAV/ConflictAction.cs @@ -0,0 +1,23 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ConflictAction +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public enum ConflictAction + { + NoConfliction, + Overwrite, + OverwriteNewer, + Resume, + Integrate, + DeleteTarget, + Retry, + AutoRetry, + ChangeName, + Skip, + CancelAll, + } +} diff --git a/CarotDAV/ConflictPromptForm.cs b/CarotDAV/ConflictPromptForm.cs new file mode 100644 index 0000000..9c47578 --- /dev/null +++ b/CarotDAV/ConflictPromptForm.cs @@ -0,0 +1,851 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ConflictPromptForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class ConflictPromptForm : Form + { + private IContainer components; + [AccessedThroughProperty("OverwriteRadio")] + private RadioButton _OverwriteRadio; + [AccessedThroughProperty("OverwriteNewerRadio")] + private RadioButton _OverwriteNewerRadio; + [AccessedThroughProperty("SkipRadio")] + private RadioButton _SkipRadio; + [AccessedThroughProperty("SourceTextBox")] + private TextBox _SourceTextBox; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("IntegrateRadio")] + private RadioButton _IntegrateRadio; + [AccessedThroughProperty("DeleteRadio")] + private RadioButton _DeleteRadio; + [AccessedThroughProperty("ToAllCheck")] + private CheckBox _ToAllCheck; + [AccessedThroughProperty("RetryButton")] + private Button _RetryButton; + [AccessedThroughProperty("DestinationTextBox")] + private TextBox _DestinationTextBox; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("MessageTextBox")] + private TextBox _MessageTextBox; + [AccessedThroughProperty("ChangeNameRadio")] + private RadioButton _ChangeNameRadio; + [AccessedThroughProperty("ResumeRadio")] + private RadioButton _ResumeRadio; + [AccessedThroughProperty("DestInfoTextBox")] + private TextBox _DestInfoTextBox; + [AccessedThroughProperty("SourceInfoTextBox")] + private TextBox _SourceInfoTextBox; + [AccessedThroughProperty("Timer1")] + private Timer _Timer1; + private ConflictType pConflict; + private ConflictAction pSolution; + private bool pEnableResume; + private FsAbility pDestinationAbility; + private int pRetryMinutes; + private DateTime pIdleStartTime; + + public ConflictPromptForm() + { + this.Load += new EventHandler(this.ConflictPromptForm_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + this.OverwriteRadio = new RadioButton(); + this.OverwriteNewerRadio = new RadioButton(); + this.SkipRadio = new RadioButton(); + this.SourceTextBox = new TextBox(); + this.m_CancelButton = new Button(); + this.OKButton = new Button(); + this.IntegrateRadio = new RadioButton(); + this.DeleteRadio = new RadioButton(); + this.ToAllCheck = new CheckBox(); + this.RetryButton = new Button(); + this.DestinationTextBox = new TextBox(); + this.Label1 = new Label(); + this.Label2 = new Label(); + this.MessageTextBox = new TextBox(); + this.ChangeNameRadio = new RadioButton(); + this.ResumeRadio = new RadioButton(); + this.DestInfoTextBox = new TextBox(); + this.SourceInfoTextBox = new TextBox(); + this.Timer1 = new Timer(this.components); + this.SuspendLayout(); + this.OverwriteRadio.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.OverwriteRadio.AutoSize = true; + RadioButton overwriteRadio1 = this.OverwriteRadio; + Point point1 = new Point(8, 216); + Point point2 = point1; + overwriteRadio1.Location = point2; + this.OverwriteRadio.Name = "OverwriteRadio"; + RadioButton overwriteRadio2 = this.OverwriteRadio; + Size size1 = new Size(92, 16); + Size size2 = size1; + overwriteRadio2.Size = size2; + this.OverwriteRadio.TabIndex = 7; + this.OverwriteRadio.TabStop = true; + this.OverwriteRadio.Text = "Overwrite (&O)"; + this.OverwriteRadio.UseVisualStyleBackColor = true; + this.OverwriteNewerRadio.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.OverwriteNewerRadio.AutoSize = true; + RadioButton overwriteNewerRadio1 = this.OverwriteNewerRadio; + point1 = new Point(8, 240); + Point point3 = point1; + overwriteNewerRadio1.Location = point3; + this.OverwriteNewerRadio.Name = "OverwriteNewerRadio"; + RadioButton overwriteNewerRadio2 = this.OverwriteNewerRadio; + size1 = new Size(137, 16); + Size size3 = size1; + overwriteNewerRadio2.Size = size3; + this.OverwriteNewerRadio.TabIndex = 8; + this.OverwriteNewerRadio.TabStop = true; + this.OverwriteNewerRadio.Text = "Overwrite if newer (&N)"; + this.OverwriteNewerRadio.UseVisualStyleBackColor = true; + this.SkipRadio.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.SkipRadio.AutoSize = true; + RadioButton skipRadio1 = this.SkipRadio; + point1 = new Point(168, 240); + Point point4 = point1; + skipRadio1.Location = point4; + this.SkipRadio.Name = "SkipRadio"; + RadioButton skipRadio2 = this.SkipRadio; + size1 = new Size(64, 16); + Size size4 = size1; + skipRadio2.Size = size4; + this.SkipRadio.TabIndex = 12; + this.SkipRadio.TabStop = true; + this.SkipRadio.Text = "Skip (&S)"; + this.SkipRadio.UseVisualStyleBackColor = true; + this.SourceTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox sourceTextBox1 = this.SourceTextBox; + point1 = new Point(8, 48); + Point point5 = point1; + sourceTextBox1.Location = point5; + this.SourceTextBox.Multiline = true; + this.SourceTextBox.Name = "SourceTextBox"; + this.SourceTextBox.ReadOnly = true; + TextBox sourceTextBox2 = this.SourceTextBox; + size1 = new Size(312, 40); + Size size5 = size1; + sourceTextBox2.Size = size5; + this.SourceTextBox.TabIndex = 2; + this.SourceTextBox.TabStop = false; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(248, 352); + Point point6 = point1; + mCancelButton1.Location = point6; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size6 = size1; + mCancelButton2.Size = size6; + this.m_CancelButton.TabIndex = 17; + this.m_CancelButton.Text = "Cancel All"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + point1 = new Point(168, 352); + Point point7 = point1; + okButton1.Location = point7; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + size1 = new Size(72, 24); + Size size7 = size1; + okButton2.Size = size7; + this.OKButton.TabIndex = 16; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.IntegrateRadio.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.IntegrateRadio.AutoSize = true; + RadioButton integrateRadio1 = this.IntegrateRadio; + point1 = new Point(168, 216); + Point point8 = point1; + integrateRadio1.Location = point8; + this.IntegrateRadio.Name = "IntegrateRadio"; + RadioButton integrateRadio2 = this.IntegrateRadio; + size1 = new Size(83, 16); + Size size8 = size1; + integrateRadio2.Size = size8; + this.IntegrateRadio.TabIndex = 11; + this.IntegrateRadio.TabStop = true; + this.IntegrateRadio.Text = "Integrate (&I)"; + this.IntegrateRadio.UseVisualStyleBackColor = true; + this.DeleteRadio.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.DeleteRadio.AutoSize = true; + RadioButton deleteRadio1 = this.DeleteRadio; + point1 = new Point(8, 288); + Point point9 = point1; + deleteRadio1.Location = point9; + this.DeleteRadio.Name = "DeleteRadio"; + RadioButton deleteRadio2 = this.DeleteRadio; + size1 = new Size((int) sbyte.MaxValue, 16); + Size size9 = size1; + deleteRadio2.Size = size9; + this.DeleteRadio.TabIndex = 10; + this.DeleteRadio.TabStop = true; + this.DeleteRadio.Text = "Delete and write (&D)"; + this.DeleteRadio.UseVisualStyleBackColor = true; + this.ToAllCheck.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.ToAllCheck.AutoSize = true; + CheckBox toAllCheck1 = this.ToAllCheck; + point1 = new Point(8, 320); + Point point10 = point1; + toAllCheck1.Location = point10; + this.ToAllCheck.Name = "ToAllCheck"; + CheckBox toAllCheck2 = this.ToAllCheck; + size1 = new Size(73, 16); + Size size10 = size1; + toAllCheck2.Size = size10; + this.ToAllCheck.TabIndex = 14; + this.ToAllCheck.Text = "To all (&A)"; + this.ToAllCheck.UseVisualStyleBackColor = true; + this.RetryButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button retryButton1 = this.RetryButton; + point1 = new Point(64, 352); + Point point11 = point1; + retryButton1.Location = point11; + this.RetryButton.Name = "RetryButton"; + Button retryButton2 = this.RetryButton; + size1 = new Size(96, 24); + Size size11 = size1; + retryButton2.Size = size11; + this.RetryButton.TabIndex = 15; + this.RetryButton.Text = "Retry"; + this.RetryButton.UseVisualStyleBackColor = true; + this.DestinationTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox destinationTextBox1 = this.DestinationTextBox; + point1 = new Point(8, 136); + Point point12 = point1; + destinationTextBox1.Location = point12; + this.DestinationTextBox.Multiline = true; + this.DestinationTextBox.Name = "DestinationTextBox"; + this.DestinationTextBox.ReadOnly = true; + TextBox destinationTextBox2 = this.DestinationTextBox; + size1 = new Size(312, 40); + Size size12 = size1; + destinationTextBox2.Size = size12; + this.DestinationTextBox.TabIndex = 5; + this.DestinationTextBox.TabStop = false; + this.Label1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 32); + Point point13 = point1; + label1_1.Location = point13; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(40, 12); + Size size13 = size1; + label1_2.Size = size13; + this.Label1.TabIndex = 1; + this.Label1.Text = "Source"; + this.Label2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(8, 120); + Point point14 = point1; + label2_1.Location = point14; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(63, 12); + Size size14 = size1; + label2_2.Size = size14; + this.Label2.TabIndex = 4; + this.Label2.Text = "Destination"; + this.MessageTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + this.MessageTextBox.BorderStyle = BorderStyle.None; + TextBox messageTextBox1 = this.MessageTextBox; + point1 = new Point(8, 8); + Point point15 = point1; + messageTextBox1.Location = point15; + this.MessageTextBox.Name = "MessageTextBox"; + this.MessageTextBox.ReadOnly = true; + TextBox messageTextBox2 = this.MessageTextBox; + size1 = new Size(312, 12); + Size size15 = size1; + messageTextBox2.Size = size15; + this.MessageTextBox.TabIndex = 0; + this.MessageTextBox.TabStop = false; + this.MessageTextBox.Text = "Message"; + this.ChangeNameRadio.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.ChangeNameRadio.AutoSize = true; + RadioButton changeNameRadio1 = this.ChangeNameRadio; + point1 = new Point(168, 264); + Point point16 = point1; + changeNameRadio1.Location = point16; + this.ChangeNameRadio.Name = "ChangeNameRadio"; + RadioButton changeNameRadio2 = this.ChangeNameRadio; + size1 = new Size(114, 16); + Size size16 = size1; + changeNameRadio2.Size = size16; + this.ChangeNameRadio.TabIndex = 13; + this.ChangeNameRadio.TabStop = true; + this.ChangeNameRadio.Text = "Change Name (&C)"; + this.ChangeNameRadio.UseVisualStyleBackColor = true; + this.ResumeRadio.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.ResumeRadio.AutoSize = true; + RadioButton resumeRadio1 = this.ResumeRadio; + point1 = new Point(8, 264); + Point point17 = point1; + resumeRadio1.Location = point17; + this.ResumeRadio.Name = "ResumeRadio"; + RadioButton resumeRadio2 = this.ResumeRadio; + size1 = new Size(136, 16); + Size size17 = size1; + resumeRadio2.Size = size17; + this.ResumeRadio.TabIndex = 9; + this.ResumeRadio.TabStop = true; + this.ResumeRadio.Text = "Resume if smaller (&R)"; + this.ResumeRadio.UseVisualStyleBackColor = true; + this.DestInfoTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox destInfoTextBox1 = this.DestInfoTextBox; + point1 = new Point(136, 176); + Point point18 = point1; + destInfoTextBox1.Location = point18; + this.DestInfoTextBox.Multiline = true; + this.DestInfoTextBox.Name = "DestInfoTextBox"; + this.DestInfoTextBox.ReadOnly = true; + TextBox destInfoTextBox2 = this.DestInfoTextBox; + size1 = new Size(184, 32); + Size size18 = size1; + destInfoTextBox2.Size = size18; + this.DestInfoTextBox.TabIndex = 6; + this.DestInfoTextBox.TabStop = false; + this.DestInfoTextBox.TextAlign = HorizontalAlignment.Right; + this.SourceInfoTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox sourceInfoTextBox1 = this.SourceInfoTextBox; + point1 = new Point(136, 88); + Point point19 = point1; + sourceInfoTextBox1.Location = point19; + this.SourceInfoTextBox.Multiline = true; + this.SourceInfoTextBox.Name = "SourceInfoTextBox"; + this.SourceInfoTextBox.ReadOnly = true; + TextBox sourceInfoTextBox2 = this.SourceInfoTextBox; + size1 = new Size(184, 32); + Size size19 = size1; + sourceInfoTextBox2.Size = size19; + this.SourceInfoTextBox.TabIndex = 3; + this.SourceInfoTextBox.TabStop = false; + this.SourceInfoTextBox.TextAlign = HorizontalAlignment.Right; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(328, 384); + this.ClientSize = size1; + this.Controls.Add((Control) this.DestInfoTextBox); + this.Controls.Add((Control) this.SourceInfoTextBox); + this.Controls.Add((Control) this.ResumeRadio); + this.Controls.Add((Control) this.ChangeNameRadio); + this.Controls.Add((Control) this.MessageTextBox); + this.Controls.Add((Control) this.Label2); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.DestinationTextBox); + this.Controls.Add((Control) this.RetryButton); + this.Controls.Add((Control) this.ToAllCheck); + this.Controls.Add((Control) this.DeleteRadio); + this.Controls.Add((Control) this.IntegrateRadio); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.OKButton); + this.Controls.Add((Control) this.SourceTextBox); + this.Controls.Add((Control) this.SkipRadio); + this.Controls.Add((Control) this.OverwriteNewerRadio); + this.Controls.Add((Control) this.OverwriteRadio); + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(344, 422); + this.MinimumSize = size1; + this.Name = nameof (ConflictPromptForm); + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Overwrite Confirmation"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual RadioButton OverwriteRadio + { + get + { + return this._OverwriteRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OverwriteRadio = value; + } + } + + internal virtual RadioButton OverwriteNewerRadio + { + get + { + return this._OverwriteNewerRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OverwriteNewerRadio = value; + } + } + + internal virtual RadioButton SkipRadio + { + get + { + return this._SkipRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SkipRadio = value; + } + } + + internal virtual TextBox SourceTextBox + { + get + { + return this._SourceTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SourceTextBox = value; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.m_CancelButton_Click); + if (this._m_CancelButton != null) + this._m_CancelButton.Click -= eventHandler; + this._m_CancelButton = value; + if (this._m_CancelButton == null) + return; + this._m_CancelButton.Click += eventHandler; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual RadioButton IntegrateRadio + { + get + { + return this._IntegrateRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._IntegrateRadio = value; + } + } + + internal virtual RadioButton DeleteRadio + { + get + { + return this._DeleteRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DeleteRadio = value; + } + } + + internal virtual CheckBox ToAllCheck + { + get + { + return this._ToAllCheck; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToAllCheck = value; + } + } + + internal virtual Button RetryButton + { + get + { + return this._RetryButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RetryButton_Click); + if (this._RetryButton != null) + this._RetryButton.Click -= eventHandler; + this._RetryButton = value; + if (this._RetryButton == null) + return; + this._RetryButton.Click += eventHandler; + } + } + + internal virtual TextBox DestinationTextBox + { + get + { + return this._DestinationTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DestinationTextBox = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual TextBox MessageTextBox + { + get + { + return this._MessageTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MessageTextBox = value; + } + } + + internal virtual RadioButton ChangeNameRadio + { + get + { + return this._ChangeNameRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ChangeNameRadio = value; + } + } + + internal virtual RadioButton ResumeRadio + { + get + { + return this._ResumeRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ResumeRadio = value; + } + } + + internal virtual TextBox DestInfoTextBox + { + get + { + return this._DestInfoTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DestInfoTextBox = value; + } + } + + internal virtual TextBox SourceInfoTextBox + { + get + { + return this._SourceInfoTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SourceInfoTextBox = value; + } + } + + internal virtual Timer Timer1 + { + get + { + return this._Timer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.Timer1_Tick); + if (this._Timer1 != null) + this._Timer1.Tick -= eventHandler; + this._Timer1 = value; + if (this._Timer1 == null) + return; + this._Timer1.Tick += eventHandler; + } + } + + public ConflictType Conflict + { + get + { + return this.pConflict; + } + set + { + this.pConflict = value; + } + } + + public ConflictAction Solution + { + get + { + return this.pSolution; + } + } + + public bool ToAll + { + get + { + return this.ToAllCheck.Checked; + } + } + + private void ConflictPromptForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + switch (this.Conflict) + { + case ConflictType.FolderToFolder: + this.MessageTextBox.Text = "Same name folder exists. Choose action."; + this.OverwriteRadio.Enabled = false; + this.OverwriteNewerRadio.Enabled = false; + this.ResumeRadio.Enabled = false; + this.IntegrateRadio.Enabled = true; + this.DeleteRadio.Enabled = true; + this.SkipRadio.Enabled = true; + this.ChangeNameRadio.Enabled = true; + this.IntegrateRadio.Checked = true; + break; + case ConflictType.FolderToFile: + this.MessageTextBox.Text = "Same name file exists. Choose action."; + this.OverwriteRadio.Enabled = false; + this.OverwriteNewerRadio.Enabled = false; + this.ResumeRadio.Enabled = false; + this.IntegrateRadio.Enabled = false; + this.DeleteRadio.Enabled = true; + this.SkipRadio.Enabled = true; + this.ChangeNameRadio.Enabled = true; + this.SkipRadio.Checked = true; + break; + case ConflictType.FileToFolder: + this.MessageTextBox.Text = "Same name folder exists. Choose action."; + this.OverwriteRadio.Enabled = false; + this.OverwriteNewerRadio.Enabled = false; + this.ResumeRadio.Enabled = false; + this.IntegrateRadio.Enabled = false; + this.DeleteRadio.Enabled = true; + this.SkipRadio.Enabled = true; + this.ChangeNameRadio.Enabled = true; + this.SkipRadio.Checked = true; + break; + case ConflictType.FileToFile: + this.MessageTextBox.Text = "Same name file exists. Choose action."; + this.OverwriteRadio.Enabled = (this.pDestinationAbility & FsAbility.OverWriteFile) != FsAbility.None; + this.OverwriteNewerRadio.Enabled = (this.pDestinationAbility & FsAbility.OverWriteFile) != FsAbility.None; + this.ResumeRadio.Enabled = this.pEnableResume; + this.IntegrateRadio.Enabled = false; + this.DeleteRadio.Enabled = true; + this.SkipRadio.Enabled = true; + this.ChangeNameRadio.Enabled = true; + if (this.OverwriteRadio.Enabled) + { + this.OverwriteRadio.Checked = true; + break; + } + if (this.DeleteRadio.Enabled) + { + this.DeleteRadio.Checked = true; + break; + } + break; + case ConflictType.Move: + this.MessageTextBox.Text = "Same name resource exists. Choose action."; + this.OverwriteRadio.Enabled = (this.pDestinationAbility & FsAbility.MoveOver) != FsAbility.None; + this.OverwriteNewerRadio.Enabled = false; + this.ResumeRadio.Enabled = false; + this.IntegrateRadio.Enabled = false; + this.DeleteRadio.Enabled = true; + this.SkipRadio.Enabled = true; + this.ChangeNameRadio.Enabled = true; + this.ChangeNameRadio.Checked = true; + break; + case ConflictType.Copy: + this.MessageTextBox.Text = "Same name resource exists. Choose action."; + this.OverwriteRadio.Enabled = (this.pDestinationAbility & FsAbility.CopyOver) != FsAbility.None; + this.OverwriteNewerRadio.Enabled = false; + this.ResumeRadio.Enabled = false; + this.IntegrateRadio.Enabled = false; + this.DeleteRadio.Enabled = true; + this.SkipRadio.Enabled = true; + this.ChangeNameRadio.Enabled = true; + this.ChangeNameRadio.Checked = true; + break; + } + this.pIdleStartTime = DateTime.MaxValue; + this.Activate(); + this.Timer1.Start(); + } + + private void RetryButton_Click(object sender, EventArgs e) + { + this.pSolution = ConflictAction.Retry; + this.DialogResult = DialogResult.Retry; + } + + private void OKButton_Click(object sender, EventArgs e) + { + this.pSolution = !this.OverwriteRadio.Checked ? (!this.OverwriteNewerRadio.Checked ? (!this.ResumeRadio.Checked ? (!this.IntegrateRadio.Checked ? (!this.DeleteRadio.Checked ? (!this.ChangeNameRadio.Checked ? ConflictAction.Skip : ConflictAction.ChangeName) : ConflictAction.DeleteTarget) : ConflictAction.Integrate) : ConflictAction.Resume) : ConflictAction.OverwriteNewer) : ConflictAction.Overwrite; + this.DialogResult = DialogResult.OK; + } + + private void m_CancelButton_Click(object sender, EventArgs e) + { + this.pSolution = ConflictAction.CancelAll; + } + + public static ConflictPromptFormResult ShowDialog(IWin32Window owner, SimpleResourceInfo source, SimpleResourceInfo destination, ConflictType type, bool supportresume, FsAbility destability, int retryminutes) + { + ConflictPromptFormResult promptFormResult = new ConflictPromptFormResult(); + using (ConflictPromptForm conflictPromptForm = new ConflictPromptForm()) + { + conflictPromptForm.SourceTextBox.Text = source.Name; + conflictPromptForm.SourceInfoTextBox.Text = source.Size.ToString() + " Byte\r\n" + source.LastModifiedTime.ToString(); + conflictPromptForm.DestinationTextBox.Text = destination.Name; + conflictPromptForm.DestInfoTextBox.Text = destination.Size.ToString() + " Byte\r\n" + destination.LastModifiedTime.ToString(); + conflictPromptForm.Conflict = type; + conflictPromptForm.pEnableResume = source.Size > destination.Size && type == ConflictType.FileToFile && (supportresume && source.Size >= 0L) && destination.Size >= 0L; + conflictPromptForm.pDestinationAbility = destability; + conflictPromptForm.pRetryMinutes = retryminutes; + conflictPromptForm.pIdleStartTime = DateTime.Now; + int num = (int) conflictPromptForm.ShowDialog(owner); + promptFormResult.Type = type; + promptFormResult.Action = conflictPromptForm.Solution; + promptFormResult.ToAll = conflictPromptForm.ToAll; + } + return promptFormResult; + } + + private void Timer1_Tick(object sender, EventArgs e) + { + if (this.pRetryMinutes < 0) + return; + if ((long) Misc.GetIdleTime() > 600000L) + { + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + this.pIdleStartTime = DateTime.Now; + } + else + { + if (Form.ActiveForm == this) + { + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + return; + this.pIdleStartTime = DateTime.MaxValue; + this.RetryButton.Text = "Retry"; + return; + } + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + this.pIdleStartTime = DateTime.Now; + } + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + return; + TimeSpan timeSpan = TimeSpan.FromMinutes((double) this.pRetryMinutes).Subtract(DateTime.Now.Subtract(this.pIdleStartTime)); + if (timeSpan.TotalSeconds < 0.0) + { + this.pSolution = ConflictAction.AutoRetry; + this.DialogResult = DialogResult.Retry; + this.Close(); + } + else if (timeSpan.TotalSeconds <= 60.0) + this.RetryButton.Text = string.Format("Retry {0:f0}[s]", (object) timeSpan.TotalSeconds); + else if (timeSpan.TotalMinutes <= 60.0) + this.RetryButton.Text = string.Format("Retry {0:f0}[min]", (object) timeSpan.TotalMinutes); + else if (timeSpan.TotalHours <= 24.0) + this.RetryButton.Text = string.Format("Retry {0:f0}[h]", (object) timeSpan.TotalHours); + else + this.RetryButton.Text = "Retry"; + } + } +} diff --git a/CarotDAV/ConflictPromptForm.resx b/CarotDAV/ConflictPromptForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/ConflictPromptForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/ConflictPromptFormResult.cs b/CarotDAV/ConflictPromptFormResult.cs new file mode 100644 index 0000000..45b3097 --- /dev/null +++ b/CarotDAV/ConflictPromptFormResult.cs @@ -0,0 +1,15 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ConflictPromptFormResult +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public class ConflictPromptFormResult + { + public ConflictType Type; + public ConflictAction Action; + public bool ToAll; + } +} diff --git a/CarotDAV/ConflictPromptManager.cs b/CarotDAV/ConflictPromptManager.cs new file mode 100644 index 0000000..a93fd95 --- /dev/null +++ b/CarotDAV/ConflictPromptManager.cs @@ -0,0 +1,48 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ConflictPromptManager +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System.Collections.Generic; + +namespace CarotDAV +{ + public class ConflictPromptManager + { + private Dictionary pActionDic; + + public ConflictPromptManager() + { + this.pActionDic = new Dictionary(); + } + + public bool IsRegistered(ConflictType type) + { + if (type == ConflictType.NoConfliction) + return true; + if (this.pActionDic.ContainsKey(type)) + return this.pActionDic[type] != ConflictAction.NoConfliction; + return false; + } + + public ConflictAction GetAction(ConflictType type) + { + if (type == ConflictType.NoConfliction) + return ConflictAction.NoConfliction; + return this.pActionDic[type]; + } + + public void RegisterAction(ConflictPromptFormResult r) + { + if (!r.ToAll) + return; + if (r.Action == ConflictAction.Retry || r.Action == ConflictAction.AutoRetry) + this.pActionDic.Remove(r.Type); + else if (this.pActionDic.ContainsKey(r.Type)) + this.pActionDic[r.Type] = r.Action; + else + this.pActionDic.Add(r.Type, r.Action); + } + } +} diff --git a/CarotDAV/ConflictType.cs b/CarotDAV/ConflictType.cs new file mode 100644 index 0000000..b062080 --- /dev/null +++ b/CarotDAV/ConflictType.cs @@ -0,0 +1,19 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ConflictType +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public enum ConflictType + { + NoConfliction, + FolderToFolder, + FolderToFile, + FileToFolder, + FileToFile, + Move, + Copy, + } +} diff --git a/CarotDAV/DAVServer.cs b/CarotDAV/DAVServer.cs new file mode 100644 index 0000000..d7f0d2c --- /dev/null +++ b/CarotDAV/DAVServer.cs @@ -0,0 +1,1628 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.DAVServer +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using Rei.Net.HttpServer; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Net; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Security; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using System.Xml; + +namespace CarotDAV +{ + public class DAVServer : Component + { + private IContainer components; + private Thread serverthread; + private MyHttpListener davserver; + private string _ServerName; + private int _port; + private string _ipaddress; + private WebDAVClientSetting _setting; + internal const string GroupNameMain = "DAVServer"; + public Dictionary LockDB; + + [DebuggerNonUserCode] + public DAVServer(IContainer container) + : this() + { + if (container == null) + return; + container.Add((IComponent) this); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + } + + public event EventHandler LogMessage; + + public string IpAddress + { + get + { + return this._ipaddress; + } + set + { + this._ipaddress = value; + } + } + + [DefaultValue(80)] + public int ServerPort + { + get + { + return this._port; + } + set + { + this._port = value; + } + } + + public string DavUNC + { + get + { + IPAddress ipAddress = !string.IsNullOrEmpty(this._ipaddress.Trim()) ? IPAddress.Parse(this._ipaddress.Trim()) : IPAddress.Loopback; + string str1 = ipAddress.ToString(); + if (ipAddress.Equals((object) IPAddress.Any) || ipAddress.Equals((object) IPAddress.IPv6Any)) + str1 = "localhost"; + string str2 = "@" + this._port.ToString(); + if (this._port == 80) + str2 = ""; + return "\\\\" + str1 + str2 + "\\DavWWWRoot"; + } + } + + public bool IsRunning + { + get + { + return this.serverthread != null; + } + } + + [DefaultValue("DAVServer")] + public string ServerName + { + get + { + return this._ServerName; + } + set + { + this._ServerName = value; + } + } + + public WebDAVClientSetting Setting + { + get + { + return this._setting; + } + set + { + this._setting = value; + } + } + + [DebuggerNonUserCode] + public DAVServer() + { + this.LockDB = new Dictionary(); + this.InitializeComponent(); + } + + public void Start() + { + this.davserver = new MyHttpListener(); + this.davserver.EndPoint = new IPEndPoint(!string.IsNullOrEmpty(this._ipaddress.Trim()) ? IPAddress.Parse(this._ipaddress.Trim()) : IPAddress.Loopback, this._port); + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + this.davserver.ServerName = ((AssemblyProductAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false)[0]).Product + executingAssembly.GetName().Version.ToString(3); + this.davserver.Start(); + this.serverthread = new Thread(new ThreadStart(this.DavServerThreadMain)); + this.serverthread.IsBackground = true; + this.serverthread.Start(); + } + + public void Stop() + { + this.serverthread.Abort(); + this.serverthread = (Thread) null; + } + + private void DavServerThreadMain() + { + try + { + while (true) + new Thread(new ParameterizedThreadStart(this.ConnectionThreadMain)) + { + IsBackground = true + }.Start((object) this.davserver.GetConnection()); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + finally + { + this.davserver.Stop(); + this.davserver.Close(); + } + } + + private void ConnectionThreadMain(object obj) + { + try + { + using (MyHttpServerConnection con = (MyHttpServerConnection) obj) + { + con.Tag = (object) new DAVServer.ConnectionCache(); + while (con.IsConnected) + { + try + { + using (MyHttpServerRequest request = con.ReceiveRequest()) + { + this.OnLogMessage(")" + request.RequestLine); + int num1 = 0; + int num2 = checked (request.Headers.Count - 1); + int index = num1; + while (index <= num2) + { + this.OnLogMessage(") " + request.Headers.Keys[index] + ": " + request.Headers[index]); + checked { ++index; } + } + this.OnLogMessage(")"); + if (Operators.CompareString(request.UserAgent, "Microsoft Data Access Internet Publishing Provider DAV 1.1", false) == 0) + request.RequestUri = UriUtil.UriEncodeConvert(request.RequestUri, Encoding.GetEncoding("SJIS"), Encoding.UTF8); + MyHttpServerResponse res = new MyHttpServerResponse(); + string upperInvariant = request.Method.ToUpperInvariant(); + if (Operators.CompareString(upperInvariant, "OPTIONS", false) == 0) + { + res.StatusCode = 200; + res.StatusDescription = "OK"; + res.Headers.Add("DAV", "1, 3"); + res.Headers.Add("Allow", "OPTIONS, PROPFIND, PROPPATCH, GET, HEAD, PUT, DELETE, MKCOL"); + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + ; + } + else if (Operators.CompareString(upperInvariant, "PROPFIND", false) == 0) + this.ProcessPROPFIND(con, request); + else if (Operators.CompareString(upperInvariant, "PROPPATCH", false) == 0) + this.ProcessPROPPATCH(con, request); + else if (Operators.CompareString(upperInvariant, "GET", false) == 0) + this.ProcessGETHEAD(con, request, true); + else if (Operators.CompareString(upperInvariant, "HEAD", false) == 0) + this.ProcessGETHEAD(con, request, false); + else if (Operators.CompareString(upperInvariant, "DELETE", false) == 0) + this.ProcessDELETE(con, request); + else if (Operators.CompareString(upperInvariant, "PUT", false) == 0) + this.ProcessPUT(con, request); + else if (Operators.CompareString(upperInvariant, "MKCOL", false) == 0) + this.ProcessMKCOL(con, request); + else if (Operators.CompareString(upperInvariant, "MOVE", false) == 0) + this.ProcessMOVE(con, request); + else if (Operators.CompareString(upperInvariant, "LOCK", false) == 0) + { + string end; + using (StreamReader streamReader = new StreamReader(request.InputStream)) + end = streamReader.ReadToEnd(); + this.OnLogMessage(")))"); + this.OnLogMessage(end); + this.OnLogMessage(")))"); + string str = (string) null; + if (request.Headers["If"] != null) + { + string header = request.Headers["If"]; + if (header.Length == 49 && header.StartsWith("()")) + str = header.Substring(2, 45); + } + if (str == null) + str = "urn:uuid:" + Guid.NewGuid().ToString(); + Uri baseUri = request.RequestUri; + if (baseUri.AbsolutePath.Contains("&")) + baseUri = new Uri(baseUri, baseUri.AbsolutePath.Replace("&", "%26")); + res.StatusCode = 200; + res.StatusDescription = "OK"; + res.Headers.Add("Lock-Token", "<" + str + ">"); + byte[] bytes = Encoding.UTF8.GetBytes("0" + str + "" + baseUri.AbsoluteUri + "Second-3600"); + res.ContentLength = (long) bytes.Length; + using (Stream stream = this.SendResponse(con, res)) + stream.Write(bytes, 0, bytes.Length); + } + else if (Operators.CompareString(upperInvariant, "UNLOCK", false) == 0) + { + res.StatusCode = 204; + res.StatusDescription = "No Content"; + using (this.SendResponse(con, res)) + ; + } + else if (Operators.CompareString(upperInvariant, "POST", false) == 0) + { + res.StatusCode = 404; + res.StatusDescription = "Not Found"; + using (this.SendResponse(con, res)) + ; + } + else + { + res.StatusCode = 501; + res.StatusDescription = "Not Implemented"; + using (this.SendResponse(con, res)) + ; + } + } + } + catch (MyHttpServerBadRequestException ex) + { + ProjectData.SetProjectError((Exception) ex); + using (this.SendResponse(con, new MyHttpServerResponse() + { + StatusCode = 500, + StatusDescription = "Bad Request" + })) + ; + ProjectData.ClearProjectError(); + break; + } + catch (MyHttpServerConnectionClosedException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + break; + } + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + private void ProcessPROPFIND(MyHttpServerConnection con, MyHttpServerRequest req) + { + MyHttpServerResponse res = new MyHttpServerResponse(); + if ((object) req.RequestUri != null) + { + string[] segments = req.RequestUri.Segments; + if (segments.Length > 2 && (Operators.CompareString(segments[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments, 2, (Array) segments, 1, checked (segments.Length - 2)); + int result = -1; + if (req.Headers["Depth"] != null) + int.TryParse(req.Headers["Depth"], out result); + if (result < 0 || result > 2) + result = 1; + string str1 = ""; + if (segments.Length <= 1) + { + str1 = str1 + "" + SecurityElement.Escape(UriUtil.AddLastSlash(req.RequestUri).AbsoluteUri) + "" + "" + "" + "00000011" + "HTTP/1.1 200 OK" + "" + ""; + if (result >= 1) + { + int num1 = 0; + int num2 = checked (this._setting.ConnectionSettings.Count - 1); + int index = num1; + while (index <= num2) + { + str1 = str1 + "" + SecurityElement.Escape(UriUtil.AddLastSlash(UriUtil.CombineName(req.RequestUri, this.SanitizeName(this._setting.ConnectionSettings[index].Name))).AbsoluteUri) + "" + "" + "" + "00000011" + "HTTP/1.1 200 OK" + "" + ""; + checked { ++index; } + } + } + } + else + { + if (segments.Length == 2) + { + ConnectionSettingBase setting = this.FindSetting(Uri.UnescapeDataString(segments[1]).Replace("/", "")); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + str1 = str1 + "" + SecurityElement.Escape(UriUtil.AddLastSlash(req.RequestUri).AbsoluteUri) + "" + "" + "" + "00000011" + "HTTP/1.1 200 OK" + "" + ""; + if (result >= 1) + { + ResourceInfo[] resourceInfoArray = (ResourceInfo[]) null; +label_16: + while (true) + { + try + { + resourceInfoArray = client.GetInfoAndEntries(setting.TargetUri); + break; + } + catch (RemoteCertificateErrorException ex) + { + ProjectData.SetProjectError((Exception) ex); + RemoteCertificateErrorException certificateErrorException = ex; + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent != null) + logMessageEvent((object) this, new LogMessageEventArgs(certificateErrorException.ToString())); + LogWriter.WriteException((Exception) certificateErrorException); + client.ResetConnection(); + switch (ServerCertErrorPromptForm.ShowDialog((IWin32Window) null, (string) null, certificateErrorException.Errors, req.RequestUri.ToString())) + { + case DialogResult.Retry: + ProjectData.ClearProjectError(); + continue; + case DialogResult.Ignore: + client.ConnectionSetting.CertErrorIgnores = certificateErrorException.Errors; + ProjectData.ClearProjectError(); + continue; + default: + ProjectData.ClearProjectError(); + goto label_111; + } + } + catch (UnauthorizedException ex1) + { + ProjectData.SetProjectError((Exception) ex1); + UnauthorizedException unauthorizedException = ex1; + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent != null) + logMessageEvent((object) this, new LogMessageEventArgs(unauthorizedException.ToString())); + LogWriter.WriteException((Exception) unauthorizedException); + client.ResetConnection(); + if (unauthorizedException.CanRetry) + { + int retryminutes = 1; + while (true) + { + try + { + if (setting.DoAuthorization(req.RequestUri, false)) + { + ProjectData.ClearProjectError(); + goto label_16; + } + else + break; + } + catch (Exception ex2) + { + ProjectData.SetProjectError(ex2); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) null, "Error occurred during authorizing.", req.RequestUri.ToString(), (Exception) unauthorizedException, ErrorPromptType.RetryCancel, retryminutes); + if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + } + else if (promptFormResult.Action == ErrorAction.Retry) + { + ProjectData.ClearProjectError(); + } + else + { + ProjectData.ClearProjectError(); + break; + } + } + } + ProjectData.ClearProjectError(); + break; + } + ProjectData.ClearProjectError(); + goto label_101; + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + goto label_106; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent != null) + logMessageEvent((object) this, new LogMessageEventArgs(ex2.ToString())); + LogWriter.WriteException(ex2); + client.ResetConnection(); + ProjectData.ClearProjectError(); + goto label_111; + } + } + int num1 = 1; + int num2 = checked (resourceInfoArray.Length - 1); + int index = num1; + while (index <= num2) + { + string lastName = UriUtil.GetLastName(resourceInfoArray[index].Id.Uri); + Uri target = UriUtil.CombineName(req.RequestUri, lastName); + if (resourceInfoArray[index].IsCollection) + target = UriUtil.AddLastSlash(target); + string str2 = str1 + "" + SecurityElement.Escape(target.AbsoluteUri) + "" + ""; + DateTime universalTime; + string str3; + if (resourceInfoArray[index].IsCollection) + { + string str4 = str2 + "" + "" + Conversions.ToString(resourceInfoArray[index].Size) + "" + "application/octet-stream"; + string str5 = ""; + universalTime = resourceInfoArray[index].CreationTime.ToUniversalTime(); + string str6 = universalTime.ToString("r"); + string str7 = ""; + string str8 = str4 + str5 + str6 + str7; + string str9 = ""; + universalTime = resourceInfoArray[index].LastAccessTime.ToUniversalTime(); + string str10 = universalTime.ToString("r"); + string str11 = ""; + string str12 = str8 + str9 + str10 + str11; + string str13 = ""; + universalTime = resourceInfoArray[index].LastModifiedTime.ToUniversalTime(); + string str14 = universalTime.ToString("r"); + string str15 = ""; + str3 = str12 + str13 + str14 + str15 + "00000010"; + } + else + { + string str4 = str2 + "" + Conversions.ToString(resourceInfoArray[index].Size) + "" + "application/octet-stream"; + string str5 = ""; + universalTime = resourceInfoArray[index].CreationTime.ToUniversalTime(); + string str6 = universalTime.ToString("r"); + string str7 = ""; + string str8 = str4 + str5 + str6 + str7; + string str9 = ""; + universalTime = resourceInfoArray[index].LastAccessTime.ToUniversalTime(); + string str10 = universalTime.ToString("r"); + string str11 = ""; + string str12 = str8 + str9 + str10 + str11; + string str13 = ""; + universalTime = resourceInfoArray[index].LastModifiedTime.ToUniversalTime(); + string str14 = universalTime.ToString("r"); + string str15 = ""; + str3 = str12 + str13 + str14 + str15 + "00000000"; + } + str1 = str3 + "HTTP/1.1 200 OK" + "" + ""; + checked { ++index; } + } + goto label_96; + } + else + goto label_96; + } + else + goto label_106; + } + else + { + string searchname = Uri.UnescapeDataString(segments[1]).Replace("/", ""); + if (Operators.CompareString(UriUtil.GetLastName(req.RequestUri), "desktop.ini", false) != 0) + { + ConnectionSettingBase setting = this.FindSetting(searchname); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + Uri uri1 = setting.TargetUri; + int num1 = 2; + int num2 = checked (segments.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + uri1 = UriUtil.CombineSegment(uri1, segments[index1]); + checked { ++index1; } + } +label_55: + ResourceInfo[] resourceInfoArray; + while (true) + { + try + { + if (result == 0) + { + resourceInfoArray = new ResourceInfo[1] + { + client.GetInfo(uri1) + }; + break; + } + resourceInfoArray = client.GetInfoAndEntries(uri1); + break; + } + catch (RemoteCertificateErrorException ex) + { + ProjectData.SetProjectError((Exception) ex); + RemoteCertificateErrorException certificateErrorException = ex; + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent != null) + logMessageEvent((object) this, new LogMessageEventArgs(certificateErrorException.ToString())); + LogWriter.WriteException((Exception) certificateErrorException); + client.ResetConnection(); + switch (ServerCertErrorPromptForm.ShowDialog((IWin32Window) null, (string) null, certificateErrorException.Errors, req.RequestUri.ToString())) + { + case DialogResult.Retry: + ProjectData.ClearProjectError(); + continue; + case DialogResult.Ignore: + client.ConnectionSetting.CertErrorIgnores = certificateErrorException.Errors; + ProjectData.ClearProjectError(); + continue; + default: + ProjectData.ClearProjectError(); + goto label_117; + } + } + catch (UnauthorizedException ex1) + { + ProjectData.SetProjectError((Exception) ex1); + UnauthorizedException unauthorizedException = ex1; + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent != null) + logMessageEvent((object) this, new LogMessageEventArgs(unauthorizedException.ToString())); + LogWriter.WriteException((Exception) unauthorizedException); + client.ResetConnection(); + if (unauthorizedException.CanRetry) + { + int retryminutes = 1; + while (true) + { + try + { + if (setting.DoAuthorization(req.RequestUri, false)) + { + ProjectData.ClearProjectError(); + goto label_55; + } + else + break; + } + catch (Exception ex2) + { + ProjectData.SetProjectError(ex2); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) null, "Error occurred during authorizing.", req.RequestUri.ToString(), (Exception) unauthorizedException, ErrorPromptType.RetryCancel, retryminutes); + if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + } + else if (promptFormResult.Action == ErrorAction.Retry) + { + ProjectData.ClearProjectError(); + } + else + { + ProjectData.ClearProjectError(); + break; + } + } + } + } + ProjectData.ClearProjectError(); + goto label_101; + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + goto label_106; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent != null) + logMessageEvent((object) this, new LogMessageEventArgs(ex2.ToString())); + LogWriter.WriteException(ex2); + client.ResetConnection(); + ProjectData.ClearProjectError(); + goto label_117; + } + } + Uri uri2 = req.RequestUri; + if (uri2.AbsolutePath.Contains("&")) + uri2 = new Uri(uri2, uri2.AbsolutePath.Replace("&", "%26")); + int num3 = 0; + int num4 = checked (resourceInfoArray.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + Uri target; + if (index2 == 0) + { + target = uri2; + } + else + { + string lastName = UriUtil.GetLastName(resourceInfoArray[index2].Id.Uri); + if (Operators.CompareString(lastName, "desktop.ini", false) != 0) + target = UriUtil.CombineName(uri2, lastName); + else + goto label_94; + } + if (resourceInfoArray[index2].IsCollection) + target = UriUtil.AddLastSlash(target); + string str2 = str1 + "" + SecurityElement.Escape(target.AbsoluteUri) + "" + ""; + DateTime universalTime; + string str3; + if (resourceInfoArray[index2].IsCollection) + { + string str4 = str2 + ""; + string str5 = ""; + universalTime = resourceInfoArray[index2].CreationTime.ToUniversalTime(); + string str6 = universalTime.ToString("r"); + string str7 = ""; + string str8 = str4 + str5 + str6 + str7; + string str9 = ""; + universalTime = resourceInfoArray[index2].LastAccessTime.ToUniversalTime(); + string str10 = universalTime.ToString("r"); + string str11 = ""; + string str12 = str8 + str9 + str10 + str11; + string str13 = ""; + universalTime = resourceInfoArray[index2].LastModifiedTime.ToUniversalTime(); + string str14 = universalTime.ToString("r"); + string str15 = ""; + str3 = str12 + str13 + str14 + str15 + "00000010"; + } + else + { + string str4 = str2 + "" + Conversions.ToString(resourceInfoArray[index2].Size) + ""; + string str5 = ""; + universalTime = resourceInfoArray[index2].CreationTime.ToUniversalTime(); + string str6 = universalTime.ToString("r"); + string str7 = ""; + string str8 = str4 + str5 + str6 + str7; + string str9 = ""; + universalTime = resourceInfoArray[index2].LastAccessTime.ToUniversalTime(); + string str10 = universalTime.ToString("r"); + string str11 = ""; + string str12 = str8 + str9 + str10 + str11; + string str13 = ""; + universalTime = resourceInfoArray[index2].LastModifiedTime.ToUniversalTime(); + string str14 = universalTime.ToString("r"); + string str15 = ""; + str3 = str12 + str13 + str14 + str15 + "00000000"; + } + str1 = (!resourceInfoArray[index2].HasError ? str3 + "HTTP/1.1 200 OK" : str3 + "HTTP/1.1" + resourceInfoArray[index2].StatusDescription + "") + "" + ""; +label_94: + checked { ++index2; } + } + goto label_96; +label_117: + con.Close(); + return; + } + goto label_106; + } + else + goto label_106; + } +label_101: + res.StatusCode = 401; + res.StatusDescription = "Unauthorized"; + using (this.SendResponse(con, res)) + return; +label_106: + res.StatusCode = 404; + res.StatusDescription = "Not Found"; + using (this.SendResponse(con, res)) + return; + } +label_96: + string str16 = str1 + ""; + res.StatusCode = 207; + res.StatusDescription = "Multi-Status"; + res.SendChunked = true; + this.OnLogMessage(str16); + byte[] bytes = Encoding.UTF8.GetBytes(str16); + res.ContentLength = (long) bytes.Length; + using (Stream stream = this.SendResponse(con, res)) + { + stream.Write(bytes, 0, bytes.Length); + return; + } + } +label_111: + res.StatusCode = 500; + res.StatusDescription = "Internal Server Error"; + using (this.SendResponse(con, res)) + ; + con.Close(); + } + + private void ProcessPROPPATCH(MyHttpServerConnection con, MyHttpServerRequest req) + { + MyHttpServerResponse res = new MyHttpServerResponse(); + XmlDocument xmlDocument = new XmlDocument(); + try + { + string end; + using (StreamReader streamReader = new StreamReader(req.InputStream)) + end = streamReader.ReadToEnd(); + this.OnLogMessage(")))"); + this.OnLogMessage(end); + this.OnLogMessage(")))"); + xmlDocument.LoadXml(end); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_67; + } + if ((object) req.RequestUri != null) + { + string[] segments = req.RequestUri.Segments; + if (segments.Length > 2 && (Operators.CompareString(segments[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments, 2, (Array) segments, 1, checked (segments.Length - 2)); + if (segments.Length > 1 && segments.Length != 2) + { + string searchname = Uri.UnescapeDataString(segments[1]).Replace("/", ""); + UriUtil.GetLastName(req.RequestUri); + ConnectionSettingBase setting = this.FindSetting(searchname); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + Uri uri1 = setting.TargetUri; + int num1 = 2; + int num2 = checked (segments.Length - 1); + int index = num1; + while (index <= num2) + { + uri1 = UriUtil.CombineSegment(uri1, segments[index]); + checked { ++index; } + } + DateTime result1 = DateTime.MinValue; + DateTime result2 = DateTime.MinValue; + DateTime result3 = DateTime.MinValue; + int result4 = 0; + XmlNode documentElement = (XmlNode) xmlDocument.DocumentElement; + if (Operators.CompareString(documentElement.LocalName, "propertyupdate", false) == 0) + { + if (Operators.CompareString(documentElement.NamespaceURI, "DAV:", false) == 0) + { + try + { + foreach (XmlNode childNode in xmlDocument.DocumentElement.ChildNodes) + { + if (Operators.CompareString(childNode.NamespaceURI, "DAV:", false) == 0) + { + if (Operators.CompareString(childNode.LocalName, "set", false) == 0) + { + XmlNode xmlNode1 = (XmlNode) childNode["prop", "DAV:"]; + try + { + foreach (XmlNode xmlNode2 in xmlNode1) + { + string Left = xmlNode2.LocalName; + if (xmlNode2.NamespaceURI != null) + Left = xmlNode2.NamespaceURI + Left; + if (Operators.CompareString(Left, "urn:schemas-microsoft-com:Win32CreationTime", false) == 0) + { + if (!DateTime.TryParse(xmlNode2.InnerText, out result1)) + goto label_67; + } + else if (Operators.CompareString(Left, "urn:schemas-microsoft-com:Win32LastAccessTime", false) == 0) + { + if (!DateTime.TryParse(xmlNode2.InnerText, out result3)) + goto label_67; + } + else if (Operators.CompareString(Left, "urn:schemas-microsoft-com:Win32LastModifiedTime", false) == 0) + { + if (!DateTime.TryParse(xmlNode2.InnerText, out result2)) + goto label_67; + } + else if (Operators.CompareString(Left, "urn:schemas-microsoft-com:Win32FileAttributes", false) == 0) + { + if (!int.TryParse(xmlNode2.InnerText, NumberStyles.HexNumber, (IFormatProvider) null, out result4)) + goto label_67; + } + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + } + else if (Operators.CompareString(childNode.LocalName, "remove", false) == 0) + { + XmlNode xmlNode = (XmlNode) childNode["prop", "DAV:"]; + } + else + goto label_67; + } + else + goto label_67; + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + if ((client.Ability & FsAbility.LastModifiedTime) == FsAbility.None) + result2 = DateTime.MinValue; + if ((client.Ability & FsAbility.CreationTime) == FsAbility.None) + result1 = DateTime.MinValue; + if ((client.Ability & FsAbility.LastAccessTime) == FsAbility.None) + result3 = DateTime.MinValue; + ResourceInfo resourceInfo; + try + { + resourceInfo = client.GetInfo(uri1); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + goto label_77; + } + try + { + if (DateTime.Compare(result2, DateTime.MinValue) == 0 && DateTime.Compare(result1, DateTime.MinValue) == 0) + { + if (DateTime.Compare(result3, DateTime.MinValue) == 0) + goto label_55; + } + resourceInfo = client.SetTimes(resourceInfo.Id, result2, result1, result3) as ResourceInfo ?? client.GetInfo(uri1); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_72; + } +label_55: + Uri uri2 = req.RequestUri; + if (uri2.AbsolutePath.Contains("&")) + uri2 = new Uri(uri2, uri2.AbsolutePath.Replace("&", "%26")); + if (resourceInfo.IsCollection) + uri2 = UriUtil.AddLastSlash(uri2); + string str1 = "" + "" + SecurityElement.Escape(uri2.AbsoluteUri) + "" + ""; + string str2; + if (resourceInfo.IsCollection) + { + string str3 = str1 + ""; + string str4 = ""; + DateTime universalTime = resourceInfo.CreationTime.ToUniversalTime(); + string str5 = universalTime.ToString("r"); + string str6 = ""; + string str7 = str3 + str4 + str5 + str6; + string str8 = ""; + universalTime = resourceInfo.LastAccessTime.ToUniversalTime(); + string str9 = universalTime.ToString("r"); + string str10 = ""; + str2 = str7 + str8 + str9 + str10 + "" + resourceInfo.LastModifiedTime.ToUniversalTime().ToString("r") + "" + "00000010"; + } + else + str2 = str1 + "" + Conversions.ToString(resourceInfo.Size) + "" + "" + resourceInfo.CreationTime.ToUniversalTime().ToString("r") + "" + "" + resourceInfo.LastAccessTime.ToUniversalTime().ToString("r") + "" + "" + resourceInfo.LastModifiedTime.ToUniversalTime().ToString("r") + "" + "00000000"; + string s = str2 + "HTTP/1.1 200 OK" + "" + "" + ""; + res.StatusCode = 207; + res.StatusDescription = "Multi-Status"; + res.SendChunked = true; + byte[] bytes = Encoding.UTF8.GetBytes(s); + res.ContentLength = (long) bytes.Length; + using (Stream stream = this.SendResponse(con, res)) + { + stream.Write(bytes, 0, bytes.Length); + return; + } + } + else + goto label_67; + } + else + goto label_67; + } +label_77: + res.StatusCode = 404; + res.StatusDescription = "Not found"; + using (this.SendResponse(con, res)) + return; + } +label_72: + res.StatusCode = 403; + res.StatusDescription = "Forbidden"; + using (this.SendResponse(con, res)) + return; + } + else + { + res.StatusCode = 500; + res.StatusDescription = "Internal Server Error"; + using (this.SendResponse(con, res)) + ; + con.Close(); + return; + } +label_67: + res.StatusCode = 400; + res.StatusDescription = "Bad Request"; + using (this.SendResponse(con, res)) + ; + } + + private void ProcessGETHEAD(MyHttpServerConnection con, MyHttpServerRequest req, bool containbody) + { + MyHttpServerResponse res = new MyHttpServerResponse(); + if ((object) req.RequestUri != null) + { + string[] segments = req.RequestUri.Segments; + if (segments.Length > 2 && (Operators.CompareString(segments[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments, 2, (Array) segments, 1, checked (segments.Length - 2)); + string s; + if (segments.Length <= 1) + { + string str = ""; + } + else + { + if (segments.Length == 2) + { + ConnectionSettingBase setting = this.FindSetting(Uri.UnescapeDataString(segments[1]).Replace("/", "")); + if (setting != null) + { + s = "

" + this.SanitizeName(setting.Name) + "

"; + goto label_40; + } + } + else + { + ConnectionSettingBase setting = this.FindSetting(Uri.UnescapeDataString(segments[1]).Replace("/", "")); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + Uri uri = setting.TargetUri; + int num1 = 2; + int num2 = checked (segments.Length - 1); + int index = num1; + while (index <= num2) + { + uri = UriUtil.CombineSegment(uri, segments[index]); + checked { ++index; } + } + try + { + ResourceInfo info; + try + { + info = client.GetInfo(uri); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + goto label_46; + } + if (info.Size == 0L) + { + res.StatusCode = 204; + res.StatusDescription = "No Content"; + res.ContentLength = 0L; + } + else + { + res.StatusCode = 200; + res.StatusDescription = "OK"; + res.SendChunked = true; + } + res.Headers.Add("Accept-Ranges", "none"); + res.Headers.Add("Allow", "GET, HEAD, PUT, DELETE, MOVE, COPY, PROPFIND, PROPPATCH"); + res.Headers.Add("Connection", "Keep-Alive"); + using (Stream stream1 = this.SendResponse(con, res)) + { + if (!containbody) + return; + if (info.Size <= 0L) + return; + try + { + FsBase fsBase = client; + ResourceId id = info.Id; + long start = 0; + using (Stream stream2 = fsBase.OpenRead(id, ref start, ref info.Size)) + { + byte[] buffer = new byte[65536]; + while (true) + { + int count = stream2.Read(buffer, 0, buffer.Length); + if (count != 0) + stream1.Write(buffer, 0, count); + else + break; + } + return; + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + con.Close(); + ProjectData.ClearProjectError(); + return; + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_51; + } + } + } +label_46: + res.StatusCode = 404; + res.StatusDescription = "Not found"; + using (this.SendResponse(con, res)) + return; + } +label_40: + res.StatusCode = 200; + res.StatusDescription = "OK"; + res.Headers.Add("Accept-Ranges", "none"); + res.Headers.Add("Allow", "GET, HEAD"); + byte[] bytes = Encoding.UTF8.GetBytes(s); + res.ContentLength = (long) bytes.Length; + using (Stream stream = this.SendResponse(con, res)) + { + if (!containbody) + return; + stream.Write(bytes, 0, bytes.Length); + return; + } + } +label_51: + res.StatusCode = 500; + res.StatusDescription = "Internal Server Error"; + using (this.SendResponse(con, res)) + ; + con.Close(); + } + + private void ProcessDELETE(MyHttpServerConnection con, MyHttpServerRequest req) + { + MyHttpServerResponse res = new MyHttpServerResponse(); + if ((object) req.RequestUri != null) + { + string[] segments = req.RequestUri.Segments; + if (segments.Length > 2 && (Operators.CompareString(segments[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments, 2, (Array) segments, 1, checked (segments.Length - 2)); + if (segments.Length > 1 && segments.Length != 2) + { + ConnectionSettingBase setting = this.FindSetting(Uri.UnescapeDataString(segments[1]).Replace("/", "")); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + Uri uri = setting.TargetUri; + int num1 = 2; + int num2 = checked (segments.Length - 1); + int index = num1; + while (index <= num2) + { + uri = UriUtil.CombineSegment(uri, segments[index]); + checked { ++index; } + } + ResourceInfo info; + try + { + info = client.GetInfo(uri); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + goto label_22; + } + try + { + client.Delete(info.Id); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_27; + } + res.StatusCode = 204; + res.StatusDescription = "No Content"; + using (this.SendResponse(con, res)) + return; + } +label_22: + res.StatusCode = 404; + res.StatusDescription = "Not found"; + using (this.SendResponse(con, res)) + return; + } + else + { + res.StatusCode = 400; + res.StatusDescription = "Bad Request"; + using (this.SendResponse(con, res)) + return; + } + } +label_27: + res.StatusCode = 500; + res.StatusDescription = "Internal Server Error"; + using (this.SendResponse(con, res)) + ; + con.Close(); + } + + private void ProcessPUT(MyHttpServerConnection con, MyHttpServerRequest req) + { + MyHttpServerResponse res = new MyHttpServerResponse(); + int num1 = 0; + int num2 = checked (req.Headers.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + string upperInvariant = req.Headers.Keys[index1].ToUpperInvariant(); + if (!upperInvariant.StartsWith("CONTENT-") || Operators.CompareString(upperInvariant, "CONTENT-LANGUAGE", false) == 0 || (Operators.CompareString(upperInvariant, "CONTENT-LENGTH", false) == 0 || Operators.CompareString(upperInvariant, "CONTENT-LOCATION", false) == 0) || (Operators.CompareString(upperInvariant, "CONTENT-MD5", false) == 0 || Operators.CompareString(upperInvariant, "CONTENT-TYPE", false) == 0 || Operators.CompareString(upperInvariant, "CONTENT-MD5", false) == 0)) + { + checked { ++index1; } + } + else + { + res.StatusCode = 501; + res.StatusDescription = "Not Implemented"; + using (this.SendResponse(con, res)) + ; + con.Close(); + return; + } + } + if ((object) req.RequestUri != null) + { + string[] segments = req.RequestUri.Segments; + if (segments.Length > 2 && (Operators.CompareString(segments[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments, 2, (Array) segments, 1, checked (segments.Length - 2)); + if (segments.Length > 1 && segments.Length != 2) + { + ConnectionSettingBase setting = this.FindSetting(Uri.UnescapeDataString(segments[1]).Replace("/", "")); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + Uri uri = setting.TargetUri; + int num3 = 2; + int num4 = checked (segments.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + uri = UriUtil.CombineSegment(uri, segments[index2]); + checked { ++index2; } + } + string lastName = UriUtil.GetLastName(uri); + Uri parent = UriUtil.GetParent(uri); + ResourceInfo info; + try + { + info = client.GetInfo(parent); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_47; + } + try + { + using (Stream st = client.OpenWrite(info.Id, lastName, req.ContentLength)) + { + using (Stream inputStream = req.InputStream) + { + DateTime now = DateTime.Now; + long num5 = 0; + long num6 = 1048576; + byte[] buffer = new byte[65536]; + while (true) + { + do + { + int count = inputStream.Read(buffer, 0, buffer.Length); + if (count != 0) + { + st.Write(buffer, 0, count); + checked { num5 += (long) count; } + } + else + goto label_24; + } + while (num5 <= num6); + this.OnLogMessage(num5.ToString()); + num6 = checked (num5 + 1048576L); + } + } +label_24: + client.CloseWrite(st); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_52; + } + if (req.ContentLength <= 0L) + { + res.StatusCode = 201; + res.StatusDescription = "Created"; + Uri baseUri = req.RequestUri; + if (baseUri.AbsolutePath.Contains("&")) + baseUri = new Uri(baseUri, baseUri.AbsolutePath.Replace("&", "%26")); + res.Headers.Add("Location", baseUri.AbsoluteUri); + using (this.SendResponse(con, res)) + return; + } + else + { + res.StatusCode = 204; + res.StatusDescription = "No Content"; + using (this.SendResponse(con, res)) + return; + } + } +label_47: + res.StatusCode = 412; + res.StatusDescription = "Precondition Failed"; + using (this.SendResponse(con, res)) + return; + } + else + { + res.StatusCode = 403; + res.StatusDescription = "Forbidden"; + using (this.SendResponse(con, res)) + return; + } + } +label_52: + res.StatusCode = 500; + res.StatusDescription = "Internal Server Error"; + using (this.SendResponse(con, res)) + ; + con.Close(); + } + + private void ProcessMKCOL(MyHttpServerConnection con, MyHttpServerRequest req) + { + MyHttpServerResponse res = new MyHttpServerResponse(); + if ((object) req.RequestUri != null) + { + string[] segments = req.RequestUri.Segments; + if (segments.Length > 2 && (Operators.CompareString(segments[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments, 2, (Array) segments, 1, checked (segments.Length - 2)); + if (segments.Length > 1 && segments.Length != 2) + { + ConnectionSettingBase setting = this.FindSetting(Uri.UnescapeDataString(segments[1]).Replace("/", "")); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + Uri uri = setting.TargetUri; + int num1 = 2; + int num2 = checked (segments.Length - 1); + int index = num1; + while (index <= num2) + { + uri = UriUtil.CombineSegment(uri, segments[index]); + checked { ++index; } + } + string lastName = UriUtil.GetLastName(uri); + Uri parent = UriUtil.GetParent(uri); + ResourceInfo info; + try + { + info = client.GetInfo(parent); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_23; + } + try + { + client.CreateCollection(info.Id, lastName); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_28; + } + res.StatusCode = 201; + res.StatusDescription = "Created"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + return; + } +label_23: + res.StatusCode = 412; + res.StatusDescription = "Precondition Failed"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + return; + } + else + { + res.StatusCode = 403; + res.StatusDescription = "Forbidden"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + return; + } + } +label_28: + res.StatusCode = 500; + res.StatusDescription = "Internal Server Error"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + ; + con.Close(); + } + + private void ProcessMOVE(MyHttpServerConnection con, MyHttpServerRequest req) + { + MyHttpServerResponse res = new MyHttpServerResponse(); + Uri result = (Uri) null; + if ((object) req.RequestUri != null) + { + string[] segments1 = req.RequestUri.Segments; + if (segments1.Length > 2 && (Operators.CompareString(segments1[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments1[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments1, 2, (Array) segments1, 1, checked (segments1.Length - 2)); + if (segments1.Length > 1 && segments1.Length != 2) + { + string str1 = Uri.UnescapeDataString(segments1[1]).Replace("/", ""); + if (Uri.TryCreate(req.Headers["Destination"], UriKind.RelativeOrAbsolute, out result)) + { + if (!result.IsAbsoluteUri) + result = new Uri(req.RequestUri, result); + string[] segments2 = result.Segments; + if (segments2.Length > 2 && (Operators.CompareString(segments2[1], "DavWWWRoot/", false) == 0 || Operators.CompareString(segments2[1], "DavWWWRoot", false) == 0)) + Array.Copy((Array) segments2, 2, (Array) segments2, 1, checked (segments2.Length - 2)); + if (Operators.CompareString(Uri.UnescapeDataString(segments2[1]).Replace("/", ""), str1, false) == 0) + { + bool overwrite = false; + if (Operators.CompareString(req.Headers["Overwrite"].ToUpperInvariant(), "T", false) == 0) + overwrite = true; + ConnectionSettingBase setting = this.FindSetting(str1); + if (setting != null) + { + FsBase client = this.CreateClient(con, setting); + Uri uri1 = setting.TargetUri; + int num1 = 2; + int num2 = checked (segments1.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + uri1 = UriUtil.CombineSegment(uri1, segments1[index1]); + checked { ++index1; } + } + Uri uri2 = setting.TargetUri; + int num3 = 2; + int num4 = checked (segments2.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + uri2 = UriUtil.CombineSegment(uri2, segments2[index2]); + checked { ++index2; } + } + string lastName = UriUtil.GetLastName(uri1); + Uri parent1 = UriUtil.GetParent(uri1); + string str2 = UriUtil.GetLastName(uri2); + Uri parent2 = UriUtil.GetParent(uri2); + ResourceInfo info; + try + { + info = client.GetInfo(uri1); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_44; + } + ResourceId newparentid = (ResourceId) null; + if (parent1 != parent2) + { + try + { + newparentid = client.GetInfo(parent2).Id; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_44; + } + } + if (Operators.CompareString(lastName, str2, false) == 0) + str2 = (string) null; + ReturnedInfo returnedInfo; + try + { + returnedInfo = client.Move(info.Id, newparentid, str2, overwrite); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + goto label_49; + } + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + result = !(resourceInfo == null ? (ResourceId) returnedInfo : resourceInfo.Id).IsCollection ? UriUtil.RemoveLastSlash(result) : UriUtil.AddLastSlash(result); + res.StatusCode = 201; + res.StatusDescription = "Created"; + res.ContentLength = 0L; + res.Headers.Add("Location", result.AbsoluteUri); + using (this.SendResponse(con, res)) + return; + } +label_44: + res.StatusCode = 412; + res.StatusDescription = "Precondition Failed"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + return; + } + else + { + res.StatusCode = 502; + res.StatusDescription = "Bad Gateway"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + ; + con.Close(); + return; + } + } + else + { + res.StatusCode = 400; + res.StatusDescription = "Bad Request"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + return; + } + } + else + { + res.StatusCode = 403; + res.StatusDescription = "Forbidden"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + return; + } + } +label_49: + res.StatusCode = 500; + res.StatusDescription = "Internal Server Error"; + res.ContentLength = 0L; + using (this.SendResponse(con, res)) + ; + con.Close(); + } + + private Stream SendResponse(MyHttpServerConnection con, MyHttpServerResponse res) + { + res.Headers.Add("Server", this.ServerName); + this.OnLogMessage("(" + Conversions.ToString(res.StatusCode) + " " + res.StatusDescription); + int num1 = 0; + int num2 = checked (res.Headers.Count - 1); + int index = num1; + while (index <= num2) + { + this.OnLogMessage("( " + res.Headers.Keys[index] + ": " + res.Headers[index]); + checked { ++index; } + } + if (res.SendChunked) + this.OnLogMessage("( Transfer-Encoding: chunked"); + else + this.OnLogMessage("( Content-Length: " + Conversions.ToString(res.ContentLength)); + this.OnLogMessage("("); + return con.SendResponse(res); + } + + private void OnLogMessage(string str) + { + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent == null) + return; + logMessageEvent((object) this, new LogMessageEventArgs(str)); + } + + private ConnectionSettingBase FindSetting(string searchname) + { + int num1 = 0; + int num2 = checked (this._setting.ConnectionSettings.Count - 1); + int index = num1; + while (index <= num2) + { + if (Operators.CompareString(searchname, this.SanitizeName(this._setting.ConnectionSettings[index].Name), false) == 0) + return this._setting.ConnectionSettings[index]; + checked { ++index; } + } + return (ConnectionSettingBase) null; + } + + private FsBase CreateClient(MyHttpServerConnection con, ConnectionSettingBase setting) + { + DAVServer.ConnectionCache tag = (DAVServer.ConnectionCache) con.Tag; + if (tag.fscache.ContainsKey(setting)) + return tag.fscache[setting]; + FsBase client = setting.GetClient(); + client.LogMessage += new EventHandler(this.Client_OnMessage); + client.GroupName = "UpDown " + Conversions.ToString(Thread.CurrentThread.ManagedThreadId); + tag.fscache.Add(setting, client); + return client; + } + + private string SanitizeName(string str) + { + return str.Replace("\\", "").Replace("/", "").Replace(":", "").Replace("*", "").Replace("?", "").Replace("\"", "").Replace("<", "").Replace(">", "").Replace("|", "").Trim(); + } + + private void Client_OnMessage(object sender, LogMessageEventArgs e) + { + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent == null) + return; + logMessageEvent(RuntimeHelpers.GetObjectValue(sender), e); + } + + public delegate ReturnedInfo closewrite_del(Stream st); + + private class ConnectionCache + { + public Dictionary fscache; + + public ConnectionCache() + { + this.fscache = new Dictionary(); + } + } + } +} diff --git a/CarotDAV/DestinationForm.cs b/CarotDAV/DestinationForm.cs new file mode 100644 index 0000000..1e097b4 --- /dev/null +++ b/CarotDAV/DestinationForm.cs @@ -0,0 +1,600 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.DestinationForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class DestinationForm : Form + { + private IContainer components; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("SourceTextBox")] + private TextBox _SourceTextBox; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("DestinationTextBox")] + private TextBox _DestinationTextBox; + [AccessedThroughProperty("TableLayoutPanel1")] + private TableLayoutPanel _TableLayoutPanel1; + [AccessedThroughProperty("Panel1")] + private Panel _Panel1; + [AccessedThroughProperty("Panel2")] + private Panel _Panel2; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("DepthInfinite")] + private RadioButton _DepthInfinite; + [AccessedThroughProperty("DepthOneRadio")] + private RadioButton _DepthOneRadio; + [AccessedThroughProperty("DepthZeroRadio")] + private RadioButton _DepthZeroRadio; + [AccessedThroughProperty("DepthPanel")] + private Panel _DepthPanel; + private DestinationMethodType pMethod; + + public DestinationForm() + { + this.Load += new EventHandler(this.DestinationForm_Load); + this.Shown += new EventHandler(this.DestinationForm_Shown); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.Label5 = new Label(); + this.Label4 = new Label(); + this.SourceTextBox = new TextBox(); + this.m_CancelButton = new Button(); + this.OKButton = new Button(); + this.Label2 = new Label(); + this.DestinationTextBox = new TextBox(); + this.TableLayoutPanel1 = new TableLayoutPanel(); + this.Panel1 = new Panel(); + this.Panel2 = new Panel(); + this.Label1 = new Label(); + this.DepthInfinite = new RadioButton(); + this.DepthOneRadio = new RadioButton(); + this.DepthZeroRadio = new RadioButton(); + this.DepthPanel = new Panel(); + this.TableLayoutPanel1.SuspendLayout(); + this.Panel1.SuspendLayout(); + this.Panel2.SuspendLayout(); + this.DepthPanel.SuspendLayout(); + this.SuspendLayout(); + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + Point point1 = new Point(0, 0); + Point point2 = point1; + label5_1.Location = point2; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + Size size1 = new Size(111, 12); + Size size2 = size1; + label5_2.Size = size2; + this.Label5.TabIndex = 0; + this.Label5.Text = "Destination URI (To)"; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(0, 0); + Point point3 = point1; + label4_1.Location = point3; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(101, 12); + Size size3 = size1; + label4_2.Size = size3; + this.Label4.TabIndex = 0; + this.Label4.Text = "Source URI (From)"; + this.SourceTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox sourceTextBox1 = this.SourceTextBox; + point1 = new Point(0, 16); + Point point4 = point1; + sourceTextBox1.Location = point4; + this.SourceTextBox.Multiline = true; + this.SourceTextBox.Name = "SourceTextBox"; + this.SourceTextBox.ReadOnly = true; + TextBox sourceTextBox2 = this.SourceTextBox; + size1 = new Size(352, 42); + Size size4 = size1; + sourceTextBox2.Size = size4; + this.SourceTextBox.TabIndex = 1; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(296, 184); + Point point5 = point1; + mCancelButton1.Location = point5; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size5 = size1; + mCancelButton2.Size = size5; + this.m_CancelButton.TabIndex = 4; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + point1 = new Point(216, 184); + Point point6 = point1; + okButton1.Location = point6; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + size1 = new Size(72, 24); + Size size6 = size1; + okButton2.Size = size6; + this.OKButton.TabIndex = 3; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(8, 8); + Point point7 = point1; + label2_1.Location = point7; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(94, 12); + Size size7 = size1; + label2_2.Size = size7; + this.Label2.TabIndex = 0; + this.Label2.Text = "Enter Destination"; + this.DestinationTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox destinationTextBox1 = this.DestinationTextBox; + point1 = new Point(0, 16); + Point point8 = point1; + destinationTextBox1.Location = point8; + this.DestinationTextBox.Multiline = true; + this.DestinationTextBox.Name = "DestinationTextBox"; + TextBox destinationTextBox2 = this.DestinationTextBox; + size1 = new Size(352, 42); + Size size8 = size1; + destinationTextBox2.Size = size8; + this.DestinationTextBox.TabIndex = 1; + this.TableLayoutPanel1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.TableLayoutPanel1.ColumnCount = 1; + this.TableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50f)); + this.TableLayoutPanel1.Controls.Add((Control) this.Panel1, 0, 0); + this.TableLayoutPanel1.Controls.Add((Control) this.Panel2, 0, 1); + TableLayoutPanel tableLayoutPanel1_1 = this.TableLayoutPanel1; + point1 = new Point(8, 24); + Point point9 = point1; + tableLayoutPanel1_1.Location = point9; + this.TableLayoutPanel1.Name = "TableLayoutPanel1"; + this.TableLayoutPanel1.RowCount = 2; + this.TableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50f)); + this.TableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50f)); + TableLayoutPanel tableLayoutPanel1_2 = this.TableLayoutPanel1; + size1 = new Size(360, 128); + Size size9 = size1; + tableLayoutPanel1_2.Size = size9; + this.TableLayoutPanel1.TabIndex = 1; + this.Panel1.Controls.Add((Control) this.SourceTextBox); + this.Panel1.Controls.Add((Control) this.Label4); + this.Panel1.Dock = DockStyle.Fill; + Panel panel1_1 = this.Panel1; + point1 = new Point(3, 3); + Point point10 = point1; + panel1_1.Location = point10; + this.Panel1.Name = "Panel1"; + Panel panel1_2 = this.Panel1; + size1 = new Size(354, 58); + Size size10 = size1; + panel1_2.Size = size10; + this.Panel1.TabIndex = 0; + this.Panel2.Controls.Add((Control) this.DestinationTextBox); + this.Panel2.Controls.Add((Control) this.Label5); + this.Panel2.Dock = DockStyle.Fill; + Panel panel2_1 = this.Panel2; + point1 = new Point(3, 67); + Point point11 = point1; + panel2_1.Location = point11; + this.Panel2.Name = "Panel2"; + Panel panel2_2 = this.Panel2; + size1 = new Size(354, 58); + Size size11 = size1; + panel2_2.Size = size11; + this.Panel2.TabIndex = 1; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 8); + Point point12 = point1; + label1_1.Location = point12; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(37, 12); + Size size12 = size1; + label1_2.Size = size12; + this.Label1.TabIndex = 0; + this.Label1.Text = "Depth:"; + this.DepthInfinite.AutoSize = true; + this.DepthInfinite.Checked = true; + RadioButton depthInfinite1 = this.DepthInfinite; + point1 = new Point(48, 8); + Point point13 = point1; + depthInfinite1.Location = point13; + this.DepthInfinite.Name = "DepthInfinite"; + RadioButton depthInfinite2 = this.DepthInfinite; + size1 = new Size(58, 16); + Size size13 = size1; + depthInfinite2.Size = size13; + this.DepthInfinite.TabIndex = 1; + this.DepthInfinite.TabStop = true; + this.DepthInfinite.Text = "Infinite"; + this.DepthInfinite.UseVisualStyleBackColor = true; + this.DepthOneRadio.AutoSize = true; + RadioButton depthOneRadio1 = this.DepthOneRadio; + point1 = new Point(112, 8); + Point point14 = point1; + depthOneRadio1.Location = point14; + this.DepthOneRadio.Name = "DepthOneRadio"; + RadioButton depthOneRadio2 = this.DepthOneRadio; + size1 = new Size(29, 16); + Size size14 = size1; + depthOneRadio2.Size = size14; + this.DepthOneRadio.TabIndex = 2; + this.DepthOneRadio.Text = "1"; + this.DepthOneRadio.UseVisualStyleBackColor = true; + this.DepthZeroRadio.AutoSize = true; + RadioButton depthZeroRadio1 = this.DepthZeroRadio; + point1 = new Point(152, 8); + Point point15 = point1; + depthZeroRadio1.Location = point15; + this.DepthZeroRadio.Name = "DepthZeroRadio"; + RadioButton depthZeroRadio2 = this.DepthZeroRadio; + size1 = new Size(29, 16); + Size size15 = size1; + depthZeroRadio2.Size = size15; + this.DepthZeroRadio.TabIndex = 3; + this.DepthZeroRadio.Text = "0"; + this.DepthZeroRadio.UseVisualStyleBackColor = true; + this.DepthPanel.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.DepthPanel.Controls.Add((Control) this.DepthZeroRadio); + this.DepthPanel.Controls.Add((Control) this.Label1); + this.DepthPanel.Controls.Add((Control) this.DepthInfinite); + this.DepthPanel.Controls.Add((Control) this.DepthOneRadio); + Panel depthPanel1 = this.DepthPanel; + point1 = new Point(8, 160); + Point point16 = point1; + depthPanel1.Location = point16; + this.DepthPanel.Name = "DepthPanel"; + Panel depthPanel2 = this.DepthPanel; + size1 = new Size(192, 32); + Size size16 = size1; + depthPanel2.Size = size16; + this.DepthPanel.TabIndex = 2; + this.DepthPanel.Visible = false; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(376, 215); + this.ClientSize = size1; + this.Controls.Add((Control) this.DepthPanel); + this.Controls.Add((Control) this.TableLayoutPanel1); + this.Controls.Add((Control) this.Label2); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.OKButton); + size1 = new Size(392, 253); + this.MaximumSize = size1; + size1 = new Size(256, 205); + this.MinimumSize = size1; + this.Name = nameof (DestinationForm); + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Destination"; + this.TableLayoutPanel1.ResumeLayout(false); + this.Panel1.ResumeLayout(false); + this.Panel1.PerformLayout(); + this.Panel2.ResumeLayout(false); + this.Panel2.PerformLayout(); + this.DepthPanel.ResumeLayout(false); + this.DepthPanel.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual TextBox SourceTextBox + { + get + { + return this._SourceTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SourceTextBox = value; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._m_CancelButton = value; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual TextBox DestinationTextBox + { + get + { + return this._DestinationTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DestinationTextBox_TextChanged); + if (this._DestinationTextBox != null) + this._DestinationTextBox.TextChanged -= eventHandler; + this._DestinationTextBox = value; + if (this._DestinationTextBox == null) + return; + this._DestinationTextBox.TextChanged += eventHandler; + } + } + + internal virtual TableLayoutPanel TableLayoutPanel1 + { + get + { + return this._TableLayoutPanel1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TableLayoutPanel1 = value; + } + } + + internal virtual Panel Panel1 + { + get + { + return this._Panel1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Panel1 = value; + } + } + + internal virtual Panel Panel2 + { + get + { + return this._Panel2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Panel2 = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual RadioButton DepthInfinite + { + get + { + return this._DepthInfinite; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DepthInfinite = value; + } + } + + internal virtual RadioButton DepthOneRadio + { + get + { + return this._DepthOneRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DepthOneRadio = value; + } + } + + internal virtual RadioButton DepthZeroRadio + { + get + { + return this._DepthZeroRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DepthZeroRadio = value; + } + } + + internal virtual Panel DepthPanel + { + get + { + return this._DepthPanel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DepthPanel = value; + } + } + + public DestinationMethodType Method + { + get + { + return this.pMethod; + } + set + { + this.pMethod = value; + } + } + + public string Source + { + get + { + return this.SourceTextBox.Text; + } + set + { + this.SourceTextBox.Text = value; + } + } + + public string Destination + { + get + { + return this.DestinationTextBox.Text; + } + set + { + this.DestinationTextBox.Text = value; + } + } + + public void Initialize(DestinationMethodType method, Uri sourceuri) + { + this.Method = method; + this.SourceTextBox.Text = sourceuri.ToString(); + } + + private void DestinationForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + this.DestinationTextBox.Text = this.SourceTextBox.Text; + switch (this.Method) + { + case DestinationMethodType.Copy: + this.OKButton.Text = "Copy"; + this.DepthPanel.Visible = true; + break; + case DestinationMethodType.Move: + this.OKButton.Text = "Move"; + this.DepthPanel.Visible = false; + break; + } + int num = this.DestinationTextBox.Text.LastIndexOf("/"); + if (num == checked (this.DestinationTextBox.Text.Length - 1)) + num = this.DestinationTextBox.Text.LastIndexOf("/", checked (num - 1)); + if (num < 0) + return; + this.DestinationTextBox.Select(checked (num + 1), checked (this.DestinationTextBox.Text.Length - num - 1)); + } + + private void DestinationForm_Shown(object sender, EventArgs e) + { + this.DestinationTextBox.Focus(); + } + + private void OKButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + private void DestinationTextBox_TextChanged(object sender, EventArgs e) + { + this.OKButton.Enabled = Operators.CompareString(this.SourceTextBox.Text, this.DestinationTextBox.Text, false) != 0; + } + } +} diff --git a/CarotDAV/DestinationForm.resx b/CarotDAV/DestinationForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/DestinationForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/DestinationMethodType.cs b/CarotDAV/DestinationMethodType.cs new file mode 100644 index 0000000..2e46e19 --- /dev/null +++ b/CarotDAV/DestinationMethodType.cs @@ -0,0 +1,14 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.DestinationMethodType +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public enum DestinationMethodType + { + Copy, + Move, + } +} diff --git a/CarotDAV/ErrorAction.cs b/CarotDAV/ErrorAction.cs new file mode 100644 index 0000000..c94c1d6 --- /dev/null +++ b/CarotDAV/ErrorAction.cs @@ -0,0 +1,16 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ErrorAction +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public enum ErrorAction + { + Ignore, + Retry, + AutoRetry, + Cancel, + } +} diff --git a/CarotDAV/ErrorPromptForm.cs b/CarotDAV/ErrorPromptForm.cs new file mode 100644 index 0000000..4289994 --- /dev/null +++ b/CarotDAV/ErrorPromptForm.cs @@ -0,0 +1,592 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ErrorPromptForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class ErrorPromptForm : Form + { + private IContainer components; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("IgnoreButton")] + private Button _IgnoreButton; + [AccessedThroughProperty("DescLabel")] + private Label _DescLabel; + [AccessedThroughProperty("IgnoreAllButton")] + private Button _IgnoreAllButton; + [AccessedThroughProperty("MessageLabel")] + private Label _MessageLabel; + [AccessedThroughProperty("DescTextBox")] + private TextBox _DescTextBox; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("TargetTextBox")] + private TextBox _TargetTextBox; + [AccessedThroughProperty("Timer1")] + private Timer _Timer1; + [AccessedThroughProperty("RetryButton")] + private Button _RetryButton; + private Exception pEx; + private string pMessage; + private string pTarget; + private ErrorPromptType pType; + private ErrorAction pAction; + private bool pToAll; + private int pRetryMinutes; + private DateTime pIdleStartTime; + + public ErrorPromptForm() + { + this.Load += new EventHandler(this.ErrorPromptForm_Load); + this.pMessage = string.Empty; + this.pTarget = string.Empty; + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + this.m_CancelButton = new Button(); + this.RetryButton = new Button(); + this.IgnoreButton = new Button(); + this.DescLabel = new Label(); + this.IgnoreAllButton = new Button(); + this.MessageLabel = new Label(); + this.DescTextBox = new TextBox(); + this.Label1 = new Label(); + this.TargetTextBox = new TextBox(); + this.Timer1 = new Timer(this.components); + this.SuspendLayout(); + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + Point point1 = new Point(288, 152); + Point point2 = point1; + mCancelButton1.Location = point2; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + Size size1 = new Size(72, 24); + Size size2 = size1; + mCancelButton2.Size = size2; + this.m_CancelButton.TabIndex = 8; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.RetryButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button retryButton1 = this.RetryButton; + point1 = new Point(184, 152); + Point point3 = point1; + retryButton1.Location = point3; + this.RetryButton.Name = "RetryButton"; + Button retryButton2 = this.RetryButton; + size1 = new Size(96, 24); + Size size3 = size1; + retryButton2.Size = size3; + this.RetryButton.TabIndex = 7; + this.RetryButton.Text = "Retry"; + this.RetryButton.UseVisualStyleBackColor = true; + this.IgnoreButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button ignoreButton1 = this.IgnoreButton; + point1 = new Point(104, 152); + Point point4 = point1; + ignoreButton1.Location = point4; + this.IgnoreButton.Name = "IgnoreButton"; + Button ignoreButton2 = this.IgnoreButton; + size1 = new Size(72, 25); + Size size4 = size1; + ignoreButton2.Size = size4; + this.IgnoreButton.TabIndex = 6; + this.IgnoreButton.Text = "Ignore"; + this.IgnoreButton.UseVisualStyleBackColor = true; + this.DescLabel.AutoSize = true; + Label descLabel1 = this.DescLabel; + point1 = new Point(8, 80); + Point point5 = point1; + descLabel1.Location = point5; + this.DescLabel.Name = "DescLabel"; + Label descLabel2 = this.DescLabel; + size1 = new Size(65, 12); + Size size5 = size1; + descLabel2.Size = size5; + this.DescLabel.TabIndex = 3; + this.DescLabel.Text = "Description:"; + this.IgnoreAllButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button ignoreAllButton1 = this.IgnoreAllButton; + point1 = new Point(24, 152); + Point point6 = point1; + ignoreAllButton1.Location = point6; + this.IgnoreAllButton.Name = "IgnoreAllButton"; + Button ignoreAllButton2 = this.IgnoreAllButton; + size1 = new Size(72, 24); + Size size6 = size1; + ignoreAllButton2.Size = size6; + this.IgnoreAllButton.TabIndex = 5; + this.IgnoreAllButton.Text = "Ignore All"; + this.IgnoreAllButton.UseVisualStyleBackColor = true; + this.MessageLabel.AutoSize = true; + Label messageLabel1 = this.MessageLabel; + point1 = new Point(8, 8); + Point point7 = point1; + messageLabel1.Location = point7; + this.MessageLabel.Name = "MessageLabel"; + Label messageLabel2 = this.MessageLabel; + size1 = new Size(79, 12); + Size size7 = size1; + messageLabel2.Size = size7; + this.MessageLabel.TabIndex = 0; + this.MessageLabel.Text = "Error Message"; + this.DescTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox descTextBox1 = this.DescTextBox; + point1 = new Point(8, 96); + Point point8 = point1; + descTextBox1.Location = point8; + this.DescTextBox.Multiline = true; + this.DescTextBox.Name = "DescTextBox"; + this.DescTextBox.ReadOnly = true; + TextBox descTextBox2 = this.DescTextBox; + size1 = new Size(352, 48); + Size size8 = size1; + descTextBox2.Size = size8; + this.DescTextBox.TabIndex = 4; + this.DescTextBox.TabStop = false; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 24); + Point point9 = point1; + label1_1.Location = point9; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(38, 12); + Size size9 = size1; + label1_2.Size = size9; + this.Label1.TabIndex = 1; + this.Label1.Text = "Target"; + this.TargetTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox targetTextBox1 = this.TargetTextBox; + point1 = new Point(8, 40); + Point point10 = point1; + targetTextBox1.Location = point10; + this.TargetTextBox.Multiline = true; + this.TargetTextBox.Name = "TargetTextBox"; + this.TargetTextBox.ReadOnly = true; + TextBox targetTextBox2 = this.TargetTextBox; + size1 = new Size(352, 32); + Size size10 = size1; + targetTextBox2.Size = size10; + this.TargetTextBox.TabIndex = 2; + this.TargetTextBox.TabStop = false; + this.AcceptButton = (IButtonControl) this.RetryButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(368, 184); + this.ClientSize = size1; + this.Controls.Add((Control) this.TargetTextBox); + this.Controls.Add((Control) this.RetryButton); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.DescTextBox); + this.Controls.Add((Control) this.DescLabel); + this.Controls.Add((Control) this.MessageLabel); + this.Controls.Add((Control) this.IgnoreButton); + this.Controls.Add((Control) this.IgnoreAllButton); + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(384, 222); + this.MinimumSize = size1; + this.Name = nameof (ErrorPromptForm); + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Error"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.m_CancelButton_Click); + if (this._m_CancelButton != null) + this._m_CancelButton.Click -= eventHandler; + this._m_CancelButton = value; + if (this._m_CancelButton == null) + return; + this._m_CancelButton.Click += eventHandler; + } + } + + internal virtual Button IgnoreButton + { + get + { + return this._IgnoreButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.IgnoreButton_Click); + if (this._IgnoreButton != null) + this._IgnoreButton.Click -= eventHandler; + this._IgnoreButton = value; + if (this._IgnoreButton == null) + return; + this._IgnoreButton.Click += eventHandler; + } + } + + internal virtual Label DescLabel + { + get + { + return this._DescLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DescLabel = value; + } + } + + internal virtual Button IgnoreAllButton + { + get + { + return this._IgnoreAllButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.IgnoreAllButton_Click); + if (this._IgnoreAllButton != null) + this._IgnoreAllButton.Click -= eventHandler; + this._IgnoreAllButton = value; + if (this._IgnoreAllButton == null) + return; + this._IgnoreAllButton.Click += eventHandler; + } + } + + internal virtual Label MessageLabel + { + get + { + return this._MessageLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MessageLabel = value; + } + } + + internal virtual TextBox DescTextBox + { + get + { + return this._DescTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DescTextBox = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual TextBox TargetTextBox + { + get + { + return this._TargetTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TargetTextBox = value; + } + } + + internal virtual Timer Timer1 + { + get + { + return this._Timer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.Timer1_Tick); + if (this._Timer1 != null) + this._Timer1.Tick -= eventHandler; + this._Timer1 = value; + if (this._Timer1 == null) + return; + this._Timer1.Tick += eventHandler; + } + } + + private virtual Button RetryButton + { + get + { + return this._RetryButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RetryButton_Click); + if (this._RetryButton != null) + this._RetryButton.Click -= eventHandler; + this._RetryButton = value; + if (this._RetryButton == null) + return; + this._RetryButton.Click += eventHandler; + } + } + + public Exception Exception + { + get + { + return this.pEx; + } + set + { + this.pEx = value; + } + } + + public string Message + { + get + { + return this.pMessage; + } + set + { + if (value == null) + value = string.Empty; + if (value.Length == 0) + value = "Unknown error occurred."; + this.pMessage = value; + } + } + + public string Target + { + get + { + return this.pTarget; + } + set + { + if (value == null) + value = string.Empty; + this.pTarget = value; + } + } + + public ErrorPromptType Type + { + get + { + return this.pType; + } + set + { + this.pType = value; + } + } + + public ErrorAction Action + { + get + { + return this.pAction; + } + set + { + this.pAction = value; + } + } + + public bool ToAll + { + get + { + return this.pToAll; + } + set + { + this.pToAll = value; + } + } + + private void ErrorPromptForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + this.MessageLabel.Text = this.pMessage; + this.TargetTextBox.Text = this.pTarget; + this.DescTextBox.Text = this.pEx.ToString(); + switch (this.Type) + { + case ErrorPromptType.RetryCancel: + this.IgnoreAllButton.Visible = false; + this.IgnoreButton.Visible = false; + this.RetryButton.Visible = true; + this.m_CancelButton.Visible = true; + break; + case ErrorPromptType.IgnoreCancel: + this.IgnoreAllButton.Visible = false; + this.IgnoreButton.Visible = true; + this.RetryButton.Visible = false; + this.m_CancelButton.Visible = true; + break; + case ErrorPromptType.IgnoreRetryCancel: + this.IgnoreAllButton.Visible = false; + this.IgnoreButton.Visible = true; + this.RetryButton.Visible = true; + this.m_CancelButton.Visible = true; + break; + case ErrorPromptType.IgnoreAllIgnoreCancel: + this.IgnoreAllButton.Visible = true; + this.IgnoreButton.Visible = true; + this.RetryButton.Visible = false; + this.m_CancelButton.Visible = true; + break; + case ErrorPromptType.IgnoreAllIgnoreRetryCancel: + this.IgnoreAllButton.Visible = true; + this.IgnoreButton.Visible = true; + this.RetryButton.Visible = true; + this.m_CancelButton.Visible = true; + break; + default: + throw new NotImplementedException(); + } + this.pIdleStartTime = DateTime.MaxValue; + this.Activate(); + this.Timer1.Start(); + } + + private void IgnoreAllButton_Click(object sender, EventArgs e) + { + this.ToAll = true; + this.Action = ErrorAction.Ignore; + this.DialogResult = DialogResult.OK; + } + + private void IgnoreButton_Click(object sender, EventArgs e) + { + this.ToAll = false; + this.Action = ErrorAction.Ignore; + this.DialogResult = DialogResult.OK; + } + + private void RetryButton_Click(object sender, EventArgs e) + { + this.ToAll = false; + this.Action = ErrorAction.Retry; + this.DialogResult = DialogResult.OK; + } + + private void m_CancelButton_Click(object sender, EventArgs e) + { + this.ToAll = false; + this.Action = ErrorAction.Cancel; + this.DialogResult = DialogResult.OK; + } + + public static ErrorPromptFormResult ShowDialog(IWin32Window owner, string message, string target, Exception ex, ErrorPromptType type, int retryminutes) + { + ErrorPromptFormResult promptFormResult = new ErrorPromptFormResult(); + using (ErrorPromptForm errorPromptForm = new ErrorPromptForm()) + { + errorPromptForm.Message = message; + errorPromptForm.Target = target; + errorPromptForm.Exception = ex; + errorPromptForm.Type = type; + errorPromptForm.pRetryMinutes = retryminutes; + int num = (int) errorPromptForm.ShowDialog(owner); + promptFormResult.Action = errorPromptForm.Action; + promptFormResult.ToAll = errorPromptForm.ToAll; + } + return promptFormResult; + } + + private void Timer1_Tick(object sender, EventArgs e) + { + if (this.pRetryMinutes < 0) + return; + if ((long) Misc.GetIdleTime() > 600000L) + { + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + this.pIdleStartTime = DateTime.Now; + } + else + { + if (Form.ActiveForm == this) + { + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + return; + this.pIdleStartTime = DateTime.MaxValue; + this.RetryButton.Text = "Retry"; + return; + } + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + this.pIdleStartTime = DateTime.Now; + } + if (DateTime.Compare(this.pIdleStartTime, DateTime.MaxValue) == 0) + return; + TimeSpan timeSpan = TimeSpan.FromMinutes((double) this.pRetryMinutes).Subtract(DateTime.Now.Subtract(this.pIdleStartTime)); + if (timeSpan.TotalSeconds < 0.0) + { + this.ToAll = false; + this.Action = ErrorAction.AutoRetry; + this.DialogResult = DialogResult.OK; + this.Close(); + } + else if (timeSpan.TotalSeconds <= 60.0) + this.RetryButton.Text = string.Format("Retry {0:f0}[s]", (object) timeSpan.TotalSeconds); + else if (timeSpan.TotalMinutes <= 60.0) + this.RetryButton.Text = string.Format("Retry {0:f0}[min]", (object) timeSpan.TotalMinutes); + else if (timeSpan.TotalHours <= 24.0) + this.RetryButton.Text = string.Format("Retry {0:f0}[h]", (object) timeSpan.TotalHours); + else + this.RetryButton.Text = "Retry"; + } + } +} diff --git a/CarotDAV/ErrorPromptForm.resx b/CarotDAV/ErrorPromptForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/ErrorPromptForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/ErrorPromptFormResult.cs b/CarotDAV/ErrorPromptFormResult.cs new file mode 100644 index 0000000..39b6ec2 --- /dev/null +++ b/CarotDAV/ErrorPromptFormResult.cs @@ -0,0 +1,14 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ErrorPromptFormResult +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public class ErrorPromptFormResult + { + public ErrorAction Action; + public bool ToAll; + } +} diff --git a/CarotDAV/ErrorPromptManager.cs b/CarotDAV/ErrorPromptManager.cs new file mode 100644 index 0000000..2557322 --- /dev/null +++ b/CarotDAV/ErrorPromptManager.cs @@ -0,0 +1,34 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ErrorPromptManager +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public class ErrorPromptManager + { + private bool pIgnoreAll; + + public bool IgnoreAll() + { + return this.pIgnoreAll; + } + + public void RegisterAction(ErrorPromptFormResult r) + { + if (!r.ToAll) + return; + if (r.Action == ErrorAction.Ignore) + { + this.pIgnoreAll = true; + } + else + { + if (r.Action != ErrorAction.Retry) + return; + this.pIgnoreAll = false; + } + } + } +} diff --git a/CarotDAV/ErrorPromptType.cs b/CarotDAV/ErrorPromptType.cs new file mode 100644 index 0000000..07bf456 --- /dev/null +++ b/CarotDAV/ErrorPromptType.cs @@ -0,0 +1,17 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ErrorPromptType +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +namespace CarotDAV +{ + public enum ErrorPromptType + { + RetryCancel, + IgnoreCancel, + IgnoreRetryCancel, + IgnoreAllIgnoreCancel, + IgnoreAllIgnoreRetryCancel, + } +} diff --git a/CarotDAV/ExceptionOccurredEventArgs.cs b/CarotDAV/ExceptionOccurredEventArgs.cs new file mode 100644 index 0000000..a79cbf5 --- /dev/null +++ b/CarotDAV/ExceptionOccurredEventArgs.cs @@ -0,0 +1,89 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ExceptionOccurredEventArgs +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System; + +namespace CarotDAV +{ + public class ExceptionOccurredEventArgs : EventArgs + { + private string pMessage; + private string pTarget; + private Exception pException; + private ErrorPromptType pType; + private ErrorPromptFormResult pResult; + private int pRetryMinutes; + + public ExceptionOccurredEventArgs(string message, string target, ErrorPromptType type, Exception ex, int retryminutes) + { + this.pMessage = message; + this.pException = ex; + this.pType = type; + this.pTarget = target; + this.pResult = new ErrorPromptFormResult(); + this.pResult.ToAll = false; + this.pResult.Action = ErrorAction.Ignore; + this.pRetryMinutes = retryminutes; + } + + public ExceptionOccurredEventArgs(string message, Uri target, ErrorPromptType type, Exception ex, int retryminutes) + : this(message, target.ToString(), type, ex, retryminutes) + { + } + + public string Message + { + get + { + return this.pMessage; + } + } + + public string Target + { + get + { + return this.pTarget; + } + } + + public ErrorPromptType Type + { + get + { + return this.pType; + } + } + + public Exception Exception + { + get + { + return this.pException; + } + } + + public ErrorPromptFormResult Result + { + get + { + return this.pResult; + } + set + { + this.pResult = value; + } + } + + public int RetryMinutes + { + get + { + return this.pRetryMinutes; + } + } + } +} diff --git a/CarotDAV/FsManager.cs b/CarotDAV/FsManager.cs new file mode 100644 index 0000000..ee1ee7a --- /dev/null +++ b/CarotDAV/FsManager.cs @@ -0,0 +1,192 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.FsManager +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Reflection; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class FsManager + { + private static List pFsTypeList = new List(); + private static List pFsNameTypeList = new List(); + private static Dictionary pFsTypeDllNameDic = new Dictionary(); + private static List pTryCreateMethodInfos = new List(); + private static Dictionary pGetDefaultFaviconMethodInfos = new Dictionary(); + private static string pFsBaseDllPath; + + public static System.Type[] FsTypes + { + get + { + return FsManager.pFsTypeList.ToArray(); + } + } + + public static void LoadFs() + { + string[] files = Directory.GetFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "*.dll"); + System.Type c = typeof (ConnectionSettingBase); + List stringList = new List(); + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + System.Type[] types1 = new System.Type[0]; + System.Type[] types2 = new System.Type[2] + { + typeof (Uri), + typeof (ConnectionSettingBase).MakeByRefType() + }; + System.Type[] types3 = new System.Type[0]; + FsManager.pFsBaseDllPath = Assembly.GetAssembly(typeof (FsBase)).Location; + AssemblyName[] referencedAssemblies = executingAssembly.GetReferencedAssemblies(); + int index1 = 0; + FsManager.TypeNamePair typeNamePair; + while (index1 < referencedAssemblies.Length) + { + AssemblyName assemblyRef = referencedAssemblies[index1]; + try + { + if (assemblyRef.FullName.StartsWith("Rei.Fs.")) + { + Assembly assembly = Assembly.Load(assemblyRef); + System.Type[] types4 = assembly.GetTypes(); + int index2 = 0; + while (index2 < types4.Length) + { + System.Type key = types4[index2]; + if (key.IsClass && key.IsPublic && (!key.IsAbstract && key.IsSubclassOf(c))) + { + PropertyInfo property = key.GetProperty("TypeName", BindingFlags.Static | BindingFlags.Public, (Binder) null, typeof (string), types1, (ParameterModifier[]) null); + if (property != null) + { + string str = (string) property.GetValue((object) null, (object[]) null); + if (str != null && !FsManager.pFsTypeList.Contains(key)) + { + FsManager.pFsTypeList.Add(key); + FsManager.pFsTypeDllNameDic.Add(key, assembly.Location); + typeNamePair.Type = key; + typeNamePair.Name = str; + FsManager.pFsNameTypeList.Add(typeNamePair); + MethodInfo method1 = key.GetMethod("TryCreate", BindingFlags.Static | BindingFlags.Public, (Binder) null, types2, (ParameterModifier[]) null); + if (method1 != null && method1.ReturnType == typeof (bool)) + FsManager.pTryCreateMethodInfos.Add(method1); + MethodInfo method2 = key.GetMethod("GetDefaultFavicon", BindingFlags.Static | BindingFlags.Public, (Binder) null, types3, (ParameterModifier[]) null); + if (method2 != null && method2.ReturnType == typeof (Icon)) + FsManager.pGetDefaultFaviconMethodInfos.Add(key, method2); + } + } + } + checked { ++index2; } + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + checked { ++index1; } + } + string[] strArray = files; + int index3 = 0; + while (index3 < strArray.Length) + { + string assemblyFile = strArray[index3]; + try + { + Assembly assembly = Assembly.LoadFrom(assemblyFile); + System.Type[] types4 = assembly.GetTypes(); + int index2 = 0; + while (index2 < types4.Length) + { + System.Type key = types4[index2]; + if (key.IsClass && key.IsPublic && (!key.IsAbstract && key.IsSubclassOf(c))) + { + PropertyInfo property = key.GetProperty("TypeName", BindingFlags.Static | BindingFlags.Public, (Binder) null, typeof (string), types1, (ParameterModifier[]) null); + if (property != null) + { + string str = (string) property.GetValue((object) null, (object[]) null); + if (str != null && !FsManager.pFsTypeList.Contains(key)) + { + FsManager.pFsTypeList.Add(key); + FsManager.pFsTypeDllNameDic.Add(key, assembly.Location); + typeNamePair.Type = key; + typeNamePair.Name = str; + FsManager.pFsNameTypeList.Add(typeNamePair); + MethodInfo method1 = key.GetMethod("TryCreate", BindingFlags.Static | BindingFlags.Public, (Binder) null, types2, (ParameterModifier[]) null); + if (method1 != null && method1.ReturnType == typeof (bool)) + FsManager.pTryCreateMethodInfos.Add(method1); + MethodInfo method2 = key.GetMethod("GetDefaultFavicon", BindingFlags.Static | BindingFlags.Public, (Binder) null, types3, (ParameterModifier[]) null); + if (method2 != null && method2.ReturnType == typeof (Icon)) + FsManager.pGetDefaultFaviconMethodInfos.Add(key, method2); + } + } + } + checked { ++index2; } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + checked { ++index3; } + } + } + + public static FsManager.TypeNamePair[] GetFsNameAndType() + { + return FsManager.pFsNameTypeList.ToArray(); + } + + public static bool TryCreate(Uri target, ref ConnectionSettingBase c) + { + int num1 = 0; + int num2 = checked (FsManager.pTryCreateMethodInfos.Count - 1); + int index = num1; + while (index <= num2) + { + object[] parameters = new object[2] + { + (object) target, + (object) null + }; + if ((bool) FsManager.pTryCreateMethodInfos[index].Invoke((object) null, parameters)) + { + c = (ConnectionSettingBase) parameters[1]; + return true; + } + checked { ++index; } + } + return false; + } + + public static Icon GetDefaultFavicon(System.Type type) + { + if (FsManager.pGetDefaultFaviconMethodInfos.ContainsKey(type)) + return (Icon) FsManager.pGetDefaultFaviconMethodInfos[type].Invoke((object) null, (object[]) null); + return ConnectionSettingBase.GetDefaultFavicon(); + } + + public static string GetDefaultFaviconPath(System.Type type) + { + if (FsManager.pGetDefaultFaviconMethodInfos.ContainsKey(type)) + return Path.Combine(Application.StartupPath, FsManager.pFsTypeDllNameDic[type]); + return FsManager.pFsBaseDllPath; + } + + public struct TypeNamePair + { + public System.Type Type; + public string Name; + } + } +} diff --git a/CarotDAV/FsTestForm.cs b/CarotDAV/FsTestForm.cs new file mode 100644 index 0000000..bdfa12f --- /dev/null +++ b/CarotDAV/FsTestForm.cs @@ -0,0 +1,4525 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.FsTestForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Net; +using System.Runtime.CompilerServices; +using System.Text; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class FsTestForm : Form + { + private IContainer components; + [AccessedThroughProperty("ButtonClose")] + private Button _ButtonClose; + [AccessedThroughProperty("ButtonGetInfoBasic")] + private Button _ButtonGetInfoBasic; + [AccessedThroughProperty("TextBox1")] + private TextBox _TextBox1; + [AccessedThroughProperty("ButtonGetEntries")] + private Button _ButtonGetEntries; + [AccessedThroughProperty("TextBox2")] + private TextBox _TextBox2; + [AccessedThroughProperty("ButtonClear")] + private Button _ButtonClear; + [AccessedThroughProperty("ButtonGetInfoRoot")] + private Button _ButtonGetInfoRoot; + [AccessedThroughProperty("ButtonCreate")] + private Button _ButtonCreate; + [AccessedThroughProperty("ButtonCopy")] + private Button _ButtonCopy; + [AccessedThroughProperty("ButtonMove")] + private Button _ButtonMove; + [AccessedThroughProperty("ButtonWrite")] + private Button _ButtonWrite; + [AccessedThroughProperty("ButtonWriteResume")] + private Button _ButtonWriteResume; + [AccessedThroughProperty("ButtonRead")] + private Button _ButtonRead; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("ButtonDelete")] + private Button _ButtonDelete; + [AccessedThroughProperty("CheckBoxF4")] + private CheckBox _CheckBoxF4; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("CheckBoxF6")] + private CheckBox _CheckBoxF6; + [AccessedThroughProperty("CheckBoxF1")] + private CheckBox _CheckBoxF1; + [AccessedThroughProperty("CheckBoxF5")] + private CheckBox _CheckBoxF5; + [AccessedThroughProperty("CheckBoxF2")] + private CheckBox _CheckBoxF2; + [AccessedThroughProperty("Label3")] + private Label _Label3; + [AccessedThroughProperty("CheckBoxE1")] + private CheckBox _CheckBoxE1; + [AccessedThroughProperty("CheckBoxE2")] + private CheckBox _CheckBoxE2; + [AccessedThroughProperty("CheckBoxE4")] + private CheckBox _CheckBoxE4; + [AccessedThroughProperty("CheckBoxE6")] + private CheckBox _CheckBoxE6; + [AccessedThroughProperty("CheckBoxF3")] + private CheckBox _CheckBoxF3; + [AccessedThroughProperty("CheckBoxF7")] + private CheckBox _CheckBoxF7; + [AccessedThroughProperty("CheckBoxE5")] + private CheckBox _CheckBoxE5; + [AccessedThroughProperty("CheckBoxR3")] + private CheckBox _CheckBoxR3; + [AccessedThroughProperty("CheckBoxR1")] + private CheckBox _CheckBoxR1; + [AccessedThroughProperty("CheckBoxR2")] + private CheckBox _CheckBoxR2; + [AccessedThroughProperty("CheckBoxF8")] + private CheckBox _CheckBoxF8; + [AccessedThroughProperty("TextBoxExceptChar")] + private TextBox _TextBoxExceptChar; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("TextBoxFileSize")] + private TextBox _TextBoxFileSize; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("CheckBoxL")] + private CheckBox _CheckBoxL; + [AccessedThroughProperty("CheckBoxR")] + private CheckBox _CheckBoxR; + [AccessedThroughProperty("CheckBoxW")] + private CheckBox _CheckBoxW; + [AccessedThroughProperty("CheckBoxC")] + private CheckBox _CheckBoxC; + [AccessedThroughProperty("CheckBoxCP")] + private CheckBox _CheckBoxCP; + [AccessedThroughProperty("CheckBoxMV")] + private CheckBox _CheckBoxMV; + [AccessedThroughProperty("CheckBoxRN")] + private CheckBox _CheckBoxRN; + [AccessedThroughProperty("CheckBoxLO")] + private CheckBox _CheckBoxLO; + [AccessedThroughProperty("CheckBoxLMT")] + private CheckBox _CheckBoxLMT; + [AccessedThroughProperty("CheckBoxCT")] + private CheckBox _CheckBoxCT; + [AccessedThroughProperty("CheckBoxLAT")] + private CheckBox _CheckBoxLAT; + [AccessedThroughProperty("CheckBoxPR")] + private CheckBox _CheckBoxPR; + [AccessedThroughProperty("CheckBoxPW")] + private CheckBox _CheckBoxPW; + [AccessedThroughProperty("CheckBoxPP")] + private CheckBox _CheckBoxPP; + [AccessedThroughProperty("CheckBoxIG")] + private CheckBox _CheckBoxIG; + [AccessedThroughProperty("Label6")] + private Label _Label6; + [AccessedThroughProperty("CheckBoxF9")] + private CheckBox _CheckBoxF9; + [AccessedThroughProperty("CheckBoxE3")] + private CheckBox _CheckBoxE3; + [AccessedThroughProperty("CheckBoxE0")] + private CheckBox _CheckBoxE0; + [AccessedThroughProperty("ButtonWriteOver")] + private Button _ButtonWriteOver; + [AccessedThroughProperty("CheckBoxOW")] + private CheckBox _CheckBoxOW; + [AccessedThroughProperty("ButtonSetTimes")] + private Button _ButtonSetTimes; + [AccessedThroughProperty("CheckBoxFT")] + private CheckBox _CheckBoxFT; + [AccessedThroughProperty("Label7")] + private Label _Label7; + [AccessedThroughProperty("ButtonCopyOverWrite")] + private Button _ButtonCopyOverWrite; + [AccessedThroughProperty("ButtonMoveOverWrite")] + private Button _ButtonMoveOverWrite; + [AccessedThroughProperty("CheckBoxMoveOver")] + private CheckBox _CheckBoxMoveOver; + [AccessedThroughProperty("CheckBoxCopyOver")] + private CheckBox _CheckBoxCopyOver; + [AccessedThroughProperty("CheckBoxSameName")] + private CheckBox _CheckBoxSameName; + private FsBase pFS; + private CacheManager pCache; + private UCSNormalization pUploadFilenameNormalization; + private UCSNormalization pDownloadFilenameNormalization; + private string[] Name_asc; + private string[] Name_space; + private string[] Name_long; + private string[] Name_symbol1; + private string[] Name_symbol2; + private string[] Name_symbol3; + private string[] Name_uni; + private string[] Name_longuni; + private string[] Name_bwspace; + private string[] Ext_none; + private string[] Ext_txt; + private string[] Ext_zip; + private string[] Ext_data; + private string[] Ext_bin; + private string[] Ext_uni; + private string[] Ext_multi; + private long DefFileSize; + private int seed; + private int seed2; + + public FsTestForm() + { + this.Load += new EventHandler(this.FsTestForm_Load); + this.Name_asc = new string[3] + { + "testtest", + "TESTTEST", + "TEST0123" + }; + this.Name_space = new string[2]{ "t e s t", "test " }; + this.Name_long = new string[1] + { + "This is a test long filename for CarotDAV" + }; + this.Name_symbol1 = new string[3] + { + "!$'()", + "+,-.;=@[", + "]^_`{}" + }; + this.Name_symbol2 = new string[2]{ "\"*:", "<>?\\|" }; + this.Name_symbol3 = new string[1]{ "#%&~" }; + this.Name_uni = new string[3] + { + "あイ一丁\x2462", + "\x2460\x2461\x2462\x2463", + "纊褜云鍈柿蓜" + }; + this.Name_longuni = new string[1] + { + "これはCarotDAVのテストで用いるファイルです。" + }; + this.Name_bwspace = new string[1]{ " test" }; + this.Ext_none = new string[1]{ "" }; + this.Ext_txt = new string[4] + { + ".txt", + ".doc", + ".xls", + ".pdf" + }; + this.Ext_zip = new string[2]{ ".zip", ".rar" }; + this.Ext_data = new string[2]{ ".dat", ".cpp" }; + this.Ext_bin = new string[4] + { + ".exe", + ".com", + ".db", + ".info" + }; + this.Ext_uni = new string[2]{ ".もふ", ".\x2460" }; + this.Ext_multi = new string[3] + { + ".tar.gz", + ".txt.txt.txt", + ".exe.com.bin.doc" + }; + this.DefFileSize = 10240L; + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.ButtonClose = new Button(); + this.ButtonGetInfoBasic = new Button(); + this.TextBox1 = new TextBox(); + this.ButtonGetEntries = new Button(); + this.TextBox2 = new TextBox(); + this.ButtonClear = new Button(); + this.ButtonGetInfoRoot = new Button(); + this.ButtonCreate = new Button(); + this.ButtonCopy = new Button(); + this.ButtonMove = new Button(); + this.ButtonWrite = new Button(); + this.ButtonWriteResume = new Button(); + this.ButtonRead = new Button(); + this.Label1 = new Label(); + this.ButtonDelete = new Button(); + this.CheckBoxF4 = new CheckBox(); + this.Label2 = new Label(); + this.CheckBoxF6 = new CheckBox(); + this.CheckBoxF1 = new CheckBox(); + this.CheckBoxF5 = new CheckBox(); + this.CheckBoxF2 = new CheckBox(); + this.Label3 = new Label(); + this.CheckBoxE1 = new CheckBox(); + this.CheckBoxE2 = new CheckBox(); + this.CheckBoxE4 = new CheckBox(); + this.CheckBoxE6 = new CheckBox(); + this.CheckBoxF3 = new CheckBox(); + this.CheckBoxF7 = new CheckBox(); + this.CheckBoxE5 = new CheckBox(); + this.CheckBoxR3 = new CheckBox(); + this.CheckBoxR1 = new CheckBox(); + this.CheckBoxR2 = new CheckBox(); + this.CheckBoxF8 = new CheckBox(); + this.TextBoxExceptChar = new TextBox(); + this.Label4 = new Label(); + this.TextBoxFileSize = new TextBox(); + this.Label5 = new Label(); + this.CheckBoxL = new CheckBox(); + this.CheckBoxR = new CheckBox(); + this.CheckBoxW = new CheckBox(); + this.CheckBoxC = new CheckBox(); + this.CheckBoxCP = new CheckBox(); + this.CheckBoxMV = new CheckBox(); + this.CheckBoxRN = new CheckBox(); + this.CheckBoxLO = new CheckBox(); + this.CheckBoxLMT = new CheckBox(); + this.CheckBoxCT = new CheckBox(); + this.CheckBoxLAT = new CheckBox(); + this.CheckBoxPR = new CheckBox(); + this.CheckBoxPW = new CheckBox(); + this.CheckBoxPP = new CheckBox(); + this.CheckBoxIG = new CheckBox(); + this.Label6 = new Label(); + this.CheckBoxF9 = new CheckBox(); + this.CheckBoxE3 = new CheckBox(); + this.CheckBoxE0 = new CheckBox(); + this.ButtonWriteOver = new Button(); + this.CheckBoxOW = new CheckBox(); + this.ButtonSetTimes = new Button(); + this.CheckBoxFT = new CheckBox(); + this.Label7 = new Label(); + this.ButtonCopyOverWrite = new Button(); + this.ButtonMoveOverWrite = new Button(); + this.CheckBoxMoveOver = new CheckBox(); + this.CheckBoxCopyOver = new CheckBox(); + this.CheckBoxSameName = new CheckBox(); + this.SuspendLayout(); + this.ButtonClose.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.ButtonClose.DialogResult = DialogResult.Cancel; + Button buttonClose1 = this.ButtonClose; + Point point1 = new Point(680, 489); + Point point2 = point1; + buttonClose1.Location = point2; + this.ButtonClose.Name = "ButtonClose"; + Button buttonClose2 = this.ButtonClose; + Size size1 = new Size(72, 24); + Size size2 = size1; + buttonClose2.Size = size2; + this.ButtonClose.TabIndex = 65; + this.ButtonClose.Text = "Close"; + this.ButtonClose.UseVisualStyleBackColor = true; + Button buttonGetInfoBasic1 = this.ButtonGetInfoBasic; + point1 = new Point(8, 80); + Point point3 = point1; + buttonGetInfoBasic1.Location = point3; + this.ButtonGetInfoBasic.Name = "ButtonGetInfoBasic"; + Button buttonGetInfoBasic2 = this.ButtonGetInfoBasic; + size1 = new Size(104, 24); + Size size3 = size1; + buttonGetInfoBasic2.Size = size3; + this.ButtonGetInfoBasic.TabIndex = 3; + this.ButtonGetInfoBasic.Text = "GetInfo Basic"; + this.ButtonGetInfoBasic.UseVisualStyleBackColor = true; + this.TextBox1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBox1_1 = this.TextBox1; + point1 = new Point(8, 301); + Point point4 = point1; + textBox1_1.Location = point4; + this.TextBox1.Multiline = true; + this.TextBox1.Name = "TextBox1"; + this.TextBox1.ScrollBars = ScrollBars.Both; + TextBox textBox1_2 = this.TextBox1; + size1 = new Size(744, 180); + Size size4 = size1; + textBox1_2.Size = size4; + this.TextBox1.TabIndex = 63; + Button buttonGetEntries1 = this.ButtonGetEntries; + point1 = new Point(8, 112); + Point point5 = point1; + buttonGetEntries1.Location = point5; + this.ButtonGetEntries.Name = "ButtonGetEntries"; + Button buttonGetEntries2 = this.ButtonGetEntries; + size1 = new Size(104, 24); + Size size5 = size1; + buttonGetEntries2.Size = size5; + this.ButtonGetEntries.TabIndex = 4; + this.ButtonGetEntries.Text = "GetEntries"; + this.ButtonGetEntries.UseVisualStyleBackColor = true; + this.TextBox2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBox2_1 = this.TextBox2; + point1 = new Point(8, 24); + Point point6 = point1; + textBox2_1.Location = point6; + this.TextBox2.Name = "TextBox2"; + TextBox textBox2_2 = this.TextBox2; + size1 = new Size(744, 19); + Size size6 = size1; + textBox2_2.Size = size6; + this.TextBox2.TabIndex = 1; + this.ButtonClear.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.ButtonClear.DialogResult = DialogResult.Cancel; + Button buttonClear1 = this.ButtonClear; + point1 = new Point(600, 489); + Point point7 = point1; + buttonClear1.Location = point7; + this.ButtonClear.Name = "ButtonClear"; + Button buttonClear2 = this.ButtonClear; + size1 = new Size(72, 24); + Size size7 = size1; + buttonClear2.Size = size7; + this.ButtonClear.TabIndex = 64; + this.ButtonClear.Text = "Clear"; + this.ButtonClear.UseVisualStyleBackColor = true; + Button buttonGetInfoRoot1 = this.ButtonGetInfoRoot; + point1 = new Point(8, 48); + Point point8 = point1; + buttonGetInfoRoot1.Location = point8; + this.ButtonGetInfoRoot.Name = "ButtonGetInfoRoot"; + Button buttonGetInfoRoot2 = this.ButtonGetInfoRoot; + size1 = new Size(104, 24); + Size size8 = size1; + buttonGetInfoRoot2.Size = size8; + this.ButtonGetInfoRoot.TabIndex = 2; + this.ButtonGetInfoRoot.Text = "GetInfo Root"; + this.ButtonGetInfoRoot.UseVisualStyleBackColor = true; + Button buttonCreate1 = this.ButtonCreate; + point1 = new Point(136, 48); + Point point9 = point1; + buttonCreate1.Location = point9; + this.ButtonCreate.Name = "ButtonCreate"; + Button buttonCreate2 = this.ButtonCreate; + size1 = new Size(104, 24); + Size size9 = size1; + buttonCreate2.Size = size9; + this.ButtonCreate.TabIndex = 9; + this.ButtonCreate.Text = "Create"; + this.ButtonCreate.UseVisualStyleBackColor = true; + Button buttonCopy1 = this.ButtonCopy; + point1 = new Point(136, 240); + Point point10 = point1; + buttonCopy1.Location = point10; + this.ButtonCopy.Name = "ButtonCopy"; + Button buttonCopy2 = this.ButtonCopy; + size1 = new Size(48, 24); + Size size10 = size1; + buttonCopy2.Size = size10; + this.ButtonCopy.TabIndex = 16; + this.ButtonCopy.Text = "Copy"; + this.ButtonCopy.UseVisualStyleBackColor = true; + Button buttonMove1 = this.ButtonMove; + point1 = new Point(136, 208); + Point point11 = point1; + buttonMove1.Location = point11; + this.ButtonMove.Name = "ButtonMove"; + Button buttonMove2 = this.ButtonMove; + size1 = new Size(48, 24); + Size size11 = size1; + buttonMove2.Size = size11; + this.ButtonMove.TabIndex = 14; + this.ButtonMove.Text = "Move"; + this.ButtonMove.UseVisualStyleBackColor = true; + Button buttonWrite1 = this.ButtonWrite; + point1 = new Point(136, 112); + Point point12 = point1; + buttonWrite1.Location = point12; + this.ButtonWrite.Name = "ButtonWrite"; + Button buttonWrite2 = this.ButtonWrite; + size1 = new Size(104, 24); + Size size12 = size1; + buttonWrite2.Size = size12; + this.ButtonWrite.TabIndex = 11; + this.ButtonWrite.Text = "Write"; + this.ButtonWrite.UseVisualStyleBackColor = true; + Button buttonWriteResume1 = this.ButtonWriteResume; + point1 = new Point(136, 176); + Point point13 = point1; + buttonWriteResume1.Location = point13; + this.ButtonWriteResume.Name = "ButtonWriteResume"; + Button buttonWriteResume2 = this.ButtonWriteResume; + size1 = new Size(104, 24); + Size size13 = size1; + buttonWriteResume2.Size = size13; + this.ButtonWriteResume.TabIndex = 13; + this.ButtonWriteResume.Text = "*WriteResume"; + this.ButtonWriteResume.UseVisualStyleBackColor = true; + Button buttonRead1 = this.ButtonRead; + point1 = new Point(8, 144); + Point point14 = point1; + buttonRead1.Location = point14; + this.ButtonRead.Name = "ButtonRead"; + Button buttonRead2 = this.ButtonRead; + size1 = new Size(104, 24); + Size size14 = size1; + buttonRead2.Size = size14; + this.ButtonRead.TabIndex = 5; + this.ButtonRead.Text = "Read"; + this.ButtonRead.UseVisualStyleBackColor = true; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 8); + Point point15 = point1; + label1_1.Location = point15; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(50, 12); + Size size15 = size1; + label1_2.Size = size15; + this.Label1.TabIndex = 0; + this.Label1.Text = "Base Uri"; + Button buttonDelete1 = this.ButtonDelete; + point1 = new Point(136, 80); + Point point16 = point1; + buttonDelete1.Location = point16; + this.ButtonDelete.Name = "ButtonDelete"; + Button buttonDelete2 = this.ButtonDelete; + size1 = new Size(104, 24); + Size size16 = size1; + buttonDelete2.Size = size16; + this.ButtonDelete.TabIndex = 10; + this.ButtonDelete.Text = "Delete"; + this.ButtonDelete.UseVisualStyleBackColor = true; + this.CheckBoxF4.AutoSize = true; + this.CheckBoxF4.Checked = true; + this.CheckBoxF4.CheckState = CheckState.Checked; + CheckBox checkBoxF4_1 = this.CheckBoxF4; + point1 = new Point(264, 120); + Point point17 = point1; + checkBoxF4_1.Location = point17; + this.CheckBoxF4.Name = "CheckBoxF4"; + CheckBox checkBoxF4_2 = this.CheckBoxF4; + size1 = new Size(149, 16); + Size size17 = size1; + checkBoxF4_2.Size = size17; + this.CheckBoxF4.TabIndex = 23; + this.CheckBoxF4.Text = "symbol1 !$'()+,-.;=@[]^_`{}"; + this.CheckBoxF4.UseVisualStyleBackColor = true; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(248, 56); + Point point18 = point1; + label2_1.Location = point18; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(105, 12); + Size size18 = size1; + label2_2.Size = size18; + this.Label2.TabIndex = 19; + this.Label2.Text = "Filename Charactor"; + this.CheckBoxF6.AutoSize = true; + this.CheckBoxF6.Checked = true; + this.CheckBoxF6.CheckState = CheckState.Checked; + CheckBox checkBoxF6_1 = this.CheckBoxF6; + point1 = new Point(264, 168); + Point point19 = point1; + checkBoxF6_1.Location = point19; + this.CheckBoxF6.Name = "CheckBoxF6"; + CheckBox checkBoxF6_2 = this.CheckBoxF6; + size1 = new Size(71, 16); + Size size19 = size1; + checkBoxF6_2.Size = size19; + this.CheckBoxF6.TabIndex = 26; + this.CheckBoxF6.Text = "Unicode1"; + this.CheckBoxF6.UseVisualStyleBackColor = true; + this.CheckBoxF1.AutoSize = true; + this.CheckBoxF1.Checked = true; + this.CheckBoxF1.CheckState = CheckState.Checked; + CheckBox checkBoxF1_1 = this.CheckBoxF1; + point1 = new Point(264, 72); + Point point20 = point1; + checkBoxF1_1.Location = point20; + this.CheckBoxF1.Name = "CheckBoxF1"; + CheckBox checkBoxF1_2 = this.CheckBoxF1; + size1 = new Size(60, 16); + Size size20 = size1; + checkBoxF1_2.Size = size20; + this.CheckBoxF1.TabIndex = 20; + this.CheckBoxF1.Text = "abc012"; + this.CheckBoxF1.UseVisualStyleBackColor = true; + this.CheckBoxF5.AutoSize = true; + CheckBox checkBoxF5_1 = this.CheckBoxF5; + point1 = new Point(264, 152); + Point point21 = point1; + checkBoxF5_1.Location = point21; + this.CheckBoxF5.Name = "CheckBoxF5"; + CheckBox checkBoxF5_2 = this.CheckBoxF5; + size1 = new Size(122, 16); + Size size21 = size1; + checkBoxF5_2.Size = size21; + this.CheckBoxF5.TabIndex = 25; + this.CheckBoxF5.Text = "*symbol3 \"*/:<>?\\|"; + this.CheckBoxF5.UseVisualStyleBackColor = true; + this.CheckBoxF2.AutoSize = true; + this.CheckBoxF2.Checked = true; + this.CheckBoxF2.CheckState = CheckState.Checked; + CheckBox checkBoxF2_1 = this.CheckBoxF2; + point1 = new Point(264, 88); + Point point22 = point1; + checkBoxF2_1.Location = point22; + this.CheckBoxF2.Name = "CheckBoxF2"; + CheckBox checkBoxF2_2 = this.CheckBoxF2; + size1 = new Size(54, 16); + Size size22 = size1; + checkBoxF2_2.Size = size22; + this.CheckBoxF2.TabIndex = 21; + this.CheckBoxF2.Text = "space"; + this.CheckBoxF2.UseVisualStyleBackColor = true; + this.Label3.AutoSize = true; + Label label3_1 = this.Label3; + point1 = new Point(416, 56); + Point point23 = point1; + label3_1.Location = point23; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(55, 12); + Size size23 = size1; + label3_2.Size = size23; + this.Label3.TabIndex = 31; + this.Label3.Text = "Extension"; + this.CheckBoxE1.AutoSize = true; + this.CheckBoxE1.Checked = true; + this.CheckBoxE1.CheckState = CheckState.Checked; + CheckBox checkBoxE1_1 = this.CheckBoxE1; + point1 = new Point(424, 88); + Point point24 = point1; + checkBoxE1_1.Location = point24; + this.CheckBoxE1.Name = "CheckBoxE1"; + CheckBox checkBoxE1_2 = this.CheckBoxE1; + size1 = new Size(107, 16); + Size size24 = size1; + checkBoxE1_2.Size = size24; + this.CheckBoxE1.TabIndex = 33; + this.CheckBoxE1.Text = ".txt .doc .xls .pdf"; + this.CheckBoxE1.UseVisualStyleBackColor = true; + this.CheckBoxE2.AutoSize = true; + this.CheckBoxE2.Checked = true; + this.CheckBoxE2.CheckState = CheckState.Checked; + CheckBox checkBoxE2_1 = this.CheckBoxE2; + point1 = new Point(424, 104); + Point point25 = point1; + checkBoxE2_1.Location = point25; + this.CheckBoxE2.Name = "CheckBoxE2"; + CheckBox checkBoxE2_2 = this.CheckBoxE2; + size1 = new Size(60, 16); + Size size25 = size1; + checkBoxE2_2.Size = size25; + this.CheckBoxE2.TabIndex = 34; + this.CheckBoxE2.Text = ".zip .rar"; + this.CheckBoxE2.UseVisualStyleBackColor = true; + this.CheckBoxE4.AutoSize = true; + this.CheckBoxE4.Checked = true; + this.CheckBoxE4.CheckState = CheckState.Checked; + CheckBox checkBoxE4_1 = this.CheckBoxE4; + point1 = new Point(424, 136); + Point point26 = point1; + checkBoxE4_1.Location = point26; + this.CheckBoxE4.Name = "CheckBoxE4"; + CheckBox checkBoxE4_2 = this.CheckBoxE4; + size1 = new Size(114, 16); + Size size26 = size1; + checkBoxE4_2.Size = size26; + this.CheckBoxE4.TabIndex = 36; + this.CheckBoxE4.Text = ".exe .com .db .info"; + this.CheckBoxE4.UseVisualStyleBackColor = true; + this.CheckBoxE6.AutoSize = true; + this.CheckBoxE6.Checked = true; + this.CheckBoxE6.CheckState = CheckState.Checked; + CheckBox checkBoxE6_1 = this.CheckBoxE6; + point1 = new Point(424, 168); + Point point27 = point1; + checkBoxE6_1.Location = point27; + this.CheckBoxE6.Name = "CheckBoxE6"; + CheckBox checkBoxE6_2 = this.CheckBoxE6; + size1 = new Size(49, 16); + Size size27 = size1; + checkBoxE6_2.Size = size27; + this.CheckBoxE6.TabIndex = 38; + this.CheckBoxE6.Text = "multi"; + this.CheckBoxE6.UseVisualStyleBackColor = true; + this.CheckBoxF3.AutoSize = true; + this.CheckBoxF3.Checked = true; + this.CheckBoxF3.CheckState = CheckState.Checked; + CheckBox checkBoxF3_1 = this.CheckBoxF3; + point1 = new Point(264, 104); + Point point28 = point1; + checkBoxF3_1.Location = point28; + this.CheckBoxF3.Name = "CheckBoxF3"; + CheckBox checkBoxF3_2 = this.CheckBoxF3; + size1 = new Size(67, 16); + Size size28 = size1; + checkBoxF3_2.Size = size28; + this.CheckBoxF3.TabIndex = 22; + this.CheckBoxF3.Text = "long asc"; + this.CheckBoxF3.UseVisualStyleBackColor = true; + this.CheckBoxF7.AutoSize = true; + this.CheckBoxF7.Checked = true; + this.CheckBoxF7.CheckState = CheckState.Checked; + CheckBox checkBoxF7_1 = this.CheckBoxF7; + point1 = new Point(264, 184); + Point point29 = point1; + checkBoxF7_1.Location = point29; + this.CheckBoxF7.Name = "CheckBoxF7"; + CheckBox checkBoxF7_2 = this.CheckBoxF7; + size1 = new Size(66, 16); + Size size29 = size1; + checkBoxF7_2.Size = size29; + this.CheckBoxF7.TabIndex = 27; + this.CheckBoxF7.Text = "long Uni"; + this.CheckBoxF7.UseVisualStyleBackColor = true; + this.CheckBoxE5.AutoSize = true; + this.CheckBoxE5.Checked = true; + this.CheckBoxE5.CheckState = CheckState.Checked; + CheckBox checkBoxE5_1 = this.CheckBoxE5; + point1 = new Point(424, 152); + Point point30 = point1; + checkBoxE5_1.Location = point30; + this.CheckBoxE5.Name = "CheckBoxE5"; + CheckBox checkBoxE5_2 = this.CheckBoxE5; + size1 = new Size(71, 16); + Size size30 = size1; + checkBoxE5_2.Size = size30; + this.CheckBoxE5.TabIndex = 37; + this.CheckBoxE5.Text = "Unicode1"; + this.CheckBoxE5.UseVisualStyleBackColor = true; + this.CheckBoxR3.AutoSize = true; + CheckBox checkBoxR3_1 = this.CheckBoxR3; + point1 = new Point(8, 216); + Point point31 = point1; + checkBoxR3_1.Location = point31; + this.CheckBoxR3.Name = "CheckBoxR3"; + CheckBox checkBoxR3_2 = this.CheckBoxR3; + size1 = new Size(136, 16); + Size size31 = size1; + checkBoxR3_2.Size = size31; + this.CheckBoxR3.TabIndex = 8; + this.CheckBoxR3.Text = "*check other property"; + this.CheckBoxR3.UseVisualStyleBackColor = true; + this.CheckBoxR1.AutoSize = true; + this.CheckBoxR1.Checked = true; + this.CheckBoxR1.CheckState = CheckState.Checked; + CheckBox checkBoxR1_1 = this.CheckBoxR1; + point1 = new Point(8, 184); + Point point32 = point1; + checkBoxR1_1.Location = point32; + this.CheckBoxR1.Name = "CheckBoxR1"; + CheckBox checkBoxR1_2 = this.CheckBoxR1; + size1 = new Size(80, 16); + Size size32 = size1; + checkBoxR1_2.Size = size32; + this.CheckBoxR1.TabIndex = 6; + this.CheckBoxR1.Text = "check date"; + this.CheckBoxR1.UseVisualStyleBackColor = true; + this.CheckBoxR2.AutoSize = true; + this.CheckBoxR2.Checked = true; + this.CheckBoxR2.CheckState = CheckState.Checked; + CheckBox checkBoxR2_1 = this.CheckBoxR2; + point1 = new Point(8, 200); + Point point33 = point1; + checkBoxR2_1.Location = point33; + this.CheckBoxR2.Name = "CheckBoxR2"; + CheckBox checkBoxR2_2 = this.CheckBoxR2; + size1 = new Size(89, 16); + Size size33 = size1; + checkBoxR2_2.Size = size33; + this.CheckBoxR2.TabIndex = 7; + this.CheckBoxR2.Text = "check ability"; + this.CheckBoxR2.UseVisualStyleBackColor = true; + this.CheckBoxF8.AutoSize = true; + this.CheckBoxF8.Checked = true; + this.CheckBoxF8.CheckState = CheckState.Checked; + CheckBox checkBoxF8_1 = this.CheckBoxF8; + point1 = new Point(264, 136); + Point point34 = point1; + checkBoxF8_1.Location = point34; + this.CheckBoxF8.Name = "CheckBoxF8"; + CheckBox checkBoxF8_2 = this.CheckBoxF8; + size1 = new Size(94, 16); + Size size34 = size1; + checkBoxF8_2.Size = size34; + this.CheckBoxF8.TabIndex = 24; + this.CheckBoxF8.Text = "symbol2 #%&&~"; + this.CheckBoxF8.UseVisualStyleBackColor = true; + TextBox textBoxExceptChar1 = this.TextBoxExceptChar; + point1 = new Point(264, 240); + Point point35 = point1; + textBoxExceptChar1.Location = point35; + this.TextBoxExceptChar.Name = "TextBoxExceptChar"; + TextBox textBoxExceptChar2 = this.TextBoxExceptChar; + size1 = new Size(100, 19); + Size size35 = size1; + textBoxExceptChar2.Size = size35; + this.TextBoxExceptChar.TabIndex = 30; + this.TextBoxExceptChar.Text = "'"; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(256, 224); + Point point36 = point1; + label4_1.Location = point36; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(98, 12); + Size size36 = size1; + label4_2.Size = size36; + this.Label4.TabIndex = 29; + this.Label4.Text = "Except charactors"; + TextBox textBoxFileSize1 = this.TextBoxFileSize; + point1 = new Point(424, 240); + Point point37 = point1; + textBoxFileSize1.Location = point37; + this.TextBoxFileSize.Name = "TextBoxFileSize"; + TextBox textBoxFileSize2 = this.TextBoxFileSize; + size1 = new Size(100, 19); + Size size37 = size1; + textBoxFileSize2.Size = size37; + this.TextBoxFileSize.TabIndex = 42; + this.TextBoxFileSize.Text = "2500"; + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + point1 = new Point(416, 224); + Point point38 = point1; + label5_1.Location = point38; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + size1 = new Size(91, 12); + Size size38 = size1; + label5_2.Size = size38; + this.Label5.TabIndex = 41; + this.Label5.Text = "File Size [kByte]"; + this.CheckBoxL.AutoSize = true; + this.CheckBoxL.Enabled = false; + CheckBox checkBoxL1 = this.CheckBoxL; + point1 = new Point(592, 72); + Point point39 = point1; + checkBoxL1.Location = point39; + this.CheckBoxL.Name = "CheckBoxL"; + CheckBox checkBoxL2 = this.CheckBoxL; + size1 = new Size(58, 16); + Size size39 = size1; + checkBoxL2.Size = size39; + this.CheckBoxL.TabIndex = 44; + this.CheckBoxL.Text = "Listing"; + this.CheckBoxL.UseVisualStyleBackColor = true; + this.CheckBoxR.AutoSize = true; + this.CheckBoxR.Enabled = false; + CheckBox checkBoxR1 = this.CheckBoxR; + point1 = new Point(592, 88); + Point point40 = point1; + checkBoxR1.Location = point40; + this.CheckBoxR.Name = "CheckBoxR"; + CheckBox checkBoxR2 = this.CheckBoxR; + size1 = new Size(50, 16); + Size size40 = size1; + checkBoxR2.Size = size40; + this.CheckBoxR.TabIndex = 45; + this.CheckBoxR.Text = "Read"; + this.CheckBoxR.UseVisualStyleBackColor = true; + this.CheckBoxW.AutoSize = true; + this.CheckBoxW.Enabled = false; + CheckBox checkBoxW1 = this.CheckBoxW; + point1 = new Point(592, 104); + Point point41 = point1; + checkBoxW1.Location = point41; + this.CheckBoxW.Name = "CheckBoxW"; + CheckBox checkBoxW2 = this.CheckBoxW; + size1 = new Size(50, 16); + Size size41 = size1; + checkBoxW2.Size = size41; + this.CheckBoxW.TabIndex = 46; + this.CheckBoxW.Text = "Write"; + this.CheckBoxW.UseVisualStyleBackColor = true; + this.CheckBoxC.AutoSize = true; + this.CheckBoxC.Enabled = false; + CheckBox checkBoxC1 = this.CheckBoxC; + point1 = new Point(592, 120); + Point point42 = point1; + checkBoxC1.Location = point42; + this.CheckBoxC.Name = "CheckBoxC"; + CheckBox checkBoxC2 = this.CheckBoxC; + size1 = new Size(75, 16); + Size size42 = size1; + checkBoxC2.Size = size42; + this.CheckBoxC.TabIndex = 47; + this.CheckBoxC.Text = "CreateCol"; + this.CheckBoxC.UseVisualStyleBackColor = true; + this.CheckBoxCP.AutoSize = true; + this.CheckBoxCP.Enabled = false; + CheckBox checkBoxCp1 = this.CheckBoxCP; + point1 = new Point(592, 136); + Point point43 = point1; + checkBoxCp1.Location = point43; + this.CheckBoxCP.Name = "CheckBoxCP"; + CheckBox checkBoxCp2 = this.CheckBoxCP; + size1 = new Size(50, 16); + Size size43 = size1; + checkBoxCp2.Size = size43; + this.CheckBoxCP.TabIndex = 48; + this.CheckBoxCP.Text = "Copy"; + this.CheckBoxCP.UseVisualStyleBackColor = true; + this.CheckBoxMV.AutoSize = true; + this.CheckBoxMV.Enabled = false; + CheckBox checkBoxMv1 = this.CheckBoxMV; + point1 = new Point(592, 152); + Point point44 = point1; + checkBoxMv1.Location = point44; + this.CheckBoxMV.Name = "CheckBoxMV"; + CheckBox checkBoxMv2 = this.CheckBoxMV; + size1 = new Size(51, 16); + Size size44 = size1; + checkBoxMv2.Size = size44; + this.CheckBoxMV.TabIndex = 49; + this.CheckBoxMV.Text = "Move"; + this.CheckBoxMV.UseVisualStyleBackColor = true; + this.CheckBoxRN.AutoSize = true; + this.CheckBoxRN.Enabled = false; + CheckBox checkBoxRn1 = this.CheckBoxRN; + point1 = new Point(592, 168); + Point point45 = point1; + checkBoxRn1.Location = point45; + this.CheckBoxRN.Name = "CheckBoxRN"; + CheckBox checkBoxRn2 = this.CheckBoxRN; + size1 = new Size(65, 16); + Size size45 = size1; + checkBoxRn2.Size = size45; + this.CheckBoxRN.TabIndex = 50; + this.CheckBoxRN.Text = "Rename"; + this.CheckBoxRN.UseVisualStyleBackColor = true; + this.CheckBoxLO.AutoSize = true; + this.CheckBoxLO.Enabled = false; + CheckBox checkBoxLo1 = this.CheckBoxLO; + point1 = new Point(592, 184); + Point point46 = point1; + checkBoxLo1.Location = point46; + this.CheckBoxLO.Name = "CheckBoxLO"; + CheckBox checkBoxLo2 = this.CheckBoxLO; + size1 = new Size(48, 16); + Size size46 = size1; + checkBoxLo2.Size = size46; + this.CheckBoxLO.TabIndex = 51; + this.CheckBoxLO.Text = "Lock"; + this.CheckBoxLO.UseVisualStyleBackColor = true; + this.CheckBoxLMT.AutoSize = true; + this.CheckBoxLMT.Enabled = false; + CheckBox checkBoxLmt1 = this.CheckBoxLMT; + point1 = new Point(672, 72); + Point point47 = point1; + checkBoxLmt1.Location = point47; + this.CheckBoxLMT.Name = "CheckBoxLMT"; + CheckBox checkBoxLmt2 = this.CheckBoxLMT; + size1 = new Size(46, 16); + Size size47 = size1; + checkBoxLmt2.Size = size47; + this.CheckBoxLMT.TabIndex = 56; + this.CheckBoxLMT.Text = "LMT"; + this.CheckBoxLMT.UseVisualStyleBackColor = true; + this.CheckBoxCT.AutoSize = true; + this.CheckBoxCT.Enabled = false; + CheckBox checkBoxCt1 = this.CheckBoxCT; + point1 = new Point(672, 88); + Point point48 = point1; + checkBoxCt1.Location = point48; + this.CheckBoxCT.Name = "CheckBoxCT"; + CheckBox checkBoxCt2 = this.CheckBoxCT; + size1 = new Size(39, 16); + Size size48 = size1; + checkBoxCt2.Size = size48; + this.CheckBoxCT.TabIndex = 57; + this.CheckBoxCT.Text = "CT"; + this.CheckBoxCT.UseVisualStyleBackColor = true; + this.CheckBoxLAT.AutoSize = true; + this.CheckBoxLAT.Enabled = false; + CheckBox checkBoxLat1 = this.CheckBoxLAT; + point1 = new Point(672, 104); + Point point49 = point1; + checkBoxLat1.Location = point49; + this.CheckBoxLAT.Name = "CheckBoxLAT"; + CheckBox checkBoxLat2 = this.CheckBoxLAT; + size1 = new Size(45, 16); + Size size49 = size1; + checkBoxLat2.Size = size49; + this.CheckBoxLAT.TabIndex = 58; + this.CheckBoxLAT.Text = "LAT"; + this.CheckBoxLAT.UseVisualStyleBackColor = true; + this.CheckBoxPR.AutoSize = true; + this.CheckBoxPR.Enabled = false; + CheckBox checkBoxPr1 = this.CheckBoxPR; + point1 = new Point(672, 120); + Point point50 = point1; + checkBoxPr1.Location = point50; + this.CheckBoxPR.Name = "CheckBoxPR"; + CheckBox checkBoxPr2 = this.CheckBoxPR; + size1 = new Size(83, 16); + Size size50 = size1; + checkBoxPr2.Size = size50; + this.CheckBoxPR.TabIndex = 59; + this.CheckBoxPR.Text = "PartialRead"; + this.CheckBoxPR.UseVisualStyleBackColor = true; + this.CheckBoxPW.AutoSize = true; + this.CheckBoxPW.Enabled = false; + CheckBox checkBoxPw1 = this.CheckBoxPW; + point1 = new Point(672, 136); + Point point51 = point1; + checkBoxPw1.Location = point51; + this.CheckBoxPW.Name = "CheckBoxPW"; + CheckBox checkBoxPw2 = this.CheckBoxPW; + size1 = new Size(83, 16); + Size size51 = size1; + checkBoxPw2.Size = size51; + this.CheckBoxPW.TabIndex = 60; + this.CheckBoxPW.Text = "PartialWrite"; + this.CheckBoxPW.UseVisualStyleBackColor = true; + this.CheckBoxPP.AutoSize = true; + this.CheckBoxPP.Enabled = false; + CheckBox checkBoxPp1 = this.CheckBoxPP; + point1 = new Point(672, 152); + Point point52 = point1; + checkBoxPp1.Location = point52; + this.CheckBoxPP.Name = "CheckBoxPP"; + CheckBox checkBoxPp2 = this.CheckBoxPP; + size1 = new Size(67, 16); + Size size52 = size1; + checkBoxPp2.Size = size52; + this.CheckBoxPP.TabIndex = 61; + this.CheckBoxPP.Text = "Property"; + this.CheckBoxPP.UseVisualStyleBackColor = true; + this.CheckBoxIG.AutoSize = true; + this.CheckBoxIG.Enabled = false; + CheckBox checkBoxIg1 = this.CheckBoxIG; + point1 = new Point(672, 168); + Point point53 = point1; + checkBoxIg1.Location = point53; + this.CheckBoxIG.Name = "CheckBoxIG"; + CheckBox checkBoxIg2 = this.CheckBoxIG; + size1 = new Size(81, 16); + Size size53 = size1; + checkBoxIg2.Size = size53; + this.CheckBoxIG.TabIndex = 62; + this.CheckBoxIG.Text = "IgnoreCase"; + this.CheckBoxIG.UseVisualStyleBackColor = true; + this.Label6.AutoSize = true; + Label label6_1 = this.Label6; + point1 = new Point(584, 56); + Point point54 = point1; + label6_1.Location = point54; + this.Label6.Name = "Label6"; + Label label6_2 = this.Label6; + size1 = new Size(56, 12); + Size size54 = size1; + label6_2.Size = size54; + this.Label6.TabIndex = 43; + this.Label6.Text = "FS Ability"; + this.CheckBoxF9.AutoSize = true; + CheckBox checkBoxF9_1 = this.CheckBoxF9; + point1 = new Point(264, 200); + Point point55 = point1; + checkBoxF9_1.Location = point55; + this.CheckBoxF9.Name = "CheckBoxF9"; + CheckBox checkBoxF9_2 = this.CheckBoxF9; + size1 = new Size(110, 16); + Size size55 = size1; + checkBoxF9_2.Size = size55; + this.CheckBoxF9.TabIndex = 28; + this.CheckBoxF9.Text = "begin with space"; + this.CheckBoxF9.UseVisualStyleBackColor = true; + this.CheckBoxE3.AutoSize = true; + this.CheckBoxE3.Checked = true; + this.CheckBoxE3.CheckState = CheckState.Checked; + CheckBox checkBoxE3_1 = this.CheckBoxE3; + point1 = new Point(424, 120); + Point point56 = point1; + checkBoxE3_1.Location = point56; + this.CheckBoxE3.Name = "CheckBoxE3"; + CheckBox checkBoxE3_2 = this.CheckBoxE3; + size1 = new Size(66, 16); + Size size56 = size1; + checkBoxE3_2.Size = size56; + this.CheckBoxE3.TabIndex = 35; + this.CheckBoxE3.Text = ".dat .cpp"; + this.CheckBoxE3.UseVisualStyleBackColor = true; + this.CheckBoxE0.AutoSize = true; + this.CheckBoxE0.Checked = true; + this.CheckBoxE0.CheckState = CheckState.Checked; + CheckBox checkBoxE0_1 = this.CheckBoxE0; + point1 = new Point(424, 72); + Point point57 = point1; + checkBoxE0_1.Location = point57; + this.CheckBoxE0.Name = "CheckBoxE0"; + CheckBox checkBoxE0_2 = this.CheckBoxE0; + size1 = new Size(48, 16); + Size size57 = size1; + checkBoxE0_2.Size = size57; + this.CheckBoxE0.TabIndex = 32; + this.CheckBoxE0.Text = "none"; + this.CheckBoxE0.UseVisualStyleBackColor = true; + Button buttonWriteOver1 = this.ButtonWriteOver; + point1 = new Point(136, 144); + Point point58 = point1; + buttonWriteOver1.Location = point58; + this.ButtonWriteOver.Name = "ButtonWriteOver"; + Button buttonWriteOver2 = this.ButtonWriteOver; + size1 = new Size(104, 24); + Size size58 = size1; + buttonWriteOver2.Size = size58; + this.ButtonWriteOver.TabIndex = 12; + this.ButtonWriteOver.Text = "*WriteOver"; + this.ButtonWriteOver.UseVisualStyleBackColor = true; + this.CheckBoxOW.AutoSize = true; + this.CheckBoxOW.Enabled = false; + CheckBox checkBoxOw1 = this.CheckBoxOW; + point1 = new Point(592, 200); + Point point59 = point1; + checkBoxOw1.Location = point59; + this.CheckBoxOW.Name = "CheckBoxOW"; + CheckBox checkBoxOw2 = this.CheckBoxOW; + size1 = new Size(74, 16); + Size size59 = size1; + checkBoxOw2.Size = size59; + this.CheckBoxOW.TabIndex = 52; + this.CheckBoxOW.Text = "OverWrite"; + this.CheckBoxOW.UseVisualStyleBackColor = true; + Button buttonSetTimes1 = this.ButtonSetTimes; + point1 = new Point(136, 272); + Point point60 = point1; + buttonSetTimes1.Location = point60; + this.ButtonSetTimes.Name = "ButtonSetTimes"; + Button buttonSetTimes2 = this.ButtonSetTimes; + size1 = new Size(104, 24); + Size size60 = size1; + buttonSetTimes2.Size = size60; + this.ButtonSetTimes.TabIndex = 18; + this.ButtonSetTimes.Text = "*SetTimes"; + this.ButtonSetTimes.UseVisualStyleBackColor = true; + this.CheckBoxFT.AutoSize = true; + CheckBox checkBoxFt1 = this.CheckBoxFT; + point1 = new Point(426, 198); + Point point61 = point1; + checkBoxFt1.Location = point61; + this.CheckBoxFT.Name = "CheckBoxFT"; + CheckBox checkBoxFt2 = this.CheckBoxFT; + size1 = new Size(86, 16); + Size size61 = size1; + checkBoxFt2.Size = size61; + this.CheckBoxFT.TabIndex = 40; + this.CheckBoxFT.Text = "Future Time"; + this.CheckBoxFT.UseVisualStyleBackColor = true; + this.Label7.AutoSize = true; + Label label7_1 = this.Label7; + point1 = new Point(414, 186); + Point point62 = point1; + label7_1.Location = point62; + this.Label7.Name = "Label7"; + Label label7_2 = this.Label7; + size1 = new Size(30, 12); + Size size62 = size1; + label7_2.Size = size62; + this.Label7.TabIndex = 39; + this.Label7.Text = "Time"; + Button buttonCopyOverWrite1 = this.ButtonCopyOverWrite; + point1 = new Point(192, 240); + Point point63 = point1; + buttonCopyOverWrite1.Location = point63; + this.ButtonCopyOverWrite.Name = "ButtonCopyOverWrite"; + Button buttonCopyOverWrite2 = this.ButtonCopyOverWrite; + size1 = new Size(48, 24); + Size size63 = size1; + buttonCopyOverWrite2.Size = size63; + this.ButtonCopyOverWrite.TabIndex = 17; + this.ButtonCopyOverWrite.Text = "*Copy"; + this.ButtonCopyOverWrite.UseVisualStyleBackColor = true; + Button buttonMoveOverWrite1 = this.ButtonMoveOverWrite; + point1 = new Point(192, 208); + Point point64 = point1; + buttonMoveOverWrite1.Location = point64; + this.ButtonMoveOverWrite.Name = "ButtonMoveOverWrite"; + Button buttonMoveOverWrite2 = this.ButtonMoveOverWrite; + size1 = new Size(48, 24); + Size size64 = size1; + buttonMoveOverWrite2.Size = size64; + this.ButtonMoveOverWrite.TabIndex = 15; + this.ButtonMoveOverWrite.Text = "*Move"; + this.ButtonMoveOverWrite.UseVisualStyleBackColor = true; + this.CheckBoxMoveOver.AutoSize = true; + this.CheckBoxMoveOver.Enabled = false; + CheckBox checkBoxMoveOver1 = this.CheckBoxMoveOver; + point1 = new Point(592, 216); + Point point65 = point1; + checkBoxMoveOver1.Location = point65; + this.CheckBoxMoveOver.Name = "CheckBoxMoveOver"; + CheckBox checkBoxMoveOver2 = this.CheckBoxMoveOver; + size1 = new Size(75, 16); + Size size65 = size1; + checkBoxMoveOver2.Size = size65; + this.CheckBoxMoveOver.TabIndex = 53; + this.CheckBoxMoveOver.Text = "MoveOver"; + this.CheckBoxMoveOver.UseVisualStyleBackColor = true; + this.CheckBoxCopyOver.AutoSize = true; + this.CheckBoxCopyOver.Enabled = false; + CheckBox checkBoxCopyOver1 = this.CheckBoxCopyOver; + point1 = new Point(592, 232); + Point point66 = point1; + checkBoxCopyOver1.Location = point66; + this.CheckBoxCopyOver.Name = "CheckBoxCopyOver"; + CheckBox checkBoxCopyOver2 = this.CheckBoxCopyOver; + size1 = new Size(74, 16); + Size size66 = size1; + checkBoxCopyOver2.Size = size66; + this.CheckBoxCopyOver.TabIndex = 54; + this.CheckBoxCopyOver.Text = "CopyOver"; + this.CheckBoxCopyOver.UseVisualStyleBackColor = true; + this.CheckBoxSameName.AutoSize = true; + this.CheckBoxSameName.Enabled = false; + CheckBox checkBoxSameName1 = this.CheckBoxSameName; + point1 = new Point(592, 248); + Point point67 = point1; + checkBoxSameName1.Location = point67; + this.CheckBoxSameName.Name = "CheckBoxSameName"; + CheckBox checkBoxSameName2 = this.CheckBoxSameName; + size1 = new Size(81, 16); + Size size67 = size1; + checkBoxSameName2.Size = size67; + this.CheckBoxSameName.TabIndex = 55; + this.CheckBoxSameName.Text = "SameName"; + this.CheckBoxSameName.UseVisualStyleBackColor = true; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.ButtonClose; + size1 = new Size(761, 522); + this.ClientSize = size1; + this.Controls.Add((Control) this.CheckBoxIG); + this.Controls.Add((Control) this.CheckBoxPP); + this.Controls.Add((Control) this.CheckBoxPW); + this.Controls.Add((Control) this.CheckBoxPR); + this.Controls.Add((Control) this.CheckBoxLAT); + this.Controls.Add((Control) this.CheckBoxCT); + this.Controls.Add((Control) this.CheckBoxLMT); + this.Controls.Add((Control) this.CheckBoxFT); + this.Controls.Add((Control) this.CheckBoxSameName); + this.Controls.Add((Control) this.CheckBoxCopyOver); + this.Controls.Add((Control) this.CheckBoxMoveOver); + this.Controls.Add((Control) this.CheckBoxOW); + this.Controls.Add((Control) this.CheckBoxLO); + this.Controls.Add((Control) this.CheckBoxRN); + this.Controls.Add((Control) this.CheckBoxMV); + this.Controls.Add((Control) this.CheckBoxCP); + this.Controls.Add((Control) this.CheckBoxC); + this.Controls.Add((Control) this.CheckBoxW); + this.Controls.Add((Control) this.CheckBoxR); + this.Controls.Add((Control) this.CheckBoxL); + this.Controls.Add((Control) this.TextBoxFileSize); + this.Controls.Add((Control) this.TextBoxExceptChar); + this.Controls.Add((Control) this.Label6); + this.Controls.Add((Control) this.Label7); + this.Controls.Add((Control) this.Label3); + this.Controls.Add((Control) this.CheckBoxF5); + this.Controls.Add((Control) this.CheckBoxF7); + this.Controls.Add((Control) this.CheckBoxF6); + this.Controls.Add((Control) this.Label5); + this.Controls.Add((Control) this.Label4); + this.Controls.Add((Control) this.Label2); + this.Controls.Add((Control) this.CheckBoxF3); + this.Controls.Add((Control) this.CheckBoxF9); + this.Controls.Add((Control) this.CheckBoxF2); + this.Controls.Add((Control) this.CheckBoxE6); + this.Controls.Add((Control) this.CheckBoxE5); + this.Controls.Add((Control) this.CheckBoxE4); + this.Controls.Add((Control) this.CheckBoxE3); + this.Controls.Add((Control) this.CheckBoxE2); + this.Controls.Add((Control) this.CheckBoxE0); + this.Controls.Add((Control) this.CheckBoxE1); + this.Controls.Add((Control) this.CheckBoxR2); + this.Controls.Add((Control) this.CheckBoxR1); + this.Controls.Add((Control) this.CheckBoxR3); + this.Controls.Add((Control) this.CheckBoxF1); + this.Controls.Add((Control) this.CheckBoxF8); + this.Controls.Add((Control) this.CheckBoxF4); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.ButtonRead); + this.Controls.Add((Control) this.ButtonWriteResume); + this.Controls.Add((Control) this.ButtonWriteOver); + this.Controls.Add((Control) this.ButtonWrite); + this.Controls.Add((Control) this.ButtonMoveOverWrite); + this.Controls.Add((Control) this.ButtonMove); + this.Controls.Add((Control) this.ButtonDelete); + this.Controls.Add((Control) this.ButtonCreate); + this.Controls.Add((Control) this.ButtonCopyOverWrite); + this.Controls.Add((Control) this.ButtonSetTimes); + this.Controls.Add((Control) this.ButtonCopy); + this.Controls.Add((Control) this.ButtonClear); + this.Controls.Add((Control) this.TextBox2); + this.Controls.Add((Control) this.ButtonGetEntries); + this.Controls.Add((Control) this.TextBox1); + this.Controls.Add((Control) this.ButtonGetInfoRoot); + this.Controls.Add((Control) this.ButtonGetInfoBasic); + this.Controls.Add((Control) this.ButtonClose); + this.Name = nameof (FsTestForm); + this.Text = nameof (FsTestForm); + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual Button ButtonClose + { + get + { + return this._ButtonClose; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonClose_Click); + if (this._ButtonClose != null) + this._ButtonClose.Click -= eventHandler; + this._ButtonClose = value; + if (this._ButtonClose == null) + return; + this._ButtonClose.Click += eventHandler; + } + } + + internal virtual Button ButtonGetInfoBasic + { + get + { + return this._ButtonGetInfoBasic; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonGetInfoBasic_Click); + if (this._ButtonGetInfoBasic != null) + this._ButtonGetInfoBasic.Click -= eventHandler; + this._ButtonGetInfoBasic = value; + if (this._ButtonGetInfoBasic == null) + return; + this._ButtonGetInfoBasic.Click += eventHandler; + } + } + + internal virtual TextBox TextBox1 + { + get + { + return this._TextBox1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBox1 = value; + } + } + + internal virtual Button ButtonGetEntries + { + get + { + return this._ButtonGetEntries; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonGetEntries_Click); + if (this._ButtonGetEntries != null) + this._ButtonGetEntries.Click -= eventHandler; + this._ButtonGetEntries = value; + if (this._ButtonGetEntries == null) + return; + this._ButtonGetEntries.Click += eventHandler; + } + } + + internal virtual TextBox TextBox2 + { + get + { + return this._TextBox2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBox2 = value; + } + } + + internal virtual Button ButtonClear + { + get + { + return this._ButtonClear; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonClear_Click); + if (this._ButtonClear != null) + this._ButtonClear.Click -= eventHandler; + this._ButtonClear = value; + if (this._ButtonClear == null) + return; + this._ButtonClear.Click += eventHandler; + } + } + + internal virtual Button ButtonGetInfoRoot + { + get + { + return this._ButtonGetInfoRoot; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonGetInfoRoot_Click); + if (this._ButtonGetInfoRoot != null) + this._ButtonGetInfoRoot.Click -= eventHandler; + this._ButtonGetInfoRoot = value; + if (this._ButtonGetInfoRoot == null) + return; + this._ButtonGetInfoRoot.Click += eventHandler; + } + } + + internal virtual Button ButtonCreate + { + get + { + return this._ButtonCreate; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonCreate_Click); + if (this._ButtonCreate != null) + this._ButtonCreate.Click -= eventHandler; + this._ButtonCreate = value; + if (this._ButtonCreate == null) + return; + this._ButtonCreate.Click += eventHandler; + } + } + + internal virtual Button ButtonCopy + { + get + { + return this._ButtonCopy; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonCopy_Click); + if (this._ButtonCopy != null) + this._ButtonCopy.Click -= eventHandler; + this._ButtonCopy = value; + if (this._ButtonCopy == null) + return; + this._ButtonCopy.Click += eventHandler; + } + } + + internal virtual Button ButtonMove + { + get + { + return this._ButtonMove; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonMove_Click); + if (this._ButtonMove != null) + this._ButtonMove.Click -= eventHandler; + this._ButtonMove = value; + if (this._ButtonMove == null) + return; + this._ButtonMove.Click += eventHandler; + } + } + + internal virtual Button ButtonWrite + { + get + { + return this._ButtonWrite; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonWriteNew_Click); + if (this._ButtonWrite != null) + this._ButtonWrite.Click -= eventHandler; + this._ButtonWrite = value; + if (this._ButtonWrite == null) + return; + this._ButtonWrite.Click += eventHandler; + } + } + + internal virtual Button ButtonWriteResume + { + get + { + return this._ButtonWriteResume; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonWriteResume_Click); + if (this._ButtonWriteResume != null) + this._ButtonWriteResume.Click -= eventHandler; + this._ButtonWriteResume = value; + if (this._ButtonWriteResume == null) + return; + this._ButtonWriteResume.Click += eventHandler; + } + } + + internal virtual Button ButtonRead + { + get + { + return this._ButtonRead; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonRead_Click); + if (this._ButtonRead != null) + this._ButtonRead.Click -= eventHandler; + this._ButtonRead = value; + if (this._ButtonRead == null) + return; + this._ButtonRead.Click += eventHandler; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual Button ButtonDelete + { + get + { + return this._ButtonDelete; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonDelete_Click); + if (this._ButtonDelete != null) + this._ButtonDelete.Click -= eventHandler; + this._ButtonDelete = value; + if (this._ButtonDelete == null) + return; + this._ButtonDelete.Click += eventHandler; + } + } + + internal virtual CheckBox CheckBoxF4 + { + get + { + return this._CheckBoxF4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF4 = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual CheckBox CheckBoxF6 + { + get + { + return this._CheckBoxF6; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF6 = value; + } + } + + internal virtual CheckBox CheckBoxF1 + { + get + { + return this._CheckBoxF1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF1 = value; + } + } + + internal virtual CheckBox CheckBoxF5 + { + get + { + return this._CheckBoxF5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF5 = value; + } + } + + internal virtual CheckBox CheckBoxF2 + { + get + { + return this._CheckBoxF2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF2 = value; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + internal virtual CheckBox CheckBoxE1 + { + get + { + return this._CheckBoxE1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxE1 = value; + } + } + + internal virtual CheckBox CheckBoxE2 + { + get + { + return this._CheckBoxE2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxE2 = value; + } + } + + internal virtual CheckBox CheckBoxE4 + { + get + { + return this._CheckBoxE4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxE4 = value; + } + } + + internal virtual CheckBox CheckBoxE6 + { + get + { + return this._CheckBoxE6; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxE6 = value; + } + } + + internal virtual CheckBox CheckBoxF3 + { + get + { + return this._CheckBoxF3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF3 = value; + } + } + + internal virtual CheckBox CheckBoxF7 + { + get + { + return this._CheckBoxF7; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF7 = value; + } + } + + internal virtual CheckBox CheckBoxE5 + { + get + { + return this._CheckBoxE5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxE5 = value; + } + } + + internal virtual CheckBox CheckBoxR3 + { + get + { + return this._CheckBoxR3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxR3 = value; + } + } + + internal virtual CheckBox CheckBoxR1 + { + get + { + return this._CheckBoxR1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxR1 = value; + } + } + + internal virtual CheckBox CheckBoxR2 + { + get + { + return this._CheckBoxR2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxR2 = value; + } + } + + internal virtual CheckBox CheckBoxF8 + { + get + { + return this._CheckBoxF8; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF8 = value; + } + } + + internal virtual TextBox TextBoxExceptChar + { + get + { + return this._TextBoxExceptChar; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxExceptChar = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual TextBox TextBoxFileSize + { + get + { + return this._TextBoxFileSize; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxFileSize = value; + } + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual CheckBox CheckBoxL + { + get + { + return this._CheckBoxL; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxL = value; + } + } + + internal virtual CheckBox CheckBoxR + { + get + { + return this._CheckBoxR; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxR = value; + } + } + + internal virtual CheckBox CheckBoxW + { + get + { + return this._CheckBoxW; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxW = value; + } + } + + internal virtual CheckBox CheckBoxC + { + get + { + return this._CheckBoxC; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxC = value; + } + } + + internal virtual CheckBox CheckBoxCP + { + get + { + return this._CheckBoxCP; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxCP = value; + } + } + + internal virtual CheckBox CheckBoxMV + { + get + { + return this._CheckBoxMV; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxMV = value; + } + } + + internal virtual CheckBox CheckBoxRN + { + get + { + return this._CheckBoxRN; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxRN = value; + } + } + + internal virtual CheckBox CheckBoxLO + { + get + { + return this._CheckBoxLO; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxLO = value; + } + } + + internal virtual CheckBox CheckBoxLMT + { + get + { + return this._CheckBoxLMT; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxLMT = value; + } + } + + internal virtual CheckBox CheckBoxCT + { + get + { + return this._CheckBoxCT; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxCT = value; + } + } + + internal virtual CheckBox CheckBoxLAT + { + get + { + return this._CheckBoxLAT; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxLAT = value; + } + } + + internal virtual CheckBox CheckBoxPR + { + get + { + return this._CheckBoxPR; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxPR = value; + } + } + + internal virtual CheckBox CheckBoxPW + { + get + { + return this._CheckBoxPW; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxPW = value; + } + } + + internal virtual CheckBox CheckBoxPP + { + get + { + return this._CheckBoxPP; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxPP = value; + } + } + + internal virtual CheckBox CheckBoxIG + { + get + { + return this._CheckBoxIG; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxIG = value; + } + } + + internal virtual Label Label6 + { + get + { + return this._Label6; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label6 = value; + } + } + + internal virtual CheckBox CheckBoxF9 + { + get + { + return this._CheckBoxF9; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxF9 = value; + } + } + + internal virtual CheckBox CheckBoxE3 + { + get + { + return this._CheckBoxE3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxE3 = value; + } + } + + internal virtual CheckBox CheckBoxE0 + { + get + { + return this._CheckBoxE0; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxE0 = value; + } + } + + internal virtual Button ButtonWriteOver + { + get + { + return this._ButtonWriteOver; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonWriteOver_Click); + if (this._ButtonWriteOver != null) + this._ButtonWriteOver.Click -= eventHandler; + this._ButtonWriteOver = value; + if (this._ButtonWriteOver == null) + return; + this._ButtonWriteOver.Click += eventHandler; + } + } + + internal virtual CheckBox CheckBoxOW + { + get + { + return this._CheckBoxOW; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxOW = value; + } + } + + internal virtual Button ButtonSetTimes + { + get + { + return this._ButtonSetTimes; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonSetTimes_Click); + if (this._ButtonSetTimes != null) + this._ButtonSetTimes.Click -= eventHandler; + this._ButtonSetTimes = value; + if (this._ButtonSetTimes == null) + return; + this._ButtonSetTimes.Click += eventHandler; + } + } + + internal virtual CheckBox CheckBoxFT + { + get + { + return this._CheckBoxFT; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxFT = value; + } + } + + internal virtual Label Label7 + { + get + { + return this._Label7; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label7 = value; + } + } + + internal virtual Button ButtonCopyOverWrite + { + get + { + return this._ButtonCopyOverWrite; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonCopyOverWrite_Click); + if (this._ButtonCopyOverWrite != null) + this._ButtonCopyOverWrite.Click -= eventHandler; + this._ButtonCopyOverWrite = value; + if (this._ButtonCopyOverWrite == null) + return; + this._ButtonCopyOverWrite.Click += eventHandler; + } + } + + internal virtual Button ButtonMoveOverWrite + { + get + { + return this._ButtonMoveOverWrite; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonMoveOverWrite_Click); + if (this._ButtonMoveOverWrite != null) + this._ButtonMoveOverWrite.Click -= eventHandler; + this._ButtonMoveOverWrite = value; + if (this._ButtonMoveOverWrite == null) + return; + this._ButtonMoveOverWrite.Click += eventHandler; + } + } + + internal virtual CheckBox CheckBoxMoveOver + { + get + { + return this._CheckBoxMoveOver; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxMoveOver = value; + } + } + + internal virtual CheckBox CheckBoxCopyOver + { + get + { + return this._CheckBoxCopyOver; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxCopyOver = value; + } + } + + internal virtual CheckBox CheckBoxSameName + { + get + { + return this._CheckBoxSameName; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxSameName = value; + } + } + + private void FsTestForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + this.seed = DateTime.Now.Millisecond; + this.seed2 = checked (this.seed + 1); + } + + private void Log(string mes) + { + if (mes == null) + { + this.TextBox1.Text = ""; + } + else + { + TextBox textBox1 = this.TextBox1; + textBox1.Text = textBox1.Text + mes + "\r\n"; + } + this.TextBox1.Select(this.TextBox1.Text.Length, 0); + this.TextBox1.ScrollToCaret(); + } + + private bool RiEqual(ResourceInfo ri1, ResourceInfo ri2) + { + return ri1.IsCollection == ri2.IsCollection && ri1.Size == ri2.Size && (!(ri1.Id != ri2.Id) && ri1.HasError == ri2.HasError) && (ri1.IsEncrypted == ri2.IsEncrypted && ri1.IsMinor == ri2.IsMinor && ri1.IsSplitted == ri2.IsSplitted) && (!this.CheckBoxR1.Checked || DateTime.Compare(ri1.CreationTime, ri2.CreationTime) == 0 && DateTime.Compare(ri1.LastAccessTime, ri2.LastAccessTime) == 0 && DateTime.Compare(ri1.LastModifiedTime, ri2.LastModifiedTime) == 0) && (!this.CheckBoxR2.Checked || ri1.CanCopy == ri2.CanCopy && ri1.CanDelete == ri2.CanDelete && (ri1.CanMove == ri2.CanMove && ri1.CanRename == ri2.CanRename) && ri1.CanSetInfo == ri2.CanSetInfo) && (!this.CheckBoxR3.Checked || Operators.CompareString(ri1.StatusDescription, ri2.StatusDescription, false) == 0 && SettingSupport.IsSameContents((object) ri1, (object) ri2, true)); + } + + public void SetClient(FsBase fs, CacheManager cm, UCSNormalization downnormalization, UCSNormalization uploadnormalization, Uri root) + { + this.pFS = fs; + this.pCache = cm; + this.pDownloadFilenameNormalization = downnormalization; + this.pUploadFilenameNormalization = uploadnormalization; + this.TextBox2.Text = root.ToString(); + this.CheckBoxL.Checked = (this.pFS.Ability & FsAbility.Listing) != FsAbility.None; + this.CheckBoxR.Checked = (this.pFS.Ability & FsAbility.Read) != FsAbility.None; + this.CheckBoxW.Checked = (this.pFS.Ability & FsAbility.Write) != FsAbility.None; + this.CheckBoxC.Checked = (this.pFS.Ability & FsAbility.CreateCollection) != FsAbility.None; + this.CheckBoxCP.Checked = (this.pFS.Ability & FsAbility.Copy) != FsAbility.None; + this.CheckBoxMV.Checked = (this.pFS.Ability & FsAbility.Move) != FsAbility.None; + this.CheckBoxRN.Checked = (this.pFS.Ability & FsAbility.Rename) != FsAbility.None; + this.CheckBoxLO.Checked = (this.pFS.Ability & FsAbility.Lock) != FsAbility.None; + this.CheckBoxOW.Checked = (this.pFS.Ability & FsAbility.OverWriteFile) != FsAbility.None; + this.CheckBoxLMT.Checked = (this.pFS.Ability & FsAbility.LastModifiedTime) != FsAbility.None; + this.CheckBoxCT.Checked = (this.pFS.Ability & FsAbility.CreationTime) != FsAbility.None; + this.CheckBoxLAT.Checked = (this.pFS.Ability & FsAbility.LastAccessTime) != FsAbility.None; + this.CheckBoxPR.Checked = (this.pFS.Ability & FsAbility.PartialRead) != FsAbility.None; + this.CheckBoxPW.Checked = (this.pFS.Ability & FsAbility.PartialWrite) != FsAbility.None; + this.CheckBoxPP.Checked = (this.pFS.Ability & FsAbility.Property) != FsAbility.None; + this.CheckBoxIG.Checked = (this.pFS.Ability & FsAbility.IgnoreCase) != FsAbility.None; + this.CheckBoxMoveOver.Checked = (this.pFS.Ability & FsAbility.MoveOver) != FsAbility.None; + this.CheckBoxCopyOver.Checked = (this.pFS.Ability & FsAbility.CopyOver) != FsAbility.None; + this.CheckBoxSameName.Checked = (this.pFS.Ability & FsAbility.IgnoreSameName) != FsAbility.None; + } + + public void SetUri(Uri u) + { + this.TextBox2.Text = u.ToString(); + } + + private void ButtonClose_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void ButtonClear_Click(object sender, EventArgs e) + { + this.TextBox1.Text = ""; + } + + private void ButtonGetInfoRoot_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + this.GetInfoTest(UriUtil.GetRoot(new Uri(this.TextBox2.Text))); + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonGetInfoBasic_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + this.GetInfoTest(new Uri(this.TextBox2.Text)); + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonGetEntries_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + this.GetEntriesTest(new Uri(this.TextBox2.Text)); + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonRead_Click(object sender, EventArgs e) + { + this.Log((string) null); + Uri targeturi = new Uri(this.TextBox2.Text); + int num = 0; + try + { + this.Log("Listing Files"); + List resourceInfoList = new List(); + resourceInfoList.AddRange((IEnumerable) this.pFS.GetInfoAndEntries(targeturi)); + while (resourceInfoList.Count > 0 && num < 100) + { + ResourceInfo resourceInfo = (ResourceInfo) null; + while (resourceInfoList.Count > 0) + { + if (resourceInfoList[0].IsCollection) + { + this.Log("Listing Files"); + resourceInfoList.AddRange((IEnumerable) this.pFS.GetEntries(resourceInfoList[0].Id)); + } + else if (resourceInfoList[0].Size < 104857600L) + { + resourceInfo = resourceInfoList[0]; + break; + } + resourceInfoList.RemoveAt(0); + } + if (resourceInfoList.Count == 0) + return; + resourceInfoList.RemoveAt(0); + checked { ++num; } + this.OpenReadTest(resourceInfo.Id.Uri); + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonCreate_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + int index = 0; + while (index < filenames.Length) + { + string name = filenames[index]; + this.CreateTest(@base, name); + checked { ++index; } + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonDelete_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + int index = 0; + while (index < filenames.Length) + { + string name = filenames[index]; + this.DeleteTest(@base, name); + checked { ++index; } + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonWriteNew_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + string[] strArray = filenames; + int index = 0; + while (index < strArray.Length) + { + string name = strArray[index]; + this.OpenWriteTest(@base, name, this.FileSize()); + checked { ++index; } + } + this.Log("Large file"); + this.OpenWriteTest(@base, filenames[0], this.LargeFileSize()); + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonWriteOver_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + string[] strArray = filenames; + int index = 0; + while (index < strArray.Length) + { + string name = strArray[index]; + this.OpenWriteOverTest(@base, name, this.FileSize()); + checked { ++index; } + } + this.Log("Large file"); + this.OpenWriteOverTest(@base, filenames[0], this.LargeFileSize()); + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonWriteResume_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames1 = this.CreateFilenames(); + string[] filenames2 = this.CreateFilenames(); + int index = 0; + while (index < filenames2.Length) + { + string name = filenames2[index]; + this.OpenWriteResumeTest(@base, name, this.FileSize()); + checked { ++index; } + } + this.OpenWriteResumeTest(@base, filenames1[0], this.LargeFileSize()); + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonMove_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + int num1 = 0; + int num2 = checked (filenames.Length - 1); + int index = num1; + while (index <= num2) + { + string name = filenames[index]; + string str = filenames[checked (index + 1) % filenames.Length]; + string dirname = filenames[checked (index + 2) % filenames.Length]; + this.MoveTest1(@base, name, str); + this.MoveTest2(@base, name, str); + this.MoveTest3(@base, name, str, dirname); + checked { ++index; } + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonCopy_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + int num1 = 0; + int num2 = checked (filenames.Length - 1); + int index = num1; + while (index <= num2) + { + string name = filenames[index]; + string str = filenames[checked (index + 1) % filenames.Length]; + string dirname = filenames[checked (index + 2) % filenames.Length]; + this.CopyTest1(@base, name, str); + this.CopyTest2(@base, name, str); + this.CopyTest3(@base, name, str, dirname); + checked { ++index; } + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonMoveOverWrite_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + int num1 = 0; + int num2 = checked (filenames.Length - 1); + int index = num1; + while (index <= num2) + { + string name = filenames[index]; + string str = filenames[checked (index + 1) % filenames.Length]; + string dirname = filenames[checked (index + 2) % filenames.Length]; + this.MoveOverwriteTest1(@base, name, str); + this.MoveOVerwriteTest2(@base, name, str); + this.MoveOverwriteTest3(@base, name, str, dirname); + checked { ++index; } + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonCopyOverWrite_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + Uri @base = new Uri(this.TextBox2.Text); + string[] filenames = this.CreateFilenames(); + int num1 = 0; + int num2 = checked (filenames.Length - 1); + int index = num1; + while (index <= num2) + { + string name = filenames[index]; + string str = filenames[checked (index + 1) % filenames.Length]; + string dirname = filenames[checked (index + 2) % filenames.Length]; + this.CopyOverwriteTest1(@base, name, str); + this.CopyOverwriteTest2(@base, name, str); + this.CopyOverwriteTest3(@base, name, str, dirname); + checked { ++index; } + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void ButtonSetTimes_Click(object sender, EventArgs e) + { + this.Log((string) null); + try + { + DateTime minValue = DateTime.MinValue; + Uri @base = new Uri(this.TextBox2.Text); + DateTime[] times = this.CreateTimes(); + int index1 = 0; + string[] filenames = this.CreateFilenames(); + int index2 = 0; + while (index2 < filenames.Length) + { + string name = filenames[index2]; + DateTime dateTime1 = times[index1]; + int index3 = checked (index1 + 13) % times.Length; + if ((this.pFS.Ability & FsAbility.LastModifiedTime) != FsAbility.None) + this.SetTimesTest1(@base, name, dateTime1, minValue, minValue); + if ((this.pFS.Ability & FsAbility.LastAccessTime) != FsAbility.None) + this.SetTimesTest1(@base, name, minValue, dateTime1, minValue); + if ((this.pFS.Ability & FsAbility.CreationTime) != FsAbility.None) + this.SetTimesTest1(@base, name, minValue, minValue, dateTime1); + DateTime dateTime2 = times[index3]; + int index4 = checked (index3 + 13) % times.Length; + DateTime dateTime3 = times[index4]; + int index5 = checked (index4 + 13) % times.Length; + if ((this.pFS.Ability & FsAbility.LastModifiedTime) != FsAbility.None && (this.pFS.Ability & FsAbility.LastAccessTime) != FsAbility.None) + this.SetTimesTest1(@base, name, dateTime2, dateTime3, minValue); + if ((this.pFS.Ability & FsAbility.LastAccessTime) != FsAbility.None && (this.pFS.Ability & FsAbility.CreationTime) != FsAbility.None) + this.SetTimesTest1(@base, name, minValue, dateTime2, dateTime3); + if ((this.pFS.Ability & FsAbility.CreationTime) != FsAbility.None && (this.pFS.Ability & FsAbility.LastModifiedTime) != FsAbility.None) + this.SetTimesTest1(@base, name, dateTime3, minValue, dateTime2); + DateTime lmt = times[index5]; + int index6 = checked (index5 + 13) % times.Length; + DateTime lat = times[index6]; + int index7 = checked (index6 + 13) % times.Length; + DateTime ct = times[index7]; + index1 = checked (index7 + 13) % times.Length; + if ((this.pFS.Ability & FsAbility.Times) == FsAbility.Times) + this.SetTimesTest1(@base, name, lmt, lat, ct); + checked { ++index2; } + } + this.Log("OK"); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.Log(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void GetInfoTest(Uri target) + { + this.Log(nameof (GetInfoTest)); + Uri targeturi1 = UriUtil.AddLastSlash(target); + Uri targeturi2 = UriUtil.RemoveLastSlash(target); + this.Log("GetInfo(ByVal targeturi As Uri) As ResourceInfo"); + ResourceInfo info1 = this.pFS.GetInfo(targeturi1); + ResourceInfo info2 = this.pFS.GetInfo(targeturi2); + if (!this.RiEqual(info1, info2)) + throw new Exception("GetInfoAndEntries1 Fail 1 " + target.ToString()); + if (info1.IsCollection) + { + if (!UriUtil.EndWithSlash(info1.Id.Uri)) + throw new Exception("GetInfoAndEntries1 Fail 2 " + target.ToString()); + } + else if (UriUtil.EndWithSlash(info1.Id.Uri)) + throw new Exception("GetInfoAndEntries1 Fail 3 " + target.ToString()); + this.Log("GetInfoAndEntries(ByVal targeturi As Uri) As ResourceInfo()"); + ResourceInfo[] infoAndEntries1 = this.pFS.GetInfoAndEntries(targeturi1); + ResourceInfo[] infoAndEntries2 = this.pFS.GetInfoAndEntries(targeturi2); + if (infoAndEntries1.Length == 0) + throw new Exception("GetInfoAndEntries1 Fail 4 " + target.ToString()); + if (!infoAndEntries1[0].IsCollection && infoAndEntries1.Length > 1) + throw new Exception("GetInfoAndEntries1 Fail 5 " + target.ToString()); + if (!this.RiEqual(info1, infoAndEntries1[0])) + throw new Exception("GetInfoAndEntries1 Fail 6 " + target.ToString()); + this.SortRis(infoAndEntries1, true); + this.SortRis(infoAndEntries2, true); + if (infoAndEntries1.Length != infoAndEntries2.Length) + throw new Exception("GetInfoAndEntries1 Fail 9 " + target.ToString()); + int num1 = 0; + int num2 = checked (infoAndEntries1.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (!this.RiEqual(infoAndEntries1[index1], infoAndEntries2[index1])) + throw new Exception("GetInfoAndEntries1 Fail 7 " + target.ToString()); + checked { ++index1; } + } + int num3 = 1; + int num4 = checked (infoAndEntries1.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + if (!UriUtil.IsChild(info1.Id.Uri, infoAndEntries1[index2].Id.Uri)) + throw new Exception("GetInfoAndEntries1 Fail 8 " + target.ToString()); + checked { ++index2; } + } + } + + private void GetEntriesTest(Uri target) + { + this.Log(nameof (GetEntriesTest)); + ResourceInfo info = this.pFS.GetInfo(target); + ResourceId id = info.Id; + this.Log("GetInfo(ByVal id As ResourceId) As ResourceInfo"); + if (!this.RiEqual(this.pFS.GetInfo(id), info)) + throw new Exception("GetInfoAndEntries Test Fail 1 " + id.ToString()); + this.Log("GetInfo(ByVal targeturi As Uri) As ResourceInfo"); + if (!this.RiEqual(this.pFS.GetInfo(id.Uri), info)) + throw new Exception("GetInfoAndEntries Test Fail 2 " + id.ToString()); + this.Log("GetInfoAndEntries(ByVal id As ResourceId) As ResourceInfo()"); + ResourceInfo[] infoAndEntries1 = this.pFS.GetInfoAndEntries(id); + if (!infoAndEntries1[0].IsCollection && infoAndEntries1.Length > 1) + throw new Exception("GetInfoAndEntries Fail 3 " + id.ToString()); + if (!this.RiEqual(infoAndEntries1[0], info)) + throw new Exception("GetInfoAndEntries Fail 4 " + id.ToString()); + this.SortRis(infoAndEntries1, true); + int num1 = 1; + int num2 = checked (infoAndEntries1.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (!UriUtil.IsChild(id.Uri, infoAndEntries1[index1].Id.Uri)) + throw new Exception("GetInfoAndEntries Fail 5 " + id.ToString()); + checked { ++index1; } + } + this.Log("GetInfoAndEntries(ByVal targeturi As Uri) As ResourceInfo()"); + ResourceInfo[] infoAndEntries2 = this.pFS.GetInfoAndEntries(id); + this.SortRis(infoAndEntries2, true); + if (infoAndEntries1.Length != infoAndEntries2.Length) + throw new Exception("GetInfoAndEntries Fail 6-1 " + id.ToString()); + int num3 = 0; + int num4 = checked (infoAndEntries1.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + if (!this.RiEqual(infoAndEntries1[index2], infoAndEntries2[index2])) + throw new Exception("GetInfoAndEntries Fail 6 " + id.ToString()); + checked { ++index2; } + } + this.Log("GetEntries(ByVal id As ResourceId) As ResourceInfo()"); + ResourceInfo[] entries = this.pFS.GetEntries(id); + if (infoAndEntries1.Length != checked (entries.Length + 1)) + throw new Exception("GetInfoAndEntries Fail 7 " + id.ToString()); + this.SortRis(entries, false); + int num5 = 1; + int num6 = checked (infoAndEntries1.Length - 1); + int index3 = num5; + while (index3 <= num6) + { + if (!this.RiEqual(infoAndEntries1[index3], entries[checked (index3 - 1)])) + throw new Exception("GetInfoAndEntries Fail 8 " + id.ToString()); + checked { ++index3; } + } + this.Log("GetInfo(ByVal parentid As ResourceId, ByVal name As String) As ResourceInfo"); + int num7 = 1; + int num8 = checked (infoAndEntries1.Length - 1); + int index4 = num7; + while (index4 <= num8) + { + if (!this.RiEqual(this.pFS.GetInfo(id, UriUtil.GetLastName(infoAndEntries1[index4].Id.Uri)), infoAndEntries1[index4])) + throw new Exception("GetInfoAndEntries Fail 9 " + id.ToString()); + checked { ++index4; } + } + this.Log("GetParentInfo(ByVal id As ResourceId) As ResourceInfo"); + int num9 = 1; + int num10 = checked (infoAndEntries1.Length - 1); + int index5 = num9; + while (index5 <= num10) + { + if (!this.RiEqual(this.pFS.GetParentInfo(infoAndEntries1[index5].Id), info)) + throw new Exception("GetInfoAndEntries Fail 10 " + id.ToString()); + checked { ++index5; } + } + this.Log("GetParentInfoAndEntries(ByVal childid As ResourceId) As ResourceInfo()"); + int num11 = 1; + int num12 = checked (infoAndEntries1.Length - 1); + int index6 = num11; + while (index6 <= num12) + { + ResourceInfo[] parentInfoAndEntries = this.pFS.GetParentInfoAndEntries(infoAndEntries1[index6].Id); + this.SortRis(parentInfoAndEntries, true); + int num13 = 0; + int num14 = checked (parentInfoAndEntries.Length - 1); + int index7 = num13; + while (index7 <= num14) + { + if (!this.RiEqual(infoAndEntries1[index7], parentInfoAndEntries[index7])) + throw new Exception("GetInfoAndEntries Fail 11 " + id.ToString()); + checked { ++index7; } + } + checked { ++index6; } + } + } + + private void OpenReadTest(Uri target) + { + this.Log("OpenReadTest " + target.ToString()); + int offset = 0; + ResourceInfo info = this.pFS.GetInfo(target); + if (info.IsCollection) + return; + ResourceId id = info.Id; + if (info.Size < 0L || info.Size > 1073741824L) + return; + byte[] buffer1 = new byte[checked ((int) (info.Size - 1L) + 1)]; + this.Log("OpenRead(ByVal u as Uri) As Stream"); + using (Stream stream = this.pFS.OpenRead(info.Id.Uri)) + { + while (true) + { + int num = stream.Read(buffer1, offset, checked (buffer1.Length - offset)); + if (num != 0) + checked { offset += num; } + else + break; + } + } + if (offset != buffer1.Length) + throw new Exception("Read Fail 1 " + id.ToString()); + byte[] buffer2 = new byte[checked (buffer1.Length + 100 + 1)]; + this.Log("OpenRead(ByVal id As ResourceId, 0, -1) As Stream"); + long start1 = 0; + long length1 = -1; + long num1 = start1; + long num2 = length1; + using (Stream stream = this.pFS.OpenRead(id, ref start1, ref length1)) + { + this.Log("start: " + Conversions.ToString(num1) + " -> " + start1.ToString() + " length: " + Conversions.ToString(num2) + " -> " + length1.ToString()); + if (start1 > num1) + throw new Exception("Read Fail 2. Start Strange." + id.ToString()); + if (length1 >= 0L && num2 >= 0L && checked (num1 + num2) < checked (start1 + length1)) + throw new Exception("Read Fail 4. length strange"); + offset = checked ((int) start1); + while (true) + { + int num3 = stream.Read(buffer2, offset, checked (buffer2.Length - offset)); + if (num3 != 0) + checked { offset += num3; } + else + break; + } + } + if (length1 < 0L) + length1 = checked ((long) offset - start1); + if ((long) offset != checked (start1 + length1)) + throw new Exception("Read Fail 3. Length Strange." + id.ToString()); + int num4 = checked ((int) start1); + int num5 = checked ((int) (start1 + length1) - 1); + int index1 = num4; + while (index1 <= num5) + { + if ((int) buffer2[index1] != (int) buffer1[index1]) + throw new Exception("Read Fail 5. Read Data Strange. " + id.ToString()); + checked { ++index1; } + } + this.Log("OpenRead(ByVal id As ResourceId, start, -1) As Stream"); + long start2 = (long) checked ((int) unchecked (info.Size / 4L)); + long length2 = -1; + long num6 = start2; + long num7 = length2; + using (Stream stream = this.pFS.OpenRead(id, ref start2, ref length2)) + { + this.Log("start: " + Conversions.ToString(num6) + " -> " + start2.ToString() + " length: " + Conversions.ToString(num7) + " -> " + length2.ToString()); + if (start2 > num6) + throw new Exception("Read Fail 2. Start Strange." + id.ToString()); + if (length2 >= 0L && num7 >= 0L && checked (num6 + num7) < checked (start2 + length2)) + throw new Exception("Read Fail 4. length strange"); + offset = checked ((int) start2); + while (true) + { + int num3 = stream.Read(buffer2, offset, checked (buffer2.Length - offset)); + if (num3 != 0) + checked { offset += num3; } + else + break; + } + } + if (length2 < 0L) + length2 = checked ((long) offset - start2); + if ((long) offset != checked (start2 + length2)) + throw new Exception("Read Fail 3. Length Strange." + id.ToString()); + int num8 = checked ((int) start2); + int num9 = checked ((int) (start2 + length2) - 1); + int index2 = num8; + while (index2 <= num9) + { + if ((int) buffer2[index2] != (int) buffer1[index2]) + throw new Exception("Read Fail 5. Read Data Strange. " + id.ToString()); + checked { ++index2; } + } + long start3 = 0; + long length3 = (long) checked ((int) unchecked (info.Size / 2L)); + if (length3 != 0L) + { + long num3 = start3; + long num10 = length3; + this.Log("OpenRead(ByVal id As ResourceId, 0, length) As Stream " + id.ToString()); + using (Stream stream = this.pFS.OpenRead(id, ref start3, ref length3)) + { + this.Log("start: " + Conversions.ToString(num3) + " -> " + start3.ToString() + " length: " + Conversions.ToString(num10) + " -> " + length3.ToString()); + if (start3 > num3) + throw new Exception("Read Fail 2. Start Strange." + id.ToString()); + if (length3 >= 0L && num10 >= 0L && checked (num3 + num10) > checked (start3 + length3)) + throw new Exception("Read Fail 4. length strange"); + offset = checked ((int) start3); + while (true) + { + int num11 = stream.Read(buffer2, offset, checked (buffer2.Length - offset)); + if (num11 != 0) + checked { offset += num11; } + else + break; + } + } + if (length3 < 0L) + length3 = checked ((long) offset - start3); + if ((long) offset != checked (start3 + length3)) + throw new Exception("Read Fail 3. Length Strange." + id.ToString()); + int num12 = checked ((int) start3); + int num13 = checked ((int) (start3 + length3) - 1); + int index3 = num12; + while (index3 <= num13) + { + if ((int) buffer2[index3] != (int) buffer1[index3]) + throw new Exception("Read Fail 5. Read Data Strange. " + id.ToString()); + checked { ++index3; } + } + } + long start4 = (long) checked ((int) unchecked (info.Size / 4L)); + long length4 = (long) checked ((int) unchecked (info.Size / 2L)); + if (length4 != 0L) + { + this.Log("OpenRead(ByVal id As ResourceId, start, length) As Stream"); + long num3 = start4; + long num10 = length4; + using (Stream stream = this.pFS.OpenRead(id, ref start4, ref length4)) + { + this.Log("start: " + Conversions.ToString(num3) + " -> " + start4.ToString() + " length: " + Conversions.ToString(num10) + " -> " + length4.ToString()); + if (start4 > num3) + throw new Exception("Read Fail 2. Start Strange." + id.ToString()); + if (length4 >= 0L && num10 >= 0L && checked (num3 + num10) > checked (start4 + length4)) + throw new Exception("Read Fail 4. length strange"); + offset = checked ((int) start4); + while (true) + { + int num11 = stream.Read(buffer2, offset, checked (buffer2.Length - offset)); + if (num11 != 0) + checked { offset += num11; } + else + break; + } + } + if (length4 < 0L) + length4 = checked ((long) offset - start4); + if ((long) offset != checked (start4 + length4)) + throw new Exception("Read Fail 3. Length Strange." + id.ToString()); + int num12 = checked ((int) start4); + int num13 = checked ((int) (start4 + length4) - 1); + int index3 = num12; + while (index3 <= num13) + { + if ((int) buffer2[index3] != (int) buffer1[index3]) + throw new Exception("Read Fail 5. Read Data Strange. " + id.ToString()); + checked { ++index3; } + } + } + long size1 = (long) checked ((int) info.Size); + if (size1 != 0L) + { + long length5 = 10; + this.Log("OpenRead(ByVal id As ResourceId, start, length) As Stream"); + try + { + long num3 = size1; + long num10 = length5; + using (this.pFS.OpenRead(id, ref size1, ref length5)) + { + this.Log("start: " + Conversions.ToString(num3) + " -> " + size1.ToString() + " length: " + Conversions.ToString(num10) + " -> " + length5.ToString()); + if (size1 > num3) + throw new Exception("Read Fail 2. Start Strange." + id.ToString()); + if (length5 >= 0L) + { + if (num10 >= 0L) + { + if (checked (num3 + num10) > checked (size1 + length5)) + throw new Exception("Read Fail 4. length strange"); + } + } + } + if (size1 >= info.Size) + { + if (size1 != 0L) + throw new Exception("Invalid range request succeeded."); + } + } + catch (InvalidRangeException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + long size2 = (long) checked ((int) info.Size); + if (size2 != 0L) + { + long length5 = -1; + this.Log("OpenRead(ByVal id As ResourceId, start, -1) As Stream"); + try + { + long num3 = size2; + long num10 = length5; + using (this.pFS.OpenRead(id, ref size2, ref length5)) + { + this.Log("start: " + Conversions.ToString(num3) + " -> " + size2.ToString() + " length: " + Conversions.ToString(num10) + " -> " + length5.ToString()); + if (size2 > num3) + throw new Exception("Read Fail 2. Start Strange." + id.ToString()); + if (length5 >= 0L) + { + if (num10 >= 0L) + { + if (checked (num3 + num10) > checked (size2 + length5)) + throw new Exception("Read Fail 4. length strange"); + } + } + } + if (size2 >= info.Size) + { + if (size2 != 0L) + throw new Exception("Invalid range request succeeded."); + } + } + catch (InvalidRangeException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + if (info.Size <= 100L) + return; + long start5 = (long) checked ((int) (info.Size - 10L)); + long length6 = 100; + this.Log("OpenRead(ByVal id As ResourceId, start, length) As Stream"); + try + { + long num3 = start5; + long num10 = length6; + using (Stream stream = this.pFS.OpenRead(id, ref start5, ref length6)) + { + this.Log("start: " + Conversions.ToString(num3) + " -> " + start5.ToString() + " length: " + Conversions.ToString(num10) + " -> " + length6.ToString()); + if (start5 > num3) + throw new Exception("Read Fail 2. Start Strange." + id.ToString()); + if (length6 >= 0L && num10 >= 0L && checked (num3 + num10) > checked (start5 + length6)) + throw new Exception("Read Fail 4. length strange"); + offset = checked ((int) start5); + while (true) + { + int num11 = stream.Read(buffer2, offset, checked (buffer2.Length - offset)); + if (num11 != 0) + checked { offset += num11; } + else + break; + } + } + if (length6 < 0L) + length6 = checked ((long) offset - start5); + if ((long) offset != checked (start5 + length6)) + throw new Exception("Read Fail 3. Length Strange." + id.ToString()); + int num12 = checked ((int) start5); + int num13 = checked ((int) (start5 + length6) - 1); + int index3 = num12; + while (index3 <= num13) + { + if ((int) buffer2[index3] != (int) buffer1[index3]) + throw new Exception("Read Fail 5. Read Data Strange. " + id.ToString()); + checked { ++index3; } + } + } + catch (InvalidRangeException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + private void OpenWriteTest(Uri @base, string name, long size) + { + this.Log("Write Test filename: " + name); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2; + try + { + this.Log("Check file existance"); + id2 = this.pFS.GetInfo(id1, name).Id; + this.Log("Delete file"); + this.pFS.Delete(id2); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + byte[] buffer1 = new byte[1048577]; + Random random1 = new Random(this.seed); + this.Log("Write with length"); + using (Stream st = this.pFS.OpenWrite(id1, name, size)) + { + long num = 0; + while (num < size) + { + random1.NextBytes(buffer1); + if (checked (num + (long) buffer1.Length) > size) + { + st.Write(buffer1, 0, checked ((int) (size - num))); + num = size; + } + else + { + st.Write(buffer1, 0, buffer1.Length); + checked { num += (long) buffer1.Length; } + } + if (!st.CanSeek || st.Position == num) + ; + } + st.Close(); + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + id2 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + ResourceInfo info1 = this.pFS.GetInfo(id2); + if (info1.Id != id2) + throw new Exception("OpenWrite Fail 1. Id Strange."); + if (id2.IsCollection) + throw new Exception("OpenWrite Fail 2. Resource Property Strange."); + if (info1.IsCollection) + throw new Exception("OpenWrite Fail 3. Resource Property Strange."); + if (info1.Size != size) + throw new Exception("OpenWrite Fail 6. Size Strange."); + if (Operators.CompareString(UriUtil.GetLastName(id2.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 4. Filename Strange."); + if (Operators.CompareString(UriUtil.GetLastName(info1.Id.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 5. Filename Strange."); + this.SubReadConfirm(id2, this.seed, size); + this.Log("Delete file"); + this.pFS.Delete(id2); + this.Log("Write with zero-length"); + using (Stream st = this.pFS.OpenWrite(id1, name, 0L)) + { + st.Close(); + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + id2 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + ResourceInfo info2 = this.pFS.GetInfo(id2); + if (info2.Id != id2) + throw new Exception("OpenWrite Fail 1. Id Strange."); + if (id2.IsCollection) + throw new Exception("OpenWrite Fail 2. Resource Property Strange."); + if (info2.IsCollection) + throw new Exception("OpenWrite Fail 3. Resource Property Strange."); + if (info2.Size != 0L) + throw new Exception("OpenWrite Fail 6. Size Strange."); + if (Operators.CompareString(UriUtil.GetLastName(id2.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 4. Filename Strange."); + if (Operators.CompareString(UriUtil.GetLastName(info2.Id.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 5. Filename Strange."); + this.Log("Delete file"); + this.pFS.Delete(id2); + byte[] buffer2 = new byte[1024]; + Random random2 = new Random(this.seed); + this.Log("Write and terminate halfway"); + try + { + long length = checked (size * 2L); + using (Stream st = this.pFS.OpenWrite(id1, name, length)) + { + long num = 0; + while (num < size) + { + random2.NextBytes(buffer2); + if (checked (num + (long) buffer2.Length) > size) + { + st.Write(buffer2, 0, checked ((int) (size - num))); + num = size; + } + else + { + st.Write(buffer2, 0, buffer2.Length); + checked { num += (long) buffer2.Length; } + } + if (!st.CanSeek || st.Position == num) + ; + } + st.Close(); + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId resourceId = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + throw new Exception("should raise error."); + } + catch (InvalidRangeException ex) + { + ProjectData.SetProjectError((Exception) ex); + this.Log("InvalidRangeException OK"); + ProjectData.ClearProjectError(); + } + catch (WebException ex) + { + ProjectData.SetProjectError((Exception) ex); + this.Log("WebException OK"); + ProjectData.ClearProjectError(); + } + try + { + this.pFS.Delete(this.pFS.GetInfo(id1, name).Id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + private void OpenWriteOverTest(Uri @base, string name, long size) + { + this.Log("WriteOver Test filename: " + name); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2; + try + { + this.Log("Check file existance"); + id2 = this.pFS.GetInfo(id1, name).Id; + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + this.Log("Create file"); + ReturnedInfo file = (ReturnedInfo) this.SubCreateFile(id1, name, 0, 0L); + ResourceInfo resourceInfo = file as ResourceInfo; + id2 = resourceInfo == null ? file as ResourceId : resourceInfo.Id; + ProjectData.ClearProjectError(); + } + byte[] buffer1 = new byte[1024]; + Random random1 = new Random(this.seed); + this.Log("WriteOver with long length"); + using (Stream st = this.pFS.OpenWriteOver(id2, size)) + { + long num = 0; + while (num < size) + { + random1.NextBytes(buffer1); + if (checked (num + (long) buffer1.Length) > size) + { + st.Write(buffer1, 0, checked ((int) (size - num))); + num = size; + } + else + { + st.Write(buffer1, 0, buffer1.Length); + checked { num += (long) buffer1.Length; } + } + if (!st.CanSeek || st.Position == num) + ; + } + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + id2 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + ResourceInfo info1 = this.pFS.GetInfo(id2); + if (info1.Id != id2) + throw new Exception("OpenWrite Fail 1. Id Strange."); + if (id2.IsCollection) + throw new Exception("OpenWrite Fail 2. Resource Property Strange."); + if (info1.IsCollection) + throw new Exception("OpenWrite Fail 3. Resource Property Strange."); + if (info1.Size != size) + throw new Exception("OpenWrite Fail 6. Size Strange."); + if (Operators.CompareString(UriUtil.GetLastName(id2.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 4. Filename Strange."); + if (Operators.CompareString(UriUtil.GetLastName(info1.Id.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 5. Filename Strange."); + this.SubReadConfirm(id2, this.seed, size); + byte[] buffer2 = new byte[1024]; + Random random2 = new Random(this.seed); + this.Log("WriteOver with short length"); + long num1 = size / 2L; + using (Stream st = this.pFS.OpenWriteOver(id2, num1)) + { + long num2 = 0; + while (num2 < num1) + { + random2.NextBytes(buffer2); + if (checked (num2 + (long) buffer2.Length) > num1) + { + st.Write(buffer2, 0, checked ((int) (num1 - num2))); + num2 = num1; + } + else + { + st.Write(buffer2, 0, buffer2.Length); + checked { num2 += (long) buffer2.Length; } + } + if (!st.CanSeek || st.Position == num2) + ; + } + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + id2 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + ResourceInfo info2 = this.pFS.GetInfo(id2); + if (info2.Id != id2) + throw new Exception("OpenWrite Fail 1. Id Strange."); + if (id2.IsCollection) + throw new Exception("OpenWrite Fail 2. Resource Property Strange."); + if (info2.IsCollection) + throw new Exception("OpenWrite Fail 3. Resource Property Strange."); + if (info2.Size != num1) + throw new Exception("OpenWrite Fail 6. Size Strange."); + if (Operators.CompareString(UriUtil.GetLastName(id2.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 4. Filename Strange."); + if (Operators.CompareString(UriUtil.GetLastName(info2.Id.Uri), name, false) != 0) + throw new Exception("OpenWrite Fail 5. Filename Strange."); + this.SubReadConfirm(id2, this.seed, num1); + byte[] buffer3 = new byte[1024]; + Random random3 = new Random(this.seed); + this.Log("Terminate halfway"); + try + { + long length = checked (size * 2L); + using (Stream st = this.pFS.OpenWriteOver(id2, length)) + { + long num2 = 0; + while (num2 < size) + { + random3.NextBytes(buffer3); + if (checked (num2 + (long) buffer3.Length) > size) + { + st.Write(buffer3, 0, checked ((int) (size - num2))); + num2 = size; + } + else + { + st.Write(buffer3, 0, buffer3.Length); + checked { num2 += (long) buffer3.Length; } + } + if (!st.CanSeek || st.Position == num2) + ; + } + st.Close(); + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId resourceId = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + throw new Exception("should raise error."); + } + catch (InvalidRangeException ex) + { + ProjectData.SetProjectError((Exception) ex); + this.Log("InvalidRangeException OK"); + ProjectData.ClearProjectError(); + } + catch (WebException ex) + { + ProjectData.SetProjectError((Exception) ex); + this.Log("WebException OK"); + ProjectData.ClearProjectError(); + } + try + { + this.pFS.Delete(this.pFS.GetInfo(id1, name).Id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + private void OpenWriteResumeTest(Uri @base, string name, long size) + { + this.Log("OpenWriteResumeTest " + name); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + byte[] buffer1 = new byte[1024]; + this.Log("Public Function OpenWriteResume(ByVal id As ResourceId, ByRef start As Int64, ByRef length As Int64) As Stream"); + ResourceId id2 = this.SubCreateFile(id1, name, this.seed, size); + long start1 = size; + Random random1 = new Random(this.seed); + using (Stream st = this.pFS.OpenWriteResume(id2, ref start1, ref size)) + { + long num = 0; + byte[] buffer2 = new byte[1024]; + while (num < start1) + { + if (checked (start1 - num) > (long) buffer2.Length) + { + random1.NextBytes(buffer2); + checked { num += (long) buffer2.Length; } + } + else + { + byte[] buffer3 = new byte[checked ((int) (start1 - num - 1L) + 1)]; + random1.NextBytes(buffer3); + checked { num += (long) buffer3.Length; } + } + } + while (num < checked (size * 2L)) + { + if (checked (num + (long) buffer1.Length) > checked (size * 2L)) + { + byte[] buffer3 = new byte[checked ((int) (size * 2L - num) - 1 + 1)]; + random1.NextBytes(buffer3); + st.Write(buffer3, 0, buffer3.Length); + checked { num += (long) buffer3.Length; } + } + else + { + random1.NextBytes(buffer1); + st.Write(buffer1, 0, buffer1.Length); + checked { num += (long) buffer1.Length; } + } + } + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + id2 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + ResourceInfo info1 = this.pFS.GetInfo(id2); + if (info1.Id != id2) + throw new Exception("OpenWriteResume Fail 3. Id Strange."); + if (id2.IsCollection) + throw new Exception("OpenWriteResume Fail 4. Resource Property Strange."); + if (info1.IsCollection) + throw new Exception("OpenWriteResume Fail 5. Resource Property Strange."); + if (info1.Size != checked (size * 2L)) + throw new Exception("OpenWriteResume Fail 6. Size Strange."); + if (Operators.CompareString(UriUtil.GetLastName(id2.Uri), name, false) != 0) + throw new Exception("OpenWriteResume Fail 7. Filename Strange."); + if (Operators.CompareString(UriUtil.GetLastName(info1.Id.Uri), name, false) != 0) + throw new Exception("OpenWriteResume Fail 8. Filename Strange."); + this.SubReadConfirm(id2, this.seed, checked (size * 2L)); + this.pFS.Delete(id2); + this.Log("Public Function OpenWriteResume(ByVal id As ResourceId, ByRef start As Int64, ByRef length As Int64) As Stream"); + ResourceId id3 = this.SubCreateFile(id1, name, this.seed, size); + long start2 = size / 2L; + Random random2 = new Random(this.seed); + FsBase pFs = this.pFS; + ResourceId id4 = id3; + long length = checked (size * 2L - start2); + using (Stream st = pFs.OpenWriteResume(id4, ref start2, ref length)) + { + long num = 0; + byte[] buffer2 = new byte[1024]; + while (num < start2) + { + if (checked (start2 - num) > (long) buffer2.Length) + { + random2.NextBytes(buffer2); + checked { num += (long) buffer2.Length; } + } + else + { + byte[] buffer3 = new byte[checked ((int) (start2 - num - 1L) + 1)]; + random2.NextBytes(buffer3); + checked { num += (long) buffer3.Length; } + } + } + while (num < checked (size * 2L)) + { + if (checked (num + (long) buffer1.Length) > checked (size * 2L)) + { + byte[] buffer3 = new byte[checked ((int) (size * 2L - num) - 1 + 1)]; + random2.NextBytes(buffer3); + st.Write(buffer3, 0, buffer3.Length); + checked { num += (long) buffer3.Length; } + } + else + { + random2.NextBytes(buffer1); + st.Write(buffer1, 0, buffer1.Length); + checked { num += (long) buffer1.Length; } + } + } + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + id3 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + ResourceInfo info2 = this.pFS.GetInfo(id3); + if (info2.Id != id3) + throw new Exception("OpenWriteResume Fail 3. Id Strange."); + if (id3.IsCollection) + throw new Exception("OpenWriteResume Fail 4. Resource Property Strange."); + if (info2.IsCollection) + throw new Exception("OpenWriteResume Fail 5. Resource Property Strange."); + if (info2.Size != checked (size * 2L)) + throw new Exception("OpenWriteResume Fail 6. Size Strange."); + if (Operators.CompareString(UriUtil.GetLastName(id3.Uri), name, false) != 0) + throw new Exception("OpenWriteResume Fail 7. Filename Strange."); + if (Operators.CompareString(UriUtil.GetLastName(info2.Id.Uri), name, false) != 0) + throw new Exception("OpenWriteResume Fail 8. Filename Strange."); + this.SubReadConfirm(id3, this.seed, checked (size * 2L)); + this.pFS.Delete(id3); + this.Log("Public Function OpenWriteResume(ByVal id As ResourceId, ByRef start As Int64, ByRef length As Int64) As Stream"); + try + { + id3 = this.SubCreateFile(id1, name, this.seed, size); + long start3 = size; + Random random3 = new Random(this.seed); + using (Stream st = this.pFS.OpenWriteResume(id3, ref start3, ref size)) + { + long num = 0; + byte[] buffer2 = new byte[1024]; + while (num < start3) + { + if (checked (start3 - num) > (long) buffer2.Length) + { + random3.NextBytes(buffer2); + checked { num += (long) buffer2.Length; } + } + else + { + byte[] buffer3 = new byte[checked ((int) (start3 - num - 1L) + 1)]; + random3.NextBytes(buffer3); + checked { num += (long) buffer3.Length; } + } + } + while (num < size) + { + if (checked (num + (long) buffer1.Length) > size) + { + byte[] buffer3 = new byte[checked ((int) (size - num) - 1 + 1)]; + random3.NextBytes(buffer3); + st.Write(buffer3, 0, buffer3.Length); + checked { num += (long) buffer3.Length; } + } + else + { + random3.NextBytes(buffer1); + st.Write(buffer1, 0, buffer1.Length); + checked { num += (long) buffer1.Length; } + } + } + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + id3 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + } + throw new Exception("should raise error."); + } + catch (InvalidRangeException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (WebException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + try + { + this.pFS.Delete(id3); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + private void CreateTest(Uri @base, string name) + { + this.Log("CreateTest " + name); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + this.Log("CreateCollection(ByVal id As ResourceId) As ResourceInfo"); + ReturnedInfo collection = this.pFS.CreateCollection(id1, name); + ResourceInfo resourceInfo = collection as ResourceInfo; + ResourceId id2 = resourceInfo == null ? collection as ResourceId : resourceInfo.Id; + ResourceInfo info = this.pFS.GetInfo(id2); + if (info.Id != id2) + throw new Exception("CreateCollection Fail 1. id strange."); + if (!id2.IsCollection) + throw new Exception("CreateCollection Fail 2. property strange."); + if (!info.IsCollection) + throw new Exception("CreateCollection Fail 3. property strange."); + if (Operators.CompareString(UriUtil.GetLastName(id2.Uri), name, false) != 0) + throw new Exception("CreateCollection Fail 4. Filename Strange."); + if (Operators.CompareString(UriUtil.GetLastName(info.Id.Uri), name, false) != 0) + throw new Exception("CreateCollection Fail 5. Filename Strange."); + this.pFS.Delete(id2); + } + + private void DeleteTest(Uri @base, string name) + { + this.Log("DeleteTest " + name); + int millisecond = DateTime.Now.Millisecond; + ResourceId id = this.pFS.GetInfo(@base).Id; + ReturnedInfo collection = this.pFS.CreateCollection(id, name); + ResourceInfo resourceInfo = collection as ResourceInfo; + this.pFS.Delete(resourceInfo == null ? collection as ResourceId : resourceInfo.Id); + this.pFS.Delete(this.SubCreateFile(id, name, millisecond, this.FileSize())); + } + + private void MoveTest1(Uri @base, string name, string destname) + { + this.Log("MoveTest1 Rename " + name + " " + destname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Move(file1, (ResourceId) null, destname, false); + Uri uri1 = file1.Uri; + this.SubConfirmNotExists(ref uri1); + ResourceInfo info1 = this.pFS.GetInfo(id1, destname); + this.SubReadConfirm(info1.Id, this.seed, this.FileSize()); + this.pFS.Delete(info1.Id); + ResourceId resourceId; + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None) + { + ResourceId file2 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + resourceId = this.SubCreateFile(id1, destname, this.seed, 10L); + try + { + returnedInfo = this.pFS.Move(file2, (ResourceId) null, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info2 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(info2.Id, this.seed, this.FileSize()); + this.pFS.Delete(info2.Id); + ResourceInfo info3 = this.pFS.GetInfo(id1, destname); + this.SubReadConfirm(info3.Id, this.seed, 10L); + this.pFS.Delete(info3.Id); + } + ResourceId id2 = this.SubCreateFolder(id1, name).Id; + returnedInfo = this.pFS.Move(id2, (ResourceId) null, destname, false); + Uri uri2 = id2.Uri; + this.SubConfirmNotExists(ref uri2); + ResourceInfo info4 = this.pFS.GetInfo(id1, destname); + if (!info4.IsCollection) + throw new Exception(); + this.pFS.Delete(info4.Id); + if ((this.pFS.Ability & FsAbility.IgnoreSameName) != FsAbility.None) + return; + ResourceId id3 = this.SubCreateFolder(id1, name).Id; + resourceId = this.SubCreateFolder(id1, destname).Id; + try + { + returnedInfo = this.pFS.Move(id3, (ResourceId) null, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info5 = this.pFS.GetInfo(id1, name); + if (!info5.IsCollection) + throw new Exception(); + this.pFS.Delete(info5.Id); + ResourceInfo info6 = this.pFS.GetInfo(id1, destname); + if (!info6.IsCollection) + throw new Exception(); + this.pFS.Delete(info6.Id); + } + + private void MoveTest2(Uri @base, string name, string dirname) + { + this.Log("MoveTest2 Move " + name + " " + dirname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Move(file1, id2, (string) null, false); + Uri uri1 = file1.Uri; + this.SubConfirmNotExists(ref uri1); + ResourceInfo info1 = this.pFS.GetInfo(id2, name); + this.SubReadConfirm(info1.Id, this.seed, this.FileSize()); + this.pFS.Delete(info1.Id); + ResourceId resourceId; + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None) + { + ResourceId file2 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + resourceId = this.SubCreateFile(id2, name, this.seed, 10L); + try + { + returnedInfo = this.pFS.Move(file2, id2, (string) null, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info2 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(info2.Id, this.seed, this.FileSize()); + this.pFS.Delete(info2.Id); + ResourceInfo info3 = this.pFS.GetInfo(id2, name); + this.SubReadConfirm(info3.Id, this.seed, 10L); + this.pFS.Delete(info3.Id); + } + ResourceId id3 = this.SubCreateFolder(id1, name).Id; + returnedInfo = this.pFS.Move(id3, id2, (string) null, false); + Uri uri2 = id3.Uri; + this.SubConfirmNotExists(ref uri2); + ResourceInfo info4 = this.pFS.GetInfo(id2, name); + if (!info4.IsCollection) + throw new Exception(); + this.pFS.Delete(info4.Id); + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None) + { + ResourceId id4 = this.SubCreateFolder(id1, name).Id; + resourceId = this.SubCreateFolder(id2, name).Id; + try + { + returnedInfo = this.pFS.Move(id4, id2, (string) null, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info2 = this.pFS.GetInfo(id1, name); + if (!info2.IsCollection) + throw new Exception(); + this.pFS.Delete(info2.Id); + ResourceInfo info3 = this.pFS.GetInfo(id2, name); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(id2); + } + + private void MoveTest3(Uri @base, string name, string destname, string dirname) + { + this.Log("MoveTest3 MoveAndRename " + name + " " + destname + " " + dirname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Move(file1, id2, destname, false); + Uri uri1 = file1.Uri; + this.SubConfirmNotExists(ref uri1); + ResourceInfo info1 = this.pFS.GetInfo(id2, destname); + this.SubReadConfirm(info1.Id, this.seed, this.FileSize()); + this.pFS.Delete(info1.Id); + ResourceId resourceId; + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None) + { + ResourceId file2 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + resourceId = this.SubCreateFile(id2, destname, this.seed, 10L); + try + { + returnedInfo = this.pFS.Move(file2, id2, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info2 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(info2.Id, this.seed, this.FileSize()); + this.pFS.Delete(info2.Id); + ResourceInfo info3 = this.pFS.GetInfo(id2, destname); + this.SubReadConfirm(info3.Id, this.seed, 10L); + this.pFS.Delete(info3.Id); + } + ResourceId id3 = this.SubCreateFolder(id1, name).Id; + returnedInfo = this.pFS.Move(id3, id2, destname, false); + Uri uri2 = id3.Uri; + this.SubConfirmNotExists(ref uri2); + ResourceInfo info4 = this.pFS.GetInfo(id2, destname); + if (!info4.IsCollection) + throw new Exception(); + this.pFS.Delete(info4.Id); + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None) + { + ResourceId id4 = this.SubCreateFolder(id1, name).Id; + resourceId = this.SubCreateFolder(id2, destname).Id; + try + { + returnedInfo = this.pFS.Move(id4, id2, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info2 = this.pFS.GetInfo(id1, name); + if (!info2.IsCollection) + throw new Exception(); + this.pFS.Delete(info2.Id); + ResourceInfo info3 = this.pFS.GetInfo(id2, destname); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(id2); + } + + private void MoveOverwriteTest1(Uri @base, string name, string destname) + { + this.Log("MoveOverwriteTest1 Rename " + name + " " + destname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId file = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + this.SubCreateFile(id1, destname, this.seed2, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Move(file, (ResourceId) null, destname, true); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId id2 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + Uri uri = file.Uri; + this.SubConfirmNotExists(ref uri); + this.pFS.GetInfo(id1, destname); + this.SubReadConfirm(id2, this.seed, this.FileSize()); + this.pFS.Delete(id2); + } + + private void MoveOVerwriteTest2(Uri @base, string name, string dirname) + { + this.Log("MoveOVerwriteTest2 Move " + name + " " + dirname); + this.Log("Public Function Move(ByVal id As ResourceId, ByVal newparentid As ResourceId, null, ByVal overwrite As Boolean) As ResourceId"); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + this.SubCreateFile(id2, name, this.seed2, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Move(file, id2, (string) null, true); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId id3 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + Uri uri = file.Uri; + this.SubConfirmNotExists(ref uri); + this.pFS.GetInfo(id2, name); + this.SubReadConfirm(id3, this.seed, this.FileSize()); + this.pFS.Delete(id3); + this.pFS.Delete(id2); + } + + private void MoveOverwriteTest3(Uri @base, string name, string destname, string dirname) + { + this.Log("MoveOverwriteTest3 MoveAndRename " + name + " " + destname + " " + dirname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + this.SubCreateFile(id2, destname, this.seed2, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Move(file, id2, destname, true); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId id3 = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + Uri uri = file.Uri; + this.SubConfirmNotExists(ref uri); + this.pFS.GetInfo(id2, destname); + this.SubReadConfirm(id3, this.seed, this.FileSize()); + this.pFS.Delete(id3); + this.pFS.Delete(id2); + } + + private void CopyTest1(Uri @base, string name, string destname) + { + this.Log("CopyTest1 RenameCopy " + name + " " + destname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Copy(file1, (ResourceId) null, destname, false); + ResourceInfo info1 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(file1, this.seed, this.FileSize()); + ResourceInfo info2 = this.pFS.GetInfo(id1, destname); + this.SubReadConfirm(info2.Id, this.seed, this.FileSize()); + this.pFS.Delete(info1.Id); + this.pFS.Delete(info2.Id); + ResourceId resourceId; + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None && (this.pFS.Ability & FsAbility.ForceOverwrite) == FsAbility.None) + { + ResourceId file2 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + resourceId = this.SubCreateFile(id1, destname, this.seed, 10L); + try + { + returnedInfo = this.pFS.Copy(file2, (ResourceId) null, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info3 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(info3.Id, this.seed, this.FileSize()); + this.pFS.Delete(info3.Id); + ResourceInfo info4 = this.pFS.GetInfo(id1, destname); + this.SubReadConfirm(info4.Id, this.seed, 10L); + this.pFS.Delete(info4.Id); + } + ResourceInfo resourceInfo1 = this.SubCreateFolder(id1, name); + if (resourceInfo1.CanCopy) + { + returnedInfo = this.pFS.Copy(resourceInfo1.Id, (ResourceId) null, destname, false); + resourceInfo1 = this.pFS.GetInfo(id1, name); + if (!resourceInfo1.IsCollection) + throw new Exception(); + ResourceInfo info3 = this.pFS.GetInfo(id1, destname); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(resourceInfo1.Id); + if ((this.pFS.Ability & FsAbility.IgnoreSameName) != FsAbility.None || (this.pFS.Ability & FsAbility.ForceOverwrite) != FsAbility.None) + return; + ResourceInfo resourceInfo2 = this.SubCreateFolder(id1, name); + if (resourceInfo2.CanCopy) + { + ResourceId id2 = resourceInfo2.Id; + resourceId = this.SubCreateFolder(id1, destname).Id; + try + { + returnedInfo = this.pFS.Copy(id2, (ResourceId) null, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + resourceInfo2 = this.pFS.GetInfo(id1, name); + if (!resourceInfo2.IsCollection) + throw new Exception(); + ResourceInfo info3 = this.pFS.GetInfo(id1, destname); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(resourceInfo2.Id); + } + + private void CopyTest2(Uri @base, string name, string dirname) + { + this.Log("CopyTest2 CopyToFolder " + name + " " + dirname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Copy(file1, id2, (string) null, false); + ResourceInfo info1 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(file1, this.seed, this.FileSize()); + ResourceInfo info2 = this.pFS.GetInfo(id2, name); + this.SubReadConfirm(info2.Id, this.seed, this.FileSize()); + this.pFS.Delete(info1.Id); + this.pFS.Delete(info2.Id); + ResourceId resourceId; + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None && (this.pFS.Ability & FsAbility.ForceOverwrite) == FsAbility.None) + { + ResourceId file2 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + resourceId = this.SubCreateFile(id2, name, this.seed, 10L); + try + { + returnedInfo = this.pFS.Copy(file2, id2, (string) null, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info3 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(info3.Id, this.seed, this.FileSize()); + this.pFS.Delete(info3.Id); + ResourceInfo info4 = this.pFS.GetInfo(id2, name); + this.SubReadConfirm(info4.Id, this.seed, 10L); + this.pFS.Delete(info4.Id); + } + ResourceInfo resourceInfo1 = this.SubCreateFolder(id1, name); + if (resourceInfo1.CanCopy) + { + returnedInfo = this.pFS.Copy(resourceInfo1.Id, id2, (string) null, false); + resourceInfo1 = this.pFS.GetInfo(id1, name); + if (!resourceInfo1.IsCollection) + throw new Exception(); + ResourceInfo info3 = this.pFS.GetInfo(id2, name); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(resourceInfo1.Id); + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None && (this.pFS.Ability & FsAbility.ForceOverwrite) == FsAbility.None) + { + ResourceInfo resourceInfo2 = this.SubCreateFolder(id1, name); + if (resourceInfo2.CanCopy) + { + ResourceId id3 = resourceInfo2.Id; + resourceId = this.SubCreateFolder(id2, name).Id; + try + { + returnedInfo = this.pFS.Copy(id3, id2, (string) null, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + resourceInfo2 = this.pFS.GetInfo(id1, name); + if (!resourceInfo2.IsCollection) + throw new Exception(); + ResourceInfo info3 = this.pFS.GetInfo(id2, name); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(resourceInfo2.Id); + } + this.pFS.Delete(id2); + } + + private void CopyTest3(Uri @base, string name, string destname, string dirname) + { + this.Log("CopyTest3 CopyToFolderAndRename " + name + " " + destname + " " + dirname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Copy(file1, id2, destname, false); + ResourceInfo info1 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(file1, this.seed, this.FileSize()); + ResourceInfo info2 = this.pFS.GetInfo(id2, destname); + this.SubReadConfirm(info2.Id, this.seed, this.FileSize()); + this.pFS.Delete(info1.Id); + this.pFS.Delete(info2.Id); + ResourceId resourceId; + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None && (this.pFS.Ability & FsAbility.ForceOverwrite) == FsAbility.None) + { + ResourceId file2 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + resourceId = this.SubCreateFile(id2, destname, this.seed, 10L); + try + { + returnedInfo = this.pFS.Copy(file2, id2, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info3 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(info3.Id, this.seed, this.FileSize()); + this.pFS.Delete(info3.Id); + ResourceInfo info4 = this.pFS.GetInfo(id2, destname); + this.SubReadConfirm(info4.Id, this.seed, 10L); + this.pFS.Delete(info4.Id); + } + ResourceInfo resourceInfo1 = this.SubCreateFolder(id1, name); + if (resourceInfo1.CanCopy) + { + returnedInfo = this.pFS.Copy(resourceInfo1.Id, id2, destname, false); + resourceInfo1 = this.pFS.GetInfo(id1, name); + if (!resourceInfo1.IsCollection) + throw new Exception(); + ResourceInfo info3 = this.pFS.GetInfo(id2, destname); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(resourceInfo1.Id); + if ((this.pFS.Ability & FsAbility.IgnoreSameName) == FsAbility.None && (this.pFS.Ability & FsAbility.ForceOverwrite) == FsAbility.None) + { + ResourceInfo resourceInfo2 = this.SubCreateFolder(id1, name); + if (resourceInfo2.CanCopy) + { + ResourceId id3 = resourceInfo2.Id; + resourceId = this.SubCreateFolder(id2, destname).Id; + try + { + returnedInfo = this.pFS.Copy(id3, id2, destname, false); + throw new InvalidServerResponseException(); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + resourceInfo2 = this.pFS.GetInfo(id1, name); + if (!resourceInfo2.IsCollection) + throw new Exception(); + ResourceInfo info3 = this.pFS.GetInfo(id2, destname); + if (!info3.IsCollection) + throw new Exception(); + this.pFS.Delete(info3.Id); + } + this.pFS.Delete(resourceInfo2.Id); + } + this.pFS.Delete(id2); + } + + private void CopyOverwriteTest1(Uri @base, string name, string destname) + { + this.Log("CopyOverwriteTest1 RenameCopy " + name + " " + destname); + ResourceId id = this.pFS.GetInfo(@base).Id; + ResourceId file1 = this.SubCreateFile(id, name, this.seed, this.FileSize()); + ResourceId file2 = this.SubCreateFile(id, destname, this.seed2, this.FileSize()); + try + { + this.pFS.Copy(file1, (ResourceId) null, destname, false); + throw new Exception("Copy Fail 5. should not overwritten."); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info1 = this.pFS.GetInfo(id, name); + ResourceInfo info2 = this.pFS.GetInfo(id, destname); + this.SubReadConfirm(file1, this.seed, this.FileSize()); + this.SubReadConfirm(file2, this.seed2, this.FileSize()); + this.pFS.Delete(file1); + this.pFS.Delete(file2); + ResourceId file3 = this.SubCreateFile(id, name, this.seed, this.FileSize()); + ResourceId file4 = this.SubCreateFile(id, destname, this.seed2, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Copy(file3, (ResourceId) null, destname, true); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId resourceId = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + info1 = this.pFS.GetInfo(id, name); + info2 = this.pFS.GetInfo(id, destname); + this.SubReadConfirm(file3, this.seed, this.FileSize()); + this.SubReadConfirm(file4, this.seed, this.FileSize()); + this.pFS.Delete(file3); + this.pFS.Delete(file4); + } + + private void CopyOverwriteTest2(Uri @base, string name, string dirname) + { + this.Log("CopyOverwriteTest2 CopyToFolder " + name + " " + dirname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ResourceId file2 = this.SubCreateFile(id2, name, this.seed2, this.FileSize()); + try + { + this.pFS.Copy(file1, id2, (string) null, false); + throw new Exception("Copy Fail 5. should not overwritten."); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info1 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(file1, this.seed, this.FileSize()); + ResourceInfo info2 = this.pFS.GetInfo(id2, name); + this.SubReadConfirm(file2, this.seed2, this.FileSize()); + this.pFS.Delete(file1); + this.pFS.Delete(file2); + ResourceId file3 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ResourceId file4 = this.SubCreateFile(id2, name, this.seed2, this.FileSize()); + ReturnedInfo returnedInfo = this.pFS.Copy(file3, id2, (string) null, true); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + ResourceId resourceId = resourceInfo == null ? returnedInfo as ResourceId : resourceInfo.Id; + info1 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(file3, this.seed, this.FileSize()); + info2 = this.pFS.GetInfo(id2, name); + this.SubReadConfirm(file4, this.seed, this.FileSize()); + this.pFS.Delete(file3); + this.pFS.Delete(file4); + this.pFS.Delete(id2); + } + + private void CopyOverwriteTest3(Uri @base, string name, string destname, string dirname) + { + this.Log("CopyOverwriteTest3 CopyToFolderAndRename " + name + " " + destname + " " + dirname); + ResourceId id1 = this.pFS.GetInfo(@base).Id; + ResourceId id2 = this.SubCreateFolder(id1, dirname).Id; + ResourceId file1 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ResourceId file2 = this.SubCreateFile(id2, destname, this.seed2, this.FileSize()); + ReturnedInfo returnedInfo; + try + { + returnedInfo = this.pFS.Copy(file1, id2, destname, false); + throw new Exception("Copy Fail 5. should not overwrited."); + } + catch (DestinationAlreadyExistsException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ResourceInfo info1 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(file1, this.seed, this.FileSize()); + ResourceInfo info2 = this.pFS.GetInfo(id2, destname); + this.SubReadConfirm(file2, this.seed2, this.FileSize()); + this.pFS.Delete(file1); + this.pFS.Delete(file2); + ResourceId file3 = this.SubCreateFile(id1, name, this.seed, this.FileSize()); + ResourceId file4 = this.SubCreateFile(id2, destname, this.seed2, this.FileSize()); + returnedInfo = this.pFS.Copy(file3, id2, destname, true); + info1 = this.pFS.GetInfo(id1, name); + this.SubReadConfirm(file3, this.seed, this.FileSize()); + info2 = this.pFS.GetInfo(id2, destname); + this.SubReadConfirm(file4, this.seed, this.FileSize()); + this.pFS.Delete(file3); + this.pFS.Delete(file4); + this.pFS.Delete(id2); + } + + private void SetTimesTest1(Uri @base, string name, DateTime lmt, DateTime lat, DateTime ct) + { + this.Log("SetTimesTest " + name.ToString()); + if ((this.pFS.Ability & FsAbility.CreationTime) == FsAbility.None) + ct = DateTime.MinValue; + if ((this.pFS.Ability & FsAbility.LastModifiedTime) == FsAbility.None) + lmt = DateTime.MinValue; + if ((this.pFS.Ability & FsAbility.LastAccessTime) == FsAbility.None) + lat = DateTime.MinValue; + if (DateTime.Compare(ct, DateTime.MinValue) == 0 && DateTime.Compare(lmt, DateTime.MinValue) == 0 && DateTime.Compare(lat, DateTime.MinValue) == 0) + return; + int millisecond = DateTime.Now.Millisecond; + ResourceId id1 = this.pFS.GetInfo(@base).Id; + try + { + ReturnedInfo info = (ReturnedInfo) this.pFS.GetInfo(id1, name); + ResourceInfo resourceInfo = info as ResourceInfo; + this.pFS.Delete(resourceInfo == null ? info as ResourceId : resourceInfo.Id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + ReturnedInfo collection = this.pFS.CreateCollection(id1, name); + ResourceInfo resourceInfo1 = collection as ResourceInfo; + ResourceId id2 = resourceInfo1 == null ? collection as ResourceId : resourceInfo1.Id; + this.pFS.SetTimes(id2, lmt, ct, lat); + ResourceInfo info1 = this.pFS.GetInfo(id2); + if (DateTime.Compare(lmt, DateTime.MinValue) != 0 && Math.Abs(info1.LastModifiedTime.Subtract(lmt).TotalSeconds) > 1.0) + throw new Exception("SetTimes Fail 1. Last Modified Time."); + TimeSpan timeSpan; + if (DateTime.Compare(ct, DateTime.MinValue) != 0) + { + timeSpan = info1.CreationTime.Subtract(ct); + if (Math.Abs(timeSpan.TotalSeconds) > 1.0) + throw new Exception("SetTimes Fail 2. Creation Time."); + } + if (DateTime.Compare(lat, DateTime.MinValue) != 0) + { + timeSpan = info1.LastAccessTime.Subtract(lat); + if (Math.Abs(timeSpan.TotalSeconds) > 1.0) + throw new Exception("SetTimes Fail 3. Last Access Time."); + } + this.pFS.Delete(id2); + ResourceId file = this.SubCreateFile(id1, name, millisecond, this.FileSize()); + this.pFS.SetTimes(file, lmt, ct, lat); + ResourceInfo info2 = this.pFS.GetInfo(file); + if (DateTime.Compare(lmt, DateTime.MinValue) != 0) + { + timeSpan = info2.LastModifiedTime.Subtract(lmt); + if (Math.Abs(timeSpan.TotalSeconds) > 1.0) + throw new Exception("SetTimes Fail 1. Last Modified Time."); + } + if (DateTime.Compare(ct, DateTime.MinValue) != 0) + { + timeSpan = info2.CreationTime.Subtract(ct); + if (Math.Abs(timeSpan.TotalSeconds) > 1.0) + throw new Exception("SetTimes Fail 2. Creation Time."); + } + if (DateTime.Compare(lat, DateTime.MinValue) != 0) + { + timeSpan = info2.LastAccessTime.Subtract(lat); + if (Math.Abs(timeSpan.TotalSeconds) > 1.0) + throw new Exception("SetTimes Fail 3. Last Access Time."); + } + this.pFS.Delete(file); + } + + private string[] CreateFilenames() + { + List stringList1 = new List(); + if (this.CheckBoxF1.Checked) + stringList1.AddRange((IEnumerable) this.Name_asc); + if (this.CheckBoxF2.Checked) + stringList1.AddRange((IEnumerable) this.Name_space); + if (this.CheckBoxF3.Checked) + stringList1.AddRange((IEnumerable) this.Name_long); + if (this.CheckBoxF4.Checked) + stringList1.AddRange((IEnumerable) this.Name_symbol1); + if (this.CheckBoxF5.Checked) + stringList1.AddRange((IEnumerable) this.Name_symbol2); + if (this.CheckBoxF6.Checked) + stringList1.AddRange((IEnumerable) this.Name_uni); + if (this.CheckBoxF7.Checked) + stringList1.AddRange((IEnumerable) this.Name_longuni); + if (this.CheckBoxF8.Checked) + stringList1.AddRange((IEnumerable) this.Name_symbol3); + if (this.CheckBoxF9.Checked) + stringList1.AddRange((IEnumerable) this.Name_bwspace); + List stringList2 = new List(); + if (this.CheckBoxE0.Checked) + stringList2.AddRange((IEnumerable) this.Ext_none); + if (this.CheckBoxE1.Checked) + stringList2.AddRange((IEnumerable) this.Ext_txt); + if (this.CheckBoxE2.Checked) + stringList2.AddRange((IEnumerable) this.Ext_zip); + if (this.CheckBoxE3.Checked) + stringList2.AddRange((IEnumerable) this.Ext_data); + if (this.CheckBoxE4.Checked) + stringList2.AddRange((IEnumerable) this.Ext_bin); + if (this.CheckBoxE5.Checked) + stringList2.AddRange((IEnumerable) this.Ext_uni); + if (this.CheckBoxE6.Checked) + stringList2.AddRange((IEnumerable) this.Ext_multi); + List stringList3 = new List(); + int count = stringList1.Count; + if (count < stringList2.Count) + count = stringList2.Count; + string text = this.TextBoxExceptChar.Text; + int num1 = 0; + int num2 = checked (count - 1); + int num3 = num1; + while (num3 <= num2) + { + StringBuilder stringBuilder = new StringBuilder(); + string str = stringList1[num3 % stringList1.Count] + stringList2[num3 % stringList2.Count]; + int num4 = 0; + int num5 = checked (str.Length - 1); + int index = num4; + while (index <= num5) + { + if (text.IndexOf(str[index]) < 0) + stringBuilder.Append(str[index]); + checked { ++index; } + } + if (stringBuilder.Length > 0) + stringList3.Add(stringBuilder.ToString()); + checked { ++num3; } + } + return stringList3.ToArray(); + } + + private ResourceId SubCreateFile(ResourceId id, string name, int seed, long size) + { + byte[] buffer = new byte[1024]; + Random random = new Random(seed); + using (Stream st = this.pFS.OpenWrite(id, name, size)) + { + long num = 0; + while (num < size) + { + random.NextBytes(buffer); + if (checked (num + (long) buffer.Length) > size) + { + st.Write(buffer, 0, checked ((int) (size - num))); + num = size; + } + else + { + st.Write(buffer, 0, buffer.Length); + checked { num += (long) buffer.Length; } + } + } + ReturnedInfo returnedInfo = this.pFS.CloseWrite(st); + ResourceInfo resourceInfo = returnedInfo as ResourceInfo; + if (resourceInfo != null) + return resourceInfo.Id; + return (ResourceId) returnedInfo; + } + } + + private ResourceInfo SubCreateFolder(ResourceId id, string name) + { + ReturnedInfo collection = this.pFS.CreateCollection(id, name); + return collection as ResourceInfo ?? this.pFS.GetInfo((ResourceId) collection); + } + + private void SubReadConfirm(ResourceId id, int seed, long size) + { + byte[] buffer1 = new byte[65536]; + Random random = new Random(seed); + FsBase pFs = this.pFS; + ResourceId id1 = id; + long start = 0; + long length = -1; + using (Stream stream = pFs.OpenRead(id1, ref start, ref length)) + { + long num1 = 0; +label_2: + int num2; + try + { + num2 = stream.Read(buffer1, 0, buffer1.Length); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + throw; + } + if (num2 != 0) + { + checked { num1 += (long) num2; } + if (num1 > size) + throw new Exception("Read Fail. File is too long."); + byte[] buffer2 = new byte[checked (num2 - 1 + 1)]; + random.NextBytes(buffer2); + int num3 = 0; + int num4 = checked (num2 - 1); + int index = num3; + while (index <= num4) + { + if ((int) buffer1[index] != (int) buffer2[index]) + throw new Exception("Read Fail. Data doesn't match. "); + checked { ++index; } + } + goto label_2; + } + else if (num1 < size) + throw new Exception("Read Fail. File is too short."); + } + } + + private void SubConfirmNotExists(ref Uri uri) + { + try + { + this.pFS.GetInfo(uri); + throw new Exception("Confirm Fail. File exists."); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + private long FileSize() + { + long result; + if (long.TryParse(this.TextBoxFileSize.Text, out result)) + return checked (result * 1024L); + return this.DefFileSize; + } + + private long LargeFileSize() + { + return checked (this.FileSize() * 100L); + } + + private void SortRis(ResourceInfo[] ris, bool keepfirst) + { + int num1 = 0; + if (keepfirst) + num1 = 1; + int num2 = checked (ris.Length - 2); + int num3 = num1; + int num4 = num2; + while (num4 >= num3) + { + int num5 = num1; + int num6 = num4; + int index = num5; + while (index <= num6) + { + int num7 = string.Compare(ris[index].Id.Uri.ToString(), ris[checked (index + 1)].Id.Uri.ToString()); + if (num7 == 0) + { + num7 = DateTime.Compare(ris[index].LastModifiedTime, ris[checked (index + 1)].LastModifiedTime); + if (num7 == 0) + num7 = DateTime.Compare(ris[index].CreationTime, ris[checked (index + 1)].CreationTime); + } + if (num7 < 0) + { + ResourceInfo ri = ris[index]; + ris[index] = ris[checked (index + 1)]; + ris[checked (index + 1)] = ri; + } + checked { ++index; } + } + checked { num4 += -1; } + } + } + + private DateTime[] CreateTimes() + { + List dateTimeList1 = new List(); + dateTimeList1.Add(DateTime.Now); + List dateTimeList2 = dateTimeList1; + DateTime dateTime1 = new DateTime(1980, 1, 1, 0, 0, 0); + DateTime dateTime2 = dateTime1; + dateTimeList2.Add(dateTime2); + List dateTimeList3 = dateTimeList1; + dateTime1 = new DateTime(1985, 3, 31, 2, 1, 3); + DateTime dateTime3 = dateTime1; + dateTimeList3.Add(dateTime3); + List dateTimeList4 = dateTimeList1; + dateTime1 = new DateTime(1990, 9, 21, 23, 45, 3); + DateTime dateTime4 = dateTime1; + dateTimeList4.Add(dateTime4); + List dateTimeList5 = dateTimeList1; + dateTime1 = new DateTime(2000, 7, 25, 17, 33, 3); + DateTime dateTime5 = dateTime1; + dateTimeList5.Add(dateTime5); + List dateTimeList6 = dateTimeList1; + dateTime1 = new DateTime(2005, 2, 9, 21, 54, 3); + DateTime dateTime6 = dateTime1; + dateTimeList6.Add(dateTime6); + List dateTimeList7 = dateTimeList1; + dateTime1 = new DateTime(2015, 6, 16, 8, 11, 40); + DateTime dateTime7 = dateTime1; + dateTimeList7.Add(dateTime7); + List dateTimeList8 = dateTimeList1; + dateTime1 = new DateTime(2020, 12, 7, 3, 41, 59); + DateTime dateTime8 = dateTime1; + dateTimeList8.Add(dateTime8); + List dateTimeList9 = dateTimeList1; + dateTime1 = new DateTime(2038, 1, 19, 3, 14, 7); + DateTime dateTime9 = dateTime1; + dateTimeList9.Add(dateTime9); + List dateTimeList10 = dateTimeList1; + dateTime1 = new DateTime(2038, 1, 20, 3, 14, 7); + DateTime dateTime10 = dateTime1; + dateTimeList10.Add(dateTime10); + List dateTimeList11 = dateTimeList1; + dateTime1 = new DateTime(2001, 9, 9, 1, 46, 40); + DateTime dateTime11 = dateTime1; + dateTimeList11.Add(dateTime11); + List dateTimeList12 = dateTimeList1; + dateTime1 = new DateTime(2001, 9, 19, 1, 46, 40); + DateTime dateTime12 = dateTime1; + dateTimeList12.Add(dateTime12); + List dateTimeList13 = dateTimeList1; + dateTime1 = new DateTime(2036, 2, 7, 6, 28, 15); + DateTime dateTime13 = dateTime1; + dateTimeList13.Add(dateTime13); + List dateTimeList14 = dateTimeList1; + dateTime1 = new DateTime(2036, 2, 17, 6, 28, 15); + DateTime dateTime14 = dateTime1; + dateTimeList14.Add(dateTime14); + if (!this.CheckBoxFT.Checked) + { + int index = 0; + while (index < dateTimeList1.Count) + { + if (DateTime.Compare(dateTimeList1[index], DateTime.Now) > 0) + dateTimeList1.RemoveAt(index); + else + checked { ++index; } + } + } + return dateTimeList1.ToArray(); + } + } +} diff --git a/CarotDAV/FsTestForm.resx b/CarotDAV/FsTestForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/FsTestForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/LogWriter.cs b/CarotDAV/LogWriter.cs new file mode 100644 index 0000000..0c7a942 --- /dev/null +++ b/CarotDAV/LogWriter.cs @@ -0,0 +1,153 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.LogWriter +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; + +namespace CarotDAV +{ + public class LogWriter + { + private static object pSyncObject = RuntimeHelpers.GetObjectValue(new object()); + private static bool pEnabled = false; + private static string pLogFilePath; + + public static string LogFilePath + { + get + { + object pSyncObject = LogWriter.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + return LogWriter.pLogFilePath; + } + finally + { + Monitor.Exit(pSyncObject); + } + } + set + { + if (value != null && value.Length == 0) + value = (string) null; + object pSyncObject = LogWriter.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + LogWriter.pLogFilePath = value; + } + finally + { + Monitor.Exit(pSyncObject); + } + } + } + + public static bool Enabled + { + get + { + object pSyncObject = LogWriter.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + return LogWriter.pEnabled; + } + finally + { + Monitor.Exit(pSyncObject); + } + } + set + { + object pSyncObject = LogWriter.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + LogWriter.pEnabled = value; + } + finally + { + Monitor.Exit(pSyncObject); + } + } + } + + public static void ClearLog() + { + try + { + File.Delete(LogWriter.LogFilePath); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + public static void WriteException(Exception ex) + { + LogWriter.WriteMessage("Exception", ex.ToString() + "---" + ex.Message + "\r\n" + ex.StackTrace); + } + + public static void WriteNotification(string message) + { + LogWriter.WriteMessage("Notification", message); + } + + public static void WriteMessage(string type, string message) + { + LogWriter.InternalWriteLine(string.Join("", new string[7] + { + "[", + type, + "]", + " ", + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), + " ", + message + })); + } + + protected static void InternalWriteLine(string message) + { + object pSyncObject = LogWriter.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + if (!LogWriter.pEnabled) + return; + if (LogWriter.pLogFilePath == null) + return; + try + { + using (StreamWriter streamWriter = new StreamWriter(LogWriter.pLogFilePath, true, Encoding.UTF8)) + streamWriter.WriteLine(message); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + finally + { + Monitor.Exit(pSyncObject); + } + } + } +} diff --git a/CarotDAV/MainForm.cs b/CarotDAV/MainForm.cs new file mode 100644 index 0000000..cd793b2 --- /dev/null +++ b/CarotDAV/MainForm.cs @@ -0,0 +1,9345 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.MainForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.Win32; +using Rei.Com; +using Rei.Fs; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Net; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class MainForm : Form + { + private static string[] pSizeGroupList = new string[7] + { + "0-10 kiB", + "10-100 kiB", + "100 kiB - 1 MiB", + "1-16 MiB", + "16-128 MiB", + "> 128 MiB", + "Other" + }; + private static string[] pNameGroupList = new string[5] + { + "0-9", + "A-H", + "I-P", + "Q-Z", + "Other" + }; + public static string[] ResourceListViewColumnNames = new string[6] + { + "Name", + "URL", + "State", + "Size", + "Last Modified", + "Creation" + }; + private static System.Drawing.Color sEncryptedColor = System.Drawing.Color.Empty; + private static System.Drawing.Color sCompressedColor = System.Drawing.Color.Empty; + private static System.Drawing.Color SplitColor = System.Drawing.Color.DarkRed; + private static System.Drawing.Color MinorColor = System.Drawing.Color.Gray; + private static int MainFormCounter = 0; + private IContainer components; + [AccessedThroughProperty("LogTextBox")] + private TextBox _LogTextBox; + [AccessedThroughProperty("SplitContainer1")] + private SplitContainer _SplitContainer1; + [AccessedThroughProperty("ResourceListView")] + private WallMarkListView _ResourceListView; + [AccessedThroughProperty("ToolStrip1")] + private NoEatToolStrip _ToolStrip1; + [AccessedThroughProperty("ConnectToolStripButton")] + private ToolStripButton _ConnectToolStripButton; + [AccessedThroughProperty("ToolStripSeparator6")] + private ToolStripSeparator _ToolStripSeparator6; + [AccessedThroughProperty("RefreshToolStripButton")] + private ToolStripButton _RefreshToolStripButton; + [AccessedThroughProperty("NewFolderToolStripButton")] + private ToolStripButton _NewFolderToolStripButton; + [AccessedThroughProperty("ToolStripSeparator7")] + private ToolStripSeparator _ToolStripSeparator7; + [AccessedThroughProperty("UploadToolStripButton")] + private ToolStripButton _UploadToolStripButton; + [AccessedThroughProperty("DownloadToolStripButton")] + private ToolStripButton _DownloadToolStripButton; + [AccessedThroughProperty("ToolStripSeparator8")] + private ToolStripSeparator _ToolStripSeparator8; + [AccessedThroughProperty("DeleteToolStripButton")] + private ToolStripButton _DeleteToolStripButton; + [AccessedThroughProperty("ToolStripSplitButton1")] + private ToolStripSplitButton _ToolStripSplitButton1; + [AccessedThroughProperty("FileToolStripMenuItem")] + private ToolStripMenuItem _FileToolStripMenuItem; + [AccessedThroughProperty("ConnectToolStripMenuItem")] + private ToolStripMenuItem _ConnectToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator1")] + private ToolStripSeparator _ToolStripSeparator1; + [AccessedThroughProperty("ExitToolStripMenuItem")] + private ToolStripMenuItem _ExitToolStripMenuItem; + [AccessedThroughProperty("EditToolStripMenuItem")] + private ToolStripMenuItem _EditToolStripMenuItem; + [AccessedThroughProperty("NewFolderToolStripMenuItem")] + private ToolStripMenuItem _NewFolderToolStripMenuItem; + [AccessedThroughProperty("UploadToolStripMenuItem")] + private ToolStripMenuItem _UploadToolStripMenuItem; + [AccessedThroughProperty("DownloadToolStripMenuItem")] + private ToolStripMenuItem _DownloadToolStripMenuItem; + [AccessedThroughProperty("ToolStripMenuSeparatorUpDown")] + private ToolStripSeparator _ToolStripMenuSeparatorUpDown; + [AccessedThroughProperty("DeleteToolStripMenuItem")] + private ToolStripMenuItem _DeleteToolStripMenuItem; + [AccessedThroughProperty("HelpToolStripMenuItem")] + private ToolStripMenuItem _HelpToolStripMenuItem; + [AccessedThroughProperty("AboutToolStripMenuItem")] + private ToolStripMenuItem _AboutToolStripMenuItem; + [AccessedThroughProperty("MenuStrip1")] + private NoEatMenuStrip _MenuStrip1; + [AccessedThroughProperty("LargeIconToolStripMenuItem")] + private ToolStripMenuItem _LargeIconToolStripMenuItem; + [AccessedThroughProperty("SmallIconToolStripMenuItem")] + private ToolStripMenuItem _SmallIconToolStripMenuItem; + [AccessedThroughProperty("ListToolStripMenuItem")] + private ToolStripMenuItem _ListToolStripMenuItem; + [AccessedThroughProperty("DetailToolStripMenuItem")] + private ToolStripMenuItem _DetailToolStripMenuItem; + [AccessedThroughProperty("ViewToolStripMenuItem")] + private ToolStripMenuItem _ViewToolStripMenuItem; + [AccessedThroughProperty("LargeIconToolStripMenuItem1")] + private ToolStripMenuItem _LargeIconToolStripMenuItem1; + [AccessedThroughProperty("SmallIconToolStripMenuItem1")] + private ToolStripMenuItem _SmallIconToolStripMenuItem1; + [AccessedThroughProperty("ListToolStripMenuItem1")] + private ToolStripMenuItem _ListToolStripMenuItem1; + [AccessedThroughProperty("DetailToolStripMenuItem1")] + private ToolStripMenuItem _DetailToolStripMenuItem1; + [AccessedThroughProperty("FolderBrowserDialog1")] + private FolderBrowserDialog _FolderBrowserDialog1; + [AccessedThroughProperty("OpenFileDialog1")] + private OpenFileDialog _OpenFileDialog1; + [AccessedThroughProperty("PropertyToolStripButton")] + private ToolStripButton _PropertyToolStripButton; + [AccessedThroughProperty("ToolStripSeparator5")] + private ToolStripSeparator _ToolStripSeparator5; + [AccessedThroughProperty("PropertyToolStripMenuItem")] + private ToolStripMenuItem _PropertyToolStripMenuItem; + [AccessedThroughProperty("RenameToolStripMenuItem")] + private ToolStripMenuItem _RenameToolStripMenuItem; + [AccessedThroughProperty("ToolToolStripMenuItem")] + private ToolStripMenuItem _ToolToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator9")] + private ToolStripSeparator _ToolStripSeparator9; + [AccessedThroughProperty("LogToolStripMenuItem")] + private ToolStripMenuItem _LogToolStripMenuItem; + [AccessedThroughProperty("ExpandToolStrip1")] + private RightAlignToolStrip _ExpandToolStrip1; + [AccessedThroughProperty("UriToolStripTextBox")] + private ToolStripTextBox _UriToolStripTextBox; + [AccessedThroughProperty("FaviconToolStripButton")] + private ToolStripButton _FaviconToolStripButton; + [AccessedThroughProperty("ToolStripGoButton")] + private ToolStripButton _ToolStripGoButton; + [AccessedThroughProperty("BackToolStripButton")] + private ToolStripButton _BackToolStripButton; + [AccessedThroughProperty("ForwardToolStripButton")] + private ToolStripButton _ForwardToolStripButton; + [AccessedThroughProperty("ToolStripSeparator11")] + private ToolStripSeparator _ToolStripSeparator11; + [AccessedThroughProperty("GoToParentToolStripButton")] + private ToolStripButton _GoToParentToolStripButton; + [AccessedThroughProperty("ToolStripContainer1")] + private ToolStripContainer _ToolStripContainer1; + [AccessedThroughProperty("BackToolStripMenuItem")] + private ToolStripMenuItem _BackToolStripMenuItem; + [AccessedThroughProperty("ForwardToolStripMenuItem")] + private ToolStripMenuItem _ForwardToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator12")] + private ToolStripSeparator _ToolStripSeparator12; + [AccessedThroughProperty("StatusStrip1")] + private StatusStrip _StatusStrip1; + [AccessedThroughProperty("ToolStripTotal")] + private ToolStripStatusLabel _ToolStripTotal; + [AccessedThroughProperty("ToolStripSelected")] + private ToolStripStatusLabel _ToolStripSelected; + [AccessedThroughProperty("StatusBarToolStripMenuItem")] + private ToolStripMenuItem _StatusBarToolStripMenuItem; + [AccessedThroughProperty("ContextMenuStrip1")] + private ContextMenuStrip _ContextMenuStrip1; + [AccessedThroughProperty("DownloadContextMenuItem")] + private ToolStripMenuItem _DownloadContextMenuItem; + [AccessedThroughProperty("RenameContextMenuItem")] + private ToolStripMenuItem _RenameContextMenuItem; + [AccessedThroughProperty("PropertyContextMenuItem")] + private ToolStripMenuItem _PropertyContextMenuItem; + [AccessedThroughProperty("DeleteContextMenuItem")] + private ToolStripMenuItem _DeleteContextMenuItem; + [AccessedThroughProperty("ContextMenuSeparatorDownload")] + private ToolStripSeparator _ContextMenuSeparatorDownload; + [AccessedThroughProperty("GoToParentContextMenuItem")] + private ToolStripMenuItem _GoToParentContextMenuItem; + [AccessedThroughProperty("RefreshContextMenuItem")] + private ToolStripMenuItem _RefreshContextMenuItem; + [AccessedThroughProperty("ToolStripSeparator16")] + private ToolStripSeparator _ToolStripSeparator16; + [AccessedThroughProperty("NewFolderContextMenuItem")] + private ToolStripMenuItem _NewFolderContextMenuItem; + [AccessedThroughProperty("CopyURIContextMenuItem")] + private ToolStripMenuItem _CopyURIContextMenuItem; + [AccessedThroughProperty("CopyResourceNameContextMenuItem")] + private ToolStripMenuItem _CopyResourceNameContextMenuItem; + [AccessedThroughProperty("ContextMenuSeparatorCopy")] + private ToolStripSeparator _ContextMenuSeparatorCopy; + [AccessedThroughProperty("LogToFileToolStripMenuItem")] + private ToolStripMenuItem _LogToFileToolStripMenuItem; + [AccessedThroughProperty("UploadFolderToolStripButton")] + private ToolStripButton _UploadFolderToolStripButton; + [AccessedThroughProperty("ToolStripSeparator15")] + private ToolStripSeparator _ToolStripSeparator15; + [AccessedThroughProperty("UploadFolderToolStripMenuItem")] + private ToolStripMenuItem _UploadFolderToolStripMenuItem; + [AccessedThroughProperty("TileToolStripMenuItem")] + private ToolStripMenuItem _TileToolStripMenuItem; + [AccessedThroughProperty("TileToolStripMenuItem1")] + private ToolStripMenuItem _TileToolStripMenuItem1; + [AccessedThroughProperty("ViewToolStripMenuItem1")] + private ToolStripMenuItem _ViewToolStripMenuItem1; + [AccessedThroughProperty("LargeIconToolStripMenuItem2")] + private ToolStripMenuItem _LargeIconToolStripMenuItem2; + [AccessedThroughProperty("SmallIconToolStripMenuItem2")] + private ToolStripMenuItem _SmallIconToolStripMenuItem2; + [AccessedThroughProperty("ListToolStripMenuItem2")] + private ToolStripMenuItem _ListToolStripMenuItem2; + [AccessedThroughProperty("TileToolStripMenuItem2")] + private ToolStripMenuItem _TileToolStripMenuItem2; + [AccessedThroughProperty("DetailToolStripMenuItem2")] + private ToolStripMenuItem _DetailToolStripMenuItem2; + [AccessedThroughProperty("ToolStripSeparator20")] + private ToolStripSeparator _ToolStripSeparator20; + [AccessedThroughProperty("AutoColumnWidthToolStripMenuItem")] + private ToolStripMenuItem _AutoColumnWidthToolStripMenuItem; + [AccessedThroughProperty("SortToolStripMenuItem")] + private ToolStripMenuItem _SortToolStripMenuItem; + [AccessedThroughProperty("SortNameToolStripMenuItem")] + private ToolStripMenuItem _SortNameToolStripMenuItem; + [AccessedThroughProperty("SortSizeToolStripMenuItem")] + private ToolStripMenuItem _SortSizeToolStripMenuItem; + [AccessedThroughProperty("SortLastModifiedDateToolStripMenuItem")] + private ToolStripMenuItem _SortLastModifiedDateToolStripMenuItem; + [AccessedThroughProperty("SortCreationDateToolStripMenuItem")] + private ToolStripMenuItem _SortCreationDateToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator19")] + private ToolStripSeparator _ToolStripSeparator19; + [AccessedThroughProperty("ToolStripSeparator21")] + private ToolStripSeparator _ToolStripSeparator21; + [AccessedThroughProperty("SortToolStripMenuItem1")] + private ToolStripMenuItem _SortToolStripMenuItem1; + [AccessedThroughProperty("SortNameToolStripMenuItem1")] + private ToolStripMenuItem _SortNameToolStripMenuItem1; + [AccessedThroughProperty("SortLastModifiedDateToolStripMenuItem1")] + private ToolStripMenuItem _SortLastModifiedDateToolStripMenuItem1; + [AccessedThroughProperty("SortCreationDateToolStripMenuItem1")] + private ToolStripMenuItem _SortCreationDateToolStripMenuItem1; + [AccessedThroughProperty("AutoColumnWidthToolStripMenuItem1")] + private ToolStripMenuItem _AutoColumnWidthToolStripMenuItem1; + [AccessedThroughProperty("ToolStripSeparator22")] + private ToolStripSeparator _ToolStripSeparator22; + [AccessedThroughProperty("SortStatusToolStripMenuItem")] + private ToolStripMenuItem _SortStatusToolStripMenuItem; + [AccessedThroughProperty("SortURIToolStripMenuItem")] + private ToolStripMenuItem _SortURIToolStripMenuItem; + [AccessedThroughProperty("SortStatusToolStripMenuItem1")] + private ToolStripMenuItem _SortStatusToolStripMenuItem1; + [AccessedThroughProperty("SortURIToolStripMenuItem1")] + private ToolStripMenuItem _SortURIToolStripMenuItem1; + [AccessedThroughProperty("ToolStripSeparator23")] + private ToolStripSeparator _ToolStripSeparator23; + [AccessedThroughProperty("AutoColumnWidthToolStripMenuItem2")] + private ToolStripMenuItem _AutoColumnWidthToolStripMenuItem2; + [AccessedThroughProperty("GroupToolStripMenuItem")] + private ToolStripMenuItem _GroupToolStripMenuItem; + [AccessedThroughProperty("GroupNoneToolStripMenuItem")] + private ToolStripMenuItem _GroupNoneToolStripMenuItem; + [AccessedThroughProperty("GroupTypeToolStripMenuItem")] + private ToolStripMenuItem _GroupTypeToolStripMenuItem; + [AccessedThroughProperty("GroupSizeToolStripMenuItem")] + private ToolStripMenuItem _GroupSizeToolStripMenuItem; + [AccessedThroughProperty("GroupToolStripMenuItem1")] + private ToolStripMenuItem _GroupToolStripMenuItem1; + [AccessedThroughProperty("GroupNoneToolStripMenuItem1")] + private ToolStripMenuItem _GroupNoneToolStripMenuItem1; + [AccessedThroughProperty("GroupTypeToolStripMenuItem1")] + private ToolStripMenuItem _GroupTypeToolStripMenuItem1; + [AccessedThroughProperty("GroupSizeToolStripMenuItem1")] + private ToolStripMenuItem _GroupSizeToolStripMenuItem1; + [AccessedThroughProperty("ToolStripSeparator24")] + private ToolStripSeparator _ToolStripSeparator24; + [AccessedThroughProperty("GroupNameToolStripMenuItem")] + private ToolStripMenuItem _GroupNameToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator25")] + private ToolStripSeparator _ToolStripSeparator25; + [AccessedThroughProperty("GroupNameToolStripMenuItem1")] + private ToolStripMenuItem _GroupNameToolStripMenuItem1; + [AccessedThroughProperty("GoToHomeToolStripMenuItem")] + private ToolStripMenuItem _GoToHomeToolStripMenuItem; + [AccessedThroughProperty("GoToParentToolStripMenuItem")] + private ToolStripMenuItem _GoToParentToolStripMenuItem; + [AccessedThroughProperty("RefreshToolStripMenuItem")] + private ToolStripMenuItem _RefreshToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator2")] + private ToolStripSeparator _ToolStripSeparator2; + [AccessedThroughProperty("SelectAllToolStripMenuItem")] + private ToolStripMenuItem _SelectAllToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator10")] + private ToolStripSeparator _ToolStripSeparator10; + [AccessedThroughProperty("TestToolStripMenuItem")] + private ToolStripMenuItem _TestToolStripMenuItem; + [AccessedThroughProperty("PasteToolStripMenuItem")] + private ToolStripMenuItem _PasteToolStripMenuItem; + [AccessedThroughProperty("CopyToolStripMenuItem")] + private ToolStripMenuItem _CopyToolStripMenuItem; + [AccessedThroughProperty("CopyContextMenuItem")] + private ToolStripMenuItem _CopyContextMenuItem; + [AccessedThroughProperty("PasteContextMenuItem")] + private ToolStripMenuItem _PasteContextMenuItem; + [AccessedThroughProperty("SecureToolStripLabel")] + private ToolStripLabel _SecureToolStripLabel; + [AccessedThroughProperty("CutToolStripMenuItem")] + private ToolStripMenuItem _CutToolStripMenuItem; + [AccessedThroughProperty("CutContextMenuItem")] + private ToolStripMenuItem _CutContextMenuItem; + [AccessedThroughProperty("NewVersionToolStripMenuItem")] + private ToolStripMenuItem _NewVersionToolStripMenuItem; + [AccessedThroughProperty("CutToolStripButton")] + private ToolStripButton _CutToolStripButton; + [AccessedThroughProperty("ToolStripSeparator27")] + private ToolStripSeparator _ToolStripSeparator27; + [AccessedThroughProperty("CopyToolStripButton")] + private ToolStripButton _CopyToolStripButton; + [AccessedThroughProperty("PasteToolStripButton")] + private ToolStripButton _PasteToolStripButton; + [AccessedThroughProperty("ToolStripSeparator28")] + private ToolStripSeparator _ToolStripSeparator28; + [AccessedThroughProperty("NewConnectionContextMenuItem")] + private ToolStripMenuItem _NewConnectionContextMenuItem; + [AccessedThroughProperty("ImportContextMenuItem")] + private ToolStripMenuItem _ImportContextMenuItem; + [AccessedThroughProperty("ExportContextMenuItem")] + private ToolStripMenuItem _ExportContextMenuItem; + [AccessedThroughProperty("ImportToolStripMenuItem")] + private ToolStripMenuItem _ImportToolStripMenuItem; + [AccessedThroughProperty("ExportToolStripMenuItem")] + private ToolStripMenuItem _ExportToolStripMenuItem; + [AccessedThroughProperty("NewConnectionToolStripMenuItem")] + private ToolStripMenuItem _NewConnectionToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparatorCustomMenuStart")] + private ToolStripSeparator _ToolStripSeparatorCustomMenuStart; + [AccessedThroughProperty("DuplicateContextMenuItem")] + private ToolStripMenuItem _DuplicateContextMenuItem; + [AccessedThroughProperty("DuplicateToolStripMenuItem")] + private ToolStripMenuItem _DuplicateToolStripMenuItem; + [AccessedThroughProperty("NewConnectionToolStripDropDownButton")] + private ToolStripDropDownButton _NewConnectionToolStripDropDownButton; + [AccessedThroughProperty("ContextMenuSeparatorConnection")] + private ToolStripSeparator _ContextMenuSeparatorConnection; + [AccessedThroughProperty("EnableWebDAVServerToolStripMenuItem")] + private ToolStripMenuItem _EnableWebDAVServerToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator3")] + private ToolStripSeparator _ToolStripSeparator3; + [AccessedThroughProperty("DavServer1")] + private DAVServer _DavServer1; + [AccessedThroughProperty("SettingToolStripMenuItem")] + private ToolStripMenuItem _SettingToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator4")] + private ToolStripSeparator _ToolStripSeparator4; + [AccessedThroughProperty("LargeImageList")] + private ImageList _LargeImageList; + [AccessedThroughProperty("SmallImageList")] + private ImageList _SmallImageList; + private const string VersionCheckUri = "http://rei.to/carotdav.version.txt"; + private const string DownloadUri = "http://rei.to/carotdav.html#download"; + internal const string GroupNameMain = "MainUI"; + internal const string GroupNameUpDown = "UpDown"; + internal static string AppUserModelId; + internal WebDAVClientSetting pSetting; + private ConnectionSettingBase pCurrentConnectionSetting; + private ResourceInfo[] pCurrentResourceInfos; + private bool pIsTemporaryConnection; + private FsBase pFs; + [AccessedThroughProperty("pFaviconDownloadWorker")] + private BackgroundWorker _pFaviconDownloadWorker; + [AccessedThroughProperty("pVersionChecker")] + private BackgroundWorker _pVersionChecker; + private LinkedList pUriHistory; + private LinkedListNode pCurrentHistoryNode; + private Dictionary pUpForms; + private Dictionary pDownForms; + private List pPropertyForms; + private List pDataObjectList; + private CarotDAVDataObject pDraggingDataObject; + private CarotDAVDataObject pLastCopyCutDataObject; + private MainForm.ExtractedData pCurrentExtractedData; + private ListViewItem pCurrentDropHilighted; + private Bitmap pResourceListViewBackgroundImage; + private ImageLayout pResourceListViewBackgroundImageLayout; + private ContentAlignment pResourceListViewBackgroundImageAlignment; + private char pCurrentMountedDrive; + private string pCurrentMappedFolder; + [AccessedThroughProperty("pCache")] + private CacheManager _pCache; + private MainForm.WriteLineLogDel WriteLineLogHandler; + private bool pTaskbarButtonCreated; + public ConnectionSettingBase BootConnection; + private EventHandler RemoteResourceChangedHandler; + private bool needUpdateWindow; + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + this.SplitContainer1 = new SplitContainer(); + this.ResourceListView = new WallMarkListView(); + this.ContextMenuStrip1 = new ContextMenuStrip(this.components); + this.NewConnectionContextMenuItem = new ToolStripMenuItem(); + this.ContextMenuSeparatorConnection = new ToolStripSeparator(); + this.DownloadContextMenuItem = new ToolStripMenuItem(); + this.ContextMenuSeparatorDownload = new ToolStripSeparator(); + this.CutContextMenuItem = new ToolStripMenuItem(); + this.CopyContextMenuItem = new ToolStripMenuItem(); + this.PasteContextMenuItem = new ToolStripMenuItem(); + this.DuplicateContextMenuItem = new ToolStripMenuItem(); + this.DeleteContextMenuItem = new ToolStripMenuItem(); + this.RenameContextMenuItem = new ToolStripMenuItem(); + this.ImportContextMenuItem = new ToolStripMenuItem(); + this.ExportContextMenuItem = new ToolStripMenuItem(); + this.NewFolderContextMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparatorCustomMenuStart = new ToolStripSeparator(); + this.CopyURIContextMenuItem = new ToolStripMenuItem(); + this.CopyResourceNameContextMenuItem = new ToolStripMenuItem(); + this.ContextMenuSeparatorCopy = new ToolStripSeparator(); + this.ViewToolStripMenuItem1 = new ToolStripMenuItem(); + this.LargeIconToolStripMenuItem2 = new ToolStripMenuItem(); + this.SmallIconToolStripMenuItem2 = new ToolStripMenuItem(); + this.ListToolStripMenuItem2 = new ToolStripMenuItem(); + this.TileToolStripMenuItem2 = new ToolStripMenuItem(); + this.DetailToolStripMenuItem2 = new ToolStripMenuItem(); + this.ToolStripSeparator20 = new ToolStripSeparator(); + this.AutoColumnWidthToolStripMenuItem = new ToolStripMenuItem(); + this.SortToolStripMenuItem = new ToolStripMenuItem(); + this.SortNameToolStripMenuItem = new ToolStripMenuItem(); + this.SortSizeToolStripMenuItem = new ToolStripMenuItem(); + this.SortLastModifiedDateToolStripMenuItem = new ToolStripMenuItem(); + this.SortCreationDateToolStripMenuItem = new ToolStripMenuItem(); + this.SortStatusToolStripMenuItem = new ToolStripMenuItem(); + this.SortURIToolStripMenuItem = new ToolStripMenuItem(); + this.GroupToolStripMenuItem = new ToolStripMenuItem(); + this.GroupNoneToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator24 = new ToolStripSeparator(); + this.GroupNameToolStripMenuItem = new ToolStripMenuItem(); + this.GroupSizeToolStripMenuItem = new ToolStripMenuItem(); + this.GroupTypeToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator19 = new ToolStripSeparator(); + this.GoToParentContextMenuItem = new ToolStripMenuItem(); + this.RefreshContextMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator16 = new ToolStripSeparator(); + this.PropertyContextMenuItem = new ToolStripMenuItem(); + this.LargeImageList = new ImageList(this.components); + this.SmallImageList = new ImageList(this.components); + this.LogTextBox = new TextBox(); + this.ToolStrip1 = new NoEatToolStrip(); + this.ConnectToolStripButton = new ToolStripButton(); + this.NewConnectionToolStripDropDownButton = new ToolStripDropDownButton(); + this.ToolStripSeparator6 = new ToolStripSeparator(); + this.BackToolStripButton = new ToolStripButton(); + this.ForwardToolStripButton = new ToolStripButton(); + this.ToolStripSeparator11 = new ToolStripSeparator(); + this.GoToParentToolStripButton = new ToolStripButton(); + this.RefreshToolStripButton = new ToolStripButton(); + this.ToolStripSeparator5 = new ToolStripSeparator(); + this.NewFolderToolStripButton = new ToolStripButton(); + this.ToolStripSeparator27 = new ToolStripSeparator(); + this.CutToolStripButton = new ToolStripButton(); + this.CopyToolStripButton = new ToolStripButton(); + this.PasteToolStripButton = new ToolStripButton(); + this.DeleteToolStripButton = new ToolStripButton(); + this.ToolStripSeparator28 = new ToolStripSeparator(); + this.PropertyToolStripButton = new ToolStripButton(); + this.ToolStripSeparator7 = new ToolStripSeparator(); + this.UploadFolderToolStripButton = new ToolStripButton(); + this.UploadToolStripButton = new ToolStripButton(); + this.DownloadToolStripButton = new ToolStripButton(); + this.ToolStripSeparator8 = new ToolStripSeparator(); + this.ToolStripSplitButton1 = new ToolStripSplitButton(); + this.LargeIconToolStripMenuItem = new ToolStripMenuItem(); + this.SmallIconToolStripMenuItem = new ToolStripMenuItem(); + this.ListToolStripMenuItem = new ToolStripMenuItem(); + this.TileToolStripMenuItem = new ToolStripMenuItem(); + this.DetailToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator23 = new ToolStripSeparator(); + this.AutoColumnWidthToolStripMenuItem2 = new ToolStripMenuItem(); + this.FileToolStripMenuItem = new ToolStripMenuItem(); + this.NewConnectionToolStripMenuItem = new ToolStripMenuItem(); + this.ConnectToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator1 = new ToolStripSeparator(); + this.ExitToolStripMenuItem = new ToolStripMenuItem(); + this.EditToolStripMenuItem = new ToolStripMenuItem(); + this.CutToolStripMenuItem = new ToolStripMenuItem(); + this.CopyToolStripMenuItem = new ToolStripMenuItem(); + this.PasteToolStripMenuItem = new ToolStripMenuItem(); + this.DuplicateToolStripMenuItem = new ToolStripMenuItem(); + this.DeleteToolStripMenuItem = new ToolStripMenuItem(); + this.RenameToolStripMenuItem = new ToolStripMenuItem(); + this.ImportToolStripMenuItem = new ToolStripMenuItem(); + this.ExportToolStripMenuItem = new ToolStripMenuItem(); + this.NewFolderToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator15 = new ToolStripSeparator(); + this.UploadFolderToolStripMenuItem = new ToolStripMenuItem(); + this.UploadToolStripMenuItem = new ToolStripMenuItem(); + this.DownloadToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripMenuSeparatorUpDown = new ToolStripSeparator(); + this.SelectAllToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator10 = new ToolStripSeparator(); + this.PropertyToolStripMenuItem = new ToolStripMenuItem(); + this.HelpToolStripMenuItem = new ToolStripMenuItem(); + this.AboutToolStripMenuItem = new ToolStripMenuItem(); + this.MenuStrip1 = new NoEatMenuStrip(); + this.ViewToolStripMenuItem = new ToolStripMenuItem(); + this.RefreshToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator2 = new ToolStripSeparator(); + this.BackToolStripMenuItem = new ToolStripMenuItem(); + this.ForwardToolStripMenuItem = new ToolStripMenuItem(); + this.GoToParentToolStripMenuItem = new ToolStripMenuItem(); + this.GoToHomeToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator12 = new ToolStripSeparator(); + this.LargeIconToolStripMenuItem1 = new ToolStripMenuItem(); + this.SmallIconToolStripMenuItem1 = new ToolStripMenuItem(); + this.ListToolStripMenuItem1 = new ToolStripMenuItem(); + this.TileToolStripMenuItem1 = new ToolStripMenuItem(); + this.DetailToolStripMenuItem1 = new ToolStripMenuItem(); + this.ToolStripSeparator22 = new ToolStripSeparator(); + this.AutoColumnWidthToolStripMenuItem1 = new ToolStripMenuItem(); + this.ToolStripSeparator21 = new ToolStripSeparator(); + this.SortToolStripMenuItem1 = new ToolStripMenuItem(); + this.SortNameToolStripMenuItem1 = new ToolStripMenuItem(); + this.SortLastModifiedDateToolStripMenuItem1 = new ToolStripMenuItem(); + this.SortCreationDateToolStripMenuItem1 = new ToolStripMenuItem(); + this.SortStatusToolStripMenuItem1 = new ToolStripMenuItem(); + this.SortURIToolStripMenuItem1 = new ToolStripMenuItem(); + this.GroupToolStripMenuItem1 = new ToolStripMenuItem(); + this.GroupNoneToolStripMenuItem1 = new ToolStripMenuItem(); + this.ToolStripSeparator25 = new ToolStripSeparator(); + this.GroupNameToolStripMenuItem1 = new ToolStripMenuItem(); + this.GroupSizeToolStripMenuItem1 = new ToolStripMenuItem(); + this.GroupTypeToolStripMenuItem1 = new ToolStripMenuItem(); + this.ToolStripSeparator9 = new ToolStripSeparator(); + this.LogToolStripMenuItem = new ToolStripMenuItem(); + this.StatusBarToolStripMenuItem = new ToolStripMenuItem(); + this.ToolToolStripMenuItem = new ToolStripMenuItem(); + this.LogToFileToolStripMenuItem = new ToolStripMenuItem(); + this.TestToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator3 = new ToolStripSeparator(); + this.EnableWebDAVServerToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator4 = new ToolStripSeparator(); + this.SettingToolStripMenuItem = new ToolStripMenuItem(); + this.NewVersionToolStripMenuItem = new ToolStripMenuItem(); + this.FolderBrowserDialog1 = new FolderBrowserDialog(); + this.OpenFileDialog1 = new OpenFileDialog(); + this.ExpandToolStrip1 = new RightAlignToolStrip(); + this.FaviconToolStripButton = new ToolStripButton(); + this.SecureToolStripLabel = new ToolStripLabel(); + this.UriToolStripTextBox = new ToolStripTextBox(); + this.ToolStripGoButton = new ToolStripButton(); + this.ToolStripContainer1 = new ToolStripContainer(); + this.StatusStrip1 = new StatusStrip(); + this.ToolStripTotal = new ToolStripStatusLabel(); + this.ToolStripSelected = new ToolStripStatusLabel(); + this.DavServer1 = new DAVServer(this.components); + ToolStripMenuItem toolStripMenuItem1 = new ToolStripMenuItem(); + this.SplitContainer1.Panel1.SuspendLayout(); + this.SplitContainer1.Panel2.SuspendLayout(); + this.SplitContainer1.SuspendLayout(); + this.ContextMenuStrip1.SuspendLayout(); + this.ToolStrip1.SuspendLayout(); + this.MenuStrip1.SuspendLayout(); + this.ExpandToolStrip1.SuspendLayout(); + this.ToolStripContainer1.BottomToolStripPanel.SuspendLayout(); + this.ToolStripContainer1.ContentPanel.SuspendLayout(); + this.ToolStripContainer1.TopToolStripPanel.SuspendLayout(); + this.ToolStripContainer1.SuspendLayout(); + this.StatusStrip1.SuspendLayout(); + this.SuspendLayout(); + toolStripMenuItem1.Name = "SortSizeToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem2 = toolStripMenuItem1; + Size size1 = new Size(185, 22); + Size size2 = size1; + toolStripMenuItem2.Size = size2; + toolStripMenuItem1.Text = "Size"; + toolStripMenuItem1.Click += new EventHandler(this.SortSizeToolStripMenuItem_Click); + this.SplitContainer1.Dock = DockStyle.Fill; + SplitContainer splitContainer1_1 = this.SplitContainer1; + Point point1 = new Point(0, 0); + Point point2 = point1; + splitContainer1_1.Location = point2; + this.SplitContainer1.Name = "SplitContainer1"; + this.SplitContainer1.Orientation = Orientation.Horizontal; + this.SplitContainer1.Panel1.Controls.Add((Control) this.ResourceListView); + this.SplitContainer1.Panel2.Controls.Add((Control) this.LogTextBox); + this.SplitContainer1.Panel2MinSize = 0; + SplitContainer splitContainer1_2 = this.SplitContainer1; + size1 = new Size(498, 162); + Size size3 = size1; + splitContainer1_2.Size = size3; + this.SplitContainer1.SplitterDistance = 131; + this.SplitContainer1.TabIndex = 2; + this.ResourceListView.Alignment = ListViewAlignment.SnapToGrid; + this.ResourceListView.AllowColumnReorder = true; + this.ResourceListView.AllowDrop = true; + this.ResourceListView.ContextMenuStrip = this.ContextMenuStrip1; + this.ResourceListView.Dock = DockStyle.Fill; + this.ResourceListView.FullRowSelect = true; + this.ResourceListView.LabelEdit = true; + this.ResourceListView.LargeImageList = this.LargeImageList; + WallMarkListView resourceListView1 = this.ResourceListView; + point1 = new Point(0, 0); + Point point3 = point1; + resourceListView1.Location = point3; + this.ResourceListView.Name = "ResourceListView"; + WallMarkListView resourceListView2 = this.ResourceListView; + size1 = new Size(498, 131); + Size size4 = size1; + resourceListView2.Size = size4; + this.ResourceListView.SmallImageList = this.SmallImageList; + this.ResourceListView.TabIndex = 0; + this.ResourceListView.UseCompatibleStateImageBehavior = false; + this.ContextMenuStrip1.Items.AddRange(new ToolStripItem[25] + { + (ToolStripItem) this.NewConnectionContextMenuItem, + (ToolStripItem) this.ContextMenuSeparatorConnection, + (ToolStripItem) this.DownloadContextMenuItem, + (ToolStripItem) this.ContextMenuSeparatorDownload, + (ToolStripItem) this.CutContextMenuItem, + (ToolStripItem) this.CopyContextMenuItem, + (ToolStripItem) this.PasteContextMenuItem, + (ToolStripItem) this.DuplicateContextMenuItem, + (ToolStripItem) this.DeleteContextMenuItem, + (ToolStripItem) this.RenameContextMenuItem, + (ToolStripItem) this.ImportContextMenuItem, + (ToolStripItem) this.ExportContextMenuItem, + (ToolStripItem) this.NewFolderContextMenuItem, + (ToolStripItem) this.ToolStripSeparatorCustomMenuStart, + (ToolStripItem) this.CopyURIContextMenuItem, + (ToolStripItem) this.CopyResourceNameContextMenuItem, + (ToolStripItem) this.ContextMenuSeparatorCopy, + (ToolStripItem) this.ViewToolStripMenuItem1, + (ToolStripItem) this.SortToolStripMenuItem, + (ToolStripItem) this.GroupToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator19, + (ToolStripItem) this.GoToParentContextMenuItem, + (ToolStripItem) this.RefreshContextMenuItem, + (ToolStripItem) this.ToolStripSeparator16, + (ToolStripItem) this.PropertyContextMenuItem + }); + this.ContextMenuStrip1.Name = "ContextMenuStrip1"; + ContextMenuStrip contextMenuStrip1 = this.ContextMenuStrip1; + size1 = new Size(202, 458); + Size size5 = size1; + contextMenuStrip1.Size = size5; + this.NewConnectionContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.ConnectNew; + this.NewConnectionContextMenuItem.Name = "NewConnectionContextMenuItem"; + ToolStripMenuItem connectionContextMenuItem = this.NewConnectionContextMenuItem; + size1 = new Size(201, 22); + Size size6 = size1; + connectionContextMenuItem.Size = size6; + this.NewConnectionContextMenuItem.Text = "New Connection"; + this.ContextMenuSeparatorConnection.Name = "ContextMenuSeparatorConnection"; + ToolStripSeparator separatorConnection = this.ContextMenuSeparatorConnection; + size1 = new Size(198, 6); + Size size7 = size1; + separatorConnection.Size = size7; + this.DownloadContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Download; + this.DownloadContextMenuItem.Name = "DownloadContextMenuItem"; + ToolStripMenuItem downloadContextMenuItem = this.DownloadContextMenuItem; + size1 = new Size(201, 22); + Size size8 = size1; + downloadContextMenuItem.Size = size8; + this.DownloadContextMenuItem.Text = "Download"; + this.ContextMenuSeparatorDownload.Name = "ContextMenuSeparatorDownload"; + ToolStripSeparator separatorDownload = this.ContextMenuSeparatorDownload; + size1 = new Size(198, 6); + Size size9 = size1; + separatorDownload.Size = size9; + this.CutContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Cut; + this.CutContextMenuItem.Name = "CutContextMenuItem"; + ToolStripMenuItem cutContextMenuItem = this.CutContextMenuItem; + size1 = new Size(201, 22); + Size size10 = size1; + cutContextMenuItem.Size = size10; + this.CutContextMenuItem.Text = "Cut"; + this.CopyContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Copy2; + this.CopyContextMenuItem.Name = "CopyContextMenuItem"; + ToolStripMenuItem copyContextMenuItem = this.CopyContextMenuItem; + size1 = new Size(201, 22); + Size size11 = size1; + copyContextMenuItem.Size = size11; + this.CopyContextMenuItem.Text = "Copy"; + this.PasteContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Paste; + this.PasteContextMenuItem.Name = "PasteContextMenuItem"; + ToolStripMenuItem pasteContextMenuItem = this.PasteContextMenuItem; + size1 = new Size(201, 22); + Size size12 = size1; + pasteContextMenuItem.Size = size12; + this.PasteContextMenuItem.Text = "Paste"; + this.DuplicateContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Copy; + this.DuplicateContextMenuItem.Name = "DuplicateContextMenuItem"; + ToolStripMenuItem duplicateContextMenuItem = this.DuplicateContextMenuItem; + size1 = new Size(201, 22); + Size size13 = size1; + duplicateContextMenuItem.Size = size13; + this.DuplicateContextMenuItem.Text = "Duplicate"; + this.DeleteContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Delete; + this.DeleteContextMenuItem.Name = "DeleteContextMenuItem"; + ToolStripMenuItem deleteContextMenuItem = this.DeleteContextMenuItem; + size1 = new Size(201, 22); + Size size14 = size1; + deleteContextMenuItem.Size = size14; + this.DeleteContextMenuItem.Text = "Delete(&D)"; + this.RenameContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.RenameFolderHS; + this.RenameContextMenuItem.Name = "RenameContextMenuItem"; + ToolStripMenuItem renameContextMenuItem = this.RenameContextMenuItem; + size1 = new Size(201, 22); + Size size15 = size1; + renameContextMenuItem.Size = size15; + this.RenameContextMenuItem.Text = "Rename(&M)"; + this.ImportContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Import; + this.ImportContextMenuItem.Name = "ImportContextMenuItem"; + ToolStripMenuItem importContextMenuItem = this.ImportContextMenuItem; + size1 = new Size(201, 22); + Size size16 = size1; + importContextMenuItem.Size = size16; + this.ImportContextMenuItem.Text = "Import"; + this.ExportContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Export; + this.ExportContextMenuItem.Name = "ExportContextMenuItem"; + ToolStripMenuItem exportContextMenuItem = this.ExportContextMenuItem; + size1 = new Size(201, 22); + Size size17 = size1; + exportContextMenuItem.Size = size17; + this.ExportContextMenuItem.Text = "Export"; + this.NewFolderContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.NewFolder; + this.NewFolderContextMenuItem.Name = "NewFolderContextMenuItem"; + ToolStripMenuItem folderContextMenuItem = this.NewFolderContextMenuItem; + size1 = new Size(201, 22); + Size size18 = size1; + folderContextMenuItem.Size = size18; + this.NewFolderContextMenuItem.Text = "New Folder(&F)"; + this.ToolStripSeparatorCustomMenuStart.Name = "ToolStripSeparatorCustomMenuStart"; + ToolStripSeparator separatorCustomMenuStart = this.ToolStripSeparatorCustomMenuStart; + size1 = new Size(198, 6); + Size size19 = size1; + separatorCustomMenuStart.Size = size19; + this.CopyURIContextMenuItem.Name = "CopyURIContextMenuItem"; + ToolStripMenuItem uriContextMenuItem = this.CopyURIContextMenuItem; + size1 = new Size(201, 22); + Size size20 = size1; + uriContextMenuItem.Size = size20; + this.CopyURIContextMenuItem.Text = "Copy URI(&C)"; + this.CopyResourceNameContextMenuItem.Name = "CopyResourceNameContextMenuItem"; + ToolStripMenuItem nameContextMenuItem = this.CopyResourceNameContextMenuItem; + size1 = new Size(201, 22); + Size size21 = size1; + nameContextMenuItem.Size = size21; + this.CopyResourceNameContextMenuItem.Text = "Copy Resource Name"; + this.ContextMenuSeparatorCopy.Name = "ContextMenuSeparatorCopy"; + ToolStripSeparator menuSeparatorCopy = this.ContextMenuSeparatorCopy; + size1 = new Size(198, 6); + Size size22 = size1; + menuSeparatorCopy.Size = size22; + this.ViewToolStripMenuItem1.DropDownItems.AddRange(new ToolStripItem[7] + { + (ToolStripItem) this.LargeIconToolStripMenuItem2, + (ToolStripItem) this.SmallIconToolStripMenuItem2, + (ToolStripItem) this.ListToolStripMenuItem2, + (ToolStripItem) this.TileToolStripMenuItem2, + (ToolStripItem) this.DetailToolStripMenuItem2, + (ToolStripItem) this.ToolStripSeparator20, + (ToolStripItem) this.AutoColumnWidthToolStripMenuItem + }); + this.ViewToolStripMenuItem1.Name = "ViewToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_1 = this.ViewToolStripMenuItem1; + size1 = new Size(201, 22); + Size size23 = size1; + toolStripMenuItem1_1.Size = size23; + this.ViewToolStripMenuItem1.Text = "View"; + this.LargeIconToolStripMenuItem2.Name = "LargeIconToolStripMenuItem2"; + ToolStripMenuItem toolStripMenuItem2_1 = this.LargeIconToolStripMenuItem2; + size1 = new Size(189, 22); + Size size24 = size1; + toolStripMenuItem2_1.Size = size24; + this.LargeIconToolStripMenuItem2.Text = "Large Icon"; + this.SmallIconToolStripMenuItem2.Name = "SmallIconToolStripMenuItem2"; + ToolStripMenuItem toolStripMenuItem2_2 = this.SmallIconToolStripMenuItem2; + size1 = new Size(189, 22); + Size size25 = size1; + toolStripMenuItem2_2.Size = size25; + this.SmallIconToolStripMenuItem2.Text = "Small Icon"; + this.ListToolStripMenuItem2.Name = "ListToolStripMenuItem2"; + ToolStripMenuItem toolStripMenuItem2_3 = this.ListToolStripMenuItem2; + size1 = new Size(189, 22); + Size size26 = size1; + toolStripMenuItem2_3.Size = size26; + this.ListToolStripMenuItem2.Text = "List"; + this.TileToolStripMenuItem2.Name = "TileToolStripMenuItem2"; + ToolStripMenuItem toolStripMenuItem2_4 = this.TileToolStripMenuItem2; + size1 = new Size(189, 22); + Size size27 = size1; + toolStripMenuItem2_4.Size = size27; + this.TileToolStripMenuItem2.Text = "Tile"; + this.DetailToolStripMenuItem2.Name = "DetailToolStripMenuItem2"; + ToolStripMenuItem toolStripMenuItem2_5 = this.DetailToolStripMenuItem2; + size1 = new Size(189, 22); + Size size28 = size1; + toolStripMenuItem2_5.Size = size28; + this.DetailToolStripMenuItem2.Text = "Detail"; + this.ToolStripSeparator20.Name = "ToolStripSeparator20"; + ToolStripSeparator stripSeparator20 = this.ToolStripSeparator20; + size1 = new Size(186, 6); + Size size29 = size1; + stripSeparator20.Size = size29; + this.AutoColumnWidthToolStripMenuItem.Name = "AutoColumnWidthToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem3 = this.AutoColumnWidthToolStripMenuItem; + size1 = new Size(189, 22); + Size size30 = size1; + toolStripMenuItem3.Size = size30; + this.AutoColumnWidthToolStripMenuItem.Text = "Auto Column Width"; + this.SortToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[6] + { + (ToolStripItem) this.SortNameToolStripMenuItem, + (ToolStripItem) this.SortSizeToolStripMenuItem, + (ToolStripItem) this.SortLastModifiedDateToolStripMenuItem, + (ToolStripItem) this.SortCreationDateToolStripMenuItem, + (ToolStripItem) this.SortStatusToolStripMenuItem, + (ToolStripItem) this.SortURIToolStripMenuItem + }); + this.SortToolStripMenuItem.Name = "SortToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem4 = this.SortToolStripMenuItem; + size1 = new Size(201, 22); + Size size31 = size1; + toolStripMenuItem4.Size = size31; + this.SortToolStripMenuItem.Text = "Sort"; + this.SortNameToolStripMenuItem.Name = "SortNameToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem5 = this.SortNameToolStripMenuItem; + size1 = new Size(185, 22); + Size size32 = size1; + toolStripMenuItem5.Size = size32; + this.SortNameToolStripMenuItem.Text = "Name"; + this.SortSizeToolStripMenuItem.Name = "SortSizeToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem6 = this.SortSizeToolStripMenuItem; + size1 = new Size(185, 22); + Size size33 = size1; + toolStripMenuItem6.Size = size33; + this.SortSizeToolStripMenuItem.Text = "Size"; + this.SortLastModifiedDateToolStripMenuItem.Name = "SortLastModifiedDateToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem7 = this.SortLastModifiedDateToolStripMenuItem; + size1 = new Size(185, 22); + Size size34 = size1; + toolStripMenuItem7.Size = size34; + this.SortLastModifiedDateToolStripMenuItem.Text = "Last Modified Date"; + this.SortCreationDateToolStripMenuItem.Name = "SortCreationDateToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem8 = this.SortCreationDateToolStripMenuItem; + size1 = new Size(185, 22); + Size size35 = size1; + toolStripMenuItem8.Size = size35; + this.SortCreationDateToolStripMenuItem.Text = "Creation Date"; + this.SortStatusToolStripMenuItem.Name = "SortStatusToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem9 = this.SortStatusToolStripMenuItem; + size1 = new Size(185, 22); + Size size36 = size1; + toolStripMenuItem9.Size = size36; + this.SortStatusToolStripMenuItem.Text = "Status"; + this.SortURIToolStripMenuItem.Name = "SortURIToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem10 = this.SortURIToolStripMenuItem; + size1 = new Size(185, 22); + Size size37 = size1; + toolStripMenuItem10.Size = size37; + this.SortURIToolStripMenuItem.Text = "URI"; + this.GroupToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[5] + { + (ToolStripItem) this.GroupNoneToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator24, + (ToolStripItem) this.GroupNameToolStripMenuItem, + (ToolStripItem) this.GroupSizeToolStripMenuItem, + (ToolStripItem) this.GroupTypeToolStripMenuItem + }); + this.GroupToolStripMenuItem.Name = "GroupToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem11 = this.GroupToolStripMenuItem; + size1 = new Size(201, 22); + Size size38 = size1; + toolStripMenuItem11.Size = size38; + this.GroupToolStripMenuItem.Text = "Group"; + this.GroupNoneToolStripMenuItem.Name = "GroupNoneToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem12 = this.GroupNoneToolStripMenuItem; + size1 = new Size(111, 22); + Size size39 = size1; + toolStripMenuItem12.Size = size39; + this.GroupNoneToolStripMenuItem.Text = "None"; + this.ToolStripSeparator24.Name = "ToolStripSeparator24"; + ToolStripSeparator stripSeparator24 = this.ToolStripSeparator24; + size1 = new Size(108, 6); + Size size40 = size1; + stripSeparator24.Size = size40; + this.GroupNameToolStripMenuItem.Name = "GroupNameToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem13 = this.GroupNameToolStripMenuItem; + size1 = new Size(111, 22); + Size size41 = size1; + toolStripMenuItem13.Size = size41; + this.GroupNameToolStripMenuItem.Text = "Name"; + this.GroupSizeToolStripMenuItem.Name = "GroupSizeToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem14 = this.GroupSizeToolStripMenuItem; + size1 = new Size(111, 22); + Size size42 = size1; + toolStripMenuItem14.Size = size42; + this.GroupSizeToolStripMenuItem.Text = "Size"; + this.GroupTypeToolStripMenuItem.Name = "GroupTypeToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem15 = this.GroupTypeToolStripMenuItem; + size1 = new Size(111, 22); + Size size43 = size1; + toolStripMenuItem15.Size = size43; + this.GroupTypeToolStripMenuItem.Text = "Type"; + this.ToolStripSeparator19.Name = "ToolStripSeparator19"; + ToolStripSeparator stripSeparator19 = this.ToolStripSeparator19; + size1 = new Size(198, 6); + Size size44 = size1; + stripSeparator19.Size = size44; + this.GoToParentContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.GoToParentFolder; + this.GoToParentContextMenuItem.Name = "GoToParentContextMenuItem"; + ToolStripMenuItem parentContextMenuItem = this.GoToParentContextMenuItem; + size1 = new Size(201, 22); + Size size45 = size1; + parentContextMenuItem.Size = size45; + this.GoToParentContextMenuItem.Text = "Go To Parent"; + this.RefreshContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Refresh; + this.RefreshContextMenuItem.Name = "RefreshContextMenuItem"; + ToolStripMenuItem refreshContextMenuItem = this.RefreshContextMenuItem; + size1 = new Size(201, 22); + Size size46 = size1; + refreshContextMenuItem.Size = size46; + this.RefreshContextMenuItem.Text = "Refresh(&E)"; + this.ToolStripSeparator16.Name = "ToolStripSeparator16"; + ToolStripSeparator stripSeparator16 = this.ToolStripSeparator16; + size1 = new Size(198, 6); + Size size47 = size1; + stripSeparator16.Size = size47; + this.PropertyContextMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Properties; + this.PropertyContextMenuItem.Name = "PropertyContextMenuItem"; + this.PropertyContextMenuItem.ShortcutKeyDisplayString = ""; + ToolStripMenuItem propertyContextMenuItem = this.PropertyContextMenuItem; + size1 = new Size(201, 22); + Size size48 = size1; + propertyContextMenuItem.Size = size48; + this.PropertyContextMenuItem.Text = "Property(&R)"; + this.LargeImageList.ColorDepth = ColorDepth.Depth32Bit; + ImageList largeImageList = this.LargeImageList; + size1 = new Size(48, 48); + Size size49 = size1; + largeImageList.ImageSize = size49; + this.LargeImageList.TransparentColor = System.Drawing.Color.Transparent; + this.SmallImageList.ColorDepth = ColorDepth.Depth32Bit; + ImageList smallImageList = this.SmallImageList; + size1 = new Size(16, 16); + Size size50 = size1; + smallImageList.ImageSize = size50; + this.SmallImageList.TransparentColor = System.Drawing.Color.Transparent; + this.LogTextBox.Dock = DockStyle.Fill; + TextBox logTextBox1 = this.LogTextBox; + point1 = new Point(0, 0); + Point point4 = point1; + logTextBox1.Location = point4; + this.LogTextBox.Multiline = true; + this.LogTextBox.Name = "LogTextBox"; + this.LogTextBox.ReadOnly = true; + this.LogTextBox.ScrollBars = ScrollBars.Vertical; + TextBox logTextBox2 = this.LogTextBox; + size1 = new Size(498, 27); + Size size51 = size1; + logTextBox2.Size = size51; + this.LogTextBox.TabIndex = 0; + this.LogTextBox.TabStop = false; + this.ToolStrip1.Dock = DockStyle.None; + this.ToolStrip1.Items.AddRange(new ToolStripItem[23] + { + (ToolStripItem) this.ConnectToolStripButton, + (ToolStripItem) this.NewConnectionToolStripDropDownButton, + (ToolStripItem) this.ToolStripSeparator6, + (ToolStripItem) this.BackToolStripButton, + (ToolStripItem) this.ForwardToolStripButton, + (ToolStripItem) this.ToolStripSeparator11, + (ToolStripItem) this.GoToParentToolStripButton, + (ToolStripItem) this.RefreshToolStripButton, + (ToolStripItem) this.ToolStripSeparator5, + (ToolStripItem) this.NewFolderToolStripButton, + (ToolStripItem) this.ToolStripSeparator27, + (ToolStripItem) this.CutToolStripButton, + (ToolStripItem) this.CopyToolStripButton, + (ToolStripItem) this.PasteToolStripButton, + (ToolStripItem) this.DeleteToolStripButton, + (ToolStripItem) this.ToolStripSeparator28, + (ToolStripItem) this.PropertyToolStripButton, + (ToolStripItem) this.ToolStripSeparator7, + (ToolStripItem) this.UploadFolderToolStripButton, + (ToolStripItem) this.UploadToolStripButton, + (ToolStripItem) this.DownloadToolStripButton, + (ToolStripItem) this.ToolStripSeparator8, + (ToolStripItem) this.ToolStripSplitButton1 + }); + NoEatToolStrip toolStrip1_1 = this.ToolStrip1; + point1 = new Point(0, 26); + Point point5 = point1; + toolStrip1_1.Location = point5; + this.ToolStrip1.Name = "ToolStrip1"; + NoEatToolStrip toolStrip1_2 = this.ToolStrip1; + size1 = new Size(498, 25); + Size size52 = size1; + toolStrip1_2.Size = size52; + this.ToolStrip1.Stretch = true; + this.ToolStrip1.TabIndex = 1; + this.ToolStrip1.Text = "ToolStrip1"; + this.ConnectToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.ConnectToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Connect; + this.ConnectToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.ConnectToolStripButton.Name = "ConnectToolStripButton"; + ToolStripButton connectToolStripButton = this.ConnectToolStripButton; + size1 = new Size(23, 22); + Size size53 = size1; + connectToolStripButton.Size = size53; + this.ConnectToolStripButton.Text = "Connections"; + this.NewConnectionToolStripDropDownButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.NewConnectionToolStripDropDownButton.Image = (Image) CarotDAV.My.Resources.Resources.ConnectNew; + this.NewConnectionToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.NewConnectionToolStripDropDownButton.Name = "NewConnectionToolStripDropDownButton"; + ToolStripDropDownButton stripDropDownButton = this.NewConnectionToolStripDropDownButton; + size1 = new Size(29, 22); + Size size54 = size1; + stripDropDownButton.Size = size54; + this.NewConnectionToolStripDropDownButton.Text = "New Connection"; + this.ToolStripSeparator6.Name = "ToolStripSeparator6"; + ToolStripSeparator toolStripSeparator6 = this.ToolStripSeparator6; + size1 = new Size(6, 25); + Size size55 = size1; + toolStripSeparator6.Size = size55; + this.BackToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.BackToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.NavBack; + this.BackToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.BackToolStripButton.Name = "BackToolStripButton"; + ToolStripButton backToolStripButton = this.BackToolStripButton; + size1 = new Size(23, 22); + Size size56 = size1; + backToolStripButton.Size = size56; + this.BackToolStripButton.Text = "Back"; + this.ForwardToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.ForwardToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.NavForward; + this.ForwardToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.ForwardToolStripButton.Name = "ForwardToolStripButton"; + ToolStripButton forwardToolStripButton = this.ForwardToolStripButton; + size1 = new Size(23, 22); + Size size57 = size1; + forwardToolStripButton.Size = size57; + this.ForwardToolStripButton.Text = "Forward"; + this.ToolStripSeparator11.Name = "ToolStripSeparator11"; + ToolStripSeparator stripSeparator11 = this.ToolStripSeparator11; + size1 = new Size(6, 25); + Size size58 = size1; + stripSeparator11.Size = size58; + this.GoToParentToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.GoToParentToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.GoToParentFolder; + this.GoToParentToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.GoToParentToolStripButton.Name = "GoToParentToolStripButton"; + ToolStripButton parentToolStripButton = this.GoToParentToolStripButton; + size1 = new Size(23, 22); + Size size59 = size1; + parentToolStripButton.Size = size59; + this.GoToParentToolStripButton.Text = "Parent"; + this.RefreshToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.RefreshToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Refresh; + this.RefreshToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.RefreshToolStripButton.Name = "RefreshToolStripButton"; + ToolStripButton refreshToolStripButton = this.RefreshToolStripButton; + size1 = new Size(23, 22); + Size size60 = size1; + refreshToolStripButton.Size = size60; + this.RefreshToolStripButton.Text = "Refresh"; + this.ToolStripSeparator5.Name = "ToolStripSeparator5"; + ToolStripSeparator toolStripSeparator5 = this.ToolStripSeparator5; + size1 = new Size(6, 25); + Size size61 = size1; + toolStripSeparator5.Size = size61; + this.NewFolderToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.NewFolderToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.NewFolder; + this.NewFolderToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.NewFolderToolStripButton.Name = "NewFolderToolStripButton"; + ToolStripButton folderToolStripButton1 = this.NewFolderToolStripButton; + size1 = new Size(23, 22); + Size size62 = size1; + folderToolStripButton1.Size = size62; + this.NewFolderToolStripButton.Text = "New Folder"; + this.ToolStripSeparator27.Name = "ToolStripSeparator27"; + ToolStripSeparator stripSeparator27 = this.ToolStripSeparator27; + size1 = new Size(6, 25); + Size size63 = size1; + stripSeparator27.Size = size63; + this.CutToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.CutToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Cut; + this.CutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.CutToolStripButton.Name = "CutToolStripButton"; + ToolStripButton cutToolStripButton = this.CutToolStripButton; + size1 = new Size(23, 22); + Size size64 = size1; + cutToolStripButton.Size = size64; + this.CutToolStripButton.Text = "Cut"; + this.CopyToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.CopyToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Copy2; + this.CopyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.CopyToolStripButton.Name = "CopyToolStripButton"; + ToolStripButton copyToolStripButton = this.CopyToolStripButton; + size1 = new Size(23, 22); + Size size65 = size1; + copyToolStripButton.Size = size65; + this.CopyToolStripButton.Text = "Copy"; + this.PasteToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.PasteToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Paste; + this.PasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.PasteToolStripButton.Name = "PasteToolStripButton"; + ToolStripButton pasteToolStripButton = this.PasteToolStripButton; + size1 = new Size(23, 22); + Size size66 = size1; + pasteToolStripButton.Size = size66; + this.PasteToolStripButton.Text = "Paste"; + this.DeleteToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.DeleteToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Delete; + this.DeleteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.DeleteToolStripButton.Name = "DeleteToolStripButton"; + ToolStripButton deleteToolStripButton = this.DeleteToolStripButton; + size1 = new Size(23, 22); + Size size67 = size1; + deleteToolStripButton.Size = size67; + this.DeleteToolStripButton.Text = "Delete"; + this.ToolStripSeparator28.Name = "ToolStripSeparator28"; + ToolStripSeparator stripSeparator28 = this.ToolStripSeparator28; + size1 = new Size(6, 25); + Size size68 = size1; + stripSeparator28.Size = size68; + this.PropertyToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.PropertyToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Properties; + this.PropertyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.PropertyToolStripButton.Name = "PropertyToolStripButton"; + ToolStripButton propertyToolStripButton = this.PropertyToolStripButton; + size1 = new Size(23, 22); + Size size69 = size1; + propertyToolStripButton.Size = size69; + this.PropertyToolStripButton.Text = "Property"; + this.ToolStripSeparator7.Name = "ToolStripSeparator7"; + ToolStripSeparator toolStripSeparator7 = this.ToolStripSeparator7; + size1 = new Size(6, 25); + Size size70 = size1; + toolStripSeparator7.Size = size70; + this.UploadFolderToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.UploadFolderToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.FolderUpload; + this.UploadFolderToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.UploadFolderToolStripButton.Name = "UploadFolderToolStripButton"; + ToolStripButton folderToolStripButton2 = this.UploadFolderToolStripButton; + size1 = new Size(23, 22); + Size size71 = size1; + folderToolStripButton2.Size = size71; + this.UploadFolderToolStripButton.Text = "Upload Folder"; + this.UploadToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.UploadToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Upload; + this.UploadToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.UploadToolStripButton.Name = "UploadToolStripButton"; + ToolStripButton uploadToolStripButton = this.UploadToolStripButton; + size1 = new Size(23, 22); + Size size72 = size1; + uploadToolStripButton.Size = size72; + this.UploadToolStripButton.Text = "Upload"; + this.DownloadToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.DownloadToolStripButton.Image = (Image) CarotDAV.My.Resources.Resources.Download; + this.DownloadToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.DownloadToolStripButton.Name = "DownloadToolStripButton"; + ToolStripButton downloadToolStripButton = this.DownloadToolStripButton; + size1 = new Size(23, 22); + Size size73 = size1; + downloadToolStripButton.Size = size73; + this.DownloadToolStripButton.Text = "Download"; + this.ToolStripSeparator8.Name = "ToolStripSeparator8"; + ToolStripSeparator toolStripSeparator8 = this.ToolStripSeparator8; + size1 = new Size(6, 25); + Size size74 = size1; + toolStripSeparator8.Size = size74; + this.ToolStripSplitButton1.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.ToolStripSplitButton1.DropDownItems.AddRange(new ToolStripItem[7] + { + (ToolStripItem) this.LargeIconToolStripMenuItem, + (ToolStripItem) this.SmallIconToolStripMenuItem, + (ToolStripItem) this.ListToolStripMenuItem, + (ToolStripItem) this.TileToolStripMenuItem, + (ToolStripItem) this.DetailToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator23, + (ToolStripItem) this.AutoColumnWidthToolStripMenuItem2 + }); + this.ToolStripSplitButton1.Image = (Image) CarotDAV.My.Resources.Resources.View; + this.ToolStripSplitButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.ToolStripSplitButton1.Name = "ToolStripSplitButton1"; + ToolStripSplitButton stripSplitButton1 = this.ToolStripSplitButton1; + size1 = new Size(32, 22); + Size size75 = size1; + stripSplitButton1.Size = size75; + this.ToolStripSplitButton1.Text = "View"; + this.LargeIconToolStripMenuItem.Name = "LargeIconToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem16 = this.LargeIconToolStripMenuItem; + size1 = new Size(189, 22); + Size size76 = size1; + toolStripMenuItem16.Size = size76; + this.LargeIconToolStripMenuItem.Text = "Large Icon"; + this.SmallIconToolStripMenuItem.Name = "SmallIconToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem17 = this.SmallIconToolStripMenuItem; + size1 = new Size(189, 22); + Size size77 = size1; + toolStripMenuItem17.Size = size77; + this.SmallIconToolStripMenuItem.Text = "Small Icon"; + this.ListToolStripMenuItem.Name = "ListToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem18 = this.ListToolStripMenuItem; + size1 = new Size(189, 22); + Size size78 = size1; + toolStripMenuItem18.Size = size78; + this.ListToolStripMenuItem.Text = "List"; + this.TileToolStripMenuItem.Name = "TileToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem19 = this.TileToolStripMenuItem; + size1 = new Size(189, 22); + Size size79 = size1; + toolStripMenuItem19.Size = size79; + this.TileToolStripMenuItem.Text = "Tile"; + this.DetailToolStripMenuItem.Name = "DetailToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem20 = this.DetailToolStripMenuItem; + size1 = new Size(189, 22); + Size size80 = size1; + toolStripMenuItem20.Size = size80; + this.DetailToolStripMenuItem.Text = "Detail"; + this.ToolStripSeparator23.Name = "ToolStripSeparator23"; + ToolStripSeparator stripSeparator23 = this.ToolStripSeparator23; + size1 = new Size(186, 6); + Size size81 = size1; + stripSeparator23.Size = size81; + this.AutoColumnWidthToolStripMenuItem2.Name = "AutoColumnWidthToolStripMenuItem2"; + ToolStripMenuItem toolStripMenuItem2_6 = this.AutoColumnWidthToolStripMenuItem2; + size1 = new Size(189, 22); + Size size82 = size1; + toolStripMenuItem2_6.Size = size82; + this.AutoColumnWidthToolStripMenuItem2.Text = "Auto Column Width"; + this.FileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[4] + { + (ToolStripItem) this.NewConnectionToolStripMenuItem, + (ToolStripItem) this.ConnectToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator1, + (ToolStripItem) this.ExitToolStripMenuItem + }); + this.FileToolStripMenuItem.Name = "FileToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem21 = this.FileToolStripMenuItem; + size1 = new Size(40, 22); + Size size83 = size1; + toolStripMenuItem21.Size = size83; + this.FileToolStripMenuItem.Text = "File"; + this.NewConnectionToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.ConnectNew; + this.NewConnectionToolStripMenuItem.Name = "NewConnectionToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem22 = this.NewConnectionToolStripMenuItem; + size1 = new Size(194, 22); + Size size84 = size1; + toolStripMenuItem22.Size = size84; + this.NewConnectionToolStripMenuItem.Text = "New Connection"; + this.ConnectToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Connect; + this.ConnectToolStripMenuItem.Name = "ConnectToolStripMenuItem"; + this.ConnectToolStripMenuItem.ShortcutKeys = Keys.O | Keys.Control; + ToolStripMenuItem toolStripMenuItem23 = this.ConnectToolStripMenuItem; + size1 = new Size(194, 22); + Size size85 = size1; + toolStripMenuItem23.Size = size85; + this.ConnectToolStripMenuItem.Text = "Connections"; + this.ToolStripSeparator1.Name = "ToolStripSeparator1"; + ToolStripSeparator toolStripSeparator1 = this.ToolStripSeparator1; + size1 = new Size(191, 6); + Size size86 = size1; + toolStripSeparator1.Size = size86; + this.ExitToolStripMenuItem.Name = "ExitToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem24 = this.ExitToolStripMenuItem; + size1 = new Size(194, 22); + Size size87 = size1; + toolStripMenuItem24.Size = size87; + this.ExitToolStripMenuItem.Text = "Exit"; + this.EditToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[17] + { + (ToolStripItem) this.CutToolStripMenuItem, + (ToolStripItem) this.CopyToolStripMenuItem, + (ToolStripItem) this.PasteToolStripMenuItem, + (ToolStripItem) this.DuplicateToolStripMenuItem, + (ToolStripItem) this.DeleteToolStripMenuItem, + (ToolStripItem) this.RenameToolStripMenuItem, + (ToolStripItem) this.ImportToolStripMenuItem, + (ToolStripItem) this.ExportToolStripMenuItem, + (ToolStripItem) this.NewFolderToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator15, + (ToolStripItem) this.UploadFolderToolStripMenuItem, + (ToolStripItem) this.UploadToolStripMenuItem, + (ToolStripItem) this.DownloadToolStripMenuItem, + (ToolStripItem) this.ToolStripMenuSeparatorUpDown, + (ToolStripItem) this.SelectAllToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator10, + (ToolStripItem) this.PropertyToolStripMenuItem + }); + this.EditToolStripMenuItem.Name = "EditToolStripMenuItem"; + this.EditToolStripMenuItem.ShortcutKeys = Keys.S | Keys.Control; + ToolStripMenuItem toolStripMenuItem25 = this.EditToolStripMenuItem; + size1 = new Size(42, 22); + Size size88 = size1; + toolStripMenuItem25.Size = size88; + this.EditToolStripMenuItem.Text = "Edit"; + this.CutToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Cut; + this.CutToolStripMenuItem.Name = "CutToolStripMenuItem"; + this.CutToolStripMenuItem.ShortcutKeys = Keys.X | Keys.Control; + ToolStripMenuItem toolStripMenuItem26 = this.CutToolStripMenuItem; + size1 = new Size(191, 22); + Size size89 = size1; + toolStripMenuItem26.Size = size89; + this.CutToolStripMenuItem.Text = "Cut"; + this.CopyToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Copy2; + this.CopyToolStripMenuItem.Name = "CopyToolStripMenuItem"; + this.CopyToolStripMenuItem.ShortcutKeys = Keys.C | Keys.Control; + ToolStripMenuItem toolStripMenuItem27 = this.CopyToolStripMenuItem; + size1 = new Size(191, 22); + Size size90 = size1; + toolStripMenuItem27.Size = size90; + this.CopyToolStripMenuItem.Text = "Copy"; + this.PasteToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Paste; + this.PasteToolStripMenuItem.Name = "PasteToolStripMenuItem"; + this.PasteToolStripMenuItem.ShortcutKeys = Keys.V | Keys.Control; + ToolStripMenuItem toolStripMenuItem28 = this.PasteToolStripMenuItem; + size1 = new Size(191, 22); + Size size91 = size1; + toolStripMenuItem28.Size = size91; + this.PasteToolStripMenuItem.Text = "Paste"; + this.DuplicateToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Copy; + this.DuplicateToolStripMenuItem.Name = "DuplicateToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem29 = this.DuplicateToolStripMenuItem; + size1 = new Size(191, 22); + Size size92 = size1; + toolStripMenuItem29.Size = size92; + this.DuplicateToolStripMenuItem.Text = "Duplicate"; + this.DeleteToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Delete; + this.DeleteToolStripMenuItem.Name = "DeleteToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem30 = this.DeleteToolStripMenuItem; + size1 = new Size(191, 22); + Size size93 = size1; + toolStripMenuItem30.Size = size93; + this.DeleteToolStripMenuItem.Text = "Delete"; + this.RenameToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.RenameFolderHS; + this.RenameToolStripMenuItem.Name = "RenameToolStripMenuItem"; + this.RenameToolStripMenuItem.ShortcutKeys = Keys.F2; + ToolStripMenuItem toolStripMenuItem31 = this.RenameToolStripMenuItem; + size1 = new Size(191, 22); + Size size94 = size1; + toolStripMenuItem31.Size = size94; + this.RenameToolStripMenuItem.Text = "Rename"; + this.ImportToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Import; + this.ImportToolStripMenuItem.Name = "ImportToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem32 = this.ImportToolStripMenuItem; + size1 = new Size(191, 22); + Size size95 = size1; + toolStripMenuItem32.Size = size95; + this.ImportToolStripMenuItem.Text = "Import"; + this.ExportToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Export; + this.ExportToolStripMenuItem.Name = "ExportToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem33 = this.ExportToolStripMenuItem; + size1 = new Size(191, 22); + Size size96 = size1; + toolStripMenuItem33.Size = size96; + this.ExportToolStripMenuItem.Text = "Export"; + this.NewFolderToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.NewFolder; + this.NewFolderToolStripMenuItem.Name = "NewFolderToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem34 = this.NewFolderToolStripMenuItem; + size1 = new Size(191, 22); + Size size97 = size1; + toolStripMenuItem34.Size = size97; + this.NewFolderToolStripMenuItem.Text = "New Folder"; + this.ToolStripSeparator15.Name = "ToolStripSeparator15"; + ToolStripSeparator stripSeparator15 = this.ToolStripSeparator15; + size1 = new Size(188, 6); + Size size98 = size1; + stripSeparator15.Size = size98; + this.UploadFolderToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.FolderUpload; + this.UploadFolderToolStripMenuItem.Name = "UploadFolderToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem35 = this.UploadFolderToolStripMenuItem; + size1 = new Size(191, 22); + Size size99 = size1; + toolStripMenuItem35.Size = size99; + this.UploadFolderToolStripMenuItem.Text = "Upload Folder"; + this.UploadToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Upload; + this.UploadToolStripMenuItem.Name = "UploadToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem36 = this.UploadToolStripMenuItem; + size1 = new Size(191, 22); + Size size100 = size1; + toolStripMenuItem36.Size = size100; + this.UploadToolStripMenuItem.Text = "Upload"; + this.DownloadToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Download; + this.DownloadToolStripMenuItem.Name = "DownloadToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem37 = this.DownloadToolStripMenuItem; + size1 = new Size(191, 22); + Size size101 = size1; + toolStripMenuItem37.Size = size101; + this.DownloadToolStripMenuItem.Text = "Download"; + this.ToolStripMenuSeparatorUpDown.Name = "ToolStripMenuSeparatorUpDown"; + ToolStripSeparator menuSeparatorUpDown = this.ToolStripMenuSeparatorUpDown; + size1 = new Size(188, 6); + Size size102 = size1; + menuSeparatorUpDown.Size = size102; + this.SelectAllToolStripMenuItem.Name = "SelectAllToolStripMenuItem"; + this.SelectAllToolStripMenuItem.ShortcutKeys = Keys.A | Keys.Control; + ToolStripMenuItem toolStripMenuItem38 = this.SelectAllToolStripMenuItem; + size1 = new Size(191, 22); + Size size103 = size1; + toolStripMenuItem38.Size = size103; + this.SelectAllToolStripMenuItem.Text = "Select All"; + this.ToolStripSeparator10.Name = "ToolStripSeparator10"; + ToolStripSeparator stripSeparator10 = this.ToolStripSeparator10; + size1 = new Size(188, 6); + Size size104 = size1; + stripSeparator10.Size = size104; + this.PropertyToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Properties; + this.PropertyToolStripMenuItem.Name = "PropertyToolStripMenuItem"; + this.PropertyToolStripMenuItem.ShortcutKeys = Keys.Return | Keys.Alt; + ToolStripMenuItem toolStripMenuItem39 = this.PropertyToolStripMenuItem; + size1 = new Size(191, 22); + Size size105 = size1; + toolStripMenuItem39.Size = size105; + this.PropertyToolStripMenuItem.Text = "Property"; + this.HelpToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[1] + { + (ToolStripItem) this.AboutToolStripMenuItem + }); + this.HelpToolStripMenuItem.Name = "HelpToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem40 = this.HelpToolStripMenuItem; + size1 = new Size(46, 22); + Size size106 = size1; + toolStripMenuItem40.Size = size106; + this.HelpToolStripMenuItem.Text = "Help"; + this.AboutToolStripMenuItem.Name = "AboutToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem41 = this.AboutToolStripMenuItem; + size1 = new Size(110, 22); + Size size107 = size1; + toolStripMenuItem41.Size = size107; + this.AboutToolStripMenuItem.Text = "About"; + this.MenuStrip1.Dock = DockStyle.None; + this.MenuStrip1.Items.AddRange(new ToolStripItem[6] + { + (ToolStripItem) this.FileToolStripMenuItem, + (ToolStripItem) this.EditToolStripMenuItem, + (ToolStripItem) this.ViewToolStripMenuItem, + (ToolStripItem) this.ToolToolStripMenuItem, + (ToolStripItem) this.HelpToolStripMenuItem, + (ToolStripItem) this.NewVersionToolStripMenuItem + }); + NoEatMenuStrip menuStrip1_1 = this.MenuStrip1; + point1 = new Point(0, 0); + Point point6 = point1; + menuStrip1_1.Location = point6; + this.MenuStrip1.Name = "MenuStrip1"; + NoEatMenuStrip menuStrip1_2 = this.MenuStrip1; + size1 = new Size(498, 26); + Size size108 = size1; + menuStrip1_2.Size = size108; + this.MenuStrip1.TabIndex = 0; + this.MenuStrip1.Text = "MenuStrip1"; + this.ViewToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[20] + { + (ToolStripItem) this.RefreshToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator2, + (ToolStripItem) this.BackToolStripMenuItem, + (ToolStripItem) this.ForwardToolStripMenuItem, + (ToolStripItem) this.GoToParentToolStripMenuItem, + (ToolStripItem) this.GoToHomeToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator12, + (ToolStripItem) this.LargeIconToolStripMenuItem1, + (ToolStripItem) this.SmallIconToolStripMenuItem1, + (ToolStripItem) this.ListToolStripMenuItem1, + (ToolStripItem) this.TileToolStripMenuItem1, + (ToolStripItem) this.DetailToolStripMenuItem1, + (ToolStripItem) this.ToolStripSeparator22, + (ToolStripItem) this.AutoColumnWidthToolStripMenuItem1, + (ToolStripItem) this.ToolStripSeparator21, + (ToolStripItem) this.SortToolStripMenuItem1, + (ToolStripItem) this.GroupToolStripMenuItem1, + (ToolStripItem) this.ToolStripSeparator9, + (ToolStripItem) this.LogToolStripMenuItem, + (ToolStripItem) this.StatusBarToolStripMenuItem + }); + this.ViewToolStripMenuItem.Name = "ViewToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem42 = this.ViewToolStripMenuItem; + size1 = new Size(48, 22); + Size size109 = size1; + toolStripMenuItem42.Size = size109; + this.ViewToolStripMenuItem.Text = "View"; + this.RefreshToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Refresh; + this.RefreshToolStripMenuItem.Name = "RefreshToolStripMenuItem"; + this.RefreshToolStripMenuItem.ShortcutKeys = Keys.F5; + ToolStripMenuItem toolStripMenuItem43 = this.RefreshToolStripMenuItem; + size1 = new Size(218, 22); + Size size110 = size1; + toolStripMenuItem43.Size = size110; + this.RefreshToolStripMenuItem.Text = "Refresh"; + this.ToolStripSeparator2.Name = "ToolStripSeparator2"; + ToolStripSeparator toolStripSeparator2 = this.ToolStripSeparator2; + size1 = new Size(215, 6); + Size size111 = size1; + toolStripSeparator2.Size = size111; + this.BackToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.NavBack; + this.BackToolStripMenuItem.Name = "BackToolStripMenuItem"; + this.BackToolStripMenuItem.ShortcutKeys = Keys.Left | Keys.Alt; + ToolStripMenuItem toolStripMenuItem44 = this.BackToolStripMenuItem; + size1 = new Size(218, 22); + Size size112 = size1; + toolStripMenuItem44.Size = size112; + this.BackToolStripMenuItem.Text = "Back"; + this.ForwardToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.NavForward; + this.ForwardToolStripMenuItem.Name = "ForwardToolStripMenuItem"; + this.ForwardToolStripMenuItem.ShortcutKeys = Keys.Right | Keys.Alt; + ToolStripMenuItem toolStripMenuItem45 = this.ForwardToolStripMenuItem; + size1 = new Size(218, 22); + Size size113 = size1; + toolStripMenuItem45.Size = size113; + this.ForwardToolStripMenuItem.Text = "Forward"; + this.GoToParentToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.GoToParentFolder; + this.GoToParentToolStripMenuItem.Name = "GoToParentToolStripMenuItem"; + this.GoToParentToolStripMenuItem.ShortcutKeys = Keys.Up | Keys.Alt; + ToolStripMenuItem toolStripMenuItem46 = this.GoToParentToolStripMenuItem; + size1 = new Size(218, 22); + Size size114 = size1; + toolStripMenuItem46.Size = size114; + this.GoToParentToolStripMenuItem.Text = "Go To Parent"; + this.GoToHomeToolStripMenuItem.Image = (Image) CarotDAV.My.Resources.Resources.Home; + this.GoToHomeToolStripMenuItem.Name = "GoToHomeToolStripMenuItem"; + this.GoToHomeToolStripMenuItem.ShortcutKeys = Keys.Home | Keys.Alt; + ToolStripMenuItem toolStripMenuItem47 = this.GoToHomeToolStripMenuItem; + size1 = new Size(218, 22); + Size size115 = size1; + toolStripMenuItem47.Size = size115; + this.GoToHomeToolStripMenuItem.Text = "Go To Home"; + this.ToolStripSeparator12.Name = "ToolStripSeparator12"; + ToolStripSeparator stripSeparator12 = this.ToolStripSeparator12; + size1 = new Size(215, 6); + Size size116 = size1; + stripSeparator12.Size = size116; + this.LargeIconToolStripMenuItem1.Name = "LargeIconToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_2 = this.LargeIconToolStripMenuItem1; + size1 = new Size(218, 22); + Size size117 = size1; + toolStripMenuItem1_2.Size = size117; + this.LargeIconToolStripMenuItem1.Text = "Large Icon"; + this.SmallIconToolStripMenuItem1.Name = "SmallIconToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_3 = this.SmallIconToolStripMenuItem1; + size1 = new Size(218, 22); + Size size118 = size1; + toolStripMenuItem1_3.Size = size118; + this.SmallIconToolStripMenuItem1.Text = "Small Icon"; + this.ListToolStripMenuItem1.Name = "ListToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_4 = this.ListToolStripMenuItem1; + size1 = new Size(218, 22); + Size size119 = size1; + toolStripMenuItem1_4.Size = size119; + this.ListToolStripMenuItem1.Text = "List"; + this.TileToolStripMenuItem1.Name = "TileToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_5 = this.TileToolStripMenuItem1; + size1 = new Size(218, 22); + Size size120 = size1; + toolStripMenuItem1_5.Size = size120; + this.TileToolStripMenuItem1.Text = "Tile"; + this.DetailToolStripMenuItem1.Name = "DetailToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_6 = this.DetailToolStripMenuItem1; + size1 = new Size(218, 22); + Size size121 = size1; + toolStripMenuItem1_6.Size = size121; + this.DetailToolStripMenuItem1.Text = "Detail"; + this.ToolStripSeparator22.Name = "ToolStripSeparator22"; + ToolStripSeparator stripSeparator22 = this.ToolStripSeparator22; + size1 = new Size(215, 6); + Size size122 = size1; + stripSeparator22.Size = size122; + this.AutoColumnWidthToolStripMenuItem1.Name = "AutoColumnWidthToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_7 = this.AutoColumnWidthToolStripMenuItem1; + size1 = new Size(218, 22); + Size size123 = size1; + toolStripMenuItem1_7.Size = size123; + this.AutoColumnWidthToolStripMenuItem1.Text = "Auto Column Width"; + this.ToolStripSeparator21.Name = "ToolStripSeparator21"; + ToolStripSeparator stripSeparator21 = this.ToolStripSeparator21; + size1 = new Size(215, 6); + Size size124 = size1; + stripSeparator21.Size = size124; + this.SortToolStripMenuItem1.DropDownItems.AddRange(new ToolStripItem[6] + { + (ToolStripItem) this.SortNameToolStripMenuItem1, + (ToolStripItem) toolStripMenuItem1, + (ToolStripItem) this.SortLastModifiedDateToolStripMenuItem1, + (ToolStripItem) this.SortCreationDateToolStripMenuItem1, + (ToolStripItem) this.SortStatusToolStripMenuItem1, + (ToolStripItem) this.SortURIToolStripMenuItem1 + }); + this.SortToolStripMenuItem1.Name = "SortToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_8 = this.SortToolStripMenuItem1; + size1 = new Size(218, 22); + Size size125 = size1; + toolStripMenuItem1_8.Size = size125; + this.SortToolStripMenuItem1.Text = "Sort"; + this.SortNameToolStripMenuItem1.Name = "SortNameToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_9 = this.SortNameToolStripMenuItem1; + size1 = new Size(185, 22); + Size size126 = size1; + toolStripMenuItem1_9.Size = size126; + this.SortNameToolStripMenuItem1.Text = "Name"; + this.SortLastModifiedDateToolStripMenuItem1.Name = "SortLastModifiedDateToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_10 = this.SortLastModifiedDateToolStripMenuItem1; + size1 = new Size(185, 22); + Size size127 = size1; + toolStripMenuItem1_10.Size = size127; + this.SortLastModifiedDateToolStripMenuItem1.Text = "Last Modified Date"; + this.SortCreationDateToolStripMenuItem1.Name = "SortCreationDateToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_11 = this.SortCreationDateToolStripMenuItem1; + size1 = new Size(185, 22); + Size size128 = size1; + toolStripMenuItem1_11.Size = size128; + this.SortCreationDateToolStripMenuItem1.Text = "Creation Date"; + this.SortStatusToolStripMenuItem1.Name = "SortStatusToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_12 = this.SortStatusToolStripMenuItem1; + size1 = new Size(185, 22); + Size size129 = size1; + toolStripMenuItem1_12.Size = size129; + this.SortStatusToolStripMenuItem1.Text = "Status"; + this.SortURIToolStripMenuItem1.Name = "SortURIToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_13 = this.SortURIToolStripMenuItem1; + size1 = new Size(185, 22); + Size size130 = size1; + toolStripMenuItem1_13.Size = size130; + this.SortURIToolStripMenuItem1.Text = "URI"; + this.GroupToolStripMenuItem1.DropDownItems.AddRange(new ToolStripItem[5] + { + (ToolStripItem) this.GroupNoneToolStripMenuItem1, + (ToolStripItem) this.ToolStripSeparator25, + (ToolStripItem) this.GroupNameToolStripMenuItem1, + (ToolStripItem) this.GroupSizeToolStripMenuItem1, + (ToolStripItem) this.GroupTypeToolStripMenuItem1 + }); + this.GroupToolStripMenuItem1.Name = "GroupToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_14 = this.GroupToolStripMenuItem1; + size1 = new Size(218, 22); + Size size131 = size1; + toolStripMenuItem1_14.Size = size131; + this.GroupToolStripMenuItem1.Text = "Group"; + this.GroupNoneToolStripMenuItem1.Name = "GroupNoneToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_15 = this.GroupNoneToolStripMenuItem1; + size1 = new Size(111, 22); + Size size132 = size1; + toolStripMenuItem1_15.Size = size132; + this.GroupNoneToolStripMenuItem1.Text = "None"; + this.ToolStripSeparator25.Name = "ToolStripSeparator25"; + ToolStripSeparator stripSeparator25 = this.ToolStripSeparator25; + size1 = new Size(108, 6); + Size size133 = size1; + stripSeparator25.Size = size133; + this.GroupNameToolStripMenuItem1.Name = "GroupNameToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_16 = this.GroupNameToolStripMenuItem1; + size1 = new Size(111, 22); + Size size134 = size1; + toolStripMenuItem1_16.Size = size134; + this.GroupNameToolStripMenuItem1.Text = "Name"; + this.GroupSizeToolStripMenuItem1.Name = "GroupSizeToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_17 = this.GroupSizeToolStripMenuItem1; + size1 = new Size(111, 22); + Size size135 = size1; + toolStripMenuItem1_17.Size = size135; + this.GroupSizeToolStripMenuItem1.Text = "Size"; + this.GroupTypeToolStripMenuItem1.Name = "GroupTypeToolStripMenuItem1"; + ToolStripMenuItem toolStripMenuItem1_18 = this.GroupTypeToolStripMenuItem1; + size1 = new Size(111, 22); + Size size136 = size1; + toolStripMenuItem1_18.Size = size136; + this.GroupTypeToolStripMenuItem1.Text = "Type"; + this.ToolStripSeparator9.Name = "ToolStripSeparator9"; + ToolStripSeparator toolStripSeparator9 = this.ToolStripSeparator9; + size1 = new Size(215, 6); + Size size137 = size1; + toolStripSeparator9.Size = size137; + this.LogToolStripMenuItem.Name = "LogToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem48 = this.LogToolStripMenuItem; + size1 = new Size(218, 22); + Size size138 = size1; + toolStripMenuItem48.Size = size138; + this.LogToolStripMenuItem.Text = "Log"; + this.StatusBarToolStripMenuItem.Name = "StatusBarToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem49 = this.StatusBarToolStripMenuItem; + size1 = new Size(218, 22); + Size size139 = size1; + toolStripMenuItem49.Size = size139; + this.StatusBarToolStripMenuItem.Text = "Status Bar"; + this.ToolToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[6] + { + (ToolStripItem) this.LogToFileToolStripMenuItem, + (ToolStripItem) this.TestToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator3, + (ToolStripItem) this.EnableWebDAVServerToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator4, + (ToolStripItem) this.SettingToolStripMenuItem + }); + this.ToolToolStripMenuItem.Name = "ToolToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem50 = this.ToolToolStripMenuItem; + size1 = new Size(44, 22); + Size size140 = size1; + toolStripMenuItem50.Size = size140; + this.ToolToolStripMenuItem.Text = "Tool"; + this.LogToFileToolStripMenuItem.Name = "LogToFileToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem51 = this.LogToFileToolStripMenuItem; + size1 = new Size(211, 22); + Size size141 = size1; + toolStripMenuItem51.Size = size141; + this.LogToFileToolStripMenuItem.Text = "Log to File"; + this.TestToolStripMenuItem.Name = "TestToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem52 = this.TestToolStripMenuItem; + size1 = new Size(211, 22); + Size size142 = size1; + toolStripMenuItem52.Size = size142; + this.TestToolStripMenuItem.Text = "Test"; + this.TestToolStripMenuItem.Visible = false; + this.ToolStripSeparator3.Name = "ToolStripSeparator3"; + ToolStripSeparator toolStripSeparator3 = this.ToolStripSeparator3; + size1 = new Size(208, 6); + Size size143 = size1; + toolStripSeparator3.Size = size143; + this.EnableWebDAVServerToolStripMenuItem.Name = "EnableWebDAVServerToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem53 = this.EnableWebDAVServerToolStripMenuItem; + size1 = new Size(211, 22); + Size size144 = size1; + toolStripMenuItem53.Size = size144; + this.EnableWebDAVServerToolStripMenuItem.Text = "Enable WebDAV Server"; + this.ToolStripSeparator4.Name = "ToolStripSeparator4"; + ToolStripSeparator toolStripSeparator4 = this.ToolStripSeparator4; + size1 = new Size(208, 6); + Size size145 = size1; + toolStripSeparator4.Size = size145; + this.SettingToolStripMenuItem.Name = "SettingToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem54 = this.SettingToolStripMenuItem; + size1 = new Size(211, 22); + Size size146 = size1; + toolStripMenuItem54.Size = size146; + this.SettingToolStripMenuItem.Text = "Setting"; + this.NewVersionToolStripMenuItem.ForeColor = System.Drawing.Color.Red; + this.NewVersionToolStripMenuItem.Name = "NewVersionToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem55 = this.NewVersionToolStripMenuItem; + size1 = new Size(92, 22); + Size size147 = size1; + toolStripMenuItem55.Size = size147; + this.NewVersionToolStripMenuItem.Text = "New Version"; + this.NewVersionToolStripMenuItem.Visible = false; + this.OpenFileDialog1.Multiselect = true; + this.OpenFileDialog1.SupportMultiDottedExtensions = true; + this.ExpandToolStrip1.Dock = DockStyle.None; + this.ExpandToolStrip1.Items.AddRange(new ToolStripItem[4] + { + (ToolStripItem) this.FaviconToolStripButton, + (ToolStripItem) this.SecureToolStripLabel, + (ToolStripItem) this.UriToolStripTextBox, + (ToolStripItem) this.ToolStripGoButton + }); + RightAlignToolStrip expandToolStrip1_1 = this.ExpandToolStrip1; + point1 = new Point(0, 51); + Point point7 = point1; + expandToolStrip1_1.Location = point7; + this.ExpandToolStrip1.Name = "ExpandToolStrip1"; + RightAlignToolStrip expandToolStrip1_2 = this.ExpandToolStrip1; + size1 = new Size(498, 26); + Size size148 = size1; + expandToolStrip1_2.Size = size148; + this.ExpandToolStrip1.Stretch = true; + this.ExpandToolStrip1.TabIndex = 3; + this.ExpandToolStrip1.Text = "ExpandToolStrip1"; + this.FaviconToolStripButton.Name = "FaviconToolStripButton"; + ToolStripButton faviconToolStripButton = this.FaviconToolStripButton; + size1 = new Size(23, 23); + Size size149 = size1; + faviconToolStripButton.Size = size149; + this.FaviconToolStripButton.ToolTipText = "To Home"; + this.SecureToolStripLabel.AutoSize = false; + this.SecureToolStripLabel.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.SecureToolStripLabel.ImageScaling = ToolStripItemImageScaling.None; + this.SecureToolStripLabel.Name = "SecureToolStripLabel"; + ToolStripLabel secureToolStripLabel = this.SecureToolStripLabel; + size1 = new Size(23, 23); + Size size150 = size1; + secureToolStripLabel.Size = size150; + this.UriToolStripTextBox.Name = "UriToolStripTextBox"; + ToolStripTextBox toolStripTextBox = this.UriToolStripTextBox; + size1 = new Size(415, 26); + Size size151 = size1; + toolStripTextBox.Size = size151; + this.ToolStripGoButton.DisplayStyle = ToolStripItemDisplayStyle.Image; + this.ToolStripGoButton.Image = (Image) CarotDAV.My.Resources.Resources.Go; + this.ToolStripGoButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.ToolStripGoButton.Name = "ToolStripGoButton"; + this.ToolStripGoButton.RightToLeftAutoMirrorImage = true; + ToolStripButton toolStripGoButton = this.ToolStripGoButton; + size1 = new Size(23, 20); + Size size152 = size1; + toolStripGoButton.Size = size152; + this.ToolStripGoButton.Text = "Go"; + this.ToolStripContainer1.BottomToolStripPanel.Controls.Add((Control) this.StatusStrip1); + this.ToolStripContainer1.ContentPanel.Controls.Add((Control) this.SplitContainer1); + ToolStripContentPanel contentPanel = this.ToolStripContainer1.ContentPanel; + size1 = new Size(498, 162); + Size size153 = size1; + contentPanel.Size = size153; + this.ToolStripContainer1.Dock = DockStyle.Fill; + this.ToolStripContainer1.LeftToolStripPanelVisible = false; + ToolStripContainer toolStripContainer1_1 = this.ToolStripContainer1; + point1 = new Point(0, 0); + Point point8 = point1; + toolStripContainer1_1.Location = point8; + this.ToolStripContainer1.Name = "ToolStripContainer1"; + this.ToolStripContainer1.RightToolStripPanelVisible = false; + ToolStripContainer toolStripContainer1_2 = this.ToolStripContainer1; + size1 = new Size(498, 262); + Size size154 = size1; + toolStripContainer1_2.Size = size154; + this.ToolStripContainer1.TabIndex = 4; + this.ToolStripContainer1.Text = "ToolStripContainer1"; + this.ToolStripContainer1.TopToolStripPanel.Controls.Add((Control) this.MenuStrip1); + this.ToolStripContainer1.TopToolStripPanel.Controls.Add((Control) this.ToolStrip1); + this.ToolStripContainer1.TopToolStripPanel.Controls.Add((Control) this.ExpandToolStrip1); + this.StatusStrip1.Dock = DockStyle.None; + this.StatusStrip1.Items.AddRange(new ToolStripItem[2] + { + (ToolStripItem) this.ToolStripTotal, + (ToolStripItem) this.ToolStripSelected + }); + StatusStrip statusStrip1_1 = this.StatusStrip1; + point1 = new Point(0, 0); + Point point9 = point1; + statusStrip1_1.Location = point9; + this.StatusStrip1.Name = "StatusStrip1"; + StatusStrip statusStrip1_2 = this.StatusStrip1; + size1 = new Size(498, 23); + Size size155 = size1; + statusStrip1_2.Size = size155; + this.StatusStrip1.TabIndex = 6; + this.StatusStrip1.Text = "StatusStrip1"; + this.ToolStripTotal.Name = "ToolStripTotal"; + ToolStripStatusLabel toolStripTotal = this.ToolStripTotal; + size1 = new Size(71, 18); + Size size156 = size1; + toolStripTotal.Size = size156; + this.ToolStripTotal.Text = "total - files"; + this.ToolStripSelected.Name = "ToolStripSelected"; + ToolStripStatusLabel toolStripSelected = this.ToolStripSelected; + size1 = new Size(125, 18); + Size size157 = size1; + toolStripSelected.Size = size157; + this.ToolStripSelected.Text = "(- files are selected)"; + this.DavServer1.IpAddress = (string) null; + this.DavServer1.ServerName = ""; + this.DavServer1.ServerPort = 0; + this.DavServer1.Setting = (WebDAVClientSetting) null; + this.AllowDrop = true; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + size1 = new Size(498, 262); + this.ClientSize = size1; + this.Controls.Add((Control) this.ToolStripContainer1); + this.MainMenuStrip = (MenuStrip) this.MenuStrip1; + size1 = new Size(364, 300); + this.MinimumSize = size1; + this.Name = nameof (MainForm); + this.Text = "CarotDAV"; + this.SplitContainer1.Panel1.ResumeLayout(false); + this.SplitContainer1.Panel2.ResumeLayout(false); + this.SplitContainer1.Panel2.PerformLayout(); + this.SplitContainer1.ResumeLayout(false); + this.ContextMenuStrip1.ResumeLayout(false); + this.ToolStrip1.ResumeLayout(false); + this.ToolStrip1.PerformLayout(); + this.MenuStrip1.ResumeLayout(false); + this.MenuStrip1.PerformLayout(); + this.ExpandToolStrip1.ResumeLayout(false); + this.ExpandToolStrip1.PerformLayout(); + this.ToolStripContainer1.BottomToolStripPanel.ResumeLayout(false); + this.ToolStripContainer1.BottomToolStripPanel.PerformLayout(); + this.ToolStripContainer1.ContentPanel.ResumeLayout(false); + this.ToolStripContainer1.TopToolStripPanel.ResumeLayout(false); + this.ToolStripContainer1.TopToolStripPanel.PerformLayout(); + this.ToolStripContainer1.ResumeLayout(false); + this.ToolStripContainer1.PerformLayout(); + this.StatusStrip1.ResumeLayout(false); + this.StatusStrip1.PerformLayout(); + this.ResumeLayout(false); + } + + internal virtual TextBox LogTextBox + { + get + { + return this._LogTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._LogTextBox = value; + } + } + + internal virtual SplitContainer SplitContainer1 + { + get + { + return this._SplitContainer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SplitContainer1 = value; + } + } + + internal virtual WallMarkListView ResourceListView + { + get + { + return this._ResourceListView; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + ColumnReorderedEventHandler reorderedEventHandler = new ColumnReorderedEventHandler(this.ResourceListView_ColumnReordered); + ColumnWidthChangedEventHandler changedEventHandler = new ColumnWidthChangedEventHandler(this.ResourceListView_ColumnWidthChanged); + EventHandler eventHandler1 = new EventHandler(this.ResourceListView_SelectedIndexChanged); + MouseEventHandler mouseEventHandler1 = new MouseEventHandler(this.ResourceListView_MouseDoubleClick); + MouseEventHandler mouseEventHandler2 = new MouseEventHandler(this.ResourceListView_MouseUp); + KeyEventHandler keyEventHandler = new KeyEventHandler(this.ResourceListView_KeyDown); + ColumnClickEventHandler clickEventHandler = new ColumnClickEventHandler(this.ResourceListView_ColumnClick); + LabelEditEventHandler editEventHandler1 = new LabelEditEventHandler(this.ResourceListView_AfterLabelEdit); + LabelEditEventHandler editEventHandler2 = new LabelEditEventHandler(this.ResourceListView_BeforeLabelEdit); + QueryContinueDragEventHandler dragEventHandler1 = new QueryContinueDragEventHandler(this.ResourceListView_QueryContinueDrag); + ItemDragEventHandler dragEventHandler2 = new ItemDragEventHandler(this.ResourceListView_ItemDrag); + EventHandler eventHandler2 = new EventHandler(this.ResourceListView_DragLeave); + DragEventHandler dragEventHandler3 = new DragEventHandler(this.ResourceListView_DragOver); + DragEventHandler dragEventHandler4 = new DragEventHandler(this.ResourceListView_DragEnter); + DragEventHandler dragEventHandler5 = new DragEventHandler(this.ResourceListView_DragDrop); + if (this._ResourceListView != null) + { + this._ResourceListView.ColumnReordered -= reorderedEventHandler; + this._ResourceListView.ColumnWidthChanged -= changedEventHandler; + this._ResourceListView.SelectedIndexChanged -= eventHandler1; + this._ResourceListView.MouseDoubleClick -= mouseEventHandler1; + this._ResourceListView.MouseUp -= mouseEventHandler2; + this._ResourceListView.KeyDown -= keyEventHandler; + this._ResourceListView.ColumnClick -= clickEventHandler; + this._ResourceListView.AfterLabelEdit -= editEventHandler1; + this._ResourceListView.BeforeLabelEdit -= editEventHandler2; + this._ResourceListView.QueryContinueDrag -= dragEventHandler1; + this._ResourceListView.ItemDrag -= dragEventHandler2; + this._ResourceListView.DragLeave -= eventHandler2; + this._ResourceListView.DragOver -= dragEventHandler3; + this._ResourceListView.DragEnter -= dragEventHandler4; + this._ResourceListView.DragDrop -= dragEventHandler5; + } + this._ResourceListView = value; + if (this._ResourceListView == null) + return; + this._ResourceListView.ColumnReordered += reorderedEventHandler; + this._ResourceListView.ColumnWidthChanged += changedEventHandler; + this._ResourceListView.SelectedIndexChanged += eventHandler1; + this._ResourceListView.MouseDoubleClick += mouseEventHandler1; + this._ResourceListView.MouseUp += mouseEventHandler2; + this._ResourceListView.KeyDown += keyEventHandler; + this._ResourceListView.ColumnClick += clickEventHandler; + this._ResourceListView.AfterLabelEdit += editEventHandler1; + this._ResourceListView.BeforeLabelEdit += editEventHandler2; + this._ResourceListView.QueryContinueDrag += dragEventHandler1; + this._ResourceListView.ItemDrag += dragEventHandler2; + this._ResourceListView.DragLeave += eventHandler2; + this._ResourceListView.DragOver += dragEventHandler3; + this._ResourceListView.DragEnter += dragEventHandler4; + this._ResourceListView.DragDrop += dragEventHandler5; + } + } + + internal virtual NoEatToolStrip ToolStrip1 + { + get + { + return this._ToolStrip1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStrip1 = value; + } + } + + internal virtual ToolStripButton ConnectToolStripButton + { + get + { + return this._ConnectToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ConnectToolStripItem_Click); + if (this._ConnectToolStripButton != null) + this._ConnectToolStripButton.Click -= eventHandler; + this._ConnectToolStripButton = value; + if (this._ConnectToolStripButton == null) + return; + this._ConnectToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator6 + { + get + { + return this._ToolStripSeparator6; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator6 = value; + } + } + + internal virtual ToolStripButton RefreshToolStripButton + { + get + { + return this._RefreshToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RefreshToolStripItem_Click); + if (this._RefreshToolStripButton != null) + this._RefreshToolStripButton.Click -= eventHandler; + this._RefreshToolStripButton = value; + if (this._RefreshToolStripButton == null) + return; + this._RefreshToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripButton NewFolderToolStripButton + { + get + { + return this._NewFolderToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.NewFolderToolStripItem_Click); + if (this._NewFolderToolStripButton != null) + this._NewFolderToolStripButton.Click -= eventHandler; + this._NewFolderToolStripButton = value; + if (this._NewFolderToolStripButton == null) + return; + this._NewFolderToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator7 + { + get + { + return this._ToolStripSeparator7; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator7 = value; + } + } + + internal virtual ToolStripButton UploadToolStripButton + { + get + { + return this._UploadToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.UploadToolStripItem_Click); + if (this._UploadToolStripButton != null) + this._UploadToolStripButton.Click -= eventHandler; + this._UploadToolStripButton = value; + if (this._UploadToolStripButton == null) + return; + this._UploadToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripButton DownloadToolStripButton + { + get + { + return this._DownloadToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DownloadToolStripItem_Click); + if (this._DownloadToolStripButton != null) + this._DownloadToolStripButton.Click -= eventHandler; + this._DownloadToolStripButton = value; + if (this._DownloadToolStripButton == null) + return; + this._DownloadToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator8 + { + get + { + return this._ToolStripSeparator8; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator8 = value; + } + } + + internal virtual ToolStripButton DeleteToolStripButton + { + get + { + return this._DeleteToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DeleteToolStripItem_Click); + if (this._DeleteToolStripButton != null) + this._DeleteToolStripButton.Click -= eventHandler; + this._DeleteToolStripButton = value; + if (this._DeleteToolStripButton == null) + return; + this._DeleteToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSplitButton ToolStripSplitButton1 + { + get + { + return this._ToolStripSplitButton1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSplitButton1 = value; + } + } + + internal virtual ToolStripMenuItem FileToolStripMenuItem + { + get + { + return this._FileToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._FileToolStripMenuItem = value; + } + } + + internal virtual ToolStripMenuItem ConnectToolStripMenuItem + { + get + { + return this._ConnectToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ConnectToolStripItem_Click); + if (this._ConnectToolStripMenuItem != null) + this._ConnectToolStripMenuItem.Click -= eventHandler; + this._ConnectToolStripMenuItem = value; + if (this._ConnectToolStripMenuItem == null) + return; + this._ConnectToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator1 + { + get + { + return this._ToolStripSeparator1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator1 = value; + } + } + + internal virtual ToolStripMenuItem ExitToolStripMenuItem + { + get + { + return this._ExitToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ExitToolStripMenuItem_Click); + if (this._ExitToolStripMenuItem != null) + this._ExitToolStripMenuItem.Click -= eventHandler; + this._ExitToolStripMenuItem = value; + if (this._ExitToolStripMenuItem == null) + return; + this._ExitToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem EditToolStripMenuItem + { + get + { + return this._EditToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._EditToolStripMenuItem = value; + } + } + + internal virtual ToolStripMenuItem NewFolderToolStripMenuItem + { + get + { + return this._NewFolderToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.NewFolderToolStripItem_Click); + if (this._NewFolderToolStripMenuItem != null) + this._NewFolderToolStripMenuItem.Click -= eventHandler; + this._NewFolderToolStripMenuItem = value; + if (this._NewFolderToolStripMenuItem == null) + return; + this._NewFolderToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem UploadToolStripMenuItem + { + get + { + return this._UploadToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.UploadToolStripItem_Click); + if (this._UploadToolStripMenuItem != null) + this._UploadToolStripMenuItem.Click -= eventHandler; + this._UploadToolStripMenuItem = value; + if (this._UploadToolStripMenuItem == null) + return; + this._UploadToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem DownloadToolStripMenuItem + { + get + { + return this._DownloadToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DownloadToolStripItem_Click); + if (this._DownloadToolStripMenuItem != null) + this._DownloadToolStripMenuItem.Click -= eventHandler; + this._DownloadToolStripMenuItem = value; + if (this._DownloadToolStripMenuItem == null) + return; + this._DownloadToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripMenuSeparatorUpDown + { + get + { + return this._ToolStripMenuSeparatorUpDown; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripMenuSeparatorUpDown = value; + } + } + + internal virtual ToolStripMenuItem DeleteToolStripMenuItem + { + get + { + return this._DeleteToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DeleteToolStripItem_Click); + if (this._DeleteToolStripMenuItem != null) + this._DeleteToolStripMenuItem.Click -= eventHandler; + this._DeleteToolStripMenuItem = value; + if (this._DeleteToolStripMenuItem == null) + return; + this._DeleteToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem HelpToolStripMenuItem + { + get + { + return this._HelpToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._HelpToolStripMenuItem = value; + } + } + + internal virtual ToolStripMenuItem AboutToolStripMenuItem + { + get + { + return this._AboutToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.AboutToolStripMenuItem_Click); + if (this._AboutToolStripMenuItem != null) + this._AboutToolStripMenuItem.Click -= eventHandler; + this._AboutToolStripMenuItem = value; + if (this._AboutToolStripMenuItem == null) + return; + this._AboutToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual NoEatMenuStrip MenuStrip1 + { + get + { + return this._MenuStrip1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MenuStrip1 = value; + } + } + + internal virtual ToolStripMenuItem LargeIconToolStripMenuItem + { + get + { + return this._LargeIconToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.LargeIconToolStripMenuItem_Click); + if (this._LargeIconToolStripMenuItem != null) + this._LargeIconToolStripMenuItem.Click -= eventHandler; + this._LargeIconToolStripMenuItem = value; + if (this._LargeIconToolStripMenuItem == null) + return; + this._LargeIconToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SmallIconToolStripMenuItem + { + get + { + return this._SmallIconToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SmallIconToolStripMenuItem_Click); + if (this._SmallIconToolStripMenuItem != null) + this._SmallIconToolStripMenuItem.Click -= eventHandler; + this._SmallIconToolStripMenuItem = value; + if (this._SmallIconToolStripMenuItem == null) + return; + this._SmallIconToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ListToolStripMenuItem + { + get + { + return this._ListToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ListToolStripMenuItem_Click); + if (this._ListToolStripMenuItem != null) + this._ListToolStripMenuItem.Click -= eventHandler; + this._ListToolStripMenuItem = value; + if (this._ListToolStripMenuItem == null) + return; + this._ListToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem DetailToolStripMenuItem + { + get + { + return this._DetailToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DetailToolStripMenuItem_Click); + if (this._DetailToolStripMenuItem != null) + this._DetailToolStripMenuItem.Click -= eventHandler; + this._DetailToolStripMenuItem = value; + if (this._DetailToolStripMenuItem == null) + return; + this._DetailToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ViewToolStripMenuItem + { + get + { + return this._ViewToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ViewToolStripMenuItem = value; + } + } + + internal virtual ToolStripMenuItem LargeIconToolStripMenuItem1 + { + get + { + return this._LargeIconToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.LargeIconToolStripMenuItem_Click); + if (this._LargeIconToolStripMenuItem1 != null) + this._LargeIconToolStripMenuItem1.Click -= eventHandler; + this._LargeIconToolStripMenuItem1 = value; + if (this._LargeIconToolStripMenuItem1 == null) + return; + this._LargeIconToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SmallIconToolStripMenuItem1 + { + get + { + return this._SmallIconToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SmallIconToolStripMenuItem_Click); + if (this._SmallIconToolStripMenuItem1 != null) + this._SmallIconToolStripMenuItem1.Click -= eventHandler; + this._SmallIconToolStripMenuItem1 = value; + if (this._SmallIconToolStripMenuItem1 == null) + return; + this._SmallIconToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ListToolStripMenuItem1 + { + get + { + return this._ListToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ListToolStripMenuItem_Click); + if (this._ListToolStripMenuItem1 != null) + this._ListToolStripMenuItem1.Click -= eventHandler; + this._ListToolStripMenuItem1 = value; + if (this._ListToolStripMenuItem1 == null) + return; + this._ListToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem DetailToolStripMenuItem1 + { + get + { + return this._DetailToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DetailToolStripMenuItem_Click); + if (this._DetailToolStripMenuItem1 != null) + this._DetailToolStripMenuItem1.Click -= eventHandler; + this._DetailToolStripMenuItem1 = value; + if (this._DetailToolStripMenuItem1 == null) + return; + this._DetailToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual FolderBrowserDialog FolderBrowserDialog1 + { + get + { + return this._FolderBrowserDialog1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._FolderBrowserDialog1 = value; + } + } + + internal virtual OpenFileDialog OpenFileDialog1 + { + get + { + return this._OpenFileDialog1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OpenFileDialog1 = value; + } + } + + internal virtual ToolStripButton PropertyToolStripButton + { + get + { + return this._PropertyToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PropertyToolStripItem_Click); + if (this._PropertyToolStripButton != null) + this._PropertyToolStripButton.Click -= eventHandler; + this._PropertyToolStripButton = value; + if (this._PropertyToolStripButton == null) + return; + this._PropertyToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator5 + { + get + { + return this._ToolStripSeparator5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator5 = value; + } + } + + internal virtual ToolStripMenuItem PropertyToolStripMenuItem + { + get + { + return this._PropertyToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PropertyToolStripItem_Click); + if (this._PropertyToolStripMenuItem != null) + this._PropertyToolStripMenuItem.Click -= eventHandler; + this._PropertyToolStripMenuItem = value; + if (this._PropertyToolStripMenuItem == null) + return; + this._PropertyToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem RenameToolStripMenuItem + { + get + { + return this._RenameToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RenameToolStripMenuItem_Click); + if (this._RenameToolStripMenuItem != null) + this._RenameToolStripMenuItem.Click -= eventHandler; + this._RenameToolStripMenuItem = value; + if (this._RenameToolStripMenuItem == null) + return; + this._RenameToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ToolToolStripMenuItem + { + get + { + return this._ToolToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ToolToolStripMenuItem_DropDownOpening); + if (this._ToolToolStripMenuItem != null) + this._ToolToolStripMenuItem.DropDownOpening -= eventHandler; + this._ToolToolStripMenuItem = value; + if (this._ToolToolStripMenuItem == null) + return; + this._ToolToolStripMenuItem.DropDownOpening += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator9 + { + get + { + return this._ToolStripSeparator9; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator9 = value; + } + } + + internal virtual ToolStripMenuItem LogToolStripMenuItem + { + get + { + return this._LogToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.LogToolStripMenuItem_Click); + if (this._LogToolStripMenuItem != null) + this._LogToolStripMenuItem.Click -= eventHandler; + this._LogToolStripMenuItem = value; + if (this._LogToolStripMenuItem == null) + return; + this._LogToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual RightAlignToolStrip ExpandToolStrip1 + { + get + { + return this._ExpandToolStrip1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ExpandToolStrip1 = value; + } + } + + internal virtual ToolStripTextBox UriToolStripTextBox + { + get + { + return this._UriToolStripTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + KeyEventHandler keyEventHandler = new KeyEventHandler(this.UriToolStripTextBox_KeyDown); + if (this._UriToolStripTextBox != null) + this._UriToolStripTextBox.KeyDown -= keyEventHandler; + this._UriToolStripTextBox = value; + if (this._UriToolStripTextBox == null) + return; + this._UriToolStripTextBox.KeyDown += keyEventHandler; + } + } + + internal virtual ToolStripButton FaviconToolStripButton + { + get + { + return this._FaviconToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.FaviconToolStripButton_Click); + if (this._FaviconToolStripButton != null) + this._FaviconToolStripButton.Click -= eventHandler; + this._FaviconToolStripButton = value; + if (this._FaviconToolStripButton == null) + return; + this._FaviconToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripButton ToolStripGoButton + { + get + { + return this._ToolStripGoButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ToolStripGoButton_Click); + if (this._ToolStripGoButton != null) + this._ToolStripGoButton.Click -= eventHandler; + this._ToolStripGoButton = value; + if (this._ToolStripGoButton == null) + return; + this._ToolStripGoButton.Click += eventHandler; + } + } + + internal virtual ToolStripButton BackToolStripButton + { + get + { + return this._BackToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.BackToolStripItem_Click); + if (this._BackToolStripButton != null) + this._BackToolStripButton.Click -= eventHandler; + this._BackToolStripButton = value; + if (this._BackToolStripButton == null) + return; + this._BackToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripButton ForwardToolStripButton + { + get + { + return this._ForwardToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ForwardToolStripItem_Click); + if (this._ForwardToolStripButton != null) + this._ForwardToolStripButton.Click -= eventHandler; + this._ForwardToolStripButton = value; + if (this._ForwardToolStripButton == null) + return; + this._ForwardToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator11 + { + get + { + return this._ToolStripSeparator11; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator11 = value; + } + } + + internal virtual ToolStripButton GoToParentToolStripButton + { + get + { + return this._GoToParentToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GoToParentToolStripItem_Click); + if (this._GoToParentToolStripButton != null) + this._GoToParentToolStripButton.Click -= eventHandler; + this._GoToParentToolStripButton = value; + if (this._GoToParentToolStripButton == null) + return; + this._GoToParentToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripContainer ToolStripContainer1 + { + get + { + return this._ToolStripContainer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripContainer1 = value; + } + } + + internal virtual ToolStripMenuItem BackToolStripMenuItem + { + get + { + return this._BackToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.BackToolStripItem_Click); + if (this._BackToolStripMenuItem != null) + this._BackToolStripMenuItem.Click -= eventHandler; + this._BackToolStripMenuItem = value; + if (this._BackToolStripMenuItem == null) + return; + this._BackToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ForwardToolStripMenuItem + { + get + { + return this._ForwardToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ForwardToolStripItem_Click); + if (this._ForwardToolStripMenuItem != null) + this._ForwardToolStripMenuItem.Click -= eventHandler; + this._ForwardToolStripMenuItem = value; + if (this._ForwardToolStripMenuItem == null) + return; + this._ForwardToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator12 + { + get + { + return this._ToolStripSeparator12; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator12 = value; + } + } + + internal virtual StatusStrip StatusStrip1 + { + get + { + return this._StatusStrip1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._StatusStrip1 = value; + } + } + + internal virtual ToolStripStatusLabel ToolStripTotal + { + get + { + return this._ToolStripTotal; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripTotal = value; + } + } + + internal virtual ToolStripStatusLabel ToolStripSelected + { + get + { + return this._ToolStripSelected; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSelected = value; + } + } + + internal virtual ToolStripMenuItem StatusBarToolStripMenuItem + { + get + { + return this._StatusBarToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.StatusBarToolStripMenuItem_Click); + if (this._StatusBarToolStripMenuItem != null) + this._StatusBarToolStripMenuItem.Click -= eventHandler; + this._StatusBarToolStripMenuItem = value; + if (this._StatusBarToolStripMenuItem == null) + return; + this._StatusBarToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ContextMenuStrip ContextMenuStrip1 + { + get + { + return this._ContextMenuStrip1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + ToolStripDropDownClosedEventHandler closedEventHandler = new ToolStripDropDownClosedEventHandler(this.ContextMenuStrip1_Closed); + CancelEventHandler cancelEventHandler = new CancelEventHandler(this.ContextMenuStrip1_Opening); + if (this._ContextMenuStrip1 != null) + { + this._ContextMenuStrip1.Closed -= closedEventHandler; + this._ContextMenuStrip1.Opening -= cancelEventHandler; + } + this._ContextMenuStrip1 = value; + if (this._ContextMenuStrip1 == null) + return; + this._ContextMenuStrip1.Closed += closedEventHandler; + this._ContextMenuStrip1.Opening += cancelEventHandler; + } + } + + internal virtual ToolStripMenuItem DownloadContextMenuItem + { + get + { + return this._DownloadContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DownloadToolStripItem_Click); + if (this._DownloadContextMenuItem != null) + this._DownloadContextMenuItem.Click -= eventHandler; + this._DownloadContextMenuItem = value; + if (this._DownloadContextMenuItem == null) + return; + this._DownloadContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem RenameContextMenuItem + { + get + { + return this._RenameContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RenameToolStripMenuItem_Click); + if (this._RenameContextMenuItem != null) + this._RenameContextMenuItem.Click -= eventHandler; + this._RenameContextMenuItem = value; + if (this._RenameContextMenuItem == null) + return; + this._RenameContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem PropertyContextMenuItem + { + get + { + return this._PropertyContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PropertyToolStripItem_Click); + if (this._PropertyContextMenuItem != null) + this._PropertyContextMenuItem.Click -= eventHandler; + this._PropertyContextMenuItem = value; + if (this._PropertyContextMenuItem == null) + return; + this._PropertyContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem DeleteContextMenuItem + { + get + { + return this._DeleteContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DeleteToolStripItem_Click); + if (this._DeleteContextMenuItem != null) + this._DeleteContextMenuItem.Click -= eventHandler; + this._DeleteContextMenuItem = value; + if (this._DeleteContextMenuItem == null) + return; + this._DeleteContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ContextMenuSeparatorDownload + { + get + { + return this._ContextMenuSeparatorDownload; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ContextMenuSeparatorDownload = value; + } + } + + internal virtual ToolStripMenuItem GoToParentContextMenuItem + { + get + { + return this._GoToParentContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GoToParentToolStripItem_Click); + if (this._GoToParentContextMenuItem != null) + this._GoToParentContextMenuItem.Click -= eventHandler; + this._GoToParentContextMenuItem = value; + if (this._GoToParentContextMenuItem == null) + return; + this._GoToParentContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem RefreshContextMenuItem + { + get + { + return this._RefreshContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RefreshToolStripItem_Click); + if (this._RefreshContextMenuItem != null) + this._RefreshContextMenuItem.Click -= eventHandler; + this._RefreshContextMenuItem = value; + if (this._RefreshContextMenuItem == null) + return; + this._RefreshContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator16 + { + get + { + return this._ToolStripSeparator16; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator16 = value; + } + } + + internal virtual ToolStripMenuItem NewFolderContextMenuItem + { + get + { + return this._NewFolderContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.NewFolderToolStripItem_Click); + if (this._NewFolderContextMenuItem != null) + this._NewFolderContextMenuItem.Click -= eventHandler; + this._NewFolderContextMenuItem = value; + if (this._NewFolderContextMenuItem == null) + return; + this._NewFolderContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem CopyURIContextMenuItem + { + get + { + return this._CopyURIContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CopyURIContextMenuItem_Click); + if (this._CopyURIContextMenuItem != null) + this._CopyURIContextMenuItem.Click -= eventHandler; + this._CopyURIContextMenuItem = value; + if (this._CopyURIContextMenuItem == null) + return; + this._CopyURIContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem CopyResourceNameContextMenuItem + { + get + { + return this._CopyResourceNameContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CopyResourceNameContextMenuItem_Click); + if (this._CopyResourceNameContextMenuItem != null) + this._CopyResourceNameContextMenuItem.Click -= eventHandler; + this._CopyResourceNameContextMenuItem = value; + if (this._CopyResourceNameContextMenuItem == null) + return; + this._CopyResourceNameContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ContextMenuSeparatorCopy + { + get + { + return this._ContextMenuSeparatorCopy; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ContextMenuSeparatorCopy = value; + } + } + + internal virtual ToolStripMenuItem LogToFileToolStripMenuItem + { + get + { + return this._LogToFileToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.LogToFileToolStripMenuItem_Click); + if (this._LogToFileToolStripMenuItem != null) + this._LogToFileToolStripMenuItem.Click -= eventHandler; + this._LogToFileToolStripMenuItem = value; + if (this._LogToFileToolStripMenuItem == null) + return; + this._LogToFileToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripButton UploadFolderToolStripButton + { + get + { + return this._UploadFolderToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.UploadFolderToolStripItem_Click); + if (this._UploadFolderToolStripButton != null) + this._UploadFolderToolStripButton.Click -= eventHandler; + this._UploadFolderToolStripButton = value; + if (this._UploadFolderToolStripButton == null) + return; + this._UploadFolderToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator15 + { + get + { + return this._ToolStripSeparator15; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator15 = value; + } + } + + internal virtual ToolStripMenuItem UploadFolderToolStripMenuItem + { + get + { + return this._UploadFolderToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.UploadFolderToolStripItem_Click); + if (this._UploadFolderToolStripMenuItem != null) + this._UploadFolderToolStripMenuItem.Click -= eventHandler; + this._UploadFolderToolStripMenuItem = value; + if (this._UploadFolderToolStripMenuItem == null) + return; + this._UploadFolderToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem TileToolStripMenuItem + { + get + { + return this._TileToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TileToolStripMenuItem_Click); + if (this._TileToolStripMenuItem != null) + this._TileToolStripMenuItem.Click -= eventHandler; + this._TileToolStripMenuItem = value; + if (this._TileToolStripMenuItem == null) + return; + this._TileToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem TileToolStripMenuItem1 + { + get + { + return this._TileToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TileToolStripMenuItem_Click); + if (this._TileToolStripMenuItem1 != null) + this._TileToolStripMenuItem1.Click -= eventHandler; + this._TileToolStripMenuItem1 = value; + if (this._TileToolStripMenuItem1 == null) + return; + this._TileToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ViewToolStripMenuItem1 + { + get + { + return this._ViewToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ViewToolStripMenuItem1 = value; + } + } + + internal virtual ToolStripMenuItem LargeIconToolStripMenuItem2 + { + get + { + return this._LargeIconToolStripMenuItem2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.LargeIconToolStripMenuItem_Click); + if (this._LargeIconToolStripMenuItem2 != null) + this._LargeIconToolStripMenuItem2.Click -= eventHandler; + this._LargeIconToolStripMenuItem2 = value; + if (this._LargeIconToolStripMenuItem2 == null) + return; + this._LargeIconToolStripMenuItem2.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SmallIconToolStripMenuItem2 + { + get + { + return this._SmallIconToolStripMenuItem2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SmallIconToolStripMenuItem_Click); + if (this._SmallIconToolStripMenuItem2 != null) + this._SmallIconToolStripMenuItem2.Click -= eventHandler; + this._SmallIconToolStripMenuItem2 = value; + if (this._SmallIconToolStripMenuItem2 == null) + return; + this._SmallIconToolStripMenuItem2.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ListToolStripMenuItem2 + { + get + { + return this._ListToolStripMenuItem2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ListToolStripMenuItem_Click); + if (this._ListToolStripMenuItem2 != null) + this._ListToolStripMenuItem2.Click -= eventHandler; + this._ListToolStripMenuItem2 = value; + if (this._ListToolStripMenuItem2 == null) + return; + this._ListToolStripMenuItem2.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem TileToolStripMenuItem2 + { + get + { + return this._TileToolStripMenuItem2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TileToolStripMenuItem_Click); + if (this._TileToolStripMenuItem2 != null) + this._TileToolStripMenuItem2.Click -= eventHandler; + this._TileToolStripMenuItem2 = value; + if (this._TileToolStripMenuItem2 == null) + return; + this._TileToolStripMenuItem2.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem DetailToolStripMenuItem2 + { + get + { + return this._DetailToolStripMenuItem2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DetailToolStripMenuItem_Click); + if (this._DetailToolStripMenuItem2 != null) + this._DetailToolStripMenuItem2.Click -= eventHandler; + this._DetailToolStripMenuItem2 = value; + if (this._DetailToolStripMenuItem2 == null) + return; + this._DetailToolStripMenuItem2.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator20 + { + get + { + return this._ToolStripSeparator20; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator20 = value; + } + } + + internal virtual ToolStripMenuItem AutoColumnWidthToolStripMenuItem + { + get + { + return this._AutoColumnWidthToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.AutoColumnWidthToolStripMenuItem_Click); + if (this._AutoColumnWidthToolStripMenuItem != null) + this._AutoColumnWidthToolStripMenuItem.Click -= eventHandler; + this._AutoColumnWidthToolStripMenuItem = value; + if (this._AutoColumnWidthToolStripMenuItem == null) + return; + this._AutoColumnWidthToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortToolStripMenuItem + { + get + { + return this._SortToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SortToolStripMenuItem = value; + } + } + + internal virtual ToolStripMenuItem SortNameToolStripMenuItem + { + get + { + return this._SortNameToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortNameToolStripMenuItem_Click); + if (this._SortNameToolStripMenuItem != null) + this._SortNameToolStripMenuItem.Click -= eventHandler; + this._SortNameToolStripMenuItem = value; + if (this._SortNameToolStripMenuItem == null) + return; + this._SortNameToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortSizeToolStripMenuItem + { + get + { + return this._SortSizeToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortSizeToolStripMenuItem_Click); + if (this._SortSizeToolStripMenuItem != null) + this._SortSizeToolStripMenuItem.Click -= eventHandler; + this._SortSizeToolStripMenuItem = value; + if (this._SortSizeToolStripMenuItem == null) + return; + this._SortSizeToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortLastModifiedDateToolStripMenuItem + { + get + { + return this._SortLastModifiedDateToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortLastModifiedDateToolStripMenuItem_Click); + if (this._SortLastModifiedDateToolStripMenuItem != null) + this._SortLastModifiedDateToolStripMenuItem.Click -= eventHandler; + this._SortLastModifiedDateToolStripMenuItem = value; + if (this._SortLastModifiedDateToolStripMenuItem == null) + return; + this._SortLastModifiedDateToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortCreationDateToolStripMenuItem + { + get + { + return this._SortCreationDateToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortCreationDateToolStripMenuItem_Click); + if (this._SortCreationDateToolStripMenuItem != null) + this._SortCreationDateToolStripMenuItem.Click -= eventHandler; + this._SortCreationDateToolStripMenuItem = value; + if (this._SortCreationDateToolStripMenuItem == null) + return; + this._SortCreationDateToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator19 + { + get + { + return this._ToolStripSeparator19; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator19 = value; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator21 + { + get + { + return this._ToolStripSeparator21; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator21 = value; + } + } + + internal virtual ToolStripMenuItem SortToolStripMenuItem1 + { + get + { + return this._SortToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SortToolStripMenuItem1 = value; + } + } + + internal virtual ToolStripMenuItem SortNameToolStripMenuItem1 + { + get + { + return this._SortNameToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortNameToolStripMenuItem_Click); + if (this._SortNameToolStripMenuItem1 != null) + this._SortNameToolStripMenuItem1.Click -= eventHandler; + this._SortNameToolStripMenuItem1 = value; + if (this._SortNameToolStripMenuItem1 == null) + return; + this._SortNameToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortLastModifiedDateToolStripMenuItem1 + { + get + { + return this._SortLastModifiedDateToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortLastModifiedDateToolStripMenuItem_Click); + if (this._SortLastModifiedDateToolStripMenuItem1 != null) + this._SortLastModifiedDateToolStripMenuItem1.Click -= eventHandler; + this._SortLastModifiedDateToolStripMenuItem1 = value; + if (this._SortLastModifiedDateToolStripMenuItem1 == null) + return; + this._SortLastModifiedDateToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortCreationDateToolStripMenuItem1 + { + get + { + return this._SortCreationDateToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortCreationDateToolStripMenuItem_Click); + if (this._SortCreationDateToolStripMenuItem1 != null) + this._SortCreationDateToolStripMenuItem1.Click -= eventHandler; + this._SortCreationDateToolStripMenuItem1 = value; + if (this._SortCreationDateToolStripMenuItem1 == null) + return; + this._SortCreationDateToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem AutoColumnWidthToolStripMenuItem1 + { + get + { + return this._AutoColumnWidthToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.AutoColumnWidthToolStripMenuItem_Click); + if (this._AutoColumnWidthToolStripMenuItem1 != null) + this._AutoColumnWidthToolStripMenuItem1.Click -= eventHandler; + this._AutoColumnWidthToolStripMenuItem1 = value; + if (this._AutoColumnWidthToolStripMenuItem1 == null) + return; + this._AutoColumnWidthToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator22 + { + get + { + return this._ToolStripSeparator22; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator22 = value; + } + } + + internal virtual ToolStripMenuItem SortStatusToolStripMenuItem + { + get + { + return this._SortStatusToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortStatusToolStripMenuItem_Click); + if (this._SortStatusToolStripMenuItem != null) + this._SortStatusToolStripMenuItem.Click -= eventHandler; + this._SortStatusToolStripMenuItem = value; + if (this._SortStatusToolStripMenuItem == null) + return; + this._SortStatusToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortURIToolStripMenuItem + { + get + { + return this._SortURIToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortURIToolStripMenuItem_Click); + if (this._SortURIToolStripMenuItem != null) + this._SortURIToolStripMenuItem.Click -= eventHandler; + this._SortURIToolStripMenuItem = value; + if (this._SortURIToolStripMenuItem == null) + return; + this._SortURIToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortStatusToolStripMenuItem1 + { + get + { + return this._SortStatusToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortStatusToolStripMenuItem_Click); + if (this._SortStatusToolStripMenuItem1 != null) + this._SortStatusToolStripMenuItem1.Click -= eventHandler; + this._SortStatusToolStripMenuItem1 = value; + if (this._SortStatusToolStripMenuItem1 == null) + return; + this._SortStatusToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem SortURIToolStripMenuItem1 + { + get + { + return this._SortURIToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SortURIToolStripMenuItem_Click); + if (this._SortURIToolStripMenuItem1 != null) + this._SortURIToolStripMenuItem1.Click -= eventHandler; + this._SortURIToolStripMenuItem1 = value; + if (this._SortURIToolStripMenuItem1 == null) + return; + this._SortURIToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator23 + { + get + { + return this._ToolStripSeparator23; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator23 = value; + } + } + + internal virtual ToolStripMenuItem AutoColumnWidthToolStripMenuItem2 + { + get + { + return this._AutoColumnWidthToolStripMenuItem2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.AutoColumnWidthToolStripMenuItem_Click); + if (this._AutoColumnWidthToolStripMenuItem2 != null) + this._AutoColumnWidthToolStripMenuItem2.Click -= eventHandler; + this._AutoColumnWidthToolStripMenuItem2 = value; + if (this._AutoColumnWidthToolStripMenuItem2 == null) + return; + this._AutoColumnWidthToolStripMenuItem2.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GroupToolStripMenuItem + { + get + { + return this._GroupToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupToolStripMenuItem = value; + } + } + + internal virtual ToolStripMenuItem GroupNoneToolStripMenuItem + { + get + { + return this._GroupNoneToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupNoneToolStripMenuItem_Click); + if (this._GroupNoneToolStripMenuItem != null) + this._GroupNoneToolStripMenuItem.Click -= eventHandler; + this._GroupNoneToolStripMenuItem = value; + if (this._GroupNoneToolStripMenuItem == null) + return; + this._GroupNoneToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GroupTypeToolStripMenuItem + { + get + { + return this._GroupTypeToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupTypeToolStripMenuItem_Click); + if (this._GroupTypeToolStripMenuItem != null) + this._GroupTypeToolStripMenuItem.Click -= eventHandler; + this._GroupTypeToolStripMenuItem = value; + if (this._GroupTypeToolStripMenuItem == null) + return; + this._GroupTypeToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GroupSizeToolStripMenuItem + { + get + { + return this._GroupSizeToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupSizeToolStripMenuItem_Click); + if (this._GroupSizeToolStripMenuItem != null) + this._GroupSizeToolStripMenuItem.Click -= eventHandler; + this._GroupSizeToolStripMenuItem = value; + if (this._GroupSizeToolStripMenuItem == null) + return; + this._GroupSizeToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GroupToolStripMenuItem1 + { + get + { + return this._GroupToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupToolStripMenuItem1 = value; + } + } + + internal virtual ToolStripMenuItem GroupNoneToolStripMenuItem1 + { + get + { + return this._GroupNoneToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupNoneToolStripMenuItem_Click); + if (this._GroupNoneToolStripMenuItem1 != null) + this._GroupNoneToolStripMenuItem1.Click -= eventHandler; + this._GroupNoneToolStripMenuItem1 = value; + if (this._GroupNoneToolStripMenuItem1 == null) + return; + this._GroupNoneToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GroupTypeToolStripMenuItem1 + { + get + { + return this._GroupTypeToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupTypeToolStripMenuItem_Click); + if (this._GroupTypeToolStripMenuItem1 != null) + this._GroupTypeToolStripMenuItem1.Click -= eventHandler; + this._GroupTypeToolStripMenuItem1 = value; + if (this._GroupTypeToolStripMenuItem1 == null) + return; + this._GroupTypeToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GroupSizeToolStripMenuItem1 + { + get + { + return this._GroupSizeToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupSizeToolStripMenuItem_Click); + if (this._GroupSizeToolStripMenuItem1 != null) + this._GroupSizeToolStripMenuItem1.Click -= eventHandler; + this._GroupSizeToolStripMenuItem1 = value; + if (this._GroupSizeToolStripMenuItem1 == null) + return; + this._GroupSizeToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator24 + { + get + { + return this._ToolStripSeparator24; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator24 = value; + } + } + + internal virtual ToolStripMenuItem GroupNameToolStripMenuItem + { + get + { + return this._GroupNameToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupNameToolStripMenuItem_Click); + if (this._GroupNameToolStripMenuItem != null) + this._GroupNameToolStripMenuItem.Click -= eventHandler; + this._GroupNameToolStripMenuItem = value; + if (this._GroupNameToolStripMenuItem == null) + return; + this._GroupNameToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator25 + { + get + { + return this._ToolStripSeparator25; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator25 = value; + } + } + + internal virtual ToolStripMenuItem GroupNameToolStripMenuItem1 + { + get + { + return this._GroupNameToolStripMenuItem1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GroupNameToolStripMenuItem_Click); + if (this._GroupNameToolStripMenuItem1 != null) + this._GroupNameToolStripMenuItem1.Click -= eventHandler; + this._GroupNameToolStripMenuItem1 = value; + if (this._GroupNameToolStripMenuItem1 == null) + return; + this._GroupNameToolStripMenuItem1.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GoToHomeToolStripMenuItem + { + get + { + return this._GoToHomeToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GoToHomeToolStripMenuItem_Click); + if (this._GoToHomeToolStripMenuItem != null) + this._GoToHomeToolStripMenuItem.Click -= eventHandler; + this._GoToHomeToolStripMenuItem = value; + if (this._GoToHomeToolStripMenuItem == null) + return; + this._GoToHomeToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem GoToParentToolStripMenuItem + { + get + { + return this._GoToParentToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.GoToParentToolStripMenuItem_Click); + if (this._GoToParentToolStripMenuItem != null) + this._GoToParentToolStripMenuItem.Click -= eventHandler; + this._GoToParentToolStripMenuItem = value; + if (this._GoToParentToolStripMenuItem == null) + return; + this._GoToParentToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem RefreshToolStripMenuItem + { + get + { + return this._RefreshToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RefreshToolStripMenuItem_Click); + if (this._RefreshToolStripMenuItem != null) + this._RefreshToolStripMenuItem.Click -= eventHandler; + this._RefreshToolStripMenuItem = value; + if (this._RefreshToolStripMenuItem == null) + return; + this._RefreshToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator2 + { + get + { + return this._ToolStripSeparator2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator2 = value; + } + } + + internal virtual ToolStripMenuItem SelectAllToolStripMenuItem + { + get + { + return this._SelectAllToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SelectAllToolStripMenuItem_Click); + if (this._SelectAllToolStripMenuItem != null) + this._SelectAllToolStripMenuItem.Click -= eventHandler; + this._SelectAllToolStripMenuItem = value; + if (this._SelectAllToolStripMenuItem == null) + return; + this._SelectAllToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator10 + { + get + { + return this._ToolStripSeparator10; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator10 = value; + } + } + + internal virtual ToolStripMenuItem TestToolStripMenuItem + { + get + { + return this._TestToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TestToolStripMenuItem_Click); + if (this._TestToolStripMenuItem != null) + this._TestToolStripMenuItem.Click -= eventHandler; + this._TestToolStripMenuItem = value; + if (this._TestToolStripMenuItem == null) + return; + this._TestToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem PasteToolStripMenuItem + { + get + { + return this._PasteToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PasteToolStripMenuItem_Click); + if (this._PasteToolStripMenuItem != null) + this._PasteToolStripMenuItem.Click -= eventHandler; + this._PasteToolStripMenuItem = value; + if (this._PasteToolStripMenuItem == null) + return; + this._PasteToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem CopyToolStripMenuItem + { + get + { + return this._CopyToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CopyToolStripMenuItem_Click); + if (this._CopyToolStripMenuItem != null) + this._CopyToolStripMenuItem.Click -= eventHandler; + this._CopyToolStripMenuItem = value; + if (this._CopyToolStripMenuItem == null) + return; + this._CopyToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem CopyContextMenuItem + { + get + { + return this._CopyContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CopyToolStripMenuItem_Click); + if (this._CopyContextMenuItem != null) + this._CopyContextMenuItem.Click -= eventHandler; + this._CopyContextMenuItem = value; + if (this._CopyContextMenuItem == null) + return; + this._CopyContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem PasteContextMenuItem + { + get + { + return this._PasteContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PasteToolStripMenuItem_Click); + if (this._PasteContextMenuItem != null) + this._PasteContextMenuItem.Click -= eventHandler; + this._PasteContextMenuItem = value; + if (this._PasteContextMenuItem == null) + return; + this._PasteContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripLabel SecureToolStripLabel + { + get + { + return this._SecureToolStripLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SecureToolStripLabel = value; + } + } + + internal virtual ToolStripMenuItem CutToolStripMenuItem + { + get + { + return this._CutToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CutToolStripMenuItem_Click); + if (this._CutToolStripMenuItem != null) + this._CutToolStripMenuItem.Click -= eventHandler; + this._CutToolStripMenuItem = value; + if (this._CutToolStripMenuItem == null) + return; + this._CutToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem CutContextMenuItem + { + get + { + return this._CutContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CutToolStripMenuItem_Click); + if (this._CutContextMenuItem != null) + this._CutContextMenuItem.Click -= eventHandler; + this._CutContextMenuItem = value; + if (this._CutContextMenuItem == null) + return; + this._CutContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem NewVersionToolStripMenuItem + { + get + { + return this._NewVersionToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.NewVersionToolStripMenuItem_Click); + if (this._NewVersionToolStripMenuItem != null) + this._NewVersionToolStripMenuItem.Click -= eventHandler; + this._NewVersionToolStripMenuItem = value; + if (this._NewVersionToolStripMenuItem == null) + return; + this._NewVersionToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripButton CutToolStripButton + { + get + { + return this._CutToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CutToolStripMenuItem_Click); + if (this._CutToolStripButton != null) + this._CutToolStripButton.Click -= eventHandler; + this._CutToolStripButton = value; + if (this._CutToolStripButton == null) + return; + this._CutToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator27 + { + get + { + return this._ToolStripSeparator27; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator27 = value; + } + } + + internal virtual ToolStripButton CopyToolStripButton + { + get + { + return this._CopyToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CopyToolStripMenuItem_Click); + if (this._CopyToolStripButton != null) + this._CopyToolStripButton.Click -= eventHandler; + this._CopyToolStripButton = value; + if (this._CopyToolStripButton == null) + return; + this._CopyToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripButton PasteToolStripButton + { + get + { + return this._PasteToolStripButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PasteToolStripMenuItem_Click); + if (this._PasteToolStripButton != null) + this._PasteToolStripButton.Click -= eventHandler; + this._PasteToolStripButton = value; + if (this._PasteToolStripButton == null) + return; + this._PasteToolStripButton.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator28 + { + get + { + return this._ToolStripSeparator28; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator28 = value; + } + } + + internal virtual ToolStripMenuItem NewConnectionContextMenuItem + { + get + { + return this._NewConnectionContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NewConnectionContextMenuItem = value; + } + } + + internal virtual ToolStripMenuItem ImportContextMenuItem + { + get + { + return this._ImportContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ImportToolStripMenuItem_Click); + if (this._ImportContextMenuItem != null) + this._ImportContextMenuItem.Click -= eventHandler; + this._ImportContextMenuItem = value; + if (this._ImportContextMenuItem == null) + return; + this._ImportContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ExportContextMenuItem + { + get + { + return this._ExportContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ExportToolStripMenuItem_Click); + if (this._ExportContextMenuItem != null) + this._ExportContextMenuItem.Click -= eventHandler; + this._ExportContextMenuItem = value; + if (this._ExportContextMenuItem == null) + return; + this._ExportContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ImportToolStripMenuItem + { + get + { + return this._ImportToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ImportToolStripMenuItem_Click); + if (this._ImportToolStripMenuItem != null) + this._ImportToolStripMenuItem.Click -= eventHandler; + this._ImportToolStripMenuItem = value; + if (this._ImportToolStripMenuItem == null) + return; + this._ImportToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem ExportToolStripMenuItem + { + get + { + return this._ExportToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ExportToolStripMenuItem_Click); + if (this._ExportToolStripMenuItem != null) + this._ExportToolStripMenuItem.Click -= eventHandler; + this._ExportToolStripMenuItem = value; + if (this._ExportToolStripMenuItem == null) + return; + this._ExportToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem NewConnectionToolStripMenuItem + { + get + { + return this._NewConnectionToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NewConnectionToolStripMenuItem = value; + } + } + + internal virtual ToolStripSeparator ToolStripSeparatorCustomMenuStart + { + get + { + return this._ToolStripSeparatorCustomMenuStart; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparatorCustomMenuStart = value; + } + } + + internal virtual ToolStripMenuItem DuplicateContextMenuItem + { + get + { + return this._DuplicateContextMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DuplicateToolStripMenuItem_Click); + if (this._DuplicateContextMenuItem != null) + this._DuplicateContextMenuItem.Click -= eventHandler; + this._DuplicateContextMenuItem = value; + if (this._DuplicateContextMenuItem == null) + return; + this._DuplicateContextMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem DuplicateToolStripMenuItem + { + get + { + return this._DuplicateToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.DuplicateToolStripMenuItem_Click); + if (this._DuplicateToolStripMenuItem != null) + this._DuplicateToolStripMenuItem.Click -= eventHandler; + this._DuplicateToolStripMenuItem = value; + if (this._DuplicateToolStripMenuItem == null) + return; + this._DuplicateToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripDropDownButton NewConnectionToolStripDropDownButton + { + get + { + return this._NewConnectionToolStripDropDownButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NewConnectionToolStripDropDownButton = value; + } + } + + internal virtual ToolStripSeparator ContextMenuSeparatorConnection + { + get + { + return this._ContextMenuSeparatorConnection; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ContextMenuSeparatorConnection = value; + } + } + + internal virtual ToolStripMenuItem EnableWebDAVServerToolStripMenuItem + { + get + { + return this._EnableWebDAVServerToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.EnableWebDAVServerToolStripMenuItem_Click); + if (this._EnableWebDAVServerToolStripMenuItem != null) + this._EnableWebDAVServerToolStripMenuItem.Click -= eventHandler; + this._EnableWebDAVServerToolStripMenuItem = value; + if (this._EnableWebDAVServerToolStripMenuItem == null) + return; + this._EnableWebDAVServerToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator3 + { + get + { + return this._ToolStripSeparator3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator3 = value; + } + } + + internal virtual DAVServer DavServer1 + { + get + { + return this._DavServer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.Client_OnMessage); + if (this._DavServer1 != null) + this._DavServer1.LogMessage -= eventHandler; + this._DavServer1 = value; + if (this._DavServer1 == null) + return; + this._DavServer1.LogMessage += eventHandler; + } + } + + internal virtual ToolStripMenuItem SettingToolStripMenuItem + { + get + { + return this._SettingToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SettingToolStripMenuItem_Click); + if (this._SettingToolStripMenuItem != null) + this._SettingToolStripMenuItem.Click -= eventHandler; + this._SettingToolStripMenuItem = value; + if (this._SettingToolStripMenuItem == null) + return; + this._SettingToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator4 + { + get + { + return this._ToolStripSeparator4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator4 = value; + } + } + + internal virtual ImageList LargeImageList + { + get + { + return this._LargeImageList; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._LargeImageList = value; + } + } + + internal virtual ImageList SmallImageList + { + get + { + return this._SmallImageList; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SmallImageList = value; + } + } + + public static System.Drawing.Color EncryptedColor + { + get + { + if (MainForm.sEncryptedColor == System.Drawing.Color.Empty) + { + try + { + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", false); + if (registryKey != null) + { + byte[] numArray = (byte[]) registryKey.GetValue("AltEncryptionColor", (object) new byte[4] + { + (byte) 0, + (byte) 128, + (byte) 64, + (byte) 0 + }); + MainForm.sEncryptedColor = System.Drawing.Color.FromArgb((int) numArray[3], (int) numArray[0], (int) numArray[1], (int) numArray[2]); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + if (MainForm.sEncryptedColor == System.Drawing.Color.Empty) + MainForm.sEncryptedColor = System.Drawing.Color.FromArgb(0, 128, 64); + } + return MainForm.sEncryptedColor; + } + } + + public static System.Drawing.Color CompressedColor + { + get + { + if (MainForm.sCompressedColor == System.Drawing.Color.Empty) + { + try + { + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", false); + if (registryKey != null) + { + byte[] numArray = (byte[]) registryKey.GetValue("AltColor", (object) new byte[4] + { + (byte) 0, + (byte) 0, + byte.MaxValue, + (byte) 0 + }); + MainForm.sCompressedColor = System.Drawing.Color.FromArgb((int) numArray[3], (int) numArray[0], (int) numArray[1], (int) numArray[2]); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + if (MainForm.sCompressedColor == System.Drawing.Color.Empty) + MainForm.sEncryptedColor = System.Drawing.Color.FromArgb(0, 0, (int) byte.MaxValue); + } + return MainForm.sCompressedColor; + } + } + + private virtual BackgroundWorker pFaviconDownloadWorker + { + get + { + return this._pFaviconDownloadWorker; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + RunWorkerCompletedEventHandler completedEventHandler = new RunWorkerCompletedEventHandler(this.pFaviconDownloadWorker_RunWorkerCompleted); + DoWorkEventHandler workEventHandler = new DoWorkEventHandler(this.pFaviconDownloadWorker_DoWork); + if (this._pFaviconDownloadWorker != null) + { + this._pFaviconDownloadWorker.RunWorkerCompleted -= completedEventHandler; + this._pFaviconDownloadWorker.DoWork -= workEventHandler; + } + this._pFaviconDownloadWorker = value; + if (this._pFaviconDownloadWorker == null) + return; + this._pFaviconDownloadWorker.RunWorkerCompleted += completedEventHandler; + this._pFaviconDownloadWorker.DoWork += workEventHandler; + } + } + + private virtual BackgroundWorker pVersionChecker + { + get + { + return this._pVersionChecker; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + RunWorkerCompletedEventHandler completedEventHandler = new RunWorkerCompletedEventHandler(this.pVersionChecker_RunWorkerCompleted); + DoWorkEventHandler workEventHandler = new DoWorkEventHandler(this.pVersionChecker_DoWork); + if (this._pVersionChecker != null) + { + this._pVersionChecker.RunWorkerCompleted -= completedEventHandler; + this._pVersionChecker.DoWork -= workEventHandler; + } + this._pVersionChecker = value; + if (this._pVersionChecker == null) + return; + this._pVersionChecker.RunWorkerCompleted += completedEventHandler; + this._pVersionChecker.DoWork += workEventHandler; + } + } + + private virtual CacheManager pCache + { + get + { + return this._pCache; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + CacheManager.ResourceChangedEventHandler changedEventHandler = new CacheManager.ResourceChangedEventHandler(this.Cache_RemoteResourceChanged); + if (this._pCache != null) + this._pCache.ResourceChanged -= changedEventHandler; + this._pCache = value; + if (this._pCache == null) + return; + this._pCache.ResourceChanged += changedEventHandler; + } + } + + protected override void WndProc(ref Message m) + { + if (m.Msg == TaskbarManager.TaskbarButtonCreatedMessage) + this.pTaskbarButtonCreated = true; + base.WndProc(ref m); + } + + public bool TaskbarButtonCreated + { + get + { + return this.pTaskbarButtonCreated; + } + } + + public ConnectionSettingBase CurrentConnectionSetting + { + get + { + return this.pCurrentConnectionSetting; + } + } + + public ResourceId CurrentId + { + get + { + if (this.CurrentInfo == null) + return (ResourceId) null; + return this.CurrentInfo.Id; + } + } + + public ResourceInfo CurrentInfo + { + get + { + if (this.pCurrentResourceInfos == null) + return (ResourceInfo) null; + return this.pCurrentResourceInfos[0]; + } + } + + public ResourceInfo[] CurrentResourceInfos + { + get + { + return this.pCurrentResourceInfos; + } + } + + public bool IsConnected + { + get + { + return (object) this.CurrentId != null; + } + } + + public bool IsTemporaryConnection + { + get + { + return this.pIsTemporaryConnection; + } + } + + public MainForm() + { + this.DragDrop += new DragEventHandler(this.MainForm_DragDrop); + this.DragEnter += new DragEventHandler(this.MainForm_DragEnter); + this.Load += new EventHandler(this.MainForm_Load); + this.DragOver += new DragEventHandler(this.MainForm_DragOver); + this.DragLeave += new EventHandler(this.MainForm_DragLeave); + this.Activated += new EventHandler(this.MainForm_Activated); + this.Shown += new EventHandler(this.MainForm_Shown); + this.ResizeEnd += new EventHandler(this.MainForm_ResizeEnd); + this.FormClosing += new FormClosingEventHandler(this.MainForm_FormClosing); + this.pDataObjectList = new List(); + this.WriteLineLogHandler = new MainForm.WriteLineLogDel(this.WriteLineLog); + this.pTaskbarButtonCreated = false; + this.RemoteResourceChangedHandler = new EventHandler(this.Cache_RemoteResourceChanged); + this.InitializeComponent(); + checked { ++MainForm.MainFormCounter; } + if (MainForm.MainFormCounter != 1) + return; + MainForm.AppUserModelId = (Application.CompanyName + "." + Application.ProductName).Replace(" ", ""); + if (!XmlSettingManager.IsPortable) + { + TaskbarManager.SetAppUserModelID(MainForm.AppUserModelId); + TaskbarManager.SetJumpListKnownCategory(MainForm.AppUserModelId, true); + LogWriter.LogFilePath = Path.Combine(Application.StartupPath, "log.txt"); + } + else + LogWriter.LogFilePath = string.Join(Conversions.ToString(Path.DirectorySeparatorChar), new string[4] + { + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + Application.CompanyName, + Application.ProductName, + "log.txt" + }); + TaskbarManager.RegisterTaskbarMessage(); + FsManager.LoadFs(); + } + + private void MainForm_Load(object sender, EventArgs e) + { + if (this.pSetting == null) + { + string masterpassword = (string) null; + while (true) + { + try + { + this.pSetting = XmlSettingManager.LoadSetting(masterpassword); + break; + } + catch (MasterPasswordException ex) + { + ProjectData.SetProjectError((Exception) ex); + MasterPasswordInputForm passwordInputForm = new MasterPasswordInputForm(); + passwordInputForm.PasswordInvalid = !string.IsNullOrEmpty(masterpassword); + switch (passwordInputForm.ShowDialog()) + { + case DialogResult.OK: + masterpassword = passwordInputForm.MasterPassword; + ProjectData.ClearProjectError(); + continue; + case DialogResult.Ignore: + this.pSetting = new WebDAVClientSetting(); + break; + default: + Environment.Exit(1); + break; + } + ProjectData.ClearProjectError(); + break; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + switch (MessageBox.Show("Error occurred during loading settings.\r\n" + ex.Message, "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Hand)) + { + case DialogResult.Retry: + masterpassword = (string) null; + ProjectData.ClearProjectError(); + continue; + case DialogResult.Ignore: + this.pSetting = new WebDAVClientSetting(); + break; + default: + Environment.Exit(1); + break; + } + ProjectData.ClearProjectError(); + break; + } + } + } + this.pCurrentConnectionSetting = (ConnectionSettingBase) null; + this.pFs = (FsBase) null; + this.pCurrentResourceInfos = (ResourceInfo[]) null; + this.pCache = new CacheManager(); + this.pUriHistory = new LinkedList(); + this.pCurrentHistoryNode = this.pUriHistory.First; + this.pDownForms = new Dictionary(); + this.pUpForms = new Dictionary(); + this.pPropertyForms = new List(); + this.Size = this.pSetting.FormSize; + this.StatusBarChange(this.pSetting.ShowStatusBar); + this.LogViewChange(this.pSetting.ShowLogWindow); + this.FileLoggingChange(this.pSetting.EnableFileLogging); + Application.Idle += new EventHandler(this.Application_Idle); + this.InitImageList(); + if (MainForm.MainFormCounter == 1) + { + string[] commandLineArgs = Environment.GetCommandLineArgs(); + if (commandLineArgs.Length >= 2) + { + int num1 = 0; + int num2 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index = num1; + while (index <= num2) + { + if (Operators.CompareString(commandLineArgs[1], this.pSetting.ConnectionSettings[index].Name, false) == 0) + { + this.BootConnection = this.pSetting.ConnectionSettings[index]; + break; + } + checked { ++index; } + } + } + } + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + this.ResourceListView.BeginUpdate(); + this.ResourceListView.AutoArrange = true; + int num3 = 0; + int num4 = checked (MainForm.ResourceListViewColumnNames.Length - 1); + int index1 = num3; + while (index1 <= num4) + { + this.ResourceListView.Columns.Add(MainForm.ResourceListViewColumnNames[index1]); + checked { ++index1; } + } + this.ResourceListView.Columns[3].TextAlign = HorizontalAlignment.Right; + bool flag = false; + this.ResourceListView.View = View.Details; + if (this.pSetting.ColumnIndexs.Length == this.ResourceListView.Columns.Count && this.pSetting.ColumnWidth.Length == this.ResourceListView.Columns.Count) + { + List intList = new List(); + int num1 = 0; + int num2 = checked (this.ResourceListView.Columns.Count - 1); + int num5 = num1; + while (num5 <= num2) + { + intList.Add(num5); + checked { ++num5; } + } + flag = true; + int num6 = 0; + int num7 = checked (this.ResourceListView.Columns.Count - 1); + int index2 = num6; + while (index2 <= num7) + { + if (!intList.Contains(this.pSetting.ColumnIndexs[index2])) + { + flag = false; + break; + } + intList.Remove(this.pSetting.ColumnIndexs[index2]); + if (this.pSetting.ColumnWidth[index2] < 0) + this.pSetting.ColumnWidth[index2] = 0; + checked { ++index2; } + } + } + if (!flag) + { + this.pSetting.ColumnIndexs = new int[checked (this.ResourceListView.Columns.Count - 1 + 1)]; + this.pSetting.ColumnWidth = new int[checked (this.ResourceListView.Columns.Count - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.ResourceListView.Columns.Count - 1); + int index2 = num1; + while (index2 <= num2) + { + this.pSetting.ColumnIndexs[index2] = index2; + this.pSetting.ColumnWidth[index2] = 50; + checked { ++index2; } + } + } + int num8 = 0; + int num9 = checked (this.ResourceListView.Columns.Count - 1); + int index3 = num8; + while (index3 <= num9) + { + this.ResourceListView.Columns[index3].DisplayIndex = this.pSetting.ColumnIndexs[index3]; + this.ResourceListView.Columns[index3].Width = this.pSetting.ColumnWidth[index3]; + checked { ++index3; } + } + int num10 = 0; + int num11 = checked (this.ResourceListView.Columns.Count - 1); + int index4 = num10; + while (index4 <= num11) + { + this.ResourceListView.Columns[index4].DisplayIndex = this.pSetting.ColumnIndexs[index4]; + this.ResourceListView.Columns[index4].Width = this.pSetting.ColumnWidth[index4]; + checked { ++index4; } + } + this.ResourceListView.ListViewItemSorter = (IComparer) new MainForm.ResourceListViewItemComparer(this.pSetting.SortString); + this.ResourceListView.EndUpdate(); + this.CreateAddNewSettingMenu(); + this.UpdateResourceListViewItem(new ResourceInfo[0]); + this.ShowConnectionSettings((ConnectionSettingBase) null, (ConnectionSettingBase) null); + this.UpdateWindow(); + this.LoadBackgroundImage(); + this.VersionCheck(); + this.TestToolStripMenuItem.Visible = false; + } + + private void MainForm_Shown(object sender, EventArgs e) + { + if (this.BootConnection != null) + this.Connect(this.BootConnection, false); + if (!this.pSetting.AutoEnableDAVServer || MainForm.MainFormCounter != 0) + return; + this.EnableDAVServer(); + } + + private void MainForm_ResizeEnd(object sender, EventArgs e) + { + this.pSetting.FormSize = this.Size; + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (!this.TryClosePropertyForms()) + e.Cancel = true; + else if (!this.TryCloseUpDownForms()) + e.Cancel = true; + else if (!this.TryDisconnectOLE()) + { + e.Cancel = true; + } + else + { + this.SaveCurrentSetting(); + Application.Idle -= new EventHandler(this.Application_Idle); + this.DisableDAVServer(); + } + } + + private void CreateAddNewSettingMenu() + { + EventHandler eventHandler = new EventHandler(this.AddNewSettingToolStripMenuItem_Click); + FsManager.TypeNamePair[] fsNameAndType = FsManager.GetFsNameAndType(); + int num1 = 0; + int num2 = checked (fsNameAndType.Length - 1); + int index = num1; + while (index <= num2) + { + try + { + ToolStripMenuItem toolStripMenuItem1 = new ToolStripMenuItem(fsNameAndType[index].Name); + toolStripMenuItem1.Tag = (object) fsNameAndType[index].Type; + using (Icon icon = new Icon(FsManager.GetDefaultFavicon(fsNameAndType[index].Type), 16, 16)) + toolStripMenuItem1.Image = (Image) icon.ToBitmap(); + toolStripMenuItem1.Click += eventHandler; + this.NewConnectionContextMenuItem.DropDownItems.Add((ToolStripItem) toolStripMenuItem1); + ToolStripMenuItem toolStripMenuItem2 = new ToolStripMenuItem(fsNameAndType[index].Name); + toolStripMenuItem2.Tag = (object) fsNameAndType[index].Type; + using (Icon icon = new Icon(FsManager.GetDefaultFavicon(fsNameAndType[index].Type), 16, 16)) + toolStripMenuItem2.Image = (Image) icon.ToBitmap(); + toolStripMenuItem2.Click += eventHandler; + this.NewConnectionToolStripMenuItem.DropDownItems.Add((ToolStripItem) toolStripMenuItem2); + ToolStripMenuItem toolStripMenuItem3 = new ToolStripMenuItem(fsNameAndType[index].Name); + toolStripMenuItem3.Tag = (object) fsNameAndType[index].Type; + using (Icon icon = new Icon(FsManager.GetDefaultFavicon(fsNameAndType[index].Type), 16, 16)) + toolStripMenuItem3.Image = (Image) icon.ToBitmap(); + toolStripMenuItem3.Click += eventHandler; + this.NewConnectionToolStripDropDownButton.DropDownItems.Add((ToolStripItem) toolStripMenuItem3); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + checked { ++index; } + } + } + + private void Connect(ConnectionSettingBase cs, bool istemporary) + { + this.InnerDisconnect(); + this.pCurrentConnectionSetting = cs; + this.pIsTemporaryConnection = istemporary; + if (istemporary) + this.Text = Application.ProductName + " - " + cs.TargetUri.ToString(); + else + this.Text = Application.ProductName + " - " + this.CurrentConnectionSetting.Name; + this.UpdateFavicon(); + this.pFs = this.CurrentConnectionSetting.GetClient(); + this.pFs.GroupName = "MainUI"; + this.pFs.LogMessage += new EventHandler(this.Client_OnMessage); + if (!this.ShowEntriesByUri(this.CurrentConnectionSetting.TargetUri, false)) + { + this.InnerDisconnect(); + this.Text = Application.ProductName; + this.UpdateWindow(); + } + else + this.StartDownloadFavicon(); + } + + private void TemporaryConnect(Uri target) + { + ConnectionSettingBase c = (ConnectionSettingBase) null; + if (FsManager.TryCreate(target, ref c)) + { + this.Connect(c, true); + } + else + { + int num = (int) MessageBox.Show("unsupported uri", "error", MessageBoxButtons.OK, MessageBoxIcon.Hand); + } + } + + private void UpdateFavicon() + { + if (this.CurrentConnectionSetting != null) + { + using (Icon favicon = MainForm.GetFavicon(this.CurrentConnectionSetting)) + { + if (favicon == null) + return; + if (this.FaviconToolStripButton.Image != null) + this.FaviconToolStripButton.Image.Dispose(); + using (Icon icon = new Icon(favicon, 16, 16)) + this.FaviconToolStripButton.Image = (Image) icon.ToBitmap(); + } + } + else + { + if (this.FaviconToolStripButton.Image != null) + this.FaviconToolStripButton.Image.Dispose(); + this.FaviconToolStripButton.Image = (Image) null; + } + } + + public static Icon GetFavicon(ConnectionSettingBase cs) + { + try + { + if (!string.IsNullOrEmpty(cs.FaviconName)) + { + string str = Path.Combine(XmlSettingManager.FaviconFolder, cs.FaviconName); + if (System.IO.File.Exists(str)) + return new Icon(str, 16, 16); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + return FsManager.GetDefaultFavicon(cs.GetType()); + } + + private static string GetFaviconPath(ConnectionSettingBase cs) + { + if (!string.IsNullOrEmpty(cs.FaviconName)) + { + string path = Path.Combine(XmlSettingManager.FaviconFolder, cs.FaviconName); + if (System.IO.File.Exists(path)) + return path; + } + return FsManager.GetDefaultFaviconPath(cs.GetType()); + } + + private void StartDownloadFavicon() + { + if (this.pFaviconDownloadWorker != null) + this.pFaviconDownloadWorker.CancelAsync(); + this.pFaviconDownloadWorker = new BackgroundWorker(); + this.pFaviconDownloadWorker.WorkerSupportsCancellation = true; + FsBase client = this.CurrentConnectionSetting.GetClient(); + client.LogMessage += new EventHandler(this.Client_OnMessage); + client.GroupName = "MainUI"; + this.pFaviconDownloadWorker.RunWorkerAsync((object) new object[3] + { + (object) client, + (object) this.CurrentConnectionSetting, + (object) this.pIsTemporaryConnection + }); + } + + private void pFaviconDownloadWorker_DoWork(object sender, DoWorkEventArgs e) + { + BackgroundWorker backgroundWorker = (BackgroundWorker) sender; + object[] objArray1 = (object[]) e.Argument; + FsBase fs = (FsBase) objArray1[0]; + ConnectionSettingBase connectionSettingBase = (ConnectionSettingBase) objArray1[1]; + object[] objArray2 = new object[4] + { + (object) fs, + (object) connectionSettingBase, + RuntimeHelpers.GetObjectValue(objArray1[2]), + (object) null + }; + e.Cancel = false; + e.Result = (object) objArray2; + Uri targetUri = connectionSettingBase.TargetUri; + if ((object) targetUri == null) + return; + List uriList = new List(); + uriList.Add(UriUtil.CombineName(targetUri, "favicon.ico")); + Uri uri = UriUtil.CombineName(new Uri(UriUtil.GetAuthority(targetUri)), "favicon.ico"); + if (!uriList.Contains(uri)) + uriList.Add(uri); + byte[] buffer = new byte[4097]; + List.Enumerator enumerator; + try + { + enumerator = uriList.GetEnumerator(); + while (enumerator.MoveNext()) + { + Uri current = enumerator.Current; + try + { + using (Stream stream = this.pCache.OpenRead(fs, current)) + { + using (MemoryStream memoryStream = new MemoryStream()) + { + do + { + int count = stream.Read(buffer, 0, buffer.Length); + if (count > 0) + { + memoryStream.Write(buffer, 0, count); + int num; + checked { num += count; } + if (num >= this.pSetting.MaxFaviconSize) + throw new Exception("Favicon too large"); + } + else + goto label_13; + } + while (!backgroundWorker.CancellationPending); + e.Cancel = true; + break; +label_13: + memoryStream.Position = 0L; + using (new Icon((Stream) memoryStream)) + ; + buffer = memoryStream.ToArray(); + } + } + objArray2[3] = (object) buffer; + break; + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + try + { + this.Invoke((Delegate) this.WriteLineLogHandler, (object) ex2.ToString()); + } + catch (Exception ex3) + { + ProjectData.SetProjectError(ex3); + ProjectData.ClearProjectError(); + } + try + { + LogWriter.WriteException(ex2); + } + catch (Exception ex3) + { + ProjectData.SetProjectError(ex3); + ProjectData.ClearProjectError(); + } + ProjectData.ClearProjectError(); + } + } + } + finally + { + enumerator.Dispose(); + } + } + + private void pFaviconDownloadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + this.pFaviconDownloadWorker = (BackgroundWorker) null; + if (e.Cancelled || e.Error != null) + return; + object[] result = (object[]) e.Result; + FsBase fsBase = (FsBase) result[0]; + ConnectionSettingBase cs = (ConnectionSettingBase) result[1]; + bool flag = (bool) result[2]; + byte[] array = (byte[]) result[3]; + if (array != null) + { + try + { + Random random = new Random(); + string path2 = cs.FaviconName; + if (string.IsNullOrEmpty(path2)) + path2 = DateTime.Now.ToString("yyyyMMddHHmmss") + random.Next(0, 10000).ToString("0000") + ".ico"; + string faviconFolder = XmlSettingManager.FaviconFolder; + if (!Directory.Exists(faviconFolder)) + Directory.CreateDirectory(faviconFolder); + string str = Path.Combine(faviconFolder, path2); + using (FileStream fileStream = new FileStream(str, FileMode.Create)) + fileStream.Write(array, 0, array.Length); + using (Icon icon = new Icon(str, 16, 16)) + icon.ToBitmap().Dispose(); + cs.FaviconName = path2; + this.SaveCurrentSetting(); + this.UpdateFavicon(); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + LogWriter.WriteMessage("Main Form", "Invalid favicon"); + LogWriter.WriteException(ex2); + ProjectData.ClearProjectError(); + } + } + if (XmlSettingManager.IsPortable || flag) + return; + string arguments = cs.Name; + if (arguments.Contains(" ") || arguments.Contains("\"")) + arguments = "\"" + cs.Name + "\""; + TaskbarManager.AddToRecent(MainForm.AppUserModelId, Application.ExecutablePath, arguments, cs.Name, cs.Name, MainForm.GetFaviconPath(cs), 0); + } + + private void VersionCheck() + { + if (!this.pSetting.VersionCheckEnabled) + return; + this.pVersionChecker = new BackgroundWorker(); + this.pVersionChecker.RunWorkerAsync(); + } + + private void pVersionChecker_DoWork(object sender, DoWorkEventArgs e) + { + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + string product = ((AssemblyProductAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false)[0]).Product; + string str = executingAssembly.GetName().Version.ToString(3); + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create("http://rei.to/carotdav.version.txt"); + httpWebRequest.Method = "GET"; + httpWebRequest.UserAgent = product + "/" + str; + httpWebRequest.ConnectionGroupName = "VersionChecker"; + try + { + string end; + using (HttpWebResponse response = (HttpWebResponse) httpWebRequest.GetResponse()) + { + using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) + end = streamReader.ReadToEnd(); + } + e.Result = (object) new Version(end); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + e.Result = (object) null; + ProjectData.ClearProjectError(); + } + } + + private void pVersionChecker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + Version result = e.Result as Version; + if ((object) result == null) + return; + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + if (!(result > executingAssembly.GetName().Version)) + return; + this.NewVersionToolStripMenuItem.Text = "Version " + result.ToString() + " Available"; + this.NewVersionToolStripMenuItem.Visible = true; + } + + private void Disconnect() + { + this.InnerDisconnect(); + this.Text = Application.ProductName; + this.UpdateFavicon(); + this.ShowConnectionSettings((ConnectionSettingBase) null, (ConnectionSettingBase) null); + this.UpdateWindow(); + } + + private void InnerDisconnect() + { + this.Fs_Reset(); + this.pFs = (FsBase) null; + this.pCurrentResourceInfos = (ResourceInfo[]) null; + this.pCache.RegisterWatchUri((Uri) null); + this.pCache.Clear(); + this.pUriHistory.Clear(); + this.pCurrentHistoryNode = (LinkedListNode) null; + if (this.pCurrentConnectionSetting != null) + this.pCurrentConnectionSetting.Reset(); + this.pCurrentConnectionSetting = (ConnectionSettingBase) null; + this.pIsTemporaryConnection = false; + this.UriToolStripTextBox.Text = string.Empty; + } + + private bool TryDisconnectOLE() + { + return OleStream.OpenCount == 0 || (OleStream.OpenCount == 0 || MessageBox.Show("Data transfer via DragDrop or Clipboard is in progress. Close forcibly?", "Close", MessageBoxButtons.OKCancel) == DialogResult.OK); + } + + private bool ShowEntriesByUri(Uri targeturi, bool enablecache) + { + this.pCache.RegisterWatchUri((Uri) null); + return this.InnerShowEntries(this.Fs_GetInfoAndInnerEntries(targeturi, (ResourceId) null, (ResourceId) null, enablecache)); + } + + private bool ShowEntriesById(ResourceId id, bool enablecache) + { + this.pCache.RegisterWatchUri((Uri) null); + return this.InnerShowEntries(this.Fs_GetInfoAndInnerEntries((Uri) null, id, (ResourceId) null, enablecache)); + } + + private bool ShowEntriesByParent(ResourceId id, bool enablecache) + { + this.pCache.RegisterWatchUri((Uri) null); + return this.InnerShowEntries(this.Fs_GetInfoAndInnerEntries((Uri) null, (ResourceId) null, id, enablecache)); + } + + private bool InnerShowEntries(ResourceInfo[] ris) + { + if (ris == null) + return false; + this.pCurrentResourceInfos = ris; + this.pCache.RegisterWatchUri(this.CurrentId.Uri); + if (this.pCurrentHistoryNode == null) + { + this.pUriHistory.AddLast(this.CurrentId); + this.pCurrentHistoryNode = this.pUriHistory.First; + } + else if (!(this.pCurrentHistoryNode.Value == this.CurrentId)) + { + while (this.pUriHistory.Last != this.pCurrentHistoryNode) + this.pUriHistory.RemoveLast(); + this.pCurrentHistoryNode = this.pUriHistory.AddLast(this.CurrentId); + } + this.UriToolStripTextBox.Text = this.CurrentId.ToString(); + this.UpdateResourceListViewItem(ris); + this.UpdateWindow(); + this.ResourceListView.Focus(); + return true; + } + + private void RefreshResourceListView_All() + { + this.UpdateResourceListViewItem(this.CurrentResourceInfos); + } + + private void UpdateResourceListViewItem(ResourceInfo[] ris) + { + List uriList = new List(); + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + ResourceInfo tag = this.ResourceListView.SelectedItems[index1].Tag as ResourceInfo; + if (tag != null) + uriList.Add(tag.Id.Uri); + checked { ++index1; } + } + Uri uri = (Uri) null; + if (this.ResourceListView.FocusedItem != null) + { + ResourceInfo tag = this.ResourceListView.FocusedItem.Tag as ResourceInfo; + if (tag != null) + uri = tag.Id.Uri; + } + ListViewItem listViewItem = (ListViewItem) null; + this.ResourceListView.BeginUpdate(); + this.ResourceListView.Items.Clear(); + int num3 = 0; + int num4 = checked (ris.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + if (!(ris[index2].Id == ris[0].Id) || !ris[index2].IsCollection) + { + ListViewItem itemFromResource = MainForm.CreateListItemFromResource(ris[index2]); + if (uriList.Contains(ris[index2].Id.Uri)) + itemFromResource.Selected = true; + if (ris[index2].Id.Uri == uri) + listViewItem = itemFromResource; + this.ResourceListView.Items.Add(itemFromResource); + this.ResourceListView.SetTileVisibleColumn(itemFromResource.Index, new int[2] + { + 3, + 4 + }); + if (ris[index2].IsEncrypted) + WallMarkListView.ListViewOverlay(itemFromResource, 1U); + } + checked { ++index2; } + } + this.UpdateResourceListViewGroup(); + this.UpdateResourceListViewView(); + this.ResourceListView.FocusedItem = listViewItem; + this.ResourceListView.EndUpdate(); + } + + private static ListViewItem CreateListItemFromResource(ResourceInfo ri) + { + ListViewItem listViewItem = new ListViewItem(); + listViewItem.Tag = (object) ri; + listViewItem.Text = UriUtil.GetLastName(ri.Id.Uri); + listViewItem.SubItems.Add(ri.Id.Uri.AbsolutePath); + listViewItem.ToolTipText = ri.Id.Uri.AbsolutePath; + listViewItem.SubItems.Add(ri.StatusDescription); + if (ri.Size >= 0L) + listViewItem.SubItems.Add(ri.Size.ToString("#,0")); + else + listViewItem.SubItems.Add("?"); + listViewItem.SubItems.Add(ri.LastModifiedTime.ToString()); + listViewItem.SubItems.Add(ri.CreationTime.ToString()); + if (ri.IsSplitted) + listViewItem.ForeColor = MainForm.SplitColor; + if (ri.IsEncrypted) + listViewItem.ForeColor = MainForm.EncryptedColor; + if (ri.IsMinor) + listViewItem.ForeColor = MainForm.MinorColor; + listViewItem.ImageKey = !ri.HasError ? (!ri.IsCollection ? (!ri.IsSplitted ? "Resource" : "Split Resource") : "Collection") : "Error"; + return listViewItem; + } + + private void UpdateResourceListViewGroup() + { + this.GroupNoneToolStripMenuItem.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.None; + this.GroupNameToolStripMenuItem.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.Name; + this.GroupSizeToolStripMenuItem.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.Size; + this.GroupTypeToolStripMenuItem.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.Type; + this.GroupNoneToolStripMenuItem1.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.None; + this.GroupNameToolStripMenuItem1.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.Name; + this.GroupSizeToolStripMenuItem1.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.Size; + this.GroupTypeToolStripMenuItem1.Checked = this.pSetting.Group == WebDAVClientSetting.GroupType.Type; + if (this.pSetting.Group == WebDAVClientSetting.GroupType.None || !OSFeature.Feature.IsPresent(RuntimeHelpers.GetObjectValue(OSFeature.Themes))) + { + this.ResourceListView.ShowGroups = false; + this.ResourceListView.Groups.Clear(); + } + else + { + this.ResourceListView.Groups.Clear(); + this.ResourceListView.ShowGroups = true; + List listViewGroupList = new List(); + Dictionary dictionary1 = new Dictionary(); + switch (this.pSetting.Group) + { + case WebDAVClientSetting.GroupType.Name: + int num1 = 0; + int num2 = checked (MainForm.pNameGroupList.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + listViewGroupList.Add(new ListViewGroup(MainForm.pNameGroupList[index1], "")); + checked { ++index1; } + } + try + { + foreach (ListViewItem key in this.ResourceListView.Items) + { + ListViewGroup listViewGroup; + if (Operators.CompareString(key.Text, "", false) == 0) + { + listViewGroup = listViewGroupList[4]; + } + else + { + switch (char.ToUpper(key.Text[0])) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + listViewGroup = listViewGroupList[0]; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + listViewGroup = listViewGroupList[1]; + break; + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + listViewGroup = listViewGroupList[2]; + break; + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + listViewGroup = listViewGroupList[3]; + break; + default: + listViewGroup = listViewGroupList[4]; + break; + } + } + dictionary1.Add(key, listViewGroup); + } + break; + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + case WebDAVClientSetting.GroupType.Type: + if (this.IsConnected) + { + List stringList = new List(); + try + { + foreach (ListViewItem listViewItem in this.ResourceListView.Items) + { + string str = string.Join("/", ((ResourceInfo) listViewItem.Tag).Types.ToArray()); + if (!stringList.Contains(str)) + stringList.Add(str); + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + stringList.Sort(); + Dictionary dictionary2 = new Dictionary(); + List.Enumerator enumerator1; + try + { + enumerator1 = stringList.GetEnumerator(); + while (enumerator1.MoveNext()) + { + string current = enumerator1.Current; + ListViewGroup listViewGroup = new ListViewGroup(current, ""); + listViewGroupList.Add(listViewGroup); + dictionary2.Add(current, listViewGroup); + } + } + finally + { + enumerator1.Dispose(); + } + try + { + foreach (ListViewItem key in this.ResourceListView.Items) + dictionary1.Add(key, dictionary2[string.Join("/", ((ResourceInfo) key.Tag).Types.ToArray())]); + break; + } + finally + { + IEnumerator enumerator2; + if (enumerator2 is IDisposable) + (enumerator2 as IDisposable).Dispose(); + } + } + else + { + List stringList = new List(); + Dictionary dictionary2 = new Dictionary(); + try + { + foreach (ListViewItem key in this.ResourceListView.Items) + { + ConnectionSettingBase tag = (ConnectionSettingBase) key.Tag; + string str = ""; + PropertyInfo property = tag.GetType().GetProperty("TypeName", BindingFlags.Static | BindingFlags.Public, (Binder) null, typeof (string), new System.Type[0], (ParameterModifier[]) null); + if (property != null) + str = (string) property.GetValue((object) null, (object[]) null); + if (!stringList.Contains(str)) + stringList.Add(str); + dictionary2.Add(key, str); + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + stringList.Sort(); + Dictionary dictionary3 = new Dictionary(); + List.Enumerator enumerator1; + try + { + enumerator1 = stringList.GetEnumerator(); + while (enumerator1.MoveNext()) + { + string current = enumerator1.Current; + ListViewGroup listViewGroup = new ListViewGroup(current, ""); + listViewGroupList.Add(listViewGroup); + dictionary3.Add(current, listViewGroup); + } + } + finally + { + enumerator1.Dispose(); + } + try + { + foreach (ListViewItem key in this.ResourceListView.Items) + dictionary1.Add(key, dictionary3[dictionary2[key]]); + break; + } + finally + { + IEnumerator enumerator2; + if (enumerator2 is IDisposable) + (enumerator2 as IDisposable).Dispose(); + } + } + case WebDAVClientSetting.GroupType.Size: + int num3 = 0; + int num4 = checked (MainForm.pSizeGroupList.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + listViewGroupList.Add(new ListViewGroup(MainForm.pSizeGroupList[index2], "")); + checked { ++index2; } + } + try + { + foreach (ListViewItem key in this.ResourceListView.Items) + { + ListViewGroup listViewGroup1 = listViewGroupList[0]; + ResourceInfo tag = key.Tag as ResourceInfo; + ListViewGroup listViewGroup2; + if (tag != null) + { + long size = tag.Size; + listViewGroup2 = size >= 10240L ? (size >= 102400L ? (size >= 1048576L ? (size >= 16777216L ? (size >= 134217728L ? listViewGroupList[5] : listViewGroupList[4]) : listViewGroupList[3]) : listViewGroupList[2]) : listViewGroupList[1]) : listViewGroupList[0]; + } + else + listViewGroup2 = listViewGroupList[6]; + dictionary1.Add(key, listViewGroup2); + } + break; + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + } + Dictionary dictionary4 = new Dictionary(); + List.Enumerator enumerator3; + try + { + enumerator3 = listViewGroupList.GetEnumerator(); + while (enumerator3.MoveNext()) + { + ListViewGroup current = enumerator3.Current; + dictionary4.Add(current, 0); + } + } + finally + { + enumerator3.Dispose(); + } + try + { + foreach (ListViewItem index3 in this.ResourceListView.Items) + { + Dictionary dictionary2 = dictionary4; + Dictionary dictionary3 = dictionary2; + ListViewGroup index4 = dictionary1[index3]; + ListViewGroup index5 = index4; + int num5 = checked (dictionary2[index4] + 1); + dictionary3[index5] = num5; + } + } + finally + { + IEnumerator enumerator1; + if (enumerator1 is IDisposable) + (enumerator1 as IDisposable).Dispose(); + } + List.Enumerator enumerator4; + try + { + enumerator4 = listViewGroupList.GetEnumerator(); + while (enumerator4.MoveNext()) + { + ListViewGroup current = enumerator4.Current; + int num5; + if (Operators.CompareString(current.Name, "", false) == 0) + { + ListViewGroup listViewGroup = current; + string str1 = "None"; + num5 = dictionary4[current]; + string str2 = num5.ToString(" (0)"); + string str3 = str1 + str2; + listViewGroup.Header = str3; + } + else + { + ListViewGroup listViewGroup = current; + string name = current.Name; + num5 = dictionary4[current]; + string str1 = num5.ToString(" (0)"); + string str2 = name + str1; + listViewGroup.Header = str2; + } + } + } + finally + { + enumerator4.Dispose(); + } + this.ResourceListView.Groups.AddRange(listViewGroupList.ToArray()); + try + { + foreach (ListViewItem index3 in this.ResourceListView.Items) + dictionary1[index3].Items.Add(index3); + } + finally + { + IEnumerator enumerator1; + if (enumerator1 is IDisposable) + (enumerator1 as IDisposable).Dispose(); + } + } + } + + private void UpdateResourceListViewView() + { + this.LargeIconToolStripMenuItem.Checked = this.pSetting.View == View.LargeIcon; + this.SmallIconToolStripMenuItem.Checked = this.pSetting.View == View.SmallIcon; + this.ListToolStripMenuItem.Checked = this.pSetting.View == View.List; + this.TileToolStripMenuItem.Checked = this.pSetting.View == View.Tile; + this.DetailToolStripMenuItem.Checked = this.pSetting.View == View.Details; + this.AutoColumnWidthToolStripMenuItem.Enabled = this.pSetting.View == View.Details; + this.AutoColumnWidthToolStripMenuItem.Checked = this.pSetting.AutoColumnWidth; + this.LargeIconToolStripMenuItem1.Checked = this.pSetting.View == View.LargeIcon; + this.SmallIconToolStripMenuItem1.Checked = this.pSetting.View == View.SmallIcon; + this.ListToolStripMenuItem1.Checked = this.pSetting.View == View.List; + this.TileToolStripMenuItem1.Checked = this.pSetting.View == View.Tile; + this.DetailToolStripMenuItem1.Checked = this.pSetting.View == View.Details; + this.AutoColumnWidthToolStripMenuItem1.Enabled = this.pSetting.View == View.Details; + this.AutoColumnWidthToolStripMenuItem1.Checked = this.pSetting.AutoColumnWidth; + this.LargeIconToolStripMenuItem2.Checked = this.pSetting.View == View.LargeIcon; + this.SmallIconToolStripMenuItem2.Checked = this.pSetting.View == View.SmallIcon; + this.ListToolStripMenuItem2.Checked = this.pSetting.View == View.List; + this.TileToolStripMenuItem2.Checked = this.pSetting.View == View.Tile; + this.DetailToolStripMenuItem2.Checked = this.pSetting.View == View.Details; + this.AutoColumnWidthToolStripMenuItem2.Enabled = this.pSetting.View == View.Details; + this.AutoColumnWidthToolStripMenuItem2.Checked = this.pSetting.AutoColumnWidth; + bool flag = OSFeature.Feature.IsPresent(RuntimeHelpers.GetObjectValue(OSFeature.Themes)); + this.GroupNoneToolStripMenuItem.Enabled = this.pSetting.View != View.List && flag; + this.GroupNameToolStripMenuItem.Enabled = this.pSetting.View != View.List && flag; + this.GroupSizeToolStripMenuItem.Enabled = this.pSetting.View != View.List && flag; + this.GroupTypeToolStripMenuItem.Enabled = this.pSetting.View != View.List && flag; + this.GroupToolStripMenuItem.Enabled = this.pSetting.View != View.List && flag; + this.GroupNoneToolStripMenuItem1.Enabled = this.pSetting.View != View.List && flag; + this.GroupNameToolStripMenuItem1.Enabled = this.pSetting.View != View.List && flag; + this.GroupSizeToolStripMenuItem1.Enabled = this.pSetting.View != View.List && flag; + this.GroupTypeToolStripMenuItem1.Enabled = this.pSetting.View != View.List && flag; + this.GroupToolStripMenuItem.Enabled = this.pSetting.View != View.List && flag; + switch (this.pSetting.View) + { + case View.LargeIcon: + this.ResourceListView.View = this.pSetting.View; + this.ResourceListView.ArrangeIcons(ListViewAlignment.Top); + break; + case View.Details: + this.ResourceListView.View = this.pSetting.View; + this.ResourceListView.Columns[0].Width = this.pSetting.ColumnWidth[0]; + if (!this.pSetting.AutoColumnWidth || this.ResourceListView.Items.Count <= 0) + break; + this.ResourceListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + break; + case View.SmallIcon: + this.ResourceListView.View = this.pSetting.View; + int num1 = 100; + int num2 = 0; + int num3 = checked (this.ResourceListView.Items.Count - 1); + int index = num2; + while (index <= num3) + { + if (this.ResourceListView.Items[index].Bounds.Width > num1) + num1 = this.ResourceListView.Items[index].Bounds.Width; + checked { ++index; } + } + if (num1 > 400) + num1 = 400; + this.ResourceListView.Columns[0].Width = num1; + this.ResourceListView.ArrangeIcons(); + break; + case View.List: + this.ResourceListView.View = this.pSetting.View; + if (this.ResourceListView.Columns[0].Width < 200) + this.ResourceListView.Columns[0].Width = 200; + this.ResourceListView.ArrangeIcons(); + break; + case View.Tile: + this.ResourceListView.View = this.pSetting.View; + break; + } + } + + private void ShowConnectionSettings(ConnectionSettingBase newsetting = null, ConnectionSettingBase oldsetting = null) + { + this.UpdateImageList(); + this.ResourceListView.BeginUpdate(); + if (newsetting == null) + this.ResourceListView.Items.Clear(); + else + this.ResourceListView.SelectedItems.Clear(); + int num1 = 0; + int num2 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + if ((newsetting == null || this.pSetting.ConnectionSettings[index1] == newsetting) && this.pSetting.ConnectionSettings[index1].GetType() != typeof (ConnectionSettingBase)) + { + ListViewItem listitem = new ListViewItem(); + listitem.Tag = (object) this.pSetting.ConnectionSettings[index1]; + listitem.Text = this.pSetting.ConnectionSettings[index1].Name; + listitem.SubItems.Add(this.pSetting.ConnectionSettings[index1].TargetUri.ToString()); + listitem.SubItems.Add(""); + listitem.SubItems.Add(""); + listitem.SubItems.Add(""); + listitem.ImageIndex = checked (index1 + 8); + if (this.pSetting.ConnectionSettings[index1].AutoSplit) + listitem.ForeColor = MainForm.SplitColor; + if (this.pSetting.ConnectionSettings[index1].UseEncryption) + listitem.ForeColor = MainForm.EncryptedColor; + if (oldsetting == null) + { + this.ResourceListView.Items.Add(listitem); + } + else + { + int num3 = 0; + int num4 = checked (this.ResourceListView.Items.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + if (this.ResourceListView.Items[index2].Tag == oldsetting) + { + this.ResourceListView.Items[index2] = listitem; + break; + } + checked { ++index2; } + } + } + this.ResourceListView.SetTileVisibleColumn(listitem.Index, new int[1] + { + 1 + }); + if (this.pSetting.ConnectionSettings[index1].SecureType == SecureType.None) + WallMarkListView.ListViewOverlay(listitem, 2U); + else if (this.pSetting.ConnectionSettings[index1].SecureType != SecureType.Secure && this.pSetting.ConnectionSettings[index1].SecureType == SecureType.Warning) + WallMarkListView.ListViewOverlay(listitem, 2U); + if (newsetting != null) + { + listitem.Focused = true; + listitem.Selected = true; + } + } + checked { ++index1; } + } + this.UpdateResourceListViewGroup(); + this.UpdateResourceListViewView(); + if (this.ResourceListView.SelectedIndices.Count > 0) + this.ResourceListView.EnsureVisible(this.ResourceListView.SelectedIndices[0]); + this.ResourceListView.EndUpdate(); + this.UpdateWindow(); + } + + private void InitImageList() + { + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Collection, this.LargeImageList.ImageSize)) + this.LargeImageList.Images.Add("Collection", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Document, this.LargeImageList.ImageSize)) + this.LargeImageList.Images.Add("Resource", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Document_Split, this.LargeImageList.ImageSize)) + this.LargeImageList.Images.Add("Split Resource", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources._Error, this.LargeImageList.ImageSize)) + this.LargeImageList.Images.Add("Error", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Security_Overlay, this.LargeImageList.ImageSize)) + this.LargeImageList.Images.Add("Security Overlay", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Warning_Overlay, this.LargeImageList.ImageSize)) + this.LargeImageList.Images.Add("Warning Overlay", (Image) icon.ToBitmap()); + this.LargeImageList.Images.Add((Image) new Bitmap(this.LargeImageList.ImageSize.Width, this.LargeImageList.ImageSize.Height)); + this.LargeImageList.Images.Add((Image) new Bitmap(this.LargeImageList.ImageSize.Width, this.LargeImageList.ImageSize.Height)); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Collection, this.SmallImageList.ImageSize)) + this.SmallImageList.Images.Add("Collection", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Document, this.SmallImageList.ImageSize)) + this.SmallImageList.Images.Add("Resource", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Document_Split, this.SmallImageList.ImageSize)) + this.SmallImageList.Images.Add("Split Resource", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources._Error, this.SmallImageList.ImageSize)) + this.SmallImageList.Images.Add("Error", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Security_Overlay, this.SmallImageList.ImageSize)) + this.SmallImageList.Images.Add("Security Overlay", (Image) icon.ToBitmap()); + using (Icon icon = new Icon(CarotDAV.My.Resources.Resources.Warning_Overlay, this.SmallImageList.ImageSize)) + this.SmallImageList.Images.Add("Warning Overlay", (Image) icon.ToBitmap()); + ImageList.ImageCollection images1 = this.SmallImageList.Images; + int width1 = this.SmallImageList.ImageSize.Width; + Size imageSize = this.SmallImageList.ImageSize; + int height1 = imageSize.Height; + Bitmap bitmap1 = new Bitmap(width1, height1); + images1.Add((Image) bitmap1); + ImageList.ImageCollection images2 = this.SmallImageList.Images; + int width2 = this.SmallImageList.ImageSize.Width; + imageSize = this.SmallImageList.ImageSize; + int height2 = imageSize.Height; + Bitmap bitmap2 = new Bitmap(width2, height2); + images2.Add((Image) bitmap2); + WallMarkListView.SetOverlayIcon(this.LargeImageList, 4, 1); + WallMarkListView.SetOverlayIcon(this.LargeImageList, 5, 2); + WallMarkListView.SetOverlayIcon(this.SmallImageList, 4, 1); + WallMarkListView.SetOverlayIcon(this.SmallImageList, 5, 2); + } + + private void UpdateImageList() + { + while (this.LargeImageList.Images.Count > 8) + { + Image image = this.LargeImageList.Images[checked (this.LargeImageList.Images.Count - 1)]; + this.LargeImageList.Images.RemoveAt(checked (this.LargeImageList.Images.Count - 1)); + image.Dispose(); + } + while (this.SmallImageList.Images.Count > 8) + { + Image image = this.SmallImageList.Images[checked (this.SmallImageList.Images.Count - 1)]; + this.SmallImageList.Images.RemoveAt(checked (this.SmallImageList.Images.Count - 1)); + image.Dispose(); + } + int num1 = 0; + int num2 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index = num1; + while (index <= num2) + { + using (Icon favicon = MainForm.GetFavicon(this.pSetting.ConnectionSettings[index])) + { + using (Icon icon = new Icon(favicon, this.LargeImageList.ImageSize)) + this.LargeImageList.Images.Add(index.ToString(), (Image) icon.ToBitmap()); + using (Icon icon = new Icon(favicon, this.SmallImageList.ImageSize)) + this.SmallImageList.Images.Add(index.ToString(), (Image) icon.ToBitmap()); + } + checked { ++index; } + } + } + + private void Cache_RemoteResourceChanged(object sender, ResourceChangedEventArgs e) + { + if (this.InvokeRequired) + { + this.BeginInvoke((Delegate) this.RemoteResourceChangedHandler, RuntimeHelpers.GetObjectValue(sender), (object) e); + } + else + { + try + { + ResourceInfo ri = e.ReturnedInfo as ResourceInfo; + ResourceId id = e.ReturnedInfo as ResourceId; + if (ri == null) + { + ri = new ResourceInfo(id, UriUtil.EndWithSlash(id.Uri), -1L, DateTime.Now); + AutoSplitFs.SplitId splitId = id as AutoSplitFs.SplitId; + EncryptFs.EncryptId encryptId; + if (splitId != null) + { + encryptId = splitId.BaseId as EncryptFs.EncryptId; + ri.IsSplitted = true; + } + else + encryptId = id as EncryptFs.EncryptId; + if (encryptId != null) + ri.IsEncrypted = encryptId.Encrypted; + ri.CanCopy = (this.pFs.Ability & FsAbility.Copy) != FsAbility.None; + ri.CanDelete = (this.pFs.Ability & FsAbility.Delete) != FsAbility.None; + ri.CanMove = (this.pFs.Ability & FsAbility.Move) != FsAbility.None; + ri.CanRename = (this.pFs.Ability & FsAbility.Rename) != FsAbility.None; + ri.CanSetInfo = (this.pFs.Ability & FsAbility.Property) != FsAbility.None; + } + else + id = ri.Id; + if (!UriUtil.IsChild(this.CurrentId.Uri, id.Uri)) + return; + switch (e.Type) + { + case ResourceChangedEventArgs.ChangeType.Create: + int num1 = 0; + int num2 = checked (this.ResourceListView.Items.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + if (((ResourceInfo) this.ResourceListView.Items[index1].Tag).Id.Uri == id.Uri) + { + this.ResourceListView.Items.RemoveAt(index1); + break; + } + checked { ++index1; } + } + ListViewItem itemFromResource1 = MainForm.CreateListItemFromResource(ri); + this.ResourceListView.BeginUpdate(); + this.ResourceListView.Items.Add(itemFromResource1); + this.ResourceListView.SetTileVisibleColumn(itemFromResource1.Index, new int[2] + { + 3, + 4 + }); + if (ri.IsEncrypted) + WallMarkListView.ListViewOverlay(itemFromResource1, 1U); + this.UpdateResourceListViewGroup(); + this.ResourceListView.EndUpdate(); + break; + case ResourceChangedEventArgs.ChangeType.Delete: + int num3 = 0; + int num4 = checked (this.ResourceListView.Items.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + if (((ResourceInfo) this.ResourceListView.Items[index2].Tag).Id.Uri == id.Uri) + { + this.ResourceListView.Items.RemoveAt(index2); + break; + } + checked { ++index2; } + } + break; + case ResourceChangedEventArgs.ChangeType.PropertyUpdate: + int num5 = 0; + int num6 = checked (this.ResourceListView.Items.Count - 1); + int index3 = num5; + while (index3 <= num6) + { + if (((ResourceInfo) this.ResourceListView.Items[index3].Tag).Id.Uri == id.Uri) + { + bool selected = this.ResourceListView.Items[index3].Selected; + ListViewItem itemFromResource2 = MainForm.CreateListItemFromResource(ri); + this.ResourceListView.BeginUpdate(); + this.ResourceListView.Items[index3] = itemFromResource2; + this.ResourceListView.Items[index3].Selected = selected; + this.ResourceListView.SetTileVisibleColumn(itemFromResource2.Index, new int[2] + { + 3, + 4 + }); + if (ri.IsEncrypted) + WallMarkListView.ListViewOverlay(itemFromResource2, 1U); + this.UpdateResourceListViewGroup(); + this.ResourceListView.EndUpdate(); + break; + } + checked { ++index3; } + } + break; + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + } + + private void GoToParentResource() + { + if (!this.IsConnected) + return; + this.ShowEntriesByParent(this.CurrentId, true); + } + + private void OpenResource() + { + if (this.ResourceListView.SelectedIndices.Count != 1) + return; + int selectedIndex = this.ResourceListView.SelectedIndices[0]; + ResourceInfo tag1 = this.ResourceListView.Items[selectedIndex].Tag as ResourceInfo; + if (tag1 != null) + { + if (!tag1.IsCollection) + return; + this.ShowEntriesById(tag1.Id, true); + } + else + { + ConnectionSettingBase tag2 = this.ResourceListView.Items[selectedIndex].Tag as ConnectionSettingBase; + if (tag2 == null) + return; + this.Connect(tag2, false); + } + } + + private void OpenUploadFolderDialog() + { + if (!this.IsConnected) + return; + this.FolderBrowserDialog1.ShowNewFolderButton = false; + this.FolderBrowserDialog1.Description = "Select a folder from which files will be uploaded."; + if (this.FolderBrowserDialog1.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + this.Upload(new string[1] + { + this.FolderBrowserDialog1.SelectedPath + }, this.CurrentId, (IDataObject) null, DragDropEffects.None); + } + + private void OpenUploadDialog() + { + if (!this.IsConnected) + return; + this.OpenFileDialog1.Title = "Select Upload Files"; + this.OpenFileDialog1.Multiselect = true; + this.OpenFileDialog1.SupportMultiDottedExtensions = true; + this.OpenFileDialog1.Filter = "All Files (*.*)|*.*"; + if (this.OpenFileDialog1.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + this.Upload(this.OpenFileDialog1.FileNames, this.CurrentId, (IDataObject) null, DragDropEffects.None); + } + + private void OpenDownloadDialog() + { + if (!this.IsConnected || this.ResourceListView.SelectedIndices.Count < 1) + return; + this.FolderBrowserDialog1.ShowNewFolderButton = true; + this.FolderBrowserDialog1.Description = "Select a folder to which files will be downloaded."; + if (this.FolderBrowserDialog1.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + ResourceId[] remoteids = new ResourceId[checked (this.ResourceListView.SelectedItems.Count - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index = num1; + while (index <= num2) + { + remoteids[index] = ((ResourceInfo) this.ResourceListView.SelectedItems[index].Tag).Id; + checked { ++index; } + } + this.Download(remoteids, this.FolderBrowserDialog1.SelectedPath); + } + + private void OpenPropertyDialog() + { + if (this.IsConnected) + { + if (this.ResourceListView.SelectedItems.Count != 1) + return; + this.ShowPropertyForm((ResourceInfo) this.ResourceListView.SelectedItems[0].Tag); + } + else + { + if (this.ResourceListView.SelectedIndices.Count != 1) + return; + this.ShowConnectionSettingForm((ConnectionSettingBase) this.ResourceListView.SelectedItems[0].Tag); + } + } + + private void ShowConnectionSettingForm(ConnectionSettingBase csb) + { + using (Form settingForm = csb.GetSettingForm()) + { + settingForm.Tag = (object) csb; +label_2: + if (settingForm.ShowDialog() != DialogResult.OK) + return; + ConnectionSettingBase tag = (ConnectionSettingBase) settingForm.Tag; + int index1 = -1; + int num1 = 0; + int num2 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index2 = num1; + while (index2 <= num2) + { + if (this.pSetting.ConnectionSettings[index2] == csb) + index1 = index2; + else if (Operators.CompareString(this.pSetting.ConnectionSettings[index2].Name, tag.Name, false) == 0) + { + int num3 = (int) MessageBox.Show("Setting name is conflicted. Use other name."); + goto label_2; + } + checked { ++index2; } + } + if (index1 < 0) + { + csb = (ConnectionSettingBase) null; + this.pSetting.ConnectionSettings.Add(tag); + } + else + this.pSetting.ConnectionSettings[index1] = tag; + this.SaveCurrentSetting(); + this.ShowConnectionSettings(tag, csb); + } + } + + private void DeleteResources() + { + if (this.ResourceListView.SelectedIndices.Count < 1) + return; + if (this.IsConnected) + { + if (MessageBox.Show("Selected resources will be deleted.", "Delete Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) != DialogResult.OK) + return; + ResourceId[] resourceIdArray = new ResourceId[checked (this.ResourceListView.SelectedItems.Count - 1 + 1)]; + ListViewItem[] listViewItemArray = new ListViewItem[checked (this.ResourceListView.SelectedItems.Count - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + resourceIdArray[index1] = ((ResourceInfo) this.ResourceListView.SelectedItems[index1].Tag).Id; + checked { ++index1; } + } + this.ResourceListView.SelectedItems.CopyTo((Array) listViewItemArray, 0); + ConflictPromptManager cm = new ConflictPromptManager(); + ErrorPromptManager em = new ErrorPromptManager(); + int num3 = 0; + int num4 = checked (resourceIdArray.Length - 1); + int index2 = num3; + while (index2 <= num4 && this.Fs_Delete(resourceIdArray[index2], cm, em)) + checked { ++index2; } + } + else + { + if (MessageBox.Show("Selected connection setting will be deleted", "Delete Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) != DialogResult.OK) + return; + while (this.ResourceListView.SelectedIndices.Count > 0) + { + ListViewItem selectedItem = this.ResourceListView.SelectedItems[0]; + ConnectionSettingBase tag = selectedItem.Tag as ConnectionSettingBase; + if (tag != null) + { + try + { + string faviconName = tag.FaviconName; + if (!string.IsNullOrEmpty(faviconName)) + System.IO.File.Delete(Path.Combine(XmlSettingManager.FaviconFolder, faviconName)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + int num1 = 0; + int num2 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index = num1; + while (index <= num2) + { + if (this.pSetting.ConnectionSettings[index] == tag) + { + this.pSetting.ConnectionSettings.RemoveAt(index); + break; + } + checked { ++index; } + } + } + this.ResourceListView.Items.Remove(selectedItem); + } + this.SaveCurrentSetting(); + } + } + + private void CreateCollection() + { + if (!this.IsConnected) + return; + string name; + using (NewFolderForm newFolderForm = new NewFolderForm()) + { + if (newFolderForm.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + name = newFolderForm.NewFolderName; + } + if (this.CurrentConnectionSetting.UploadFilenameNormalization != UCSNormalization.None) + name = name.Normalize((NormalizationForm) this.CurrentConnectionSetting.UploadFilenameNormalization); + this.Fs_CreateCollection(this.CurrentId, name); + } + + private void RefreshResourceListView() + { + if (this.IsConnected) + this.ShowEntriesById(this.CurrentId, false); + else + this.ShowConnectionSettings((ConnectionSettingBase) null, (ConnectionSettingBase) null); + } + + private void GoToHomeUri() + { + if (!this.IsConnected) + return; + this.ShowEntriesByUri(!this.IsTemporaryConnection ? this.CurrentConnectionSetting.TargetUri : new Uri(UriUtil.GetAuthority(this.CurrentId.Uri)), true); + } + + private void GoToTextBoxUri() + { + Uri result = (Uri) null; + if (!Uri.TryCreate(this.UriToolStripTextBox.Text, UriKind.Absolute, out result)) + { + int num = (int) MessageBox.Show("Enter valid URI.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand); + } + else if (!this.IsConnected || Operators.CompareString(UriUtil.GetAuthority(result), UriUtil.GetAuthority(this.CurrentId.Uri), false) != 0) + this.TemporaryConnect(result); + else + this.ShowEntriesByUri(result, false); + } + + private void StartRename() + { + if (this.ResourceListView.SelectedItems.Count != 1) + return; + this.ResourceListView.SelectedItems[0].BeginEdit(); + } + + private bool RenameResource(ListViewItem li, string newname) + { + if (this.IsConnected) + { + ResourceInfo tag = (ResourceInfo) li.Tag; + if (this.CurrentConnectionSetting.UploadFilenameNormalization != UCSNormalization.None) + newname = newname.Normalize((NormalizationForm) this.CurrentConnectionSetting.UploadFilenameNormalization); + this.Fs_Rename(tag.Id, newname); + return false; + } + ConnectionSettingBase tag1 = (ConnectionSettingBase) li.Tag; + int num1 = 0; + int num2 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index = num1; + while (index <= num2) + { + if (this.pSetting.ConnectionSettings[index] != tag1 && Operators.CompareString(this.pSetting.ConnectionSettings[index].Name, newname, false) == 0) + { + int num3 = (int) MessageBox.Show("Cannot make Same name setting"); + return false; + } + checked { ++index; } + } + tag1.Name = newname; + this.SaveCurrentSetting(); + return true; + } + + private void Upload(string[] localfiles, ResourceId remotebaseid, IDataObject dobj, DragDropEffects finisheffect) + { + if (!this.IsConnected) + return; + this.GetUpDownForm(remotebaseid.Uri, UpDownForm.TransferDirectionType.Upload).Upload(localfiles, remotebaseid, dobj, finisheffect); + } + + private void UploadDescriptors(VirtualFileInfo[] vfinfos, ResourceId remotebaseid, IDataObject dobj, DragDropEffects finisheffect) + { + this.GetUpDownForm(remotebaseid.Uri, UpDownForm.TransferDirectionType.Upload).UploadDescriptors(vfinfos, remotebaseid, dobj, finisheffect); + } + + private void Download(ResourceId[] remoteids, string localdir) + { + if (!this.IsConnected) + return; + this.GetUpDownForm(remoteids[0].Uri, UpDownForm.TransferDirectionType.Download).Download(remoteids, localdir); + } + + private void MainForm_Activated(object sender, EventArgs e) + { + this.UpdateClipBoard(); + } + + private bool SaveCurrentSetting() + { + bool flag; + while (true) + { + try + { + XmlSettingManager.SaveSetting(this.pSetting); + break; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + switch (MessageBox.Show("Error occurred during saving settings", "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Hand)) + { + case DialogResult.Retry: + ProjectData.ClearProjectError(); + continue; + case DialogResult.Abort: + flag = false; + ProjectData.ClearProjectError(); + goto label_6; + default: + ProjectData.ClearProjectError(); + goto label_5; + } + } + } +label_5: + return true; +label_6: + return flag; + } + + internal ResourceInfo Fs_GetInfo(ResourceId id, bool enablecache) + { + int retryminutes = 1; + ResourceInfo info; + ResourceInfo resourceInfo; + while (true) + { + try + { + this.EnterWaitState(); + info = this.pCache.GetInfo(this.pFs, id, enablecache); + this.LeaveWaitState(); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during retrieving properties.", id.ToString(), ex2, ErrorPromptType.RetryCancel, retryminutes); + if (promptFormResult.Action == ErrorAction.Retry) + ProjectData.ClearProjectError(); + else if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + } + else + { + resourceInfo = (ResourceInfo) null; + ProjectData.ClearProjectError(); + goto label_12; + } + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return info; +label_12: + return resourceInfo; + } + + internal ResourceInfo[] Fs_GetInfoAndInnerEntries(Uri uri, ResourceId id, ResourceId parentid, bool enablecache) + { + Uri target = (Uri) null; + int retryminutes = 1; +label_1: + ResourceInfo[] resourceInfoArray1; + ResourceInfo[] resourceInfoArray2; + while (true) + { + try + { + this.EnterWaitState(); + if ((object) uri != null) + { + target = uri; + resourceInfoArray1 = this.pCache.GetInfoAndEntries(this.pFs, uri, enablecache); + } + else if ((object) id != null) + { + target = id.Uri; + resourceInfoArray1 = this.pCache.GetInfoAndEntries(this.pFs, id, enablecache); + } + else + { + target = parentid.Uri; + resourceInfoArray1 = this.pCache.GetParentInfoAndEntries(this.pFs, parentid, enablecache); + } + this.LeaveWaitState(); + break; + } + catch (RemoteCertificateErrorException ex) + { + ProjectData.SetProjectError((Exception) ex); + RemoteCertificateErrorException certificateErrorException = ex; + this.LeaveWaitState(); + this.WriteLineLog(certificateErrorException.ToString()); + LogWriter.WriteException((Exception) certificateErrorException); + this.pFs.ResetConnection(); + switch (ServerCertErrorPromptForm.ShowDialog((IWin32Window) this, (string) null, certificateErrorException.Errors, target.ToString())) + { + case DialogResult.Retry: + ProjectData.ClearProjectError(); + continue; + case DialogResult.Ignore: + this.pFs.ConnectionSetting.CertErrorIgnores = certificateErrorException.Errors; + ProjectData.ClearProjectError(); + continue; + default: + resourceInfoArray2 = (ResourceInfo[]) null; + ProjectData.ClearProjectError(); + goto label_32; + } + } + catch (UnauthorizedException ex1) when ( + { + // ISSUE: unable to correctly present filter + ProjectData.SetProjectError((Exception) ex1); + if (ex1.CanRetry) + { + SuccessfulFiltering; + } + else + throw; + } + ) + { + this.LeaveWaitState(); + this.WriteLineLog(ex1.ToString()); + LogWriter.WriteException((Exception) ex1); + this.pFs.ResetConnection(); + while (true) + { + try + { + if (this.CurrentConnectionSetting.DoAuthorization(target, !this.IsTemporaryConnection)) + { + ProjectData.ClearProjectError(); + goto label_1; + } + else + break; + } + catch (Exception ex2) + { + ProjectData.SetProjectError(ex2); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during authorizing.", target.ToString(), (Exception) ex1, ErrorPromptType.RetryCancel, retryminutes); + if (promptFormResult.Action == ErrorAction.Retry) + ProjectData.ClearProjectError(); + else if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + goto label_1; + } + else + { + resourceInfoArray2 = (ResourceInfo[]) null; + ProjectData.ClearProjectError(); + goto label_32; + } + } + } + resourceInfoArray2 = (ResourceInfo[]) null; + ProjectData.ClearProjectError(); + goto label_32; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during retrieving properties.", target.ToString(), ex2, ErrorPromptType.RetryCancel, retryminutes); + if (promptFormResult.Action == ErrorAction.Retry) + ProjectData.ClearProjectError(); + else if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + } + else + { + resourceInfoArray2 = (ResourceInfo[]) null; + ProjectData.ClearProjectError(); + goto label_32; + } + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return resourceInfoArray1; +label_32: + return resourceInfoArray2; + } + + internal bool Fs_CreateCollection(ResourceId parentid, string name) + { + int retryminutes = 1; + bool flag; + while (true) + { + try + { + this.pCache.CreateCollection(this.pFs, parentid, name); + this.LeaveWaitState(); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during creating collection.", UriUtil.CombineName(parentid.Uri, name).ToString(), ex2, ErrorPromptType.RetryCancel, retryminutes); + if (promptFormResult.Action == ErrorAction.Retry) + ProjectData.ClearProjectError(); + else if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + } + else + { + flag = false; + ProjectData.ClearProjectError(); + goto label_12; + } + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return true; +label_12: + return flag; + } + + internal bool Fs_Delete(ResourceId id, ConflictPromptManager cm, ErrorPromptManager em) + { + int retryminutes = 1; + bool flag; + while (true) + { + try + { + this.EnterWaitState(); + this.pCache.Delete(this.pFs, id); + this.LeaveWaitState(); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + if (!em.IgnoreAll()) + { + ErrorPromptFormResult r = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during deleting resource.", id.ToString(), ex2, ErrorPromptType.IgnoreRetryCancel, retryminutes); + this.Cursor = this.Cursor; + em.RegisterAction(r); + if (r.Action == ErrorAction.Retry) + { + ProjectData.ClearProjectError(); + continue; + } + if (r.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + } + if (r.Action == ErrorAction.Cancel) + { + flag = false; + ProjectData.ClearProjectError(); + goto label_15; + } + } + ProjectData.ClearProjectError(); + break; + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return true; +label_15: + return flag; + } + + internal bool Fs_Rename(ResourceId id, string newname) + { + int retryminutes = 1; + bool flag; + while (true) + { + try + { + this.EnterWaitState(); + this.pCache.Move(this.pFs, id, (ResourceId) null, newname, false); + this.LeaveWaitState(); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during renaming resource.", id.ToString(), ex2, ErrorPromptType.RetryCancel, retryminutes); + this.Cursor = this.Cursor; + if (promptFormResult.Action == ErrorAction.Retry) + ProjectData.ClearProjectError(); + else if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + } + else + { + if (promptFormResult.Action != ErrorAction.Cancel) + throw new Exception(); + flag = false; + ProjectData.ClearProjectError(); + goto label_14; + } + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return true; +label_14: + return flag; + } + + internal bool Fs_Move(ResourceId id, ResourceId destinationid, string newname, ConflictPromptManager cm, ErrorPromptManager em) + { + bool overwrite = false; + int num = 0; + int retryminutes = 1; + bool flag; + while (true) + { + try + { + try + { + this.EnterWaitState(); + this.pCache.Move(this.pFs, id, destinationid, newname, overwrite); + this.LeaveWaitState(); + break; + } + catch (DestinationAlreadyExistsException ex1) when ( + { + // ISSUE: unable to correctly present filter + ProjectData.SetProjectError((Exception) ex1); + if (!overwrite) + { + SuccessfulFiltering; + } + else + throw; + } + ) + { + this.LeaveWaitState(); + this.WriteLineLog(ex1.ToString()); + LogWriter.WriteException((Exception) ex1); + if (newname != null) + { + checked { ++num; } + if (num < 20) + { + newname = UriUtil.CreateNextCopyName(newname); + ProjectData.ClearProjectError(); + continue; + } + } + try + { + ResourceInfo ri = (ResourceInfo) null; + ConflictAction action; + if (cm.IsRegistered(ConflictType.Move)) + { + action = cm.GetAction(ConflictType.Move); + if (action == ConflictAction.DeleteTarget) + ri = (object) destinationid != null ? (newname != null ? this.pFs.GetInfo(destinationid, newname) : this.pFs.GetInfo(destinationid, UriUtil.GetLastName(id.Uri))) : this.pFs.GetInfo(UriUtil.CombineName(UriUtil.GetParent(id.Uri), newname)); + } + else + { + ResourceInfo info = this.pFs.GetInfo(id); + ri = (object) destinationid != null ? (newname != null ? this.pFs.GetInfo(destinationid, newname) : this.pFs.GetInfo(destinationid, UriUtil.GetLastName(id.Uri))) : this.pFs.GetInfo(UriUtil.CombineName(UriUtil.GetParent(id.Uri), newname)); + ConflictPromptFormResult r = ConflictPromptForm.ShowDialog((IWin32Window) this, new SimpleResourceInfo(info), new SimpleResourceInfo(ri), ConflictType.Move, false, this.pFs.Ability, retryminutes); + this.Cursor = this.Cursor; + cm.RegisterAction(r); + action = r.Action; + } + if (action == ConflictAction.Retry) + { + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.Overwrite) + { + overwrite = true; + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.CancelAll) + { + flag = false; + ProjectData.ClearProjectError(); + goto label_38; + } + else + { + if (action == ConflictAction.ChangeName) + { + newname = UriUtil.CreateNextCopyName(UriUtil.GetLastName(id.Uri)); + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.DeleteTarget) + { + this.pFs.Delete(ri.Id); + ProjectData.ClearProjectError(); + continue; + } + } + } + catch (Exception ex2) + { + ProjectData.SetProjectError(ex2); + ProjectData.ClearProjectError(); + } + throw; + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + if (!em.IgnoreAll()) + { + ErrorPromptFormResult r = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during moving resource.", id.ToString(), ex2, ErrorPromptType.RetryCancel, retryminutes); + this.Cursor = this.Cursor; + em.RegisterAction(r); + if (r.Action == ErrorAction.Retry) + { + ProjectData.ClearProjectError(); + continue; + } + if (r.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + } + if (r.Action == ErrorAction.Cancel) + { + flag = false; + ProjectData.ClearProjectError(); + goto label_38; + } + } + ProjectData.ClearProjectError(); + break; + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return true; +label_38: + return flag; + } + + internal bool Fs_Copy(ResourceId id, ResourceId destinationid, string newname, ConflictPromptManager cm, ErrorPromptManager em) + { + bool overwrite = false; + int num = 0; + int retryminutes = 1; + bool flag; + while (true) + { + try + { + try + { + this.EnterWaitState(); + this.pCache.Copy(this.pFs, id, destinationid, newname, overwrite); + this.LeaveWaitState(); + break; + } + catch (DestinationAlreadyExistsException ex1) when ( + { + // ISSUE: unable to correctly present filter + ProjectData.SetProjectError((Exception) ex1); + if (!overwrite) + { + SuccessfulFiltering; + } + else + throw; + } + ) + { + this.LeaveWaitState(); + this.WriteLineLog(ex1.ToString()); + LogWriter.WriteException((Exception) ex1); + if (newname != null) + { + checked { ++num; } + if (num < 20) + { + newname = UriUtil.CreateNextCopyName(newname); + ProjectData.ClearProjectError(); + continue; + } + } + try + { + ResourceInfo ri = (ResourceInfo) null; + ConflictAction action; + if (cm.IsRegistered(ConflictType.Copy)) + { + action = cm.GetAction(ConflictType.Copy); + if (action == ConflictAction.DeleteTarget) + ri = (object) destinationid != null ? (newname != null ? this.pFs.GetInfo(destinationid, newname) : this.pFs.GetInfo(destinationid, UriUtil.GetLastName(id.Uri))) : this.pFs.GetInfo(UriUtil.CombineName(UriUtil.GetParent(id.Uri), newname)); + } + else + { + ResourceInfo info = this.pFs.GetInfo(id); + ri = (object) destinationid != null ? (newname != null ? this.pFs.GetInfo(destinationid, newname) : this.pFs.GetInfo(destinationid, UriUtil.GetLastName(id.Uri))) : this.pFs.GetInfo(UriUtil.CombineName(UriUtil.GetParent(id.Uri), newname)); + ConflictPromptFormResult r = ConflictPromptForm.ShowDialog((IWin32Window) this, new SimpleResourceInfo(info), new SimpleResourceInfo(ri), ConflictType.Copy, false, this.pFs.Ability, retryminutes); + this.Cursor = this.Cursor; + cm.RegisterAction(r); + action = r.Action; + } + if (action == ConflictAction.Retry) + { + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.Overwrite) + { + overwrite = true; + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.CancelAll) + { + flag = false; + ProjectData.ClearProjectError(); + goto label_38; + } + else + { + if (action == ConflictAction.ChangeName) + { + newname = UriUtil.CreateNextCopyName(UriUtil.GetLastName(id.Uri)); + ProjectData.ClearProjectError(); + continue; + } + if (action == ConflictAction.DeleteTarget) + { + this.pFs.Delete(ri.Id); + ProjectData.ClearProjectError(); + continue; + } + } + } + catch (Exception ex2) + { + ProjectData.SetProjectError(ex2); + ProjectData.ClearProjectError(); + } + throw; + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + if (!em.IgnoreAll()) + { + ErrorPromptFormResult r = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during moving resource.", id.ToString(), ex2, ErrorPromptType.RetryCancel, retryminutes); + this.Cursor = this.Cursor; + em.RegisterAction(r); + if (r.Action == ErrorAction.Retry) + { + ProjectData.ClearProjectError(); + continue; + } + if (r.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + } + if (r.Action == ErrorAction.Cancel) + { + flag = false; + ProjectData.ClearProjectError(); + goto label_38; + } + } + ProjectData.ClearProjectError(); + break; + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return true; +label_38: + return flag; + } + + internal bool Fs_SetResourceInfo(ResourceInfo newinfo, ResourceInfo originalinfo) + { + int retryminutes = 1; + bool flag; + while (true) + { + try + { + this.EnterWaitState(); + this.pCache.SetResourceInfo(this.pFs, newinfo, originalinfo); + this.LeaveWaitState(); + break; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + ErrorPromptFormResult promptFormResult = ErrorPromptForm.ShowDialog((IWin32Window) this, "Error occurred during updating properties.", newinfo.Id.Uri.ToString(), ex2, ErrorPromptType.RetryCancel, retryminutes); + if (promptFormResult.Action == ErrorAction.Retry) + ProjectData.ClearProjectError(); + else if (promptFormResult.Action == ErrorAction.AutoRetry) + { + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + } + else + { + flag = false; + ProjectData.ClearProjectError(); + goto label_12; + } + } + } + if (this.CurrentConnectionSetting.NeedPersist) + { + if (!this.IsTemporaryConnection) + { + this.CurrentConnectionSetting.PersistUserPass(); + this.SaveCurrentSetting(); + } + this.CurrentConnectionSetting.NeedPersist = false; + } + return true; +label_12: + return flag; + } + + internal void Fs_Reset() + { + if (this.pFs == null) + return; + this.pFs.ResetConnection(); + this.CurrentConnectionSetting.Reset(); + this.pCache.Clear(); + } + + private void ConnectToolStripItem_Click(object sender, EventArgs e) + { + this.Disconnect(); + } + + private void ExitToolStripMenuItem_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void GoToParentToolStripItem_Click(object sender, EventArgs e) + { + this.GoToParentResource(); + } + + private void RefreshToolStripItem_Click(object sender, EventArgs e) + { + this.RefreshResourceListView(); + } + + private void NewFolderToolStripItem_Click(object sender, EventArgs e) + { + this.CreateCollection(); + } + + private void UploadFolderToolStripItem_Click(object sender, EventArgs e) + { + this.OpenUploadFolderDialog(); + } + + private void UploadToolStripItem_Click(object sender, EventArgs e) + { + this.OpenUploadDialog(); + } + + private void DownloadToolStripItem_Click(object sender, EventArgs e) + { + this.OpenDownloadDialog(); + } + + private void DeleteToolStripItem_Click(object sender, EventArgs e) + { + this.DeleteResources(); + } + + private void RenameToolStripMenuItem_Click(object sender, EventArgs e) + { + this.StartRename(); + } + + private void SelectAllToolStripMenuItem_Click(object sender, EventArgs e) + { + int count = this.ResourceListView.Items.Count; + int num1 = 0; + int num2 = checked (count - 1); + int index = num1; + while (index <= num2) + { + this.ResourceListView.Items[index].Selected = true; + checked { ++index; } + } + } + + private void AddNewSettingToolStripMenuItem_Click(object sender, EventArgs e) + { + System.Type tag = ((ToolStripItem) sender).Tag as System.Type; + if (tag == null || !tag.IsSubclassOf(typeof (ConnectionSettingBase)) || this.IsConnected) + return; + this.ShowConnectionSettingForm((ConnectionSettingBase) tag.InvokeMember((string) null, BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance, (Binder) null, (object) null, (object[]) null)); + } + + private void DuplicateToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.ResourceListView.SelectedIndices.Count != 1 || this.IsConnected) + return; + ConnectionSettingBase tag = (ConnectionSettingBase) this.ResourceListView.SelectedItems[0].Tag; + int num1 = 1; + ConnectionSettingBase csb = XmlSettingManager.CopyConnectionSetting(tag); +label_2: + csb.Name = num1 != 1 ? tag.Name + string.Format(" (copy {0})", (object) num1.ToString("#")) : tag.Name + " (copy)"; + int num2 = 0; + int num3 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index = num2; + while (index <= num3) + { + if (Operators.CompareString(this.pSetting.ConnectionSettings[index].Name, csb.Name, false) == 0) + { + checked { ++num1; } + goto label_2; + } + else + checked { ++index; } + } + csb.FaviconName = (string) null; + this.ShowConnectionSettingForm(csb); + } + + private void PropertyToolStripItem_Click(object sender, EventArgs e) + { + this.OpenPropertyDialog(); + } + + private void FaviconToolStripButton_Click(object sender, EventArgs e) + { + this.GoToHomeUri(); + } + + private void ToolStripGoButton_Click(object sender, EventArgs e) + { + this.GoToTextBoxUri(); + } + + private void ImportToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsConnected) + return; + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Title = "Import Connection Setting"; + openFileDialog.FileName = ""; + openFileDialog.DefaultExt = "xml"; + openFileDialog.Filter = "XML files (*.xml)|*.xml|Text files (*.txt)|*.txt|All files (*.*)|*.*"; + if (openFileDialog.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + ConnectionSettingBase csb; + try + { + csb = XmlSettingManager.ImportSetting(openFileDialog.FileName); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Error occurred during importing settings"); + ProjectData.ClearProjectError(); + return; + } + int num1 = 0; + string name = csb.Name; +label_6: + if (num1 > 0) + csb.Name = name + string.Format(" (import {0})", (object) num1.ToString("#")); + int num2 = 0; + int num3 = checked (this.pSetting.ConnectionSettings.Count - 1); + int index = num2; + while (index <= num3) + { + if (Operators.CompareString(this.pSetting.ConnectionSettings[index].Name, csb.Name, false) == 0) + { + checked { ++num1; } + goto label_6; + } + else + checked { ++index; } + } + this.ShowConnectionSettingForm(csb); + } + + private void ExportToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsConnected || this.ResourceListView.SelectedItems.Count != 1) + return; + ConnectionSettingBase tag = (ConnectionSettingBase) this.ResourceListView.SelectedItems[0].Tag; + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Title = "Export Connection Setting"; + saveFileDialog.FileName = tag.Name + ".xml"; + saveFileDialog.DefaultExt = "xml"; + saveFileDialog.Filter = "XML files (*.xml)|*.xml|Text files (*.txt)|*.txt|All files (*.*)|*.*"; + if (saveFileDialog.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + try + { + XmlSettingManager.ExportSetting(tag, saveFileDialog.FileName); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Error occurred during exporting settings"); + ProjectData.ClearProjectError(); + } + } + + private void CopyURIContextMenuItem_Click(object sender, EventArgs e) + { + if (!this.IsConnected || this.ResourceListView.SelectedIndices.Count < 1) + return; + string[] strArray = new string[checked (this.ResourceListView.SelectedItems.Count - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index = num1; + while (index <= num2) + { + strArray[index] = ((ResourceInfo) this.ResourceListView.SelectedItems[index].Tag).Id.Uri.AbsoluteUri; + checked { ++index; } + } + Clipboard.SetText(string.Join("\r\n", strArray)); + } + + private void CopyResourceNameContextMenuItem_Click(object sender, EventArgs e) + { + if (!this.IsConnected || this.ResourceListView.SelectedIndices.Count < 1 || (!this.IsConnected || this.ResourceListView.SelectedIndices.Count < 1)) + return; + string[] strArray = new string[checked (this.ResourceListView.SelectedItems.Count - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index = num1; + while (index <= num2) + { + strArray[index] = UriUtil.GetLastName(((ResourceInfo) this.ResourceListView.SelectedItems[index].Tag).Id.Uri); + checked { ++index; } + } + Clipboard.SetText(string.Join("\r\n", strArray)); + } + + private void RefreshToolStripMenuItem_Click(object sender, EventArgs e) + { + this.RefreshResourceListView(); + } + + private void BackToolStripItem_Click(object sender, EventArgs e) + { + if (this.pCurrentHistoryNode == null || this.pCurrentHistoryNode.Previous == null) + return; + this.pCurrentHistoryNode = this.pCurrentHistoryNode.Previous; + this.ShowEntriesById(this.pCurrentHistoryNode.Value, true); + } + + private void ForwardToolStripItem_Click(object sender, EventArgs e) + { + if (this.pCurrentHistoryNode == null || this.pCurrentHistoryNode.Next == null) + return; + this.pCurrentHistoryNode = this.pCurrentHistoryNode.Next; + this.ShowEntriesById(this.pCurrentHistoryNode.Value, true); + } + + private void GoToParentToolStripMenuItem_Click(object sender, EventArgs e) + { + this.GoToParentResource(); + } + + private void GoToHomeToolStripMenuItem_Click(object sender, EventArgs e) + { + this.GoToHomeUri(); + } + + private void LargeIconToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.View = View.LargeIcon; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewView(); + this.ResourceListView.EndUpdate(); + } + + private void SmallIconToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.View = View.SmallIcon; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewView(); + this.ResourceListView.EndUpdate(); + } + + private void ListToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.View = View.List; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewView(); + this.ResourceListView.EndUpdate(); + } + + private void TileToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.View = View.Tile; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewView(); + this.ResourceListView.EndUpdate(); + } + + private void DetailToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.View = View.Details; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewView(); + this.ResourceListView.EndUpdate(); + } + + private void AutoColumnWidthToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.AutoColumnWidth = !((ToolStripMenuItem) sender).Checked; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewView(); + this.ResourceListView.EndUpdate(); + } + + private void SortNameToolStripMenuItem_Click(object sender, EventArgs e) + { + this.ResourceListViewToggleSort(0); + } + + private void SortSizeToolStripMenuItem_Click(object sender, EventArgs e) + { + this.ResourceListViewToggleSort(3); + } + + private void SortLastModifiedDateToolStripMenuItem_Click(object sender, EventArgs e) + { + this.ResourceListViewToggleSort(4); + } + + private void SortCreationDateToolStripMenuItem_Click(object sender, EventArgs e) + { + this.ResourceListViewToggleSort(5); + } + + private void SortStatusToolStripMenuItem_Click(object sender, EventArgs e) + { + this.ResourceListViewToggleSort(2); + } + + private void SortURIToolStripMenuItem_Click(object sender, EventArgs e) + { + this.ResourceListViewToggleSort(1); + } + + private void GroupNoneToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.Group = WebDAVClientSetting.GroupType.None; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewGroup(); + this.ResourceListView.EndUpdate(); + } + + private void GroupNameToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.Group = WebDAVClientSetting.GroupType.Name; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewGroup(); + this.ResourceListView.EndUpdate(); + } + + private void GroupSizeToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.Group = WebDAVClientSetting.GroupType.Size; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewGroup(); + this.ResourceListView.EndUpdate(); + } + + private void GroupTypeToolStripMenuItem_Click(object sender, EventArgs e) + { + this.pSetting.Group = WebDAVClientSetting.GroupType.Type; + this.ResourceListView.BeginUpdate(); + this.UpdateResourceListViewGroup(); + this.ResourceListView.EndUpdate(); + } + + private void LogToolStripMenuItem_Click(object sender, EventArgs e) + { + this.LogViewChange(!this.pSetting.ShowLogWindow); + } + + private void StatusBarToolStripMenuItem_Click(object sender, EventArgs e) + { + this.StatusBarChange(!this.pSetting.ShowStatusBar); + } + + private void LogToFileToolStripMenuItem_Click(object sender, EventArgs e) + { + this.FileLoggingChange(!LogWriter.Enabled); + } + + private void AboutToolStripMenuItem_Click(object sender, EventArgs e) + { + int num = (int) new AboutForm().ShowDialog((IWin32Window) this); + } + + private void NewVersionToolStripMenuItem_Click(object sender, EventArgs e) + { + Process.Start("http://rei.to/carotdav.html#download"); + } + + private void UriToolStripTextBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode != Keys.Return) + return; + e.Handled = true; + e.SuppressKeyPress = true; + this.GoToTextBoxUri(); + } + + private void ResourceListView_BeforeLabelEdit(object sender, LabelEditEventArgs e) + { + this.DeleteToolStripMenuItem.ShortcutKeys = Keys.None; + this.CopyToolStripMenuItem.ShortcutKeys = Keys.None; + this.CutToolStripMenuItem.ShortcutKeys = Keys.None; + } + + private void ResourceListView_AfterLabelEdit(object sender, LabelEditEventArgs e) + { + this.DeleteToolStripMenuItem.ShortcutKeys = Keys.Delete; + this.CopyToolStripMenuItem.ShortcutKeys = Keys.C | Keys.Control; + this.CutToolStripMenuItem.ShortcutKeys = Keys.X | Keys.Control; + if (e.Label == null) + e.CancelEdit = true; + else if (e.Label.Length == 0) + e.CancelEdit = true; + else + e.CancelEdit = !this.RenameResource(this.ResourceListView.Items[e.Item], e.Label); + } + + private void ResourceListView_ColumnClick(object sender, ColumnClickEventArgs e) + { + this.ResourceListViewToggleSort(e.Column); + } + + private void ResourceListViewToggleSort(int columnindex) + { + MainForm.ResourceListViewItemComparer listViewItemSorter = (MainForm.ResourceListViewItemComparer) this.ResourceListView.ListViewItemSorter; + listViewItemSorter.ToggleColumn(columnindex); + if (this.ResourceListView.ShowGroups) + { + if (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major >= 6) + this.ResourceListView.Sort(); + else + this.RefreshResourceListView_All(); + } + else + this.ResourceListView.Sort(); + this.pSetting.SortString = listViewItemSorter.ToString(); + } + + private void ResourceListView_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyData == Keys.Return) + { + e.Handled = true; + this.OpenResource(); + } + else if (e.KeyData == Keys.Back) + { + e.Handled = true; + this.BackToolStripItem_Click((object) null, EventArgs.Empty); + } + else + { + if (e.KeyData != Keys.Delete) + return; + e.Handled = true; + this.DeleteResources(); + } + } + + private void ResourceListView_MouseUp(object sender, MouseEventArgs e) + { + switch (e.Button) + { + case MouseButtons.XButton1: + this.BackToolStripItem_Click((object) null, EventArgs.Empty); + break; + case MouseButtons.XButton2: + this.ForwardToolStripItem_Click((object) null, EventArgs.Empty); + break; + } + } + + private void ResourceListView_MouseDoubleClick(object sender, MouseEventArgs e) + { + this.OpenResource(); + } + + private void ResourceListView_SelectedIndexChanged(object sender, EventArgs e) + { + this.needUpdateWindow = true; + } + + private void ResourceListView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) + { + if (this.ResourceListView.View != View.Details) + return; + this.pSetting.ColumnWidth[e.ColumnIndex] = this.ResourceListView.Columns[e.ColumnIndex].Width; + } + + private void ResourceListView_ColumnReordered(object sender, ColumnReorderedEventArgs e) + { + if (this.ResourceListView.View != View.Details) + return; + int num1 = 0; + int num2 = checked (this.ResourceListView.Columns.Count - 1); + int index = num1; + while (index <= num2) + { + this.pSetting.ColumnIndexs[index] = this.ResourceListView.Columns[index].DisplayIndex; + if (this.pSetting.ColumnIndexs[index] == e.NewDisplayIndex) + this.pSetting.ColumnIndexs[index] = e.OldDisplayIndex; + else if (this.pSetting.ColumnIndexs[index] == e.OldDisplayIndex) + this.pSetting.ColumnIndexs[index] = e.NewDisplayIndex; + checked { ++index; } + } + } + + private MainForm.ExtractedData ExtractDataObject(IDataObject dobj, DragDropEffects allowedeffect) + { + MainForm.ExtractedData extractedData = new MainForm.ExtractedData(); + DragDropEffects dragDropEffects = DragDropEffects.None; + if (dobj.GetDataPresent(DataFormats.FileDrop)) + dragDropEffects = dragDropEffects | DragDropEffects.Copy | DragDropEffects.Move; + if (dobj.GetDataPresent("FileGroupDescriptorW")) + dragDropEffects = dragDropEffects | DragDropEffects.Copy | DragDropEffects.Move; + extractedData.PreferEffects = DataObjectHelper.GetPreferredDragEffect(dobj); + if (extractedData.PreferEffects == DragDropEffects.None) + extractedData.PreferEffects = DragDropEffects.Copy; + extractedData.AllowedEffects = dragDropEffects & allowedeffect; + return extractedData; + } + + private DragDropEffects CalcDataTransferEffect(MainForm.ExtractedData extd, int keystate, bool self) + { + DragDropEffects dragDropEffects; + if ((keystate & 44) == 32 | (keystate & 44) == 12) + dragDropEffects = DragDropEffects.Link; + else if ((keystate & 44) == 4) + dragDropEffects = DragDropEffects.Move; + else if ((keystate & 44) == 8) + dragDropEffects = DragDropEffects.Copy; + else if (self) + { + dragDropEffects = DragDropEffects.Move; + } + else + { + DragDropEffects preferEffects = extd.PreferEffects; + dragDropEffects = preferEffects & (DragDropEffects) checked (-unchecked ((int) preferEffects)); + } + if ((extd.AllowedEffects & dragDropEffects) != DragDropEffects.None) + return dragDropEffects; + if ((extd.AllowedEffects & DragDropEffects.Copy) != DragDropEffects.None) + return DragDropEffects.Copy; + if ((extd.AllowedEffects & DragDropEffects.Move) != DragDropEffects.None) + return DragDropEffects.Move; + return (extd.AllowedEffects & DragDropEffects.Link) != DragDropEffects.None ? DragDropEffects.Link : DragDropEffects.None; + } + + private DragDropEffects PerformDataTransfer(IDataObject dobj, DragDropEffects effect, ResourceId targetid, bool samefolder, bool IsPaste) + { + DragDropEffects dragDropEffects; + try + { + if ((object) targetid == null) + { + dragDropEffects = DragDropEffects.None; + } + else + { + effect &= (DragDropEffects) checked (-unchecked ((int) effect)); + if (dobj.GetDataPresent(typeof (CarotDAVDataObject.InterAppDataStore).FullName, true)) + { + CarotDAVDataObject.InterAppDataStore data = dobj.GetData(typeof (CarotDAVDataObject.InterAppDataStore).FullName) as CarotDAVDataObject.InterAppDataStore; + if (Operators.CompareString(XmlSettingManager.XmlSerializeConnectionSetting(this.CurrentConnectionSetting), XmlSettingManager.XmlSerializeConnectionSetting(data.ConnectionSetting), false) == 0) + { + ConflictPromptManager cm = new ConflictPromptManager(); + ErrorPromptManager em = new ErrorPromptManager(); + List resourceIdList = new List(this.ResourceListView.Items.Count); + if (samefolder) + { + int num1 = 0; + int num2 = checked (this.ResourceListView.Items.Count - 1); + int index = num1; + while (index <= num2) + { + resourceIdList.Add(((ResourceInfo) this.ResourceListView.Items[index].Tag).Id); + checked { ++index; } + } + } + if (effect == DragDropEffects.Copy && (this.pFs.Ability & FsAbility.Copy) != FsAbility.None) + { + int num1 = 0; + int num2 = checked (data.Files.Count - 1); + int index = num1; + while (index <= num2) + { + string newname = (string) null; + if (resourceIdList.Contains(data.Files[index])) + { + string lastName = UriUtil.GetLastName(data.Files[index].Uri); + newname = Path.GetFileNameWithoutExtension(lastName) + " copy." + Path.GetExtension(lastName); + } + if (!this.Fs_Copy(data.Files[index], targetid, newname, cm, em)) + { + dragDropEffects = DragDropEffects.None; + goto label_58; + } + else + checked { ++index; } + } + DataObjectHelper.SetPerformedDragEffect(dobj, DragDropEffects.Copy); + dragDropEffects = DragDropEffects.Copy; + goto label_58; + } + else if (effect == DragDropEffects.Move && (this.pFs.Ability & FsAbility.Move) != FsAbility.None) + { + int num1 = 0; + int num2 = checked (data.Files.Count - 1); + int index = num1; + while (index <= num2) + { + if (!this.Fs_Move(data.Files[index], targetid, (string) null, cm, em)) + { + dragDropEffects = DragDropEffects.None; + goto label_58; + } + else + checked { ++index; } + } + DataObjectHelper.SetPerformedDragEffect(dobj, DragDropEffects.None); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + } + } + if (dobj.GetDataPresent(DataFormats.FileDrop)) + { + string[] data = dobj.GetData(DataFormats.FileDrop, false) as string[]; + if (data != null && effect == DragDropEffects.Copy) + { + if (IsPaste) + { + DataObjectHelper.StartAsyncOperation(dobj); + this.Upload(data, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Copy); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + else + { + bool flag = false; + if (dobj != null) + flag = DataObjectHelper.StartAsyncOperation(dobj); + this.Upload(data, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Copy); + dragDropEffects = flag ? DragDropEffects.None : DragDropEffects.Copy; + goto label_58; + } + } + else if (data != null && effect == DragDropEffects.Move) + { + if (IsPaste) + { + DataObjectHelper.StartAsyncOperation(dobj); + this.Upload(data, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Move); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + else + { + bool flag = false; + if (dobj != null) + flag = DataObjectHelper.StartAsyncOperation(dobj); + if (!flag) + throw new Exception("CarotDAV doesn't support \"Synchronous File Move\"."); + this.Upload(data, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Move); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + } + } + if (dobj.GetDataPresent("FileGroupDescriptorW")) + { + VirtualFileInfo[] virtualFileInfo = DataObjectHelper.GetVirtualFileInfo(dobj); + if (virtualFileInfo.Length > 0 && effect == DragDropEffects.Copy) + { + if (IsPaste) + { + DataObjectHelper.StartAsyncOperation(dobj); + this.UploadDescriptors(virtualFileInfo, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Copy); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + else + { + bool flag = false; + if (dobj != null) + flag = DataObjectHelper.StartAsyncOperation(dobj); + if (!flag && dobj != null) + throw new Exception("CarotDAV doesn't support \"Synchronous FileDescriptor Copy\"."); + DataObjectHelper.StartAsyncOperation(dobj); + this.UploadDescriptors(virtualFileInfo, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Copy); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + } + else if (virtualFileInfo.Length > 0 && effect == DragDropEffects.Move) + { + if (IsPaste) + { + DataObjectHelper.StartAsyncOperation(dobj); + this.UploadDescriptors(virtualFileInfo, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Move); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + else + { + if (!DataObjectHelper.StartAsyncOperation(dobj)) + throw new Exception("CarotDAV doesn't support \"Synchronous FileDescriptor Move\"."); + this.UploadDescriptors(virtualFileInfo, targetid, this.InnerCheckSameProcessDataTransfer(dobj, IsPaste), DragDropEffects.Move); + dragDropEffects = DragDropEffects.None; + goto label_58; + } + } + } + Uri uniformResourceLocator = DataObjectHelper.GetUniformResourceLocator(dobj); + if ((object) uniformResourceLocator != null) + { + if (effect == DragDropEffects.Link) + { + this.TemporaryConnect(uniformResourceLocator); + DataObjectHelper.SetPerformedDragEffect(dobj, DragDropEffects.Link); + dragDropEffects = DragDropEffects.Link; + } + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Error\r\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand); + ProjectData.ClearProjectError(); + } +label_58: + return dragDropEffects; + } + + private IDataObject InnerCheckSameProcessDataTransfer(IDataObject dobj, bool ispaste) + { + if (!dobj.GetDataPresent(typeof (CarotDAVDataObject.InterAppDataStore).FullName, true) || (dobj.GetData(typeof (CarotDAVDataObject.InterAppDataStore).FullName) as CarotDAVDataObject.InterAppDataStore).ID != (long) Process.GetCurrentProcess().Id) + return dobj; + if (ispaste) + { + this.pLastCopyCutDataObject.IsInUsebymyself = true; + return (IDataObject) new System.Windows.Forms.DataObject((object) this.pLastCopyCutDataObject); + } + this.pDraggingDataObject.IsInUsebymyself = true; + return (IDataObject) new System.Windows.Forms.DataObject((object) this.pDraggingDataObject); + } + + private void DataObject_Release(object sender, EventArgs e) + { + CarotDAVDataObject carotDavDataObject = (CarotDAVDataObject) sender; + carotDavDataObject.Dispose(); + lock (this.pDataObjectList) + { + this.pDataObjectList.Remove(carotDavDataObject); + if (carotDavDataObject != this.pLastCopyCutDataObject) + return; + this.pLastCopyCutDataObject = (CarotDAVDataObject) null; + } + } + + private void MainForm_DragDrop(object sender, DragEventArgs e) + { + if (this.pDraggingDataObject != null) + e.Effect = DragDropEffects.None; + else + e.Effect = this.PerformDataTransfer(e.Data, e.Effect, this.CurrentId, false, false); + } + + private void MainForm_DragEnter(object sender, DragEventArgs e) + { + if (this.pDraggingDataObject != null) + { + e.Effect = DragDropEffects.None; + } + else + { + this.pCurrentExtractedData = this.ExtractDataObject(e.Data, e.AllowedEffect); + e.Effect = this.CalcDataTransferEffect(this.pCurrentExtractedData, e.KeyState, this.pDraggingDataObject != null); + } + } + + private void MainForm_DragOver(object sender, DragEventArgs e) + { + if (this.pDraggingDataObject != null) + e.Effect = DragDropEffects.None; + else + e.Effect = this.CalcDataTransferEffect(this.pCurrentExtractedData, e.KeyState, this.pDraggingDataObject != null); + } + + private void MainForm_DragLeave(object sender, EventArgs e) + { + this.pCurrentExtractedData = (MainForm.ExtractedData) null; + } + + private void ResourceListView_DragDrop(object sender, DragEventArgs e) + { + Point client = this.ResourceListView.PointToClient(new Point(e.X, e.Y)); + ListViewItem itemAt = this.ResourceListView.GetItemAt(client.X, client.Y); + e.Effect = e.Effect & (DragDropEffects) checked (-unchecked ((int) e.Effect)); + e.Effect = this.pDraggingDataObject == null ? (e.Effect == DragDropEffects.Copy || e.Effect == DragDropEffects.Move ? (itemAt == null || !((ResourceInfo) itemAt.Tag).IsCollection ? this.PerformDataTransfer(e.Data, e.Effect, this.CurrentId, false, false) : this.PerformDataTransfer(e.Data, e.Effect, ((ResourceInfo) itemAt.Tag).Id, false, false)) : DragDropEffects.None) : (e.Effect != DragDropEffects.Copy ? (e.Effect != DragDropEffects.Move ? DragDropEffects.None : (itemAt == null || itemAt.Selected || !((ResourceInfo) itemAt.Tag).IsCollection ? DragDropEffects.None : this.PerformDataTransfer(e.Data, e.Effect, ((ResourceInfo) itemAt.Tag).Id, false, false))) : (itemAt == null || itemAt.Selected || !((ResourceInfo) itemAt.Tag).IsCollection ? this.PerformDataTransfer(e.Data, e.Effect, this.CurrentId, true, false) : this.PerformDataTransfer(e.Data, e.Effect, ((ResourceInfo) itemAt.Tag).Id, false, false))); + if (this.pCurrentDropHilighted == null) + return; + if (this.pCurrentDropHilighted.ListView != null) + WallMarkListView.ListViewItemSetStateDropHilited(this.pCurrentDropHilighted, false); + this.pCurrentDropHilighted = (ListViewItem) null; + } + + private void ResourceListView_DragEnter(object sender, DragEventArgs e) + { + this.pCurrentExtractedData = this.ExtractDataObject(e.Data, e.AllowedEffect); + this.ResourceListView_DragOver(RuntimeHelpers.GetObjectValue(sender), e); + } + + private void ResourceListView_DragOver(object sender, DragEventArgs e) + { + try + { + Point client = this.ResourceListView.PointToClient(new Point(e.X, e.Y)); + ListViewItem listitem = this.ResourceListView.GetItemAt(client.X, client.Y); + e.Effect = this.CalcDataTransferEffect(this.pCurrentExtractedData, e.KeyState, this.pDraggingDataObject != null); + if (this.pDraggingDataObject != null) + { + if (e.Effect == DragDropEffects.Copy && this.pDraggingDataObject.CanCopyInternally) + { + if (listitem == null || listitem.Selected || !((ResourceInfo) listitem.Tag).IsCollection) + { + e.Effect = DragDropEffects.None; + listitem = (ListViewItem) null; + } + } + else if (e.Effect == DragDropEffects.Move && this.pDraggingDataObject.CanMoveInternally) + { + if (listitem == null || listitem.Selected || !((ResourceInfo) listitem.Tag).IsCollection) + e.Effect = DragDropEffects.None; + } + else + e.Effect = DragDropEffects.None; + } + else if (e.Effect == DragDropEffects.Copy || e.Effect == DragDropEffects.Move) + { + if (listitem == null || listitem.Selected || !((ResourceInfo) listitem.Tag).IsCollection) + listitem = (ListViewItem) null; + } + else + e.Effect = DragDropEffects.None; + if (listitem == this.pCurrentDropHilighted) + return; + if (this.pCurrentDropHilighted != null && this.pCurrentDropHilighted.ListView != null) + WallMarkListView.ListViewItemSetStateDropHilited(this.pCurrentDropHilighted, false); + if (listitem != null) + WallMarkListView.ListViewItemSetStateDropHilited(listitem, true); + this.pCurrentDropHilighted = listitem; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + private void ResourceListView_DragLeave(object sender, EventArgs e) + { + if (this.pCurrentDropHilighted != null) + { + if (this.pCurrentDropHilighted.ListView != null) + WallMarkListView.ListViewItemSetStateDropHilited(this.pCurrentDropHilighted, false); + this.pCurrentDropHilighted = (ListViewItem) null; + } + this.pCurrentExtractedData = (MainForm.ExtractedData) null; + } + + private void ResourceListView_ItemDrag(object sender, ItemDragEventArgs e) + { + if (!this.IsConnected) + return; + bool flag = (this.pFs.Ability & FsAbility.Move) != FsAbility.None; + ResourceInfo[] resources = new ResourceInfo[checked (this.ResourceListView.SelectedItems.Count - 1 + 1)]; + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index = num1; + while (index <= num2) + { + resources[index] = (ResourceInfo) this.ResourceListView.SelectedItems[index].Tag; + if (!resources[index].CanMove) + flag = false; + checked { ++index; } + } + DragDropEffects allowedEffects = DragDropEffects.Copy | DragDropEffects.Link; + if (flag) + allowedEffects |= DragDropEffects.Move; + CarotDAVDataObject carotDavDataObject = new CarotDAVDataObject(this.CurrentConnectionSetting, resources, CarotDAVDataObject.CarotDAVDataObjectType.DragDrop, this.pCache); + try + { + carotDavDataObject.Release += new CarotDAVDataObject.ReleaseEventHandler(this.DataObject_Release); + carotDavDataObject.SetInDragLoop(true); + this.pDraggingDataObject = carotDavDataObject; + carotDavDataObject.SetDragDropResult(this.ResourceListView.DoDragDrop((object) carotDavDataObject, allowedEffects)); + this.pDraggingDataObject = (CarotDAVDataObject) null; + if (carotDavDataObject.IsInOperation) + { + lock (this.pDataObjectList) + this.pDataObjectList.Add(carotDavDataObject); + } + else + carotDavDataObject.Dispose(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + if (carotDavDataObject != null) + carotDavDataObject.Dispose(); + throw; + } + } + + private void ResourceListView_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) + { + if ((e.KeyState & 3) == 3 || (e.KeyState & 17) == 17 || (e.KeyState & 18) == 18) + { + e.Action = DragAction.Cancel; + } + else + { + if (e.Action != DragAction.Drop) + return; + this.pDraggingDataObject.SetInDragLoop(false); + } + } + + private void CutToolStripMenuItem_Click(object sender, EventArgs e) + { + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + ResourceInfo tag = (ResourceInfo) this.ResourceListView.SelectedItems[index1].Tag; + if (!tag.CanDelete || tag.HasError) + return; + checked { ++index1; } + } + this.ResourceListView.BeginUpdate(); + int num3 = 0; + int num4 = checked (this.ResourceListView.Items.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + WallMarkListView.ListViewItemSetStateCut(this.ResourceListView.Items[index2], false); + checked { ++index2; } + } + ResourceInfo[] resources = new ResourceInfo[checked (this.ResourceListView.SelectedItems.Count - 1 + 1)]; + int num5 = 0; + int num6 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index3 = num5; + while (index3 <= num6) + { + resources[index3] = (ResourceInfo) this.ResourceListView.SelectedItems[index3].Tag; + WallMarkListView.ListViewItemSetStateCut(this.ResourceListView.SelectedItems[index3], true); + checked { ++index3; } + } + this.ResourceListView.EndUpdate(); + CarotDAVDataObject carotDavDataObject = new CarotDAVDataObject(this.CurrentConnectionSetting, resources, CarotDAVDataObject.CarotDAVDataObjectType.Cut, this.pCache); + CarotDAVDataObject copyCutDataObject = this.pLastCopyCutDataObject; + try + { + carotDavDataObject.Release += new CarotDAVDataObject.ReleaseEventHandler(this.DataObject_Release); + carotDavDataObject.AsyncSupported = true; + this.pLastCopyCutDataObject = carotDavDataObject; + Clipboard.SetDataObject((object) carotDavDataObject); + lock (this.pDataObjectList) + { + this.pDataObjectList.Add(carotDavDataObject); + if (this.pDataObjectList.Contains(copyCutDataObject)) + { + int num7 = Marshal.Release(Marshal.GetIUnknownForObject((object) copyCutDataObject)); + if (!copyCutDataObject.IsInUsebymyself) + { + if (num7 <= 0) + this.DataObject_Release((object) copyCutDataObject, EventArgs.Empty); + } + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception exception = ex; + if (carotDavDataObject != null) + carotDavDataObject.Dispose(); + int num7 = (int) MessageBox.Show("Cannot Set Data to Clipboard\r\n" + exception.ToString()); + ProjectData.ClearProjectError(); + return; + } + this.UpdateClipBoard(); + } + + private void CopyToolStripMenuItem_Click(object sender, EventArgs e) + { + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + ResourceInfo tag = this.ResourceListView.SelectedItems[index1].Tag as ResourceInfo; + if (tag != null && tag.HasError) + return; + checked { ++index1; } + } + this.ResourceListView.BeginUpdate(); + int num3 = 0; + int num4 = checked (this.ResourceListView.Items.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + WallMarkListView.ListViewItemSetStateCut(this.ResourceListView.Items[index2], false); + checked { ++index2; } + } + List resourceInfoList = new List(); + int num5 = 0; + int num6 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index3 = num5; + while (index3 <= num6) + { + ResourceInfo tag = this.ResourceListView.SelectedItems[index3].Tag as ResourceInfo; + if (tag != null) + resourceInfoList.Add(tag); + checked { ++index3; } + } + this.ResourceListView.EndUpdate(); + if (resourceInfoList.Count > 0) + { + CarotDAVDataObject carotDavDataObject = new CarotDAVDataObject(this.CurrentConnectionSetting, resourceInfoList.ToArray(), CarotDAVDataObject.CarotDAVDataObjectType.Copy, this.pCache); + CarotDAVDataObject copyCutDataObject = this.pLastCopyCutDataObject; + try + { + carotDavDataObject.Release += new CarotDAVDataObject.ReleaseEventHandler(this.DataObject_Release); + carotDavDataObject.AsyncSupported = true; + this.pLastCopyCutDataObject = carotDavDataObject; + Clipboard.SetDataObject((object) carotDavDataObject); + lock (this.pDataObjectList) + { + this.pDataObjectList.Add(carotDavDataObject); + if (this.pDataObjectList.Contains(copyCutDataObject)) + { + int num7 = Marshal.Release(Marshal.GetIUnknownForObject((object) copyCutDataObject)); + if (!copyCutDataObject.IsInUsebymyself) + { + if (num7 <= 0) + this.DataObject_Release((object) copyCutDataObject, EventArgs.Empty); + } + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception exception = ex; + if (carotDavDataObject != null) + carotDavDataObject.Dispose(); + int num7 = (int) MessageBox.Show("Cannot Set Data to Clipboard\r\n" + exception.ToString()); + ProjectData.ClearProjectError(); + return; + } + } + this.UpdateClipBoard(); + } + + private void PasteToolStripMenuItem_Click(object sender, EventArgs e) + { + IDataObject dataObject = Clipboard.GetDataObject(); + DragDropEffects effect = this.CalcDataTransferEffect(this.ExtractDataObject(dataObject, DragDropEffects.All), 0, false); + this.PerformDataTransfer(dataObject, effect, this.CurrentId, false, true); + this.UpdateWindow(); + } + + private UpDownForm GetUpDownForm(Uri target, UpDownForm.TransferDirectionType direction) + { + ConnectionSettingBase connectionSetting = this.CurrentConnectionSetting; + Dictionary dictionary = direction != UpDownForm.TransferDirectionType.Download ? this.pUpForms : this.pDownForms; + if (!dictionary.ContainsKey(connectionSetting)) + { + UpDownForm upDownForm = new UpDownForm(); + try + { + upDownForm.FormClosed += new FormClosedEventHandler(this.UpDownForm_FormClosed); + upDownForm.TransferFinished += new EventHandler(this.UpDownForm_TransferFinished); + upDownForm.RemoteResourceChanged += this.RemoteResourceChangedHandler; + upDownForm.MainForm = this; + upDownForm.Title = UriUtil.GetAuthority(target); + FsBase client = this.CurrentConnectionSetting.GetClient(); + client.LogMessage += new EventHandler(this.Client_OnMessage); + client.GroupName = "UpDown"; + upDownForm.SetClient(direction, client, this.pCache, this.CurrentConnectionSetting.DownloadFilenameNormalization, this.CurrentConnectionSetting.UploadFilenameNormalization); + Rectangle workingArea = Screen.GetWorkingArea((Control) this); + Point point = new Point(checked (this.Right - upDownForm.Width + 32 * dictionary.Count + 32), checked (this.Bottom - upDownForm.Height + 32 * dictionary.Count + 32)); + if (workingArea.Right < checked (point.X + upDownForm.Width)) + point.X = checked (workingArea.Right - upDownForm.Width); + if (workingArea.Bottom < checked (point.Y + upDownForm.Height)) + point.Y = checked (workingArea.Bottom - upDownForm.Height); + if (workingArea.Left > point.X) + point.X = workingArea.Left; + if (workingArea.Top > point.Y) + point.Y = workingArea.Top; + upDownForm.Location = point; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + upDownForm.Dispose(); + throw; + } + dictionary.Add(connectionSetting, upDownForm); + } + dictionary[connectionSetting].Show(); + dictionary[connectionSetting].Focus(); + return dictionary[connectionSetting]; + } + + private void UpDownForm_FormClosed(object sender, FormClosedEventArgs e) + { + UpDownForm upDownForm = (UpDownForm) sender; + Dictionary.KeyCollection.Enumerator enumerator1; + try + { + enumerator1 = this.pDownForms.Keys.GetEnumerator(); + while (enumerator1.MoveNext()) + { + ConnectionSettingBase current = enumerator1.Current; + if (this.pDownForms[current] == upDownForm) + { + this.pDownForms.Remove(current); + break; + } + } + } + finally + { + enumerator1.Dispose(); + } + Dictionary.KeyCollection.Enumerator enumerator2; + try + { + enumerator2 = this.pUpForms.Keys.GetEnumerator(); + while (enumerator2.MoveNext()) + { + ConnectionSettingBase current = enumerator2.Current; + if (this.pUpForms[current] == upDownForm) + { + this.pUpForms.Remove(current); + break; + } + } + } + finally + { + enumerator2.Dispose(); + } + upDownForm.Dispose(); + } + + private void UpDownForm_TransferFinished(object sender, EventArgs e) + { + } + + private bool TryCloseUpDownForms() + { + UpDownForm[] array1 = new UpDownForm[checked (this.pDownForms.Count - 1 + 1)]; + this.pDownForms.Values.CopyTo(array1, 0); + UpDownForm[] upDownFormArray1 = array1; + int index1 = 0; + while (index1 < upDownFormArray1.Length) + { + upDownFormArray1[index1].Close(); + checked { ++index1; } + } + UpDownForm[] array2 = new UpDownForm[checked (this.pUpForms.Count - 1 + 1)]; + this.pUpForms.Values.CopyTo(array2, 0); + UpDownForm[] upDownFormArray2 = array2; + int index2 = 0; + while (index2 < upDownFormArray2.Length) + { + upDownFormArray2[index2].Close(); + checked { ++index2; } + } + return checked (this.pUpForms.Count + this.pDownForms.Count) <= 0; + } + + private void ShowPropertyForm(ResourceInfo ri) + { + int num1 = 0; + int num2 = checked (this.pPropertyForms.Count - 1); + int index = num1; + while (index <= num2) + { + if (this.pPropertyForms[index].Target == ri.Id) + { + this.pPropertyForms[index].Show(); + this.pPropertyForms[index].Focus(); + return; + } + checked { ++index; } + } + PropertyForm propertyForm = new PropertyForm(); + propertyForm.FormClosed += new FormClosedEventHandler(this.PropertyForm_FormClosed); + propertyForm.PropertyUpdated += new EventHandler(this.PropertyForm_PropertyUpdated); + propertyForm.MainForm = this; + propertyForm.Target = ri.Id; + propertyForm.ResourceInfo = ri; + this.pPropertyForms.Add(propertyForm); + propertyForm.Show(); + propertyForm.Focus(); + } + + private void PropertyForm_FormClosed(object sender, FormClosedEventArgs e) + { + PropertyForm propertyForm = (PropertyForm) sender; + this.pPropertyForms.Remove(propertyForm); + propertyForm.Dispose(); + } + + private void PropertyForm_PropertyUpdated(object sender, EventArgs e) + { + } + + private bool TryClosePropertyForms() + { + PropertyForm[] array = new PropertyForm[checked (this.pPropertyForms.Count - 1 + 1)]; + this.pPropertyForms.CopyTo(array, 0); + PropertyForm[] propertyFormArray = array; + int index = 0; + while (index < propertyFormArray.Length) + { + propertyFormArray[index].Close(); + checked { ++index; } + } + return this.pPropertyForms.Count <= 0; + } + + private void Client_OnMessage(object sender, LogMessageEventArgs e) + { + if (this.InvokeRequired) + { + try + { + this.BeginInvoke((Delegate) new EventHandler(this.Client_OnMessage), RuntimeHelpers.GetObjectValue(sender), (object) e); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + else + { + if (this.pSetting.ShowLogWindow) + this.WriteLineLog(e.Message); + LogWriter.WriteMessage("http", e.Message); + } + } + + private void WriteLineLog(string str) + { + if (!this.pSetting.ShowLogWindow || this.InvokeRequired) + return; + string str1 = string.Join("", new string[3] + { + this.LogTextBox.Text, + str, + "\r\n" + }); + if (str1.Length > 30000) + str1 = str1.Substring(checked (str1.Length - 30000), 30000); + this.LogTextBox.Text = str1; + this.LogTextBox.Select(checked (str1.Length - 1), 0); + this.LogTextBox.ScrollToCaret(); + } + + private void FileLoggingChange(bool enable) + { + LogWriter.Enabled = enable; + this.LogToFileToolStripMenuItem.Checked = enable; + } + + private void LogViewChange(bool show) + { + if (show) + this.LogTextBox.Text = ""; + this.LogToolStripMenuItem.Checked = show; + this.SplitContainer1.Panel2Collapsed = !show; + this.pSetting.ShowLogWindow = show; + if (show) + return; + this.LogTextBox.Text = ""; + } + + private void StatusBarChange(bool show) + { + this.StatusBarToolStripMenuItem.Checked = show; + this.StatusStrip1.Visible = show; + this.pSetting.ShowStatusBar = show; + } + + private void UpdateWindow() + { + if (this.IsConnected) + { + int count; + switch (this.ResourceListView.Items.Count) + { + case 0: + this.ToolStripTotal.Text = "no resources"; + this.SelectAllToolStripMenuItem.Enabled = false; + break; + case 1: + this.ToolStripTotal.Text = "1 resource"; + this.SelectAllToolStripMenuItem.Enabled = true; + break; + default: + ToolStripStatusLabel toolStripTotal = this.ToolStripTotal; + count = this.ResourceListView.Items.Count; + string str1 = count.ToString() + " resources"; + toolStripTotal.Text = str1; + this.SelectAllToolStripMenuItem.Enabled = true; + break; + } + this.ConnectToolStripButton.Enabled = true; + this.ConnectToolStripMenuItem.Enabled = true; + this.GoToParentToolStripMenuItem.Visible = true; + this.GoToParentContextMenuItem.Visible = true; + if (UriUtil.IsRoot(this.CurrentId.Uri)) + { + this.GoToParentToolStripButton.Enabled = false; + this.GoToParentToolStripMenuItem.Enabled = false; + this.GoToParentContextMenuItem.Enabled = false; + } + else + { + this.GoToParentToolStripButton.Enabled = true; + this.GoToParentToolStripMenuItem.Enabled = true; + this.GoToParentContextMenuItem.Enabled = true; + } + this.FaviconToolStripButton.Enabled = true; + this.GoToHomeToolStripMenuItem.Visible = true; + this.RefreshToolStripButton.Enabled = true; + this.RefreshToolStripMenuItem.Enabled = true; + this.RefreshContextMenuItem.Enabled = true; + this.NewFolderToolStripButton.Enabled = true; + this.NewFolderToolStripMenuItem.Visible = true; + this.NewFolderContextMenuItem.Visible = true; + this.UploadToolStripButton.Enabled = true; + this.UploadToolStripMenuItem.Visible = true; + this.UploadFolderToolStripButton.Enabled = true; + this.UploadFolderToolStripMenuItem.Visible = true; + this.DownloadToolStripMenuItem.Visible = true; + this.DownloadContextMenuItem.Visible = true; + this.ToolStripMenuSeparatorUpDown.Visible = true; + this.ContextMenuSeparatorDownload.Visible = true; + this.TestToolStripMenuItem.Enabled = true; + if (this.pFs.LastSecureType == SecureType.Secure) + { + this.SecureToolStripLabel.Image = (Image) CarotDAV.My.Resources.Resources.Lock; + this.SecureToolStripLabel.Visible = true; + this.UriToolStripTextBox.BackColor = System.Drawing.Color.PaleGreen; + } + else if (this.pFs.LastSecureType == SecureType.Warning) + { + this.SecureToolStripLabel.Image = (Image) CarotDAV.My.Resources.Resources.Warning; + this.SecureToolStripLabel.Visible = true; + this.UriToolStripTextBox.BackColor = System.Drawing.Color.Pink; + } + else + { + this.SecureToolStripLabel.Visible = false; + this.SecureToolStripLabel.Image = (Image) null; + this.UriToolStripTextBox.BackColor = SystemColors.Window; + } + this.PasteToolStripButton.Enabled = true; + this.PasteToolStripMenuItem.Visible = true; + this.PasteContextMenuItem.Visible = true; + this.CutToolStripMenuItem.Visible = true; + this.CutContextMenuItem.Visible = true; + this.CopyToolStripMenuItem.Visible = true; + this.CopyContextMenuItem.Visible = true; + this.CopyResourceNameContextMenuItem.Visible = true; + this.CopyURIContextMenuItem.Visible = true; + this.ContextMenuSeparatorCopy.Visible = true; + if (this.ResourceListView.SelectedIndices.Count == 0) + { + this.ToolStripSelected.Text = ""; + this.DeleteToolStripButton.Enabled = false; + this.DeleteToolStripMenuItem.Enabled = false; + this.DeleteContextMenuItem.Enabled = false; + this.PropertyToolStripButton.Enabled = false; + this.PropertyToolStripMenuItem.Enabled = false; + this.PropertyContextMenuItem.Enabled = false; + this.RenameToolStripMenuItem.Enabled = false; + this.RenameContextMenuItem.Enabled = false; + this.DownloadToolStripButton.Enabled = false; + this.DownloadToolStripMenuItem.Enabled = false; + this.DownloadContextMenuItem.Enabled = false; + this.CutToolStripButton.Enabled = false; + this.CutToolStripMenuItem.Enabled = false; + this.CutContextMenuItem.Enabled = false; + this.CopyToolStripButton.Enabled = false; + this.CopyToolStripMenuItem.Enabled = false; + this.CopyContextMenuItem.Enabled = false; + this.CopyResourceNameContextMenuItem.Enabled = false; + this.CopyURIContextMenuItem.Enabled = false; + } + else + { + bool flag1 = true; + bool flag2 = true; + bool flag3 = true; + bool flag4 = this.ResourceListView.SelectedItems.Count == 1; + bool flag5 = this.ResourceListView.SelectedItems.Count == 1; + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedItems.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + ResourceInfo tag = (ResourceInfo) this.ResourceListView.SelectedItems[index1].Tag; + flag1 = flag1 && tag.CanCopy; + flag2 = flag2 && tag.CanDelete; + flag3 = flag3 && tag.CanMove; + flag5 = flag5 && tag.CanRename; + checked { ++index1; } + } + ToolStripStatusLabel toolStripSelected = this.ToolStripSelected; + string separator = ""; + string[] strArray1 = new string[3] + { + "(", + null, + null + }; + string[] strArray2 = strArray1; + int index2 = 1; + count = this.ResourceListView.SelectedIndices.Count; + string str2 = count.ToString(); + strArray2[index2] = str2; + strArray1[2] = " selected)"; + string[] strArray3 = strArray1; + string str3 = string.Join(separator, strArray3); + toolStripSelected.Text = str3; + this.DeleteToolStripButton.Enabled = flag2; + this.DeleteToolStripMenuItem.Enabled = flag2; + this.DeleteContextMenuItem.Enabled = flag2; + this.PropertyToolStripButton.Enabled = flag4; + this.PropertyToolStripMenuItem.Enabled = flag4; + this.PropertyContextMenuItem.Enabled = flag4; + this.RenameToolStripMenuItem.Enabled = flag5; + this.RenameContextMenuItem.Enabled = flag5; + this.DownloadToolStripButton.Enabled = true; + this.DownloadToolStripMenuItem.Enabled = true; + this.DownloadContextMenuItem.Enabled = true; + this.CutToolStripButton.Enabled = flag3; + this.CutToolStripMenuItem.Enabled = flag3; + this.CutContextMenuItem.Enabled = flag3; + this.CopyToolStripButton.Enabled = flag1; + this.CopyToolStripMenuItem.Enabled = flag1; + this.CopyContextMenuItem.Enabled = flag1; + this.CopyResourceNameContextMenuItem.Enabled = true; + this.CopyURIContextMenuItem.Enabled = true; + } + if (this.pCurrentHistoryNode == null) + { + this.BackToolStripButton.Enabled = false; + this.BackToolStripMenuItem.Enabled = false; + this.ForwardToolStripButton.Enabled = false; + this.ForwardToolStripMenuItem.Enabled = false; + } + else + { + if (this.pCurrentHistoryNode.Previous == null) + { + this.BackToolStripButton.Enabled = false; + this.BackToolStripMenuItem.Enabled = false; + } + else + { + this.BackToolStripButton.Enabled = true; + this.BackToolStripMenuItem.Enabled = true; + } + if (this.pCurrentHistoryNode.Next == null) + { + this.ForwardToolStripButton.Enabled = false; + this.ForwardToolStripMenuItem.Enabled = false; + } + else + { + this.ForwardToolStripButton.Enabled = true; + this.ForwardToolStripMenuItem.Enabled = true; + } + } + this.ImportContextMenuItem.Visible = false; + this.ImportToolStripMenuItem.Visible = false; + this.ExportContextMenuItem.Visible = false; + this.ExportToolStripMenuItem.Visible = false; + this.NewConnectionContextMenuItem.Visible = false; + this.NewConnectionToolStripMenuItem.Visible = false; + this.NewConnectionToolStripDropDownButton.Enabled = false; + this.ContextMenuSeparatorConnection.Visible = false; + this.DuplicateToolStripMenuItem.Visible = false; + this.DuplicateContextMenuItem.Visible = false; + } + else + { + switch (this.ResourceListView.Items.Count) + { + case 0: + this.ToolStripTotal.Text = "no connection"; + this.SelectAllToolStripMenuItem.Enabled = false; + break; + case 1: + this.ToolStripTotal.Text = "1 connection"; + this.SelectAllToolStripMenuItem.Enabled = true; + break; + default: + this.ToolStripTotal.Text = this.ResourceListView.Items.Count.ToString() + " connections"; + this.SelectAllToolStripMenuItem.Enabled = true; + break; + } + this.ConnectToolStripButton.Enabled = false; + this.ConnectToolStripMenuItem.Enabled = false; + this.GoToParentToolStripButton.Enabled = false; + this.GoToParentToolStripMenuItem.Visible = false; + this.GoToParentContextMenuItem.Visible = false; + this.FaviconToolStripButton.Enabled = false; + this.GoToHomeToolStripMenuItem.Visible = false; + this.RefreshToolStripButton.Enabled = true; + this.RefreshToolStripMenuItem.Enabled = true; + this.RefreshContextMenuItem.Enabled = true; + this.NewFolderToolStripButton.Enabled = false; + this.NewFolderToolStripMenuItem.Visible = false; + this.NewFolderContextMenuItem.Visible = false; + this.UploadToolStripButton.Enabled = false; + this.UploadToolStripMenuItem.Visible = false; + this.UploadFolderToolStripButton.Enabled = false; + this.UploadFolderToolStripMenuItem.Visible = false; + this.DownloadToolStripButton.Enabled = false; + this.DownloadToolStripMenuItem.Visible = false; + this.DownloadContextMenuItem.Visible = false; + this.ToolStripMenuSeparatorUpDown.Visible = false; + this.ContextMenuSeparatorDownload.Visible = false; + this.TestToolStripMenuItem.Enabled = false; + this.SecureToolStripLabel.Visible = false; + this.SecureToolStripLabel.Image = (Image) null; + this.UriToolStripTextBox.BackColor = SystemColors.Window; + this.PasteToolStripButton.Enabled = false; + this.PasteToolStripMenuItem.Visible = false; + this.PasteContextMenuItem.Visible = false; + this.CutToolStripButton.Enabled = false; + this.CutToolStripMenuItem.Visible = false; + this.CutContextMenuItem.Visible = false; + this.CopyToolStripButton.Enabled = false; + this.CopyToolStripMenuItem.Visible = false; + this.CopyContextMenuItem.Visible = false; + this.CopyResourceNameContextMenuItem.Visible = false; + this.CopyURIContextMenuItem.Visible = false; + this.ContextMenuSeparatorCopy.Visible = false; + if (this.ResourceListView.SelectedIndices.Count == 0) + { + this.ToolStripSelected.Text = ""; + this.DeleteToolStripButton.Enabled = false; + this.DeleteToolStripMenuItem.Enabled = false; + this.DeleteContextMenuItem.Enabled = false; + this.PropertyToolStripButton.Enabled = false; + this.PropertyToolStripMenuItem.Enabled = false; + this.PropertyContextMenuItem.Enabled = false; + this.RenameToolStripMenuItem.Enabled = false; + this.RenameContextMenuItem.Enabled = false; + this.DuplicateToolStripMenuItem.Enabled = false; + this.DuplicateContextMenuItem.Enabled = false; + this.ExportToolStripMenuItem.Enabled = false; + this.ExportContextMenuItem.Enabled = false; + } + else if (this.ResourceListView.SelectedIndices.Count == 1) + { + this.ToolStripSelected.Text = ""; + this.DeleteToolStripButton.Enabled = true; + this.DeleteToolStripMenuItem.Enabled = true; + this.DeleteContextMenuItem.Enabled = true; + this.PropertyToolStripButton.Enabled = true; + this.PropertyToolStripMenuItem.Enabled = true; + this.PropertyContextMenuItem.Enabled = true; + this.RenameToolStripMenuItem.Enabled = true; + this.RenameContextMenuItem.Enabled = true; + this.DuplicateToolStripMenuItem.Enabled = true; + this.DuplicateContextMenuItem.Enabled = true; + this.ExportToolStripMenuItem.Enabled = true; + this.ExportContextMenuItem.Enabled = true; + } + else + { + this.ToolStripSelected.Text = ""; + this.DeleteToolStripButton.Enabled = true; + this.DeleteToolStripMenuItem.Enabled = true; + this.DeleteContextMenuItem.Enabled = true; + this.PropertyToolStripButton.Enabled = false; + this.PropertyToolStripMenuItem.Enabled = false; + this.PropertyContextMenuItem.Enabled = false; + this.RenameToolStripMenuItem.Enabled = false; + this.RenameContextMenuItem.Enabled = false; + this.DuplicateToolStripMenuItem.Enabled = false; + this.DuplicateContextMenuItem.Enabled = false; + this.ExportToolStripMenuItem.Enabled = false; + this.ExportContextMenuItem.Enabled = false; + } + this.BackToolStripButton.Enabled = false; + this.BackToolStripMenuItem.Enabled = false; + this.ForwardToolStripButton.Enabled = false; + this.ForwardToolStripMenuItem.Enabled = false; + this.ImportContextMenuItem.Visible = true; + this.ImportToolStripMenuItem.Visible = true; + this.ExportContextMenuItem.Visible = true; + this.ExportToolStripMenuItem.Visible = true; + this.NewConnectionContextMenuItem.Visible = true; + this.NewConnectionToolStripMenuItem.Visible = true; + this.NewConnectionToolStripDropDownButton.Enabled = true; + this.ContextMenuSeparatorConnection.Visible = true; + this.DuplicateToolStripMenuItem.Visible = true; + this.DuplicateContextMenuItem.Visible = true; + } + } + + private void UpdateClipBoard() + { + bool flag = false; + if (this.IsConnected) + flag = this.CalcDataTransferEffect(this.ExtractDataObject(Clipboard.GetDataObject(), DragDropEffects.All), 0, false) != DragDropEffects.None; + this.PasteToolStripButton.Enabled = flag; + this.PasteToolStripMenuItem.Enabled = flag; + this.PasteContextMenuItem.Enabled = flag; + } + + private void EnterWaitState() + { + this.Cursor = Cursors.WaitCursor; + try + { + if (!this.TaskbarButtonCreated) + return; + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.Indeterminate); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + private void LeaveWaitState() + { + try + { + if (this.TaskbarButtonCreated) + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.NoProgress); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + this.Cursor = Cursors.Default; + } + + private void LoadBackgroundImage() + { + string settingFolder = XmlSettingManager.SettingFolder; + string[] strArray = new string[5] + { + this.pSetting.BackgroundImagePath, + settingFolder + "\\background.bmp", + settingFolder + "\\background.png", + settingFolder + "\\background.gif", + settingFolder + "\\background.jpg" + }; + Bitmap bitmap = (Bitmap) null; + int num1 = 0; + int num2 = checked (strArray.Length - 1); + int index = num1; + while (index <= num2) + { + try + { + if (System.IO.File.Exists(strArray[index])) + { + bitmap = new Bitmap(strArray[index]); + break; + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + checked { ++index; } + } + using (this.ResourceListView.BackgroundImage) + this.ResourceListView.BackgroundImage = (Image) bitmap; + } + + private void TestToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!this.IsConnected) + return; + FsTestForm fsTestForm = new FsTestForm(); + fsTestForm.Name = this.CurrentConnectionSetting.Name; + FsBase client = this.CurrentConnectionSetting.GetClient(); + client.LogMessage += new EventHandler(this.Client_OnMessage); + client.GroupName = "test"; + fsTestForm.SetClient(client, this.pCache, this.CurrentConnectionSetting.DownloadFilenameNormalization, this.CurrentConnectionSetting.UploadFilenameNormalization, this.CurrentConnectionSetting.TargetUri); + fsTestForm.SetUri(this.CurrentId.Uri); + fsTestForm.Show(); + } + + private void Application_Idle(object sender, EventArgs e) + { + if (this.needUpdateWindow) + { + this.needUpdateWindow = false; + this.UpdateWindow(); + } + lock (this.pDataObjectList) + { + CarotDAVDataObject[] array = this.pDataObjectList.ToArray(); + int num1 = 0; + int num2 = checked (array.Length - 1); + int index = num1; + while (index <= num2) + { + if (!array[index].IsInUsebymyself && Marshal.Release(Marshal.GetIUnknownForObject((object) array[index])) == 0) + this.DataObject_Release((object) array[index], EventArgs.Empty); + checked { ++index; } + } + } + } + + private void EnableDAVServer() + { + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + string product = ((AssemblyProductAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false)[0]).Product; + string str = executingAssembly.GetName().Version.ToString(3); + this.DavServer1.Setting = this.pSetting; + this.DavServer1.IpAddress = this.pSetting.ServerIP; + this.DavServer1.ServerPort = this.pSetting.ServerPort; + this.DavServer1.ServerName = product + "/" + str; + try + { + this.DavServer1.Start(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + return; + } + this.EnableWebDAVServerToolStripMenuItem.Checked = true; + if (!string.IsNullOrEmpty(this.pSetting.AutoMoundDriveLetter)) + this.MountDrive(); + if (!this.pSetting.AutoMoundWebFolder) + return; + this.MapDAVFolder(); + } + + private void DisableDAVServer() + { + if (!this.DavServer1.IsRunning) + return; + try + { + this.DavServer1.Stop(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + } + this.UnmountDrive(); + this.UnmapDAVFolder(); + this.EnableWebDAVServerToolStripMenuItem.Checked = false; + } + + private void MountDrive() + { + if ((int) this.pCurrentMountedDrive != 0) + return; + while (true) + { + char mountedDriveLetter = NetDriveManager.FindMountedDriveLetter(this.DavServer1.DavUNC); + if ((int) mountedDriveLetter != 0) + { + try + { + NetDriveManager.UnmountDrive(mountedDriveLetter); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + break; + } + } + else + break; + } + char minValue = char.MinValue; + if (this.pSetting.AutoMoundDriveLetter.Length > 1) + { + string[] logicalDrives = Environment.GetLogicalDrives(); + int num1 = 3; +label_7: + string str = Conversions.ToString(Strings.Chr(checked (num1 + 65))); + int num2 = 0; + int num3 = checked (logicalDrives.Length - 1); + int index = num2; + while (index <= num3) + { + if (Operators.CompareString(logicalDrives[index].ToUpperInvariant(), str.ToUpperInvariant() + ":\\", false) != 0) + { + checked { ++index; } + } + else + { + checked { ++num1; } + if (num1 <= 25) + goto label_7; + else + goto label_14; + } + } + minValue = str[0]; +label_14: + if ((int) minValue == 0) + return; + } + else + minValue = this.pSetting.AutoMoundDriveLetter[0]; + this.pCurrentMountedDrive = minValue; + try + { + string str1 = "@" + this.pSetting.ServerIP; + string str2 = ""; + if (this.pSetting.ServerPort != 80) + str2 = ":" + this.pSetting.ServerPort.ToString(); + NetDriveManager.MountDrive(this.pCurrentMountedDrive, this.DavServer1.DavUNC, "CarotDAV" + str1 + str2, Application.ExecutablePath, 1); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void UnmountDrive() + { + if ((int) this.pCurrentMountedDrive == 0) + return; + try + { + NetDriveManager.UnmountDrive(this.pCurrentMountedDrive); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + } + this.pCurrentMountedDrive = char.MinValue; + } + + private void MapDAVFolder() + { + if (!string.IsNullOrEmpty(this.pCurrentMappedFolder)) + return; + string str1 = "@" + this.pSetting.ServerIP; + string str2 = ""; + if (this.pSetting.ServerPort != 80) + str2 = "@" + this.pSetting.ServerPort.ToString(); + this.pCurrentMappedFolder = "CarotDAV" + str1 + str2; + try + { + NetDriveManager.MapFolder(this.DavServer1.DavUNC, this.pCurrentMappedFolder, Application.ExecutablePath, 1); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + private void UnmapDAVFolder() + { + if (string.IsNullOrEmpty(this.pCurrentMappedFolder)) + return; + try + { + NetDriveManager.UnmapFolder(this.pCurrentMappedFolder); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + } + this.pCurrentMappedFolder = (string) null; + } + + private void EnableWebDAVServerToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.DavServer1.IsRunning) + this.DisableDAVServer(); + else + this.EnableDAVServer(); + } + + private void ToolToolStripMenuItem_DropDownOpening(object sender, EventArgs e) + { + this.EnableWebDAVServerToolStripMenuItem.Checked = this.DavServer1.IsRunning; + } + + private void SettingToolStripMenuItem_Click(object sender, EventArgs e) + { + WebDAVClientSettingForm clientSettingForm = new WebDAVClientSettingForm(); + clientSettingForm.Tag = (object) this.pSetting; + if (clientSettingForm.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + if (this.DavServer1.IsRunning) + this.DisableDAVServer(); + this.pSetting = (WebDAVClientSetting) clientSettingForm.Tag; + this.SaveCurrentSetting(); + if (this.pSetting.AutoEnableDAVServer) + this.EnableDAVServer(); + this.LoadBackgroundImage(); + } + + private void ContextMenuStrip1_Opening(object sender, CancelEventArgs e) + { + if (!this.IsConnected) + return; + List resourceInfoList = new List(); + resourceInfoList.Add(this.CurrentInfo); + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedIndices.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + ResourceInfo tag = this.ResourceListView.Items[this.ResourceListView.SelectedIndices[index1]].Tag as ResourceInfo; + if (tag != null) + resourceInfoList.Add(tag); + checked { ++index1; } + } + ResourceInfo[] array = resourceInfoList.ToArray(); + FsSpecificContextMenuItem[] extensionMethod = this.CurrentConnectionSetting.GetExtensionMethod(array); + if (extensionMethod == null || extensionMethod.Length <= 0) + return; + int num3 = this.ContextMenuStrip1.Items.IndexOfKey("ToolStripSeparatorCustomMenuStart"); + int index2 = num3 >= 0 ? checked (num3 + 1) : this.ContextMenuStrip1.Items.Count; + int num4 = 0; + int num5 = checked (extensionMethod.Length - 1); + int index3 = num4; + while (index3 <= num5) + { + ToolStripButton toolStripButton = new ToolStripButton(extensionMethod[index3].Title, extensionMethod[index3].Image, new EventHandler(this.FsSpecificContextMenuItem_Click)); + toolStripButton.Tag = (object) extensionMethod[index3]; + this.ContextMenuStrip1.Items.Insert(index2, (ToolStripItem) toolStripButton); + checked { ++index2; } + checked { ++index3; } + } + ToolStripSeparator toolStripSeparator = new ToolStripSeparator(); + toolStripSeparator.Name = "ToolStripSeparatorCustomMenuEnd"; + this.ContextMenuStrip1.Items.Insert(index2, (ToolStripItem) toolStripSeparator); + this.ContextMenuStrip1.Tag = (object) array; + } + + private void ContextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e) + { + int num = this.ContextMenuStrip1.Items.IndexOfKey("ToolStripSeparatorCustomMenuStart"); + if (num < 0) + return; + while (this.ContextMenuStrip1.Items.IndexOfKey("ToolStripSeparatorCustomMenuEnd") >= 0) + { + ToolStripItem toolStripItem = this.ContextMenuStrip1.Items[checked (num + 1)]; + this.ContextMenuStrip1.Items.RemoveAt(checked (num + 1)); + toolStripItem.Dispose(); + } + } + + private void FsSpecificContextMenuItem_Click(object sender, EventArgs e) + { + FsSpecificContextMenuItem tag1 = (FsSpecificContextMenuItem) ((ToolStripItem) sender).Tag; + List resourceInfoList = new List(); + resourceInfoList.Add(this.CurrentInfo); + int num1 = 0; + int num2 = checked (this.ResourceListView.SelectedIndices.Count - 1); + int index = num1; + while (index <= num2) + { + ResourceInfo tag2 = this.ResourceListView.Items[this.ResourceListView.SelectedIndices[index]].Tag as ResourceInfo; + if (tag2 != null) + resourceInfoList.Add(tag2); + checked { ++index; } + } + try + { + if (tag1.UseWaitCursor) + this.EnterWaitState(); + tag1.Invoke((object) this, this.pFs, resourceInfoList.ToArray()); + if (!tag1.UseWaitCursor) + return; + this.LeaveWaitState(); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + if (tag1.UseWaitCursor) + this.LeaveWaitState(); + this.WriteLineLog(ex2.ToString()); + LogWriter.WriteException(ex2); + this.pFs.ResetConnection(); + int num3 = (int) MessageBox.Show("unknown error occured."); + ProjectData.ClearProjectError(); + } + } + + private delegate void Handler(); + + private delegate void WriteLineLogDel(string message); + + private class ResourceListViewItemComparer : IComparer + { + private List _ColumnIndices; + private List _IsAscendants; + + public ResourceListViewItemComparer(string sortstring) + { + this._ColumnIndices = new List(); + this._IsAscendants = new List(); + if (sortstring == null) + sortstring = ""; + string[] strArray = sortstring.Split(','); + List intList = new List(); + List boolList = new List(); + int num1 = 0; + int num2 = checked (strArray.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + bool flag = true; + if (strArray[index1].Contains("DESC")) + { + flag = false; + strArray[index1] = strArray[index1].Replace("DESC", ""); + } + strArray[index1] = strArray[index1].Trim(); + int num3 = 0; + int num4 = checked (MainForm.ResourceListViewColumnNames.Length - 1); + int index2 = num3; + while (index2 <= num4) + { + if (Operators.CompareString(strArray[index1].ToLower(), MainForm.ResourceListViewColumnNames[index2].ToLower(), false) == 0) + { + intList.Add(index2); + boolList.Add(flag); + break; + } + checked { ++index2; } + } + checked { ++index1; } + } + this._ColumnIndices = intList; + this._IsAscendants = boolList; + } + + public override string ToString() + { + List stringList = new List(); + Dictionary dictionary = new Dictionary(); + int num1 = 0; + int num2 = checked (this._ColumnIndices.Count - 1); + int index = num1; + while (index <= num2) + { + string listViewColumnName = MainForm.ResourceListViewColumnNames[this._ColumnIndices[index]]; + if (!dictionary.ContainsKey(listViewColumnName)) + { + if (this._IsAscendants[index]) + stringList.Add(listViewColumnName); + else + stringList.Add(listViewColumnName + " DESC"); + dictionary.Add(listViewColumnName, 0); + } + checked { ++index; } + } + return string.Join(",", stringList.ToArray()); + } + + public void ToggleColumn(int columnindex) + { + bool flag = true; + int index = 0; + while (index < checked (this._ColumnIndices.Count - 1)) + { + if (this._ColumnIndices[index] == columnindex) + { + flag = this._IsAscendants[index]; + if (index == 0) + flag = !flag; + this._ColumnIndices.RemoveAt(index); + this._IsAscendants.RemoveAt(index); + } + else + checked { ++index; } + } + this._ColumnIndices.Insert(0, columnindex); + this._IsAscendants.Insert(0, flag); + } + + public int Compare(object x, object y) + { + try + { + int num = 0; + ListViewItem listViewItem1 = (ListViewItem) x; + ListViewItem listViewItem2 = (ListViewItem) y; + ResourceInfo tag1 = listViewItem1.Tag as ResourceInfo; + ResourceInfo tag2 = listViewItem2.Tag as ResourceInfo; + if (tag1 != null && tag2 != null) + { + int index = 0; + while (num == 0 && index < this._ColumnIndices.Count) + { + switch (this._ColumnIndices[index]) + { + case 0: + num = !tag1.IsCollection || tag2.IsCollection ? (tag1.IsCollection || !tag2.IsCollection ? MainForm.ResourceListViewItemComparer.StrCmpLogicalW(listViewItem1.SubItems[0].Text, listViewItem2.SubItems[0].Text) : 1) : -1; + break; + case 1: + num = MainForm.ResourceListViewItemComparer.StrCmpLogicalW(listViewItem1.SubItems[1].Text, listViewItem2.SubItems[1].Text); + break; + case 2: + num = string.Compare(listViewItem1.SubItems[2].Text, listViewItem2.SubItems[2].Text, true); + break; + case 3: + num = tag1.Size.CompareTo(tag2.Size); + break; + case 4: + num = tag1.LastModifiedTime.CompareTo(tag2.LastModifiedTime); + break; + case 5: + num = tag1.CreationTime.CompareTo(tag2.CreationTime); + break; + default: + num = string.Compare(listViewItem1.SubItems[this._ColumnIndices[index]].Text, listViewItem1.SubItems[this._ColumnIndices[index]].Text, true); + break; + } + if (!this._IsAscendants[index]) + num = checked (-num); + checked { ++index; } + } + return num; + } + ConnectionSettingBase tag3 = listViewItem1.Tag as ConnectionSettingBase; + ConnectionSettingBase tag4 = listViewItem2.Tag as ConnectionSettingBase; + if (tag3 != null) + { + if (tag4 != null) + { + int index = 0; + while (num == 0 && index < this._ColumnIndices.Count) + { + switch (this._ColumnIndices[index]) + { + case 0: + num = MainForm.ResourceListViewItemComparer.StrCmpLogicalW(listViewItem1.SubItems[0].Text, listViewItem2.SubItems[0].Text); + break; + case 1: + num = MainForm.ResourceListViewItemComparer.StrCmpLogicalW(listViewItem1.SubItems[1].Text, listViewItem2.SubItems[1].Text); + break; + default: + if (listViewItem1.SubItems.Count > this._ColumnIndices[index] && listViewItem2.SubItems.Count > this._ColumnIndices[index]) + { + num = string.Compare(listViewItem1.SubItems[this._ColumnIndices[index]].Text, listViewItem1.SubItems[this._ColumnIndices[index]].Text, true); + break; + } + break; + } + if (!this._IsAscendants[index]) + num = checked (-num); + checked { ++index; } + } + return num; + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + return 0; + } + + [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] + private static extern int StrCmpLogicalW([MarshalAs(UnmanagedType.LPWStr)] string psz1, [MarshalAs(UnmanagedType.LPWStr)] string psz2); + } + + private class ExtractedData + { + public CarotDAVDataObject.InterAppDataStore InnerData; + public bool IsSameFs; + public DragDropEffects PreferEffects; + public DragDropEffects AllowedEffects; + } + + internal enum MoveCopyResultType + { + Ok, + Overwritten, + Fail, + } + } +} diff --git a/CarotDAV/MainForm.resx b/CarotDAV/MainForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/MainForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/MasterPasswordChangeForm.cs b/CarotDAV/MasterPasswordChangeForm.cs new file mode 100644 index 0000000..c6e8b91 --- /dev/null +++ b/CarotDAV/MasterPasswordChangeForm.cs @@ -0,0 +1,471 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.MasterPasswordChangeForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class MasterPasswordChangeForm : Form + { + private IContainer components; + [AccessedThroughProperty("TextBoxPassword")] + private TextBox _TextBoxPassword; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("TextBoxNew")] + private TextBox _TextBoxNew; + [AccessedThroughProperty("TextBoxConfirm")] + private TextBox _TextBoxConfirm; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("Label3")] + private Label _Label3; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("ButtonClear")] + private Button _ButtonClear; + public string MasterPassword; + + public MasterPasswordChangeForm() + { + this.Load += new EventHandler(this.MasterPasswordChangeForm_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.TextBoxPassword = new TextBox(); + this.m_CancelButton = new Button(); + this.OKButton = new Button(); + this.Label1 = new Label(); + this.TextBoxNew = new TextBox(); + this.TextBoxConfirm = new TextBox(); + this.Label2 = new Label(); + this.Label3 = new Label(); + this.Label4 = new Label(); + this.Label5 = new Label(); + this.ButtonClear = new Button(); + this.SuspendLayout(); + this.TextBoxPassword.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxPassword1 = this.TextBoxPassword; + Point point1 = new Point(64, 48); + Point point2 = point1; + textBoxPassword1.Location = point2; + this.TextBoxPassword.Name = "TextBoxPassword"; + TextBox textBoxPassword2 = this.TextBoxPassword; + Size size1 = new Size(226, 19); + Size size2 = size1; + textBoxPassword2.Size = size2; + this.TextBoxPassword.TabIndex = 3; + this.TextBoxPassword.UseSystemPasswordChar = true; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(218, 128); + Point point3 = point1; + mCancelButton1.Location = point3; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size3 = size1; + mCancelButton2.Size = size3; + this.m_CancelButton.TabIndex = 10; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + point1 = new Point(138, 128); + Point point4 = point1; + okButton1.Location = point4; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + size1 = new Size(72, 24); + Size size4 = size1; + okButton2.Size = size4; + this.OKButton.TabIndex = 9; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.Label1.AutoSize = true; + this.Label1.ForeColor = Color.Red; + Label label1_1 = this.Label1; + point1 = new Point(8, 24); + Point point5 = point1; + label1_1.Location = point5; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(50, 12); + Size size5 = size1; + label1_2.Size = size5; + this.Label1.TabIndex = 1; + this.Label1.Text = "Message"; + this.TextBoxNew.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxNew1 = this.TextBoxNew; + point1 = new Point(64, 72); + Point point6 = point1; + textBoxNew1.Location = point6; + this.TextBoxNew.Name = "TextBoxNew"; + TextBox textBoxNew2 = this.TextBoxNew; + size1 = new Size(226, 19); + Size size6 = size1; + textBoxNew2.Size = size6; + this.TextBoxNew.TabIndex = 5; + this.TextBoxNew.UseSystemPasswordChar = true; + this.TextBoxConfirm.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxConfirm1 = this.TextBoxConfirm; + point1 = new Point(64, 96); + Point point7 = point1; + textBoxConfirm1.Location = point7; + this.TextBoxConfirm.Name = "TextBoxConfirm"; + TextBox textBoxConfirm2 = this.TextBoxConfirm; + size1 = new Size(226, 19); + Size size7 = size1; + textBoxConfirm2.Size = size7; + this.TextBoxConfirm.TabIndex = 7; + this.TextBoxConfirm.UseSystemPasswordChar = true; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(8, 48); + Point point8 = point1; + label2_1.Location = point8; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(22, 12); + Size size8 = size1; + label2_2.Size = size8; + this.Label2.TabIndex = 2; + this.Label2.Text = "Old"; + this.Label3.AutoSize = true; + Label label3_1 = this.Label3; + point1 = new Point(8, 72); + Point point9 = point1; + label3_1.Location = point9; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(27, 12); + Size size9 = size1; + label3_2.Size = size9; + this.Label3.TabIndex = 4; + this.Label3.Text = "New"; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(8, 96); + Point point10 = point1; + label4_1.Location = point10; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(45, 12); + Size size10 = size1; + label4_2.Size = size10; + this.Label4.TabIndex = 6; + this.Label4.Text = "Confirm"; + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + point1 = new Point(8, 8); + Point point11 = point1; + label5_1.Location = point11; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + size1 = new Size(193, 12); + Size size11 = size1; + label5_2.Size = size11; + this.Label5.TabIndex = 0; + this.Label5.Text = "Enter Old and New Master Password"; + this.ButtonClear.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button buttonClear1 = this.ButtonClear; + point1 = new Point(58, 128); + Point point12 = point1; + buttonClear1.Location = point12; + this.ButtonClear.Name = "ButtonClear"; + Button buttonClear2 = this.ButtonClear; + size1 = new Size(72, 24); + Size size12 = size1; + buttonClear2.Size = size12; + this.ButtonClear.TabIndex = 8; + this.ButtonClear.Text = "Clear"; + this.ButtonClear.UseVisualStyleBackColor = true; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(299, 161); + this.ClientSize = size1; + this.Controls.Add((Control) this.Label5); + this.Controls.Add((Control) this.Label4); + this.Controls.Add((Control) this.Label3); + this.Controls.Add((Control) this.Label2); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.ButtonClear); + this.Controls.Add((Control) this.OKButton); + this.Controls.Add((Control) this.TextBoxConfirm); + this.Controls.Add((Control) this.TextBoxNew); + this.Controls.Add((Control) this.TextBoxPassword); + this.FormBorderStyle = FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(305, 125); + this.MinimumSize = size1; + this.Name = nameof (MasterPasswordChangeForm); + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Change Master Password"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual TextBox TextBoxPassword + { + get + { + return this._TextBoxPassword; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBoxPassword_TextChanged); + if (this._TextBoxPassword != null) + this._TextBoxPassword.TextChanged -= eventHandler; + this._TextBoxPassword = value; + if (this._TextBoxPassword == null) + return; + this._TextBoxPassword.TextChanged += eventHandler; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._m_CancelButton = value; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual TextBox TextBoxNew + { + get + { + return this._TextBoxNew; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBoxNew_TextChanged); + if (this._TextBoxNew != null) + this._TextBoxNew.TextChanged -= eventHandler; + this._TextBoxNew = value; + if (this._TextBoxNew == null) + return; + this._TextBoxNew.TextChanged += eventHandler; + } + } + + internal virtual TextBox TextBoxConfirm + { + get + { + return this._TextBoxConfirm; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBoxNew_TextChanged); + if (this._TextBoxConfirm != null) + this._TextBoxConfirm.TextChanged -= eventHandler; + this._TextBoxConfirm = value; + if (this._TextBoxConfirm == null) + return; + this._TextBoxConfirm.TextChanged += eventHandler; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual Button ButtonClear + { + get + { + return this._ButtonClear; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonClear_Click); + if (this._ButtonClear != null) + this._ButtonClear.Click -= eventHandler; + this._ButtonClear = value; + if (this._ButtonClear == null) + return; + this._ButtonClear.Click += eventHandler; + } + } + + public string NewMasterPassword + { + get + { + return this.TextBoxNew.Text; + } + set + { + this.TextBoxNew.Text = value; + } + } + + private void MasterPasswordChangeForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.security; + if (string.IsNullOrEmpty(this.MasterPassword)) + { + this.TextBoxPassword.Enabled = false; + this.OKButton.Enabled = false; + this.ButtonClear.Visible = false; + this.Label1.Text = ""; + } + else + { + this.TextBoxPassword.Enabled = !string.IsNullOrEmpty(this.MasterPassword); + this.OKButton.Enabled = false; + this.ButtonClear.Enabled = this.TextBoxPassword.Text.Length > 0; + this.ButtonClear.Visible = true; + this.Label1.Text = ""; + } + } + + private void TextBoxPassword_TextChanged(object sender, EventArgs e) + { + this.OKButton.Enabled = Operators.CompareString(this.TextBoxNew.Text, this.TextBoxConfirm.Text, false) == 0 && this.TextBoxNew.Text.Length > 0 && (string.IsNullOrEmpty(this.MasterPassword) || this.TextBoxPassword.Text.Length > 0); + this.ButtonClear.Enabled = this.TextBoxPassword.Text.Length > 0; + } + + private void TextBoxNew_TextChanged(object sender, EventArgs e) + { + this.OKButton.Enabled = Operators.CompareString(this.TextBoxNew.Text, this.TextBoxConfirm.Text, false) == 0 && this.TextBoxNew.Text.Length > 0 && (string.IsNullOrEmpty(this.MasterPassword) || this.TextBoxPassword.Text.Length > 0); + } + + private void OKButton_Click(object sender, EventArgs e) + { + if (Operators.CompareString(this.TextBoxPassword.Text, this.MasterPassword, false) == 0) + this.DialogResult = DialogResult.OK; + else + this.Label1.Text = "Enter Valid Master Password"; + } + + private void ButtonClear_Click(object sender, EventArgs e) + { + if (Operators.CompareString(this.TextBoxPassword.Text, this.MasterPassword, false) == 0) + { + this.TextBoxNew.Text = (string) null; + this.DialogResult = DialogResult.OK; + } + else + this.Label1.Text = "Enter Valid Master Password"; + } + } +} diff --git a/CarotDAV/MasterPasswordChangeForm.resx b/CarotDAV/MasterPasswordChangeForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/MasterPasswordChangeForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/MasterPasswordException.cs b/CarotDAV/MasterPasswordException.cs new file mode 100644 index 0000000..0527675 --- /dev/null +++ b/CarotDAV/MasterPasswordException.cs @@ -0,0 +1,36 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.MasterPasswordException +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System; + +namespace CarotDAV +{ + public class MasterPasswordException : Exception + { + private bool pPasswordInvalid; + + public bool PasswordInvalid + { + get + { + return this.pPasswordInvalid; + } + } + + public MasterPasswordException() + : base("Needs Master Password or Given Master Password invalid") + { + } + + public MasterPasswordException(bool passwordinvalid) + : base(Conversions.ToString(Interaction.IIf(passwordinvalid, (object) "Password invalid", (object) "Needs Master Password"))) + { + this.pPasswordInvalid = passwordinvalid; + } + } +} diff --git a/CarotDAV/MasterPasswordInputForm.cs b/CarotDAV/MasterPasswordInputForm.cs new file mode 100644 index 0000000..4a45de9 --- /dev/null +++ b/CarotDAV/MasterPasswordInputForm.cs @@ -0,0 +1,279 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.MasterPasswordInputForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class MasterPasswordInputForm : Form + { + private IContainer components; + [AccessedThroughProperty("TextBoxPassword")] + private TextBox _TextBoxPassword; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("ButtonClearAll")] + private Button _ButtonClearAll; + public bool PasswordInvalid; + + public MasterPasswordInputForm() + { + this.Load += new EventHandler(this.MasterPasswordInputForm_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.TextBoxPassword = new TextBox(); + this.m_CancelButton = new Button(); + this.OKButton = new Button(); + this.Label1 = new Label(); + this.ButtonClearAll = new Button(); + this.SuspendLayout(); + this.TextBoxPassword.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxPassword1 = this.TextBoxPassword; + Point point1 = new Point(8, 24); + Point point2 = point1; + textBoxPassword1.Location = point2; + this.TextBoxPassword.Name = "TextBoxPassword"; + TextBox textBoxPassword2 = this.TextBoxPassword; + Size size1 = new Size(283, 19); + Size size2 = size1; + textBoxPassword2.Size = size2; + this.TextBoxPassword.TabIndex = 1; + this.TextBoxPassword.UseSystemPasswordChar = true; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(218, 66); + Point point3 = point1; + mCancelButton1.Location = point3; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size3 = size1; + mCancelButton2.Size = size3; + this.m_CancelButton.TabIndex = 4; + this.m_CancelButton.Text = "Abort"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + point1 = new Point(138, 66); + Point point4 = point1; + okButton1.Location = point4; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + size1 = new Size(72, 24); + Size size4 = size1; + okButton2.Size = size4; + this.OKButton.TabIndex = 3; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.Label1.AutoSize = true; + this.Label1.ForeColor = Color.Red; + Label label1_1 = this.Label1; + point1 = new Point(8, 8); + Point point5 = point1; + label1_1.Location = point5; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(50, 12); + Size size5 = size1; + label1_2.Size = size5; + this.Label1.TabIndex = 0; + this.Label1.Text = "Message"; + this.ButtonClearAll.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button buttonClearAll1 = this.ButtonClearAll; + point1 = new Point(18, 66); + Point point6 = point1; + buttonClearAll1.Location = point6; + this.ButtonClearAll.Name = "ButtonClearAll"; + Button buttonClearAll2 = this.ButtonClearAll; + size1 = new Size(112, 24); + Size size6 = size1; + buttonClearAll2.Size = size6; + this.ButtonClearAll.TabIndex = 2; + this.ButtonClearAll.Text = "Clear All Settings"; + this.ButtonClearAll.UseVisualStyleBackColor = true; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(299, 97); + this.ClientSize = size1; + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.ButtonClearAll); + this.Controls.Add((Control) this.OKButton); + this.Controls.Add((Control) this.TextBoxPassword); + this.FormBorderStyle = FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + size1 = new Size(305, 125); + this.MaximumSize = size1; + this.MinimizeBox = false; + size1 = new Size(305, 125); + this.MinimumSize = size1; + this.Name = nameof (MasterPasswordInputForm); + this.StartPosition = FormStartPosition.CenterScreen; + this.Text = "Enter Master Password"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual TextBox TextBoxPassword + { + get + { + return this._TextBoxPassword; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBoxPassword_TextChanged); + if (this._TextBoxPassword != null) + this._TextBoxPassword.TextChanged -= eventHandler; + this._TextBoxPassword = value; + if (this._TextBoxPassword == null) + return; + this._TextBoxPassword.TextChanged += eventHandler; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._m_CancelButton = value; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual Button ButtonClearAll + { + get + { + return this._ButtonClearAll; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonClearAll_Click); + if (this._ButtonClearAll != null) + this._ButtonClearAll.Click -= eventHandler; + this._ButtonClearAll = value; + if (this._ButtonClearAll == null) + return; + this._ButtonClearAll.Click += eventHandler; + } + } + + public bool ShowClearAllButton + { + get + { + return this.ButtonClearAll.Visible; + } + set + { + this.ButtonClearAll.Visible = value; + } + } + + public string MasterPassword + { + get + { + return this.TextBoxPassword.Text; + } + set + { + this.TextBoxPassword.Text = value; + } + } + + private void MasterPasswordInputForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.security; + this.Label1.Text = !this.PasswordInvalid ? "" : "Password Invalid."; + this.OKButton.Enabled = false; + } + + private void TextBoxPassword_TextChanged(object sender, EventArgs e) + { + this.OKButton.Enabled = this.TextBoxPassword.Text.Length > 0; + } + + private void OKButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + private void ButtonClearAll_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Clear All Settings.", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) != DialogResult.OK) + return; + this.DialogResult = DialogResult.Ignore; + } + } +} diff --git a/CarotDAV/MasterPasswordInputForm.resx b/CarotDAV/MasterPasswordInputForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/MasterPasswordInputForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/Misc.cs b/CarotDAV/Misc.cs new file mode 100644 index 0000000..166aaf2 --- /dev/null +++ b/CarotDAV/Misc.cs @@ -0,0 +1,53 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.Misc +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System; +using System.Runtime.InteropServices; + +namespace CarotDAV +{ + public sealed class Misc + { + [DllImport("user32.dll")] + public static extern bool GetLastInputInfo(ref Misc.LASTINPUTINFO plii); + + public static uint GetIdleTime() + { + Misc.LASTINPUTINFO plii = new Misc.LASTINPUTINFO(); + plii.cbSize = Marshal.SizeOf((object) plii); + Misc.GetLastInputInfo(ref plii); + int tickCount = Environment.TickCount; + if (tickCount >= plii.dwTime) + return checked ((uint) ((long) tickCount - (long) plii.dwTime)); + return checked ((uint) ((long) tickCount - (long) int.MinValue + (long) int.MaxValue + 1L - (long) plii.dwTime)); + } + + public struct LASTINPUTINFO + { + [MarshalAs(UnmanagedType.U4)] + public int cbSize; + [MarshalAs(UnmanagedType.U4)] + public int dwTime; + } + + public struct WINDOWPOS + { + public IntPtr hwnd; + public IntPtr hwndInsertAfter; + public int x; + public int y; + public int cx; + public int cy; + public int flags; + } + + public enum WindowMessageType + { + WM_WINDOWPOSCHANGING = 70, + WM_WINDOWPOSCHANGED = 71, + } + } +} diff --git a/CarotDAV/My/MyApplication.cs b/CarotDAV/My/MyApplication.cs new file mode 100644 index 0000000..0f90444 --- /dev/null +++ b/CarotDAV/My/MyApplication.cs @@ -0,0 +1,51 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.My.MyApplication +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.ApplicationServices; +using System; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Windows.Forms; + +namespace CarotDAV.My +{ + [GeneratedCode("MyTemplate", "8.0.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + internal class MyApplication : WindowsFormsApplicationBase + { + [STAThread] + [EditorBrowsable(EditorBrowsableState.Advanced)] + [DebuggerHidden] + internal static void Main(string[] Args) + { + try + { + Application.SetCompatibleTextRenderingDefault(WindowsFormsApplicationBase.UseCompatibleTextRendering); + } + finally + { + } + MyProject.Application.Run(Args); + } + + [DebuggerStepThrough] + public MyApplication() + : base(AuthenticationMode.Windows) + { + this.IsSingleInstance = false; + this.EnableVisualStyles = true; + this.SaveMySettingsOnExit = false; + this.ShutdownStyle = ShutdownMode.AfterAllFormsClose; + } + + [DebuggerStepThrough] + protected override void OnCreateMainForm() + { + this.MainForm = (Form) MyProject.Forms.MainForm; + } + } +} diff --git a/CarotDAV/My/MyComputer.cs b/CarotDAV/My/MyComputer.cs new file mode 100644 index 0000000..6fe0892 --- /dev/null +++ b/CarotDAV/My/MyComputer.cs @@ -0,0 +1,24 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.My.MyComputer +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.Devices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; + +namespace CarotDAV.My +{ + [EditorBrowsable(EditorBrowsableState.Never)] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal class MyComputer : Computer + { + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public MyComputer() + { + } + } +} diff --git a/CarotDAV/My/MyProject.cs b/CarotDAV/My/MyProject.cs new file mode 100644 index 0000000..43692ef --- /dev/null +++ b/CarotDAV/My/MyProject.cs @@ -0,0 +1,491 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.My.MyProject +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.ApplicationServices; +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace CarotDAV.My +{ + [HideModuleName] + [StandardModule] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal sealed class MyProject + { + private static readonly MyProject.ThreadSafeObjectProvider m_ComputerObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_AppObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_UserObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static MyProject.ThreadSafeObjectProvider m_MyFormsObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_MyWebServicesObjectProvider = new MyProject.ThreadSafeObjectProvider(); + + [HelpKeyword("My.Computer")] + internal static MyComputer Computer + { + [DebuggerHidden] get + { + return MyProject.m_ComputerObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.Application")] + internal static MyApplication Application + { + [DebuggerHidden] get + { + return MyProject.m_AppObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.User")] + internal static User User + { + [DebuggerHidden] get + { + return MyProject.m_UserObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.Forms")] + internal static MyProject.MyForms Forms + { + [DebuggerHidden] get + { + return MyProject.m_MyFormsObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.WebServices")] + internal static MyProject.MyWebServices WebServices + { + [DebuggerHidden] get + { + return MyProject.m_MyWebServicesObjectProvider.GetInstance; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [MyGroupCollection("System.Windows.Forms.Form", "Create__Instance__", "Dispose__Instance__", "My.MyProject.Forms")] + internal sealed class MyForms + { + public AboutForm m_AboutForm; + public ConflictPromptForm m_ConflictPromptForm; + public DestinationForm m_DestinationForm; + public ErrorPromptForm m_ErrorPromptForm; + public FsTestForm m_FsTestForm; + public MainForm m_MainForm; + public MasterPasswordChangeForm m_MasterPasswordChangeForm; + public MasterPasswordInputForm m_MasterPasswordInputForm; + public NewFolderForm m_NewFolderForm; + public PropertyForm m_PropertyForm; + public ResouceListingForm m_ResouceListingForm; + public ServerCertErrorPromptForm m_ServerCertErrorPromptForm; + public UpDownForm m_UpDownForm; + public WebDAVClientSettingForm m_WebDAVClientSettingForm; + [ThreadStatic] + private static Hashtable m_FormBeingCreated; + + public AboutForm AboutForm + { + get + { + this.m_AboutForm = MyProject.MyForms.Create__Instance__(this.m_AboutForm); + return this.m_AboutForm; + } + set + { + if (value == this.m_AboutForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_AboutForm); + } + } + + public ConflictPromptForm ConflictPromptForm + { + get + { + this.m_ConflictPromptForm = MyProject.MyForms.Create__Instance__(this.m_ConflictPromptForm); + return this.m_ConflictPromptForm; + } + set + { + if (value == this.m_ConflictPromptForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_ConflictPromptForm); + } + } + + public DestinationForm DestinationForm + { + get + { + this.m_DestinationForm = MyProject.MyForms.Create__Instance__(this.m_DestinationForm); + return this.m_DestinationForm; + } + set + { + if (value == this.m_DestinationForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_DestinationForm); + } + } + + public ErrorPromptForm ErrorPromptForm + { + get + { + this.m_ErrorPromptForm = MyProject.MyForms.Create__Instance__(this.m_ErrorPromptForm); + return this.m_ErrorPromptForm; + } + set + { + if (value == this.m_ErrorPromptForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_ErrorPromptForm); + } + } + + public FsTestForm FsTestForm + { + get + { + this.m_FsTestForm = MyProject.MyForms.Create__Instance__(this.m_FsTestForm); + return this.m_FsTestForm; + } + set + { + if (value == this.m_FsTestForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_FsTestForm); + } + } + + public MainForm MainForm + { + get + { + this.m_MainForm = MyProject.MyForms.Create__Instance__(this.m_MainForm); + return this.m_MainForm; + } + set + { + if (value == this.m_MainForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_MainForm); + } + } + + public MasterPasswordChangeForm MasterPasswordChangeForm + { + get + { + this.m_MasterPasswordChangeForm = MyProject.MyForms.Create__Instance__(this.m_MasterPasswordChangeForm); + return this.m_MasterPasswordChangeForm; + } + set + { + if (value == this.m_MasterPasswordChangeForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_MasterPasswordChangeForm); + } + } + + public MasterPasswordInputForm MasterPasswordInputForm + { + get + { + this.m_MasterPasswordInputForm = MyProject.MyForms.Create__Instance__(this.m_MasterPasswordInputForm); + return this.m_MasterPasswordInputForm; + } + set + { + if (value == this.m_MasterPasswordInputForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_MasterPasswordInputForm); + } + } + + public NewFolderForm NewFolderForm + { + get + { + this.m_NewFolderForm = MyProject.MyForms.Create__Instance__(this.m_NewFolderForm); + return this.m_NewFolderForm; + } + set + { + if (value == this.m_NewFolderForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_NewFolderForm); + } + } + + public PropertyForm PropertyForm + { + get + { + this.m_PropertyForm = MyProject.MyForms.Create__Instance__(this.m_PropertyForm); + return this.m_PropertyForm; + } + set + { + if (value == this.m_PropertyForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_PropertyForm); + } + } + + public ResouceListingForm ResouceListingForm + { + get + { + this.m_ResouceListingForm = MyProject.MyForms.Create__Instance__(this.m_ResouceListingForm); + return this.m_ResouceListingForm; + } + set + { + if (value == this.m_ResouceListingForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_ResouceListingForm); + } + } + + public ServerCertErrorPromptForm ServerCertErrorPromptForm + { + get + { + this.m_ServerCertErrorPromptForm = MyProject.MyForms.Create__Instance__(this.m_ServerCertErrorPromptForm); + return this.m_ServerCertErrorPromptForm; + } + set + { + if (value == this.m_ServerCertErrorPromptForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_ServerCertErrorPromptForm); + } + } + + public UpDownForm UpDownForm + { + get + { + this.m_UpDownForm = MyProject.MyForms.Create__Instance__(this.m_UpDownForm); + return this.m_UpDownForm; + } + set + { + if (value == this.m_UpDownForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_UpDownForm); + } + } + + public WebDAVClientSettingForm WebDAVClientSettingForm + { + get + { + this.m_WebDAVClientSettingForm = MyProject.MyForms.Create__Instance__(this.m_WebDAVClientSettingForm); + return this.m_WebDAVClientSettingForm; + } + set + { + if (value == this.m_WebDAVClientSettingForm) + return; + if (value != null) + throw new ArgumentException("Property can only be set to Nothing"); + this.Dispose__Instance__(ref this.m_WebDAVClientSettingForm); + } + } + + [DebuggerHidden] + private static T Create__Instance__(T Instance) where T : Form, new() + { + if ((object) Instance != null && !Instance.IsDisposed) + return Instance; + if (MyProject.MyForms.m_FormBeingCreated != null) + { + if (MyProject.MyForms.m_FormBeingCreated.ContainsKey((object) typeof (T))) + throw new InvalidOperationException(Utils.GetResourceString("WinForms_RecursiveFormCreate", new string[0])); + } + else + MyProject.MyForms.m_FormBeingCreated = new Hashtable(); + MyProject.MyForms.m_FormBeingCreated.Add((object) typeof (T), (object) null); + try + { + return Activator.CreateInstance(); + } + catch (TargetInvocationException ex) when ( + { + // ISSUE: unable to correctly present filter + ProjectData.SetProjectError((Exception) ex); + if (ex.InnerException != null) + { + SuccessfulFiltering; + } + else + throw; + } + ) + { + throw new InvalidOperationException(Utils.GetResourceString("WinForms_SeeInnerException", new string[1] + { + ex.InnerException.Message + }), ex.InnerException); + } + finally + { + MyProject.MyForms.m_FormBeingCreated.Remove((object) typeof (T)); + } + } + + [DebuggerHidden] + private void Dispose__Instance__(ref T instance) where T : Form + { + instance.Dispose(); + instance = default (T); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public MyForms() + { + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object o) + { + return base.Equals(RuntimeHelpers.GetObjectValue(o)); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + internal new System.Type GetType() + { + return typeof (MyProject.MyForms); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override string ToString() + { + return base.ToString(); + } + } + + [MyGroupCollection("System.Web.Services.Protocols.SoapHttpClientProtocol", "Create__Instance__", "Dispose__Instance__", "")] + [EditorBrowsable(EditorBrowsableState.Never)] + internal sealed class MyWebServices + { + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object o) + { + return base.Equals(RuntimeHelpers.GetObjectValue(o)); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public override int GetHashCode() + { + return base.GetHashCode(); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + internal new System.Type GetType() + { + return typeof (MyProject.MyWebServices); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override string ToString() + { + return base.ToString(); + } + + [DebuggerHidden] + private static T Create__Instance__(T instance) where T : new() + { + if ((object) instance == null) + return Activator.CreateInstance(); + return instance; + } + + [DebuggerHidden] + private void Dispose__Instance__(ref T instance) + { + instance = default (T); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public MyWebServices() + { + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [ComVisible(false)] + internal sealed class ThreadSafeObjectProvider where T : new() + { + internal T GetInstance + { + [DebuggerHidden] get + { + if ((object) MyProject.ThreadSafeObjectProvider.m_ThreadStaticValue == null) + MyProject.ThreadSafeObjectProvider.m_ThreadStaticValue = Activator.CreateInstance(); + return MyProject.ThreadSafeObjectProvider.m_ThreadStaticValue; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public ThreadSafeObjectProvider() + { + } + } + } +} diff --git a/CarotDAV/My/MySettings.cs b/CarotDAV/My/MySettings.cs new file mode 100644 index 0000000..8c06e93 --- /dev/null +++ b/CarotDAV/My/MySettings.cs @@ -0,0 +1,68 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.My.MySettings +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.ApplicationServices; +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Configuration; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace CarotDAV.My +{ + [CompilerGenerated] + [EditorBrowsable(EditorBrowsableState.Advanced)] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed class MySettings : ApplicationSettingsBase + { + private static MySettings defaultInstance = (MySettings) SettingsBase.Synchronized((SettingsBase) new MySettings()); + private static object addedHandlerLockObject = RuntimeHelpers.GetObjectValue(new object()); + private static bool addedHandler; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + [DebuggerNonUserCode] + private static void AutoSaveSettings(object sender, EventArgs e) + { + if (!MyProject.Application.SaveMySettingsOnExit) + return; + MySettingsProperty.Settings.Save(); + } + + public static MySettings Default + { + get + { + if (!MySettings.addedHandler) + { + object handlerLockObject = MySettings.addedHandlerLockObject; + ObjectFlowControl.CheckForSyncLockOnValueType(handlerLockObject); + Monitor.Enter(handlerLockObject); + try + { + if (!MySettings.addedHandler) + { + MyProject.Application.Shutdown += (ShutdownEventHandler) ((sender, e) => + { + if (!MyProject.Application.SaveMySettingsOnExit) + return; + MySettingsProperty.Settings.Save(); + }); + MySettings.addedHandler = true; + } + } + finally + { + Monitor.Exit(handlerLockObject); + } + } + return MySettings.defaultInstance; + } + } + } +} diff --git a/CarotDAV/My/MySettingsProperty.cs b/CarotDAV/My/MySettingsProperty.cs new file mode 100644 index 0000000..ae09c0c --- /dev/null +++ b/CarotDAV/My/MySettingsProperty.cs @@ -0,0 +1,30 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.My.MySettingsProperty +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace CarotDAV.My +{ + [CompilerGenerated] + [HideModuleName] + [StandardModule] + [DebuggerNonUserCode] + internal sealed class MySettingsProperty + { + [HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} diff --git a/CarotDAV/My/Resources/Resources.cs b/CarotDAV/My/Resources/Resources.cs new file mode 100644 index 0000000..476bc30 --- /dev/null +++ b/CarotDAV/My/Resources/Resources.cs @@ -0,0 +1,365 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.My.Resources.Resources +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace CarotDAV.My.Resources +{ + [StandardModule] + [DebuggerNonUserCode] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [CompilerGenerated] + [HideModuleName] + internal sealed class Resources + { + private static ResourceManager resourceMan; + private static CultureInfo resourceCulture; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals((object) CarotDAV.My.Resources.Resources.resourceMan, (object) null)) + CarotDAV.My.Resources.Resources.resourceMan = new ResourceManager("CarotDAV.Resources", typeof (CarotDAV.My.Resources.Resources).Assembly); + return CarotDAV.My.Resources.Resources.resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get + { + return CarotDAV.My.Resources.Resources.resourceCulture; + } + set + { + CarotDAV.My.Resources.Resources.resourceCulture = value; + } + } + + internal static Icon _Error + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (_Error), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon CarotDAV + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (CarotDAV), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon CarotDrive + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (CarotDrive), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon Collection + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Collection), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Connect + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Connect), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap ConnectNew + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (ConnectNew), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Copy + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Copy), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Copy2 + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Copy2), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Cut + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Cut), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Delete + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Delete), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon Document + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Document), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon Document_Split + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Document_Split), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Download + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Download), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Export + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Export), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap FolderUpload + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (FolderUpload), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Go + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Go), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap GoToParentFolder + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (GoToParentFolder), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Help + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Help), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Home + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Home), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Import + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Import), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Lock + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Lock), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap logo_w + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (logo_w), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Move + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Move), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap MoveDown + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (MoveDown), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap MoveUp + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (MoveUp), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap NavBack + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (NavBack), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap NavForward + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (NavForward), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap NewFolder + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (NewFolder), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap OptionsHS + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (OptionsHS), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Paste + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Paste), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Properties + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Properties), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Refresh + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Refresh), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap RenameFolderHS + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (RenameFolderHS), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon security + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (security), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon Security_Overlay + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Security_Overlay), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Upload + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Upload), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap View + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (View), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Bitmap Warning + { + get + { + return (Bitmap) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Warning), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon Warning_Overlay + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(CarotDAV.My.Resources.Resources.ResourceManager.GetObject(nameof (Warning_Overlay), CarotDAV.My.Resources.Resources.resourceCulture)); + } + } + } +} diff --git a/CarotDAV/NetDriveManager.cs b/CarotDAV/NetDriveManager.cs new file mode 100644 index 0000000..7abab93 --- /dev/null +++ b/CarotDAV/NetDriveManager.cs @@ -0,0 +1,373 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.NetDriveManager +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.Win32; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class NetDriveManager + { + private const uint SHGFI_ICON = 256; + private const uint SHGFI_LARGEICON = 0; + private const uint SHGFI_SMALLICON = 1; + private const uint SHGFI_ICONLOCATION = 4096; + public const string WebClientParameterRegPath = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters"; + public const string WebClientFileSizeLimitRegKey = "FileSizeLimitInBytes"; + public const int CONNECT_UPDATE_PROFILE = 1; + public const int NO_ERROR = 0; + public const int ERROR_ACCESS_DENIED = 5; + public const int ERROR_ALREADY_ASSIGNED = 85; + public const int ERROR_BAD_DEV_TYPE = 66; + public const int ERROR_BAD_DEVICE = 1200; + public const int ERROR_BAD_NET_NAME = 67; + public const int ERROR_BAD_NETPATH = 53; + public const int ERROR_BAD_PROFILE = 1206; + public const int ERROR_BAD_PROVIDER = 1204; + public const int ERROR_BUSY = 170; + public const int ERROR_CANCELLED = 1223; + public const int ERROR_CANNOT_OPEN_PROFILE = 1205; + public const int ERROR_DEVICE_ALREADY_REMEMBERED = 1202; + public const int ERROR_EXTENDED_ERROR = 1208; + public const int ERROR_INVALID_PASSWORD = 86; + public const int ERROR_NO_NET_OR_BAD_PATH = 1203; + public const int ERROR_NOT_CONNECTED = 2250; + private const int ssfNETHOOD = 19; + + [DllImport("shell32.dll")] + private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref NetDriveManager.SHFILEINFO psfi, int cbSizeFileInfo, uint uFlags); + + [DllImport("Shell32.dll")] + private static extern void SHUpdateImage(string pszHashItem, int iIndex, int uFlags, int iImageIndex); + + [DllImport("user32.dll", SetLastError = true)] + private static extern bool DestroyIcon(IntPtr hIcon); + + [DllImport("mpr.dll")] + private static extern int WNetAddConnection2(ref NetDriveManager.NETRESOURCE netResource, string password, string Username, int Flag); + + [DllImport("mpr.dll")] + private static extern int WNetAddConnection3(IntPtr hwnd, ref NetDriveManager.NETRESOURCE netResource, string password, string Username, int Flag); + + [DllImport("mpr.dll")] + private static extern int WNetGetConnection(string localName, StringBuilder remoteName, ref int length); + + [DllImport("mpr.dll")] + private static extern int WNetCancelConnection2(string lpName, int dwFlags, bool fForce); + + public static void MountDrive(char letter, string unc, string name, string iconpath, int index) + { + int num = NetDriveManager.WNetAddConnection2(ref new NetDriveManager.NETRESOURCE() + { + dwType = NetDriveManager.ResourceType.Disk, + lpLocalName = Conversions.ToString(letter) + ":", + lpRemoteName = unc, + lpProvider = (string) null + }, "", "", 0); + if (num != 0) + throw new Exception(num.ToString()); + Registry.SetValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2\\" + unc.Replace("\\", "#"), "_LabelFromReg", (object) name); + NetDriveManager.SHFILEINFO psfi = new NetDriveManager.SHFILEINFO(); + IntPtr fileInfo = NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 4096U); + string str = ""; + int iIcon1; + int iIcon2; + if (fileInfo != IntPtr.Zero) + { + str = psfi.szDisplayName; + iIcon1 = psfi.iIcon; + if (NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 256U) != IntPtr.Zero) + { + iIcon2 = psfi.iIcon; + NetDriveManager.DestroyIcon(psfi.hIcon); + } + } + Registry.SetValue("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\Explorer.exe\\Drives\\" + Conversions.ToString(letter) + "\\DefaultIcon", (string) null, (object) (iconpath + "," + index.ToString())); + if (Operators.CompareString(str, "", false) == 0) + return; + NetDriveManager.SHUpdateImage(str, iIcon1, 0, iIcon2); + } + + public static void UnmountDrive(char letter) + { + string str = ""; + int iIcon1; + int iIcon2; + try + { + NetDriveManager.SHFILEINFO psfi = new NetDriveManager.SHFILEINFO(); + if (NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 4096U) != IntPtr.Zero) + { + str = psfi.szDisplayName; + iIcon1 = psfi.iIcon; + if (NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 256U) != IntPtr.Zero) + { + iIcon2 = psfi.iIcon; + NetDriveManager.DestroyIcon(psfi.hIcon); + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + NetDriveManager.WNetCancelConnection2(Conversions.ToString(letter) + ":", 0, true); + try + { + Registry.CurrentUser.DeleteSubKeyTree("Software\\Classes\\Applications\\Explorer.exe\\Drives\\" + Conversions.ToString(letter)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + try + { + if (Operators.CompareString(str, "", false) == 0) + return; + NetDriveManager.SHUpdateImage(str, iIcon1, 0, iIcon2); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + public static void MapFolder(string unc, string name, string iconpath, int iconindex) + { + try + { + object objectValue1 = RuntimeHelpers.GetObjectValue(Interaction.CreateObject("WScript.Shell", "")); + System.Type typeFromProgId = System.Type.GetTypeFromProgID("Shell.Application"); + object objectValue2 = RuntimeHelpers.GetObjectValue(Activator.CreateInstance(typeFromProgId)); + object objectValue3 = RuntimeHelpers.GetObjectValue(typeFromProgId.InvokeMember("Namespace", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue2), new object[1] + { + (object) 19 + })); + object objectValue4 = RuntimeHelpers.GetObjectValue(objectValue3.GetType().InvokeMember("Self", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue3), (object[]) null)); + string str = objectValue4.GetType().InvokeMember("Path", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue4), new object[0]).ToString(); + DirectoryInfo directoryInfo = new DirectoryInfo(str + "\\" + name); + if (directoryInfo.Exists) + { + directoryInfo.Attributes = FileAttributes.Directory; + directoryInfo.Delete(true); + } + directoryInfo.Create(); + object objectValue5 = RuntimeHelpers.GetObjectValue(objectValue1.GetType().InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue1), new object[1] + { + (object) (str + "\\" + name + "\\target.lnk") + })); + objectValue5.GetType().InvokeMember("TargetPath", BindingFlags.SetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue5), new object[1] + { + (object) unc + }); + objectValue5.GetType().InvokeMember("IconLocation", BindingFlags.SetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue5), new object[1] + { + (object) (iconpath + "," + iconindex.ToString()) + }); + objectValue5.GetType().InvokeMember("Save", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue5), new object[0]); + FileInfo fileInfo = new FileInfo(str + "\\" + name + "\\desktop.ini"); + using (StreamWriter streamWriter = new StreamWriter((Stream) fileInfo.Create())) + { + streamWriter.WriteLine("[.ShellClassInfo]"); + streamWriter.WriteLine("CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}"); + streamWriter.WriteLine("Flags=2"); + streamWriter.WriteLine("IconFile=" + iconpath); + streamWriter.WriteLine("IconIndex=" + Conversions.ToString(iconindex)); + streamWriter.WriteLine("IconResource=" + iconpath + "," + Conversions.ToString(iconindex)); + } + fileInfo.Attributes = FileAttributes.Hidden | FileAttributes.System; + directoryInfo.Attributes = FileAttributes.ReadOnly | FileAttributes.NotContentIndexed; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + public static void UnmapFolder(string name) + { + try + { + RuntimeHelpers.GetObjectValue(Interaction.CreateObject("WScript.Shell", "")); + System.Type typeFromProgId = System.Type.GetTypeFromProgID("Shell.Application"); + object objectValue1 = RuntimeHelpers.GetObjectValue(Activator.CreateInstance(typeFromProgId)); + object objectValue2 = RuntimeHelpers.GetObjectValue(typeFromProgId.InvokeMember("Namespace", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue1), new object[1] + { + (object) 19 + })); + object objectValue3 = RuntimeHelpers.GetObjectValue(objectValue2.GetType().InvokeMember("Self", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue2), (object[]) null)); + DirectoryInfo directoryInfo = new DirectoryInfo(objectValue3.GetType().InvokeMember("Path", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue3), new object[0]).ToString() + "\\" + name); + if (!directoryInfo.Exists) + return; + directoryInfo.Attributes = FileAttributes.Directory; + directoryInfo.Delete(true); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + public static char FindMountedDriveLetter(string unc) + { + DriveInfo[] drives = DriveInfo.GetDrives(); + int index = 0; + while (index < drives.Length) + { + DriveInfo driveInfo = drives[index]; + if (driveInfo.DriveType == DriveType.Network) + { + StringBuilder stringBuilder1 = new StringBuilder(4096); + string localName = Conversions.ToString(driveInfo.Name[0]) + ":"; + StringBuilder remoteName = stringBuilder1; + StringBuilder stringBuilder2 = stringBuilder1; + int capacity = stringBuilder2.Capacity; + int connection = NetDriveManager.WNetGetConnection(localName, remoteName, ref capacity); + stringBuilder2.Capacity = capacity; + if (connection == 0 && Operators.CompareString(stringBuilder1.ToString(), unc, false) == 0) + return driveInfo.Name[0]; + } + checked { ++index; } + } + return char.MinValue; + } + + public static long ReadMaxFileSize() + { + int integer = Conversions.ToInteger(Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters", "FileSizeLimitInBytes", (object) 50000000)); + if (integer < 0) + return checked (4294967296L + (long) integer); + return (long) integer; + } + + public static void WriteMaxFileSize(long size, IntPtr hwnd) + { + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.UseShellExecute = true; + startInfo.FileName = "reg.exe"; + startInfo.Verb = "runas"; + startInfo.Arguments = "add HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters /v FileSizeLimitInBytes /t REG_DWORD /d " + size.ToString() + " /f"; + startInfo.ErrorDialog = true; + startInfo.ErrorDialogParentHandle = hwnd; + startInfo.CreateNoWindow = true; + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + try + { + Process.Start(startInfo).WaitForExit(); + } + catch (Win32Exception ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + public static void RebootWebClient(IntPtr hwnd) + { + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.UseShellExecute = true; + startInfo.FileName = Environment.GetEnvironmentVariable("ComSpec"); + startInfo.Verb = "runas"; + startInfo.ErrorDialog = true; + startInfo.ErrorDialogParentHandle = hwnd; + startInfo.CreateNoWindow = true; + startInfo.Arguments = "/c net stop webclient & net stop mrxdav & net start mrxdav & net start webclient & pause"; + try + { + Process.Start(startInfo).WaitForExit(); + } + catch (Win32Exception ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + private struct SHFILEINFO + { + public IntPtr hIcon; + public int iIcon; + public uint dwAttributes; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string szDisplayName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] + public string szTypeName; + } + + public struct NETRESOURCE + { + public NetDriveManager.ResourceScope dwScope; + public NetDriveManager.ResourceType dwType; + public NetDriveManager.ResourceDisplayType dwDisplayType; + public NetDriveManager.ResourceUsage dwUsage; + public string lpLocalName; + public string lpRemoteName; + public string lpComment; + public string lpProvider; + } + + public enum ResourceScope : uint + { + Connected = 1, + GlobalNet = 2, + Remembered = 3, + Recent = 4, + Context = 5, + } + + public enum ResourceType : uint + { + Any = 0, + Disk = 1, + Print = 2, + Reserved = 8, + Unknown = 4294967295, + } + + public enum ResourceDisplayType : uint + { + Generic, + Domaim, + Server, + Share, + File, + Group, + Network, + Root, + ShareAdmin, + Directory, + Tree, + NDSContainer, + } + + public enum ResourceUsage : uint + { + Connectable = 1, + Container = 2, + NoLocalDevice = 4, + Sibling = 8, + Attached = 16, + All = 19, + Reserved = 2147483648, + } + } +} diff --git a/CarotDAV/NewFolderForm.cs b/CarotDAV/NewFolderForm.cs new file mode 100644 index 0000000..65fe29b --- /dev/null +++ b/CarotDAV/NewFolderForm.cs @@ -0,0 +1,206 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.NewFolderForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class NewFolderForm : Form + { + private IContainer components; + [AccessedThroughProperty("FolderNameTextBox")] + private TextBox _FolderNameTextBox; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("Label1")] + private Label _Label1; + + public NewFolderForm() + { + this.Load += new EventHandler(this.NewFolderForm_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.FolderNameTextBox = new TextBox(); + this.m_CancelButton = new Button(); + this.OKButton = new Button(); + this.Label1 = new Label(); + this.SuspendLayout(); + this.FolderNameTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox folderNameTextBox1 = this.FolderNameTextBox; + Point point1 = new Point(8, 24); + Point point2 = point1; + folderNameTextBox1.Location = point2; + this.FolderNameTextBox.Name = "FolderNameTextBox"; + TextBox folderNameTextBox2 = this.FolderNameTextBox; + Size size1 = new Size(272, 19); + Size size2 = size1; + folderNameTextBox2.Size = size2; + this.FolderNameTextBox.TabIndex = 1; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(208, 56); + Point point3 = point1; + mCancelButton1.Location = point3; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size3 = size1; + mCancelButton2.Size = size3; + this.m_CancelButton.TabIndex = 3; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + point1 = new Point(128, 56); + Point point4 = point1; + okButton1.Location = point4; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + size1 = new Size(72, 24); + Size size4 = size1; + okButton2.Size = size4; + this.OKButton.TabIndex = 2; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 8); + Point point5 = point1; + label1_1.Location = point5; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(96, 12); + Size size5 = size1; + label1_2.Size = size5; + this.Label1.TabIndex = 0; + this.Label1.Text = "New Folder Name"; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(289, 89); + this.ClientSize = size1; + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.OKButton); + this.Controls.Add((Control) this.FolderNameTextBox); + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(305, 125); + this.MinimumSize = size1; + this.Name = nameof (NewFolderForm); + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Create New Folder"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual TextBox FolderNameTextBox + { + get + { + return this._FolderNameTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._FolderNameTextBox = value; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._m_CancelButton = value; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + public string NewFolderName + { + get + { + return this.FolderNameTextBox.Text; + } + set + { + this.FolderNameTextBox.Text = value; + } + } + + private void OKButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + private void NewFolderForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + } + } +} diff --git a/CarotDAV/NewFolderForm.resx b/CarotDAV/NewFolderForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/NewFolderForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/NoEatMenuStrip.cs b/CarotDAV/NoEatMenuStrip.cs new file mode 100644 index 0000000..c6309cb --- /dev/null +++ b/CarotDAV/NoEatMenuStrip.cs @@ -0,0 +1,28 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.NoEatMenuStrip +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class NoEatMenuStrip : MenuStrip + { + private const int WM_MOUSEACTIVATE = 33; + private const int MA_ACTIVATE = 1; + private const int MA_ACTIVATEANDEAT = 2; + private const int MA_NOACTIVATE = 3; + private const int MA_NOACTIVATEANDEAT = 4; + + protected override void WndProc(ref Message m) + { + if (m.Msg == 33) + m.Result = new IntPtr(1); + else + base.WndProc(ref m); + } + } +} diff --git a/CarotDAV/NoEatToolStrip.cs b/CarotDAV/NoEatToolStrip.cs new file mode 100644 index 0000000..668ffe7 --- /dev/null +++ b/CarotDAV/NoEatToolStrip.cs @@ -0,0 +1,37 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.NoEatToolStrip +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class NoEatToolStrip : ToolStrip + { + private const int WM_MOUSEACTIVATE = 33; + private const int MA_ACTIVATE = 1; + private const int MA_ACTIVATEANDEAT = 2; + private const int MA_NOACTIVATE = 3; + private const int MA_NOACTIVATEANDEAT = 4; + + public NoEatToolStrip() + { + } + + public NoEatToolStrip(params ToolStripItem[] items) + : base(items) + { + } + + protected override void WndProc(ref Message m) + { + if (m.Msg == 33) + m.Result = new IntPtr(1); + else + base.WndProc(ref m); + } + } +} diff --git a/CarotDAV/OleStream.cs b/CarotDAV/OleStream.cs new file mode 100644 index 0000000..bf25a98 --- /dev/null +++ b/CarotDAV/OleStream.cs @@ -0,0 +1,483 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.OleStream +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace CarotDAV +{ + [ClassInterface(ClassInterfaceType.None)] + public class OleStream : IStream, IDisposable + { + private static DateTime win32timeorigin = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc); + private const int E_NOTIMPL = -2147483647; + private const int E_PENDING = -2147483638; + private const int STG_E_ACCESSDENIED = -2147287035; + private const int STG_E_INVALIDFLAG = -2147286785; + private const int S_OK = 0; + private const int S_FALSE = 1; + private const int STG_E_TERMINATED = -2147286526; + private const int STG_E_READFAULT = -2147287010; + private const int STG_E_REVERTED = -2147286782; + private const int STG_E_INVALIDPOINTER = -2147287031; + private const int STG_E_NOMOREFILES = -2147287022; + private const int STG_E_FILENOTFOUND = -2147287038; + private const int STG_E_INCOMPLETE = -2147286527; + private static int pOpenCount; + private Stream pStream; + private string pName; + private ResourceInfo pResourceInfo; + private int pSeekPointer; + private int pDisposed; + private bool pFinished; + private System.Runtime.InteropServices.ComTypes.STATSTG pStatstg; + private object pLock; + private FsBase pClient; + private ErrorPromptManager pErrorManager; + private List pClonelist; + + public static int OpenCount + { + get + { + return OleStream.pOpenCount; + } + } + + public event EventHandler ExceptionOccurred; + + public OleStream(ResourceInfo ri, string name, FsBase client, ErrorPromptManager errormanager) + { + this.pDisposed = 0; + this.pResourceInfo = ri; + this.pName = name; + this.pStream = (Stream) null; + this.pSeekPointer = 0; + this.pFinished = false; + this.pLock = RuntimeHelpers.GetObjectValue(new object()); + this.pClient = client; + this.pErrorManager = errormanager; + this.pClonelist = new List(); + this.pStatstg.type = 2; + this.pStatstg.pwcsName = this.pName; + this.pStatstg.cbSize = this.pResourceInfo.Size; + this.pStatstg.mtime = this.ToFileTime(this.pResourceInfo.LastModifiedTime); + this.pStatstg.ctime = this.ToFileTime(this.pResourceInfo.CreationTime); + this.pStatstg.atime = this.ToFileTime(this.pResourceInfo.LastAccessTime); + this.pStatstg.grfMode = 0; + this.pStatstg.grfLocksSupported = 0; + this.pStatstg.clsid = Guid.Empty; + this.pStatstg.grfStateBits = 0; + this.pStatstg.reserved = 0; + } + + public FsBase Client + { + get + { + return this.pClient; + } + } + + [DebuggerStepThrough] + public void IStreamLockRegion(long libOffset, long cb, int dwLockType) + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + [DebuggerStepThrough] + public void IStreamUnlockRegion(long libOffset, long cb, int dwLockType) + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + [DebuggerStepThrough] + public void IStreamWrite(byte[] pv, int cb, IntPtr pcbWritten) + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + [DebuggerStepThrough] + public void IStreamCommit(int grfCommitFlags) + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + [DebuggerStepThrough] + public void IStreamRevert() + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + [DebuggerStepThrough] + public void IStreamSeek(long dlibMove, int dwOrigin, IntPtr plibNewPosition) + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + [DebuggerStepThrough] + public void IStreamSetSize(long libNewSize) + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + [DebuggerStepThrough] + public void IStreamCopyTo(IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten) + { + Marshal.ThrowExceptionForHR(-2147483647); + } + + public void IStreamClone(ref IStream ppstm) + { + OleStream oleStream = new OleStream(this.pResourceInfo, this.pName, this.pClient, this.pErrorManager); + oleStream.pLock = RuntimeHelpers.GetObjectValue(this.pLock); + oleStream.ExceptionOccurredEvent = (EventHandler) this.ExceptionOccurredEvent.Clone(); + this.pClonelist.Add(oleStream); + ppstm = (IStream) oleStream; + } + + public void IStreamStat(ref System.Runtime.InteropServices.ComTypes.STATSTG statstg, int grfStatFlag) + { + switch (grfStatFlag) + { + case 0: + statstg.pwcsName = this.pStatstg.pwcsName; + goto case 1; + case 1: + statstg.type = this.pStatstg.type; + statstg.cbSize = this.pStatstg.cbSize; + statstg.mtime = this.pStatstg.mtime; + statstg.ctime = this.pStatstg.ctime; + statstg.atime = this.pStatstg.atime; + statstg.grfMode = 0; + statstg.grfLocksSupported = 0; + statstg.clsid = Guid.Empty; + statstg.grfStateBits = 0; + statstg.reserved = 0; + break; + case 2: + Marshal.ThrowExceptionForHR(-2147286785); + goto case 1; + default: + Marshal.ThrowExceptionForHR(-2147286785); + goto case 1; + } + } + + public void IStreamRead(byte[] pv, int cb, IntPtr pcbRead) + { + int num1 = 0; + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + if (this.pFinished) + { + if (!(pcbRead != IntPtr.Zero)) + return; + Marshal.WriteInt32(pcbRead, num1); + } + else + { + if (Thread.VolatileRead(ref this.pDisposed) == 1) + { + if (pcbRead != IntPtr.Zero) + Marshal.WriteInt32(pcbRead, num1); + Marshal.ThrowExceptionForHR(-2147286526); + } + int retryminutes = 1; +label_9: + while (this.pStream == null) + { + try + { + FsBase pClient = this.pClient; + ResourceId id = this.pResourceInfo.Id; + long start = 0; + long length = -1; + this.pStream = pClient.OpenRead(id, ref start, ref length); + this.pSeekPointer = 0; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + this.pStream = (Stream) null; + if (pcbRead != IntPtr.Zero) + Marshal.WriteInt32(pcbRead, num1); + ErrorAction errorAction; + if (this.pErrorManager.IgnoreAll()) + { + errorAction = ErrorAction.Ignore; + } + else + { + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during downloading file.", this.pResourceInfo.Id.ToString(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + this.pErrorManager.RegisterAction(e.Result); + errorAction = e.Result.Action; + } + switch (errorAction) + { + case ErrorAction.Ignore: + this.Dispose(); + throw new COMException("", 1); + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + continue; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + continue; + case ErrorAction.Cancel: + Marshal.ThrowExceptionForHR(-2147286526); + ProjectData.ClearProjectError(); + break; + default: + throw; + } + } + Interlocked.Increment(ref OleStream.pOpenCount); + break; + } + while (num1 < cb) + { + int num2; + try + { + num2 = this.pStream.Read(pv, num1, checked (cb - num1)); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + try + { + this.pStream.Close(); + } + catch (Exception ex3) + { + ProjectData.SetProjectError(ex3); + ProjectData.ClearProjectError(); + } + Interlocked.Decrement(ref OleStream.pOpenCount); + this.pStream = (Stream) null; + if (pcbRead != IntPtr.Zero) + Marshal.WriteInt32(pcbRead, num1); + ErrorAction errorAction; + if (this.pErrorManager.IgnoreAll()) + { + errorAction = ErrorAction.Ignore; + } + else + { + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during downloading file.", this.pResourceInfo.Id.ToString(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, ex2, retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + this.pErrorManager.RegisterAction(e.Result); + errorAction = e.Result.Action; + } + switch (errorAction) + { + case ErrorAction.Ignore: + this.Dispose(); + throw new COMException("", 1); + case ErrorAction.Retry: + ProjectData.ClearProjectError(); + goto label_9; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + ProjectData.ClearProjectError(); + goto label_9; + case ErrorAction.Cancel: + Marshal.ThrowExceptionForHR(-2147286526); + ProjectData.ClearProjectError(); + break; + default: + throw; + } + } + checked { num1 += num2; } + this.pSeekPointer = checked (this.pSeekPointer + num2); + if ((long) this.pSeekPointer != this.pStatstg.cbSize) + { + if (this.pStatstg.cbSize < 0L) + { + if (num2 == 0) + goto label_45; + } + if (num2 == 0) + { + if ((long) this.pSeekPointer < this.pStatstg.cbSize) + { + ErrorAction errorAction; + if (this.pErrorManager.IgnoreAll()) + { + errorAction = ErrorAction.Ignore; + } + else + { + ExceptionOccurredEventArgs e = new ExceptionOccurredEventArgs("Error occurred during downloading file.", this.pResourceInfo.Id.ToString(), ErrorPromptType.IgnoreAllIgnoreRetryCancel, (Exception) new IOException("unexpected close of stream"), retryminutes); + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent != null) + exceptionOccurredEvent((object) this, e); + this.pErrorManager.RegisterAction(e.Result); + errorAction = e.Result.Action; + } + switch (errorAction) + { + case ErrorAction.Ignore: + this.Dispose(); + throw new COMException("", 1); + case ErrorAction.Retry: + goto label_9; + case ErrorAction.AutoRetry: + checked { retryminutes *= 2; } + goto label_9; + case ErrorAction.Cancel: + Marshal.ThrowExceptionForHR(-2147286526); + continue; + default: + throw new Exception(); + } + } + else + { + Marshal.ThrowExceptionForHR(-2147287010); + continue; + } + } + else + continue; + } +label_45: + try + { + this.pStream.Close(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + Interlocked.Decrement(ref OleStream.pOpenCount); + this.pStream = (Stream) null; + this.pFinished = true; + break; + } + if (!(pcbRead != IntPtr.Zero)) + return; + Marshal.WriteInt32(pcbRead, num1); + } + } + finally + { + Monitor.Exit(pLock); + } + } + + protected virtual void Dispose(bool disposing) + { + if (Interlocked.CompareExchange(ref this.pDisposed, 1, 0) != 0 || !disposing) + return; + object pLock = this.pLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pLock); + Monitor.Enter(pLock); + try + { + if (this.pStream != null) + { + try + { + this.pStream.Close(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + Interlocked.Decrement(ref OleStream.pOpenCount); + this.pStream = (Stream) null; + } + List.Enumerator enumerator; + try + { + enumerator = this.pClonelist.GetEnumerator(); + while (enumerator.MoveNext()) + { + OleStream current = enumerator.Current; + try + { + current.Dispose(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + } + finally + { + enumerator.Dispose(); + } + } + finally + { + Monitor.Exit(pLock); + } + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + ~OleStream() + { + this.Dispose(false); + // ISSUE: explicit finalizer call + base.Finalize(); + } + + private System.Runtime.InteropServices.ComTypes.FILETIME ToFileTime(DateTime time) + { + byte[] bytes = BitConverter.GetBytes(DateTime.Compare(time, OleStream.win32timeorigin) >= 0 ? time.ToFileTime() : 0L); + System.Runtime.InteropServices.ComTypes.FILETIME filetime; + filetime.dwHighDateTime = BitConverter.ToInt32(bytes, 4); + filetime.dwLowDateTime = BitConverter.ToInt32(bytes, 0); + return filetime; + } + + private enum STATFLAG + { + STATFLAG_DEFAULT, + STATFLAG_NONAME, + STATFLAG_NOOPEN, + } + + [Flags] + private enum LOCKTYPE + { + LOCK_WRITE = 1, + LOCK_EXCLUSIVE = 2, + LOCK_ONLYONCE = 4, + } + } +} diff --git a/CarotDAV/OleStreamCreator.cs b/CarotDAV/OleStreamCreator.cs new file mode 100644 index 0000000..a970d56 --- /dev/null +++ b/CarotDAV/OleStreamCreator.cs @@ -0,0 +1,63 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.OleStreamCreator +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Rei.Com; +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices.ComTypes; + +namespace CarotDAV +{ + public class OleStreamCreator : IStreamCreator + { + private string pName; + private ResourceInfo pResourceInfo; + private FsBase pClient; + private ErrorPromptManager pErrorManager; + private List Streams; + + public event EventHandler ExceptionOccurred; + + public OleStreamCreator(ResourceInfo ri, string name, FsBase client, ErrorPromptManager errormanager) + { + this.Streams = new List(); + this.pResourceInfo = ri; + this.pName = name; + this.pClient = client; + this.pErrorManager = errormanager; + } + + public IStream Create() + { + OleStream oleStream = new OleStream(this.pResourceInfo, this.pName, this.pClient, this.pErrorManager); + oleStream.ExceptionOccurred += new EventHandler(this.OnExceptionOccurred); + this.Streams.Add(oleStream); + return (IStream) oleStream; + } + + public void OnExceptionOccurred(object sender, ExceptionOccurredEventArgs e) + { + EventHandler exceptionOccurredEvent = this.ExceptionOccurredEvent; + if (exceptionOccurredEvent == null) + return; + exceptionOccurredEvent(RuntimeHelpers.GetObjectValue(sender), e); + } + + public void Dispose() + { + int num1 = 0; + int num2 = checked (this.Streams.Count - 1); + int index = num1; + while (index <= num2) + { + this.Streams[index].Dispose(); + checked { ++index; } + } + } + } +} diff --git a/CarotDAV/PropertyForm.cs b/CarotDAV/PropertyForm.cs new file mode 100644 index 0000000..3925c66 --- /dev/null +++ b/CarotDAV/PropertyForm.cs @@ -0,0 +1,1099 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.PropertyForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class PropertyForm : Form + { + private IContainer components; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("TabControl1")] + private TabControl _TabControl1; + [AccessedThroughProperty("TabPage1")] + private TabPage _TabPage1; + [AccessedThroughProperty("TabPage2")] + private TabPage _TabPage2; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("LastModifiedTextBox")] + private TextBox _LastModifiedTextBox; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("CreationDateTextBox")] + private TextBox _CreationDateTextBox; + [AccessedThroughProperty("Label3")] + private Label _Label3; + [AccessedThroughProperty("SizeTextBox")] + private TextBox _SizeTextBox; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("UriTextBox")] + private TextBox _UriTextBox; + [AccessedThroughProperty("Label7")] + private Label _Label7; + [AccessedThroughProperty("ContentTypeTextBox")] + private TextBox _ContentTypeTextBox; + [AccessedThroughProperty("ElementValueTextBox")] + private TextBox _ElementValueTextBox; + [AccessedThroughProperty("ElementNameTextBox")] + private TextBox _ElementNameTextBox; + [AccessedThroughProperty("PropAddButton")] + private Button _PropAddButton; + [AccessedThroughProperty("PropDelButton")] + private Button _PropDelButton; + [AccessedThroughProperty("Label9")] + private Label _Label9; + [AccessedThroughProperty("Label10")] + private Label _Label10; + [AccessedThroughProperty("PropListView")] + private ListView _PropListView; + [AccessedThroughProperty("NameColumnHeader")] + private ColumnHeader _NameColumnHeader; + [AccessedThroughProperty("ValueColumnHeader")] + private ColumnHeader _ValueColumnHeader; + [AccessedThroughProperty("StatusColumnHeader")] + private ColumnHeader _StatusColumnHeader; + [AccessedThroughProperty("ApplyButton")] + private Button _ApplyButton; + private ResourceInfo pOriginalInfo; + private ResourceInfo pCurrentInfo; + private bool pDirty; + private ResourceId pTargetId; + private MainForm pMainForm; + + public PropertyForm() + { + this.Load += new EventHandler(this.PropertyForm_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.OKButton = new Button(); + this.m_CancelButton = new Button(); + this.TabControl1 = new TabControl(); + this.TabPage1 = new TabPage(); + this.Label7 = new Label(); + this.ContentTypeTextBox = new TextBox(); + this.Label5 = new Label(); + this.LastModifiedTextBox = new TextBox(); + this.Label4 = new Label(); + this.CreationDateTextBox = new TextBox(); + this.Label3 = new Label(); + this.SizeTextBox = new TextBox(); + this.Label2 = new Label(); + this.UriTextBox = new TextBox(); + this.TabPage2 = new TabPage(); + this.PropListView = new ListView(); + this.NameColumnHeader = new ColumnHeader(); + this.ValueColumnHeader = new ColumnHeader(); + this.StatusColumnHeader = new ColumnHeader(); + this.PropAddButton = new Button(); + this.PropDelButton = new Button(); + this.Label9 = new Label(); + this.Label10 = new Label(); + this.ElementValueTextBox = new TextBox(); + this.ElementNameTextBox = new TextBox(); + this.ApplyButton = new Button(); + this.TabControl1.SuspendLayout(); + this.TabPage1.SuspendLayout(); + this.TabPage2.SuspendLayout(); + this.SuspendLayout(); + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + Point point1 = new Point(64, 304); + Point point2 = point1; + okButton1.Location = point2; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + Size size1 = new Size(72, 24); + Size size2 = size1; + okButton2.Size = size2; + this.OKButton.TabIndex = 1; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(144, 304); + Point point3 = point1; + mCancelButton1.Location = point3; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size3 = size1; + mCancelButton2.Size = size3; + this.m_CancelButton.TabIndex = 2; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.TabControl1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.TabControl1.Controls.Add((Control) this.TabPage1); + this.TabControl1.Controls.Add((Control) this.TabPage2); + TabControl tabControl1_1 = this.TabControl1; + point1 = new Point(8, 8); + Point point4 = point1; + tabControl1_1.Location = point4; + this.TabControl1.Name = "TabControl1"; + this.TabControl1.SelectedIndex = 0; + TabControl tabControl1_2 = this.TabControl1; + size1 = new Size(288, 288); + Size size4 = size1; + tabControl1_2.Size = size4; + this.TabControl1.TabIndex = 0; + this.TabPage1.Controls.Add((Control) this.Label7); + this.TabPage1.Controls.Add((Control) this.ContentTypeTextBox); + this.TabPage1.Controls.Add((Control) this.Label5); + this.TabPage1.Controls.Add((Control) this.LastModifiedTextBox); + this.TabPage1.Controls.Add((Control) this.Label4); + this.TabPage1.Controls.Add((Control) this.CreationDateTextBox); + this.TabPage1.Controls.Add((Control) this.Label3); + this.TabPage1.Controls.Add((Control) this.SizeTextBox); + this.TabPage1.Controls.Add((Control) this.Label2); + this.TabPage1.Controls.Add((Control) this.UriTextBox); + TabPage tabPage1_1 = this.TabPage1; + point1 = new Point(4, 22); + Point point5 = point1; + tabPage1_1.Location = point5; + this.TabPage1.Name = "TabPage1"; + TabPage tabPage1_2 = this.TabPage1; + Padding padding1 = new Padding(3); + Padding padding2 = padding1; + tabPage1_2.Padding = padding2; + TabPage tabPage1_3 = this.TabPage1; + size1 = new Size(280, 262); + Size size5 = size1; + tabPage1_3.Size = size5; + this.TabPage1.TabIndex = 0; + this.TabPage1.Text = "General"; + this.TabPage1.UseVisualStyleBackColor = true; + this.Label7.AutoSize = true; + Label label7_1 = this.Label7; + point1 = new Point(16, 136); + Point point6 = point1; + label7_1.Location = point6; + this.Label7.Name = "Label7"; + Label label7_2 = this.Label7; + size1 = new Size(74, 12); + Size size6 = size1; + label7_2.Size = size6; + this.Label7.TabIndex = 10; + this.Label7.Text = "Content Type"; + this.ContentTypeTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox contentTypeTextBox1 = this.ContentTypeTextBox; + point1 = new Point(136, 136); + Point point7 = point1; + contentTypeTextBox1.Location = point7; + this.ContentTypeTextBox.Multiline = true; + this.ContentTypeTextBox.Name = "ContentTypeTextBox"; + this.ContentTypeTextBox.ReadOnly = true; + TextBox contentTypeTextBox2 = this.ContentTypeTextBox; + size1 = new Size(128, 112); + Size size7 = size1; + contentTypeTextBox2.Size = size7; + this.ContentTypeTextBox.TabIndex = 11; + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + point1 = new Point(16, 112); + Point point8 = point1; + label5_1.Location = point8; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + size1 = new Size(102, 12); + Size size8 = size1; + label5_2.Size = size8; + this.Label5.TabIndex = 8; + this.Label5.Text = "Last Modified Date"; + this.LastModifiedTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox lastModifiedTextBox1 = this.LastModifiedTextBox; + point1 = new Point(136, 112); + Point point9 = point1; + lastModifiedTextBox1.Location = point9; + this.LastModifiedTextBox.Name = "LastModifiedTextBox"; + this.LastModifiedTextBox.ReadOnly = true; + TextBox lastModifiedTextBox2 = this.LastModifiedTextBox; + size1 = new Size(128, 19); + Size size9 = size1; + lastModifiedTextBox2.Size = size9; + this.LastModifiedTextBox.TabIndex = 9; + this.LastModifiedTextBox.TextAlign = HorizontalAlignment.Right; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(16, 88); + Point point10 = point1; + label4_1.Location = point10; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(76, 12); + Size size10 = size1; + label4_2.Size = size10; + this.Label4.TabIndex = 6; + this.Label4.Text = "Creation Date"; + this.CreationDateTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox creationDateTextBox1 = this.CreationDateTextBox; + point1 = new Point(136, 88); + Point point11 = point1; + creationDateTextBox1.Location = point11; + this.CreationDateTextBox.Name = "CreationDateTextBox"; + this.CreationDateTextBox.ReadOnly = true; + TextBox creationDateTextBox2 = this.CreationDateTextBox; + size1 = new Size(128, 19); + Size size11 = size1; + creationDateTextBox2.Size = size11; + this.CreationDateTextBox.TabIndex = 7; + this.CreationDateTextBox.TextAlign = HorizontalAlignment.Right; + this.Label3.AutoSize = true; + Label label3_1 = this.Label3; + point1 = new Point(16, 64); + Point point12 = point1; + label3_1.Location = point12; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(26, 12); + Size size12 = size1; + label3_2.Size = size12; + this.Label3.TabIndex = 4; + this.Label3.Text = "Size"; + this.SizeTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox sizeTextBox1 = this.SizeTextBox; + point1 = new Point(136, 64); + Point point13 = point1; + sizeTextBox1.Location = point13; + this.SizeTextBox.Name = "SizeTextBox"; + this.SizeTextBox.ReadOnly = true; + TextBox sizeTextBox2 = this.SizeTextBox; + size1 = new Size(128, 19); + Size size13 = size1; + sizeTextBox2.Size = size13; + this.SizeTextBox.TabIndex = 5; + this.SizeTextBox.TextAlign = HorizontalAlignment.Right; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(16, 16); + Point point14 = point1; + label2_1.Location = point14; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(24, 12); + Size size14 = size1; + label2_2.Size = size14; + this.Label2.TabIndex = 0; + this.Label2.Text = "URI"; + this.UriTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox uriTextBox1 = this.UriTextBox; + point1 = new Point(136, 16); + Point point15 = point1; + uriTextBox1.Location = point15; + this.UriTextBox.Name = "UriTextBox"; + this.UriTextBox.ReadOnly = true; + TextBox uriTextBox2 = this.UriTextBox; + size1 = new Size(128, 19); + Size size15 = size1; + uriTextBox2.Size = size15; + this.UriTextBox.TabIndex = 1; + this.TabPage2.Controls.Add((Control) this.PropListView); + this.TabPage2.Controls.Add((Control) this.PropAddButton); + this.TabPage2.Controls.Add((Control) this.PropDelButton); + this.TabPage2.Controls.Add((Control) this.Label9); + this.TabPage2.Controls.Add((Control) this.Label10); + this.TabPage2.Controls.Add((Control) this.ElementValueTextBox); + this.TabPage2.Controls.Add((Control) this.ElementNameTextBox); + TabPage tabPage2_1 = this.TabPage2; + point1 = new Point(4, 22); + Point point16 = point1; + tabPage2_1.Location = point16; + this.TabPage2.Name = "TabPage2"; + TabPage tabPage2_2 = this.TabPage2; + padding1 = new Padding(3); + Padding padding3 = padding1; + tabPage2_2.Padding = padding3; + TabPage tabPage2_3 = this.TabPage2; + size1 = new Size(280, 262); + Size size16 = size1; + tabPage2_3.Size = size16; + this.TabPage2.TabIndex = 1; + this.TabPage2.Text = "Custom"; + this.TabPage2.UseVisualStyleBackColor = true; + this.PropListView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.PropListView.Columns.AddRange(new ColumnHeader[3] + { + this.NameColumnHeader, + this.ValueColumnHeader, + this.StatusColumnHeader + }); + this.PropListView.FullRowSelect = true; + ListView propListView1 = this.PropListView; + point1 = new Point(16, 120); + Point point17 = point1; + propListView1.Location = point17; + this.PropListView.MultiSelect = false; + this.PropListView.Name = "PropListView"; + ListView propListView2 = this.PropListView; + size1 = new Size(248, 128); + Size size17 = size1; + propListView2.Size = size17; + this.PropListView.TabIndex = 6; + this.PropListView.UseCompatibleStateImageBehavior = false; + this.PropListView.View = View.Details; + this.NameColumnHeader.Text = "Name"; + this.ValueColumnHeader.Text = "Value"; + this.StatusColumnHeader.Text = "Status"; + this.PropAddButton.Anchor = AnchorStyles.Top | AnchorStyles.Right; + Button propAddButton1 = this.PropAddButton; + point1 = new Point(128, 88); + Point point18 = point1; + propAddButton1.Location = point18; + this.PropAddButton.Name = "PropAddButton"; + Button propAddButton2 = this.PropAddButton; + size1 = new Size(64, 24); + Size size18 = size1; + propAddButton2.Size = size18; + this.PropAddButton.TabIndex = 4; + this.PropAddButton.Text = "Add"; + this.PropAddButton.UseVisualStyleBackColor = true; + this.PropDelButton.Anchor = AnchorStyles.Top | AnchorStyles.Right; + Button propDelButton1 = this.PropDelButton; + point1 = new Point(200, 88); + Point point19 = point1; + propDelButton1.Location = point19; + this.PropDelButton.Name = "PropDelButton"; + Button propDelButton2 = this.PropDelButton; + size1 = new Size(64, 24); + Size size19 = size1; + propDelButton2.Size = size19; + this.PropDelButton.TabIndex = 5; + this.PropDelButton.Text = "Delete"; + this.PropDelButton.UseVisualStyleBackColor = true; + this.Label9.AutoSize = true; + Label label9_1 = this.Label9; + point1 = new Point(16, 32); + Point point20 = point1; + label9_1.Location = point20; + this.Label9.Name = "Label9"; + Label label9_2 = this.Label9; + size1 = new Size(81, 12); + Size size20 = size1; + label9_2.Size = size20; + this.Label9.TabIndex = 2; + this.Label9.Text = "Property Value"; + this.Label10.AutoSize = true; + Label label10_1 = this.Label10; + point1 = new Point(16, 8); + Point point21 = point1; + label10_1.Location = point21; + this.Label10.Name = "Label10"; + Label label10_2 = this.Label10; + size1 = new Size(81, 12); + Size size21 = size1; + label10_2.Size = size21; + this.Label10.TabIndex = 0; + this.Label10.Text = "Property Name"; + this.ElementValueTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox elementValueTextBox1 = this.ElementValueTextBox; + point1 = new Point(104, 32); + Point point22 = point1; + elementValueTextBox1.Location = point22; + this.ElementValueTextBox.Multiline = true; + this.ElementValueTextBox.Name = "ElementValueTextBox"; + TextBox elementValueTextBox2 = this.ElementValueTextBox; + size1 = new Size(160, 48); + Size size22 = size1; + elementValueTextBox2.Size = size22; + this.ElementValueTextBox.TabIndex = 3; + this.ElementNameTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox elementNameTextBox1 = this.ElementNameTextBox; + point1 = new Point(104, 8); + Point point23 = point1; + elementNameTextBox1.Location = point23; + this.ElementNameTextBox.Name = "ElementNameTextBox"; + TextBox elementNameTextBox2 = this.ElementNameTextBox; + size1 = new Size(160, 19); + Size size23 = size1; + elementNameTextBox2.Size = size23; + this.ElementNameTextBox.TabIndex = 1; + this.ApplyButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.ApplyButton.DialogResult = DialogResult.Cancel; + this.ApplyButton.Enabled = false; + Button applyButton1 = this.ApplyButton; + point1 = new Point(224, 304); + Point point24 = point1; + applyButton1.Location = point24; + this.ApplyButton.Name = "ApplyButton"; + Button applyButton2 = this.ApplyButton; + size1 = new Size(72, 24); + Size size24 = size1; + applyButton2.Size = size24; + this.ApplyButton.TabIndex = 3; + this.ApplyButton.Text = "Apply"; + this.ApplyButton.UseVisualStyleBackColor = true; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(304, 336); + this.ClientSize = size1; + this.Controls.Add((Control) this.ApplyButton); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.OKButton); + this.Controls.Add((Control) this.TabControl1); + size1 = new Size(320, 373); + this.MinimumSize = size1; + this.Name = nameof (PropertyForm); + this.Text = nameof (PropertyForm); + this.TabControl1.ResumeLayout(false); + this.TabPage1.ResumeLayout(false); + this.TabPage1.PerformLayout(); + this.TabPage2.ResumeLayout(false); + this.TabPage2.PerformLayout(); + this.ResumeLayout(false); + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.m_CancelButton_Click); + if (this._m_CancelButton != null) + this._m_CancelButton.Click -= eventHandler; + this._m_CancelButton = value; + if (this._m_CancelButton == null) + return; + this._m_CancelButton.Click += eventHandler; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual TabControl TabControl1 + { + get + { + return this._TabControl1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TabControl1 = value; + } + } + + internal virtual TabPage TabPage1 + { + get + { + return this._TabPage1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TabPage1 = value; + } + } + + internal virtual TabPage TabPage2 + { + get + { + return this._TabPage2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TabPage2 = value; + } + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual TextBox LastModifiedTextBox + { + get + { + return this._LastModifiedTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._LastModifiedTextBox = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual TextBox CreationDateTextBox + { + get + { + return this._CreationDateTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CreationDateTextBox = value; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + internal virtual TextBox SizeTextBox + { + get + { + return this._SizeTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SizeTextBox = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual TextBox UriTextBox + { + get + { + return this._UriTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UriTextBox = value; + } + } + + internal virtual Label Label7 + { + get + { + return this._Label7; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label7 = value; + } + } + + internal virtual TextBox ContentTypeTextBox + { + get + { + return this._ContentTypeTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ContentTypeTextBox = value; + } + } + + internal virtual TextBox ElementValueTextBox + { + get + { + return this._ElementValueTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ElementContentTextBox_TextChanged); + if (this._ElementValueTextBox != null) + this._ElementValueTextBox.TextChanged -= eventHandler; + this._ElementValueTextBox = value; + if (this._ElementValueTextBox == null) + return; + this._ElementValueTextBox.TextChanged += eventHandler; + } + } + + internal virtual TextBox ElementNameTextBox + { + get + { + return this._ElementNameTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + CancelEventHandler cancelEventHandler = new CancelEventHandler(this.ElementNameTextBox_Validating); + EventHandler eventHandler = new EventHandler(this.ElementNameTextBox_TextChanged); + if (this._ElementNameTextBox != null) + { + this._ElementNameTextBox.Validating -= cancelEventHandler; + this._ElementNameTextBox.TextChanged -= eventHandler; + } + this._ElementNameTextBox = value; + if (this._ElementNameTextBox == null) + return; + this._ElementNameTextBox.Validating += cancelEventHandler; + this._ElementNameTextBox.TextChanged += eventHandler; + } + } + + internal virtual Button PropAddButton + { + get + { + return this._PropAddButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PropAddButton_Click); + if (this._PropAddButton != null) + this._PropAddButton.Click -= eventHandler; + this._PropAddButton = value; + if (this._PropAddButton == null) + return; + this._PropAddButton.Click += eventHandler; + } + } + + internal virtual Button PropDelButton + { + get + { + return this._PropDelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PropDelButton_Click); + if (this._PropDelButton != null) + this._PropDelButton.Click -= eventHandler; + this._PropDelButton = value; + if (this._PropDelButton == null) + return; + this._PropDelButton.Click += eventHandler; + } + } + + internal virtual Label Label9 + { + get + { + return this._Label9; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label9 = value; + } + } + + internal virtual Label Label10 + { + get + { + return this._Label10; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label10 = value; + } + } + + internal virtual ListView PropListView + { + get + { + return this._PropListView; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.PropListView_SelectedIndexChanged); + if (this._PropListView != null) + this._PropListView.SelectedIndexChanged -= eventHandler; + this._PropListView = value; + if (this._PropListView == null) + return; + this._PropListView.SelectedIndexChanged += eventHandler; + } + } + + internal virtual ColumnHeader NameColumnHeader + { + get + { + return this._NameColumnHeader; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NameColumnHeader = value; + } + } + + internal virtual ColumnHeader ValueColumnHeader + { + get + { + return this._ValueColumnHeader; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ValueColumnHeader = value; + } + } + + internal virtual ColumnHeader StatusColumnHeader + { + get + { + return this._StatusColumnHeader; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._StatusColumnHeader = value; + } + } + + internal virtual Button ApplyButton + { + get + { + return this._ApplyButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ApplyButton_Click); + if (this._ApplyButton != null) + this._ApplyButton.Click -= eventHandler; + this._ApplyButton = value; + if (this._ApplyButton == null) + return; + this._ApplyButton.Click += eventHandler; + } + } + + public event EventHandler PropertyUpdated; + + public MainForm MainForm + { + get + { + return this.pMainForm; + } + set + { + this.pMainForm = value; + } + } + + public ResourceId Target + { + get + { + return this.pTargetId; + } + set + { + this.pTargetId = value; + if (!this.IsHandleCreated) + return; + this.ReloadProperty(); + } + } + + public ResourceInfo ResourceInfo + { + get + { + return this.pOriginalInfo; + } + set + { + this.pOriginalInfo = value; + this.pCurrentInfo = this.pOriginalInfo; + this.pDirty = false; + } + } + + private void PropertyForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + if (this.pOriginalInfo == null) + this.ReloadProperty(); + else + this.RefreshProperty(); + } + + private void PropListView_SelectedIndexChanged(object sender, EventArgs e) + { + if (this.PropListView.SelectedItems.Count == 0) + { + this.UpdateWindow(); + } + else + { + if (this.PropListView.SelectedItems.Count != 1) + return; + ResourceInfo.ResourceProperty tag = (ResourceInfo.ResourceProperty) this.PropListView.SelectedItems[0].Tag; + this.ElementValueTextBox.Text = tag.Value; + this.ElementNameTextBox.Text = tag.Name; + this.UpdateWindow(); + } + } + + private void ElementNameTextBox_TextChanged(object sender, EventArgs e) + { + this.UpdateWindow(); + } + + private void ElementNameTextBox_Validating(object sender, CancelEventArgs e) + { + if (this.ElementNameTextBox.Text.Length == 0) + e.Cancel = false; + else if (this.ElementNameTextBox.Text.EndsWith(":")) + e.Cancel = true; + else if (this.ElementNameTextBox.Text.StartsWith(":")) + e.Cancel = true; + else + e.Cancel = false; + } + + private void ElementContentTextBox_TextChanged(object sender, EventArgs e) + { + this.UpdateWindow(); + } + + private void PropAddButton_Click(object sender, EventArgs e) + { + string text = this.ElementNameTextBox.Text; + int index = this.pCurrentInfo.Properties.IndexOf(text); + if (index >= 0) + { + this.pCurrentInfo.Properties[index] = new ResourceInfo.ResourceProperty(text, this.ElementValueTextBox.Text, "Changed", false); + this.pDirty = true; + this.UpdatePropList(); + } + else + { + if (this.ElementNameTextBox.Text.Length <= 0) + return; + this.pCurrentInfo.Properties.Add(text, this.ElementValueTextBox.Text, "Added", false); + this.pDirty = true; + this.UpdatePropList(); + } + } + + private void PropDelButton_Click(object sender, EventArgs e) + { + string text = this.ElementNameTextBox.Text; + if (this.pCurrentInfo.Properties.IndexOf(text) < 0) + return; + this.pCurrentInfo.Properties.Remove(text); + this.pDirty = true; + this.UpdatePropList(); + } + + private void OKButton_Click(object sender, EventArgs e) + { + if (!this.MainForm.Fs_SetResourceInfo(this.pCurrentInfo, this.pOriginalInfo)) + return; + EventHandler propertyUpdatedEvent = this.PropertyUpdatedEvent; + if (propertyUpdatedEvent != null) + propertyUpdatedEvent((object) this, EventArgs.Empty); + this.DialogResult = DialogResult.OK; + this.Close(); + } + + private void m_CancelButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + + private void ApplyButton_Click(object sender, EventArgs e) + { + if (!this.MainForm.Fs_SetResourceInfo(this.pCurrentInfo, this.pOriginalInfo)) + return; + EventHandler propertyUpdatedEvent = this.PropertyUpdatedEvent; + if (propertyUpdatedEvent != null) + propertyUpdatedEvent((object) this, EventArgs.Empty); + this.ReloadProperty(); + } + + private void UpdateWindow() + { + if (this.pCurrentInfo.CanSetInfo) + { + int index = this.pCurrentInfo.Properties.IndexOf(this.ElementNameTextBox.Text); + if (index >= 0) + { + if (Operators.CompareString(this.pCurrentInfo.Properties[index].Value, this.ElementValueTextBox.Text, false) == 0) + { + this.PropAddButton.Enabled = false; + this.PropAddButton.Text = "Update"; + } + else + { + this.PropAddButton.Enabled = true; + this.PropAddButton.Text = "Update"; + } + this.PropDelButton.Enabled = true; + } + else if (this.ElementNameTextBox.Text.Length > 0) + { + this.PropAddButton.Enabled = true; + this.PropAddButton.Text = "Add"; + this.PropDelButton.Enabled = false; + } + else + { + this.PropAddButton.Enabled = false; + this.PropAddButton.Text = "Update"; + this.PropDelButton.Enabled = false; + } + if (this.pDirty) + { + this.ApplyButton.Enabled = true; + this.OKButton.Enabled = true; + } + else + { + this.ApplyButton.Enabled = false; + this.OKButton.Enabled = false; + } + } + else + { + this.ElementNameTextBox.ReadOnly = true; + this.ElementValueTextBox.ReadOnly = true; + this.PropAddButton.Enabled = false; + this.PropDelButton.Enabled = false; + } + } + + private void UpdatePropList() + { + this.PropListView.BeginUpdate(); + this.PropListView.Items.Clear(); + List.Enumerator enumerator; + try + { + enumerator = this.pCurrentInfo.Properties.GetEnumerator(); + while (enumerator.MoveNext()) + { + ResourceInfo.ResourceProperty current = enumerator.Current; + this.PropListView.Items.Add(new ListViewItem(new string[3] + { + current.Name, + current.Value, + current.StateDescription + }) + { + Tag = (object) current + }); + } + } + finally + { + enumerator.Dispose(); + } + this.PropListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + this.PropListView.EndUpdate(); + this.UpdateWindow(); + } + + public void ReloadProperty() + { + ResourceInfo info = this.MainForm.Fs_GetInfo(this.pTargetId, false); + this.pTargetId = info.Id; + this.pOriginalInfo = info; + this.pCurrentInfo = (ResourceInfo) this.pOriginalInfo.Clone(); + this.pDirty = false; + this.RefreshProperty(); + } + + public void RefreshProperty() + { + this.Text = "Property of " + this.pOriginalInfo.Id.Uri.ToString(); + this.UriTextBox.Text = this.pOriginalInfo.Id.Uri.ToString(); + this.ContentTypeTextBox.Text = string.Join("/", this.pOriginalInfo.Types.ToArray()); + this.SizeTextBox.Text = this.pOriginalInfo.Size.ToString(); + this.CreationDateTextBox.Text = this.pOriginalInfo.CreationTime.ToString(); + this.LastModifiedTextBox.Text = this.pOriginalInfo.LastModifiedTime.ToString(); + this.UpdatePropList(); + } + } +} diff --git a/CarotDAV/PropertyForm.resx b/CarotDAV/PropertyForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/PropertyForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/ResouceListingForm.cs b/CarotDAV/ResouceListingForm.cs new file mode 100644 index 0000000..2d0f07e --- /dev/null +++ b/CarotDAV/ResouceListingForm.cs @@ -0,0 +1,456 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ResouceListingForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class ResouceListingForm : Form + { + private IContainer components; + [AccessedThroughProperty("TextBoxUri")] + private TextBox _TextBoxUri; + [AccessedThroughProperty("ButtonCancel")] + private Button _ButtonCancel; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("Label3")] + private Label _Label3; + [AccessedThroughProperty("TextBoxFiles")] + private TextBox _TextBoxFiles; + [AccessedThroughProperty("TextBoxFoldes")] + private TextBox _TextBoxFoldes; + [AccessedThroughProperty("TextBoxTotalSize")] + private TextBox _TextBoxTotalSize; + [AccessedThroughProperty("TextBoxRestFolders")] + private TextBox _TextBoxRestFolders; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("Timer1")] + private System.Windows.Forms.Timer _Timer1; + internal CarotDAVDataObject pDataObject; + public Thread Thread; + private bool pTaskbarButtonCreated; + + public ResouceListingForm() + { + this.Load += new EventHandler(this.ResouceListingForm_Load); + this.Shown += new EventHandler(this.ListingResoucesForm_Shown); + this.pTaskbarButtonCreated = false; + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + this.TextBoxUri = new TextBox(); + this.ButtonCancel = new Button(); + this.Label1 = new Label(); + this.Label2 = new Label(); + this.Label3 = new Label(); + this.TextBoxFiles = new TextBox(); + this.TextBoxFoldes = new TextBox(); + this.TextBoxTotalSize = new TextBox(); + this.TextBoxRestFolders = new TextBox(); + this.Label4 = new Label(); + this.Timer1 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + this.TextBoxUri.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxUri1 = this.TextBoxUri; + Point point1 = new Point(8, 8); + Point point2 = point1; + textBoxUri1.Location = point2; + this.TextBoxUri.Multiline = true; + this.TextBoxUri.Name = "TextBoxUri"; + this.TextBoxUri.ReadOnly = true; + TextBox textBoxUri2 = this.TextBoxUri; + Size size1 = new Size(240, 19); + Size size2 = size1; + textBoxUri2.Size = size2; + this.TextBoxUri.TabIndex = 1; + this.ButtonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.ButtonCancel.DialogResult = DialogResult.Cancel; + Button buttonCancel1 = this.ButtonCancel; + point1 = new Point(176, 136); + Point point3 = point1; + buttonCancel1.Location = point3; + this.ButtonCancel.Name = "ButtonCancel"; + Button buttonCancel2 = this.ButtonCancel; + size1 = new Size(72, 24); + Size size3 = size1; + buttonCancel2.Size = size3; + this.ButtonCancel.TabIndex = 2; + this.ButtonCancel.Text = "Cancel"; + this.ButtonCancel.UseVisualStyleBackColor = true; + this.Label1.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + Label label1_1 = this.Label1; + point1 = new Point(8, 40); + Point point4 = point1; + label1_1.Location = point4; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(80, 16); + Size size4 = size1; + label1_2.Size = size4; + this.Label1.TabIndex = 3; + this.Label1.Text = "Files:"; + this.Label1.TextAlign = ContentAlignment.MiddleRight; + this.Label2.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + Label label2_1 = this.Label2; + point1 = new Point(8, 64); + Point point5 = point1; + label2_1.Location = point5; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(80, 16); + Size size5 = size1; + label2_2.Size = size5; + this.Label2.TabIndex = 4; + this.Label2.Text = "Folders:"; + this.Label2.TextAlign = ContentAlignment.MiddleRight; + this.Label3.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + Label label3_1 = this.Label3; + point1 = new Point(8, 88); + Point point6 = point1; + label3_1.Location = point6; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(80, 16); + Size size6 = size1; + label3_2.Size = size6; + this.Label3.TabIndex = 5; + this.Label3.Text = "Total Size:"; + this.Label3.TextAlign = ContentAlignment.MiddleRight; + this.TextBoxFiles.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxFiles1 = this.TextBoxFiles; + point1 = new Point(88, 40); + Point point7 = point1; + textBoxFiles1.Location = point7; + this.TextBoxFiles.Name = "TextBoxFiles"; + this.TextBoxFiles.ReadOnly = true; + TextBox textBoxFiles2 = this.TextBoxFiles; + size1 = new Size(160, 19); + Size size7 = size1; + textBoxFiles2.Size = size7; + this.TextBoxFiles.TabIndex = 6; + this.TextBoxFoldes.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxFoldes1 = this.TextBoxFoldes; + point1 = new Point(88, 64); + Point point8 = point1; + textBoxFoldes1.Location = point8; + this.TextBoxFoldes.Name = "TextBoxFoldes"; + this.TextBoxFoldes.ReadOnly = true; + TextBox textBoxFoldes2 = this.TextBoxFoldes; + size1 = new Size(160, 19); + Size size8 = size1; + textBoxFoldes2.Size = size8; + this.TextBoxFoldes.TabIndex = 7; + this.TextBoxTotalSize.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxTotalSize1 = this.TextBoxTotalSize; + point1 = new Point(88, 88); + Point point9 = point1; + textBoxTotalSize1.Location = point9; + this.TextBoxTotalSize.Name = "TextBoxTotalSize"; + this.TextBoxTotalSize.ReadOnly = true; + TextBox textBoxTotalSize2 = this.TextBoxTotalSize; + size1 = new Size(160, 19); + Size size9 = size1; + textBoxTotalSize2.Size = size9; + this.TextBoxTotalSize.TabIndex = 8; + this.TextBoxRestFolders.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxRestFolders1 = this.TextBoxRestFolders; + point1 = new Point(88, 112); + Point point10 = point1; + textBoxRestFolders1.Location = point10; + this.TextBoxRestFolders.Name = "TextBoxRestFolders"; + this.TextBoxRestFolders.ReadOnly = true; + TextBox textBoxRestFolders2 = this.TextBoxRestFolders; + size1 = new Size(160, 19); + Size size10 = size1; + textBoxRestFolders2.Size = size10; + this.TextBoxRestFolders.TabIndex = 10; + this.Label4.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + Label label4_1 = this.Label4; + point1 = new Point(8, 112); + Point point11 = point1; + label4_1.Location = point11; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(80, 16); + Size size11 = size1; + label4_2.Size = size11; + this.Label4.TabIndex = 9; + this.Label4.Text = "Rest Folders:"; + this.Label4.TextAlign = ContentAlignment.MiddleRight; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.ButtonCancel; + size1 = new Size(257, 169); + this.ClientSize = size1; + this.Controls.Add((Control) this.TextBoxRestFolders); + this.Controls.Add((Control) this.Label4); + this.Controls.Add((Control) this.TextBoxTotalSize); + this.Controls.Add((Control) this.TextBoxFoldes); + this.Controls.Add((Control) this.TextBoxFiles); + this.Controls.Add((Control) this.Label3); + this.Controls.Add((Control) this.Label2); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.ButtonCancel); + this.Controls.Add((Control) this.TextBoxUri); + this.Cursor = Cursors.WaitCursor; + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(273, 207); + this.MinimumSize = size1; + this.Name = nameof (ResouceListingForm); + this.StartPosition = FormStartPosition.CenterScreen; + this.Text = "Listing Resources"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual TextBox TextBoxUri + { + get + { + return this._TextBoxUri; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxUri = value; + } + } + + internal virtual Button ButtonCancel + { + get + { + return this._ButtonCancel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonCancel_Click); + if (this._ButtonCancel != null) + this._ButtonCancel.Click -= eventHandler; + this._ButtonCancel = value; + if (this._ButtonCancel == null) + return; + this._ButtonCancel.Click += eventHandler; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + internal virtual TextBox TextBoxFiles + { + get + { + return this._TextBoxFiles; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxFiles = value; + } + } + + internal virtual TextBox TextBoxFoldes + { + get + { + return this._TextBoxFoldes; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxFoldes = value; + } + } + + internal virtual TextBox TextBoxTotalSize + { + get + { + return this._TextBoxTotalSize; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxTotalSize = value; + } + } + + internal virtual TextBox TextBoxRestFolders + { + get + { + return this._TextBoxRestFolders; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxRestFolders = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual System.Windows.Forms.Timer Timer1 + { + get + { + return this._Timer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.Timer1_Tick); + if (this._Timer1 != null) + this._Timer1.Tick -= eventHandler; + this._Timer1 = value; + if (this._Timer1 == null) + return; + this._Timer1.Tick += eventHandler; + } + } + + protected override void WndProc(ref Message m) + { + if (m.Msg == TaskbarManager.TaskbarButtonCreatedMessage) + this.pTaskbarButtonCreated = true; + base.WndProc(ref m); + } + + public bool TaskbarButtonCreated + { + get + { + return this.pTaskbarButtonCreated; + } + } + + private void ListingResoucesForm_Shown(object sender, EventArgs e) + { + this.Activate(); + this.Timer1.Interval = 200; + this.Timer1.Start(); + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + + private void EnterWaitState() + { + Cursor.Current = Cursors.WaitCursor; + if (!this.TaskbarButtonCreated) + return; + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.Indeterminate); + } + + private void LeaveWaitState() + { + if (this.TaskbarButtonCreated) + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.NoProgress); + Cursor.Current = Cursors.Default; + } + + private void Timer1_Tick(object sender, EventArgs e) + { + object syncobject = this.pDataObject.syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this.TextBoxUri.Text = this.pDataObject.targetid.ToString(); + } + finally + { + Monitor.Exit(syncobject); + } + this.TextBoxFiles.Text = this.pDataObject.files.ToString("#,0"); + this.TextBoxFoldes.Text = this.pDataObject.folders.ToString("#,0"); + this.TextBoxRestFolders.Text = this.pDataObject.restfolders.ToString("#,0"); + this.TextBoxTotalSize.Text = Interlocked.Read(ref this.pDataObject.sizes).ToString("#,0"); + if (this.Thread.IsAlive) + return; + this.DialogResult = DialogResult.OK; + this.Close(); + } + + private void ResouceListingForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + } + } +} diff --git a/CarotDAV/ResouceListingForm.resx b/CarotDAV/ResouceListingForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/ResouceListingForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/ResourceChangedEventArgs.cs b/CarotDAV/ResourceChangedEventArgs.cs new file mode 100644 index 0000000..8c0702e --- /dev/null +++ b/CarotDAV/ResourceChangedEventArgs.cs @@ -0,0 +1,53 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ResourceChangedEventArgs +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Rei.Fs; +using System; + +namespace CarotDAV +{ + public class ResourceChangedEventArgs : EventArgs + { + private ResourceChangedEventArgs.ChangeType _type; + private ReturnedInfo _re; + + public ResourceChangedEventArgs(ReturnedInfo re) + { + this._type = ResourceChangedEventArgs.ChangeType.PropertyUpdate; + this._re = re; + } + + public ResourceChangedEventArgs(ReturnedInfo re, ResourceChangedEventArgs.ChangeType type) + { + this._re = re; + this._type = type; + } + + public ReturnedInfo ReturnedInfo + { + get + { + return this._re; + } + } + + public ResourceChangedEventArgs.ChangeType Type + { + get + { + return this._type; + } + } + + public enum ChangeType + { + Create, + Delete, + PropertyChange, + PropertyUpdate, + } + } +} diff --git a/CarotDAV/Resources.resx b/CarotDAV/Resources.resx new file mode 100644 index 0000000..dadd66a --- /dev/null +++ b/CarotDAV/Resources.resx @@ -0,0 +1,9175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAkAEBAQAAEABAAoAQAAlgAAACAgEAABAAQA6AIAAL4BAAAwMBAAAQAEAGgGAACmBAAAEBAAAAEA + CABoBQAADgsAACAgAAABAAgAqAgAAHYQAAAwMAAAAQAIAKgOAAAeGQAAEBAAAAEAIABoBAAAxicAACAg + AAABACAAqBAAAC4sAAAwMAAAAQAgAKglAADWPAAAKAAAABAAAAAgAAAAAQAEAAAAAADAAAAAAAAAAAAA + AAAAAAAAAAAAAACAAAAAAAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A + /wD//wAA////AP///wAREREXERERESqneqERERERGqqqpxERERESoioRERERERGhGnERERERESqhERER + ERERGqcRERERERESIRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + EREREREREREREREREREREREREREREYD///8A////gP///4H////B////w////+P////n//////////// + //////////////////////////////////8oAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAAAAAAAAAA + AAAAAAAAAIAAAAAAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP// + AAD///8A////ABF3d3d3d3dxERERERERERESERERERERdxERERERERERKqqqqqqqqhcRERERERERESqq + qnF6qqoXEREREREREREqqqpxeqqqEREREREREREREqqqqqqqoXERERERERERERKqqqGqqqERERERERER + ERERKqohKqoXERERERERERERESqqERqqERERERERERERERESqhEaoXEREREREREREREREqoRGqERERER + EREREREREREqoaoXERERERERERERERERKqqqERERERERERERERERERKqoXERERERERERERERERESqqER + ERERERERERERERERESIhERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERwAH//4AA//8AAP//AAD//wAB + //+AAf//gAP//8AD///AB///4Af//+AP///wD///8B////gf///4P////H////////////////////// + //////////////////////////////////////////////////////////////////8oAAAAMAAAAGAA + AAABAAQAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICA + gAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAABERd3d3d3d3d3d3cRERERERERERERERERER + ERERERERERF3dxERERERERERERERERKqqqqqqqqqqqoXdxERERERERERERERESqqqqqqqqqqqqphdxER + ERERERERERERESqqqqqqYWqqqqqhcRERERERERERERERESqqqqqqERqqqqphcRERERERERERERERERKq + qqqqERqqqqoXcRERERERERERERERERGqqqqqqqqqqqp3ERERERERERERERERERGqqqqqqqqqqqZ3ERER + EREREREREREREREqqqqqZqqqqqFxERERERERERERERERERESqqqqEaqqqhcRERERERERERERERERERES + qqqmEWqqphcRERERERERERERERERERERKqqiERqqoXcRERERERERERERERERERERGqqhERqqp3ERERER + ERERERERERERERERGqqhERqqZ3EREREREREREREREREREREREqqhERqqFxERERERERERERERERERERER + ESqmEWqhcRERERERERERERERERERERERESqqqqphcRERERERERERERERERERERERERKqqqoXcRERERER + ERERERERERERERERERGqqqp3ERERERERERERERERERERERERERGqqqZ3ERERERERERERERERERERERER + EREqqqFxERERERERERERERERERERERERERESphERERERERERERERERERERERERERERERIhERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREfAAAf//////wAAA//// + //+AAAD//////wAAAP//////AAAB//////8AAAH//////4AAAf//////wAAD///////AAAP//////8AA + B///////4AAP///////gAA////////AAD///////+AAf///////4AB////////gAP////////AB///// + ///8AH////////4Af////////wD/////////AP////////8B/////////4f/////////z/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAD/8/8AMixAABMH + DwAZBxEAPhstAAIAAQAkAhAAGgIMADoFGwA4BxsANAgaAFQsPQBmN0sAEAEHADkEGQA2BBgANAQXADkF + GgArBBMAPQoeAAYBAwBIFSkA4KvAABcCCgAKAgUAckFTALqGmABVSEsAShAZAJdvdACUYGUAbi0sAGIw + MABdOjoAYR0bAGcjIQBrJSMAaygmAG0rKQBmKScAbi0rAG8uLABwMS8AZS0sAHM0MwB6Pz0AfEFAAH5E + QgCBSEYAhlFPAIxYVgCngH8ArYmIAAAAAAAAAAAAt5eWAKJ5dwBqIxwAwq6oAKrNmgAAAAAAJtnGABX/ + 8QBsenkABfLuAADx8wAA6+0AAfn6AAH2+AAB9PQAA/7+AAX+/wAJ//8ADv//ABH//wAW//8AGf//ABjp + 6wAY19cAHf//ACH9/wAh//8AIv//ABy7vQAm//8ASv//AHbX1wAA7fEAAOnxAADl7gAA5eoAAOHpAAH4 + /wAB8vgAAe31AAP5/gAF4OYABvr/AAf1/gAI9v8ACvv/AA75/wAR+v8AF/v/ACL6/wAk+f8AAOLxAADl + 8QAA3uoAAe74AAHq+AAB6vUAAeb1AAHi7gAF8v8ABdrlAAjx/wAO8v8ADdTfAA/1/wAV8/8AHPH/ACH2 + /wAA6/8AAN7xAADa6gAB5fgAAeP4AAHi9QAB3u4AAdruAALr/wAC7f8ABur/AAbu/gAHvMoAC+z/ABDu + /wAa7P8AAOn/AADm/wAA5f8AANrxAADW7wAA1eoAANHpAADQ5wAB3vUAAun/AALm/wAD5f8ABOL7AAXk + /wAG5PsABtDmAArp/wAO6f8AEur/ACShrQAvjJYAAOL/AADe/wAA4f8AANLyAADV8QAA0e4AAM7qAAHa + 9QAB1vUAAt//AALZ+QAG4f4ACeT/AArE3wAN4P8AC7zSABLk/wAA3f8AANr/AADZ/wAA0/UAAM7yAADK + 7wAAzu4AAMnrAADF6QAC3P8AA9j/AAPW+gAE3P8ABsfoAAfe/wAHweIACNr/AArd/wAKutoAD6jEAADV + /wAA1/8AANP/AADK8QAAxvAAAMXuAADC6AAAvucAAcz4AAHN9QAC0v8AAtH4AAPV/wAEzfkABtX/AAbQ + +gAJ1/8AC6G+ABCFmwAUiqEAE11rAADB7AAAv+kAALvlAAC44gAAtd8AALLbAACv1wAArdYAAKvVAACs + 1QAAqNEAAKbOAACjywAApMsAAcv4AALJ9gAE0f4AE6zOADh2hQATd5IANHyPACByiwApfpgAKXyWACl6 + lAAuiKMAEjZCACl5lAAmWW0AQWNxAElziABLVl4ADxUbABMeKgALDxQAAAAAAP///wAAAAAANfL19fLy + 8S81NTU1NTU1NczHxwbHx9I4NTU1NTU1NTU1nbKysr+1NTU1NTU1NTU1NaagAaCrODU1NTU1NTU1NTU1 + Zg+DfDU1NTU1NTU1NTU1NWwUSzM1NTU1NTU1NTU1NTU1TFc1NTU1NTU1NTU1NTU1NUM1NTU1NTU1NTU1 + NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1 + NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1 + NTU1NTU1NTU1NYD///8A////gf///4H////D////w////+f////v//////////////////////////// + //////////////////8oAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAPjpOADIs + QAD/8/8AEwcPABkHEQA+Gy0AAgABACQCEAAaAgwAOgUbADgHGwA0CBoAVCw9AGY3SwAQAQcAOQQZADYE + GAA0BBcAOQUaACsEEwA9Ch4ABgEDAEgVKQDgq8AAFwIKAAoCBQByQVMAuoaYAFVISwBKEBkAl290AJRg + ZQBuLSwAYjAwAF06OgBhHRsAZyMhAGslIwBrKCYAbSspAGYpJwBuLSsAby4sAHAxLwBlLSwAczQzAHo/ + PQB8QUAAfkRCAIFIRgCGUU8AjFhWAKeAfwCtiYgAAAAAAAAAAAC3l5YAonl3AGojHADCrqgAqs2aAAAA + AAAm2cYAFf/xAGx6eQAF8u4AAPHzAADr7QAB+foAAfb4AAH09AAD/v4ABf7/AAn//wAO//8AEf//ABb/ + /wAZ//8AGOnrABjX1wAd//8AIf3/ACH//wAi//8AHLu9ACb//wBK//8AdtfXAADt8QAA6fEAAOXuAADl + 6gAA4ekAAfj/AAHy+AAB7fUAA/n+AAXg5gAG+v8AB/X+AAj2/wAK+/8ADvn/ABH6/wAX+/8AIvr/ACT5 + /wAA4vEAAOXxAADe6gAB7vgAAer4AAHq9QAB5vUAAeLuAAXy/wAF2uUACPH/AA7y/wAN1N8AD/X/ABXz + /wAc8f8AIfb/AADr/wAA3vEAANrqAAHl+AAB4/gAAeL1AAHe7gAB2u4AAuv/AALt/wAG6v8ABu7+AAe8 + ygAL7P8AEO7/ABrs/wAA6f8AAOb/AADl/wAA2vEAANbvAADV6gAA0ekAANDnAAHe9QAC6f8AAub/AAPl + /wAE4vsABeT/AAbk+wAG0OYACun/AA7p/wAS6v8AJKGtAC+MlgAA4v8AAN7/AADh/wAA0vIAANXxAADR + 7gAAzuoAAdr1AAHW9QAC3/8AAtn5AAbh/gAJ5P8ACsTfAA3g/wALvNIAEuT/AADd/wAA2v8AANn/AADT + 9QAAzvIAAMrvAADO7gAAyesAAMXpAALc/wAD2P8AA9b6AATc/wAGx+gAB97/AAfB4gAI2v8ACt3/AAq6 + 2gAPqMQAANX/AADX/wAA0/8AAMrxAADG8AAAxe4AAMLoAAC+5wABzPgAAc31AALS/wAC0fgAA9X/AATN + +QAG1f8ABtD6AAnX/wALob4AEIWbABSKoQATXWsAAMHsAAC/6QAAu+UAALjiAAC13wAAstsAAK/XAACt + 1gAAq9UAAKzVAACo0QAAps4AAKPLAACkywABy/gAAsn2AATR/gATrM4AOHaFABN3kgA0fI8AIHKLACl+ + mAApfJYAKXqUAC6IowASNkIAKXmUACZZbQBBY3EASXOIAEtWXgAPFRsAEx4qAAsPFAAAAAAA////ADY2 + ICEhISEhISEhISEhOjY2NjY2NjY2NjY2NjY2NjY2NuLf39/f3unL39/f397QOjY2NjY2NjY2NjY2NjY2 + NjY23tTGxsaNDheOxsbG1MYtNjY2NjY2NjY2NjY2NjY2NjawycDIxow2E4XGxp7O7TY2NjY2NjY2NjY2 + NjY2NjY2Nja6nrSzonx8s7PGVaE6NjY2NjY2NjY2NjY2NjY2NjY2Nq6knLKivaKismi97zY2NjY2NjY2 + NjY2NjY2NjY2NjY2NrmKoY7w5o6jaIw6NjY2NjY2NjY2NjY2NjY2NjY2NjY2ro+Ghfz3jHiioDY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2kWdHBwxdU4U6NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ3b0cYD0d8nzY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ+SxUTUF06NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NlxdYEld + nzY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NltLVUcjNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + W2hKVDY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2RUcwNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjbAAf//gAD//4AA//+AAf//wAH//8AD///gA///4Af///AH///wD///+A////gf///8H////D////4/ + //////////////////////////////////////////////////////////////////////////////// + /////////////ygAAAAwAAAAYAAAAAEACAAAAAAAgAoAAAAAAAAAAAAAAAAAAAAAAAA+Ok4AMixAAP/z + /wATBw8AGQcRAD4bLQACAAEAJAIQABoCDAA6BRsAOAcbADQIGgBULD0AZjdLABABBwA5BBkANgQYADQE + FwA5BRoAKwQTAD0KHgAGAQMASBUpAOCrwAAXAgoACgIFAHJBUwC6hpgAVUhLAEoQGQCXb3QAlGBlAG4t + LABiMDAAXTo6AGEdGwBnIyEAayUjAGsoJgBtKykAZiknAG4tKwBvLiwAcDEvAGUtLABzNDMAej89AHxB + QAB+REIAgUhGAIZRTwCMWFYAp4B/AK2JiAAAAAAAAAAAALeXlgCieXcAaiMcAMKuqACqzZoAAAAAACbZ + xgAV//EAbHp5AAXy7gAA8fMAAOvtAAH5+gAB9vgAAfT0AAP+/gAF/v8ACf//AA7//wAR//8AFv//ABn/ + /wAY6esAGNfXAB3//wAh/f8AIf//ACL//wAcu70AJv//AEr//wB219cAAO3xAADp8QAA5e4AAOXqAADh + 6QAB+P8AAfL4AAHt9QAD+f4ABeDmAAb6/wAH9f4ACPb/AAr7/wAO+f8AEfr/ABf7/wAi+v8AJPn/AADi + 8QAA5fEAAN7qAAHu+AAB6vgAAer1AAHm9QAB4u4ABfL/AAXa5QAI8f8ADvL/AA3U3wAP9f8AFfP/ABzx + /wAh9v8AAOv/AADe8QAA2uoAAeX4AAHj+AAB4vUAAd7uAAHa7gAC6/8AAu3/AAbq/wAG7v4AB7zKAAvs + /wAQ7v8AGuz/AADp/wAA5v8AAOX/AADa8QAA1u8AANXqAADR6QAA0OcAAd71AALp/wAC5v8AA+X/AATi + +wAF5P8ABuT7AAbQ5gAK6f8ADun/ABLq/wAkoa0AL4yWAADi/wAA3v8AAOH/AADS8gAA1fEAANHuAADO + 6gAB2vUAAdb1AALf/wAC2fkABuH+AAnk/wAKxN8ADeD/AAu80gAS5P8AAN3/AADa/wAA2f8AANP1AADO + 8gAAyu8AAM7uAADJ6wAAxekAAtz/AAPY/wAD1voABNz/AAbH6AAH3v8AB8HiAAja/wAK3f8ACrraAA+o + xAAA1f8AANf/AADT/wAAyvEAAMbwAADF7gAAwugAAL7nAAHM+AABzfUAAtL/AALR+AAD1f8ABM35AAbV + /wAG0PoACdf/AAuhvgAQhZsAFIqhABNdawAAwewAAL/pAAC75QAAuOIAALXfAACy2wAAr9cAAK3WAACr + 1QAArNUAAKjRAACmzgAAo8sAAKTLAAHL+AACyfYABNH+ABOszgA4doUAE3eSADR8jwAgcosAKX6YACl8 + lgApepQALoijABI2QgApeZQAJlltAEFjcQBJc4gAS1ZeAA8VGwATHioACw8UAAAAAAD///8ANjY2NTQ0 + NDQ0NDQ0NDQ0NDQ0NDQ0NTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Njb09vPz9vbz9vbz9vP29vPz + 8/L6JDA2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NuHi5OTk5OTk5OTk5OTk5OTk4uHg+ic2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2Pt7c6enO6enp6QUe6enp6c7pzsvcny42NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2Ns3KwsjIyMjIAwcXHsjIyMjIr9PLHDk2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NszLr7zG + xsbG9TYRAcbGxsa8esnKLTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nsy60a3HtMe0xwQIx7THtMee + w7ftOTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nja5tp6+s7Ozs7Ozs7Ozs8BVtbYtNjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2Nja5uamdsrKysrLFsrKysnnApO05NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2p6admaOjo9n3o6OjmVGppS02NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2p6eo + iaGhoQEFoaGhdqyl7Tk2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NpOQdpaOjhMcjo6WUKiQ + KzY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NpKRmnWNjBMajI12eY+gOTY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjaRfWd8iBAM2IRSgH0rNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjZ+fodk9RMJAWZMa6A0NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + fmtL/QgPD1Jvayk2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2bW112hUO90xsnzQ2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NlxZS3SIUm5ZJzY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NlxbY0lJTFifHjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjZbWE1VXlgnNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjZbQ1JWQlQeNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Q0dJRjA2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NkRHVzY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2 + NjY2NjY2NjY2NjY2NjY2NjY24AAD///////AAAH//////4AAAf//////AAAB//////+AAAH//////4AA + A///////gAAD///////AAAf//////8AAB///////4AAP///////gAA////////AAH///////8AAf//// + ///4AD////////gAP////////AB////////8AH////////4A/////////gD/////////Af////////8B + /////////4P/////////x/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////KAAAABAAAAAgAAAAAQAgAAAA + AABABAAAAAAAAAAAAAAAAAAAAAAAABaUtTU3ZHeyOmFzuD5gcbg4YnO4OmFzuDxdbrpdLzFwAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwOmkAM34/wDK9v8kOUz/KKnK/wDO/P8Ky+//SVBaiAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjsNQfb+f8A2//+A5Gl/wDR9f8J4v/+Fb3X9FBC + SR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMA0uzYA+j//i10h/8A6v//Be3//zpr + d7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDnUQPq+/84NUL+D8LT/xa+ + zf+kAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ezQDzY+/xm4 + v/9AbXCcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfsPA3/ + //8U2dz5S1JTIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAYJ/f27HLe4YgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AACB/wAAgf8AAMP/AADD/wAA5/8AAP// + AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABUPEGQWTA14FU4PthVOD7VVTk+1VE+RdVOQEjVVDk/1VU4PtVVOD7VVDg+1VFA + SdZfLjDhcxIJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAL3rzQC/7v8AxPf/AMb4/wDG+f8A0f//ANf//wDM/v8A0///AMf8/wDG + +P8Axfj/AM7//wDV//9hMDH/cRgSMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvujhAMv3/wHf//8A2f//AOD//wDp//8RGSD/qy8//zXQ + 7v8A6P//ANn//wDk//8D5///AOf//1s2Oe8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAf//AAD//wAB//8AAf//gAP//4AD///AB///wAf//+AP + ///gD///8B////Af///4P///+D////x////8//////////////////////////////////////////// + /////////////////////////////////////////////ygAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnIyM5ZiMhTWYjIU1mIyFNZiMhTWYjIU1mIyFNZiMhTWYj + IU1mIyFNZiMhTWYjIU1mIyFNZiMhTWYjIU1mIyFNZiMhTWYjIU1mIyJMayMhFgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTRtgpVKTFf8SktX/kpLV/5KS1f+SktX/kpM + V/5KS1f+SktX/kpMV/5KS1f+SktX/kpLV/5KS1f+SkxX/kpMV/5KS1f+SkxX/lJCSv5pHhv/ZiIh2mYj + HRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADALHb9QCq0/8AqdL+AKnS/wCp + 0v8AqdL/AKnS/wCp0v8AqdL/AKnS/wCp0v8AqdL/AKnS/wCp0v8AqdL/AKnS/wCp0v8AqdP/AKzW/wC1 + 4f85aHv/ZyEf/2ckIFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxPBUALXf/wC5 + 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 + AAAAAAAAAODq9gDk7/8O////Bn6D/wRJTv8Ux8j/EPj+/wDo8/86eXz/ZyEfdgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAOfvdQDi6f8F8vj/C/7//wH///8f//7/AO73/wHm7v9pHx3oZyIjEAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl6v8A6e7/Ef///xH+//8S+v3/AOzy/zaC + hP9oIR97AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr73kA5+r/D/n6/0P/ + //8A9vj/AO3x/2gfHelnIyEWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEA7O3+APb4/iv///8A9Pf+M4yM/mkeHWoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA9/djAPb3/wL///4E8vL2ZyIhVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///TQ7+/p0e0NALAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH///8AAMAA + AP///wAAgAAA////AAAAAAD///8AAAAAAf///wAAgAAB////AACAAAP///8AAMAAA////wAAwAAH//// + AADgAAf///8AAOAAD////wAA8AAP////AADwAB////8AAPgAH////wAA+AAf////AAD8AD////8AAPwA + P////wAA/gB/////AAD+AH////8AAP8A/////wAA/wD/////AAD/gf////8AAP+D/////wAA/8f///// + AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAA= + + + + + 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 + SUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAGYktHRAD/AP8A/6C9p5MAAAIvSURBVDhPrZHfS1NhHMZ3 + 1x9RV3ZpNzUcFAVCiS6pJMhgFhGzEIrqRsmESgpxjAW5htUWxcnWxmxBZbUsPVrTWmgLd9jaaptaUyym + +31sP57e9+zMNdqoix54OHDe8/m83/e8kv+eR+MelKt1xAWz7QMGHr+jVYuf/xn6caXkSA0WFjVyJc6p + GZOIlGZw9DXuj93IE78lR+h0JgfdgA0v7K6CxCxRnGxeJ7ISI3u9gRTknYjlk6VwOgd+NQst8wyy3a1r + FdE8bH17B86VETS2NKD2bAiyU35kswBjtUNvZhFLZrAcTwuSgqgEdscnMfrdhPqDddCae6FhLkFluIDL + /V2IJjIIR9NYWk4j9GNVENBjCPCTaeMabAlehS1ohJW7BcahRT+rwnb5NuhNLK4xw9AYniKwyBcFt5/3 + gYtMwB5+iAezfbjrUUHnOI+e4TPoGFSiRd2ImlopFsM/8XWJR2AhBe9csiioO7Bra3PbfnQbT+OeVw3N + qw50mo7jhF6Bw1f2oql7JzbJqmEoTKAfwkwgURTQyBX10qaje9B+8xi6LG3CyHRXCm6srsKGqvXwfUvB + PZvEjD+OKW+sVEBDJa3tR3Do4j4BLtxCcIEnt/AGBnILOuEfDGGSKyOgITtKKbxlx2bMk/P6Qzw+zafA + kZGdvgTee2KY4KIY/xgpL6Dp7NEKo38hsGcuRUZOYNoXh8Mdg90VxZgzgpdTK5UFdOEzOS99/q0VBXTh + 36rEL4YQQX02QJNXAAAAAElFTkSuQmCC + + + + + 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 + XwCBQe93bBBbJwAAAABJRU5ErkJggg== + + + + + AAABABMAMDAQAAEABABoBgAANgEAACAgEAABAAQA6AIAAJ4HAAAYGBAAAQAEAOgBAACGCgAAEBAQAAEA + BAAoAQAAbgwAADAwAAABAAgAqA4AAJYNAAAgIAAAAQAIAKgIAAA+HAAAGBgAAAEACADIBgAA5iQAABAQ + AAABAAgAaAUAAK4rAAAwMAAAAQAgAKglAAAWMQAAICAAAAEAIACoEAAAvlYAABgYAAABACAAiAkAAGZn + AAAQEAAAAQAgAGgEAADucAAAAAAAAAEAIAACQwAAVnUAABQUAAABACAAuAYAAFi4AAAoKAAAAQAgAGga + AAAQvwAAPDwAAAEAIABIOgAAeNkAAEBAAAABACAAKEIAAMATAQBISAAAAQAgAIhUAADoVQEAYGAAAAEA + IAColAAAcKoBACgAAAAwAAAAYAAAAAEABAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA + AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAREREAAAAAAAAAAAAAAAAAAAAAAAAAAAEZmZERAAAAAAAAAAAAAAAA + AAAAAAAAABGZmZmREQAAAAAAAAAAAAAAAAAAAAAAARmZmZmZkREAAAAAAAAAAAAAAAAAAAAAAZmZmZmZ + mZERAAAAAAAAAAAAAAAAAAAAAZmZmZmZmZmREQAAAAAAAAAAAAAAAAAAAZmZmZmZmZmZkREAAAAAAAAA + AAAAAAAAARmZmZmZmZmZmZEQAAAAAAAAAAAAAAAAABmZmZmZmZmZmZkREAAAAAAAAAAAAAAAABmZmZmZ + mZmZmZmZERAAAAAAAAAAAAAAABGZmZmZmZmZmZmZmREQAAAAAAAAAAAAAAGZmZmZmZmZmZEZmZkRAAAA + AAAAAAAAAAEZmZmZmZmZmRGZmZmREQAAAAAAAAAAAAAZmZmZmZmZkRmZmZmZkRAAAAAAAAAAAAARmZmZ + mZmZEZmZmZkZmREQAAAAAAAAAAABmZmZmZmZmZmZmZEZmZkREAAAAAAAAAABGZmZmZmZmZmZmRGZmZmZ + EQAAAAAAAAAAGZmZmZmZmZmZkRmZmZkZkREAAAAAAAAAEZmZmZmZmZmZEZmZmZEZmZEQAAAAAAAAAZmZ + mZmZmZmRGZmZmRGZmZkRAAAAAAAAARmZmZmZmZmZmZmZkRmZmZmREAAAAAAAABGZmZmZmZmZmZmZEZmZ + mZmZEQAAAAAAAAGZmZmZmZmZmZmRGZmZmZmZkRAAAAAAAAEZmZmZmZmZmZkRmZmZmZmZmRAAAAAAAAAZ + mZmZmZmZmZkZmZmZmZmZmREAAAAAAAARmZmZmZmZmZmZmZmZmZmZmZEAAAAAAAABmZmZmZmZmZmZmZmZ + mZmZmZEQAAAAAAABGZmZmZmZmZmZmZmZmZmZmZkQAAAAAAAAEZmZm7mZmZmZmZmZmZmZmZkQAAAAAAAA + AZmZu7u7mZmZmZmZmZmZmZkQAAAAAAAAARmZu7u7uZmZmZmZmZmZmZEQAAAAAAAAABGZu7u7u5mZmZmZ + mZmZmZEAAAAAAAAAAAGZm7u7u7uZmZmZmZmZmZEAAAAAAAAAAAEZm7u7u7u5mZmZmZmZmREAAAAAAAAA + AAAZmbu7u7u5mZmZmZmZmRAAAAAAAAAAAAARmbu7u7u7mZmZmZmZkRAAAAAAAAAAAAABGZu7u7u7mZmZ + mZmZESIAAAAAAAAAAAAAGZm7u7u7uZmZmZmREiIgAAAAAAAAAAAAEZmbu7u7mZmZmZkRIiIAAAAAAAAA + AAAAARmZu7u7mZmZmZESIiAAAAAAAAAAAAAAABGZmbu5mZmZmREiIgAAAAAAAAAAAAAAAAEZmZmZmZmZ + kRIiIAAAAAAAAAAAAAAAAAARmZmZmZmZESIiAAAAAAAAAAAAAAAAAAABEZmZmZkREiIgAAAAAAAAAAAA + AAAAAAAAARGZkREQAiIAAAAAAAAAAAAAAAAAAAAAAAEREQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////AADwP/////8AAOAP/////wAAwAP/////AACAAP////8AAIAAP////wAAgAAP//// + AACAAAP///8AAIAAAf///wAAwAAAf///AADAAAAf//8AAMAAAAf//wAA4AAAA///AADgAAAA//8AAPAA + AAB//wAA8AAAAB//AAD4AAAAB/8AAPgAAAAD/wAA/AAAAAD/AAD8AAAAAH8AAP4AAAAAPwAA/gAAAAAf + AAD/AAAAAA8AAP+AAAAABwAA/4AAAAAHAAD/wAAAAAMAAP/AAAAAAwAA/+AAAAABAAD/4AAAAAEAAP/w + AAAAAQAA//gAAAABAAD/+AAAAAEAAP/8AAAAAwAA//4AAAADAAD//gAAAAMAAP//AAAABwAA//8AAAAH + AAD//4AAAAMAAP//wAAAAQAA///AAAADAAD//+AAAAcAAP//8AAADwAA///4AAAfAAD///wAAD8AAP// + /gAAfwAA////gBj/AAD////g/f8AAP///////wAAKAAAACAAAABAAAAAAQAEAAAAAACAAgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8A + AAD/AP8A//8AAP///wAAARAAAAAAAAAAAAAAAAAAAREREQAAAAAAAAAAAAAAAAEZmZERAAAAAAAAAAAA + AAARmZmZkREAAAAAAAAAAAAAEZmZmZmREQAAAAAAAAAAAAGZmZmZmZERAAAAAAAAAAABmZmZmZmZkREA + AAAAAAAAARmZmZmZmZmREAAAAAAAAAAZmZmZmZkZmREQAAAAAAAAEZmZmZmRGZmZEQAAAAAAAAGZmZmZ + EZmZGZERAAAAAAABGZmZmZmZkRmZkRAAAAAAABmZmZmZmRGZmZkREAAAAAARmZmZmZEZmZkRmREAAAAA + AZmZmZmZmZmRGZmREAAAAAEZmZmZmZmZEZmZmREAAAAAGZmZmZmZkRmZmZmRAAAAABGZmZmZmZGZmZmZ + kRAAAAABGZmZmZmZmZmZmZkQAAAAABmZmZmZmZmZmZmZEAAAAAARmbu7mZmZmZmZmRAAAAAAARm7u7mZ + mZmZmZkQAAAAAAAZm7u7mZmZmZmZEAAAAAAAEZu7u7mZmZmZkQAAAAAAAAEZu7u7mZmZmREAAAAAAAAA + GZu7u5mZmZESIAAAAAAAABGZu7uZmZkRIgAAAAAAAAABGZu5mZmREiAAAAAAAAAAABGZmZmZESIAAAAA + AAAAAAABEZmZERIgAAAAAAAAAAAAAAERERACAAAAAAAAAAAAAAAAAAAAAAAAAOf///+A////gD///wAP + //8AA///gAD//4AAP/+AAB//wAAH/8AAA//gAAD/4AAAf/AAAB/wAAAP+AAAB/gAAAP8AAAD/AAAAf4A + AAH/AAAB/wAAAf+AAAH/wAAB/8AAA//gAAP/8AAB//AAA//4AAf//AAP//4AH///gb//////KAAAABgA + AAAwAAAAAQAEAAAAAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA + AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAEQAAAAAAAAAAAAABGREQAAAAAAAA + AAARmZmREAAAAAAAAAAZmZmZkRAAAAAAAAABmZmZmZEQAAAAAAABmZmZmZmRAAAAAAABmZmZmRmZEQAA + AAAAGZmZkZmZmRAAAAAAGZmZmZmRmZEQAAAAAZmZmZkZmZmRAAAAAZmZmZmZmRmZEAAAABmZmZmZkZmZ + kQAAABmZmZmZGZmZmRAAAAGZmZmZmZmZmRAAAAAZmZmZmZmZmZEAAAAZm7uZmZmZmZEAAAABm7u5mZmZ + mRAAAAAAGbu7mZmZmRAAAAAAGbu7uZmZkSAAAAAAAZu7uZmZEiIAAAAAABmbmZmRIiAAAAAAAAGZmZkS + IgAAAAAAAAARmREiIAAAAAAAAAAAEQACAADP//8Agf//AAB//wAAH/8AgAf/AIAD/wCAAP8AwAB/AMAA + HwDgAA8A4AAHAPAAAwDwAAEA+AABAPwAAAD8AAAA/gABAP8AAQD/AAEA/4AAAP/AAQD/4AMA//AHAP/8 + 7wAoAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAABEQAAAA + AAABmZEQAAAAAAGZmZEQAAAAAZmZmZEQAAAAGZmZGZEAAAAZmZGZmRAAAAGZmZmRkQAAAZmZmRmZEAAA + GZmRmZkQAAAZuZmZmRAAAAGbmZmRIAAAABmZmRIiAAAAAZmRIiAAAAAAERIiAAAAAAAAACAA//8AAMf/ + AACB/wAAgH8AAIAfAADADwAAwAcAAOADAADgAQAA8AEAAPABAAD4AQAA/AAAAP4BAAD/AwAA//cAACgA + AAAwAAAAYAAAAAEACAAAAAAAgAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wAHhQQAAGQAAABi + AAAAYQAAAF8AAAR1BABlo2UAZ6RnAG6obgBtp20AcKlwAHSsdABzq3MAeq96AIW2hQAGdwcACXoLAAl4 + CwANfBIADn8SAA9/FAARhhYAGbQfACTDMAAtyDwAN9NMAEPhXQBK5mkAC05oABBScAAUWHYAH2aEABlc + fgAiZYwAImKLAAAvTgAALVIANZ7/ADag/wA2n/8AOKP/ADKX/wAzmv8AM5n/ADSb/wA1nf8ALpD/AC+S + /wAwk/8AKIP/ACmF/wAmgP8AJ4L/ACN5/wAke/8AHW7/AB5w/wAZZf8AGmf/ABtp/wAcav8AHWz/ABVd + /wAXX/8AGGP/ABNZ/wAVW/8ADlH/ABFT/wAJRf8AADb/AAU8/wAFOv8AADD/AAA1/wAAM/8AADL9AAAx + /AAAMvsAADH7AAAw+QAAL/gAADD2AAAv9gAALvUAAzf/AAQ4/wAALf8AAC//AAAs+wAALfQAAC3zAAAs + 8QAAK/AAACvuAAAq7QAAKewAACnrAAAo6QAAJ+gAACjnAAAn5wAAJuUAACfwAAAl5AAAJeMAACThAAAj + 4AAAI98AACLdAAAh3AAAItsAACHaAAAg2QAAH9gAAB/WAAAe1QAAHdQAAB3SAAAc0QAAG9AAABvOAAAa + zQAAGcwAABnLAAAYyQAAF8gAABfGAAAWxQAAFcQAABXCAAAUwQAAE8AAABO/AAASvQAAEbwAABC5AAAP + uAAAELcAAA+3AAAOtAAADbMAAAyxAAALsAAAC64AAAqtAAAJrAAACqsAAAmrAAAIqAAAB6gAAAemAAAG + pQAABaIAAASgAAAEnwAAA58AAACdAAACnQAAApsAAAGbAAAAmQAAAJcAAACVAAAAkwAAAJEAAACPAAAA + jAACApcAAgKVAAQEmAAFBZoABQWWAAcHmAAICJgACwubAAwMnAANDZkAERGbABUVnwAjI6sALS2pADEx + qgAzM7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWfnaSmswAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAnX9xdHyJmqWlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACecWVtb3BxdoKTo6YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZ/X2hp + bW9xc3V2f4+fpQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKNpYGRlaWxtcHN1d3h+j6Gl + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKNoXmFkZWhsbXBxdXd5eoCQoaUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAKZ1U19gYmVoaW1vcXR2eXt7gZGjpQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAKeJUFdeYGJkZWlsbnBzdXh6fH2Gl6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChYFNX + Xl9hZGVobG1wcXV3eXx9f4mapQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnek5UVl5fYGJlaGltb3F0 + dnh6fX+Bi56lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACxlU9SU1ZXX2BiZGZpbG5wc3ODnYp+gIWSoqUA + AAAAAAAAAAAAAAAAAAAAAAAAAAAApm1NUlNUV15fYWRlaWxtbX6kpoV6f4GCiZikAAAAAAAAAAAAAAAA + AAAAAAAAAAAArI5NT1JTVFdeX2FjZWhmd6KmhnR5e36AgYOOn6UAAAAAAAAAAAAAAAAAAAAAAAAAAKRk + TU9QUlNWXV9gYmJ0oqaCbXN2eHp8mJqDiJejAAAAAAAAAAAAAAAAAAAAAAAAAKaOTU5PT1JTVldeYF57 + pYFmbXBzdHeXqJiAg4SLnaUAAAAAAAAAAAAAAAAAAAAAAAClZU1OT09SU1RXXl9haWRoa21ucJSomHx9 + gIOEiJOjpQAAAAAAAAAAAAAAAAAAAACnjk1OTk5PUlNUVl1fX2JkZmhtkqiXdnd7fYCBhpGQnaUAAAAA + AAAAAAAAAAAAAAAApWVNTk5OT09SU1RXXl9hYmWSqZRvcHV3ent/m6iQh5ilrgAAAAAAAAAAAAAAAAAA + p45NTk5OTk9PUlNUV15fXo6qk2xscHF1dXmYp5mEhYeRo6UAAAAAAAAAAAAAAAAAAKZuSU5OTk5OT1BS + U1ZdV4ONZWVpbG9vdZiolHx/goSGjJ2lAAAAAAAAAAAAAAAAAKuXT05OTk5OTk9PUlNUV1ddYGRlaWlt + lKiXd3l8f4GEhYmcpQAAAAAAAAAAAAAAAACndUlOTk5OTk5PT1JTVFdeX2FjY2mSqJJxc3d5e36Ag4WI + mqUAAAAAAAAAAAAAAAAAm1FNTk5OTk5OTk9QUlNWXV9fYpOpkWttcHR2eHp9gIKEhpylAAAAAAAAAAAA + AAAAp31JTk5OTk5OTk5PT1JTVldWjqqRZWhsbXBzdXd6fH+Bg4qjAAAAAAAAAAAAAAAAAKRhTU5OTk5O + Tk5OT09SU1RUgolhYWVoaW1wcXV3eXt/gIGSpQAAAAAAAAAAAAAAAKeLSU5OTk5OTk5OTk5PUlNUU1Re + YGJkaGltb3F0dnh7fYCEoQAAAAAAAAAAAAAAAACmbElOTk5OWlpaTE5OT1BSU1ZXX2BiZGVpbG5wc3V4 + en19mbIAAAAAAAAAAAAAAACwl09NTk5NRT5ESlpMTk9PUlNUV15fYWNlaGttb3F0d3l6kaUAAAAAAAAA + AAAAAAAAp35JTlo9KykqMz9LWk5OT1JTVFZeX2BiZWhpbG9wdHZ2j6YAAAAAAAAAAAAAAAAAAKRiTUw3 + MC4uLykyRVtMTk9PUlNWV19gYmRmaWxucHNxkKsAAAAAAAAAAAAAAAAAAKePTVo4KC4uLi4vKjtOTE5P + T1JTVFdeX2FjZWhrbXBwmbYAAAAAAAAAAAAAAAAAAACnc0xBKi4uLi4uLio2WVtOTk9SU1NXXl9gYmVo + aWt2owAAAAAAAAAAAAAAAAAAAAAAn19KMi8uLi4uLi4qNVhMTk5PT1JTVldfYGJkZmSOpgAAAAAAAAAA + AAAAAAAAAAAAp45bQyouLi4uLi4uKTlOTE5OT09SU1RXXl9hYHCjtwAAAAAAAAAAAAAAAAAAAAAAAKd3 + TTQoLi4uLi4uLilAWk5OTk5PUlNUVl5XZZikAAAAAAAAAAAAAAAAAAAAAAAAALahakgsLy4uLi4uLi0t + SFtOTk5OT1BSU1NhmKAnAAAAAAAAAAAAAAAAAAAAAAAAAACmlFxEMC0uLi4uLi4pPFpOTk5OTk9PTl6X + ox8DBAAAAAAAAAAAAAAAAAAAAAAAAAAApphbQTAtLi4uLi4pOlpOTk5OTk5NV5ekIBkIBBAAAAAAAAAA + AAAAAAAAAAAAAAAApaWlTEIoLy4uLi0qRlpOTk5OTk1Wl6QhGhIGCgAAAAAAAAAAAAAAAAAAAAAAAAAA + AKWlZkxHMSkwMClAW05OTk5OTVWVpSMbEwYNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmnmBMSz01NERb + Tk5OTk5NVpalIhwUBg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApppfTVpMTFpOTk5OTklVlKUkHRYH + CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKadck1NTk5OTk5NTWeXpSUeFQcOAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACtpo1nT01JTU9li6SkJhgXBwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAKalmY6JjpqlproAAAQFDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuLSv + tbkAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////AADwP/////8AAOAP/////wAAwAP/////AACAAP////8AAIAAP////wAAgAAP//// + AACAAAP///8AAIAAAf///wAAwAAAf///AADAAAAf//8AAMAAAAf//wAA4AAAA///AADgAAAA//8AAPAA + AAB//wAA8AAAAB//AAD4AAAAB/8AAPgAAAAD/wAA/AAAAAD/AAD8AAAAAH8AAP4AAAAAPwAA/gAAAAAf + AAD/AAAAAA8AAP+AAAAABwAA/4AAAAAHAAD/wAAAAAMAAP/AAAAAAwAA/+AAAAABAAD/4AAAAAEAAP/w + AAAAAQAA//gAAAABAAD/+AAAAAEAAP/8AAAAAwAA//4AAAADAAD//gAAAAMAAP//AAAABwAA//8AAAAH + AAD//4AAAAMAAP//wAAAAQAA///AAAADAAD//+AAAAcAAP//8AAADwAA///4AAAfAAD///wAAD8AAP// + /gAAfwAA////gBj/AAD////g/f8AAP///////wAAKAAAACAAAABAAAAAAQAIAAAAAACABAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A/wD/AAJlAgALkAkACWkJAApsCgAKawoACmkKABNuEwAWnxkAH6ooACOk + LwAosTUAEFhnABdfcwAfZn8AKXKMAAI2VAAGNlcANp//ADei/wA3oP8AM5r/ADOZ/wA0m/8ANZz/AC+R + /wAxlv8ALIz/ACyK/wAuj/8AKof/ACR+/wAgdf8AIXb/ACN6/wAke/8AHGz/ACBy/wAaaP8AF2H/ABBW + /wARWP8AFVz/AA1M/wAIQv8ACUb/AAA2/wAIQf8AADT/AAAw/wAAM/8AADL9AAAx/AAAMvsAADH7AAAw + +QAAL/gAADD3AAAv9wAALvUAAjf/AAI2/QAALf8AAC//AAAt9AAALfMAACzwAAAr7wAAKu0AACnsAAAp + 6wAAJ+oAACjpAAAn6AAAJ+YAACblAAAl7QAAI+gAACXmAAAl5AAAJOIAACThAAAj4AAAId4AACPeAAAi + 3AAAIdwAACHbAAAg2QAAH9gAAB/WAAAe1QAAHdQAAB3SAAAc0QAAG9AAABvOAAAZzAAAGswAABnLAAAY + yQAAFM0AABXIAAAXyAAAF8cAABbFAAAVwwAAFMEAABO/AAASvQAAEboAABC5AAAOuQAADrYAAA20AAAO + tAAADrMAAA2zAAAMsQAADK8AAAuvAAAJrAAACqwAAAmqAAAIqQAACKcAAAeoAAAHpgAABqUAAAWiAAAE + oAAABJ4AAACoAAAApQAAAKMAAACfAAACngAAApwAAAGbAAACmwAAAJkAAQKYAAICqQAEBp4ABQWaAAYG + mgALC5wACwubAA4OngAODp0AERGeABISnAAUFJ8AGxuhABsbngAeHqIAHh6gACEhpAAhIaEAIyOiACQk + ogAtLasAKyukAC0tqQA0NKsANTWsADU1qQA7O60APDytAD09rwBAQK4AV1e5AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 4gAAJOEAACPgAAAk4AAAIt8AACLeAAAj3gAAIdwAACLcAAAg2gAAIdoAACDZAAAf2AAAH9cAAB/WAAAe + 1QAAHOcAAB3nAAAb5AAAH+EAAB7WAAAd1AAAHdMAABzRAAAb0AAAHNAAABvPAAAbzgAAGcwAABjKAAAY + yQAAGMgAAxSRAAcZlwALH5wAABnYAAAWxgAAFsUAABXEAAAVwwAAFMIAABXCAAAUwQAAE8AAABK9AAsb + mwAAEskAABG7AAAPuQAAELkAAA+4AAAQuAAADrYAAA61AAANswAADLUAAAq0AAAMsQAAC7AAAAquAAAL + rgAACq0AAAmrAAAJqgAACKkAAAioAAIMrQADDK0AAAixAAAHqAAAB6YAAAalAAAFowAABKIAAwegAAUL + rQAQFKcAFhuqADM3pQAAA58ABAehAAkLpgAeH6YAICGnACkqqQArLa4AMTGtADExqwAzNK8AMjKsADIy + qwA1NrAANjevAD09rwBAQqwASEizAEpKtQBJSbMAZWW+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAv7wAAAAAAAAAAAAAAAAAAAAAAAAAAACjcXSOpr0AAAAAAAAAAAAAAAAAAAAAAMNo + V2VpcoaiuwAAAAAAAAAAAAAAAAAAAMJcUFtka3B2jKXAAAAAAAAAAAAAAAAAAAB+PVFYX2pxe4CPrccA + AAAAAAAAAAAAAACqOUFPVlxnb3KRjJixAAAAAAAAAAAAAADGZDU/TlVbXo+wgoGLpLoAAAAAAAAAAAAA + mzA4PkVPbadybHWlmZOvAAAAAAAAAAAAxF4xODxLU1lZZKGkf4OOqLkAAAAAAAAAAJwxLzU7QU1Qm6Bq + cX2nopa2AAAAAAAAAMhmMS81OUBNdFtdZ6SkgYWSrgAAAAAAAACpNi8vLzg8Pk5YoJ1tdIGEjqwAAAAA + AADJeygvLy80OztymlhgbHR+g423AAAAAAAAs0IwLUpJMjo/QVJYYGlwfICcAAAAAAAAAI4vJRoeJkg3 + PUtQV15mbnOQvgAAAAAAAMFjIAwOEiIsMjtBTlRbYWiNvgAAAAAAAACyJBIUFA8fRjM6QE1TWlqfAAAA + AAAAAAAAlR0QEhIRHEovOD5EQ4q1AAAAAAAAAAAAvmIXDRITFSdKLzQweYcIAAAAAAAAAAAAALhHGBAW + DiNKLyl3iAcECgAAAAAAAAAAAACrKxsZIS0vKXiJCQMKAAAAAAAAAAAAAAAAnkwqLigoepQLBgoAAAAA + AAAAAAAAAAAAALSFb3WXxQoFCgAAAAAAAAAAAAAAAAAAAAAAvr4AAAAKAAAAAM///wCB//8AAH//AAAf + /wCAB/8AgAP/AIAA/wDAAH8AwAAfAOAADwDgAAcA8AADAPAAAQD4AAEA/AAAAPwAAAD+AAEA/wABAP8A + AQD/gAAA/8ABAP/gAwD/8AcA//zvACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA + AAD/AP8AAGYAABBwEAAgeSAACIELAAuEEQAPiBcAE4wdABeQIgAblCgAH5guAARgIgAWkz4AHptKABBt + NQAno1cAL6xkADi0cABAvX0AM5n/ADCT/wAtjP8AKYb/ACaA/wAjef8AIHP/ABpm/wAWYP8AE1n/AA1N + /wAQU/8ACkb/AAM5/wAGQP8AADP/AAAy/gAAM/4AADL9AAAx/AAAMvwAADH7AAAw+gAAMfoAADD5AAAv + +AAAMPgAAC/3AAAv9gAALvUAAC70AAAu9gAALfQAAC3zAAAs8gAALfIAACzxAAAr8AAALPAAACvvAAAq + 7gAAK+4AACrtAAAp7AAAKuwAACnrAAAo6gAAKeoAACjpAAAn6AAAKOgAACfnAAAm5gAAJ+YAACblAAAm + 5AAAJeQAACXjAAAk4gAAJeIAACThAAAj4AAAJOAAACPfAAAi3gAAI94AACLdAAAh3AAAItwAACHbAAAg + 2gAAIdoAACDZAAAf2AAAINgAAB/XAAAf1gAAHtUAAB7UAAAe1gAAHdQAAB3TAAAc0gAAHdIAABzRAAAb + 0AAAHNAAABvPAAAazgAAG84AABrNAAAZzAAAGswAABnLAAAYygAAGcoAABjJAAAYyAAAF8gAABfHAAAW + xgAAF8YAABbFAAAVxAAAFsQAABXDAAAVwgAAFMEAABPAAAAUwAAAE78AABK+AAATvgAAEr0AABK8AAAR + vAAAEbsAABG6AAAQuQAAELgAAA+3AAAOtgAADrUAAA60AAANswAADLIAAAyxAAAMsAAAC68AAAquAAAL + rgAACq0AAAmsAAAKrAAACasAAAiqAAAJqgAACKgAAgyTAAILkgADDZUAAwyUAAQOlgAFD5gABQ6XAAAH + qAAAB6cAAAamAAAHpgAABqUAAAakAAAFowAABKIAAAaPAAADnwAAAp4AAAOeAAACnQAAAZwAAAKcAAAB + mwAAAJkAEBCfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAtra2tra2tra2tra2tra2tra2tLS0tra2tra2tra2tra2tCIiIrS0tra2tra2tra2trQiIiIi + IrS0tra2tra2tra0IiIiIiIiIrS0tra2tra2trQiIiIiIrQiIrS2tra2tra0IiIiIrQiIiIitLa2tra2 + trQiIiIiIiIitCK0tra2tra0IiIiIiIitCIiIrS2tra2trQiIiIitCIiIiK0tra2tra0IhMiIiIiIiIi + tLa2tra2trQiEyIiIiIitAG2tra2tra2tCIiIiIitAEBAba2tra2tra0IiIitAEBAba2tra2tra2trS0 + tAEBAba2tra2tra2tra2tra2Aba2tv//AADH/wAAgf8AAIB/AACAHwAAwA8AAMAHAADgAwAA4AEAAPAB + AADwAQAA+AEAAPwAAAD+AQAA/wMAAP/3AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAA8AAAAcAAAAJAAAACMAAAAcAAAAEAAAAAYAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIgAAAEkAAABoAAAAdwAAAHcAAABpAAAAUAAA + ADUAAAAeAAAADQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAArAABOkwAAc9kAAIDtAAB+7gAA + bOMAAETJAAATpgAAAIgAAABqAAAARgAAACcAAAARAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAHCYAAH3HAACV/wAA + mf8ABqX/AAWk/wABmv8AAJX/AACO+gAAaeMAAC6/AAAAlgAAAHYAAABPAAAALAAAABMAAAAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAA + g7UAAJX/AAuv/wAe1f8AIt7/ACDa/wAazv8AELr/AAak/wAAl/8AAJb/AAB67gAAP8oAAASeAAAAewAA + AFIAAAArAAAAEgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + o/8AAJf/AACJ9gAAMsYAAACRAAAAWQAAACUAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAlCAAAJT2AAms/wAz/v8AM///ADP//wAz//8AM/7/ADH8/wAx+/8AMPn/AC/3/wAu + 9f8ALfL/ACvw/wAq7f8AKer/ACrt/wAUwf8AAJD/AAel/wAf2P8AIdv/AB7W/wAd0v8AG8//ABrO/wAV + xP8AA57/AAOf/wATv/8ACq3/AACZ/wAAlv4AAEzWAAAAmwAAAGYAAAAtAAAACgAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJWUAACT/wAh2/8ANv//ADP//wAz//8AM///ADP+/wAy + /f8AMfv/ADD5/wAv9/8ALvX/AC3z/wAs8f8ALPL/ABfI/wAAj/8ACKf/ACPf/wAl4/8AIt3/ACDb/wAf + 1/8AHtb/ABnL/wAEoP8AAJT/AAyx/wAVxP8AFMH/AA61/wADnf8AAJf/AABm5AAABaUAAABwAAAANAAA + AA0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMaAACU8QAJrP8AM/7/ADP//wAz + //8AM///ADP//wAz//8AMv3/ADH8/wAw+v8AMPj/AC72/wAt9P8ALvX/ABTA/wAJqP8AJuT/ACjq/wAl + 5P8AJOH/ACLe/wAi3v8AHdX/AAWi/wAAk/8ADrb/ABrN/wAXx/8AFcP/ABXC/wARu/8ABKL/AACX/wAA + d+wAAA6tAAAAdgAAADQAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUggAA + lP8AIdr/ADb//wAz//8AM///ADP//wAz//8AM///ADL9/wAy/P8AMfr/ADD4/wAv9v8ALvT/AC3y/wAr + 8P8AK+//ACjq/wAn6P8AJuT/ACbl/wAh3P8AB6X/AACS/wAQuv8AHtb/ABvP/wAZzP8AGMj/ABbE/wAV + wv8AEr7/AAem/wAAl/8AAH7wAAAPrwAAAHAAAAArAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACPDwAAlOUAB6b/ADL7/wA0//8AM///ADP//wAz//8AM///ADP//wAz/v8AMv3/ADH7/wAw + +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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAlDYAAJFyAACQlgAAjp4AAIuMAACBXwAAYiQAAAAGAAAAAQAAAAAAAAAAAGIALgAA + AAQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D//////AADgB/////8AAMAB + /////wAAgAB/////AAAAAB////8AAAAAB////wAAAAAB////AAAAAAB///8AAAAAAD///wAAAAAAD/// + AAAAAAAD//8AAIAAAAH//wAAgAAAAH//AACAAAAAP/8AAMAAAAAP/wAAwAAAAAP/AADgAAAAAf8AAOAA + AAAA/wAA8AAAAAB/AADwAAAAAB8AAPgAAAAADwAA+AAAAAAHAAD8AAAAAAcAAPwAAAAAAwAA/gAAAAAB + AAD/AAAAAAEAAP8AAAAAAAAA/4AAAAAAAAD/gAAAAAAAAP/AAAAAAAAA/8AAAAAAAAD/4AAAAAAAAP/w + AAAAAQAA//AAAAABAAD/+AAAAAMAAP/8AAAAAwAA//wAAAABAAD//gAAAAEAAP//AAAAAQAA//8AAAAD + AAD//4AAAAcAAP//wAAADwAA///gAAAfAAD///AAAD8AAP//+AAAfwAA///8AAD/AAD///4AIf8AAP// + /4D3/wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAA + ABkAAAAkAAAAIwAAABkAAAAMAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA + AA8AAAA0AAAAYAAAAHgAAAB3AAAAYwAAAEYAAAAoAAAAEwAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAACD//8AAP//AAA//wAAD/8AAAP/AAAA/wCAAH8AgAAfAMAADwDAAAcA4AADAOAA + AQDwAAAA8AAAAPgAAAD8AAAA/AAAAP4AAQD/AAAA/wAAAP+AAQD/wAMA/+AHAP/wTwAoAAAAEAAAACAA + AAABACAAAAAAAEAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ/wAAmf8AAJn/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ/wAz//8AM///ADP//wAA + mf8AAJn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmf8AM///ADP//wAz + //8AM///ADP//wAAmf8AAJn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJn/ADP//wAz + //8AM///ADP//wAz//8AM///ADP//wAAmf8AAJn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + mf8AM///ADP//wAz//8AM///ADP//wAAmf8AM///ADP//wAAmf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJn/ADP//wAz//8AM///ADP//wAAmf8AM///ADP//wAz//8AM///AACZ/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAmf8AM///ADP//wAz//8AM///ADP//wAz//8AM///AACZ/wAz//8AAJn/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAJn/ADP//wAz//8AM///ADP//wAz//8AM///AACZ/wAz//8AM///ADP//wAA + mf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAmf8AM///ADP//wAz//8AM///AACZ/wAz//8AM///ADP//wAz + //8AAJn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJn/ADP//zOZ//8AM///ADP//wAz//8AM///ADP//wAz + //8AM///AACZ/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmf8AM///M5n//wAz//8AM///ADP//wAz + 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 + AAAAAwAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAGwAAADQAAABL + AAAAYgAAAHAAAAB5AAAAfAAAAHkAAAByAAAAaQAAAGAAAABVAAAASQAAAD8AAAA0AAAAKQAAACAAAAAZ + AAAAEgAAAAwAAAAIAAAABQAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAkAAAAfAAAAQgAAAGoAAACG + AAAAmgAAAKQAAACpAAAAqwAAAKkAAACmAAAAoAAAAJoAAACSAAAAiQAAAH8AAABzAAAAZgAAAFkAAABN + AAAAQQAAADUAAAApAAAAHwAAABcAAAAPAAAACgAAAAYAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABAAAAAzAAAAZAAAAI8AAACn + AAAAtAAAALkAAAC6AAAAuwAAALoAAAC5AAAAtwAAALUAAACxAAAArAAAAKcAAACfAAAAlgAAAIwAAACC + AAAAdQAAAGcAAABZAAAASgAAAD4AAAAwAAAAJQAAABoAAAATAAAACwAAAAcAAAAEAAAAAgAAAAEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABYAAABDAAAAewAAAKUAACXE + AAA60QAAOdIAAC/OAAAAvwAAAL4AAAC+AAAAvgAAAL4AAAC9AAAAvAAAALsAAAC5AAAAtQAAALEAAACs + AAAApQAAAJwAAACRAAAAhQAAAHgAAABoAAAAWQAAAEkAAAA7AAAALAAAACIAAAAYAAAAEAAAAAoAAAAG + AAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABUAAABAAABLogAAjPMAAJn/ + AACZ/wAAmf8AAJn/AACR+wAAaecAADnTAAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvQAAAL0AAAC7 + AAAAugAAALYAAACyAAAArAAAAKUAAACbAAAAkQAAAIIAAAB1AAAAZAAAAFUAAABGAAAANwAAACkAAAAd + AAAAFQAAAA0AAAAHAAAABAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA8AAIqwAACZ/wAAmf8AAp3/ + AAip/wAKrf8AA6D/AACZ/wAAmf8AAJn/AACR+wAAYOMAABjHAAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+ + AAAAvgAAAL0AAAC8AAAAuwAAALgAAAC0AAAArwAAAKgAAACgAAAAlAAAAIgAAAB6AAAAagAAAFkAAABJ + AAAAOgAAACsAAAAeAAAAFQAAAA4AAAAIAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlHMAAJn/AACZ/wASvv8AIdz/ + ACLd/wAh2/8AH9j/ABrO/wAOtv8AA6D/AACZ/wAAmf8AAJn/AABp5wAAL88AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvQAAALsAAAC5AAAAtQAAALEAAACpAAAAoAAAAJUAAACH + AAAAeAAAAGYAAABVAAAARAAAADYAAAAnAAAAGgAAABAAAAAJAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXEAAAmO8AAJn/ABbF/wAm5v8AJeP/ + ACTh/wAi3v8AIdz/ACDZ/wAf1/8AHdT/ABXD/wAIqv8AAJn/AACZ/wAAmf8AAHrvAAAvzwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvQAAALwAAAC6AAAAtgAAALEAAACq + AAAAoQAAAJUAAACHAAAAeAAAAGgAAABWAAAAQwAAADIAAAAjAAAAFwAAAA0AAAAHAAAAAwAAAAEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZXwAAmf8ABaP/ACnr/wAo6f8AJub/ + ACXk/wAk4v8AI9//ACHd/wAg2v8AH9f/AB7V/wAc0v8AGMn/AAms/wAAmf8AAJn/AACZ/wAAeu8AAC/P + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvgAAALwAAAC7 + AAAAuAAAALQAAACuAAAApQAAAJoAAACMAAAAewAAAGgAAABUAAAAQgAAAC4AAAAgAAAAFAAAAAwAAAAF + AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZnwAAmf8AFcT/ACru/wAp6/8AKOn/ + ACfn/wAm5f8AJOL/ACPg/wAi3f8AIdv/AB/Y/wAe1v8AHdP/ABvQ/wAXx/8ACaz/AAGc/wAAmf8AAJn/ + AAB67wAAL88AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+ + AAAAvgAAAL0AAAC8AAAAuQAAALUAAACwAAAApwAAAJsAAACLAAAAegAAAGMAAABQAAAAPAAAACsAAAAb + AAAAEAAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZvwAAmf8AIdz/ACvw/wAq7v8AKez/ + ACjq/wAn6P8AJuX/ACXj/wAk4f8AIt7/ACHc/wAg2f8AHtb/AB3U/wAc0f8AGs7/ABjI/wAKrv8AAJn/ + AACZ/wAAmf8AAHrvAAAvzwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAvgAAAL4AAAC8AAAAugAAALYAAACvAAAApQAAAJYAAACHAAAAcwAAAGAAAABH + AAAAMwAAACAAAAARAAAABwAAAAIAAAAAAAAAAAAAAAAAAAAAAACZjwAAmf8AFsb/AC3z/wAs8f8AK+// + ACrt/wAp6/8AJ+j/ACbm/wAl5P8AJOH/ACPf/wAh3f8AINr/AB/X/wAe1f8AHNL/ABvP/wAZzP8AFcT/ + AAiq/wAAmf8AAJn/AACZ/wAAaecAABjHAAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAAL0AAAC7AAAAuAAAALIAAACqAAAAngAAAI8AAAB5 + AAAAYwAAAEgAAAAvAAAAGAAAAAoAAAADAAAAAAAAAAAAAAAAAACZXwAAmf8AC7D/AC71/wAt9P8ALPL/ + ACvw/wAq7v8AKev/ACjp/wAn5/8AJuX/ACTi/wAj4P8AIt3/ACHb/wAf2P8AHtb/AB3T/wAb0P8AGs3/ + ABnK/wAUwv8ACKr/AACZ/wAAmf8AAJn/AABg4wAADMMAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAAL0AAAC7AAAAtwAAALEAAACl + AAAAlgAAAH4AAABgAAAAPQAAAB8AAAAMAAAAAwAAAAAAAAAAAACZDwAAmf8AAJn/ACzy/wAu9v8ALfT/ + ACzy/wAr8P8AKu7/ACns/wAo6v8AJ+j/ACbl/wAl4/8AJOH/ACLe/wAh3P8AINn/AB7W/wAd1P8AHNH/ + ABrO/wAZy/8AGMn/ABG7/wAFpP8AAJn/AACZ/wAAkfsAAE3bAAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvgAAALwAAAC5 + AAAAswAAAKYAAACPAAAAbAAAAEIAAAAhAAAACgAAAAEAAAAAAAAAAAAAma8AAJn/ABvP/wAv+P8ALvb/ + AC71/wAt8/8ALPH/ACvv/wAq7f8AKev/ACfo/wAm5v8AJeT/ACTh/wAj3/8AIdz/ACDa/wAf1/8AHtX/ + ABzS/wAbz/8AGcz/ABjJ/wAXx/8AD7f/AAKe/wAAmf8AAJn/AACK9wAAL88AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+ + AAAAvQAAALkAAACtAAAAlAAAAGgAAAA9AAAAFwAAAAUAAAAAAAAAAAAAmV8AAJn/AAal/wAw+v8AMPn/ + AC/3/wAu9f8ALfP/ACzy/wAr8P8AKu3/ACnr/wAo6f8AJ+f/ACbl/wAk4v8AI+D/ACLd/wAh2/8AH9j/ + AB7V/wAd0/8AG9D/ABrN/wAYyv8AF8j/ABbF/wALsP8AAZv/AACZ/wAAmf8AAHLrAAAYxwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvgAAAL4AAAC6AAAAqwAAAIgAAABZAAAAJwAAAAoAAAAAAAAAAAAAAAAAAJnvAACZ/wAl4/8AMfv/ + ADD5/wAv+P8ALvb/AC30/wAs8v8AK/D/ACru/wAp7P8AKOr/ACfo/wAm5f8AJeP/ACPh/wAi3v8AIdz/ + ACDZ/wAe1v8AHdT/AA20/wANs/8AGcv/ABjI/wAWxv8AE8D/AAeo/wAAmf8AAJn/AACR+wAAV98AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC9AAAAtQAAAJkAAABsAAAANAAAAA8AAAAAAAAAAAAAAAAAAJmPAACZ/wAPuP8AMfz/ + ADH7/wAw+v8AL/j/AC72/wAu9f8ALfP/ACzx/wAr7/8AKu3/ACnr/wAn6P8AJub/ACXk/wAk4f8AI9// + ACHc/wAg2v8AC7D/AACZ/wAAmf8AG8//ABnM/wAYyf8AF8f/ABXE/wAQuv8ABKL/AACZ/wAAmf8AAILz + AAAvzwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAuQAAAKEAAAB1AAAAOwAAABIAAAAAAAAAAAAAAAAAAJkfAACZ/wAAmf8ALPH/ + ADL9/wAx/P8AMPr/ADD5/wAv9/8ALvX/AC3z/wAs8f8AK+//ACrt/wAp6/8AKOn/ACfn/wAm5P8AJOL/ + ACPg/wAMsv8AAJn/AACZ/wATv/8AHdP/ABvQ/wAazf8AGMr/ABfH/wAWxf8AFML/AAuv/wABm/8AAJn/ + AACZ/wAAYOMAAAzDAAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAuAAAAJ4AAABxAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAAAACZnwAAmf8AE7// + ADL+/wAy/f8AMfz/ADH7/wAw+f8AL/f/AC72/wAt9P8ALPL/ACvw/wAq7v8AKez/ACjq/wAn5/8AJuX/ + AA20/wAAmf8AAJn/ABTC/wAg2f8AHtb/AB3T/wAc0f8AGs7/ABnL/wAXyP8AEr3/ABXC/wASvf8AB6f/ + AACZ/wAAmf8AAIr3AAAvzwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC9AAAAswAAAJMAAABjAAAALQAAAAwAAAAAAAAAAAAAAAAAAAAAAACZPwAAmf8AAJn/ + ACzy/wAz/v8AMv3/ADH8/wAx+/8AMPr/AC/4/wAu9v8ALvX/AC3z/wAs8f8AK+//ACrt/wAp6v8AFsb/ + AACZ/wAAmf8AFsb/ACPf/wAh3P8AINr/AB/X/wAd1P8AHNL/ABvP/wAJrP8AAJn/AAyy/wAVw/8AFMH/ + AA61/wACnf8AAJn/AACZ/wAAYOMAAAzDAAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC8AAAArwAAAIkAAABXAAAAJAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmb8AAJn/ + ABO//wAz//8AM/7/ADL+/wAy/f8AMfz/ADD6/wAw+P8AL/f/AC71/wAt8/8ALPH/ACvv/wAq7f8AF8f/ + AACZ/wAYyf8AJuT/ACTi/wAj4P8AIt3/ACDb/wAf2P8AHtX/AAqu/wAAmf8AAJn/ABG7/wAXx/8AFsT/ + ABTB/wASvP8ACKj/AACZ/wAAmf8AAIr3AAAvzwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC7AAAArAAAAIUAAABSAAAAIQAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmT8AAJn/ + AACZ/wAs8v8AM///ADP//wAy/v8AMv3/ADH8/wAx+/8AMPn/AC/3/wAu9v8ALfT/ACzy/wAr8P8AKu7/ + ACns/wAo6v8AJ+f/ACbl/wAl4/8AI+D/ACLe/wAh2/8ADLH/AACZ/wAAmf8AEbz/ABrO/wAZy/8AF8j/ + ABbF/wAUwv8AE8D/AA20/wACnf8AAJn/AACZ/wAAYOMAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+ + AAAAvgAAAL0AAAC4AAAAqQAAAIMAAABTAAAAIwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJm/ + AACZ/wATv/8AM///ADP//wAz//8AM/7/ADL9/wAx/P8AMfv/ADD6/wAv+P8ALvb/AC30/wAt8/8ALPH/ + ACvv/wAq7f8AKer/ACfo/wAm5v8AJeT/ACTh/wANs/8AAJn/AACZ/wATwP8AHdT/ABzS/wAbz/8AGcz/ + ABjJ/wAWxv8AFcP/ABTA/wAQuf8AB6j/AACZ/wAAmf8AAILzAAAkywAAAL8AAAC/AAAAvwAAAL4AAAC9 + AAAAuwAAALUAAACqAAAAlQAAAHAAAABGAAAAHgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJk/ + AACZ/wAAmf8ALPL/ADP//wAz//8AM///ADP+/wAy/v8AMv3/ADH7/wAw+v8AMPj/AC/3/wAu9f8ALfP/ + ACzx/wAr7/8AKu3/ACnr/wAo6f8AJ+f/AA61/wAAmf8AAJn/ABXD/wAg2v8AH9j/AB7V/wAd0v8AG9D/ + ABrN/wAYyv8AEr7/AAGb/wABm/8AE77/AA2z/wABm/8AAJn/AACR+wAARNYAAAC+AAAAvQAAALsAAAC0 + AAAAqgAAAJoAAACEAAAAaAAAAEgAAAAqAAAAEAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACZvwAAmf8AE7//ADP//wAz//8AM///ADP//wAz//8AMv7/ADL9/wAx/P8AMfv/ADD5/wAv9/8ALvb/ + AC30/wAs8v8AK/D/ACru/wAp7P8AD7f/AACZ/wAAmf8AF8f/ACPg/wAi3v8AIdv/ACDZ/wAe1v8AHdP/ + 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 + ABvP/wATwP8AAJn/AACZvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZDwAAmd8AAJn/ABnM/wAz//8AM///ADP//wAz//8phf// + M5n//zOZ//8zmf//M5n//ymF//8PUv//ADP//wAz//8AM///ADL+/wAy/f8AMfz/ADD6/wAw+f8AL/f/ + AC71/wAt9P8ALPL/ACvw/wAq7v8AKev/ACjp/wAn5/8AJuX/ACTi/wAj4P8AIt3/ACHb/wAf2P8AHtb/ + AB3T/wAVw/8AAJn/AACZvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmU8AAJn/AACZ/wAs8v8AM///ADP//wlG//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//Jn///wY///8AM///ADP//wAy/v8AMv3/ADH8/wAx+/8AMPn/ + AC/4/wAu9v8ALfT/ACzy/wAr8P8AKu7/ACns/wAo6v8AJ+j/ACbm/wAl4/8AJOH/ACLe/wAh3P8AINn/ + AB/X/wAWxf8AAJn/AACZvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJm/AACZ/wAMsv8AM///ADP//wlG//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//y+S//8TWf//ADP//wAz//8AM/7/ADL+/wAx/f8AMfv/ + ADD6/wAv+P8AL/f/AC71/wAt8/8ALPH/ACvv/wAq7f8AKev/ACjp/wAm5v8AJeT/ACTi/wAj3/8AId3/ + ACDa/wARvP8AAJn/AACZrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkfAACZ7wAAmf8AHNL/ADP//wAz//8vkv// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//HGz//wAz//8AM///ADP//wAy/v8AMv3/ + ADH8/wAw+v8AMPn/AC/3/wAu9f8ALfT/ACzy/wAr8P8AKu7/ACnr/wAo6f8AJ+f/ACbl/wAk4v8AI+D/ + ACLd/wAKrf8AAJn/AACZbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZbwAAmf8AA5//AC/4/wAz//8fcv// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//x9y//8AM///ADP//wAz//8AMv7/ + ADL9/wAx/P8AMfv/ADD5/wAv+P8ALvb/AC30/wAs8v8AK/D/ACru/wAp7P8AKOr/ACfo/wAm5f8AJeP/ + ACHc/wAAmf8AAJn/AACZLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmc8AAJn/AA+4/wAz//8MTP// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8fcv//ADP//wAz//8AM/// + ADP+/wAy/v8AMf3/ADH7/wAw+v8AL/j/AC/2/wAu9f8ALfP/ACzx/wAr7/8AKu3/ACnr/wAn6P8AJub/ + ABK+/wAAmf8AAJnPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmS8AAJn/AACZ/wAj3/8AM/// + Jn///zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//HGz//wAz//8AM/// + ADP//wAz/v8AMv7/ADL9/wAx/P8AMPr/ADD5/wAv9/8ALvX/AC30/wAs8v8AK/D/ACru/wAp6/8AI9// + AAKd/wAAmf8AAJlfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJl/AACZ/wADn/8ALPL/ + Bj///zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//w9S//8AM/// + ADP//wAz//8AM///ADL+/wAy/f8AMfz/ADH7/wAw+f8AL/j/AC72/wAt9P8ALPL/ACvw/wAo6f8AB6j/ + AACZ/wAAmb8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZvwAAmf8ADLL/ + ADP//xZf//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//y+S//8DOf// + ADP//wAz//8AM///ADP//wAz/v8AMv7/ADH8/wAx+/8AMPr/AC/4/wAu9v8ALvX/ACrt/wAIqf8AAJn/ + AAaP/wBWF88AZgAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZHwAAme8AAJn/ + ABzS/wAz//8fcv//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8TWf// + ADP//wAz//8AM///ADP//wAz//8AM/7/ADL+/wAy/f8AMfz/ADD6/wAw+f8ALPH/AAiq/wAAmf8BC5H/ + AVce/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmV8AAJn/ + AACZ/wAp6/8DOf//KYX//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8ZZv// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAy/v8AMv3/ADH8/wAu9f8ACav/AACZ/wILkv8VkTz/ + DJER/wBmAP8AZgD/AGYATwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmf + AACZ/wAGpf8AL/j/Azn//ymF//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8ZZv// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/7/AC/3/wAJq/8AAJn/AgyT/xyYR/8WpSD/ + AWoB/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkP + AACZzwAAmf8AD7j/ADP//wM5//8phf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8MTP// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AL/j/AAms/wAAmf8DDJT/I59R/x2sK/8BawL/ + AGYA/wBmAM8AZgAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACZLwAAme8AAJn/ABbF/wAz//8DOf//H3L//zOZ//8zmf//M5n//zOZ//8zmf//M5n//xxs//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAv+P8ACaz/AACZ/wMNlP8qplz/JLM2/wJrA/8AZgD/ + AGYAzwBmAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAmU8AAJn/AACZ/wAf2P8AM///ADP//w9S//8sjP//M5n//zOZ//8vkv//Fl///wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///AC/4/wAJrP8AAJn/BA2V/zGuZ/8rukH/A2wE/wBmAP8AZgDP + AGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJlvAACZ/wAAmf8AH9j/ADP//wAz//8AM///CUb//wxM//8DOf//ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AL/j/AAms/wAAmf8EDpb/ObVx/zLCTP8DbAX/AGYA/wBmAM8AZgAP + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZnwAAmf8AAJn/ABnM/wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAv+P8ACaz/AACZ/wUOl/8/vHz/OslW/wRtBv8AZgD/AGYAzwBmAA8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAmZ8AAJn/AACZ/wAMsv8ALPL/ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///AB/Y/wADn/8AAJn/AAaP/yuXXf9A0GH/BG0G/wBmAP8AZgDPAGYADwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJlfAACZ7wAAmf8AAJn/ABO//wAj3/8AM///ADP//wAz//8AM/// + ACnr/wAc0v8ABqX/AACZ/wAAmf8ABo7vAFIc/wBmAP8Fbgf/AGYA/wBmAM8AZgAPAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZHwAAmb8AAJn/AACZ/wAAmf8AAJn/AAOf/wAGpf8AAJn/ + AACZ/wAAmf8AAJn/AACZ7wAAmX8AAJkPAGYAnwBmAP8AZgD/AGYAzwBmAA8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkvAACZjwAAmd8AAJn/AACZ/wAAmf8AAJn/ + AACZ7wAAma8AAJlfAACZDwAAAAAAAAAAAAAAAABmAH8AZgCfAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZHwAAmT8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA//////8OAAAP/////w4AAAB/////DAAAAA + ////8MAAAAAP///wwAAAAAH///DAAAAAAD//8MAAAAAAB//wgAAAAAAA//CAAAAAAAAf8IAAAAAAAAfw + gAAAAAAAAfCAAAAAAAAAcIAAAAAAAAAwgAAAAAAAABDAAAAAAAAAEMAAAAAAAAAA4AAAAAAAAADgAAAA + AAAAAOAAAAAAAAAA8AAAAAAAAADwAAAAAAAAEPgAAAAAAAAQ+AAAAAAAABD8AAAAAAAAEPwAAAAAAAAQ + /gAAAAAAADD+AAAAAAAA8P8AAAAAAAPw/wAAAAAAB/D/gAAAAAAD8P+AAAAAAAPw/8AAAAAAAfD/4AAA + AAAB8P/gAAAAAADw//AAAAAAAPD/8AAAAAAA8P/4AAAAAADw//gAAAAAAPD//AAAAAAA8P/+AAAAAADw + //4AAAAAAPD//wAAAAAA8P//gAAAAAHw//+AAAAAAfD//8AAAAAD8P//4AAAAAHw///gAAAAAPD///AA + AAAA8P//+AAAAADw///4AAAAAfD///wAAAAD8P///gAAAAfw////AAAAD/D///+AAAAf8P///8AAAD/w + ////4AAAf/D////wAAD/8P////wAcf/w/////8////AoAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAMAAAAGQAAACUAAAAwAAAAOQAAAEAAAABA + AAAAPAAAADYAAAAuAAAAKAAAACEAAAAaAAAAFAAAAA8AAAALAAAABwAAAAUAAAADAAAAAgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAXAAAAKgAAAEQAAABZ + AAAAaQAAAHQAAAB7AAAAfAAAAHgAAABwAAAAZwAAAGAAAABVAAAASwAAAEAAAAA3AAAALAAAACIAAAAc + AAAAFQAAAA8AAAAKAAAABwAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAT + AAAAMAAAAE0AAABvAAAAhQAAAJMAAACcAAAAoQAAAKIAAACfAAAAmgAAAJMAAACNAAAAhAAAAHoAAABv + AAAAZAAAAFgAAABLAAAAQQAAADUAAAArAAAAIgAAABoAAAASAAAADQAAAAgAAAAFAAAAAwAAAAEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAIAAAANAAAAJgAAAFQAAAB5AAAAmwAAAKsAAAC0AAAAtwAAALkAAAC5AAAAuAAAALcAAAC0 + AAAAsQAAAK0AAACoAAAAoQAAAJkAAACRAAAAhQAAAHwAAABvAAAAYwAAAFYAAABJAAAAOwAAADAAAAAl + AAAAGwAAABMAAAANAAAACAAAAAUAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAEwAAADQAAABrAAAAkgAAAK8AAAC5AAAYxQAAAL4AAAC+ + AAAAvgAAAL4AAAC9AAAAvQAAALwAAAC7AAAAuQAAALcAAAC0AAAAsAAAAKoAAACkAAAAnAAAAJMAAACJ + AAAAfQAAAG8AAABhAAAAVAAAAEcAAAA4AAAALQAAACEAAAAZAAAAEQAAAAwAAAAHAAAABAAAAAIAAAAB + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA4AAAAcQAATL4AAIPw + AACZ/wAAmf8AAJn/AACK9wAAaecAADnTAAAAvwAAAL8AAAC+AAAAvgAAAL4AAAC+AAAAvQAAALwAAAC6 + AAAAuQAAALUAAACxAAAArAAAAKUAAACcAAAAkwAAAIgAAAB7AAAAagAAAF0AAABOAAAAQAAAADQAAAAo + AAAAHgAAABQAAAANAAAACAAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAQ + AAAoPAAAjeAAAJn/AACZ/wAAmf8AAJn/AACZ/wAAmf8AAJn/AACZ/wAAkfsAAGDjAAAYxwAAAL8AAAC/ + AAAAvwAAAL4AAAC+AAAAvgAAAL4AAAC9AAAAvAAAALsAAAC4AAAAtQAAALEAAACrAAAAowAAAJkAAACP + AAAAgQAAAHQAAABmAAAAVwAAAEkAAAA5AAAALAAAACAAAAAWAAAADwAAAAoAAAAGAAAAAwAAAAEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAABAABfGQAAldQAAJn/AACZ/wAIqv8AF8j/ABrO/wAYyf8AEbv/AAWk/wAAmf8AAJn/ + AACZ/wAAmf8AAHrvAAAvzwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAAL0AAAC9 + AAAAuwAAALgAAAC0AAAAsAAAAKkAAAChAAAAlgAAAIoAAAB9AAAAbAAAAFwAAABMAAAAOwAAAC8AAAAi + AAAAGAAAABAAAAAJAAAABQAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmKAAAJn/AACZ/wAXyP8AJeL/ACPg/wAi3v8AIdv/ + ACDZ/wAf1/8AGs3/AA61/wABnP8AAJn/AACZ/wAAmf8AAIr3AABE1wAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvQAAALwAAAC7AAAAuAAAALQAAACvAAAAqAAAAJ4AAACS + AAAAhQAAAHUAAABnAAAAVgAAAEYAAAA2AAAAKAAAABwAAAASAAAACwAAAAYAAAADAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmB8AAJn/AACZ/wAUwf8AJ+f/ + ACbl/wAl4/8AJOH/ACPf/wAh3P8AINr/AB/X/wAe1f8AHNL/ABG8/wAFo/8AAJn/AACZ/wAAmf8AAIr3 + AABE1wAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvgAAAL0AAAC9 + AAAAuwAAALkAAAC1AAAAsAAAAKkAAACfAAAAlgAAAIgAAAB5AAAAaQAAAFgAAABGAAAANQAAACcAAAAZ + AAAAEAAAAAkAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJlv + AACZ/wACnv8AJ+f/ACjq/wAn6P8AJub/ACXk/wAk4v8AI9//ACLd/wAh2/8AH9j/AB7W/wAd0/8AHNH/ + ABTB/wAGpv8AAJn/AACZ/wAAmf8AAIr3AABE1wAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvQAAALwAAAC6AAAAtwAAALMAAACsAAAAowAAAJgAAACK + AAAAegAAAGYAAABVAAAAPwAAAC8AAAAgAAAAFAAAAAwAAAAGAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZnwAAmf8ADbT/ACvv/wAq7f8AKev/ACjp/wAn5/8AJuX/ACTi/wAj4P8AIt7/ + ACHb/wAg2f8AHtf/AB3U/wAc0f8AG8//ABPA/wAGpf8AAJn/AACZ/wAAmf8AAIr3AABE1wAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAAL4AAAC9 + AAAAuwAAALkAAAC0AAAArgAAAKYAAACZAAAAjAAAAHgAAABlAAAAUgAAAD0AAAAsAAAAHQAAABEAAAAJ + AAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAma8AAJn/ABC6/wAs8f8AK+//ACru/wAp7P8AKOn/ + ACfn/wAm5f8AJeP/ACTh/wAi3v8AIdz/ACDa/wAf1/8AHtX/ABzS/wAb0P8AGs3/ABK+/wAGpf8AAJn/ + AACZ/wAAmf8AAIr3AAA50wAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvQAAALsAAAC3AAAAsQAAAKoAAACeAAAAkAAAAH8AAABq + AAAAVQAAAEEAAAAtAAAAHAAAAA4AAAAHAAAAAgAAAAAAAAAAAAAAAAAAAAAAAJl/AACZ/wAIqv8ALfT/ + ACzy/wAr8P8AKu7/ACns/wAo6v8AJ+j/ACbm/wAl5P8AJOL/ACPf/wAi3f8AINr/AB/Y/wAe1v8AHdP/ + ABzR/wAazv8AGcv/ABK9/wAFpP8AAJn/AACZ/wAAmf8AAHrvAAAvzwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAAL0AAAC7 + AAAAtwAAALIAAACpAAAAnAAAAIwAAAB4AAAAYQAAAEcAAAAtAAAAGgAAAAoAAAADAAAAAAAAAAAAAAAA + AACZPwAAmf8AAJn/ACvw/wAt9P8ALPP/ACzx/wAr7/8AKu3/ACnr/wAo6f8AJ+f/ACbk/wAk4v8AI+D/ + ACLe/wAh2/8AINn/AB7W/wAd1P8AHNH/ABvP/wAZzP8AGMn/ABG8/wACnv8AAJn/AACZ/wAAmf8AAHLr + AAAYxwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAvgAAAL4AAAC8AAAAuQAAALQAAACsAAAAoAAAAI8AAAB4AAAAVwAAADsAAAAc + AAAACwAAAAIAAAAAAAAAAAAAAAAAAJnvAACZ/wAd1P8ALvf/AC71/wAt8/8ALPH/ACvv/wAq7v8AKev/ + ACjp/wAn5/8AJuX/ACXj/wAk4f8AIt7/ACHc/wAg2v8AH9f/AB7V/wAc0v8AG9D/ABrN/wAYyv8AF8j/ + AA61/wACnv8AAJn/AACZ/wAAmf8AAFffAAAMwwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9AAAAugAAALYAAACt + AAAAnwAAAIIAAABjAAAAOQAAABsAAAAIAAAAAQAAAAAAAAAAAACZnwAAmf8ACav/ADD5/wAv9/8ALvX/ + AC30/wAs8v8AK/D/ACru/wAp7P8AKOr/ACfo/wAm5v8AJeT/ACTh/wAj3/8AIt3/ACDa/wAf2P8AHtX/ + AB3T/wAb0P8AGs7/ABnL/wAYyf8AFcP/AAqu/wABm/8AAJn/AACZ/wAAkfsAAETXAAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvgAAAL4AAAC9AAAAugAAALQAAACiAAAAiAAAAFsAAAAxAAAAEwAAAAUAAAAAAAAAAAAAmU8AAJn/ + AACZ/wAn6P8AMPn/AC/4/wAu9v8ALfT/ACzz/wAs8f8AK+//ACrt/wAp6/8AKOn/ACfm/wAm5P8AJOL/ + ACPg/wAi3v8AIdv/ACDZ/wAe1v8AHdT/ABzR/wAbz/8AGcz/ABjJ/wAXx/8AFMH/AAeo/wAAmf8AAJn/ + AACZ/wAAeu8AACTLAAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC8AAAAtAAAAKIAAAB6AAAASgAAACAAAAAJ + AAAAAAAAAAAAAAAAAACZ3wAAmf8AEr7/ADH7/wAw+v8AL/j/AC72/wAu9f8ALfP/ACzx/wAr7/8AKu3/ + ACnr/wAo6f8AJ+f/ACbl/wAl4/8AJOH/ACLe/wAh3P8AINr/AB/X/wAe1f8AG87/AA20/wARvP8AGMr/ + ABfI/wAWxf8AEbv/AAWj/wAAmf8AAJn/AACZ/wAAYOMAAAzDAAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAALsAAACw + AAAAkAAAAF8AAAAuAAAADwAAAAAAAAAAAAAAAAAAmX8AAJn/AACZ/wAu9v8AMfv/ADD6/wAw+f8AL/f/ + AC71/wAt9P8ALPL/ACvw/wAq7v8AKez/ACjq/wAn6P8AJub/ACXk/wAk4f8AI9//ACLd/wAg2v8AHdT/ + AAWk/wAAmf8AA5//ABrO/wAZy/8AGMj/ABbG/wAVw/8ADLL/AAGb/wAAmf8AAJn/AACR+wAAOdMAAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC9AAAAtQAAAJgAAABpAAAANAAAABEAAAAAAAAAAAAAAAAAAJkPAACZ/wAAmf8AGcv/ + ADL9/wAx/P8AMfr/ADD5/wAv9/8ALvb/AC30/wAs8/8ALPH/ACvv/wAq7f8AKev/ACjp/wAn5v8AJeT/ + ACTi/wAj4P8AINn/AAal/wAAmf8AAJn/AA62/wAc0f8AG8//ABnM/wAYyf8AF8f/ABXE/wATv/8ACKr/ + AACZ/wAAmf8AAJn/AAB67wAAGMcAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvQAAALUAAACYAAAAaAAAADQAAAASAAAAAAAAAAAAAAAA + AAAAAAAAmZ8AAJn/AAOf/wAv+P8AMv3/ADH8/wAx+/8AMPn/AC/4/wAu9v8ALvX/AC3z/wAs8f8AK+// + ACrt/wAp6/8AKOn/ACfn/wAm5f8AIt7/AAam/wAAmf8AAJn/AAyx/wAf1/8AHtT/ABzS/wAbz/8AGs3/ + ABjK/wAXx/8AFsX/ABTC/wAPuP8AA6D/AACZ/wAAmf8AAJH7AABN2wAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAALsAAACxAAAAjwAAAF4AAAAt + AAAADgAAAAAAAAAAAAAAAAAAAAAAAJkfAACZ/wAAmf8AHNL/ADP+/wAy/f8AMfz/ADH7/wAw+v8AL/n/ + AC/3/wAu9f8ALfT/ACzy/wAr8P8AKu7/ACns/wAo6v8AJ+j/AAyx/wAAmf8AAJn/AA2z/wAi3f8AINr/ + AB/Y/wAe1f8AHdP/ABvQ/wAazv8AFMH/AAWk/wALr/8AFcP/ABPA/wAKrv8AAZv/AACZ/wAAmf8AAHrv + AAAYxwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC6 + 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 + AC31/wAt8/8ALPH/ACvv/wAq7f8AJub/AAeo/wAAmf8AAJn/AA20/wAj4P8AIt7/ACHc/wAg2f8AH9f/ + AB3U/wAc0v8AG8//ABnN/wAYyv8AF8f/ABXE/wAUwv8AEr3/AAOg/wAAmf8AAJn/AACZLwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkP + AACZ3wAAmf8ADLL/ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz/v8AMv3/ + ADH8/wAx+/8AMPr/AC/4/wAv9/8ALvX/AC3z/wAs8v8AK/D/AAio/wAAmf8AAJn/AA62/wAm5f8AJeP/ + ACTh/wAj3/8AIdz/ACDa/wAf2P8AHtX/ABzS/wAb0P8AGs3/ABnL/wAXyP8AFsX/ABTC/wASvf8AAZv/ + AACZ/wAAmc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAmV8AAJn/AACZ/wAf2P8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP+/wAy/v8AMv3/ADH8/wAw+v8AMPn/AC/3/wAu9v8ALfT/ACHc/wAAmf8AAJn/ + AA+4/wAp6v8AJ+j/ACbm/wAl5P8AJOL/ACPf/wAi3f8AIdv/AB/Y/wAe1v8AHdP/ABzR/wAazv8AGcz/ + ABjJ/wAWxv8AFcP/AA61/wAAmf8AAJn/AACZXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZvwAAmf8ABqX/AC/4/wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADL+/wAy/f8AMfz/ADH7/wAw+f8AL/j/ + AC72/wAr7/8ADrX/ABbF/wAr7/8AKu3/ACnr/wAo6f8AJ+f/ACbl/wAl4v8AI+D/ACLe/wAh2/8AINn/ + AB/X/wAd1P8AHNL/ABvP/wAZzP8AGMr/ABfH/wAVxP8ABaP/AACZ/wAAmc8AAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZPwAAmf8AAJn/ABO//wAz//8TWf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz/v8AMv7/ + ADL9/wAx/P8AMfr/AB7V/wAAmf8AAJn/BSGE/xOfJv8BagH/AGYA/wBmAP8AZgAPAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJl/AACZ/wAAmf8AH9j/ADP//xNZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAy/v8AMv3/AB/X/wAAmf8AAJn/BiOG/xurM/8Igg3/AGYA/wBmAP8AZgDP + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmb8AAJn/ + AAOf/wAp6/8AM///E1n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//ymF//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///AB/Y/wAAmf8AAJn/CCWI/yOyP/8LhRH/ + AGYA/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJkPAACZ7wAAmf8ABqX/AC/4/wAz//8TWf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8MTP//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///AB/Y/wAAmf8AAJn/ + CSaK/yu7Sv8OiBb/AGYA/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmS8AAJn/AACZ/wAJrP8AL/j/ADP//wlG//8phf// + M5n//zOZ//8zmf//M5n//zOZ//8TWf//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + AB/Y/wAAmf8AAJn/CyiN/zPCVv8Sixv/AGYA/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZXwAAmf8AAJn/ + ABO//wAz//8AM///ADP//xNZ//8jef//Jn///x9y//8GP///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///AB/Y/wAAmf8AAJn/DCmP/zrKYf8Vjh//AGYA/wBmAP8AZgDPAGYADwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJmPAACZ/wAAmf8AD7j/AC/4/wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///AB/Y/wAAmf8AAJn/DiuS/0LRbv8YkST/AGYA/wBmAP8AZgDP + AGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmZ8AAJn/AACZ/wAJrP8ALPL/ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ABnM/wAAmf8AAJn/ECyU/0rZef8blCn/ + AGYA/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZjwAAmf8AAJn/ + AAOf/wAZzP8AL/j/ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AH9j/AAal/wAAmf8AAJn/ + ABN8/xB5If8ely3/AGYA/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJlfAACZ7wAAmf8AAJn/AAOf/wATv/8AI9//ACbl/wAz//8AJuX/ACPf/wAWxf8ABqX/ + AACZ/wAAmf8AAJn/ABV43wBfCf8AZgD/AGYA/wBmAP8AZgDPAGYADwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmR8AAJmfAACZ/wAAmf8AAJn/AACZ/wAAmf8AAJn/ + AACZ/wAAmf8AAJn/AACZ/wAAmf8AAJm/AACZPwAAAAAAZgCfAGYA/wBmAP8AZgDPAGYADwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmR8AAJmP + AACZzwAAmf8AAJn/AACZ/wAAmf8AAJn/AACZzwAAmY8AAJkvAAAAAAAAAAAAAAAAAAAAAABmAH8AZgCf + AGYADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZDwAAmT8AAJkPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAPgAB///////8AAAP//////gAAAH/////8AAAAB/////wAAAAAf////AAAAA + AP///8AAAAAAD///wAAAAAAD///AAAAAAAA//4AAAAAAAA//gAAAAAAAAf+AAAAAAAAAf4AAAAAAAAAf + gAAAAAAAAAeAAAAAAAAAA8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAeAAAAAAAAAA4AAAAAAAAADgAAAA + AAAAAPAAAAAAAAAA8AAAAAAAAAD4AAAAAAAAAfgAAAAAAAAB/AAAAAAAAAH8AAAAAAAAAf4AAAAAAAAB + /gAAAAAAAAP/AAAAAAAAD/8AAAAAAAA//4AAAAAAAP//gAAAAAAAf//AAAAAAAA//8AAAAAAAD//4AAA + AAAAH//wAAAAAAAf//AAAAAAAA//+AAAAAAAD//4AAAAAAAP//wAAAAAAA///gAAAAAAD//+AAAAAAAP + //8AAAAAAA///wAAAAAAD///gAAAAAAf///AAAAAAB///8AAAAAAH///4AAAAAA////wAAAAAD////AA + AAAAH///+AAAAAAP///8AAAAAB////4AAAAAH////gAAAAA/////AAAAAH////+AAAAA/////8AAAAH/ + ////4AAAA//////wAAAH//////gAAA///////AAEH///////AB4////////x////KAAAAEgAAACQAAAA + AQAgAAAAAABgVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAGAAAACoAAAA8 + AAAATQAAAFsAAABlAAAAbQAAAHEAAABwAAAAawAAAGQAAABdAAAAVQAAAEwAAABDAAAAOgAAADIAAAAq + AAAAIgAAABsAAAAVAAAAEAAAAA0AAAAIAAAABgAAAAMAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAYAAAAMgAAAE0AAABmAAAAegAAAIcAAACR + AAAAlwAAAJoAAACZAAAAlQAAAJAAAACLAAAAgwAAAHsAAABxAAAAZwAAAF0AAABUAAAASQAAAEAAAAA2 + AAAALQAAACUAAAAdAAAAFgAAAA8AAAALAAAACAAAAAYAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAABAAAABgAAABIAAAAtAAAAUgAAAHIAAACNAAAAngAAAKgAAACuAAAAsQAAALMAAACz + AAAAsAAAAK4AAACqAAAApgAAAKEAAACbAAAAkwAAAIsAAACCAAAAeQAAAG4AAABjAAAAWQAAAE8AAABD + AAAAOAAAAC0AAAAkAAAAHAAAABYAAAAQAAAACwAAAAcAAAAEAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB + AAAACAAAABsAAABBAAAAbwAAAJEAAACmAAAAsQAAALYAAAC6AAAAuwAAALwAAAC8AAAAvAAAALsAAAC5 + AAAAuAAAALUAAACzAAAAsAAAAKoAAAClAAAAnwAAAJgAAACQAAAAhwAAAH4AAAByAAAAZAAAAFgAAABM + AAAAQQAAADYAAAAtAAAAIwAAABoAAAATAAAADgAAAAkAAAAGAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACwAAACMAAABO + AAAAfgAAAJ0AABi7AABD1AAAT9sAAFPcAAAwzgAAC8IAAAC9AAAAvQAAAL0AAAC+AAAAvgAAAL0AAAC8 + AAAAuwAAALoAAAC4AAAAtAAAALAAAACtAAAApwAAAKIAAACaAAAAkAAAAIYAAAB7AAAAbwAAAGMAAABW + AAAASQAAAD0AAAAzAAAAKAAAAB8AAAAYAAAAEAAAAAoAAAAHAAAABAAAAAIAAAACAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAACMAAABIAAAtkwAAduIAAJD6 + AACU/QAAlf0AAJX9AACT/AAAlPsAAHrwAABS3QAAEcUAAAC9AAAAvgAAAL8AAAC+AAAAvgAAAL4AAAC9 + AAAAvQAAALwAAAC6AAAAuQAAALcAAACyAAAArQAAAKcAAACgAAAAmAAAAI8AAACFAAAAeAAAAGsAAABe + AAAAUQAAAEUAAAA6AAAALgAAACEAAAAZAAAAEgAAAAwAAAAHAAAABQAAAAIAAAABAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAABIAAHOgAACR8wAAmP4AAJj/AACW/wAAlv8AAJb/ + AACX/wAAmf8AAJj/AACV/QAAlPsAAG7pAAA10QAAAL4AAAC8AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+ + AAAAvgAAAL4AAAC8AAAAugAAALgAAAC0AAAAsgAAAKwAAACmAAAAngAAAJUAAACKAAAAgAAAAHQAAABo + AAAAWQAAAEkAAAA9AAAAMQAAACYAAAAbAAAAFAAAAA4AAAAJAAAABgAAAAMAAAABAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAf34AAJj0AACa/wAAlf8ACar/ABbI/wAe1f8AHNL/ABXD/wALsP8AAZv/ + AACX/wAAmf8AAJf+AACU/AAAifcAAFHcAAAFwAAAALsAAAC+AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+ + AAAAvgAAAL4AAAC9AAAAvAAAALoAAAC4AAAAtAAAALAAAACqAAAAowAAAJwAAACSAAAAhgAAAHcAAABr + AAAAXQAAAE4AAABAAAAAMwAAACkAAAAgAAAAFwAAAA8AAAAKAAAABQAAAAMAAAABAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACDLQAAme4AAJn/AACW/wAZyv8AIt3/ACLf/wAi3v8AIdz/AB/Z/wAd1P8AHNL/ABTB/wAJq/8AAJn/ + AACX/wAAmf8AAJX8AACM+QAAYeQAABXFAAAAvAAAAL4AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvgAAAL4AAAC9AAAAvAAAALsAAAC5AAAAtgAAALMAAACuAAAApwAAAJ4AAACVAAAAiQAAAHwAAABu + AAAAYQAAAFMAAABFAAAAOAAAACwAAAAgAAAAFgAAAA4AAAAJAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVpwAAmf4AAJT/ + ABrM/wAl5P8AJeT/ACXi/wAj4f8AIt//ACHc/wAg2v8AH9j/AB3W/wAc0P8AF8j/AA2y/wABnP8AAJf/ + AACa/wAAlv0AAI35AABh5QAAFcYAAAC8AAAAvgAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC+AAAAvQAAALwAAAC7AAAAuAAAALQAAACvAAAAqQAAAKEAAACWAAAAjAAAAIEAAABz + AAAAZQAAAFYAAABGAAAANQAAACgAAAAdAAAAEwAAAAwAAAAHAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMSAACY9AAAmP8ACq7/ACbm/wAo6v8AJ+f/ + ACbk/wAl4/8AJOH/ACPe/wAi3P8AIdr/ACDa/wAf1/8AHdX/ABvQ/wAYyv8AELn/AAOg/wAAl/8AAJr/ + AACX/QAAi/kAAGDkAAAWxgAAALsAAAC+AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAvgAAALwAAAC7AAAAuAAAALYAAACyAAAArAAAAKYAAACdAAAAkwAAAIYAAAB4 + AAAAZwAAAFUAAABHAAAANwAAACkAAAAdAAAAFAAAAA0AAAAIAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhQAACZ/AAAl/8AG8//ACrr/wAp6/8AKOn/ACfo/wAm5f8AJeP/ + ACTi/wAj4P8AIt7/ACHd/wAg2f8AH9f/AB7W/wAd1P8AG8//ABnL/wARvP8ABKH/AACW/wAAmv8AAJb9 + AACL+AAAYeQAABfGAAAAuwAAAL4AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAvgAAAL0AAAC8AAAAuwAAALkAAAC1AAAAsQAAAKoAAAChAAAAlgAAAIgAAAB5 + AAAAagAAAFgAAABIAAAANwAAACkAAAAeAAAAFAAAAAwAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJZ5AACZ/AAAlv8AKev/ACvv/wAq7f8AKev/ACjq/wAn6P8AJub/ACXk/wAl4v8AI+D/ + ACLf/wAh3P8AINr/AB/Y/wAe1v8AHdT/ABzS/wAazv8AGMr/ABG6/wAEof8AAJf/AACa/wAAl/0AAIr4 + AABi5QAAEMQAAAC5AAAAvgAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9AAAAuwAAALkAAAC2AAAAsAAAAKgAAACfAAAAkwAAAIUAAAB1 + AAAAZAAAAFMAAABDAAAAMQAAACQAAAAXAAAADgAAAAUAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZz + AACZ/AAAl/8AJ+j/ACzy/wAr8P8AKu7/ACrr/wAp6v8AKOj/ACfm/wAm5P8AJeL/ACTh/wAj3/8AIt3/ + ACHb/wAg2f8AH9b/AB3U/wAc0/8AG9H/ABnM/wAXyP8AELn/AASg/wAAlv8AAJr/AACY/QAAhfYAAFLe + AAAJwQAAALoAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9AAAAvAAAALgAAAC0AAAArgAAAKYAAACbAAAAjgAAAH8AAABv + AAAAXQAAAEkAAAA3AAAAJQAAABMAAAALAAAABAAAAAEAAAAAAAAAAAAAAAAAAKVJAACZ+gAAl/8AHdT/ + ACzy/wAs8f8AK+//ACvu/wAq7f8AKer/ACjo/wAn5/8AJub/ACXk/wAk4v8AI+D/ACLe/wAh2/8AINn/ + AB/X/wAe1f8AHdP/ABzR/wAa0P8AGMv/ABbF/wAPt/8AA6D/AACX/wAAm/8AAJX8AACE9QAARtkAAAC9 + AAAAuwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC8AAAAuwAAALcAAACzAAAAqwAAAKIAAACWAAAAhgAAAHUAAABh + AAAASgAAAC8AAAAcAAAADwAAAAYAAAABAAAAAAAAAAAAAB0KAACW/wAAmP8AEr//ACzz/wAt9P8ALPL/ + ACzx/wAr7v8AKu3/ACnr/wAo6v8AJ+j/ACbm/wAl5P8AJOL/ACPg/wAi3v8AIdz/ACDa/wAf2P8AHtb/ + AB3T/wAc0f8AG9D/ABvN/wAYyf8AFcL/AAyx/wABnf8AAJf/AACc/wAAk/sAAHfvAAA40wAAALwAAAC8 + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAvgAAAL0AAAC8AAAAuQAAALUAAACwAAAApwAAAJsAAACKAAAAdQAAAFUAAAA7 + AAAAIgAAABAAAAAGAAAAAQAAAAAAAAAAAACVwQAAmf0ABKD/ACvx/wAu9v8ALvX/AC3y/wAs8f8AK/D/ + ACru/wAp6/8AKer/ACjp/wAn5/8AJuX/ACXj/wAk4f8AI9//ACLd/wAh2/8AINn/AB/W/wAd1P8AHNL/ + ABvQ/wAazf8AGcz/ABjH/wATv/8AC6//AACb/wAAl/8AAJv/AACR+QAAb+wAACTLAAAAuQAAAL4AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAvgAAALwAAAC7AAAAuAAAALEAAACoAAAAmQAAAH0AAABfAAAAPwAAACMAAAAO + AAAABQAAAAAAAAAAAACVcAAAmfwAAJf/ACDa/wAu9v8AL/b/AC70/wAt8/8ALPH/ACvv/wAq7v8AKu3/ + ACnr/wAo6f8AJ+f/ACbl/wAl5P8AJOL/ACPg/wAi3v8AIdv/ACDZ/wAe1/8AHdX/AB3T/wAb0P8AGs7/ + ABnN/wAYyv8AF8X/ABK9/wAIqv8AAJn/AACa/wAAm/8AAIj2AABZ4gAAEMMAAAC4AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC+AAAAvQAAALwAAAC4AAAAsAAAAJsAAACCAAAAXwAAADsAAAAdAAAACgAAAAAAAAAA + AAClGwAAmvMAAJj/AA62/wAu9/8AMPn/AC/2/wAu9f8ALfP/ACzy/wAs8P8AK+//ACrt/wAp7P8AKOr/ + ACfo/wAm5v8AJeT/ACTi/wAj4P8AIt7/ACHc/wAg2v8AH9j/AB7W/wAd0/8AG9H/ABvP/wAZzP8AGcv/ + ABfK/wAVw/8AELj/AAak/wAAl/8AAJv/AACW/QAAgPMAAEfZAAAAvQAAALoAAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC+AAAAugAAAK8AAACcAAAAfQAAAFQAAAAvAAAAEwAAAAAAAAAAAAAAAAAAlbQAAJn9 + AAKZ/wAr8P8AMPr/ADD4/wAv9/8ALvX/AC30/wAt8v8ALPD/ACvv/wAq7/8AKez/ACjq/wAn6P8AJuf/ + ACXl/wAk4/8AI+H/ACLf/wAh3f8AIdv/AB/Z/wAe1v8AHdT/AB3S/wAd0v8AGc3/ABnL/wAZyv8AF8b/ + ABPB/wANs/8AA5//AACX/wAAnf8AAJP6AABw7AAAMNAAAAC7AAAAvQAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+ + AAAAvgAAALkAAACtAAAAkwAAAGwAAABAAAAAHQAAAAAAAAAAAAAAAAAAo1IAAJr9AACV/wAXx/8AMPn/ + ADH7/wAw+f8AL/f/AC/2/wAu9P8ALfP/ACzy/wAr8P8AKu7/ACrt/wAp6/8AKOn/ACfn/wAm5f8AJeP/ + ACTi/wAj4P8AIt3/ACHb/wAf2f8AH9j/AB/X/wAQuf8ABqD/AAyx/wAXyP8AGMv/ABjJ/wAWxf8AEb3/ + AAqt/wAAm/8AAJj/AACd/wAAivcAAFniAAASxAAAALgAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAALwAAAC1 + AAAAoQAAAH0AAABOAAAAJgAAAAAAAAAAAAAAAAAAKQsAAJPdAACY/gADoP8ALvb/ADH9/wAx+v8AMPn/ + ADD4/wAv9v8ALvb/AC30/wAs8v8ALPH/ACvv/wAq7f8AKev/ACjq/wAn6P8AJub/ACXk/wAk4v8AI+D/ + ACHe/wAi3f8AIt7/ABC8/wACm/8AAJH/AAal/wAXyP8AG87/ABjK/wAXyP8AF8f/ABTC/wAPt/8AB6b/ + AACY/wAAm/8AAJj9AAB68AAAQNYAAAC8AAAAvAAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC4AAAApgAAAIUAAABW + AAAAKwAAAAAAAAAAAAAAAAAAAAAAAKF7AACb+wAAlf8AHdX/ADH7/wAx/P8AMfv/ADD5/wAw+P8AL/f/ + AC71/wAt9P8ALfP/ACzx/wAr7/8AKu7/ACns/wAo6v8AJ+j/ACbn/wAl5f8AJOP/ACTi/wAl4v8AE8D/ + AAKc/wAAk/8AAZr/ABG8/wAc0/8AG9D/ABnN/wAZy/8AGMn/ABbH/wAWxf8AE77/AAyy/wAEoP8AAJf/ + AACd/wAAkfkAAGboAAAjygAAALkAAAC+AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL0AAAC4AAAApQAAAIMAAABUAAAAKgAAAAAAAAAA + AAAAAAAAAAAAAC0UAACS5wAAmf8ABaT/AC72/wAy/v8AMvz/ADH7/wAx+v8AMPj/AC/3/wAu9v8ALvX/ + AC3z/wAs8v8AK/D/ACru/wAq7f8AKev/ACjp/wAn5/8AJub/ACbm/wAUwf8AA53/AACT/wABm/8AEbz/ + AB7W/wAf1v8AHNL/ABvQ/wAbzv8AGcz/ABjJ/wAYyf8AGcv/ABbG/wAQuv8ACar/AACa/wAAmv8AAJz/ + AACB9AAASNsAAAO+AAAAuwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL0AAAC1AAAAngAAAHkAAABLAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACOjQAAmvsAAJP/ACPe/wAy/f8AMv7/ADL9/wAx/P8AMfr/ADD5/wAv9/8AL/b/AC71/wAt9P8ALPL/ + ACzx/wAr7/8AKu3/ACnr/wAo6v8AKez/ABnL/wADoP8AAJL/AAGa/wASv/8AIdz/ACHc/wAf2P8AHtX/ + ABzT/wAc0f8AG8//ABzQ/wAUwf8AB6f/AAqv/wAUwf8AE8D/AA2z/wAFo/8AAJf/AACd/wAAlPsAAGbn + AAAkygAAALoAAAC+AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvgAAALsAAACvAAAAlgAAAG0AAABAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfHAAAm/EAAJf/ + AAqu/wAx+/8ANP//ADL+/wAy/f8AMfz/ADH7/wAw+f8AMPj/AC/3/wAu9v8ALfT/AC3z/wAs8f8AK+// + ACru/wAq7/8AI9//AAmr/wAAkf8AAZr/ABTC/wAj4f8AJOL/ACLd/wAg2/8AH9j/AB3W/wAd1P8AHtb/ + ABbF/wAFo/8AAJP/AAOf/wASvf8AF8f/ABXC/wAQuv8ACaz/AAKd/wAAmf8AAJ3/AACA8wAASNsAAAS/ + AAAAuwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAALkAAACr + AAAAjwAAAGQAAAA3AAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkqAAAJr7AACV/wAj4f8AM/3/ + ADP//wAz/v8AMv3/ADL8/wAx+/8AMPr/ADD5/wAv9/8ALvb/AC70/wAt8/8ALPH/ACvw/wAr8P8AJ+j/ + AA21/wAEn/8AFsT/ACbk/wAm5v8AJOH/ACPf/wAi3f8AINv/ACDZ/wAi2/8AGMr/AAWk/wAAlv8AAJX/ + AAmq/wAWyP8AGMj/ABbF/wAUw/8AE7//AA60/wAFpP8AAJj/AACd/wAAlfsAAGXnAAAlywAAALoAAAC+ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAALkAAACrAAAAjQAAAGIAAAA2 + AAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnCIAAJzwAACW/wAKrf8AMPv/ADT//wAz//8AM/7/ + ADL+/wAy/f8AMfz/ADH6/wAw+f8AL/j/AC/2/wAu9f8ALfP/ACzy/wAs8P8ALPH/ACPg/wAf2P8AJuf/ + ACjq/wAl5v8AJOT/ACPi/wAi4P8AIt7/ACTh/wAazv8AB6b/AACW/wAAlf8ACKn/ABfI/wAazv8AGMr/ + ABfI/wAWxf8AFcP/ABTC/wAQu/8ACq7/AAKd/wAAmP8AAJ7/AAB+8gAAP9cAAAC9AAAAvAAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvQAAALcAAACpAAAAjAAAAGIAAAA4AAAAFwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGhAACZ+wAAlP8AI+H/ADP9/wAz//8AM///ADP//wAy/v8AMv3/ + ADH8/wAx+/8AMPr/ADD4/wAv9/8ALvX/AC30/wAt8v8ALPH/ACzy/wAs8v8AKe3/ACfq/wAn6P8AJuf/ + ACXl/wAl4/8AJub/ABvS/wAGp/8AAJX/AACW/wAIqv8AGs3/AB3V/wAb0P8AGs3/ABnL/wAYyP8AFsb/ + ABXE/wAVxP8AE8D/AA2z/wAHpv8AAJf/AACd/wAAkvoAAF3lAAAXxgAAALkAAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC8AAAAuAAAAK4AAACdAAAAgQAAAFoAAAA0AAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJojAACc7gAAlf8ACq3/ADH7/wA0//8AM///ADP//wAz//8AM/7/ADL9/wAy/P8AMfv/ + ADD6/wAw+f8AL/f/AC72/wAu9P8ALfP/ACzx/wAr8P8AKu7/ACrs/wAp6/8AKOn/ACfn/wAp6/8AHtT/ + AAeo/wAAlf8AAJT/AAms/wAc0f8AIdv/AB7V/wAd0v8AG9D/ABvO/wAZzP8AGMr/ABjI/wARu/8AB6X/ + AAip/wANtP8ACav/AAGc/wAAmv8AAJ7/AABy7QAAMdAAAAC6AAAAvgAAAL8AAAC+AAAAvAAAALkAAACy + AAAAqAAAAJYAAACCAAAAZgAAAEUAAAAmAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACRoAAAmvwAAJT/AB/Z/wAz/P8ANP//ADP//wAz//8AM///ADP+/wAy/v8AMv3/ADD8/wAx+v8AMPn/ + AC/4/wAv9v8ALvX/AC3z/wAs8v8ALPD/ACzv/wAq7f8AKer/ACvv/wAg2P8ACKj/AACU/wAAlP8ACq3/ + AB7V/wAj4P8AIdr/ACDY/wAe1f8AHdP/ABzR/wAb0P8AGs7/ABO//wAEof8AAJT/AAGa/wANtP8AE8D/ + AAyx/wAEoP8AAJf/AACe/wAAhvUAAD/WAAABvAAAALkAAAC5AAAAsgAAAKkAAACcAAAAiQAAAHAAAABZ + AAAAQQAAACkAAAAWAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXJQAAneUAAJf/ + AAal/wAt9P8ANP//ADP//wAz//8AM///ADP//wAz//8AMv7/ADL9/wAx/P8AMfv/ADD5/wAw+f8AL/f/ + AC71/wAt9P8ALfL/AC3x/wAr7/8ALPL/ACHc/wAJrP8AAJT/AACU/wAKrv8AINr/ACbl/wAj3/8AId3/ + ACDa/wAg2P8AH9b/AB7U/wAd1f8AFcT/AAWh/wAAlf8AAJj/AAeo/wATwf8AFcL/ABTA/wAPtv8ABqb/ + AACX/wAAnP8AAJL6AABW3gAAELUAAACkAAAAmwAAAIoAAAB2AAAAXwAAAEQAAAAwAAAAIAAAABMAAAAJ + AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnoQAAJ34AACS/wAe1v8AMv3/ + ADT//wAz//8AM///ADP//wAz//8AM///ADP+/wAx/f8AMvz/ADH8/wAw+/8AMPn/AC/4/wAu9v8ALvT/ + AC7z/wAs8f8AL/n/ABTC/wAAjv8AAJH/AAux/wAi3f8AKer/ACbj/wAl4f8AI9//ACLd/wAh2v8AINn/ + ACDa/wAXyP8ABqP/AACU/wAAmP8ACKn/ABbE/wAYyf8AFcP/ABXC/wAUwP8AEbz/AAmr/wABm/8AAJv/ + AACb/gAAaNwAABySAAAAagAAAGEAAABKAAAANQAAACAAAAATAAAACwAAAAUAAAACAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhYAAJDfAACY/wAHpv8ALfX/ADT//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz/v8AMv7/ADL9/wAw/P8AMfr/ADD6/wAv+P8AL/b/AC/1/wAt8/8ALvf/ + ACDZ/wARuf8AEr7/ACLe/wAr7v8AJ+j/ACfm/wAm5P8AJeL/ACTf/wAj3v8AI9//ABnM/wAGpP8AAJP/ + AACY/wAJqv8AGMn/ABvP/wAYyf8AF8f/ABbF/wAVw/8AFMH/ABO//wALr/8ABKD/AACY/wAAnv8AAHbN + AAA4bwAAACYAAAAkAAAAFgAAAAoAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGDAACe+wAAkv8AGs//ADH8/wA0//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADL9/wAy/f8AMfz/ADH7/wAw+v8AMPn/ADD3/wAt9f8ALfT/AC3z/wAr7v8AKu// + ACvw/wAq7P8AKer/ACfo/wAm5v8AJeX/ACXj/wAl5P8AG9D/AAel/wAAk/8AAJf/AAqt/wAbzv8AHtb/ + ABvO/wAazf8AGcv/ABjH/wAWxv8AFcP/ABTB/wAUwP8ADrX/AASh/wAAl/8AAKD/AACQzAAAQ0MAAAAA + AAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEIXAACQzwAAmf4ABJz/ACvw/wA0//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz/v8AMf3/ADL7/wAx+/8AMPv/ADD4/wAv+P8ALfb/AC72/wAu9f8ALPP/ACvw/wAq7v8AKe3/ + ACnr/wAn6P8AJ+j/ACjp/wAd0/8AB6b/AACS/wAAl/8ACq7/ABzT/wAh3P8AHtT/AB3S/wAc0P8AGs7/ + ABnL/wAYyf8AF8f/ABbD/wAVwv8AE8D/AA+3/wAFpf8AAJf/AACd/wAAm8EAAEUWAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACPYQAAn/YAAJD/ABTE/wAx+/8ANP//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/7/ + ADL9/wAy/f8AMPz/ADD7/wAx+v8ALvj/AC73/wAu9f8ALPT/ACvy/wAr8f8AK+//ACvt/wAq7P8AKuz/ + AB7W/wAIp/8AAJH/AACY/wALsP8AHtf/ACTh/wAg2f8AINj/AB7V/wAd0/8AHNH/ABvP/wAazP8AGcr/ + ABfH/wAWxP8AFcP/ABTB/wAQuv8ABqX/AACX/wAAnP8AAJ+jAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAkMUAAJr9 + AACW/wAn5/8ANP//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADL//wAy//8AMfz/ + ADH8/wAx+/8AL/n/ADD5/wAw9/8ALfb/ACz0/wAt8/8ALfH/ACvv/wAr8P8AH9n/AAin/wAAkP8AAJj/ + AAyy/wAg2/8AJ+b/ACLe/wAh3P8AINr/AB/X/wAe1f8AHdP/ABzR/wAbzv8AGs7/ABnL/wAXx/8AFsb/ + ABXE/wAVwv8AEbv/AASg/wAAl/8AAJz/AACaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi0cAAJ/0AACS/wAOt/8AMPn/ + ADT//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAy//8AM/7/ADH8/wAx+/8AMfv/ + ADD7/wAw+P8AL/j/AC32/wAt9f8ALfP/AC71/wAj3/8ACKr/AACQ/wAAl/8ADbT/ACPf/wAp6v8AJeL/ + ACTh/wAj3v8AItz/ACHa/wAg2P8AH9b/AB3V/wAc0f8AG9H/ABrN/wAZyv8AGMr/ABfG/wAVxf8AFML/ + AA+2/wACnP8AAJn/AACT5AAAQhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+oAACb+QAAkf8AIdz/ADP9/wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP9/wAy/f8AMv3/ADD7/wAw+v8AMfr/ + AC73/wAu9/8ALvX/ADH8/wAYyf8AAIn/AACW/wAOtf8AJeP/ACvw/wAn5/8AJuX/ACbj/wAl4v8AJOD/ + ACPd/wAi2/8AIdr/AB/X/wAe1P8AHdP/ABzR/wAbzv8AGcz/ABjJ/wAXx/8AFsb/ABXD/wALsf8AAJf/ + AACc/QAAnY4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIcpAACg5AAAlP8ACar/ACzy/wA1//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAy//8AMv//ADH8/wAx/f8AMfv/AC/5/wAw+f8AMPf/ + ADD7/wAh3P8ADrD/ABK+/wAm5f8ALvT/ACnr/wAo6v8AJ+j/ACbm/wAl5P8AJOL/ACPg/wAi3v8AIdz/ + ACDZ/wAf1/8AHtb/AB3U/wAc0f8AG8//ABrN/wAZyv8AF8j/ABfH/wAUwf8AA5//AACZ/wAAlOwAAD4Y + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACajwAAnfoAAJD/ABvP/wAy/P8ANP//ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AMv//ADP+/wAx/v8AMfz/ADH8/wAw+/8AMPj/AC/4/wAv9/8AK/H/ + ACzx/wAv9v8AK+//ACru/wAp7P8AKer/ACjo/wAn5v8AJuT/ACXj/wAk4f8AI97/ACLc/wAh2v8AINn/ + AB/W/wAe0/8AHNL/ABvQ/wAazf8AGcv/ABjJ/wAXxv8ADbT/AACX/wAAm/oAAKBgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABJGAAAkMkAAJn+AAWe/wAn5v8ANP//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz/v8AMv3/ADL9/wAx/P8AMPr/ADH5/wAu+P8AMPn/AC/2/wAt9P8ALPL/ + ACvw/wAq7v8AK+3/ACrr/wAp6f8AKOf/ACfl/wAm4/8AJeH/ACTf/wAi3f8AItz/ACHZ/wAg1v8AHtX/ + AB3T/wAc0P8AGs7/ABnM/wAZyv8AFML/AAGZ/wAAmvsAAJGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAAAKLz + AACP/wAQuv8AL/j/ADX//wAz//8AM///ADP//wAz//8AM///ADD//wAs//8AK///ACz//wAt//8AMP// + ADL//wAz/v8AMv//ADL//wAy/v8AMv3/ADH7/wAw+f8AMPn/ADD3/wAu9v8ALfT/ACzy/wAs8f8AK+// + ACrt/wAp6/8AKOr/ACfo/wAm5v8AJeT/ACTi/wAk4P8AIt//ACHc/wAg2v8AH9j/AB7W/wAd0/8AHNH/ + ABvP/wAazf8AGMn/AAWl/wAAmf4AAJHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAJG5AACa/QAAlf8AIdz/ + ADP9/wAz//8AM///ADP//wAz//8ALv//B0L//xJW//8UWv//Elb//w1O//8FPv//ADD//wAv//8AM/// + ADP//wAy//8AMv3/ADH9/wAy/P8AMPr/ADD5/wAv+P8ALvb/AC31/wAu8/8ALPH/ACvw/wAq7v8AKez/ + ACnq/wAo6P8AJ+b/ACbk/wAm4v8AJOD/ACPe/wAi3f8AIdv/ACDZ/wAf1v8AHdT/ABzS/wAb0P8AGsz/ + AAqu/wAAmf8AAJH3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5BAACh5AAAk/8ACav/ACvx/wA1//8AM/// + ADP//wAw//8HPv//I3n//zih//86p///NqD//y+R//8ieP//E1n//wc///8AMP//ADD//wAz//8AMv// + ADL9/wAy/f8AMfz/ADD7/wAw+f8AL/f/AC73/wAu9f8ALfT/ACzy/wAr8P8AKu7/ACvt/wAq6/8AKen/ + ACjn/wAm5v8AJuP/ACXh/wAk4P8AI97/ACLc/wAh2f8AH9f/AB7V/wAd0/8AG8//AAyw/wAAmP8AAJHy + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAlK8AAJv7AACR/wAb0P8AK/z/EFX//y6P//81nf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zWd//8yl///GGT//wIx//8AMf// + ADP//wAz//8AM/7/ADL+/wAy/f8AMfz/ADH7/wAw+v8AL/j/AC/3/wAu9v8ALfX/ACzy/wAr8f8AK/D/ + ACru/wAp7P8AKOr/ACfn/wAVxf8AAJP/AACb+wAAlH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAbjoAAKTXAACU/wAHpP8AJuX/ADH//x5x//80nP//NJr//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//81nv//MJP//xJa//8ALv//ADL//wAz//8AM/// + ADP+/wAy/v8AMv3/ADH8/wAx+/8AMPr/AC/5/wAv+P8ALvb/AC31/wAs9P8ALPL/ACvw/wAq7v8AKu7/ + AB/Y/wACnv8AAJr+AACc2gAAbRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJl7AACd9wAAj/8AEbv/ACj1/wpH//8ohP//NZ3//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//N6D//yqH//8IRf//AC7//wAz//8AM///ADP//wAz//8AMv7/ + ADL9/wAx/f8AMfz/ADD7/wAw+v8AL/j/AC73/wAu9f8ALfT/ACzy/wAr8v8AIdv/AAam/wAAl/8AAZn2 + ABJwcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF + AACaqgAAnfsAAJL/ABrN/wAq+/8VXv//MJT//zSb//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//NJn//zWe//8hdf//AjL//wAx//8AM///ADP//wAz//8AM///ADP+/wAy/v8AMv3/ + ADH8/wAw+/8AMPr/AC/5/wAv9v8ALvb/AC32/wAi4P8AB6X/AACV/wAAmP8AHmv2AGIAdwATAAwAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQLwAAmMwAAJj/ + AAKc/wAh3v8AMf7/Gmn//zKZ//80nP//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zWd//8si///Dk///wAt//8AM///ADP//wAz//8AM///ADP//wAz/v8AMv7/ADL9/wAx/P8AMfv/ + ADD6/wAw+f8AL/n/ACTi/wAHp/8AAJX/AAGY/wImb/8AYgT/AGoA/wBrAHkAEwAMAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGgAAKXwAACR/wAMsv8AJe3/ + BDz//yF2//80m///NJr//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zSa//8zmP// + Gmb//wAq//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADL+/wAy/f8AMfz/ADL8/wAx+/8AJeX/ + AAem/wAAlP8AApj/BzN2/w+YGv8AawD/AGYA/wBnAP8AbQBTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqVAACc+QAAkf8AFMH/ACn4/wY///8jev// + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAUAAKFwAACW5QAAmvwAAJj/AACV/wABnf8ADLL/ABXD/wAYyv8AGMv/ABPB/wAEo/8AAJP/ + AACX/wAAmf4AAJr6AACe3wAWcnkAZACGAGkA+wBmAP8AZgD/AGgA7ABQAHEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABKHwAApJ4AAJf1AACa+wAAmf0AAJn+AACY/wAAmP8AAJj/AACY/wAAmf4AAJn9AACZ+gAAmOEAAJ11 + AABrHgAAAAAAGAAOAG8AigBmAPsAaQDsAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUK + AAClWAAAlqUAAJbbAACW+gAAlvoAAJb6AACW6gAAlr8AAJaSAACfOQAAAAAAAAAAAAAAAAAAAAAAAAAA + ABYADwByAF4ATwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAPAAAA///////wAAAPAAAAD//////wAAAOAAAAAP/////wAAAOAAAAAB/////wAAAMAAAAAAH/// + /wAAAMAAAAAAA////wAAAOAAAAAAAH///wAAAOAAAAAAAAf//wAAAMAAAAAAAAH//wAAAMAAAAAAAAA/ + /wAAAIAAAAAAAAAH/wAAAIAAAAAAAAAA/wAAAIAAAAAAAAAAPwAAAIAAAAAAAAAADwAAAIAAAAAAAAAA + BwAAAIAAAAAAAAAAAwAAAMAAAAAAAAAAAQAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAOAAAAAAAAAA + AAAAAOAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAPgAAAAAAAAA + AAAAAPgAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAP4AAAAAAAAA + AAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAwAAAP+AAAAAAAAABwAAAP+AAAAAAAAAHwAAAP/AAAAAAAAA + /wAAAP/AAAAAAAAAfwAAAP/gAAAAAAAAfwAAAP/wAAAAAAAAPwAAAP/wAAAAAAAAHwAAAP/4AAAAAAAA + HwAAAP/4AAAAAAAADwAAAP/8AAAAAAAADwAAAP/8AAAAAAAADwAAAP/+AAAAAAAADwAAAP//AAAAAAAA + DwAAAP//AAAAAAAADwAAAP//gAAAAAAADwAAAP//gAAAAAAADwAAAP//wAAAAAAADwAAAP//4AAAAAAA + DwAAAP//4AAAAAAADwAAAP//8AAAAAAAHwAAAP//+AAAAAAAHwAAAP//+AAAAAAAHwAAAP///AAAAAAA + PwAAAP///gAAAAAAHwAAAP///gAAAAAADwAAAP///wAAAAAADwAAAP///4AAAAAADwAAAP///4AAAAAA + HwAAAP///8AAAAAAPwAAAP///+AAAAAAfwAAAP////AAAAAA/wAAAP////gAAAAB/wAAAP////gAAAAD + /wAAAP////wAAAAH/wAAAP////4AAAAP/wAAAP////8AAAAf/wAAAP/////AAAA//wAAAP/////gABB/ + /wAAAP/////4APj//wAAAP///////////wAAACgAAABgAAAAwAAAAAEAIAAAAAAAgJQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAJAAAAEgAAAB0AAAAnAAAAMwAAAD4AAABI + AAAAUgAAAFgAAABcAAAAXwAAAF8AAABbAAAAVgAAAFEAAABMAAAARwAAAEIAAAA7AAAANQAAAC8AAAAp + AAAAJAAAAB8AAAAaAAAAFgAAABEAAAAOAAAACwAAAAkAAAAHAAAABQAAAAMAAAACAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAwAAAAU + AAAAIwAAADMAAABDAAAAUwAAAGAAAABrAAAAdQAAAHoAAAB/AAAAgQAAAIAAAAB+AAAAegAAAHUAAABv + AAAAagAAAGUAAABdAAAAVgAAAE8AAABIAAAAQQAAADoAAAAzAAAALQAAACYAAAAgAAAAGwAAABgAAAAU + AAAADwAAAAwAAAAJAAAABwAAAAUAAAADAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAEAAAAEAAAACQAAABcAAAAjAAAAOgAAAFAAAABjAAAAdQAAAIEAAACLAAAAlAAAAJgAAACc + AAAAngAAAJ0AAACcAAAAmQAAAJUAAACQAAAAiwAAAIcAAACBAAAAewAAAHQAAABtAAAAZAAAAF0AAABU + AAAATQAAAEQAAAA9AAAANgAAAC8AAAApAAAAIgAAAB0AAAAYAAAAEgAAAA4AAAAMAAAACQAAAAcAAAAF + AAAAAwAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAEQAAACMAAAA2AAAAUwAAAGwAAACA + AAAAkgAAAJ0AAACkAAAAqgAAAK4AAACwAAAAsQAAALAAAACvAAAArQAAAKsAAACoAAAApQAAAKIAAACe + AAAAmQAAAJIAAACMAAAAhQAAAH8AAAB3AAAAcAAAAGgAAABfAAAAVwAAAE8AAABHAAAAPwAAADgAAAAw + AAAAKAAAACMAAAAdAAAAFwAAABIAAAAOAAAACgAAAAcAAAAGAAAABAAAAAIAAAABAAAAAQAAAAEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAL + AAAAGAAAADIAAABJAAAAawAAAIUAAACZAAAApwAAAK4AAACzAAAAtwAAALkAAAC6AAAAuwAAALoAAAC5 + AAAAuQAAALcAAAC2AAAAswAAALIAAACwAAAArQAAAKoAAACnAAAAoAAAAJwAAACWAAAAkAAAAIoAAACC + AAAAewAAAHMAAABrAAAAYQAAAFkAAABQAAAARwAAAEAAAAA4AAAAMAAAACgAAAAhAAAAGgAAABYAAAAQ + AAAADAAAAAkAAAAGAAAABAAAAAMAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAPAAAAIAAAAEAAAABbAAAAgAAAAJkAAACqAAAAtAAAALgAAAC6 + AAAAuwAAAL0AAAC9AAAAvgAAAL4AAAC+AAAAvQAAAL0AAAC9AAAAvAAAALwAAAC7AAAAuQAAALgAAAC2 + AAAAtAAAALIAAACuAAAAqwAAAKYAAACiAAAAnQAAAJcAAACSAAAAigAAAIIAAAB6AAAAcAAAAGcAAABe + AAAAVQAAAEwAAABDAAAAOwAAADIAAAApAAAAIQAAABsAAAAXAAAAEgAAAA4AAAAKAAAABwAAAAUAAAAD + AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAQAAAAJAAAAEYAAABj + AAAAhwAAAJ4AAAKwAAAsyAAAS9kAAGDjAABa4AAAUtwAADnTAAAMwwAAALwAAAC8AAAAvQAAAL4AAAC+ + AAAAvgAAAL4AAAC9AAAAvQAAAL0AAAC8AAAAuwAAALoAAAC4AAAAtgAAALMAAACxAAAArgAAAKkAAACl + AAAAoAAAAJoAAACUAAAAiwAAAIQAAAB8AAAAcwAAAGoAAABgAAAAVgAAAE0AAABCAAAAOAAAADAAAAAp + AAAAIgAAABwAAAAWAAAAEQAAAA0AAAAKAAAABwAAAAQAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAQAAAAUAAAAQAAAAIgAAAEUAAABeAAASjQAAXtIAAIbzAACT/AAAlf0AAJb+AACW/QAAlf0AAJT9 + AACT+wAAgfMAAFLdAAAbyAAAAL0AAAC9AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvgAAAL4AAAC9 + AAAAvQAAALsAAAC6AAAAugAAALgAAAC2AAAAswAAALAAAACsAAAAqAAAAKMAAACdAAAAlwAAAJAAAACG + AAAAfgAAAHUAAABqAAAAYQAAAFcAAABOAAAARQAAADwAAAAyAAAAKwAAACMAAAAbAAAAFgAAABEAAAAM + AAAACQAAAAYAAAADAAAAAgAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAANAAAAHwAAADYAAFaRAACH6wAAlv0AAJn/ + AACa/wAAmf8AAJj/AACY/wAAmf8AAJn/AACa/wAAmf8AAJX9AACU+wAAe/AAAEvaAAAFwAAAALwAAAC+ + AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvQAAAL0AAAC9AAAAugAAALoAAAC3 + AAAAtQAAALMAAACvAAAArAAAAKgAAAChAAAAmwAAAJQAAACLAAAAggAAAHoAAABxAAAAaAAAAF8AAABU + AAAASQAAAEAAAAA2AAAALwAAACcAAAAeAAAAGAAAABMAAAAOAAAACwAAAAcAAAAFAAAAAwAAAAIAAAAC + AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAK + AAAADgAAdpsAAJXzAACZ/wAAmf8AAJj/AACU/wABm/8AB6j/AAiq/wAEov8AAJb/AACW/wAAmP8AAJn/ + AACa/wAAmP4AAJX8AACM+QAAZuYAAB/KAAAAvQAAAL4AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC+AAAAvgAAAL0AAAC9AAAAvAAAALoAAAC6AAAAuAAAALYAAACyAAAArgAAAKoAAACk + AAAAngAAAJgAAACRAAAAiQAAAIEAAAB2AAAAbAAAAGMAAABXAAAATQAAAEQAAAA5AAAALgAAACcAAAAf + AAAAGQAAABMAAAAPAAAACgAAAAgAAAAFAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAB9bAAAmPMAAJn/AACZ/wAAlf8ACKv/ABnN/wAf1/8AH9f/ + AB7W/wAd1P8AG9D/ABG+/wAJqv8AAJj/AACX/wAAmP8AAJr/AACa/wAAlv4AAJP7AAB27gAAN9IAAAG+ + AAAAvAAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC9 + AAAAvQAAALwAAAC6AAAAuAAAALYAAACzAAAAsAAAAKwAAACoAAAAogAAAJwAAACVAAAAjQAAAIUAAAB6 + AAAAcAAAAGYAAABaAAAATwAAAEYAAAA7AAAAMgAAACoAAAAiAAAAGwAAABUAAAAQAAAACwAAAAcAAAAF + AAAAAwAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHweAACZ7QAAmf8AAJn/ + AACW/wAXxv8AItz/ACLg/wAj3/8AIt3/ACHc/wAg2v8AINn/AB7V/wAc0v8AGs3/ABC6/wADof8AAJf/ + AACX/wAAmf8AAJv/AACY/gAAlPsAAHvwAABM2wAABsEAAAC8AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvgAAALwAAAC7AAAAugAAALgAAAC2 + AAAAswAAAK8AAACrAAAApQAAAKAAAACYAAAAkAAAAIcAAAB9AAAAcgAAAGkAAABdAAAAVAAAAEgAAAA+ + AAAANAAAACwAAAAiAAAAGgAAABQAAAAOAAAACgAAAAYAAAAEAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJOjAACZ/gAAmf8AAJP/ABnL/wAl4/8AJeT/ACXi/wAk4f8AI+D/ACLe/wAh3P8AIdv/ + ACDZ/wAf2P8AHtf/ABzT/wAaz/8AFcL/AAqu/wAAmf8AAJX/AACZ/wAAmv8AAJn/AACV/AAAh/cAAFHd + AAAFwAAAALsAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+ + AAAAvgAAAL4AAAC+AAAAvgAAAL0AAAC8AAAAuwAAALkAAAC3AAAAswAAALEAAACsAAAApwAAAKEAAACZ + AAAAkAAAAIgAAAB/AAAAdgAAAGoAAABgAAAAVQAAAEkAAAA+AAAANAAAACsAAAAhAAAAGgAAABMAAAAO + AAAACgAAAAUAAAADAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhCAAAJjzAACZ/wAAmP8ADrX/ACbl/wAn5/8AJub/ + ACbl/wAl4/8AJOL/ACPg/wAi3/8AIt3/ACHb/wAg2v8AH9n/AB7W/wAe1f8AHdP/ABvP/wAXx/8ADrX/ + AAKd/wAAlv8AAJj/AACa/wAAmv8AAJX8AACG9gAAUdwAAAbAAAAAuwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAAL4AAAC8 + AAAAuwAAALoAAAC4AAAAtQAAALIAAACtAAAAqQAAAKMAAACcAAAAlQAAAIsAAACBAAAAeAAAAGsAAABg + AAAAUwAAAEgAAAA9AAAAMgAAACgAAAAfAAAAFwAAABAAAAALAAAACAAAAAUAAAADAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmGwAAJn8 + AACZ/wAAmP8AI97/ACnr/wAo6f8AJ+j/ACbm/wAm5f8AJeP/ACTi/wAj4f8AI9//ACLd/wAh3P8AINr/ + AB/Z/wAf2P8AHtX/AB3U/wAc0/8AGs//ABjI/wAPuP8ABKD/AACX/wAAmP8AAJr/AACb/wAAlfwAAIb2 + AABS3QAABsAAAAC6AAAAvgAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvQAAALsAAAC5AAAAtwAAALUAAACx + AAAArAAAAKYAAAChAAAAmQAAAJEAAACHAAAAewAAAHEAAABjAAAAVwAAAEoAAAA/AAAAMwAAACkAAAAf + AAAAGAAAABAAAAAMAAAABwAAAAUAAAADAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAlq8AAJn9AACY/wALsf8AKer/ACrs/wAp6/8AKOr/ACfo/wAn5/8AJuX/ + ACXk/wAl4v8AJOH/ACPf/wAi3v8AIdz/ACHb/wAg2f8AH9f/AB7W/wAd1f8AHNP/ABzR/wAazv8AGMr/ + ABG6/wAEof8AAJb/AACY/wAAmv8AAJv/AACV/AAAhfUAAFHdAAAHwAAAALoAAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+ + AAAAvgAAAL4AAAC+AAAAvQAAALsAAAC5AAAAtwAAALQAAACwAAAAqwAAAKYAAACeAAAAlQAAAI0AAACB + AAAAdQAAAGgAAABcAAAATgAAAEEAAAA0AAAAKwAAACAAAAAXAAAAEgAAAAwAAAAIAAAABAAAAAMAAAAA + AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAluMAAJn/AACX/wAUw/8AKu3/ + ACru/wAq7f8AKev/ACjq/wAo6f8AJ+f/ACbm/wAm5f8AJeP/ACTi/wAj4f8AIt7/ACLd/wAh2/8AINr/ + AB/Z/wAe1/8AHtX/AB3T/wAc0v8AG9H/ABnN/wAXyf8AELr/AASh/wAAlv8AAJj/AACa/wAAm/8AAJX8 + AACF9gAAStsAAAO/AAAAugAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC9AAAAvQAAALwAAAC6 + AAAAtwAAALUAAACxAAAArAAAAKcAAACfAAAAlwAAAIwAAACBAAAAdQAAAGkAAABZAAAATwAAAD8AAAA1 + AAAAKgAAAB8AAAAXAAAAEAAAAAoAAAAEAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAlv4AAJn/AACX/wAf2P8ALPD/ACvw/wAr7/8AKu3/ACns/wAp6/8AKOn/ACfo/wAm5v8AJuX/ + ACXj/wAk4v8AI+H/ACPg/wAi3f8AIdz/ACDb/wAf2f8AH9f/AB7W/wAd0/8AHNH/ABvR/wAa0P8AGcz/ + ABfI/wAPuf8ABKH/AACW/wAAmP8AAJr/AACb/wAAlPsAAHvwAAA+1QAAAL0AAAC8AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC+AAAAvAAAALwAAAC6AAAAuAAAALUAAACxAAAArQAAAKUAAACd + AAAAlAAAAIkAAAB9AAAAcgAAAGMAAABVAAAASAAAADsAAAAuAAAAIgAAABgAAAAPAAAACgAAAAQAAAAC + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlsgAAJn9AACY/wAXyP8ALPH/ACzy/wAr8P8AK+// + ACru/wAq7P8AKev/ACjq/wAn6P8AJ+f/ACbl/wAl5P8AJOL/ACTh/wAj3/8AIt7/ACHd/wAh2/8AINr/ + AB/Y/wAe1v8AHdT/ABzT/wAc0P8AG9D/ABrP/wAYy/8AFsb/AA+4/wADoP8AAJX/AACY/wAAm/8AAJr/ + AACR+gAAevAAAC/QAAAAugAAALwAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+ + AAAAvQAAALwAAAC7AAAAuAAAALQAAACwAAAAqgAAAKIAAACZAAAAkQAAAIQAAAB3AAAAagAAAFsAAABN + AAAAPgAAADAAAAAgAAAAGAAAAA4AAAAHAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlrMAAJn9 + AACY/wAOtv8AK/H/AC3z/wAs8v8ALPH/ACvv/wAq7v8AKu3/ACnr/wAo6v8AKOn/ACfn/wAm5v8AJuT/ + ACXj/wAk4f8AI+D/ACLf/wAi3P8AIdz/ACDa/wAf2f8AHtf/AB7U/wAd0/8AHNL/ABvP/wAaz/8AGc7/ + ABfK/wAVxf8AD7f/AAOg/wAAlv8AAJj/AACb/wAAm/8AAJD5AABt6gAAJ8wAAAC7AAAAvQAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9AAAAvAAAALwAAAC6AAAAtgAAALIAAACs + AAAAqAAAAJ4AAACVAAAAiQAAAHwAAABvAAAAXgAAAE0AAAA6AAAALQAAABwAAAARAAAACAAAAAUAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAln4AAJn8AACZ/wACm/8ALPT/AC72/wAt9P8ALPL/ACzw/wAr8P8AK+// + ACrs/wAp7P8AKev/ACjp/wAn6P8AJub/ACbl/wAl4/8AJOL/ACPh/wAj3/8AIt7/ACHc/wAg2/8AH9n/ + AB/X/wAe1v8AHdT/ABzR/wAb0f8AGs7/ABrN/wAZzf8AF8n/ABbE/wANtP8AAp7/AACV/wAAmP8AAJz/ + AACa/wAAivgAAGDlAAAZxgAAALoAAAC+AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL4AAAC+AAAAvAAAALwAAAC5AAAAtgAAALIAAACsAAAApQAAAJ0AAACRAAAAgwAAAHMAAABf + AAAATwAAADgAAAAmAAAAFwAAAAsAAAAFAAAAAQAAAAAAAAAAAAAAAAAApSwAAJr8AACZ/wAAlv8AIt3/ + AC31/wAu9f8ALfT/AC3z/wAs8v8AK/D/ACvu/wAq7v8AKuz/ACnq/wAo6v8AJ+f/ACfm/wAm5P8AJeP/ + ACTi/wAk4f8AI9//ACLd/wAh3P8AINr/ACDa/wAf1/8AHtX/AB3U/wAc0v8AHND/ABvP/wAazf8AGcz/ + ABnL/wAXx/8AFMD/AAyx/wACnf8AAJX/AACZ/wAAnP8AAJf9AACH9gAAVeAAAAnBAAAAugAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9AAAAvAAAALoAAAC3 + AAAAswAAAK0AAACmAAAAnAAAAI4AAAB6AAAAagAAAFAAAAA5AAAAJQAAABQAAAAJAAAABAAAAAEAAAAA + AAAAAAAAAAMAAJXmAACZ/wAAmP8AFMD/AC31/wAu9/8ALvX/AC30/wAt8/8ALPL/ACzx/wAr7/8AKu3/ + ACrs/wAp6/8AKOn/ACjp/wAn5v8AJuX/ACbk/wAl4v8AJOH/ACPf/wAi3v8AItz/ACHb/wAg2f8AH9j/ + AB7W/wAe1P8AHdP/ABzR/wAbz/8AGs3/ABnM/wAYy/8AF8n/ABbG/wASvv8ACaz/AAGZ/wAAlv8AAJr/ + AACd/wAAlvwAAHzxAABC1wAAAL4AAAC7AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC8AAAAuwAAALkAAAC0AAAArgAAAKYAAACYAAAAiQAAAG4AAABV + AAAAPAAAACYAAAASAAAACQAAAAIAAAAAAAAAAAAAAAAAAJSkAACZ/AAAmf8AA5v/ACzy/wAv+P8AL/f/ + AC72/wAu9f8ALfP/ACzy/wAs8P8AK/D/ACvv/wAq7P8AKev/ACnq/wAo6P8AJ+f/ACbm/wAm5P8AJeP/ + ACTh/wAj4P8AI97/ACLd/wAh2/8AINr/AB/Y/wAf1v8AHtX/AB3T/wAc0f8AG9D/ABrO/wAZzP8AGMv/ + ABnK/wAXyP8AFcT/ABC6/wAHqP8AAJj/AACW/wAAm/8AAJz/AACS+gAAc+0AAC/PAAAAuwAAALwAAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvgAAAL0AAAC7 + AAAAuQAAALMAAACpAAAAnAAAAIUAAABtAAAAUAAAADUAAAAbAAAADwAAAAUAAAAAAAAAAAAAAAAAAKQy + AACa/QAAmf8AAJT/ACHb/wAv+P8AL/j/AC/3/wAu9v8ALvX/AC30/wAt8/8ALPH/ACvw/wAr7v8AKu7/ + ACrr/wAp6v8AKOn/ACfp/wAn5v8AJuX/ACXj/wAk4v8AJOD/ACPf/wAi3f8AIdz/ACDa/wAg2f8AH9f/ + AB7V/wAd1P8AHNL/ABvQ/wAaz/8AGs3/ABnL/wAYyv8AF8n/ABbH/wAUwf8ADrb/AASi/wAAlv8AAJj/ + AACc/wAAnP8AAIn3AABe4wAAGscAAAC6AAAAvgAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvQAAALsAAAC0AAAArAAAAJoAAACFAAAAaQAAAEoAAAAq + AAAAGQAAAAkAAAAAAAAAAAAAAAAAAAABAACU3gAAmf4AAJf/AAmr/wAw9/8AMPr/ADD4/wAv9/8ALvb/ + AC71/wAt9P8ALfL/ACzx/wAs8f8AK+//ACrt/wAq7P8AKev/ACjq/wAo6P8AJ+j/ACbl/wAl5P8AJeL/ + ACTh/wAj3/8AIt7/ACHc/wAh2/8AINn/AB/Y/wAe1v8AHdT/AB3S/wAc0f8AG8//ABrN/wAZzf8AGMz/ + ABfJ/wAXyP8AFsX/ABPA/wALsP8AApz/AACV/wAAmf8AAJ3/AACY/QAAgvMAAEzcAAAGvwAAALoAAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAAL4AAAC7 + AAAAtQAAAKoAAACXAAAAfQAAAF0AAAA5AAAAIwAAAA4AAAAAAAAAAAAAAAAAAAAAAACTeQAAmfsAAJn/ + AACW/wAn5/8AMPr/ADD6/wAw+P8AL/f/AC/2/wAu9f8ALvT/AC3z/wAs8v8ALPD/ACvv/wAr7v8AKu3/ + ACnr/wAp6v8AKOn/ACfn/wAm5v8AJuT/ACXj/wAk4f8AI+D/ACPe/wAi3f8AIdv/ACDa/wAf2P8AH9b/ + AB7V/wAd0/8AHNL/AB3U/wAazv8AF8n/ABnL/wAYyv8AF8f/ABfH/wAVwv8AEbv/AAqs/wABmv8AAJb/ + AACa/wAAnf8AAJT7AAB27wAANdIAAAC6AAAAvAAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC9AAAAuwAAALIAAACkAAAAjAAAAG0AAABGAAAALAAAABQAAAAA + AAAAAAAAAAAAAAAAAACjGAAAmvQAAJn/AACW/wAVxf8AMPn/ADH8/wAw+v8AMPn/AC/4/wAv9/8ALvb/ + AC70/wAt8/8ALfL/ACzx/wAr8P8AK+//ACrt/wAp7P8AKer/ACjp/wAn6P8AJ+b/ACbl/wAl4/8AJOL/ + ACTg/wAj3/8AIt3/ACHc/wAg2v8AINn/AB/X/wAe1v8AH9n/ABPB/wAGpf8ABaH/AA+5/wAazP8AGMr/ + ABfI/wAWxv8AFsb/ABTB/wAPtf8ABqX/AACY/wAAl/8AAJz/AACe/wAAivgAAFzjAAAYxgAAALgAAAC+ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvQAAALYAAACs + AAAAlgAAAHgAAABQAAAANAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlKsAAJr7AACZ/wADnP8AK/H/ + ADH9/wAx+/8AMfr/ADD5/wAw+P8AL/f/AC72/wAu9f8ALfT/AC3y/wAs8f8ALPD/ACvv/wAq7v8AKuz/ + ACnr/wAo6f8AKOj/ACfn/wAm5f8AJeT/ACXi/wAk4f8AI9//ACLe/wAh3P8AIdv/ACDZ/wAi3v8AFcT/ + AAOh/wAAlv8AAJP/AAmt/wAZy/8AGs3/ABjK/wAXyP8AF8f/ABfG/wAWxP8AEr7/AAyz/wADn/8AAJX/ + AACZ/wAAnf8AAJn+AAB/8wAAR9kAAAG+AAAAuwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC+AAAAvgAAALkAAACwAAAAmwAAAH4AAABWAAAAOQAAABoAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAojIAAJv/AACZ/wAAlP8AGs3/ADH6/wAy/f8AMfv/ADH6/wAw+f8AMPj/AC/3/wAv9v8ALvX/ + AC30/wAt8/8ALPL/ACzx/wAr7/8AKu7/ACrt/wAp6/8AKer/ACjp/wAn5/8AJub/ACbk/wAl4/8AJOH/ + ACPg/wAi3v8AIt3/ACXi/wAXxv8ABKH/AACX/wAAmP8AAJX/AA21/wAb0f8AG8//ABnM/wAYy/8AGMn/ + ABjH/wAXxf8AFsT/ABXC/wAQuv8ACav/AAGb/wAAlf8AAJr/AACf/wAAk/sAAGvqAAAozAAAALkAAAC+ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAALgAAACwAAAAnAAAAH8AAABX + AAAAOgAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJO5AACa/AAAmf8ABKL/AC/3/wAy/f8AMv3/ + ADH8/wAx+/8AMPr/ADD5/wAv+P8AL/f/AC71/wAu9P8ALfP/ACzy/wAs8f8AK/D/ACvv/wAq7f8AKez/ + ACnq/wAo6f8AJ+j/ACfn/wAm5f8AJeP/ACTi/wAk4f8AJ+b/ABjJ/wAEov8AAJf/AACY/wAAlv8AC7H/ + ABvQ/wAd0/8AG9H/ABrP/wAbzf8AGsv/ABnJ/wAYyP8AF8b/ABbF/wAVxP8AE7//AA60/wAFo/8AAJf/ + AACX/wAAnf8AAJ3/AACG9QAATt4AAAfAAAAAugAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+ + AAAAvQAAALgAAACuAAAAmgAAAHwAAABUAAAANwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ9R + AACb/AAAmf8AAJX/AB7W/wAy+/8AMv7/ADL9/wAx/P8AMfv/ADH6/wAw+f8AMPj/AC/3/wAu9v8ALvX/ + AC30/wAt8/8ALPH/ACvw/wAr7/8AKu7/ACrs/wAp6/8AKOn/ACjp/wAn5/8AJuX/ACXk/wAn6f8AGcz/ + AASi/wAAl/8AAJj/AACV/wAMsv8AHdT/ACDY/wAd1P8AHNP/ABzR/wAbz/8AG87/ABrM/wAZyv8AF8j/ + ABfH/wAYyP8AF8j/ABXD/wARu/8AC7D/AAOe/wAAlf8AAJn/AACf/wAAlvwAAHHsAAA30gAAALoAAAC8 + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvAAAALYAAACpAAAAkgAAAHQAAABMAAAAMQAAABYAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4LAACT0wAAmv4AAJj/AAWk/wAx+/8ANP//ADL+/wAy/f8AMvz/ + ADH7/wAx+v8AMPn/ADD4/wAv9/8AL/b/AC71/wAt9P8ALfP/ACzy/wAs8P8AK+//ACru/wAq7f8AKev/ + ACnr/wAo6f8AJuj/ACru/wAb0f8ABaX/AACX/wAAmP8AAJX/AA61/wAf2P8AItz/AB/Y/wAe1/8AHtX/ + AB3T/wAc0v8AHND/ABvO/wAZzP8AGcz/ABjJ/wAPuP8ADLH/ABO+/wAWxf8AE8H/AA+3/wAHp/8AAJn/ + AACW/wAAnP8AAJ7/AACL+AAAV+EAABbFAAAAuQAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC9AAAAuwAAALMAAACj + AAAAiwAAAGoAAABCAAAAKQAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeXQAAm/sAAJn/ + AACT/wAk4f8AMv3/ADP//wAy/v8AMv3/ADL9/wAx/P8AMfv/ADD6/wAw+f8AL/j/AC/3/wAu9v8ALvT/ + AC3z/wAs8v8ALPH/ACvw/wAr7v8AKu3/ACns/wAp6v8AKu3/ACDa/wAJq/8AAJf/AACX/wAAlf8ADbX/ + ACDb/wAk4f8AIdz/ACDa/wAg2f8AINf/AB7V/wAd1P8AHdL/ABvQ/wAb0P8AGs3/AA60/wADnP8AAZn/ + AAms/wAVw/8AFcT/ABTC/wARvP8ADLH/AASh/wAAlf8AAJj/AACd/wAAmv4AAHbuAAA30wAAALsAAAC8 + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC9AAAAugAAALEAAACeAAAAgwAAAGEAAAA7AAAAIgAAAA4AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAACQAAktsAAJr+AACX/wAKrf8AMfv/ADT//wAz//8AM/7/ADL9/wAy/f8AMfz/ + ADH7/wAx+v8AMPn/AC/4/wAv9/8ALvb/AC71/wAt9P8ALfP/ACzx/wAr8P8AK+//ACrt/wAq7f8ALfL/ + ABbD/wABmv8AAJX/AACW/wAPuP8AIt7/ACXk/wAj4P8AIt7/ACHd/wAh2/8AIdn/AB/Y/wAe1v8AHdT/ + AB3V/wAc0f8ADrb/AAKZ/wAAl/8AAJP/AAWj/wAVxP8AFsb/ABXD/wAVwv8AFMD/ABC4/wAIqf8AAJv/ + AACW/wAAm/8AAJ7/AACL+AAAVeEAABbGAAAAuQAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC9AAAAuQAAAK8AAACcAAAAfwAAAF0AAAA3 + AAAAIAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnXwAAJz6AACZ/wAAlf8AI+H/ + ADL9/wAz//8AM///ADP+/wAy/v8AMv3/ADL8/wAx+/8AMfr/ADD5/wAw+P8AL/f/AC/2/wAu9f8ALfT/ + AC3z/wAs8v8ALPD/ACvw/wAq7/8ALfL/AB3S/wADnv8AAJD/AA62/wAi4P8AJ+j/ACbj/wAk4v8AI+D/ + ACHf/wAh3f8AItv/ACDa/wAe2P8AH9n/AB3V/wAPuP8AApr/AACX/wAAlv8AApz/ABC5/wAZyv8AF8j/ + ABfF/wAWw/8AFcH/ABTC/wASvf8ADLL/AAWi/wAAlv8AAJj/AACd/wAAmf4AAHbvAAA10gAAALgAAAC+ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9 + AAAAuAAAAK4AAACaAAAAfgAAAFwAAAA2AAAAHwAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAANBYAAJHmAACa/wAAlv8ACq3/ADH7/wA0//8AM///ADP//wAz/v8AMv7/ADL9/wAy/P8AMfz/ + ADH7/wAw+v8AMPn/AC/4/wAv9/8ALvb/AC70/wAt8/8ALPP/ACzy/wAr7/8AK/D/ACjp/wAe1f8AGs7/ + ACTh/wAn6f8AJ+b/ACfl/wAk5P8AJOL/ACPh/wAj3/8AIt7/ACDc/wAi3f8AINn/ABC6/wACmv8AAJb/ + AACV/wACnP8AELr/ABrO/wAazP8AGcn/ABjI/wAXxv8AFsT/ABXC/wAUwf8AE7//ABC4/wAIqv8AAZz/ + AACW/wAAm/8AAJ//AACJ9wAATN0AAArBAAAAuwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/ + AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9AAAAuAAAAK0AAACaAAAAfgAAAF0AAAA3AAAAIQAAAA0AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqCAACc+gAAmf8AAJT/ACTg/wAz/f8AM/// + ADP//wAz//8AM///ADP+/wAy/f8AMv3/ADH8/wAx+/8AMfr/ADD5/wAv+P8AL/f/AC72/wAu9f8ALfT/ + AC3z/wAs8v8AK/D/ACvw/wAs8f8ALPP/ACrt/wAo6f8AJ+j/ACfm/wAm5v8AJeT/ACXj/wAl4f8AIuD/ + ACPh/wAh3P8AEbz/AAKa/wAAlv8AAJX/AAKd/wASvf8AHdL/ABzR/wAbzf8AGsz/ABnK/wAYyP8AF8b/ + ABXF/wAUw/8AFMH/ABTA/wASvf8ADbL/AASh/wAAlf8AAJn/AACe/wAAmf4AAGfoAAAlywAAALoAAAC+ + AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL8AAAC+AAAAvQAAALwAAAC4AAAAswAAAKYAAACT + AAAAeQAAAFkAAAA2AAAAIQAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYV + AACR5QAAmv8AAJb/AAqu/wAw+/8ANP//ADP//wAz//8AM///ADP//wAz/v8AMv7/ADL9/wAy/P8AMfr/ + ADH6/wAw+f8AMPj/AC/3/wAv9v8ALvb/AC30/wAt8/8ALPH/ACzw/wAr8P8AKu//ACrs/wAp7P8AKOr/ + ACjo/wAn6P8AJub/ACbl/wAl4/8AJuX/ACPg/wASvf8AApv/AACW/wAAlf8AA53/ABK//wAe1v8AHtX/ + AB3S/wAc0P8AG87/ABrM/wAZy/8AF8n/ABfH/wAWxf8AFsP/ABXD/wAUwv8AEr3/AA+4/wAHqP8AAJn/ + AACX/wAAnP8AAJ7/AAB+8gAAP9cAAAC+AAAAvQAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAAL4AAAC9 + AAAAuwAAALcAAACwAAAAqgAAAJoAAACHAAAAbwAAAFEAAAAxAAAAHgAAAAwAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkLsAAJv9AACX/wAEnf8AKez/ADT//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADL+/wAy/f8AMv3/ADH8/wAx+/8AMPr/ + AC/4/wAv9/8AL/f/AC71/wAu9f8ALPT/AC71/wAv9/8ALfX/ACzw/wAp7f8AKu3/ACrq/wAp6v8AJuj/ + ACbn/wAn5f8AJeP/ACTi/wAm5f8AINj/AAqu/wAAlv8AAJj/AACW/wAFpf8AF8n/ACDZ/wAc0v8AG9D/ + ABvP/wAbzf8AGsz/ABnK/wAYyP8AF8f/ABXE/wAUwv8AE8H/ABPA/wATvv8ADLL/AASg/wAAlv8AAJr/ + AACe/wAAjqwAAEEfAAAAAAAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkT4AAJ/s + AACZ/wAAkf8AE8D/ADD6/wA0//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz/v8AMv7/ADL9/wAx+/8AMPv/ADH6/wAv+v8AMPj/AC74/wAv9v8ALvT/AC3z/wAt9P8AK/L/ + ACzx/wAr8P8AKu3/ACrs/wAq7P8AKOr/ACjp/wAo5/8AJub/ACjo/wAh2/8AC6//AACW/wAAmP8AAJb/ + AAal/wAZzf8AIt7/AB7W/wAe1P8AHdP/AB3R/wAc0P8AG87/ABrN/wAZyv8AF8j/ABfH/wAWxf8AFcT/ + ABXC/wAUwP8AE7//AA60/wAEn/8AAJb/AACZ/wAAnv8AAJqlAABEDwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCgAACa+gAAmP8AAJf/ACfo/wA0//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AMv7/ADL+/wAx/f8AMvz/ADH8/wAx/P8AMPr/ + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAJDJAACb/wAAl/8ABqD/ACvu/wA0//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AMv// + ADL9/wAy/v8AMf7/ADH7/wAw/P8AMfr/AC/5/wAw+P8AMPj/AC72/wAu9f8AMfv/ABzR/wAAkv8AAJD/ + AAiq/wAh3P8ALfP/ACnr/wAo6v8AJ+n/ACfn/wAm5v8AJeT/ACXj/wAk4f8AI+D/ACLe/wAh3f8AIdv/ + ACDZ/wAf2P8AHtf/AB3U/wAd0/8AHdL/ABvP/wAazv8AGcz/ABjL/wAXyf8AFsf/ABbF/wAVw/8AEbv/ + AAGb/wAAmf8AAJr+AACUtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZS + AACg9AAAmf8AAI7/ABXF/wAx+/8ANP//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAy/v8AMv7/ADH9/wAy/P8AMfv/ADH6/wAw+v8AMPr/ + AC/4/wAu9v8AL/j/ACnr/wAYyv8AEr3/ACHc/wAu9/8AKu//ACvt/wAp7P8AKOv/ACjp/wAn6P8AJub/ + ACbl/wAl4/8AJOL/ACPg/wAi3/8AI93/ACHc/wAg2/8AH9j/AB7X/wAf1v8AHdP/ABzR/wAb0P8AGs// + ABnN/wAYy/8AGMn/ABjI/wAXxv8AFsP/AAmu/wAAl/8AAJn/AACb8gAAnx8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQqQAAm/kAAJj/AACX/wAl4/8ANP//ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz/v8AMv7/ + ADL//wAy/P8AMfz/ADH9/wAw/P8AMPr/ADD6/wAv+f8AL/f/ADD5/wAy/f8AMf3/AC/4/wAs8f8AK/D/ + ACvv/wAq7v8AKez/ACrr/wAo6v8AJ+j/ACbn/wAm5f8AJeT/ACTi/wAj4f8AI9//ACLe/wAh3f8AINr/ + AB/Z/wAf1/8AHtX/AB3U/wAc0/8AG9H/ABrP/wAazv8AGsz/ABjK/wAXyP8AF8b/ABK+/wABmP8AAJn/ + AACa+QAAkHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEKgAAoOMAAJn/ + AACS/wAOtf8ALfT/ADX//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADL//wAy/f8AMv3/ADH+/wAx/P8AMfz/ADD6/wAx+f8AL/j/ + ADD3/wAu9v8ALvb/AC31/wAt8/8ALPH/ACvx/wAs8P8AKu7/ACrt/wAp7P8AKOr/ACfp/wAn5/8AJub/ + ACXk/wAk4/8AJOH/ACPg/wAi3/8AId3/ACHc/wAg2f8AH9j/AB7X/wAd1f8AHdP/ABzS/wAc0P8AGs7/ + ABnM/wAYy/8AF8n/ABXF/wAGpf8AAJn/AACa/QAAj8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAmZAAAJ75AACZ/wAAkv8AHdX/ADP9/wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AMv// + ADL+/wAx/v8AMfz/ADL7/wAx+v8AMfr/ADD5/wAv9/8ALvf/AC/2/wAt9f8ALfT/ACzy/wAs8f8AK/D/ + ACrv/wAq7f8AKez/ACjq/wAo6f8AJ+j/ACbm/wAl5f8AJeP/ACTi/wAj4f8AIt//ACPe/wAh3P8AINv/ + AB/Y/wAe1/8AH9X/AB7U/wAc0v8AG9D/ABrP/wAZzf8AGMv/ABfI/wANtP8AAJj/AACa/wAAlO8AAAAG + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAShcAAJHJAACb/wAAlf8ACKb/ + ACru/wA0//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAw//8ALP//ACz//wAs//8ALf// + AC///wAx//8AM///ADP//wAz//8AM///ADL+/wAy/v8AMv3/ADL8/wAx/f8AMfz/ADD7/wAw+v8AL/n/ + AC/4/wAu9/8ALvX/AC30/wAs8/8ALPH/ACvw/wAr7/8AKu7/ACns/wAp6/8AKOn/ACfo/wAm5/8AJuX/ + ACXk/wAk4/8AI+H/ACPg/wAi3v8AId3/ACDa/wAf2f8AH9j/AB7W/wAd1P8AHNP/ABvR/wAaz/8AGs7/ + ABrL/wATv/8AAJf/AACZ/wAAm/UAAKIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAH5aAACh8gAAmf8AAI3/ABbF/wAx+/8ANP//ADP//wAz//8AM///ADP//wAz//8AM/// + AC///wdA//8RVf//E1r//xNa//8QU///CUb//wI2//8ALv//AC///wAz//8AM///ADP//wAy/v8AMv// + ADL9/wAy/v8AMfz/ADH8/wAw+v8AMPn/AC/4/wAv9/8ALvb/AC71/wAt9P8ALfP/ACzy/wAr8f8AK+// + ACru/wAp7f8AKev/ACjq/wAn6f8AJ+f/ACbm/wAl5f8AJOP/ACTi/wAj4P8AIt//ACHd/wAg3P8AINr/ + AB/Y/wAe1/8AHdX/ABzT/wAc0v8AHND/ABrO/wAYyv8AAJb/AACZ/wAAmvQAAJI5AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRsAAAm/sAAJj/AACX/wAk4v8ANP// + ADP//wAz//8AM///ADP//wAz//8AL///C0n//yR8//82n///Oab//zmn//80m///KIT//xtq//8RVf// + Bz///wAw//8AMP//ADP//wAz//8AM///ADP//wAy/v8AMv7/ADH8/wAx+/8AMfv/ADD6/wAw+f8AL/j/ + AC73/wAu9v8ALfT/AC3z/wAs8v8AK/H/ACvw/wAq7/8AKu3/ACns/wAo6v8AKOn/ACfo/wAm5/8AJeX/ + ACXk/wAk4v8AI+H/ACLf/wAi3v8AIdz/ACDa/wAf2f8AHtf/AB7V/wAe1P8AHNL/ABvQ/wAYy/8AAJb/ + AACZ/wAAmvQAAJI1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB8NgAAoeIAAJn/AACS/wAOtP8ALPP/ADX//wAz//8AM///ADP//wAx//8DNP//JoD//zij//8zm/// + M5n//zOZ//80mv//NZ7//zik//81nf//JHz//xJY//8FO///AC7//wAx//8AM///ADP//wAz/v8AMv7/ + ADL9/wAy/P8AMf3/ADH8/wAw+/8AMPr/AC/5/wAv+P8ALvb/AC31/wAt9P8ALPP/ACzx/wAr8P8AKu// + ACru/wAp7P8AKev/ACjp/wAn6P8AJuf/ACbm/wAl5P8AJOP/ACPh/wAk4P8AIt7/ACHd/wAg2/8AH9n/ + ACDY/wAe1v8AHdT/ABzT/wAZzP8AAJb/AACZ/wAAmvQAAJI1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmYoAAJ73AACZ/wAAjv8AG9D/ADL9/wA0//8AM/// + ADP//wAu//8MS///K4n//zWd//8zmf//M5n//zOZ//8zmf//M5n//zOZ//80mv//N6H//zWd//8jd/// + DU3//wE0//8ALv//ADP//wAz//8AM/7/ADL//wAy/f8AMv3/ADH8/wAx+/8AMPr/ADD5/wAv+P8AL/f/ + AC72/wAu9f8ALfT/ACzz/wAs8v8AK/D/ACvv/wAq7v8AKe3/ACnr/wAo6v8AJ+n/ACfo/wAm5v8AJeX/ + ACTj/wAk4v8AI+D/ACLf/wAh3f8AINv/ACDa/wAf2P8AHtf/AB3V/wAbzv8AAJb/AACZ/wAAmvQAAJI3 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATg0AAJLE + AACb/wAAlv8ABqP/ACfn/wA0//8AM///ADP//wAt//8PUP//LIz//zWc//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOa//85pP//MJT//xdi//8GO///AC///wAy//8AM///ADP//wAz/v8AMv3/ + ADL9/wAx/P8AMfv/ADH7/wAw+v8AL/n/AC/4/wAu9/8ALvb/AC30/wAt8/8ALPL/ACvx/wAr8P8AKu7/ + ACrt/wAp7P8AKOv/ACjp/wAn6P8AJuf/ACXl/wAl5P8AJOL/ACPh/wAi3/8AIt7/ACHc/wAg2v8AH9n/ + AB7X/wAazf8AAJb/AACZ/wAAm/QAAJosAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdYAACi6gAAmf8AAI//ABG7/wAv9/8ANf//ADP//wAt//8PUP// + LIz//zWc//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmP//NZ3//zag//8jev// + CUT//wAy//8AMf//ADP//wAz//8AM/7/ADL+/wAy/f8AMvz/ADH9/wAx/P8AMPv/ADD6/wAv+f8AL/j/ + AC72/wAt9f8ALfT/ACzz/wAs8f8AK/D/ACrv/wAq7v8AKe3/ACnr/wAo6v8AJ+j/ACbn/wAm5v8AJeT/ + ACTj/wAj4f8AI+D/ACLe/wAh3f8AINv/AB/X/wAVwv8AAJb/AACZ/wAAl/YAAGULAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmgAAnfsAAJj/ + AACV/wAg2v8AM/3/ADP//wAu//8LSv//K4j//zWd//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOa//83of//K4n//w9R//8BMv//ADD//wAz//8AM///ADP+/wAy/v8AMv3/ + ADL9/wAx/P8AMfv/ADD6/wAw+f8AL/j/AC/3/wAu9v8ALvX/AC30/wAs8/8ALPL/ACvw/wAr7/8AKu7/ + ACnt/wAp7P8AKOr/ACfp/wAn6P8AJub/ACXl/wAk4/8AJOL/ACPg/wAi3/8AId3/AB/Z/wANs/8AAJf/ + AACa/gAAj+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABOLwAAk9IAAJv/AACU/wAIp/8AKOn/ADT//wAx//8CM///JHz//zaf//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//N6H//y+Q//8UW/// + Azb//wAw//8AM///ADP//wAz//8AM/7/ADL9/wAy/f8AMfz/ADH7/wAx+v8AMPr/AC/5/wAv+P8ALvf/ + AC72/wAt9P8ALfP/ACzy/wAr8f8AK/D/ACrv/wAq7f8AKez/ACjr/wAo6f8AJ+j/ACbn/wAl5f8AJeT/ + ACTi/wAj4f8AIt//AB/Z/wAFof8AAJj/AACa+gAAkJcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGgAAKPyAACZ/wAAjf8AE7// + ADD5/wA1//8AJ///Gmn//zOZ//80m///M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5j//zae//8zmf//GWX//wM0//8AL///ADP//wAz//8AM///ADP+/wAy/v8AMv3/ + ADL8/wAx/P8AMfv/ADD6/wAw+f8AL/j/AC/3/wAu9v8ALfX/AC30/wAs8/8ALPL/ACvw/wAq7/8AKu7/ + ACns/wAp6/8AKOr/ACfo/wAm5/8AJuX/ACXk/wAk4/8AI+D/ABrN/wAAk/8AAJn/AACb9wAAl0QAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJOrAACb/AAAmP8AAJT/ACDZ/wAz/f8AL///Ckf//yuI//82nv//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//81nf//M5j//xhl//8DM/// + AC///wAz//8AM///ADP//wAz/v8AMv7/ADL9/wAy/f8AMfz/ADH7/wAw+v8AMPn/AC/4/wAv9/8ALvb/ + AC71/wAt9P8ALPP/ACzy/wAr8f8AK+//ACru/wAp7f8AKez/ACjq/wAn6f8AJ+f/ACbm/wAl5f8AIt// + AAqt/wAAl/8AAJn/AACX5QAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG86AACj2QAAmf8AAJP/AAio/wAo6v8ANP// + ACz//x9x//81nP//M5r//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//NZ3//zKX//8ZZf//AzP//wAw//8AM///ADP//wAz//8AM///ADP+/wAy/f8AMv3/ + ADH8/wAx+/8AMfr/ADD6/wAv+f8AL/j/AC73/wAu9v8ALfX/AC3z/wAs8v8AK/H/ACvw/wAq7/8AKu3/ + ACns/wAo6/8AKOn/ACfo/wAm5v8AHNL/AACZ/wAAmP8AAJv8AACUiwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACYewAAnfcAAJn/AACN/wATwP8AMPn/AC///wxL//8qiP//NJ3//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zWd//8ymP//F2L//wEv//8AMv// + ADP//wAz//8AM///ADP//wAz/v8AMv7/ADL9/wAy/P8AMfz/ADH7/wAw+v8AMPn/AC/4/wAv9/8ALvb/ + AC31/wAt9P8ALPP/ACzy/wAr8P8AKu//ACru/wAp7P8AKev/ACnq/wAk4/8ACq7/AACX/wAAmf8AAJfl + AABsFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAla8AAJv8AACY/wAAlf8AH9j/ADT9/wAt//8baf// + M5n//zSb//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//82n///LY7//w9R//8ALv//ADP//wAz//8AM///ADP//wAz//8AM/7/ADL+/wAy/f8AMv3/ + ADH8/wAx+/8AMPr/ADD5/wAv+P8AL/f/AC72/wAu9f8ALfT/ACzz/wAs8v8AK/H/ACvv/wAq7v8AKe3/ + ACnq/wAYyv8AAJT/AACZ/wAAnPsAAJKLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbDoAAKTY + AACZ/wAAk/8ACaj/ACjp/wAw//8IQv//J4H//zWd//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//N6H//ymG//8GQf//AC7//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz/v8AMv3/ADL9/wAx/P8AMfv/ADH6/wAw+v8AL/n/AC/4/wAu9/8ALvb/ + AC31/wAt8/8ALPL/ACvx/wAs8P8AKu7/ABzR/wAAmv8AAJj/AACa/gABldkAAG8WAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJl4AACc9gAAmf8AAI7/ABO//wAw+P8AKf//EVb//y6Q//80nP// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + NJn//zWe//8gc///Ai///wAy//8AM///ADP//wAz//8AM///ADP//wAz//8AM/7/ADL+/wAy/f8AMvz/ + ADH7/wAx+/8AMPr/ADD5/wAv+P8AL/f/AC72/wAt9f8ALfT/AC3z/wAs8P8AHdP/AAGa/wAAl/8AAJr/ + AAWS+gAlVaUAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACapQAAnfsAAJj/ + AACW/wAc0v8AM/3/AC3//xll//8ymP//NJv//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zWd//8vkP//EVf//wAr//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP+/wAy/v8AMv3/ADL8/wAx/P8AMfv/ADD6/wAw+f8AL/j/AC/3/wAu9v8ALvb/ + AC3z/wAe1f8AAJr/AACX/wAAmv8AA5L/AC1W/wBuAP0AagB5ABMADAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABRMAAAmM0AAJv/AACU/wAHpf8AJuT/ADH//wQ6//8id///NJz//zSa//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOa//82n/// + IHP//wAr//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AMv7/ADL9/wAy/f8AMfz/ + ADH7/wAw+v8AMPn/AC/4/wAw+P8ALfX/AB/W/wAAmv8AAJf/AACa/wAGk/8CM1n/AGwA/wBmAP8AaAD/ + AGsAdwASAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZWcAAKTvAACZ/wAAj/8ADrb/ + ACzy/wAt//8JRf//J4D//zSc//8zmv//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//82n///J4L//wU///8AL///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP+/wAy/v8AMv3/ADL8/wAx+/8AMfv/ADH7/wAv+P8AH9n/AACZ/wAAl/8AAJr/ + AQmU/wlLZP8NnAn/AWgB/wBmAP8AZgD/AGcA/wBpAFoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJqOAACc+QAAmf8AAJD/ABbF/wAx+/8ALP//C0f//ymG//81nf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//81nf//LIr//w5Q//8ALf// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz/v8AMv7/ADL9/wAy/P8AMf3/ + ADD6/wAg2v8AAJr/AACW/wAAmv8BCJT/DU9o/xu/Hf8SqBv/BHgG/wBkAP8AZgD/AGYA/QBiAI0AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEbAACaugAAm/0AAJj/AACW/wAe1v8ANf3/ + ACj//xFU//8uj///NJz//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//81nf//K4j//wxN//8ALf//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADL+/wAy/v8AMfz/ACHb/wAAmf8AAJb/AACa/wEJlf8OUWz/IMQl/xaqIf8Igw3/ + AGEA/wBmAP8AZgD/AGcA3ABRADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABhRgAApdkAAJn/AACU/wAGpf8AJOP/ADX+/wAr//8SVv//Lo7//zSb//8zmv//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//81nv//J4D//wZA//8AMP//ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAy/f8AIt3/AACY/wAAlv8AAJr/ + AgmV/xFUb/8myi7/G7Ap/wqEEP8AYAD/AGYA/wBmAP8AaADcAFEANwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnG0AAJzwAACZ/wAAkP8ADLH/ACru/wA0//8AK/// + EFL//yuK//80mv//NJr//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOb//80m/// + G2n//wAr//8AMv//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADL9/wAh3P8AAJn/AACX/wAAmf8CCpX/E1d0/y3QOP8gtTD/DIYT/wBfAP8AZgD/AGYA/wBnANsAUQA3 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ2U + AACb+gAAmP8AAJL/ABTA/wAw+f8ANf//ACr//wpH//8ngv//NJv//zSa//8zmf//M5n//zOZ//8zmf// + M5n//zOZ//8zmf//M5r//zWc//8lf///CEH//wAv//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AMv3/ACLd/wAAmf8AAJb/AACZ/wMKlv8VWHf/MtZA/ya6OP8PiRf/ + AF8A/wBmAP8AZgD/AGcA3ABRADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAbAACetwAAm/0AAJj/AACT/wAZy/8AM/v/ADT//wAt//8FPP// + Inb//zOY//8zmv//M5r//zOZ//8zmf//M5n//zOZ//80mv//NZv//ymG//8NTP//ACv//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAy/f8AIt3/AACZ/wAAl/8AAJn/ + AwqW/xhcev843Er/Kr8//xGLGv8AXgD/AGYA/wBmAP8AZwDcAFEANgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPOwAAnc8AAJr+ + AACX/wAAl/8AGs//ADP8/wA0//8AMP//ADH//xRc//8sjP//Mpb//zOY//80m///NJr//zOZ//8zmP// + J4H//wpI//8AK///ADT//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP9/wAh3P8AAJr/AACX/wAAmf8DCpb/Gl59/z3iUv8vxEb/FI0d/wBeAP8AZgD/AGYA/wBnANsAUQA2 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWlEAAKfhAACZ/wAAlv8AAZr/AB/Y/wA1/f8ANP//ADP//wAs//8EPP// + F2D//yeB//8wkv//L5H//yqI//8XYP//ATb//wAu//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM/3/ACLd/wAAmf8AAJf/AACZ/wMJl/8cX4L/Q+db/zPJTv8WkCH/ + AF0A/wBmAP8AZgD/AGcA3ABRADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ9rAACb7wAAmf8AAJX/ + AAWj/wAi3f8ANfz/ADP//wAz//8AMv//AC///wAt//8ALP//ACz//wAt//8AL///ADL//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz/f8AId3/AACa/wAAl/8AAJn/ + AwqY/x9jhv9K7GT/Oc5V/xiRJP8AXQD/AGYA/wBmAP4AZwDcAFEANgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACgawAAm/MAAJn/AACV/wADnv8AHdX/ADL8/wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP9/wAh3f8AAZr/AACX/wAAmf8DCpj/IWWJ/0/zbf8+01z/GpQn/wBcAP8AZgD/AGYA/gBnANsAUQA2 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoZEAAJr4AACZ/wAAl/8AAJj/ + ABjL/wAx+v8ANP7/ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AMvv/ACLc/wAAm/8AAJf/AACZ/wIIl/8kZo3/Vfh2/0PYY/8dlir/ + AFwA/wBmAP8AZgD+AGcA3QBRADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAEAAKKDAACa9wAAmf8AAJj/AACU/wANs/8AKOv/ADP8/wAz//8AM///ADP//wAz//8AM/// + ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP8/wAr8f8AEr7/AACT/wAAmP8AAJr/ + AAKP/xFIcP9U83X/Sd5t/x6ZLv8AWwD/AGYA/wBmAP4AZwDdAFEANwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACiaQAAmvEAAJn+AACZ/wAAlv8AAZ3/ + ABbG/wAs8f8AMvz/ADL+/wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADL9/wAy+/8ALPL/ + ABjK/wAEov8AAJT/AACZ/wAAmv8ABJL/ACtU/wFvAP8ViR//I580/wBbAP8AZgD/AGYA/gBnANwAUAA3 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAn0sAAJbUAACa+wAAmf8AAJn/AACV/wACnv8AE8D/ACTi/wAu9v8AMvv/ADH8/wAy/f8AMv3/ + ADH8/wAy+/8AL/b/ACDa/wANs/8AAJv/AACW/wAAmf8AAJn/AACb/AAFkfEANEzpAGoA/wBnAP8AZAD/ + AGQA/wBmAP8AZgD+AGgA3QBRADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwUAACklQAAmvYAAJn9AACZ/wAAmf8AAJj/ + AACW/wAAmv8AB6j/AA21/wAVxf8AE8D/AAmu/wAGpv8AAJP/AACX/wAAmP8AAJn/AACZ/wAAmf0AAJr2 + AACfrgAbax4AcAAuAGYA6ABmAP8AZgD/AGYA/wBmAP4AaADdAFAANwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAojgAAJe3AACa+QAAmfwAAJn/AACZ/wAAmf8AAJn/AACY/wAAmP8AAJj/AACY/wAAmf8AAJn/ + AACZ/wAAmf4AAJn7AACY9QAAlLcAAJtBAAAAAAAAAAAAAAAAAG8ANgBmAOkAZgD+AGYA/gBoANsAUAA3 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAClKQAAlpQAAJjrAACZ+wAAmfwAAJn9 + AACZ/QAAmf4AAJn+AACZ/QAAmf0AAJn8AACY+wAAltIAAJ99AABnKgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABvADQAZADcAGcA1ABPADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACnHgAAl10AAJd+AACXlgAAl8YAAJerAACXgwAAl3IAAKFLAABjFwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAH//////////4AAAAAf/////////4AAAA + AB/////////wAAAAAAH////////gAAAAAAA////////gAAAAAAAB///////gAAAAAAAAP//////gAAAA + AAAAB//////gAAAAAAAAAH/////gAAAAAAAAAA/////wAAAAAAAAAAH////gAAAAAAAAAAA////gAAAA + AAAAAAAH///AAAAAAAAAAAAB///AAAAAAAAAAAAAP//AAAAAAAAAAAAAD//AAAAAAAAAAAAAAf/AAAAA + AAAAAAAAAH/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAfgAAAA + AAAAAAAAAAPgAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAHwAAAAAAAAAAAAAADwAAAAAAAAAAAAAADwAAAA + AAAAAAAAAAD4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAD8AAAAAAAAAAAAAAD8AAAAAAAAAAAAAAD8AAAA + AAAAAAAAAAD+AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/gAAA + AAAAAAAAAAD/gAAAAAAAAAAAAAD/wAAAAAAAAAAAAAH/wAAAAAAAAAAAAAH/4AAAAAAAAAAAAAP/8AAA + AAAAAAAAAAf/8AAAAAAAAAAAAB//+AAAAAAAAAAAAH//+AAAAAAAAAAAAf///AAAAAAAAAAAB////AAA + AAAAAAAAA////gAAAAAAAAAAA////gAAAAAAAAAAAf///wAAAAAAAAAAAP///wAAAAAAAAAAAP///4AA + AAAAAAAAAH///8AAAAAAAAAAAH///8AAAAAAAAAAAD///+AAAAAAAAAAAD///+AAAAAAAAAAAD////AA + AAAAAAAAAD////AAAAAAAAAAAB////gAAAAAAAAAAB////wAAAAAAAAAAB////wAAAAAAAAAAB////4A + AAAAAAAAAB////4AAAAAAAAAAB////8AAAAAAAAAAB////+AAAAAAAAAAD////+AAAAAAAAAAD/////A + AAAAAAAAAD/////gAAAAAAAAAH/////gAAAAAAAAAH/////wAAAAAAAAAH/////4AAAAAAAAAP/////4 + AAAAAAAAAP/////8AAAAAAAAAf/////+AAAAAAAAAH/////+AAAAAAAAAD//////AAAAAAAAAD////// + gAAAAAAAAD//////gAAAAAAAAD//////wAAAAAAAAH//////4AAAAAAAAP//////8AAAAAAAAf////// + 8AAAAAAAA///////+AAAAAAAB////////AAAAAAAD////////gAAAAAAH////////wAAAAAAP/////// + /4AAAAAAf////////8AAAAAA/////////+AAAAAB//////////AAAAAD//////////gAAAAH//////// + //4AABwP//////////+AAH4f///////////wA/////////////////////8= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp + bGUAAEjHnZZ3VFTXFofPvXd6oc0w0hl6ky4wgPQuIB0EURhmBhjKAMMMTWyIqEBEEREBRZCggAGjoUis + iGIhKKhgD0gQUGIwiqioZEbWSnx5ee/l5ffHvd/aZ+9z99l7n7UuACRPHy4vBZYCIJkn4Ad6ONNXhUfQ + sf0ABniAAaYAMFnpqb5B7sFAJC83F3q6yAn8i94MAUj8vmXo6U+ng/9P0qxUvgAAyF/E5mxOOkvE+SJO + yhSkiu0zIqbGJIoZRomZL0pQxHJijlvkpZ99FtlRzOxkHlvE4pxT2clsMfeIeHuGkCNixEfEBRlcTqaI + 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 + gg== + + + + + AAABAAgAEBAQAAEABAAoAQAAhgAAACAgEAABAAQA6AIAAK4BAAAQEAAAAQAIAGgFAACWBAAAICAAAAEA + CACoCAAA/gkAADAwAAABAAgAqA4AAKYSAAAQEAAAAQAgAGgEAABOIQAAICAAAAEAIACoEAAAtiUAADAw + AAABACAAqCUAAF42AAAoAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + gAAAAAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ACIi + IoiIgiIiIiKBERGIgiIiIRmZmRGIIiIZmZmZmRiCIZn5mZn5kYIhn/+Zn/+RiBmZ//n/+ZkYGZmf//+Z + mRgZmZn/+ZmZGBmZn///mZkYGZn/+f/5mRIhn/+Zn/+RgiGZ+ZmZ+ZEiIhmZmZmZEiIiIRmZmREiIiIi + IRERIiIi/B8AA/AHAAPgAwADwAEAA4ABAAOAAAADAAAAAwAAAAcAAAAHAAAABwABAA+AAQAfgAMAH8AH + AD/gDwB/+D8B/ygAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA + AAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AIiIiIiIi + KIiIiIIiIiIiIiIiIiIiiIiIiIiIiCIiIiIiIiIiKIEREREYiIiCIiIiIiIiKBEZmZmZkRGIiIIiIiIi + IoGZmZmZmZmZGIiIIiIiIiEZmZmZmZmZmZEYiIIiIiIZmZmZmZmZmZmZkYiCIiIhmZmZmZmZmZmZmZkY + iCIiIZmZmZmZmZmZmZmZGIiCIhmZmZ+ZmZmZmfmZmZGIgiGZmZn/+ZmZmZ//mZmZGIIhmZmf//+ZmZn/ + //mZmRiIIZmZmf//+Zmf//+ZmZkYiBmZmZmf//+Z///5mZmZkYgZmZmZmf//////mZmZmZGIGZmZmZmf + ////+ZmZmZmRiBmZmZmZmf///5mZmZmZkYgZmZmZmZn///+ZmZmZmZGIGZmZmZmf////+ZmZmZmRiBmZ + mZmZ//////+ZmZmZkYIZmZmZn///mf//+ZmZmZGCIZmZmf//+Zmf//+ZmZkYgiGZmZ///5mZmf//+ZmZ + GCIhmZmZ//mZmZmf/5mZmRIiIhmZmZ+ZmZmZmfmZmZGCIiIhmZmZmZmZmZmZmZkYIiIiIZmZmZmZmZmZ + mZmZEiIiIiIZmZmZmZmZmZmZkSIiIiIiIRmZmZmZmZmZkRIiIiIiIiIhmZmZmZmZmRIiIiIiIiIiIhEZ + mZmZkREiIiIiIiIiIiIiIRERERIiIiIiIiL/+Af//8AA//+AAH/+AAAf/AAAD/gAAAfwAAAH4AAAA+AA + AAHAAAABgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAGAAAABgAAAA4AA + AAfAAAAH4AAAD+AAAB/wAAA/+AAAf/4AAf//AAP//+Af/ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAA + AAAAAAAAAAAAAAAAAAD9/e4A///xAObm2QDj49YA3t7SAP//9wD9/fUA8vLtAP///AD///0A6uroAP// + /gDu7+0AAAAAAOjp9AAAAOwAAADqAAAA6AAAANYAAADKAAAAyAAAAMIAAAC+AAAAswAAAK4AAACsAAAA + qwAAAKkAAACgAAAAnwAAAJ0AAACbAAAAmgAAAJcAAACWAAAAjwAAAI4AAACMAAAAiAAAAIQAAACBAAAA + ZQAAAGIAAABgAAAATwABAcMAAQGrAAEBowADA9cAAwPLAAICoAACAocAAQFUAAEBUgADA7kAAwO4AAMD + rAAFBdEABgbFAAcHyAAGBrgABgaxAAgI2wAICLsABwexAAsL8QALC9wACgrPAAgIngAFBWMACgrDAA0N + 2AAMDMkADw/KABQU2AAYGO0AFxfqACIi+wAfH+kAGBixABAQbwAlJf0AEhJ5ACkp/wAmJuUAMTH7ADIy + /wATFF0AODj/ADg4/AAnJ6UAKSmsACgoowA+PvsAISF/AD8/6QBCQusASUn9ADw9zgBDQ9sAUVH/AFNT + /wBRUfMATU3hAFJS7QBXV/kAS0vTAEZGwABISLgAWFjbAGdn/wAsLGwAaWn+AGFh5QBubv8AY2PlAGho + 7wBTU7YAUlK0AExMpwBRUbAAdnb/AGRk1ABoaNAAXl63AISE/wCHh/8AkZH/AJKS/wCTk/8AdXXJAHNz + xQB3d8oAdXW5AJ6e5gCZmdQAt7fjALq61ACzs8IA3NzlAOTk6gDn5+wAra2wAPz8/wD+/v8A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAkpKSkpKSkpKSkpKSkpKSkpKSkpKSb0UpKyySkpKSkpKSkpJbJyQkIyUm + KDSSkpKSkpJbIiEfHRweISMmKpKSkpJbL0SHexkYG2yIWiU1kpKSWxpcBJB6F2uNBXwgM5KSakA2FXcC + j4YOAYU9LjJXkmo/OzkUdQeRCIIWLTc4UJJqSEdCEmIMkQltEzE6PFKSakpMQWOMBokKkHMwQ0ZekmpU + TV+LAIMweAMLcT5JUpKSVVZoioQQDxF2jmdLT5KSklVdZXRpWFFTWWBWTlWSkpKSVWFyf4F9eW5kVVWS + kpKSkpJVVXB+gHllZlWSkpKSkpKSkpJVVVVVVZKSkpKSkv//vFn4PzW84A/WM8AHME2AAzPagAO8PgAB + QEUAAf//AAFlWQABxQkAAf7MgAMuLoAD2g7AB/7F4A9AXPg///8oAAAAIAAAAEAAAAABAAgAAAAAAIAE + AAAAAAAAAAAAAAAAAAAAAAAAYWB5ANbWpgDBwZsAy8ulAL29mwDLy6sAwcGlAODgwQDFxaoA1ta7AOjo + ywD19doA4ODIAN3dxQDs7NQA+PjoAP//8wD///UA///2AP//+QD///oA///9AAAAAAABAg8AAAD2AAAA + 8QAAAOwAAADrAAAA6QAAAOUAAADgAAAA3QAAANYAAADUAAAA0gAAANEAAADLAAAAyQAAAMYAAADFAAAA + wgAAAL0AAAC6AAAAuQAAALcAAAC1AAAAswAAALEAAACvAAAArAAAAKcAAAClAAAAogAAAKEAAACfAAAA + nQAAAJoAAACYAAAAlwAAAJUAAACTAAAAkAAAAI8AAACMAAAAiwAAAIkAAACGAAAAhQAAAIIAAACAAAAA + fwABAc4AAQHBAAEBqgABAakAAgLaAAICuAACArAAAgKtAAEBeAABAXQAAQFtAAEBXQADA9UAAwPSAAMD + ywADA8EAAgKmAAICpQACAp4AAgKbAAIClAACApMAAgKRAAICjAACAokAAQFVAAEBSgADA74AAwO7AAMD + tgADA7IAAwOjAAMDoQABATgABQXzAAUF2wAEBL4ABAS7AAYG9QAGBugABQXKAAUFyAAFBcUABQXDAAUF + uQAEBKMABwf9AAYG0AAGBs4ABgbJAAUFswAFBakABQWmAAcH1AAGBrYABgauAAgIzwAHB7sABwe4AAkJ + 1AAICMYACAjCAAYGkAAKCtkACAi1AAwM/gALC+EACgrKAAsL0gAKCrwADg7zAA0N3AANDdoADAzCABAQ + 9gAPD+MADQ3OAA4O0AASEv8AEBDSAA8PxwATE+sAEhLWABERwQAVFeIAExPPABgY/gAWFtwAFRXVABkZ + 6QAbG/MAHR3/ABkZ2QAZGdYAHBzkABISkgAhIf4AICD4ACAg9gAhIewAJCT/ACYm+gAnJ/8AHx/LACUl + 6wAfH8EAKyv+ACws+gAuLv8ALS32ACgo0gAxMf8AMzP/ADY2/wA4OP8AKSm6ADQ05wAnJ64AOzv/ADs7 + +AA/P/4APT30AEJC/wBGRv8AOzvXADo6zAAxMawASUn/AEtL/wBNTf8ATEz7AB8fZwBPT/8AQUHMAEZG + 2QA6OrMAU1P+AFZW/wBOTuUAWlr+AEZIxQBdXf8AU1PbAE1NygBhYfsAX1/3AGNj/wBISLoAZGT/AGRk + /ABmZv8AaGj/AGpq+wBhYeUAbW3/AHJy/wBgYNUAWVnFAHV1/wBubvAAeXn/AH5+/wCBgf8Af4D7AE5O + lwCMjP8AX1+oAJOT/wBycr8Ampr/AKKi/wAXFyQApaX/AIyM0gBra5UAdnabAIWFrgBXV3EALCw3AGtr + ggB2dosAX19vAE5OUQD///8AAAAAAP////////////////////////////////////////////////// + ////////UlFQUFFSYf////////////////////////////9QQkFDRERFRUVERFFo//////////////// + //////9PXUBDQ0NDQkJDREVGRENQaP//////////////////PD5BQT8/Pj09PT5AQEJERkREYf////// + /////////1k+Pz48Ozk4OTg4OTo7PkBCREZBUv////////////9YXT07PDo3NDQ0NDQ1Njg6P0BAQ0ZA + YP//////////V1s7ODna5DcySklJSkozNDjkzkBAQkRAaP///////7xZODU1vBT+1jMwMDBNMDEz2v7+ + vD49QUBFF///////ZVkzScUJEP7+zDEuLi4uMdoO/v7+xTs8QFxg/////7pmWDEu+wMV/v7+1jAtLC7a + CxP+/gv3NDdbXV4X////dHtOLikv/Aj+/v7+zC8u1gsS/v4K9koxM1pcWmj///97fmRjSEcr+Ab+/v7+ + xNUUEf7+DPUuKy9JNDhZUf//4359bHJwVSIqAAj+/v7+/v7+/gr2LCgpTGVJWVlf8v/Eh4BxeHd2RyEp + +gn+/v7+/v4L9yknJ1ZiTE1XZ1ny/7CMhIp/gnxUIyEo9w/+FRX+E/QoJSYmcXFiZE5mfvL/mpCKi4aO + hlMiIiHTD/7+/v4SxCYkJVVvb3FrZXpz8v+ul5SPkpKJSyAhzA4U/v7+/hUTzSYkR3Z/eHJ9foHy/8Oc + mZuYmJIeH8wOEv7+ERD+/v7+zSQifIJ/g4CHefn/4J+boKGhjRvNDhH+/g739w0V/v7+0SJqj4uKjIx7 + /f//pKWhp6J10QoQ/v4K9iAh+wX+/v7+0R2Jj5OQl4X///+eqqytq+MHEf7+B/YfHBwjAAb+/v4U1W6S + lpeTyv///7uvs7az9gn+/gf1HhwdHRoh+AT+FQHvkZufnJD8/////6q2vb++9gkJ9RkYHB0cHBgf+AQC + 7Z2dpaOepv//////wLO/x8vJ+vqslYh1aWltiIih/OurrayqpZb7////////qL3I1N3c2NDBtqednaKr + trjAubi3sq+g6///////////scLU4efp6eXd0MbCxsjP0MvGv7m0qbr/////////////s8jd6Ozu7u7s + 6Ofi4uHb0svBuK21////////////////scje6O7x8/Px8Ozp5d7Sx72tzf//////////////////v8LZ + 5+zw8/Hw7Ojh1Me5qvT//////////////////////7/C2+Xp6eji2c+/sub///////////////////// + ////////39LPy8/X6v////////////////////////Af//+AA//+AAD//AAAf/gAAD/wAAAf4AAAD8AA + AAfAAAAHgAAAA4AAAAOAAAADAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAYAAAAOAAAADgAAAA8AA + AAfAAAAH4AAAD/AAAB/4AAA//AAAf/4AAP//gAP///Af/ygAAAAwAAAAYAAAAAEACAAAAAAAgAoAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAg4SpAAAA4gAAAdIAAADPAAAAzQAAAMoAAAC7AAAAuQAAALYAAAC1AAAA + pAAAAKIAAAChAAAAngAAAJwAAACbAAAAmQAAAJYAAACUAAAAkgAAAJEAAACPAAAAjAAAAIsAAACJAAAA + hwAAAIUAAACDAAAAgAAAAH8AAAB9AAAAegAAAHkAAAB3AAAAdQABAeYAAQHGAAEBswABAbEAAQGuAAEB + rQABAaoAAQGoAAEBpwACAtwAAgLVAAICwgACAr4AAgK7AAICtAACArIAAgKxAAICrwADA9AAAwPNAAMD + yQACAqUAAgKYAAIClAACApIAAgKOAAICiwACAokAAgKHAAIChAACAoMABAToAAMDuQADA7YAAwOtAAMD + qwADA6kAAwOmAAMDogADA6AAAwOeAAMDnQADA5oAAgJ9AAICbQADA5YAAwORAAMDjQAGBu4ABQXSAAUF + yQAFBcYABQXCAAUFvgAFBbsAAwN5AAcH4gAGBtUABgbNAAUFrQAFBaoABQWlAAUFogAEBIsABgayAAUF + mgAFBZUABAR7AAgI2QAICNAABgadAAUFjgAJCdwABARjAAkJzQAICLYABQVzAAoK1QAKCskACQm8AA0N + 9QAMDOMACgrDAAkJqwAMDNkADAzTAAoKsgAODt0ACQmKAAUFTgAPD9gAEhL7AA8PzgAPD8YADg67ABIS + 4wANDaQAFBTqABIS0wAODp4AFBTbABkZ7gAVFckAERGkABsb/wAZGd8ADg58ABwc9QAZGdYAHR3pACIi + /gAiIvMAICDhACQk6gAXF5YACAk0ACcn+AApKf8AJyfvAB8ftQAlJtAALi7/AC0t9wAYGIQAFRV0ADIy + /wAyMvsAMzP2ADY2/wA4OP8AKCi1ABgYawA7O/8ANTXkAD4+/wApKaMAQkL/AD8/9AAzM8UARUX/AEJC + 8wAsLJ8ASEj/ADQ1tABKSv8AQUHgAExM+wBOTv8AS0v1AFFR/wBCQsUAVlb/AFZW+gBZWf8AWlr/AF1d + /wBbW/oAAAAAACoqbwBhYf8AYmL6AGZm/wBqav8AZWXzAGpq+QBvb/8AbW36AGho7QBycv8AVFS6AHJy + +gB3d/8AdXX6AHp6/wB3d/UAgYH/AGhozgB7e+8Ah4f/AIeH+QCNjf8AS0uFAJOT/wCbm/8AZ2eqAI+P + 2ACamuYAoaHqAHV1mQCysucAsLDUAKGhvgDOzuoAFxcZALKyvgDx8fsA1tbfAHBwdQDp6fIAwsLJAMrK + zwChoaIAjY2OAP///wD9/f0A+/v7APn5+QD29vYA8/PzAPHx8QDu7u4A5ubmAOHh4QDb29sA1NTUALe3 + twCwsLAAqampACwsLAD///8AwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB + wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB + wcHBwcHBwcHBwcHBwW1QIyMjUG1tfcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBp3Ag + ISEhIiIiIiMiIyNQfZfBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwaAeHx8fHx8fHx8fHyAhISIj + IyJtl8HBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHCHR0eHR0cHBsbGxsbHBwdHh8gISIjIn2XwcHBwcHB + wcHBwcHBwcHBwcHBwcHBwZ8cHBwbGxkZGBcXFxcYGBgaGhsdHh8hIiJtl8HBwcHBwcHBwcHBwcHBwcHB + wcHBfBoaGhkYFhUVFRQUExMTFRUWFhgZGxweICEiI33BwcHBwcHBwcHBwcHBwcHBwcFjGRkYFxYUExIS + EREREBERERISExQVFxgaHB4gISF9wcHBwcHBwcHBwcHBwcHBwWsYFz0VExIREA8ODg4ODQ0ODg4PERES + ExUXGRseICAhfcHBwcHBwcHBwcHBwcHBlj0WFRMREA8ODQwLCwsLCwsLCwwNDg4PERITFRcaHR8gI5fB + wcHBwcHBwcHBwcGrPDwTEhAODdTdLCorKioqKioqKyssCwsNs+GHEhQXGRseH1CXwcHBwcHBwcHBwc1R + URIQDg0LzfPv3ygoKCgoKCkoKSkqKiqm6u/kixETFhgbHR195cHBwcHBwcHBwYdOTg4NOSvN7Pbv798m + JiYmJicnJycnKKbs9e/v5IsQEhUYGxxPl8HBwcHBwcHBzU1NSwsrKrP87PXx7+/fCQkKCgoKJiYmpuv5 + 9PHv7+SEDhIVFxpBbeXBwcHBwcHBhEtKOSopi+79+vPw8O/v3wgJCQkJCgqm7Pn18fDz+OvcDQ4RFBhA + QpfBwcHBwcHUYWFIRzUzRbHp7fjx8PDv798HBwcIB6bs+fXx8PH3++B3KwwOEhU+P33lwcHBwcGzYUhG + NDJEMTCx6e348e/w7+/fBwcHruj49fHv8ff84HonKiwLDxI9PlvlwcHBwcFgYEY0RUQwL1gvq+nt+PHv + 8O/v3zCu5/f08e/x9/zgb0UyJykrDA87PVOXwcHBwcFfX2RFWllYV1dXJavp7fjx7/Dv7+Hn7/Pw7/H3 + /OBzMTFERScpLA46PFJ9wcHBwdRkZG9aWVhXVlY4ODir7v338fDw8O/w8fDw8ff7AXMwMDAxRDI0KTlN + UVJQ/sHBwbpvb1pYV1ZeXl43NwYGq+789vDw8PDw8PDw9esBcy8vLy8vMEQyNEhKTmZn/sHBwZxvc3NX + Vl5paWlVNgUGBbP9+vLw8PDw8PDy+ON2JSUlJS9YWDBEMilJTE5j/sHBwYpzc3ZybmlxcV1VNgQEBAS6 + 6/Tw8O/v8PDz4nIGBiUlJThXV1hZRDRHSmVm/sHBwXN2dnJueXF4eGhdLgMDAwOc6/Tw8O/v8PDz3QYG + BgYlODhWVldYWkVGYWpq/sHBwYqBgYB5eHt7e2xoLi4DA5zr+PLw8PDw8PDx9N4FBQYFNzdeXlZXWFpk + YGJq/sHBwZyBgIZ+e4ODg3VsLS4unOv59PDw8PDw8PDw8u/fBAQENlVpaW5WWFpkd2Fm/sHBwbWAhoiI + g4WFhXV1LS2c6/n08PDw8/X18/Dw8O/v3wQ2VVVxcWludllvd3d8/sHBwcuGhoiNhYmJiYV1XJzr+fXx + 7/H2+uP7+vbx7/Dv798uXWh4eHFucnZzeneO2cHBwcGGiI2RiY+Pj4+Fqev59fHv8ff7AXGu7fz38e/w + 7+/faGx7e3h5cnZzenenwcHBwcGGjZGRk5KSkpKp6/n18e/x9/sBaC0ts+79+PHv8O/v33WDg3t+gIGC + enrCwcHBwcG1jZGTmJmZmbDm+vbx7/H3/AFsAgICLabu7fjx8PDx79+Fg4N+hoGCgofZwcHBwcHVjZGT + mZ2dre379/Hw8ff84GwCAgICAgKm6e348vDz+OvUiYOIhoqCgp/ZwcHBwcHBlJGYnaGkqNzt+fLy9/zg + dSQkJAICAgICpunt+PT3++6piZGNkIqBgtnBwcHBwcHBx5GYoaWqrK/c7fn5/eCFVFRDJCQkJCRDQ6bp + 7ez97qmSk5GNkIqBltnBwcHBwcHBwZqYoaissre53O7u4JiMf3RUVFRUVFRUdH+u6e7pqZmZmJWUkIqC + 2cHBwcHBwcHBwdKTnaivt7u+v9zpuKWdkox/f3R0dH9/jJKZuum1oaGdmJWUkIqx2cHBwcHBwcHBwcG4 + maSvub7DxcbHv7uyqJ2ZkoyMjJKZnaSoqrCqqKShnpWUkJvZwcHBwcHBwcHBwcHBo52qt77FyczPzMnF + vrmvqqWkpaiqr7S0tLKvqqWhnpWNitnBwcHBwcHBwcHBwcHBwZihr7vDydHT09PT0czFw767u72+vr69 + u7eyrKihmpSQkMHBwcHBwcHBwcHBwcHBwcGZpLK+xs/T1tjY2NjW09HPzMnJxsXDvrm0rKWelY2NwcHB + wcHBwcHBwcHBwcHBwcHBpKW0v8nR1tja29vb2trY1tPRzMbDvrmyqqKalJTBwcHBwcHBwcHBwcHBwcHB + wcHBwbaksr7G0dba29vb29va2NbRzMbDu7SqoZqpqcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHOoay5xczT + 2Nrb29va1tPPxsO7sqqdmqmpwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcSlsrvFzNHT1tbT0czFvres + pJ6pqcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB0Lavub7DxcXFw7u3rKWtqanBwcHBwcHBwcHB + wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcrAubSytry8vMHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB + 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 + ////////JCSu/wAAj/8AAJD/AACJ/wEBi/8BAYD/AAAM/wAAALsAAAA4AAAAAAAAAAABAWVcAwOy/wIC + nv8AAKT/AACq/y8vqf/MzMD////0////////////QUHK/wAArP8AALP/AACz/wAAs/8AALL/AACt/0ND + tf/t7dn/////////////////MjKv/wAAlf8AAJL/AQGL/wICk/8BAVX/AAAA5QAAAG8AAAAAAAAAAAMD + ptcDA6L/AgKl/wAArP8AALL/eHiN/8vLpf////z/////////////////T0/O/wAArv8AALX/AAC2/wAA + sv9LS73/8vLZ////+P////////////j41P+Cgq7/AACi/wAAnf8BAZT/AgKR/wICjP8AARD9AAAAnwAA + ABgAAMUgBASj/wQEp/8CAq3/AQGz/wAAvP8AALD/YGBz/8TEqf//////////////////////QEDP/wAA + sf8AALP/Tk7I//b23/////b////////////n58v/c3OT/wAAqf8AAKv/AACk/wEBm/8CApL/AgKb/wEB + Of8AAADCAAAANwIBvm0FBaf/BASu/wMDtv8DA7v/AQHB/wAAzf8AALn/VlZu/8DApf////////////// + ////////OzvP/1BQ1/////r////1////////////4ODI/21tj/8AALL/AAC4/wAAsf8BAav/AQGj/wEB + mv8CAp7/AgJv/wAAANwAAABNBAW6oQcHrf8GBrX/BAS7/wUFwv8FBcj/AwPL/wAA0v8AALr/YWF3/8bG + q////////////////////////////////////////////+npzf90dJX/AAC3/wAAwv8BAb3/AgK4/wIC + sv8BAar/AgKf/wMDnv8CAon/AAAE5gAAAFUGBrnLCAi1/wYGu/8GBsT/BgbJ/wYGzf8GBtD/AgLP/wAA + 1P8AAL3/bm6G/9ravf/////////////////////////////////19dr/gYGk/wAAvP8AAMX/AADE/wMD + wf8DA77/AgK4/wICsP8CAqb/AwOh/wMDn/8AAAzsAAAAWQkJu+gJCbr/CAjC/wgIyv8ICND/CQnU/wcH + 1P8DA9L/AADQ/wAA1P8AAML/ioqu//f36v///////v7+//7+/v/////////5/5OTyP8AAMP/AADI/wAA + xv8BAcb/BATG/wUFxf8DA77/AgK2/wICrP8DA6P/Bgau/wEBE+0AAABaCgq/+AwMwv8LC8n/CwvQ/wsL + 2P8NDdz/CAjZ/wMD1f8AANL/AADS/wAA1P9GSMX/+fnm//////////////////////////b/OjrO/wAA + xv8AAMv/AADJ/wMDyv8FBcr/BQXK/wUFxP8EBL7/BASy/wUFqf8FBbn/AQEV6wAAAFcLC8bqEBDJ/w4O + 0P8ODtr/Dw/h/w8P4v8LC+D/AwPa/wAA1v8AANT/QkLL/+np1f////v///////////////////////// + /v////n/SUne/wAAxv8AAMz/AQHN/wYGz/8HB8//BgbJ/wUFw/8FBbf/Bgat/wcHuP8BARPiAAAATwwM + zc4TE8//EhLX/xMT4f8TE+n/ExPs/wwM5/8AAOD/AADc/z8/zf/q6tL////2///////////////1//// + 8///////////////////////Q0Pc/wAAyv8AANL/BgbU/woK0/8ICM7/CAjG/wcHu/8ICLT/Bgaz/wEB + DtQAAABBCQnXpBUV1P8XF+D/GBjp/xoa8v8aGvX/Dg7z/wAA6/9ISNL/7OzQ////9f///////////+7u + 1v+Fhbv/h4et/93dxf////7/////////////////Tk7i/wAA0v8FBdv/DAzZ/wsL0/8KCsr/Cgq+/wsL + vP8GBqX/AAAEsQAAACAGCN51GRnW/xwc5v8eHvL/ISH8/x4e//8GBv//TU3g/+bmy/////T///////// + ///q6sr/e3uj/wAA2f8AANT/c3OJ/8vLq///////////////////////T0/u/wAA5P8LC+H/DQ3a/wwM + zv8MDML/Dw/H/wYGkP8AAACFAAAABQAA5iIXF9z/IiLp/yYm+f8nJ///JCT//15e1v/f38D////1//// + ////////39/C/3Jym/8AAN3/AADo/wAA6f8AANH/YF96/8LCpP////////////////////r/Vlbf/wYG + 6P8QEOD/ERHU/w8Px/8ODs7/AgJT4gAAAEcAAAAAAAAAABAQ49kkJOz/LS3//zEx//8vL///fHyf/9jY + sv///////////+HhwP9paZb/AADg/wAA6f8AAOb/AADk/wAA7P8AANT/WVlx/76+nf/////////9/9bW + pv9ycr//EBD2/xYW5P8VFdb/ExPP/w0Nxf8AACGiAAAAEgAAAAAAAAAABgfoXCEh7f8wMP//PDz//z4+ + //87O/j/cXGa/9jYvf/Z2br/bGyZ/wAA8f8AAPb/AADp/wAA5v8AAOf/AADo/wAA9f8AAN7/VlZ0/7u7 + mP/BwZv/X1+o/xcX//8ZGfr/HBzn/xkZ2f8VFdv/BQWM8gAAAEMAAAAAAAAAAAAAAAAAAAAAExPu0y4u + /f9AQP//S0v//09P//9MTPv/aWmB/2trgP8lJfv/EhL//w0N//8HB/r/BATz/wUF8v8GBvX/Cgr8/wwM + //8aGvT/YGBn/1tbj/8jI///Jib//ycn+/8iIun/HR3g/xAQ0v8AACWIAAAACAAAAAAAAAAAAAAAAAAA + AAACAvE1ICD4/zs7//9NTf//XFz//2Zm//9kZPz/X1/3/1VV//9DQ///MTH//yEh//8ZGf//GBj//xwc + //8lJf//MTH//zc3//89Pfb/OTn+/zU1//8zM///LCz6/yUl6v8aGuj/AwOAwQAAABcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAJCfNxKyv+/0ZG//9dXf//bm7//3t7//+AgP//gYH//3V1//9nZ///VVX//0lJ + //9GRv//SEj//05O//9UVP//V1f//1BQ//9JSf//QED//zg4//8tLfb/ICD2/wgItt8AAAQjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDvaQLy///01N//9mZv//fHz//4uL//+UlP//lpb//5GR + //+Kiv//fn7//3h4//9zc///cXH//2xs//9kZP//W1v//1BQ//9DQ///Njb//yYm//8NDszjAAAHKAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCvh4Kyv9/05O//9oaP//f3///5KS + //+goP//paX//6en//+iov//mZn//46O//+Cgv//dXX//2ho//9ZWf//S0v//zo6//8nJ///CwvOxgAA + ChUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfhBISH83UVF + //9iYv//eXn//4yM//+bm///pKT//6Oj//+bm///jo7//35+//9sbP//XV3//0tL//84OP//Hx/v/wQF + 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 + lP8AAJD/AACM/wAAhv8AAIH/AAB9/wEBe/8BAXT/AAA0+QAAAOYAAAC8AAAAcwAAAC8AAAAGAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAF+PgICkNYCApL/AgKS/wEBlP8BAZf/AACb/wAAnv8AAKH/YGDF/5GR + 2P8AAKf/AACp/wEBqP8BAar/AQGq/wEBqv8BAan/AQGr/wEBqf8BAaj/AQGo/wAApv8AAKX/AACk/wAA + of8vL7H/srLh/xAQoP8AAJf/AACS/wAAjf8AAIj/AACE/wEBfv8BAX3/AQFp/gAAHfUAAADaAAAAogAA + AFIAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAgKRpQMDl/8CApb/AQGX/wEBm/8BAZ7/AACh/wAA + pP9OTrb/9vb2//////+hoeD/AQGu/wEBrv8BAa7/AQGv/wEBrv8BAa7/AQGt/wEBrv8BAa3/AQGt/wEB + q/8BAar/AQGp/ycnr//p6fL//////9LS7v8QEKL/AACZ/wAAlP8AAI//AACK/wAAhP8BAYD/AQGA/wEB + U/wAAADrAAAAxgAAAHsAAAAyAAAABQAAAAAAAAAAAAAAAAAAAAABAZdZAwOa9QMDmv8CApv/AQGe/wEB + of8BAaX/AQGo/0lJsv/MzMz/7u7u////////////oaHj/wEBs/8BAbP/AQGz/wEBsv8BAbL/AQGx/wEB + sf8BAbH/AQGw/wEBsP8BAa7/Jiaz/8fH0P/x8fH////////////S0u7/EBCk/wAAmv8AAJb/AACR/wAA + i/8BAYX/AQGC/wICff8AADD3AAAA3QAAAKIAAABQAAAAFAAAAAAAAAAAAAAAAAAAAAECAp6vAwOc/wMD + nf8CAqD/AQGj/wEBqP8BAav/QUGs/7Kysv/Ozs7/8PDw//v7+////////////6Gh5P8BAbb/AQG2/wAA + tf8AALT/AAC0/wAAtP8AALP/AACz/wEBsv8nJ7b/wsLL/9zc3P/z8/P/+/v7////////////xsbj/w4O + pP8AAJ3/AACX/wAAkf8BAYz/AQGH/wIChP8BAV/8AAAA6wAAAMEAAABwAAAAJQAAAAEAAAAAAAAAAAEC + q0gEBKH3AwOg/wMDov8CAqX/AQGq/wEBrf8SEqv/kJCQ/6ampv/V1dX/9vb2//39/f/8/Pz///////// + //+hoeX/AAC4/wAAt/8AALf/AAC2/wAAtv8AALX/AAC1/ycnuv/GxtD/29vb//Hx8f/7+/v//f39//f3 + 9//h4eH/wsLC/3Jyr/8AAKH/AACe/wAAmP8BAZL/AQGL/wICh/8CAoP/AAEs9QAAANUAAACMAAAAOgAA + AAgAAAAAAAAAAAICqpIEBKX/BASk/wMDqP8CAqv/AgKv/wICsv8CArf/LS2f/35+fv+lpaX/4uLi//r6 + +v/9/f3//Pz8////////////oaHm/wAAu/8AALv/AAG6/wAAuf8AALr/KirA/83N1v/d3d3/8fHx//v7 + +//9/f3/+vr6/+bm5v+2trb/fn6d/woKqf8AAKj/AACi/wAAnv8BAZf/AQGQ/wICi/8CAon/AQFV+wAA + AOEAAACmAAAAUgAAABQAAAAAAAHFDAQEqtMFBab/BASp/wMDrf8CArD/AgK0/wICuP8CArv/AwO+/ykp + nv93d3f/oqKi/+Li4v/6+vr//v7+//z8/P///////////6Gh5/8AAL3/AAC9/wAAvP8tLcX/1tbf/+Dg + 4P/x8fH/+/v7//7+/v/6+vr/5eXl/7CwsP90dJT/CQmw/wEBsP8BAav/AQGn/wEBo/8BAZz/AQGW/wIC + jv8CAov/AgJ4/gAACesAAAC8AAAAaQAAACAAAAAAAQHCQgUFqv8FBar/BASs/wMDsf8DA7b/AwO5/wMD + vf8DA8H/BATD/wMDw/8oKKD/d3d3/6Kiov/i4uL/+vr6//7+/v/8/Pz///////////+hoej/AAC//zAx + y//v7/n/6enp//Ly8v/7+/v//v7+//r6+v/l5eX/sLCw/3NzlP8KCrX/AgK3/wICtP8BAbD/AQGs/wEB + qP8BAaL/AQGc/wIClP8CAo7/AwON/wABL/MAAADKAAAAeAAAACcAAAAAAgO/cwYGrv8GBq7/BQWy/wQE + tv8EBLv/BAS//wQEwf8EBMX/BATH/wQEx/8DA8b/Jyeh/3x8fP+lpaX/4uLi//v7+//+/v7//Pz8//7+ + /v//////srLt//Ly/P//////9/f3//z8/P/+/v7/+/v7/+bm5v+ysrL/eHiZ/wkJuf8CArz/AgK6/wIC + uP8CArb/AQGx/wEBrP8BAab/AQGf/wICmP8CApH/AwOQ/wABTfgAAADTAAAAgQAAACsAAAAABAS9ngcH + sf8GBrP/Bga2/wUFu/8EBL//BQXD/wUFxv8FBcn/BQXL/wQEyv8DA8r/AgLJ/ykpo/+Ghob/qamp/+bm + 5v/7+/v//f39//39/f/8/Pz//v7+//39/f/7+/v//Pz8//39/f/7+/v/6Ojo/7e3t/9/f6H/CAi7/wEB + v/8CAr//AwO+/wMDvP8CArn/AgK1/wICsf8BAaz/AgKl/wICnf8DA5b/AwOS/wEBZ/sAAADYAAAAhgAA + AC4AAAAABQW7wggItf8HB7f/Bga6/wYGwf8GBsT/BgbI/wYGy/8GBs3/BgbO/wQEzf8DA8z/AQHL/wAA + yv8rK6f/lZWV/7Kysv/u7u7//Pz8//39/f/9/f3//f39//39/f/9/f3//f39//z8/P/w8PD/v7+//4qL + rf8JCb7/AADC/wEBwf8CAsL/AwPB/wMDwP8DA73/AwO5/wICtP8CArD/AgKp/wICov8DA5r/BASV/wIC + ev0AAADbAAAAiQAAAC8AAAAABwe73wkJuP8ICLr/CAi//wcHxP8HB8n/BwfM/wgI0P8ICNH/BwfR/wUF + 0P8DA8//AQHN/wAAy/8AAM3/Njaz/6mpqf/W1tb/+Pj4//39/f/9/f3//f39//39/f/9/f3//f39//n5 + +f/f39//nJy//woLxP8AAcb/AADE/wEBxP8CAsX/AwPD/wQEw/8EBMH/AwO+/wMDuf8CArT/AgKt/wMD + pv8DA57/BASZ/wMDi/4AAADcAAAAigAAAC8AAAAACQm98woKvf8KCr//CQnF/wkJyf8JCc3/CQnS/woK + 1f8JCdX/BwfV/wUF0/8DA9H/AQHP/wAAzv8AAM7/AAHO/0NDwv/Gxsb/8/Pz//39/f/9/f3//v7+//7+ + /v/9/f3//f39//X19f+wsNT/DAzJ/wAAyf8AAMj/AADH/wEBxv8CAsf/AwPI/wQEx/8FBcX/BATC/wQE + vf8DA7j/AwOx/wMDqv8EBKL/BQWb/wUFlv8AAADbAAAAiQAAAC8AAAAACgq//gsLwP8MDMX/CwvJ/wsL + zf8LC9P/CwvW/wwM2v8LC9r/CAjY/wUF1v8DA9P/AQHS/wAB0f8AANH/AAHR/yQlzf/ExM//9PT0//39 + /f/9/f3//v7+//7+/v/9/f3//f39//b29v+Njdj/AAHL/wAAy/8AAcv/AAHK/wEByP8CAsn/BATJ/wUF + yf8FBcj/BQXF/wUFwf8EBLz/BAS1/wQErf8FBab/BQWf/wUFnf8AAADYAAAAhgAAAC4AAAAACgrF8w0N + xP8ODsj/DQ3O/w0N0/8NDdn/Dg7c/w4O3/8NDd7/Cgrd/wYG2v8DA9f/AQHU/wAA0/8AAdP/JCXP/8PD + zf/j4+P/+fn5//39/f/9/f3//f39//39/f/9/f3//f39//r6+v/z8/P/mprm/wAAzf8AAM3/AADL/wEB + zP8CAsz/BATN/wYGzf8HB8z/BgbJ/wYGxf8FBcD/BQW5/wUFsf8GBqj/Bgai/wYGnP4AAADTAAAAgQAA + ACsAAAAACgrK3w8Pyf8QEM7/EBDS/xAQ2P8QEN3/ERHh/xER5P8QEOT/DAzh/wgI3f8EBNr/AQHX/wAA + 1v8jJNH/xMTP/9nZ2f/09PT//Pz8//39/f/9/f3//Pz8//z8/P/9/f3//f39//z8/P/5+fn//////6Gh + 7f8AAM//AADO/wEBz/8DA8//BQXQ/wcH0P8ICM//CAjN/wcHyP8GBsL/Bga8/wYGtP8HB6v/Bwek/wUF + lP0AAADKAAAAeAAAACcAAAAACgrPwhAQzf8SEtH/ExPY/xMT3f8UFOP/FBTo/xUV6v8TE+r/Dw/m/woK + 4v8FBd3/AgLb/yUl0//Dw87/29vb//Ly8v/8/Pz//f39//z8/P/39/f/8fHx//Dw8P/39/f//Pz8//39 + /f/8/Pz//v7+//////+hoe7/AADQ/wIC0P8EBNP/BgbT/wkJ1P8KCtP/CQnQ/wgIzP8ICMX/Bwe//wgI + tv8ICK7/CAio/wQEifoAAAC8AAAAaQAAACAAAAAACAjWnhER0f8UFNb/Fhbd/xcX4/8XF+j/GBjt/xkZ + 8f8XF/D/ExPt/w0N5/8HB+L/JyfZ/8HBzP/b29v/8fHx//v7+//+/v7/+/v7/+/v7//U1NT/paW9/7i4 + uP/R0dH/7u7u//v7+//+/v7//Pz8////////////oaHv/wMD1P8FBdX/CAjX/wsL2f8MDNf/CwvU/woK + zv8JCcn/CQnC/wkJuf8JCbD/CQmr/wMDdvQAAACmAAAAUgAAABQAAAAABgfbcxIS1P8WFtn/GRnh/xoa + 6P8bG+7/HR30/x4e9/8cHPf/GBj1/xER7v8tLeD/wMDL/9ra2v/x8fH/+/v7//7+/v/7+/v/6Ojo/7m5 + uf+KirH/CgrW/zo6wf+enp7/rq6u/+bm5v/7+/v//v7+//z8/P///////////6Ki8f8HB9r/Cwvc/w0N + 3v8ODtv/DQ3Z/wwM0v8LC8v/CwvD/wsLuv8LC7L/Cgqu/wICX+gAAACMAAAAOgAAAAgAAAAAAwTiQhIS + 1/8YGNz/HBzl/x4e7P8gIPT/IiL6/yMj//8jI///Hx/9/zg47f++vsn/2dnZ//Dw8P/7+/v//v7+//r6 + +v/m5ub/tbW1/4SEq/8JCdj/AAHd/wAB3f8xMrn/kJCQ/6ioqP/i4uL/+vr6//7+/v/8/Pz///////// + //+lpfT/Dg7i/xER4v8REeL/EBDc/w4O1/8NDc//DQ3G/w0NvP8MDLX/Cgqx/wEBQNEAAABwAAAAJQAA + AAEAAAAAAQHoDA4O3M0ZGeD/Hh7n/yIi8f8lJfn/Jyf//ykp//8qKv//QUHw/7Kyvv/U1NT/7+/v//v7 + +//+/v7/+vr6/+Xl5f+xsbH/fHyk/wgJ2/8AAOD/AADg/wAB3/8AAd7/KCiy/4SEhP+kpKT/4uLi//r6 + +v/9/f3//Pz8//r6+v//////n5/t/xUV6P8UFOX/ExPg/xER2v8QENL/Dw/I/w8Pvv8NDbf/Bwea+AAA + D6YAAABQAAAAFAAAAAAAAAAAAAAAAAkJ4okYGOL/ICDp/yUl9P8qKv//LS3//zAw//8+PvH/mJij/7m5 + uf/l5eX/+vr6//39/f/6+vr/5OTk/7CwsP92dp7/CAjc/wAA4v8AAeL/AADj/wAB4v8AAeL/AADg/ycn + sf97e3v/oqKi/+Li4v/5+fn//f39//f39//g4OD/wcHB/3Jyzv8YGOv/Fhbk/xQU3f8TE9P/EhLK/xAQ + wP8ODrn/AwN35QAAAHsAAAAyAAAABQAAAAAAAAAAAAAAAAQF6UIWFuP1ICDs/ygo9/8uLv//MzP//zc3 + //86Ov//aGix/6Kiov/d3d3/+Pj4//n5+f/k5OT/r6+v/3NznP8KCuH/AQHm/wEB5f8AAOX/AADj/wAA + 4/8AAOP/AADi/wEB4/8nJ7L/dnZ2/6Ghof/h4eH/9PT0/+Xl5f+2trb/k5Oe/zQ05P8cHPD/Ghrp/xcX + 3/8WFtb/FBTK/xERwv8MDLf+AQFKugAAAFIAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAANDeeiHh7r/ygo + 9/8xMf//ODj//z4+//9CQv//RUX//2Rkqf+goKD/2dnZ/9vb2/+rq6v/c3Oc/xIS6/8HB+//BATs/wMD + 6f8CAuj/AQHn/wEB5/8CAub/AgLn/wQE5/8GBun/Kyu4/3R0dP+enp7/ycnJ/6qqqv+Hh5L/Njbn/yMj + +/8gIPT/HR3r/xsb4f8YGNf/FRXL/xERw/8GBo7nAAAAcwAAAC8AAAAGAAAAAAAAAAAAAAAAAAAAAAAA + AAAFBu1LGRns8CYm9v8xMf//Ozv//0ND//9JSf//Tk7//1BQ//9jY6X/kJCQ/5aWlv9xcZb/Jyf3/xgY + //8QEPr/Cwv0/wgI8f8GBu7/BQXt/wUF7P8FBe3/Bwft/woK8P8ODvT/ExP4/zU1wv9vb2//h4eH/3h4 + g/87O+X/Kyv//ygo//8lJff/ISHt/x4e4f8aGtb/FhbM/w4OvfwBAVywAAAARgAAABEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAADAzujyIi8v8vL///Ozv//0ZG//9OTv//VVX//1pa//9cXP//YWGe/2dn + hv9JSfb/OTn//yws//8hIf//GRn//xMT//8PD/r/DQ33/w0N9/8ODvf/ERH6/xUV/v8bG///IiL//yoq + //9CQsL/ZGRv/0BA4/80NP//MTH//y0t//8pKfj/JCTt/yAg4f8bG9X/FRXM/wUFjtUAAABZAAAAIAAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwTzLBUV8MMoKPz/Nzf//0RE//9QUP//Wlr//2Ji + //9nZ///aWn//2Vl9f9fX///VVX//0hI//87O///MDD//ycn//8hIf//HR3//x0d//8eHv//IiL//ygo + //8vL///Njb//zw8//8/P///QkL1/z4+//86Ov//Njb//zEx//8sLPj/Jibr/yAg3v8ZGdP/DAyv6wEB + T34AAAAqAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcI81YdHfXmLy///z8/ + //9NTf//Wlr//2Vl//9ubv//c3P//3Z2//90dP//b2///2Zm//9bW///UFD//0VF//89Pf//ODj//zc3 + //84OP//Ozv//0BA//9GRv//Skr//0xM//9MTP//SUn//0VF//8/P///OTn//zMz//8tLfX/JSXn/x0d + 2/8SEsb3AwN9mgAAAC4AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAKC/RwIyP6+DQ0//9FRf//VVX//2Nj//9vb///eXn//39///+Dg///g4P//4CA//95ef//cXH//2ho + //9gYP//Wlr//1dX//9XV///WFj//1pa//9bW///W1v//1lZ//9VVf//T0///0lJ//9CQv//Ozv//zMz + //8qKu7/ISHi/xcX1vwFBZeoAAAALgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAADA31eiYm/fo3N///SUn//1pa//9qav//d3f//4KC//+Jif//jo7//5CQ + //+Pj///jIz//4eH//+Bgf//e3v//3d3//9zc///cHD//25u//9qav//Zmb//2Bg//9aWv//U1P//0tL + //9CQv//OTn//y8v9v8lJej/Ghrc/QYHpakAAAArAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwN9nQkJPzrODj//0pK//9cXP//bW3//3t7 + //+Hh///kJD//5aW//+amv//m5v//5qa//+Xl///kpL//42N//+Hh///gID//3p6//9zc///a2v//2Nj + //9bW///UVH//0hI//89Pf//MjL7/ycn7v8ZGdz0BweunAAAACIAAAAHAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCvZdHh75yzY2 + //9ISP//Wlr//2tr//96ev//h4f//5GR//+Zmf//np7//6Cg//+fn///nJz//5aW//+Pj///hob//319 + //9zc///amr//2Bg//9VVf//Skr//z8///8yMv7/Jyfw/xQU1d0FBbF9AAAAEwAAAAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAABQb5NhUV95oxMf/9QkL//1NT//9kZP//c3P//4CA//+Li///k5P//5iY//+amv//mJj//5KS + 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 + RsW1AAAAAElFTkSuQmCC + + + + + AAABAAkAEBAQAAEABAAoAQAAlgAAACAgEAABAAQA6AIAAL4BAAAwMBAAAQAEAGgGAACmBAAAEBAAAAEA + CABoBQAADgsAACAgAAABAAgAqAgAAHYQAAAwMAAAAQAIAKgOAAAeGQAAEBAAAAEAIABoBAAAxicAACAg + AAABACAAqBAAAC4sAAAwMAAAAQAgAKglAADWPAAAKAAAABAAAAAgAAAAAQAEAAAAAADAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAgAAAAAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAAAA + AAD//wAA////AP///wARERERESIREREREREecnIRERERERonFxERERERHhJiEREREREXp6ERERERERFy + cREREREREaERERERERERGnERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + EREREREREREREREREREREREREREREf+H////gf///4H///+B////gf///8H////b////5/////////// + //////////////////////////////////8oAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAAAAAAAAAA + AAAAAAAAAACAAAAAAAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAAAA + AAD//wAA////ABERERERERERERERERERERERERERERERERE7c4MRERERERERERERERERPzg4NzERERER + ERERERERETtzg4GDERERERERERERERE/ODgRODERERERERERERERO3ODEROBERERERERERERET84ODEY + MRERERERERERERE7ERGHg4ERERERERERERERMXe4ETgxERERERERERERETsxe4sRgRERERERERERERET + Mbi4dxERERERERERERERETEzixOBERERERERERERERExETMTMRERERERERERERERMRERExERERERERER + ERERERMRERMRERERERERERERERERMzMxERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERER///g////wB///8AP///AB/// + wAP//8AD///AA///wAP//8AD///AA///4AP///AD///zB///8c////gP///8H/////////////////// + //////////////////////////////////////////////////////////////////8oAAAAMAAAAGAA + AAABAAQAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAIAAAICAAIAAAACAAIAAgIAAAICA + gADAwMAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////ABERERERERERERERERERERERERERERERERER + EREREREREREREREREzMzMxEREREREREREREREREREREREREROzg4ODMxERERERERERERERERERERERET + v4ODg4ODMxERERERERERERERERERERET+zg4ODh4ODERERERERERERERERERERETv4ODg4MXg4ERERER + ERERERERERERERET+zg4ODcXODERERERERERERERERERERETv4ODg4ERg4ERERERERERERERERERERET + +zg4ODERODERERERERERERERERERERETv4ODg4cXg4ERERERERERERERERERERET+xERODcXODERERER + ERERERERERERERETs4uHEYODg4ERERERERERERERERERERETOHF4txE4ODERERERERERERERERERERET + izsbi4sRE4ERERERERERERERERERERERODgYuLi4sTEREREREREREREREREREREREzsbi4txexERERER + ERERERERERERERERETgTOLgYGLERERERERERERERERERERERETsREzMbG4IRERERERERERERERERERER + ETgREREYE1ERERERERERERERERERERERETsREREbEREREREREREREREREREREREREROxEREYERERERER + ERERERERERERERERERE7ERGLERERERERERERERERERERERERERETuLizERERERERERERERERERERERER + ERERMzMxERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREf////gP////////8AH/ + ///////gAD///////+AAH///////4AAP///////gAA///////+AAD///////4AAP///////gAA////// + /+AAD///////4AAP///////gAA///////+AAD///////4AAP///////wAA////////gAD////////AAP + ///////8YA////////x8H////////Hx////////+PH////////8Af////////4D/////////wf////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAJn/ + /wAAmcwAnP//AKP//wCm//8As///ALv//wC8//8Axf//AI/4/ACW/P8AjubpAJ39/wCs/P8Avvz+AMr+ + /wDR/v8A5f7/AIby+QCN9vwAk/n/AJ/6/wDZ/f8AfOz1AIPv+QCP9v8Akvj/ALb5/gDx/f4Ac+XyAH3m + 8gCI7PYAjvT/AOv8/gBu4fIAi/D/AIzy/wCG5vIAlfH/AI3m8gCu9f4A4/v+AGDZ7ABq3vIAiO7/AHC3 + xACY5vIApvH+AKPm8gDL9fwA1PX7AOD6/gDn+v0AQ8biAE3M5gCD6f8Ahev/AIbs/wCc7/8Aw/P8AOr6 + /QDs+/4AOb/fAFXP6wBl2PIAguf/AHnU6ACI6P8AdrG/AKPt/gDd9fsA5/f7AO77/gAmstkAMLncAD3A + 4gBQyewATsTlAF/R8gBk1fQAcNz5AHfg/AB02vUAfuP/AH/k/wCA5f8AYazBAHLD2AB6zOMAEKPSABCT + vgAThqwAF6HKABml0QAaqdYAHazWAB6k0AAirtkAIabSAB2QtgAlp84AK7LeADa43wA8tdwARcHpAFq8 + 3ABs2PkAWKzHAHje/wBrxeIAeuD/AHvh/wBVmK4AO11oAIfR6ACZ2OsAS2VtALXk8gDB6fUA0e/4AAOb + zgADms0AA5bIAASbzgAGnM8AB53QAAid0AAJntEACp7RAAuf0gAKkMEADZ/SAA2bywAMibcAD6HUAA+g + 0wAQodQAEqLVABCVwwATo9YAFKPWABObygAVpNcAF6XYABel1wAYpdgAG6faABun2QAans4AFoiuAB2o + 2wAdqdkAHqjbAB6q2QAfp9cAHJbDABmCpQAiqt0AIpS7ACeeyQAfdZIAMKzWACWEpAAkcIoANZa6ACp2 + kAA7pMcASsPtAEa64QA1gpwATLjcAFC95QBYy/IAN3CEAG3U+QB12/8Adtr/AHfd/wA4ZXQAfN7/AI/S + 6QCs6f8Aa46aAICmswBJXGMAY2ZnACWs3wAoreAALK/iAC2w4gAwseQAMbLkADOz5gAzs+UANbPmADW1 + 5gA6tukAOrLjAD646wBCteEAUMLyAFrA6ABiz/kAa9T8AGzT+wBv1f8Acdf/AHLY/wBpeoEAEX2rABd1 + ngBCuu0ASL3wAEu+8QBNv/IAT8H0AE/B8wBTw/YAVcT2AFXD9gBXxfgARJK2AGPN/ABly/oAac//AGrQ + /wBt0/8AW3yLAKfg+QBSW18AQ6jZAD2XxABKt+sAQaHPADyOtgA6iK0AOIClAF3H+gBfyfwAYsr9AGTL + /gBmzP8ARn+cAFN+lAAdbpoAJnWgADF0mABEl8MAUKraACBkjQB3d3cAcHBwAGxsbAD///8AAQEBAQEB + AQEBAf39AQEBAQEBAQEBAQEBAWkSz89lAQEBAQEBAQEBAQFpPS7sLv0BAQEBAQEBAQEBaT4OuAX9AQEB + AQEBAQEBAWmM4755/QEBAQEBAQEBAQEBrAFOlQEBAQEBAQEBAQEBAQGr/KsBAQEBAQEBAQEBAQEBAWEB + AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB + AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB + AQEBAQEBAQEBAf/P////g////4H///+B////gf///9P////j////9/////////////////////////// + //////////////////8oAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wAAAAAAmf//AACZzACc//8Ao///AKb//wCz//8Au///ALz//wDF//8Aj/j8AJb8/wCO5ukAnf3/AKz8 + /wC+/P4Ayv7/ANH+/wDl/v8AhvL5AI32/ACT+f8An/r/ANn9/wB87PUAg+/5AI/2/wCS+P8Atvn+APH9 + /gBz5fIAfebyAIjs9gCO9P8A6/z+AG7h8gCL8P8AjPL/AIbm8gCV8f8AjebyAK71/gDj+/4AYNnsAGre + 8gCI7v8AcLfEAJjm8gCm8f4Ao+byAMv1/ADU9fsA4Pr+AOf6/QBDxuIATczmAIPp/wCF6/8Ahuz/AJzv + /wDD8/wA6vr9AOz7/gA5v98AVc/rAGXY8gCC5/8AedToAIjo/wB2sb8Ao+3+AN31+wDn9/sA7vv+ACay + 2QAwudwAPcDiAFDJ7ABOxOUAX9HyAGTV9ABw3PkAd+D8AHTa9QB+4/8Af+T/AIDl/wBhrMEAcsPYAHrM + 4wAQo9IAEJO+ABOGrAAXocoAGaXRABqp1gAdrNYAHqTQACKu2QAhptIAHZC2ACWnzgArst4ANrjfADy1 + 3ABFwekAWrzcAGzY+QBYrMcAeN7/AGvF4gB64P8Ae+H/AFWYrgA7XWgAh9HoAJnY6wBLZW0AteTyAMHp + 9QDR7/gAA5vOAAOazQADlsgABJvOAAaczwAHndAACJ3QAAme0QAKntEAC5/SAAqQwQANn9IADZvLAAyJ + twAPodQAD6DTABCh1AASotUAEJXDABOj1gAUo9YAE5vKABWk1wAXpdgAF6XXABil2AAbp9oAG6fZABqe + zgAWiK4AHajbAB2p2QAeqNsAHqrZAB+n1wAclsMAGYKlACKq3QAilLsAJ57JAB91kgAwrNYAJYSkACRw + igA1lroAKnaQADukxwBKw+0ARrrhADWCnABMuNwAUL3lAFjL8gA3cIQAbdT5AHXb/wB22v8Ad93/ADhl + dAB83v8Aj9LpAKzp/wBrjpoAgKazAElcYwBjZmcAJazfACit4AAsr+IALbDiADCx5AAxsuQAM7PmADOz + 5QA1s+YANbXmADq26QA6suMAPrjrAEK14QBQwvIAWsDoAGLP+QBr1PwAbNP7AG/V/wBx1/8Actj/AGl6 + gQARfasAF3WeAEK67QBIvfAAS77xAE2/8gBPwfQAT8HzAFPD9gBVxPYAVcP2AFfF+ABEkrYAY838AGXL + +gBpz/8AatD/AG3T/wBbfIsAp+D5AFJbXwBDqNkAPZfEAEq36wBBoc8API62ADqIrQA4gKUAXcf6AF/J + /ABiyv0AZMv+AGbM/wBGf5wAU36UAB1umgAmdaAAMXSYAESXwwBQqtoAIGSNAHd3dwBwcHAAbGxsAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39/QAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIqMjIy16P4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqij7S0oyM + 7ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGq9B3JWr22Jq/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAasMr + Ly/gRS8E/gAAAAAAAAAAAAAAAAAAAAAAAAAAAABqyz4XF25wDQT+AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AGrRNggQWygFBP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAaq5Ht+d6GTR9/gAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAYuDui4zWdgT+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYoyxse71fAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABivAAAbKRzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGK8AABsc2IAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAYi68vEJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYi0aLWIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAYmJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD////////4f///8B///+AP///gB///4Af//+AH///gB///4Af///AH///4D///+Y////mP///4H/// + /B////4///////////////////////////////////////////////////////////////////////// + /////////////ygAAAAwAAAAYAAAAAEACAAAAAAAgAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA + AACZ//8AAJnMAJz//wCj//8Apv//ALP//wC7//8AvP//AMX//wCP+PwAlvz/AI7m6QCd/f8ArPz/AL78 + /gDK/v8A0f7/AOX+/wCG8vkAjfb8AJP5/wCf+v8A2f3/AHzs9QCD7/kAj/b/AJL4/wC2+f4A8f3+AHPl + 8gB95vIAiOz2AI70/wDr/P4AbuHyAIvw/wCM8v8AhubyAJXx/wCN5vIArvX+AOP7/gBg2ewAat7yAIju + /wBwt8QAmObyAKbx/gCj5vIAy/X8ANT1+wDg+v4A5/r9AEPG4gBNzOYAg+n/AIXr/wCG7P8AnO//AMPz + /ADq+v0A7Pv+ADm/3wBVz+sAZdjyAILn/wB51OgAiOj/AHaxvwCj7f4A3fX7AOf3+wDu+/4AJrLZADC5 + 3AA9wOIAUMnsAE7E5QBf0fIAZNX0AHDc+QB34PwAdNr1AH7j/wB/5P8AgOX/AGGswQByw9gAeszjABCj + 0gAQk74AE4asABehygAZpdEAGqnWAB2s1gAepNAAIq7ZACGm0gAdkLYAJafOACuy3gA2uN8APLXcAEXB + 6QBavNwAbNj5AFisxwB43v8Aa8XiAHrg/wB74f8AVZiuADtdaACH0egAmdjrAEtlbQC15PIAwen1ANHv + +AADm84AA5rNAAOWyAAEm84ABpzPAAed0AAIndAACZ7RAAqe0QALn9IACpDBAA2f0gANm8sADIm3AA+h + 1AAPoNMAEKHUABKi1QAQlcMAE6PWABSj1gATm8oAFaTXABel2AAXpdcAGKXYABun2gAbp9kAGp7OABaI + rgAdqNsAHanZAB6o2wAeqtkAH6fXAByWwwAZgqUAIqrdACKUuwAnnskAH3WSADCs1gAlhKQAJHCKADWW + ugAqdpAAO6THAErD7QBGuuEANYKcAEy43ABQveUAWMvyADdwhABt1PkAddv/AHba/wB33f8AOGV0AHze + /wCP0ukArOn/AGuOmgCAprMASVxjAGNmZwAlrN8AKK3gACyv4gAtsOIAMLHkADGy5AAzs+YAM7PlADWz + 5gA1teYAOrbpADqy4wA+uOsAQrXhAFDC8gBawOgAYs/5AGvU/ABs0/sAb9X/AHHX/wBy2P8AaXqBABF9 + qwAXdZ4AQrrtAEi98ABLvvEATb/yAE/B9ABPwfMAU8P2AFXE9gBVw/YAV8X4AESStgBjzfwAZcv6AGnP + /wBq0P8AbdP/AFt8iwCn4PkAUltfAEOo2QA9l8QASrfrAEGhzwA8jrYAOoitADiApQBdx/oAX8n8AGLK + /QBky/4AZsz/AEZ/nABTfpQAHW6aACZ1oAAxdJgARJfDAFCq2gAgZI0Ad3d3AHBwcABsbGwAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP7+/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + c0enpaiwd//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgfiTk5OTLyaKjd7wA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGqJjBPQ0NDQ0NDja2Z0vAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGqbmwhxcXFx0q7PcXFrpf0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGq+vgVEREREcuqxREREBP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGrI + xT4vLy8vbu1wLy8vBP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGrW1jQcHBwdMO9uHRwc + BP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGrZ2UkDAwMDHPZwAwMDBP4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGrLyz8GBg8GJrlFBgYGBP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGpRUR8kSzY2Eys9CAgIBP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpN + otXVpFFwdnk/LBkSBP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpMDo2DreTe1r+pMHpL + BP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiTkyWLkSy8srViIhbBP4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGq/QhYmcuKXvpCbjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAK3JrABOTk9M1paWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AGzfsAAAAABq358AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxUp7wAAADpzqwA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiJay8/f1qWKwAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiLS2nbKUaLbkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAYmIDIAMaqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABiYmJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA///////////////+D/////////wB////////+AB////////wAB////// + //AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP + ///////wAA////////gAD////////gAf///////+ID////////48f////////hx/////////AH////// + //8Af////////4D/////////4f////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////KAAAABAAAAAgAAAAAQAgAAAA + AABABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAQNPE0rAAMJJAAAAA4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAcAhrWqk9Xu8lC23+wvjK/PAA8XeQMDAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABFtdgXJare6pn1//5/4vv+YcLo/0vI6/8AAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAPK/SF0G57ejB////kvn+/2mxxf5d2/L/AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADut1RJAvuLfcrbS/5ze9P+r5/X+dNbt/wAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATMjZFyeq2Plb0O//NK7c/yOl0/8AAAAVAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6q9DTABQcVyWYvqkdTmBeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7faK0y91MxPv9O/D1dtFwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xwAA/4EAAP8BAAD/AQAA/wEAAP+BAAD/wwAA/8MAAP// + AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAACgAAAAvAAAAKAAAABUAAAAGAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABkAAABPAAAAgAAAAI8AAACAAAAAWwAA + ADcAAAAcAAAACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAGeKjhKi1f8SotX/EqLV/whK + YdMADhOrAAAAjAAAAGcAAAA0AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABefk4PoNP/v/b//3PZ + //9z2f//EqLV/xKi1f8gfJvlAA4SrgAAAHEAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQLPZ/yat + 3/+n+P//feL//33i//9exe7/cdj7/xKi1f9Budz7AAAAjgAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABAs9n/NbPm/6j3/v+J7///ivD//0CVvf9v0uz/ie///wCZzP8AAACPAAAALwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAECz2f9OwPP/xvf9/5P5//+T+f//V6fB/3DP5P+T+f//AJnM/wAAAI8AAAAvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQLPZ/3DW///Z+/7/rv7//6f///9/z+H/hOHy/6D///8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAs9n/T7/g/4q2zP+YzeX/pN7z/8vv+P/X/f7/yP7//wCZ + zP8AAACPAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTxDJay+D/Roqt/0aKrf8SotX/EqLV/z64 + 6/+hydv/AJnM/wAAAH8AAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTxDIrr+H/EqLV/27R + +P9u0fj/Roqt/0aKrf8Amcz/AAAAUAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD24 + 6f8SotX/AAAAjQAAAFNav9//Ip/O8AVceqMAAAAlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAScDlw1q/3/8AAACUAAAAm1q/3/8ldpLJAAAAVAAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAep85TaN7v/1q/3/9av9//XM7k+iJ9lr4AAAA0AAAACQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcxuP/YNns/3zs9f9Zz+T3ADlMVgAAAA8AAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcxuP/XMbj/wAxQjIAAAANAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///B////gH///wAf//8AH///AB///wAf//8AH///AB/// + wAf//8AH///gB///8A////AP///wH///+B////w///////////////////////////////////////// + /////////////////////////////////////////////ygAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAARAAAAHwAAACIAAAAfAAAAFwAAAA8AAAAHAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAACAAAABNAAAAbgAAAHYAAABuAAAAXwAA + AE0AAAA7AAAAKgAAABkAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAALwBdfJ5rq8HkHIqz6xV+ + pecAW3rXAD9UwwAdJqoAAACTAAAAgAAAAGQAAABDAAAAJgAAAA8AAAADAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAGqOuAac + z//t////a9H//2vR//9r0f//UsTy/z676f8knsj3AGKD3wAoNbkAAACWAAAAdgAAAEoAAAAgAAAABwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABAs9n/D6HU/xOi1f/S////cNb//3DW//9w1v//cNb//2/V//9v1f//adL8/0a/7P8OirTzADJCxQAA + AJYAAABcAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABAs9n/H6jb/x+o2/+2////euD//3rg//964P//euD//3PZ//9Qtuj/bNP8/3rg + //964P//RcHp/whvkeUAAACGAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAs9n/Kq7h/yqu4f+b////guj//4Lo//+C6P//guj//37k + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdodLIPrjr/wBff80Ae6TGKrDV5T2/ + 4v9Ox+z/Jq7d/0C57P8bp9n/G6fZ/wBpjIwAAAAZAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjp9bFWMf1/wBM + ZsEAAAB6AAAALgBqjhcAksNDG6HS11rG+f8Ad57hADhKgwAAAB4AAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAlcejdd38/xKNtOIAAACbAAAAZAAAADQAAAAoIp7K0W3T//8AX37PAAAAWwAAABYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAlMYhSMjm/23g8v8AYYHLAAAAmgAAAIYAAACALKnO8ILo//8AYYLKAAAARwAA + AA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXHg2DZ7P9g2ez/C4Gm3Fq/3/8LfaHke+r1/1zW + 7P8AUWyXAAAAJQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWyJJNzOb/mf///3Pm + 8v+Z////fOz1/wySvNQAAAAoAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAlMZCD57KpDG01cYkq9DIAIWxgQAAABMAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// + //wP/wAA////+AD/AAD////gAD8AAP///+AAHwAA////4AAPAAD////gAA8AAP///+AADwAA////4AAP + AAD////gAA8AAP///+AADwAA////4AAPAAD////gAA8AAP///+AADwAA////4AAPAAD////wAA8AAP// + //gADwAA/////AAfAAD////8AD8AAP////wAPwAA/////AA/AAD////+AH8AAP////8A/wAA/////4H/ + AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAA= + + + + + AAABAAkAEBAQAAEABAAoAQAAlgAAACAgEAABAAQA6AIAAL4BAAAwMBAAAQAEAGgGAACmBAAAEBAAAAEA + CABoBQAADgsAACAgAAABAAgAqAgAAHYQAAAwMAAAAQAIAKgOAAAeGQAAEBAAAAEAIABoBAAAxicAACAg + AAABACAAqBAAAC4sAAAwMAAAAQAgAKglAADWPAAAKAAAABAAAAAgAAAAAQAEAAAAAADAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAgACAAAAAgACAAICAAADAwMAAgICAAAAA/wAA/wAAAP//AP8A + AAD/AP8A//8AAP///wARERERERERERERERERERERERAAAAAAAAARiIiIiIiIABGPt7e3t7gAGPt7e3t7 + cIAY97e3t7eAgI97e3t7ewiAj//////4B4CIiIiIiIiLgBj3t7e3t7eAGPt7e3///4AY97e3+IiIgRGP + //+BERERERiIiBEREREREREREREREf//e3v//3t74AB7e8AAdwDAALe3gAC3t4AAt7cAALgAAAB7ewAA + e3uAAHt7gAB4AIABt7fAf7e34P+3t///sDAoAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A + /wD//wAA////ABERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + AAAAAAAAAAAAAAAAAAERGDMzMzMzMzMzMzMzMzMwERi3t7e3t7e3t7e3t7e3MBEYe3t7e3t7e3t7e3t7 + ezARh7e3t7e3t7e3t7e3t7cAEYt7e3t7e3t7e3t7e3t3ABGHt7e3t7e3t7e3t7e3uAARi3t7e3t7e3t7 + e3t7e3gAGLe3t7e3t7e3t7e3t7ewMBh7e3t7e3t7e3t7e3t7cDAYt7e3t7e3t7e3t7e3t4AwGHt7e3t7 + e3t7e3t7e3uAMIe3t7e3t7e3t7e3t7e3CDCLe3t7e3t7e3t7e3t7ewgwh7e3t7e3t7e3t7e3t7gLMIt7 + e3t7e3t7e3t7e3t4BzCP////////////////8IswGId3d3d3d3d3d3d3d3e3MBEY+3t7e3t7e3t7e3t7 + ezARGPe3t7e3t7e3t7e3t7cwERj7e3t7e3t7e3t7e3t7MBEY97e3t7e3t7///////wERGPt7e3t7e3t4 + iIiIiIgRERGPt7e3t7e3gRERERERERERGPt7e3t7eBERERERERERERGP/////4ERERERERERERERGIiI + iIgRERERERERERERERERERERERERERERERERERERERERERERERERERER////////////////8AAAAeAA + AADgAAAA4AAAAMAAAADAAAAAwAAAAMAAAACAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACAAAAA4AAAAOAAAADgAAAA4AAAAeAAAAPwAB//+AA///wAf//+AP////////////8oAAAAMAAAAGAA + AAABAAQAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAICAAIAAAACAAIAAgIAAAMDA + wACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ABERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERAAAAAAAAAAAAAAAAAAAAAAAAAAEREREYMzMzMzMzMzMzMzMzMzMzMzMzMzARER + EYe3t7e3t7e3t7e3t7e3t7e3t7ezAREREYt7e3t7e3t7e3t7e3t7e3t7e3tzAREREYe3t7e3t7e3t7e3 + t7e3t7e3t7ezARERGHt7e3t7e3t7e3t7e3t7e3t7e3tzARERGLe3t7e3t7e3t7e3t7e3t7e3t7ewARER + GHt7e3t7e3t7e3t7e3t7e3t7e3twARERGLe3t7e3t7e3t7e3t7e3t7e3t7ewARERi3t7e3t7e3t7e3t7 + e3t7e3t7e3twARERh7e3t7e3t7e3t7e3t7e3t7e3t7eAARERi3t7e3t7e3t7e3t7e3t7e3t7e3uAARER + h7e3t7e3t7e3t7e3t7e3t7e3t7cDAREYe3t7e3t7e3t7e3t7e3t7e3t7e3cDAREYt7e3t7e3t7e3t7e3 + t7e3t7e3t7gDAREYe3t7e3t7e3t7e3t7e3t7e3t7e3gDAREYt7e3t7e3t7e3t7e3t7e3t7e3t7CDARGL + e3t7e3t7e3t7e3t7e3t7e3t7e3CDARGHt7e3t7e3t7e3t7e3t7e3t7e3t4BzARGLe3t7e3t7e3t7e3t7 + e3t7e3t7e4BzARGHt7e3t7e3t7e3t7e3t7e3t7e3twizARh7e3t7e3t7e3t7e3t7e3t7e3t7dwhzARi3 + t7e3t7e3t7e3t7e3t7e3t7e3uAezARh7e3t7e3t7e3t7e3t7e3t7e3t7eAtzARj///////////////// + ////////8IezARGIh3d3d3d3d3d3d3d3d3d3d3d3d3tzARERGPe3t7e3t7e3t7e3t7e3t7e3t7ezARER + GPt7e3t7e3t7e3t7e3t7e3t7e3tzARERGPe3t7e3t7e3t7e3t7e3t7e3t7ezARERGPt7e3t7e3t7e3t7 + e3t7e3t7e3tzARERGPe3t7e3t7e3t7e3t7e3t7e3t7ezARERGPt7e3t7e3t7e3t7e3t7e3t7e3tzARER + GPe3t7e3t7e3t7e3v//////////wERERGPt7e3t7e3t7e3t7+IiIiIiIiIiBEREREY+3t7e3t7e3t7e/ + gRERERERERERERERERj7e3t7e3t7e3v4ERERERERERERERERERGPt7e3t7e3t7+BERERERERERERERER + EREY//////////gRERERERERERERERERERERiIiIiIiIiIERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREf///////wAA//////// + AAD///////8AAP///////wAA/gAAAAADAAD8AAAAAAEAAPwAAAAAAQAA/AAAAAABAAD8AAAAAAEAAPgA + AAAAAQAA+AAAAAABAAD4AAAAAAEAAPgAAAAAAQAA8AAAAAABAADwAAAAAAEAAPAAAAAAAQAA8AAAAAAB + AADgAAAAAAEAAOAAAAAAAQAA4AAAAAABAADgAAAAAAEAAMAAAAAAAQAAwAAAAAABAADAAAAAAAEAAMAA + AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAEAAPgAAAAAAQAA+AAAAAAB + AAD4AAAAAAEAAPgAAAAAAQAA+AAAAAABAAD4AAAAAAEAAPgAAAAAAwAA+AAAAAAHAAD8AAAH//8AAP4A + AA///wAA/wAAH///AAD/gAA///8AAP/AAH///wAA////////AAD///////8AAP///////wAA//////// + AAD///////8AACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA + AACc//8Apf//AJb5+wCJ8PcAlPf/AHnk8ACM8/8AnPP/AFu8zgCE6/8AhOf/AD+41wBPweIAe+P/ACCg + yQB73/8Aa7/aABiaxgAZmsYAGJbAABucxwAYeZwAGXqdACGizgAlos8AKJm/AGvX/wBCs+IAQrLeAFK+ + 5wBv1f0AQrrvAAxypQBax/8AhNf/APf7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAhgYGBgYGBgYGBgCAgICAhYWFhYWFhYWFhYWGAICAhQX + Ax0dHR0dHR0dHRwjAgIUFQgDEBAQEBAQEBIfIwICFBsOAwwMDAwMDAwNIiMCAhQeEQQHBwcHBwcHByAL + IwIUIRQGAwMDAwMDAwMkBSMCFCUUEwEBJgEBAQEBDQEjAhQMDxQUFBQUFBQUFBQUIwIUCgkJCQkJAQEB + AQEUGQICFAEDAwMDARQUFBQUFAICAgIaAQEBARQCAgICAgICAgICAhoaGhoCAgICAgICAgICAgICAgIC + AgICAgICAgICAv//AEr//yRCwA9CQoAHQmYAA29RAANeXgADAAAAAQAAAAEASgABfS0AAS0tAAMtLQAH + LS2B/zdQw/8AAP//AAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wAAAAAAnP//AKX//wCt//8Atf//AL3//wDG//8Azv//ANb//wDe//8A5///AO///wD3//8AjPv/AJT7 + /wCt+/8AlPf/AMb7/wDO+/8AjPP/AKX3/wCt9/8A1vv/AHPn9wCE7/8AnPP/AN77/wBr4/cAe9/vAITn + 9wBKy+cAWtfvAGvf9wCE6/8Ape//AOf7/wA5vt4AhOf/AM7v9wAptt4AWs/vAGPX9wBry+cAe+P/ALXv + /wAAns4AAJbGAAiezgAIkr0ACIq1ABCm1gAYqtYAIbLeACmy3gAhhqUAMa7WADm+5wAxgpwASrreAFLL + 7wBSvt4AWr7eAGvb/wBz3/8Ae9//AITP5wCc2+8Ard/vALXn9wDG6/cAzvP/AN73/wAAms4AAJLGAAie + 1gAIotYACI69ABCi1gAQns4AEI69ABB9pQAYqt4AGKbWABiaxgAhptYAGHmcACGizgAhiq0AMbbnADGy + 3gA5st4AQsPvACl5lABKw+8AWs/3AFK63gBaw+cAa9f/AGvT9wBjvt4Ac9v/AEJ5jAB7y+cAhNPvAJTX + 7wCl5/8ApdvvAO/7/wAYotYAIareACmq3gAxsucAQr7vAEKy3gBSx/cAUr7nAGPT/wBavucAc9f/AHPH + 5wCM0+8AnOP/AL3n9wDW8/8AKa7nADm27wBCuu8ASsP3AEq+7wBSw/cAY8//AGvT/wB71/8AjNv/AJTf + /wCc2/cASr73AFrH/wBjy/8Aa8//AITX/wCU2/8AlNf3AJzf/wCt3/cA5/f/AGvL/wC94/cA3vP/ANbv + /wDv9/8A9/v/AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABeXl5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASjwzOF5eXl5eAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABKk2NggDZQWV5eXl5eAAAAAAAAAAAAAAAAAAAAAAAAAEoBhmZmZmZ2X1o0M15e + Xl5eAAAAAAAAAAAAAAAAAABKdJIkQkJCQkJCQkJmYDpvUTheXl4AAAAAAAAAAAAAAEqOP30tLS0tLS0t + LS0tLS0tK183UF4AAAAAAAAAAAAASnhbDicnJycnJycnJycnJycnJydAMl4AAAAAAAAAAABKhm8oFxoa + GhoaGhoaGhoaGhoaGmM6XgAAAAAAAAAAAEqOf0MYFRUVFRUVFRUVFRUVFRUVYxIzXgAAAAAAAAAASoeK + XA4SEhISEhISEhISEhISEhJ4BjdeAAAAAAAAAABKh3RxlhEQEBAQEBAQEBAQEBAQEGYHHzheAAAAAAAA + AEqOi4p6CgMDAwMDAwMDAwMDAwMDZgkJNl4AAAAAAAAASoeEhHcOBQQEBAQEBAQEBAQEBARmCQlpXl4A + AAAAAABKiIWFWnoBDgwKCQgGBgYGBgYGBoYKCgtYXgAAAAAAAEp7QWZmXzdiZUN8lgEJCAgICAgIQgwM + DHleXgAAAAAASogtLS0tLS0tKz1yLAELCgoKCgqODQ0NHFVeAAAAAABKEiMnIycjJyMnIyciLAEODg0M + DI4ODg4OLF5eAAAAAEoWDw8PDw8PDw8PDw8ZKSxlQ0V8AQEBAQFtWV4AAAAAShEQEBAQEBAQEBAQEBAQ + EBAPGSE0SkpKSjFZXgAAAABKBQMDAwMDAwMDAwMDAwMDAwMDA0oAAAAAAAAAAAAAAEoUAwMDAwMDBBgY + CAcFAwMDAwMDSgAAAAAAAAAAAAAAAEoEAwMDAwMlaEpKSkpGSAsKCAZKAAAAAAAAAAAAAAAASg0MCQgG + CnxKAAAAAEpKSkpKSgAAAAAAAAAAAAAAAAAASkpKSkpKSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD/////////////////////+H////AH///wAH//8AAH/+AAAP/gAAB/4AAAP+AAAD/gAAAf4AAAH+AA + AA/gAAAP4AAAB+AAAAfgAAAD4AAAA+AAAAHgAAAB4AAAAeAAAP/gAAD/8AAA//AHgf/4D/////////// + /////////////ygAAAAwAAAAYAAAAAEACAAAAAAAgAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA + AACc//8Apf//AK3//wC1//8Avf//AMb//wDO//8A1v//AN7//wDn//8A7///APf//wCM+/8AlPv/AK37 + /wCU9/8Axvv/AM77/wCM8/8Apff/AK33/wDW+/8Ac+f3AITv/wCc8/8A3vv/AGvj9wB73+8AhOf3AErL + 5wBa1+8Aa9/3AITr/wCl7/8A5/v/ADm+3gCE5/8Azu/3ACm23gBaz+8AY9f3AGvL5wB74/8Ate//AACe + zgAAlsYACJ7OAAiSvQAIirUAEKbWABiq1gAhst4AKbLeACGGpQAxrtYAOb7nADGCnABKut4AUsvvAFK+ + 3gBavt4Aa9v/AHPf/wB73/8AhM/nAJzb7wCt3+8Atef3AMbr9wDO8/8A3vf/AACazgAAksYACJ7WAAii + 1gAIjr0AEKLWABCezgAQjr0AEH2lABiq3gAYptYAGJrGACGm1gAYeZwAIaLOACGKrQAxtucAMbLeADmy + 3gBCw+8AKXmUAErD7wBaz/cAUrreAFrD5wBr1/8Aa9P3AGO+3gBz2/8AQnmMAHvL5wCE0+8AlNfvAKXn + /wCl2+8A7/v/ABii1gAhqt4AKareADGy5wBCvu8AQrLeAFLH9wBSvucAY9P/AFq+5wBz1/8Ac8fnAIzT + 7wCc4/8Avef3ANbz/wAprucAObbvAEK67wBKw/cASr7vAFLD9wBjz/8Aa9P/AHvX/wCM2/8AlN//AJzb + 9wBKvvcAWsf/AGPL/wBrz/8AhNf/AJTb/wCU1/cAnN//AK3f9wDn9/8Aa8v/AL3j9wDe8/8A1u//AO/3 + /wD3+/8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABe + Xl5eXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEphbFRKM15eXl4AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpWAWuMdFpTSk5XXl5eAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpKKEhjY2NjY2CAby9LUl5eXgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEqAegFmZmZmZmZmZmZ2Xzc0Sl5eXl4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEqN + OQFrQUFBQUFBQUFBQUFBY3RaU0peXl5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEqUbgEuQUFBQUFBQUFB + QUFBQUFBQkJgOjYvXl5eXgAAAAAAAAAAAAAAAAAAAAAAAEqGb3x9QkJCQkJCQkJCQkJCQkJCQkJCQkJC + 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 + AADwAAAAD/8AAPAAAAAH/wAA8AAAAAf/AADgAAAAA/8AAOAAAAAD/wAA4AAAAAH/AADgAAAAAf8AAOAA + AAAA/wAA4AAAAAD/AADgAAAAAH8AAOAAAAAAfwAA4AAAAAA/AADgAAAAAD8AAOAAAAAAHwAA4AAAAAAf + AADgAAAAAA8AAOAAAAAADwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAB//AADgAAAAH/8AAOAA + AAAf/wAA8AAAAB//AADwABgAH/8AAPgAP8A//wAA+AB/////AAD+AP////8AAP///////wAA//////// + AAD///////8AAP///////wAA////////AAD///////8AAP///////wAAKAAAABAAAAAgAAAAAQAgAAAA + AABABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAACMAAAAvAAAALwAAAC8AAAAvAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAAIwAAAAsAAAAAAAAACwAAADsAAAB3AAAAjwAAAI8AAACPAAAAjwAA + AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAHcAAAA7AAAACwAAACMMcqX/DHKl/wxypf8McqX/DHKl/wxy + pf8McqX/DHKl/wxypf8McqX/DHKl/wxypf8AAACbAAAAdwAAACMYmsb/G5zH/5z///9r1///a9f//2vX + //9r1///a9f//2vX//9r1///a9f//2vX//8omb//DHKl/wAAAI8AAAAvGJrG/xmaxv955PD/nP///3vj + //974///e+P//3vj//974///e+P//3vj//973///QrLe/xl6nf8AAACbAAAARxiaxv8los//P7jX/5z/ + //+E6///hOv//4Tr//+E6///hOv//4Tr//+E6///hOf//0K67/8Ymsb/AAAAmwAAAHcYmsb/QrPi/yCg + yf+l////lPf//5T3//+U9///lPf//5T3//+U9///lPf//5T3//9Svuf/W7zO/wxypf8AAACPGJrG/2/V + /f8Ymsb/ifD3/5z///+c////nP///5z///+c////nP///5z///+c////Wsf//5b5+/8Yepv/AAAAjxia + xv+E1///GJrG/2u/2v////////////f7/////////////////////////////4Tn////////GH2h/wAA + AHcYmsb/hOv//0/B4v8Ymsb/GJrG/xiaxv8Ymsb/GJrG/xiaxv8Ymsb/GJrG/xiaxv8Ymsb/GJrG/xiJ + sf8AAAA7GJrG/5zz//+M8///jPP//4zz//+M8///jPP/////////////////////////////GJrG/xl6 + nf8AAAA7AAAACxiaxv//////nP///5z///+c////nP////////8Ymsb/GJrG/xiaxv8Ymsb/GJrG/xia + xv8AAAAjAAAACwAAAAAAAAAAIaLO//////////////////////8Ymsb/AAAAOwAAAAsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhos7/IaLO/yGizv8hos7/AAAAIwAAAAsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAgAEAAQAAuowAAOz/AADv/wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8AAf//gH///8D/+f///+z/KAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAACQAAAAQAAAABAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAACoAAAA7AAAAMQAA + ACMAAAAYAAAADgAAAAcAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAfadOAE5ofgAQ + FpUAAACUAAAAgAAAAGYAAABMAAAAOAAAACYAAAAaAAAAEAAAAAcAAAABAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCO + vopQudz/Tbnf/wCCrvMAYoPfAD5SxgAcJq8AAACYAAAAhgAAAG0AAABSAAAAOgAAACgAAAAdAAAAEwAA + AAkAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAI6+imfD4v/a9P//bdP//1PF8v83t+b/HKjZ/weOvPcAa47kAEdfzQAcJbAAAACaAAAAiwAA + AHMAAABZAAAAQAAAACwAAAAfAAAAFQAAAAsAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAjbyLO7Ti//////972v//ctj//3LY//9y2P//ctj//13N9f9Bven/JK3c/wiW + xfsAc5rpAFFs1AAoNrgAAACdAAAAkQAAAHoAAABgAAAARQAAAC4AAAAfAAAADwAAAAMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCMuoxMvez/r9/v/6np//923P//dtz//3bc//923P//dtz//3bc + //923P//dtz//2jU+f9KxOz/LbPf/w+i0v8Ae6TuAFp42gAzRL8AAACgAAAAkwAAAHcAAABAAAAADwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAIy7nHnR/P9wxuL/1vb//3zi//984v//fOL//3zi + //984v//fOL//3zi//984v//fOL//3zi//984v//fOL//3Te/P9WzO//N7ri/xin1v8Agq7zAD5SxwAA + AHYAAAAkAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAk8THd9D6/zCu2v/3/f//gOb//4Dm + //+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//gOb//2vY + +f8KgqfuAAAAmgAAAEYAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAReezcd50fn/JKve/8/s + 9f+s8v//huz//4bs//+G7P//huz//4bs//+G7P//huz//4bs//+G7P//huz//4bs//+G7P//huz//4bs + //+G7P//btT//0/M5v8AMkPDAAAAbgAAAB0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMKjUx4DT + +/87t+r/gMzm/9P5//+K8P//ivD//4rw//+K8P//ivD//4rw//+K8P//ivD//4rw//+K8P//ivD//4rw + //+K8P//ivD//4rw//9v1f//nfn8/wxxkeUAAACUAAAAOgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAExp9LJidf8/02/8v8+s93/8f7//5D2//+Q9v//kPb//5D2//+Q9v//kPb//5D2//+Q9v//kPb//5D2 + //+Q9v//kPb//5D2//+Q9v//kPb//3DW//+x////Qr/f/wAbJLUAAABiAAAAFwAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAASqq1/KL2P3/VsT3/zCx5P/f8vn/qPv//5T6//+U+v//lPr//5T6//+U+v//lPr//5T6 + //+U+v//lPr//5T6//+U+v//lPr//5T6//+U+v//ctj//7v///+j8vn/AFl23AAAAIsAAAAxAAAABQAA + AAAAAAAAAAAAAAAAAAAAAAABK6zZ/4XW/f9fyPv/Tb/y/4/S6f/S////mf///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////mf///5n///+Z////mf///5n///9z2f//w////8P///8+stP7AA4TqwAA + AFYAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAFZv+b/jNj//2bM//9mzP//XL/i//P///+t////o////6P/ + //+j////o////6P///+j////o////6P///+j////o////6P///+j////o////3XZ///O////zv///5vm + 8v8ARl7RAAAAggAAACkAAAAEAAAAAAAAAAAAAAAAAAAAA13B5v+T3v//bdP//23T//83tub/j9Lp//// + ///w////5f///9b////J////wP///7P///+z////s////7P///+z////s////7P///+z////edn//9b/ + ///W////1v///ymewvcAAACgAAAATQAAAA8AAAAAAAAAAAAAAAAAAAAJYMHm/5ri//902v//dNr//3Ta + //9Kw+z/LbPf/17E5v9gv9//gMzm/7/m8v/f8vn/+////8v////A////wP///8D////A////wP///8D/ + //982f//4f///+H////h////jdns/wA9UcoAAAB3AAAAIQAAAAEAAAAAAAAAAACItkhkw+b/lef//37k + //9+5P//fuT//37k//9+5P//fuT//37k//9n1vX/V83v/0C/5v9oxOL//P///9n////R////0f///9H/ + ///R////0f///4HZ///p////6f///+n////p////H4mr7gAAAJcAAAA+AAAACQAAAAAAAAAAAIi2SHTJ + 6f+X7P//hev//4Xr//+F6///hev//4Xr//+F6///hev//4Xr//+F6///hev//23c9f9oxeL///////X/ + ///z////7f///+f////l////hNn///T////0////9P////T///+J0un/ABsktgAAAGQAAAAWAAAAAQAA + AAAAhrNJoNvy/6H0//+P9f//j/X//4/1//+P9f//j/X//4/1//+P9f//j/X//4/1//+P9f//j/X//3Xk + 9f8ut9z/Zcvm/2C/3/+AzOb/r9/v/7/m8v////////////7////9/////P///+z5/P8AcZfXAAAAYQAA + ABkAAAABAAAAAACItkim3fL/qPr//5b8//+W/P//lvz//5b8//+W/P//lvz//5b8//+W/P//lvz//5b8 + //+W/P//lvz//5b8//+W/P//lvz//432/P9x5PL/X9js/xOm0v8Rh63mSa3P3HDG4v+AzOb/v+by/wCO + vc4AAAAoAAAACgAAAAAAAAAAAJDAVare8v+s/f//mf///5n///+Z////mf///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////mf///5n///+Z////mf///5n///+Z////JrPZ/wAAAJUAAAArAAAAAQCU + xiEAkMBEAHqjKAAAAAYAAAABAAAAAAAAAAAAlMYhdcnm/8z7//+Z////mf///5n///+Z////mf///5n/ + //+j/v//1/v//9f7///D/P//uP3//67+//+e////mf///5n///+Z////mf///5n///8ms9n/AAAAkQAA + ACgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUns3C4/T8/6T///+Z////mf///5n/ + //+Z////mf///+L7//98xd75SKXG1lS42eR5yub/iNDp/7Xi8v/O7vn/3Pz//9H8///G/f//sP7//zu5 + 3P8AAABtAAAAHgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUxkJ7y+b/7P3//+H9 + ///K/v//w/7//7H////V/v//ueTy/wBZd6QAAAAlAAAABAAAAAEAk8QyAI6+RQCSw4YAkcGXO6zSxUWy + 2ONrxOL/NKrS5AAAAB4AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACX + yqFStdbFQ7PY8XDG4v+AzOb/r9/v/7/m8v8TlsHOAAAAJQAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAAAABAAAAAQCUxiEAkMBEAIq4RwBmiBgAAAAEAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////Af///wAf//8AAf//AAAP/wAAAf8AA + AD/AAAA/wAAAH8AAAB/AAAAfwAAAD8AAAA/AAAAHwAAAB8AAAAPAAAADgAAAA4AAAAGAAAABgAAAAYAA + AEeAAAB/wAAAf8AGAP/gD////h///////////////////ygAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAB0AAAAkAAAAHQAAABMAAAAKAAAAAwAA + AAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAGSGMQAAAE8AAAB8AAAAcwAA + AFoAAABDAAAALgAAAB8AAAAWAAAADQAAAAUAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAI++mQCV + x/UAdp7jAFFs1AA0Rb4AAACfAAAAkQAAAHoAAABhAAAASgAAADQAAAAjAAAAGQAAABAAAAAHAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAIy6jECz2f+/5vL/Srri/w2g0v8Amcz/AHuk7gBaeNoAPlPFAA4TqAAAAJUAAACAAAAAZwAA + AFEAAAA5AAAAJwAAABwAAAATAAAACQAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAIy7nACZzP//////rOb//2zS//9lz/z/S8Hv/zCy4v8UpNb/AJnM/wCC + rvMAYoPfAEhgzAAcJq8AAACZAAAAhwAAAHMAAABZAAAAPwAAACsAAAAfAAAAFQAAAAsAAAADAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJPExw6g0v+v3+//5Pf//2/V//9v1f//b9X//2/V + //9v1f//b9X//1TH8v84uOb/HKjZ/wedz/8Airj3AHOa6QBRbNMAKDa4AAAAnAAAAI4AAAB5AAAAYAAA + AEUAAAAuAAAAIgAAABgAAAANAAAABQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJPExzOy4v9gv9///////4Te + //9z2f//c9n//3PZ//9z2f//c9n//3PZ//9z2f//c9n//3PZ//9ezvX/Qb7p/ySt3P8PodL/AJLC+wB7 + pO4AWnjaADNEvwAAAKAAAACTAAAAfwAAAGYAAABMAAAANAAAACUAAAAaAAAAEAAAAAgAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJPEx2rL + +f8Yo9L//////7Lr//923P//dtz//3bc//923P//dtz//3bc//923P//dtz//3bc//923P//dtz//3bc + //923P//aNT5/0rE7P80t+L/FqbW/wCZzP8Agq7zAGKD3wA+UsYADhOoAAAAlwAAAIUAAABtAAAAUwAA + ADoAAAAcAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAJHCyX7U//8iqdr/v+by/9X1//953///ed///3nf//953///ed///3nf//953///ed///3nf + //953///ed///3nf//953///ed///3nf//953///ed///3Lb/P9Uyu//Pb3m/x+r2f8Amcz/AIq49wBr + juQAR1/NACg2tgAAAJMAAABeAAAAGQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAJfK8oPW//8xsOH/cMbi//////+F5f//feP//33j//994///feP//33j + //994///feP//33j//994///feP//33j//994///feP//33j//994///feP//33j//994///feP//33j + //994///X9Hy/0fD6f8nsNz/CJ7P/wBqjuUAAACOAAAANAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJnM/4fX//9Duen/IKbS//////+w7///gOb//4Dm + //+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//gOb//4Dm + //+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//atb5/wCSwvsADhOtAAAAXgAAABUAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJnM/4zZ//9Mve3/EaHU/8/s + 9f/Y+P//hOr//4Tq//+E6v//hOr//4Tq//+E6v//hOr//4Tq//+E6v//hOr//4Tq//+E6v//hOr//4Tq + //+E6v//hOr//4Tq//+E6v//hOr//4Tq//+E6v//hOr//4Tq//+E6v//Zsz//zm/3/8AWXfbAAAAhQAA + ACsAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJKnZ/5Ha + //9Hu+3/Iqrd/4DM5v/3/v//h+3//4ft//+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//h+3//4ft + //+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//Zsz//4vy + +f8Airj3AAAAowAAAFIAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAJJqrZ/5bc//9Cuu3/Orbp/zCs1v//////rvT//4rw//+K8P//ivD//4rw//+K8P//ivD//4rw + //+K8P//ivD//4rw//+K8P//ivD//4rw//+K8P//ivD//4rw//+K8P//ivD//4rw//+K8P//ivD//4rw + //+K8P//Zsz//6b///8+v9//AEZe0QAAAH0AAAAlAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAiLZIJ6rZ/5ve//9IvfD/SL3w/w6g0//f8vn/1Pr//43z//+N8///jfP//43z + //+N8///jfP//43z//+N8///jfP//43z//+N8///jfP//43z//+N8///jfP//43z//+N8///jfP//43z + //+N8///jfP//43z//+N8///Zsz//6z///+B5vL/AIKu8wAAAJ0AAABHAAAADQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiLZIKKvZ/5/f//9OwPP/TsDz/yyv4v+P0un/+P7//5H3 + //+R9///kff//5H3//+R9///kff//5H3//+R9///kff//5H3//+R9///kff//5H3//+R9///kff//5H3 + //+R9///kff//5H3//+R9///kff//5H3//+R9///Zsz//7L///+y////LbPZ/wAyQsQAAAByAAAAHwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhrNJM7Dc/5/f/v9Uw/b/VMP2/0q+ + 8f9As9n//////6j7//+U+v//lPr//5T6//+U+v//lPr//5T6//+U+v//lPr//5T6//+U+v//lPr//5T6 + //+U+v//lPr//5T6//+U+v//lPr//5T6//+U+v//lPr//5T6//+U+v//Zsz//7n///+5////f9/v/wBz + meoAAACWAAAAPQAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg65LVb7m/5bb + /v9cx/r/XMf6/1zH+v8Mn9L/7/n8/9L+//+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//5j+ + //+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//Zsz//7// + //+/////v////xim0v8AGyS3AAAAaQAAABoAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAg69dV7/m/5vd/v9iyv3/Ysr9/2LK/f8rruH/n9ns//L///+Z////mf///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////mf///5n///+Z////mf///5n///+Z////mf///5n///+Z////mf///5n/ + //+Z////Zsz//8b////G////xv///3zZ7P8Aao7lAAAAjgAAADQAAAAHAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAjr6KWb/m/5/f//9mzP//Zsz//2bM//9TwvX/ULnc///////G////o////6P/ + //+j////o////6P///+j////o////6P///+j////o////6P///+j////o////6P///+j////o////6P/ + //+j////o////6P///+j////Zsz//8z////M////zP///8z///8NmMX7AA4TrQAAAF4AAAAVAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAjr6KXMDm/6Th//9r0f//a9H//2vR//9r0f//DqDS/8/s + 9f//////6////9b////H////vP///63///+t////rf///63///+t////rf///63///+t////rf///63/ + //+t////rf///63///+t////rf///63///+t////Zsz//9L////S////0v///9L///9pzOb/AFl32wAA + AIUAAAArAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAjbyLgdDv/5vh//9w1v//cNb//3DW + //9w1v//TcPv/xej0v9wxuL/v+by/9/y+f/////////////////y////6f///9z////O////xf///7j/ + //+4////uP///7j///+4////uP///7j///+4////uP///7j///+4////Zsz//9n////Z////2f///9n/ + ///L+fz/DpC89wAAAKMAAABSAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAiriOkdby/5vj + //923P//dtz//3bc//923P//dtz//2fU+f9Dv+n/LbPf/x6q2f8Amcz/QLPZ/2C/3/+AzOb/v+by/9/y + +f///////////9n////C////wv///8L////C////wv///8L////C////wv///8L////C////Zsz//9// + ///f////3////9/////f////VL/f/wBGXtEAAAB9AAAAJQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAkcG5ldfy/6Hn//984v//fOL//3zi//984v//fOL//3zi//984v//fOL//3zi//984v//bdn5/1bM + 7/8/vub/J7Dc/xen1v8Amcz/n9ns///////f////zP///8z////M////zP///8z////M////zP///8z/ + ///M////Zsz//+X////l////5f///+X////l////yPL5/wCCrvMAAACdAAAARwAAAA0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAk8THmNjy/6Xq//+B5///gef//4Hn//+B5///gef//4Hn//+B5///gef//4Hn + //+B5///gef//4Hn//+B5///gef//4Hn//954vz/GKjW/5/Z7P//////5f///9b////W////1v///9b/ + ///W////1v///9b////W////Zsz//+z////s////7P///+z////s////7P///1m/3/8AMkLEAAAAcgAA + AB8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAk8THqN/1/6bu//+H7f//h+3//4ft//+H7f//h+3//4ft + //+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//bt31/wmez/+f2ez///////// + ///5////9/////D////u////6P///+T////g////Zsz///L////y////8v////L////y////8v///7bm + 8v8Ac5nqAAAAlgAAAD0AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAEAksPI1PH//57y//+N8///jfP//43z + //+N8///jfP//43z//+N8///jfP//43z//+N8///jfP//43z//+N8///jfP//43z//+N8///jfP//3Pi + 9f8SpNL/QLPZ/2C/3/+AzOb/r9/v/7/m8v///////////////////////P////3////8////+/////v/ + ///5////+f////n///8+s9n/ABsktAAAAGEAAAAWAAAAAQAAAAAAAAAAAAAAAAAAAAEAkcLJ2fL//6T2 + //+S+P//kvj//5L4//+S+P//kvj//5L4//+S+P//kvj//5L4//+S+P//kvj//5L4//+S+P//kvj//5L4 + //+S+P//kvj//5L4//+S+P//ifL8/27h8v9c1ez/Ssnm/y633P8lsdn/EJ/P/0Cz2f9gv9//gMzm/7/m + 8v/P7PX///////////////////////////+AzOb/AHCW2QAAAFsAAAAVAAAAAQAAAAAAAAAAAAAAAAAA + AAEAmcz/3vT//6n7//+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//5j+ + //+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//5j+//+Y/v//mP7//474 + /P9z5vL/AJnM/wBff80Ajr3OAJXG1SCm0v9As9n/cMbi/4/S6f9fv9//AICqvgAAACgAAAAHAAAAAAAA + AAAAAAAAAAAAAAAAAAEAmcz/4vX//6v9//+Z////mf///5n///+Z////mf///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////mf///5n///+Z////mf///5n///+Z////mf///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////AJnM/wAAAJUAAAAqAAAAAQAAAAEAk8QyAI6+RQCSw4YAj76JAE1mIAAA + AAcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAmcz/5/f//8D7//+Z////mf///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////mf///6P+//+Z////mf///5n///+Z////mf///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////mf///5n///+Z////AJnM/wAAAJUAAAAqAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlsiilNXs/+f5//+e////mf///5n/ + //+Z////mf///5n///+Z////mf///5n///+Z////qf7//+f5///s+f//3Pr//9f7///D/P//uP3//67+ + //+e////mf///5n///+Z////mf///5n///+Z////mf///5n///+Z////AJnM/wAAAJUAAAAqAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlMYhHqXS/+L0 + /P/F/f//mf///5n///+Z////mf///5n///+Z////mf///5n///+f////4fv//8To9f88sdn/S7fc/3nK + 5v+I0On/teLy/9Pu+f/x+v//8fr//9v7///Q/P//xf3//7X9//+q/v//mf///5n///+Z////AJnM/wAA + AIwAAAAmAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAJXHo3vL5v/v/P//n////5n///+Z////mf///5n///+Z////mf///5n////T/f//5vb8/yCf + y/kALz5oAG+UQgCKuEcAkMB3AI++iQCUxsUAlcbVH6XS/z2y2f9rxOL/e8vm/6jd7/+44/L/9fz//+r8 + ///e/f//D5/P/wAAAF4AAAAYAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAJTGIRCfz//q9/z/+v3///r9///i/v//4v7//8r+///D/v//sf///8P+ + ///6/f//Trjc/wBNZp8AAAAkAAAABAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQCUxiEAkMBEAI++ZwCQ + wIgAk8S2AJTFxgCZzP8Amcz/AIy7rQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXyqEgptL/QLPZ/2C/3/+AzOb/j9Lp/7/m + 8v/P7PX///////////+P0un/AISw3QAAADcAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJTGQgCK + uEcAkMB3AI++iQCSwqcAlMXGAJXG1QCZzP8AlcfkAFNuOwAAAAsAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// + /////wAA////////AAD///////8AAP///////wAA+D//////AADwA/////8AAPAAP////wAA8AAD//// + AADwAAAf//8AAPAAAAH//wAA8AAAAB//AADwAAAAB/8AAPAAAAAD/wAA8AAAAAP/AADwAAAAAf8AAPAA + AAAB/wAA8AAAAAD/AADwAAAAAP8AAOAAAAAAfwAA4AAAAAB/AADgAAAAAH8AAOAAAAAAPwAA4AAAAAA/ + AADgAAAAAB8AAOAAAAAAHwAA4AAAAAAPAADgAAAAAA8AAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAA + AAAAAwAA4AAAAAADAADgAAAAAAcAAOAAAAAGDwAA4AAAAAf/AADgAAAAB/8AAOAAAAAH/wAA8AAAAAf/ + AADwAB/AD/8AAPgAH////wAA/gA/////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAA= + + + + + AAABAAgAICAQAAAAAADoAgAAhgAAABAQEAAAAAAAKAEAAG4DAAAwMAAAAQAIAKgOAACWBAAAICAAAAEA + CACoCAAAPhMAABAQAAABAAgAaAUAAOYbAAAwMAAAAQAgAKglAABOIQAAICAAAAEAIACoEAAA9kYAABAQ + AAABACAAaAQAAJ5XAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + gAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAAAAAAA//8A/wAAAP8A/wD//wAA////AKqg + AAAAAAAAAAAAAAAACqqqp4iIiIiIiIiIiIiIiAqqqqf///////////////gKqqqn///////////////4 + Cqqqp///////////////+Aqqqqf///////////////gKqqqn///////////////4Cqqqp/////////// + ////+Aqqqqf///////////////gKqqqn///////////////4Cqqqp///////////////+Aqqqqf///// + //////////gKqqqn///////////////4Cqqqp///////////////+Aqqqqf///////////////gKqqqn + ///////////////4Cqqqp///////////////+Aqqqqf///////////////gKqqqn///////////////4 + Cqqqp///////////////+Aqqqqf///////////////gKqqqn///////////////4Cqqqp/////////// + ////+Aqqqqf///////////////gKqqqn///////////////4Cqqqp////////////3AAAAqqqqf///// + //////9/+HCqqqqn////////////f4cKqqqqp////////////3hwqqqqqqf///////////93Cqqqqqqn + ////////////cKqqqqqqp3d3d3d3d3d3d3qqqqqq4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAP4AAAH+AAAD/gAAB/4AAA/+AAAf8oAAAAEAAAACAAAAABAAQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAAA + AAAA//8A/wAAAP8A/wD//wAA////AKoAAAAAAAAKqniIiIiIiAqqf//////4Cqp///////gKqn////// + +Aqqf//////4Cqp///////gKqn//////+Aqqf//////4Cqp///////gKqn//////+Aqqf//////4Cqp/ + ////8AAKqn/////496qqf/////h6qqp3d3d3d6qqwAH//8AB///AAf//wAEKqsAB///AAf//wAH//8AB + CqrAAf//wAH//8AB///AAQqqwAH//8AD///AB///wA8KqigAAAAwAAAAYAAAAAEACAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8Azs7OANbW1gDe3t4A5+fnAO/v7wD39/cA///3AP/3xgD/770A7961AP/n + rQD/9+cA/+/WAP+1QgD/rTEA/60pAP+cAAD/xnMA/71jAP+1UgD3jAAA/9alAP+1WgDWcwAA53sAAO+E + AAD/794A/+fOAP/37wD/3r0A786tAP/WrQD/zpwA98aUAN6lawDenFoA3pRKAN6MOQDnrXsA/9a1APfO + rQDvxqUA772UAOe1jAC9YxgA/+fWAP/exgDevaUA972UAP/OrQDerYwA/9a9AN61nADnvaUA3qWEANac + ewD/7+cA/97OAM6UewDGjHMA1q2cAM6llADWnIQAtYRzAK17awC9hHMAxoRzAK2EewC9e2sAtXNjAMac + lAC9lIwAtYyEAKV7cwCte3MApXNrALV7cwCtc2sAvXNrALVrYwCtY1oA9+/vAP/39wD3zs4A/87OAP/G + xgD/vb0Ae1paALWEhACte3sA/7W1AKVzcwCca2sA/62tAJRjYwD/paUAjFpaAJxjYwC1c3MAhFJSAP+c + nACUWloAjFJSAK1jYwCESkoApVpaAJxSUgClUlIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1t + bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1t + bVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYbW1tbW1tbW1tbW1ta2thYWFhYWdkZGRk + ZGRkZGRkZGRkZGRkZGRkZGRkZGRpaWlYbW1tbW1tbW1tbW1tbFRVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVIWlYbW1tbW1tbW1tbW1tbAEcLy8vLy8vLy8eHh4eHjQ0KCgoKCgoKCAgICAyMjIyVWRY + bW1tbW1tbW1tbW1tbAEcOi8vLy8vLy8vHh4eHh40NCgoKCgoKCgoKCAgIDIyVWRYbW1tbW1tbW1tbW1t + agEcHBwvLy8vLy8vLy8eHh4eHjQ0KCgoKCgoKCAgIDIyVWRYbW1tbW1tbW1tbW1tagIcHBwcOi8vLy8v + Ly8eHh4eHh40NCgoKCgoKCgoICAgVWRYbW1tbW1tbW1tbW1tagIcHBwcHDovLy8vLy8vLx4eHh4eNDQo + KCgoKCgoKCAgVWdYbW1tbW1tbW1tbW1tagIcHBwcHBwcLy8vLy8vLy8eHh4eHjQ0NCgoKCgoKCggVmFY + bW1tbW1tbW1tbW1tUQIuHBwcHBwcHC8vLy8vLy8vLx4eHh4eNDQoKCgoKCgoVmFYbW1tbW1tbW1tbW1t + UQIuLi4cHBwcHBwcLy8vLy8vLy8eHh4eHh40KCgoKCgoVmFYbW1tbW1tbW1tbW1taAIuLi4cHBwcHBwc + HC8vLy8vLy8vHh4eHh4eNCgoKCgoVmFYbW1tbW1tbW1tbW1taAIuLi4uLhwcHBwcHBw6Ly8vLy8vLy8e + Hh4eHjQ0KCgoV2FYbW1tbW1tbW1tbW1tUAMNLi4uLi4uHBwcHBwcHC8vLy8vLy8vHh4eHh40NCgoV2ZY + bW1tbW1tbW1tbW1tUAMNDS4uLi4uLhwcHBwcHDovLy8vLy8vLx4eHh4eHjQ0V2ZYbW1tbW1tbW1tbW1t + RgMbDQ0uLi4uLi4cHBwcHBwcOi8vLy8vLy8vHh4eHh40V19YbW1tbW1tbW1tbW1tRgMbGxsNDS4uLi4u + LhwcHBwcHDovLy8vLy8vLx4eHh4eW19YbW1tbW1tbW1tbW1tTwMbGxsbDQ0uLi4uLi4cHBwcHBwcLy8v + Ly8vLy8vHh4eW19YbW1tbW1tbW1tbW1tTwQbGxsbGw0NLi4uLi4uHBwcHBwcHDovLy8vLy8vLx4eW2JY + bW1tbW1tbW1tbW1tRQQbGxsbGxsbLi4uLi4uLi4cHBwcHBwcLy8vLy8vLy8eW11YbW1tbW1tbW1tbW1t + RQQbGxsbGxsbGw0NLi4uLi4uHBwcHBwcHC8vLy8vLy8vW11YbW1tbW1tbW1tbW1tQwQ5ORsbGxsbGxsN + DS4uLi4uLi4cHBwcHBw6Ly8vLy8vW11YbW1tbW1tbW1tbW1tQwQ5OTkbGxsbGxsbGw0uLi4uLi4uHBwc + HBwcOi8vLy8vW11YbW1tbW1tbW1tbW1tPAQMOTk5ORsbGxsbGxsNDS4uLi4uLhwcHBwcHDovLy8vXl1Y + bW1tbW1tbW1tbW1tPAQMOTk5ORsbGxsbGxsbGw0NLi4uLi4cHBwcHBwcLy8vXl1YbW1tbW1tbW1tbW1t + OwQMDDk5OTk5GxsbGxsbGxsNLi4uLi4uHBwcHBwcHDovXlxYbW1tbW1tbW1tbW1tOwUdDAwMOTk5OTkb + GxsbGxsbDS4uLi4uLi4cHBwcHBwcXlxYbW1tbW1tbW1tbW1tOAUdDB0MDDk5OTk5GxsbGxsbGw0NLi4u + Li4uHBwcHBwcYFxYbW1tbW1tbW1tbW1tOAUdHR0MDAwMOTk5ORsbGxsbGxsbDS4uLi4uLhwcHBwcYEpY + bW1tbW1tbW1tbW1tPwUdHR0dDAwMDDk5OTkbGxsbGxsbGw0NLi4uLi4uHBwcYEpYbW1tbW1tbW1tbW1t + PwUdHR0dHR0MDAwMOTk5GxsbGxsbGxsNDS4uLi4uLhwcYEpYbW1tbW1tbW1tbW1tNwUdHR0dHR0dHQwM + OTk5OTkbGxsbGxsbDQ0uLi4uLi4cYFpYbW1tbW1tbW1tbW1tN1JTHR0dHR0dHR0MDDk5OTk5GxsbGxsb + GxsNDS4uLi4uZVpYbW1tbW1tbW1tbW1tMwZTUx0dHR0dHR0MDAwMDDk5OTkbGxsbGxsbDQ0uLi4uZURY + bW1tbW1tbW1tbW1tMwYHB1NTHR0dHR0dHQwMDAw5OTk5GxsbGxsbGxsNLi4uZURYbW1tbW1tbW1tbW1t + LAYHBwdTUx0dHR0dHR0dDAwMOTk5ORsbGxsbGxsNDQ0uZURYbW1tbW1tbW1tbW1tLAYHBwcHB1MdHR0d + HR0dHQwMDDk5OTkbGxsbV1tbXl5gZVlYbW1tbW1tbW1tbW1tLAYHBwcHB1NTHR0dHR0dHR0dDAwMOTk5 + GxtISElJSUlZY2pYbW1tbW1tbW1tbW1tKwYABwcHBwcHU1MdHR0dHR0dHQwMDDk5OTlMFBEVGhkYLVht + bW1tbW1tbW1tbW1tKwAAAAAHBwcHB1NTHR0dHR0dHR0MDAw5OTlOIRQODxAmWG1tbW1tbW1tbW1tbW1t + MQAAAAAABwcHBwdTU1MdHR0dHR0dDAwMDDlBFhcUDiVYbW1tbW1tbW1tbW1tbW1tMQAAAAAAAAAHBwcH + B1MdHR0dHR0dHQwMDAxLCxMXJFhtbW1tbW1tbW1tbW1tbW1tIgAAAAAAAAAABwcHBwdTUx0dHR0dHR0d + DAxNCRIjWG1tbW1tbW1tbW1tbW1tbW1tIgAAAAAAAAAAAAAHBwcHB1NTHR0dHR0dHQxACCdYbW1tbW1t + bW1tbW1tbW1tbW1tIQAAAAAAAAAAAAAGBgYGBgYGBgYGUlIFBQVAClhtbW1tbW1tbW1tbW1tbW1tbW1t + ISgoICkpKR8qKio2NjAwNTU1PT09Pj4+R0dCSW1tbW1tbW1tbW1tbW1t////////AAD///////8AAP4A + AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/ + AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA + AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/ + AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA + AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/ + AAD8AAAAAH8AAPwAAAAA/wAA/AAAAAH/AAD8AAAAA/8AAPwAAAAH/wAA/AAAAA//AAD8AAAAH/8AAPwA + AAA//wAAKAAAACAAAABAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD//v0A/f39AP/9 + /AD8/PsA//z5AP/8+AD7+/sA/vv3AP/69gD5+fkA//n1AP759AD3+PcA//jzAP748wD++PIA//fxAPb2 + 9gD+9/EA9fb2AP738AD+9vAA/vbvAP717wD09PQA/vXuAP717QD99e0A/fXsAPLz8wD+9OwA/vTrAP30 + 6wDx8vIA/vPqAP3z6gD+8+kA/fPpAP7y6QD+8ugA/fLoAP3y5wDv8PAA/vHnAP7x5gD98eUA/fDmAO7u + 7wD98OUA/fDkAP3v5QD97+QA/u/jAP3v4wD97+IA/e7jAP3u4gDs7OwA/e7hAAAAAAD97eEA/e3gAOrr + 6gD97d8A/ezfAP3s3gD87N4A/ezdAP3r3gD97NwA6OnpAP3r3AD869wA/evbAP3q2wD86tsA/eraAPzq + 2gD96tkA5ufnAP3p2QD86dkA/enYAP3p1wD86NkA5eblAPzo2AD86NcA/OjWAPzn1wD959YA/OfWAPzn + 1QDj5OQA/OfUAPzm1QD859MA/ufSAPzm1ADi4+MA/ObTAPzm0gD85dMA/OXSAPzl0QD75dEA/OTRAPzk + 0AD75NAA/OTPAPvkzwD749AA/OPPAPzjzgD85MwA++POAPzjzQD84s4A/OLNAPvizQD84swA++LMAPvi + ywD84cwA/OHLAPvhywD74coA+eHKAPzgygD74MoA/ODJAPvgyQD74MgA+9/IAPvfxwD738YA+97HAPve + xgD73sUA9t3HAPvdxQD73cQA+93DAPTcxwD73MMA+tzDAPvcwgD63MIA+9vBAPvbwAD628AA8tnFAPva + vwD927sA+tq+APvavQD72b4A+tm+APDYwwD62b0A+9i8APrYvAD62LsA+ti6AO7WwgD617oA+te5APrX + uAD61rkA/dK/APrWuAD617YA+ta3AOzUwAD61bgA+tW2APnVtgD21bUA+tS1APrUswDp0b4A+tOzAPnT + sgD+1awA9NK0APnSsAD60a4A8dCyAObNuwDu0bAA7dCvAOTMuQD/2JYA782xAOLKuQDtzK8A7MquAN/H + twDexrYA6sesAP/MmQDcxLQA68eoAOfEqwDawrMA5sKpANjAsgD/zoUA5MGoANa+sADiwKYA68CeAPez + swDTu68A372lANy7pADQuKwAzrerAPesrADMtakAybKoAM2xqADltpEA9qGiAP+9YADVpZkAzK2KAPia + mgDRo5MA/rVUAM2ekQDJmY4Ax5iNANiViQCqmpAAxpaMAMWVjADWk4cA1ZOGAMOTjADXkoQAw5KLANaP + gwDLmXMA0JxoAO6hRwD/qTEAu4puAPyiIgDLj1MA55U4AN6LNgDVgjUAAAAAAGZmZgA8PDw8PDw8PDw8 + PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8//////////////////////////////88PDw8PDw8POXi + 5+jp6ezt8PLy8vLy8vLy8vLy8vDq/zw8PDw8PDw83qqqqqqqqqqqqqqqqqqqqqqqqqqqye7/PDw8PDw8 + PDzdZISGio2SlZaZoKKnq7GztLe6u7uq7v88PDw8PDw8PNxkfoKGh4uOlJebnKGkp6+ws7a2uqrv/zw8 + PDw8PDw82l51fYGEh4uOkZeWnqGjpquss7O3qu//PDw8PDw8PDzZVm91en6Dh4qNj5WXm6CipqitsLaq + 7/88PDw8PDw8PNZQam5xd36ChYqNj5SVmZ2goamtsKrv/zw8PDw8PDw81kdlaGlxcnyBhIeLjpOVlpuh + o6aoqu//PDw8PDw8PDzSR11jZWlxdHl+hIeKjY6TlpmeoKaq7/88PDw8PDw8PM8/WFxjZ2lsdHd9hIWH + io6TlZmdoqrv/zw8PDw8PDw8zT9NU1hdY2htcXR5fYOHi42SlJaZqu//PDw8PDw8PDzKOkhOUlRcY2Zp + b3Z5fYKFio2PlJeq7/88PDw8PDw8PMc6QkhKUVdcY2dobG91eYKFh4qOkarv/zw8PDw8PDw8xjBAQ0RJ + TVdZXWFnaXFyeX6BhoiLqu//PDw8PDw8PDzDKzk9QURKTFFXXGNnaWxyd3uBhomq7/88PDw8PDw8PMAi + NDY9QENGS1JTWF9jamtueHl/hKrv/zw8PDw8PDw8vSIsMTY5PkNESk5SWF1jZWtwcnh9qu//PDw8PDw8 + PDy1HikqLjU3O0FCSE5RUlxgZWlscniq7/88PDw8PDw8PLUZIyYsLTQ4OUBCSUpPV1ldY2hrbqrv/zw8 + PDw8PDw8rhQdISYqLTE2OT1BRExOVVRbY2hqqu//PDw8PDw8PDylEhccICMnLC8yNjtBQkhMUVdcX2Wq + 7/88PDw8PDw8PJ8NFhgaHyEmKS80NjtAQkNLUVdaXaru/zw8PDw8PDw8mA0QExYaGyAlKS0xNjk+QENI + TVJYqvP/PDw8PDw8PDyQCgsPEBUaGx0jJyotNDc7PkXV2+Dk8f88PDw8PDw8PIwHCAkMEBMXGh8jJigt + MzY73/b7/P34/zw8PDw8PDw8gAQFCAkMDhAVGhshIygqMTTU4ff5+v88PDw8PDw8PDx7AgMFBggLDBAT + FxsfJCYsMcvQ5vX/PDw8PDw8PDw8PHMBAQMFBgkJDA8RFxwcJCYsv8H0/zw8PDw8PDw8PDw8YgACBwoN + FBkiKzA6P0dQXmS+4/88PDw8PDw8PDw8PDy4mqissrm8wsTFyMzO0dPX2M7rPDw8PDw8PDw8//////gA + AA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA + AA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAH/AAAD/wAAB/8AAA//AA + Af8oAAAAEAAAACAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4JJBAPemQwBmZmYArntuALWC + cgC7iHUA6rN3AMKPeQDIlXwAs4h+AM+cgADVooMA1qOEANyphwDeq4gAuI6LALaRiwDBlpMAxJmVAMac + lgDJnpcA0qSXANOmmADMoZkA1qiaANmtnQDuvaUA77+oAPWzqgDwwasA+tCuAPDDrwDxxbEA+dKxAPrT + sQD61LQA8si1APrVtQD71bYA8sm3APrWuAD717gA+9e5APTJugDzzLoA+ti7APvZvAD62rwA8829APvZ + vgD62r4A+9q/APrbvwD728AA+tzBAPvcwgD73MMA+93DAPvcxAD73sQA+97GAPvfxgD738cA++DIAPvg + yQD74coA/OHKAPvhywD84csA/9XMAPzizAD74s0A++POAPzjzgD85M8A/OTQAPzk0QD85dEA/OXSAPzl + 0wD85tMA/ObUAPzn1AD85tUA/OfWAP3n1gD86NcA/OjYAP3p2AD96dkA/OraAP3q2gD86tsA/evbAPzr + 3AD8690A/ezdAP3s3gD97N8A/e3fAP3u4AD97eEA/e7hAP3u4gD97+IA/e/jAP3v5AD98OUA/vDlAP3x + 5gD98ecA/fLnAP3y6AD+8ukA/fPqAP7z6gD98+sA/fPsAP307AD+9OwA/fXtAP717QD+9e4A/vbuAP72 + 8AD+9/EA/vjxAP748gD++PMA/vn0AP769QD/+vcA//v3AP/7+AD//fsA//77AAAAAAD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIqKigICAgICAgICAgIC + AoqKigMZGBYVFxQTEhEQDwKKiooERD87NzItKSMhHhoCioqKBUpGQDw4My4oJSIbAoqKigdSTElCPjo1 + LyomHQKKiooIV1NOSUM/OzYxLR8CioqKCl9bVFBKRkA8NzQgAoqKigtkYFxWUExHQT05JAKKiooNbGZi + XVhTTUhCPicCioqKDXJtaWNeWVVPSkQsAoqKig14c29qZWFaVlBLMAKKiooNf3p2cGtnYVtXUSsCioqK + DYOAfHdxbWhFRRwJAoqKig2GhIF9eXRuAQEAAoqKiooNiYeFgn57dQ0GAoqKioqKDQ0NDQ0NDgwNAoqK + iorgATw8wAFqbsABfoLAAY2PwAGZncABqa3AAe//wAE8PMABPDzAAWVowAFyfMABh4vAAZWWwAOjpsAH + 7//ADzw8KAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAACsrAAY3EhIOORwOEjMaDRQzGg0UMxoNFDMaDRQzGg0UMxoNFDMaDRQzGg0UMxoNFDMa + DRQzGg0UMxoNFDMaDRQzGg0UMxoNFDMaDRQzGg0UMxoNFDMaDRQzGg0UMRgMFTMaDRQzGg0UMxoNFDMa + DRQzGg0UMxoNFDMaDRQzGg0UMxoNFDMaDRQ5HA4SNxISDisrAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADMfChkzHA43NBwOSTQaDU8zGg1QMxoNUDMaDVAzGg1QMxoNUDMa + DVAzGg1QMxoNUDMaDVAzGg1QMxoNUDMaDVAzGg1QMxoNUDMaDVAzGg1QMxoNUDMaDVAzGg1QMhwNUTMa + DVAzGg1QMxoNUDMaDVAzGg1QMxoNUDMaDVAzGg1QMxoNUDQaDU80HA5JMxwONzMfChkrKwAGAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMcDjczGg14MhsNojMaDa4zGg2vMxoNrzMa + Da8zGg2vMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2vMxoNrzMa + DbA0HA+yMxoNsDMaDbAzGg2wMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2vMxoNrzMaDa4yGw2iMxoNeDMc + Djc3EhIOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJfX/+QXV3/j1xc/45b + W/+NWlr/jFlZ/4tYWP+JVlb/h1RU/4dUVP+GU1P/hFFR/4NQUP+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQ + UP+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQUP+CT0//gE1N/39M + TP+ATU3/MxsNoTQYDko5HA4SAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJRh + Yf/yzMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///M + zP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///M + zP//zMz//8zM///Mmf+BT0//MxoNrjQaDU8zGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJRhYf/MzMz/++DH//vfxv/738X/+97F//vdxP/73MP/+tvB//vcwP/72sD/+tq+//vZ + vv/62bz/+9i7//vYuv/617n/+ta4//rVt//61bb/+tW1//rUtP/607P/+tOy//nSsP/50a//+dGv//rR + rv/60Kz/+c+s//nPq//6zqn/+c2o///Ky/+CUFD/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJViYv/Nzc3//OHJ//vfyP/738f/+97G//vexf/73cT/+9zD//vc + wv/728D/+9vA//vavv/72r3/+9m9//vYu//62Lr/+9e6//vXuP/61rf/+tW3//rVtf/61LT/+tOz//rT + s//60rH/+tKw//rSr//50a7/+tCt//nQrP/5z6v/+s6q///Jyf+EU1L/MxoNrzMaDVAzGg0UAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJdkZP/Ozs7/++HK//vhyf/74Mn/+9/H//ve + xv/73sX/+97E//vcw//73ML/+9zB//vbwP/727//+9q+//vZvf/62Lv/+ti7//rYuv/717n/+ta4//rV + t//61bb/+tW1//rUs//507L/+tKx//rSsP/50a//+dGu//nQrv/6z6z/+c+r///IyP+FVFP/MxoNrzMa + DVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhlZf/Q0ND/++HL//zi + y//84Mr/++DJ//vfyP/838f/+97G//vexP/73cP/+9zC//vbwv/728H/+tq///vavv/62b7/+9m8//vY + u//72Lr/+te5//vXuP/61bf/+tW2//rVtf/61LT/+tSy//rSsv/50rD/+tKw//nRrv/60K7/+tCs///G + x/+HVVT/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJlm + Zv/R0dH//OPN//zizP/84cz//ODK//vhyf/838j//N/H//vexv/73sX//N7E//vcw//73ML/+9zB//va + wP/72r//+tq+//vZvf/62Lz/+ti6//vXuf/617n/+ta3//rVt//61Lb/+tS0//rTs//507P/+tKx//rS + sP/60a//+tCu///Fxf+IV1b/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJxpZ//S0tL//OPP//zjzv/74s3/++LM//zhy//74cn/++DI//zfx//83sf//N7G//ve + xP/73MP/+9zC//vbwf/728D/+9q///vZvv/72b3/+ti8//vYu//717r/+9a5//rWuP/61bf/+tW2//rU + tP/61LT/+tSy//rTsv/60rD/+dGv///Dw/+JWVf/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ5raP/T09P//OXQ//vkz//8487//OLN//zhzP/74cv/++HK//vg + yP/738f/+97G//zexf/73sX/+93E//vcw//73ML/+9vA//rawP/62r7/+tm+//rYvP/62Lv/+9i6//rX + uf/617j/+ta3//rVtv/61LX/+tS0//rTs//607L/+dKx///Cwv+LWVj/MxoNrzMaDVAzGg0UAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKFuav/V1dX//OXS//zk0f/849D//OPO//zi + zf/84sz//OHL//vhyv/84Mn/++DI//vex//73sb/+93F//vdxP/73cP/+9zB//vcwf/727//+9q+//va + vf/72b3/+ti7//rYu//617r/+ta4//rWt//61rb/+tW1//rUtP/607P/+tOz///BwP+MW1r/MxoNrzMa + DVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKNwa//W1tb//ObT//zl + 0v/85ND/++TP//zkzv/7483/++LN//vizP/84Mv/++HJ//vgyP/738f/+97G//vexf/73sT/+93E//vc + wv/73MH/+9vA//rav//62r7/+9m9//rZvP/62Lr/+ti5//vXuf/61rf/+tW3//rVtv/61bT/+tOz//+/ + v/+NXVv/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKVy + bP/X19f//ObU//zm0//85tL//OXR//zk0P/848///OPO//vizf/74sz/++HL//zhyv/84Mj/+9/I//ve + x//73sX/+97E//vdw//73MP/+tzB//vbwP/728D/+9q+//vavf/72Lz/+ti7//rYuv/617n/+ta4//rW + tv/61bb/+tS0//++vf+OX1z/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKh1bv/Y2Nj//OfW//zm1f/85tP//OXS//zl0f/85ND//OPQ//zjzv/84s3//OLN//vh + y//84Mr/++DJ//vgyP/738f/+97G//vexf/73cT/+9zD//vcwv/728H/+9vA//ravv/62r7/+9m8//vY + vP/617r/+9i5//rXuP/61bf/+ta3//+8vP+QYF7/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKt4b//a2tr//OjX//zn1v/859X//ObU//zm0//85dL//OXR//zk + 0P/848//++LO//vizP/84sv/++HL//zgyv/738j/+9/H//zfxv/83sb/+93E//vdw//73MP/+9vB//rb + wP/72r//+9q+//vZvf/62bv/+ti6//rYuv/617n/+ta4//+7uv+SYV//MxoNrzMaDVAzGg0UAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK57cP/b29v//ejZ//zo1//86Nf//OfV//zn + 1P/85tT//OXS//vl0f/85ND//OPP//vjzv/84s3/++HM//zhyv/74Mr//ODI//zfyP/738f/+97F//vd + xP/73cT/+9zC//rbwv/628D/+tu///vavv/72b3/+tm8//rYu//62Lr/+te5//+6uf+SY2H/MxoNrzMa + DVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALB9cf/c3Nz//OnZ//3p + 2f/86df//OjW//zo1f/85tX//ObU//zm0//75dH/++TQ//zj0P/8487//OLN//vhzf/74cv/++HK//vg + yf/738j/+97H//vexf/73sX/+93E//vcw//63ML/+9vB//vbv//72r7/+tm+//vZvP/72Lv/+te7//+4 + uP+UZGL/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALJ/ + c//d3d3//Orb//zq2v/96tn//OnY//zo1//86Nb//efV//zm1P/85tL//OXS//zk0f/849D//OPP//zi + zv/84sz/++HM//vhyv/84Mn//ODI//vfx//73sb/+97F//vdxP/73cP/+9zC//vcwf/628D/+9u///rZ + vv/62bz/+ti7//+2t/+VZmT/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAALaDdP/f39///Ovc//3q2//96tv//enZ//zp2P/96Nf//OjW//zn1f/85tT//OXT//zl + 0v/85NH//OTQ//vjz//8487/++LN//ziy//84cv/++DJ//vgyP/838j//N/G//vexf/73sT/+93D//vc + wv/73ML/+9vB//vawP/72r7/+tq9//+1tf+XaGX/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFdf/g4OD//eze//zr3f/969z//Ora//zq2v/86dn//OnY//3n + 1v/859X//OfV//zm0//85tL/++XR//zk0P/749D/++PO//zizf/74sz/++HL//vgyv/74Mn/++DI//zf + x//73sb/+93F//vdw//73MP/+tzC//vbwf/727//+9q+//+0tP+YaWf/MxoNrzMaDVAzGg0UAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALuId//h4eH//O3f//3s3//87N3//evc//3q + 2//86tr//OnZ//zp2P/96Nf//OjV//zn1f/85tT//ObT//zl0v/75ND//OTP//vjzv/8487//OLN//vh + y//84cr//ODJ//vgyP/738f/+97G//vexf/73cT/+93D//vcwv/73MH/+9vA//+ysv+Zamj/MxoNrzMa + DVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL6LeP/i4uL//e7g//3t + 4P/97d7//eze//3r3P/86tz//Ora//3p2f/86dj//ejX//zo1v/859X//OfU//zm0//85tL//OXR//vk + 0P/85M///OLO//zjzP/84cv//OHK//vhyf/74Mn/+9/I//vfx//73sb/+97F//vdxP/73ML/+tvC//+w + sf+bbGr/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCN + ef/k5OT//e7i//3u4f/87eD//ezf//3s3v/9693//evc//3r2//96dr//enZ//zo2P/859f//OfV//zn + 1P/85tT//ObS//zl0f/85ND/++PQ//zjzv/7487/++LM//vhy//74cr//ODJ//vfyP/83sb//N7G//ze + xf/73sT/+9zC//+wr/+cbWv/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAMOQe//l5eX//fDj//3v4v/97uH//e3g//3t4P/87N7//evd//3q3P/969v//Ora//3p + 2f/96dj//OjW//zo1f/859X//ObU//zm0v/85dL/++XQ//zkz//848//++PN//vizf/74sz/++HK//vg + yv/738j/+9/H//vfxv/73cX/+97E//+urf+db2z/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMWSff/m5ub//vDl//3v5P/+7+P//e7h//3u4P/97d///e3e//3r + 3f/8693//erb//3q2v/86tn//enY//zp1//86Nb//OfW//zm1P/85tP//OXS//zl0f/85ND/++TP//vi + zv/84s3//OLM//vhyv/74Mn//ODJ//vfx//738b/+97F//+srf+fcW3/MxoNrzMaDVAzGg0UAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMiVfv/n5+f//fHm//7w5f/97+T//u/j//3u + 4v/97uH//e3g//3s3//8693//Ovd//zq2//969r//era//zp2P/96df//OfX//3n1f/859X//ObU//zl + 0v/85NH//OTQ//zjz//8487//OLN//zizP/74cv//OHK//vgyf/738j//N/H//+rq/+gcm//MxoNrzMa + DVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqXf//p6en//fLn//3x + 5v/98eb//fDl//3v4//97uL//e7h//3t4P/97eD//eze//zr3f/869z//erb//zp2v/96dn//OjY//zo + 1//959b//OfV//zm0//85dL//OXS//vl0f/75ND/++PP//zizf/74s3//OHL//zgyv/74Mr/++DI//+p + qf+hdHD/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM2a + gP/q6ur//vLp//7x5//98uf//fDm//3w5f/+7+P//e7j//3u4f/97eD//e3g//3s3//97N7//evc//zq + 2//96tv//erZ//zo2P/96Nf//OfW//zn1f/85tT//ObT//zm0f/85NH//OTQ//zjzv/7487//OLN//zh + y//74cv/++DK//+oqP+idXL/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAANCdgf/r6+v//fPq//7y6f/98uj//fHn//7x5v/98OX//fDk//3v4v/97uL//e7h//3t + 4P/97N///eve//3r3P/969v//era//zp2v/86dj//OnX//3o1v/859X//ObU//zm0//85tL//OXR//zk + 0f/848///OPO//vizf/74sz/++HL//+np/+jd3P/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANOggv/s7Oz//fTs//3z6v/98+r//fLo//3x5//98eb//vDl//3w + 5f/+7+T//e/j//3u4f/97eD//e3f//3s3v/97N3//Ovc//3q2//96tr//OnZ//zo2P/96Nf//OjV//zn + 1P/859P//OXT//vl0f/85dD//OPQ//vjzv/84s7/++LM//+lpf+leXT/MxoNrzMaDVAzGg0UAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANWihP/u7u7//vXt//707P/+8+v//vPq//3y + 6P/98uj//fHn//7x5v/98OX//fDk//3v4//97uL//e7h//3t3//97N///eze//3r3P/869v//Ora//3p + 2f/96dj//ejX//zo1v/859X//OfU//zm0//85dL//OTR//zk0P/75M///OPO//+kpP+menb/MxoNrzMa + DVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANilhf/v7+///vXu//71 + 7f/+9Oz//fPr//7z6v/+8+r//vLo//3y5//+8eb//fDl//3v5P/97uP//e/h//3u4P/97eD//O3f//zs + 3v/9693//erc//zq2//86tn//enY//3o1//86Nf//efV//zn1f/85tP//OXS//zl0f/85ND/++TP//+i + o/+oe3f/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqn + hv/w8PD//vbw//727//99u3//vTt//306//+8+v//vPp//3y6f/+8uj//fHn//3w5f/97+T//e/k//7v + 4v/97uH//e3g//3t3//97N7//evd//zr3P/969v//era//zp2P/86Nj//OjX//zn1v/95tX//efU//zm + 0//85dH//OXQ//+goP+pfXj/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAN2qiP/x8fH//vfx//738P/+9e///fbu//717f/99Oz//vTr//3z6v/98+n//fHn//7x + 5v/98eb//fDl//3w5P/97+P//e7i//3u4f/97eD//e3f//3r3f/969z//erc//zq2v/96dn//OnY//zo + 1//86Nb//OfU//zm1P/85dP//OXS//+gn/+qf3n/MxoNrzMaDVAzGg0UAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCtiv/z8/P//vjz//738v/+9/D//vbw//327v/+9e3//fTt//30 + 6//+8+r//fLp//7y6f/+8ef//vDm//3w5f/98OT//e/j//3u4v/97uH//e3g//3s3//97N7//Ozd//3r + 3P/96tr//OnZ//zp2P/96dj//OfW//zn1f/85tX//ObU//+enf+rgHv/MxoNrzMaDVAzGg0UAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOOwi//09PT///j0//748//++PL//vfx//73 + 8P/+9u///vXu//707P/+9Ov//vPr//3y6v/+8un//fLo//3x5v/98OX//fDk//3v4//97+L//e7h//zu + 4P/97d///Oze//3r3f/869z//erb//3q2v/86dn//ejX//zo1//86Nb//OfV//+cnf+sgn3/NBsNrTQa + DU8zGg0UAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOWyjP/19fX//vn2///4 + 9P/++PP//vfy//748f/+9/D//vXv//727v/99e3//vTs//706//98ur//vLp//3y5//98ef//vHm//7v + 5f/97+P//e/i//3v4v/87uD//ezf//3s3//97N3//Ovc//+8vf//uLf//7Oz//+urv//qan//6Sk//+g + n/+ug37/Nx4RozgcEUk5HA4SAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOe0 + jv/29vb//vr3//769v/++fT//vj0//748//+9/H//vfx//727//+9u///fXt//717f/+8+v//vPr//7y + 6f/+8uj//fLn//7x5v/98OX//fDk//3v4//97uL//e7h//3t3//97d//upGK/7mPiP+2jIb/tYqF/7OI + hP+yh4P/sYaB/7BwcP+bamn/OyEVhUAgFzg7JxQNAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAOq3j//4+Pj//vv4//769//++fb///n1//749P/++PL//vfy//738f/+9vD//vbu//31 + 7v/+9e3//vPr//7z6//98+r//vLp//7y6P/98eb//fDl//7v5f/97+T//e7i//3u4f/97eD/pXJs//+0 + Uv//mQD/9Y8A/+uFAP/gegD/1nAA/79mGf9+UU7XQSUZUkQiGh5VKysGAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAO26kP/5+fn//vz6///7+P//+/f//vr2//759v/++fT//vjz//73 + 8v/+9/H//vbw//727//+9e7//vXt//716//+8+v//vLq//3y6f/98ej//fHn//3x5v/98OX//e/k//3v + 4//97uH/qHVu///Mmf//tFL//7BE//+rNv//qC3/2Yw5/4BTUNhAIxpXRyMcJE0zGgqAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC9kf/6+vr///37///8+v///Pn///v4//76 + 9v/++vb//vn1//758//++PP//vfx//738f/99vD//vXv//717v/+9Oz//fTr//3z6v/98+n//fHo//3x + 5//98eb//fHl//3w5P/97+P/q3hv///Wo///t1v//7RS//+wRP/bk0n/g1ZS2EMmGldFKRwlRi4XC4AA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPAkv/7+/v///38///9 + /P///Pv//vz5//77+P/++/f///r2//759f//+fT//vjy//748v/+9/D//vbv//727//+9e3//fXs//70 + 7P/98+r//vLp//3y6f/98ef//vDm//3w5f/98OX/rntw///grf//u2f//7db/92bW/+HWlTYQyYaV0Up + HCVGLhcLgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPXC + k//9/f3///7+//7+/P///fz//vz7//78+f/++/j//vv3///69v/++fX//vj0//749P/++PL//vfx//72 + 8P/+9u///vXu//307f/99Oz//vTr//7z6v/+8un//fHo//7x5//98Ob/sH1x///ruP//wHT/3qFq/4pd + VthDJhpXRSkcJUYuFwuAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAPfElf/+/v7//////////v///v3//v78//79+////Pr///v4///79///+vf///r2///5 + 9f//+PP///jy//748f/+9/D//vbw//717v/+9e3//vTs//7z7P/+8+r//vLp//7y6P/98ef/sn9z///1 + wv/gqHv/jmFX2kYpHVhMKRwlRi4XC4AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrHl/////////////7+/v/9/f3//Pz8//z8/P/7+/v/+vr6//r6 + +v/5+fn/+Pj4//f39//39/f/9vb2//X19f/19fX/9PT0//Pz8//z8vL/8vHw//Hw7//w7uz/8O3r/+/s + 6f/u6+j/toN0/+zftv+OYlbkRikbaUsyJSlVKxUMgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7Lmf/81rH/+tSw//jRrv/1z63/882r//HL + qv/uyKn/7MWo/+rDpv/owaX/5b+k/+O9ov/guqH/3ref/9u1nv/as53/17Gb/9Wumv/SrJn/0KqY/86n + lv/LpZX/yaOU/8agkv/EnpH/uIV1/7WCdJ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAADwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAH + AAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAAcAAPwA + AAAABwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAH + AAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAAcAAPwA + AAAABwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAH + AAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAAcAAPwAAAAABwAA/AAAAAAHAAD8AAAAAA8AAPwA + AAAAHwAA/AAAAAA/AAD8AAAAAH8AAPwAAAAA/wAA/AAAAAH/AAD8AAAAP/8AACgAAAAgAAAAQAAAAAEA + IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANxISDjYXDyE0GhAxNhsNOTQa + DTszGg08MxoNPDMaDTwzGg08MxoNPDMaDTwzGg08MxoNPDMaDTwzGg08MxoNPDMaDTwzGg08MxoNPDMa + DTw0Gg07MhsOODQaCjE2Fw8hNxISDlUAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2Fw8hNBoNTjMb + DXMzGw2GMxoNizMaDYwzGg2MMxoNjDMaDYwzGg2MMxoNjDMaDYwzGg2MMxoNjDMaDYwzGg2MMxoNjDMa + DYwzGg2MMxoNjDMaDYs0Gw2FMxsNczIaDU02Fw8hQCAACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAM2b + iuvSn5Pwy5qN9siXi/nGlov6xpaL+sWUivrEk4r6wpGJ+sKQifrCkIn6wpCJ+sKQifrCkIn6wpCJ+sKQ + ifrCkIn6wpCJ+sKQifrCkIn6wpCJ+sKQifnXkob4MxsNczQaEDFAFRUMAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAzbGo//3Sv//90r///dK///3Sv//90r///dK///3Sv//90r///dK///3Sv//90r///dK///3S + v//90r///dK///3Sv//90r///dK///3Sv//90r///8yZ/9WRhfo0GQ2FMRsNOTsUFA0AAAABAAAAAAAA + AAAAAAAAAAAAAAAAAADJsqj/4eLi//vgyf/738j/+97G//vdxf/63MP/+9vB//vawP/62r//+tm9//rY + vP/617n/+ta4//nVtv/51LX/+tSz//nTsv/50rD/+tGv//rRrf/90r//1ZGF+zMaDYs0Gg07NxISDgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAMy1qf/i5OP/++HL//vgyv/738j/+9/H//vexf/73cT/+tzC//rb + wP/62r7/+9q9//vYvP/62Lr/+te5//rVuP/61Lb/+tS0//rTs//60rL/+dKw//3Sv//UkYT7MxoNjDMa + DTw3EhIOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAzrer/+Pk5P/8483//OHL//zgyv/74Mn/+9/H//ve + xf/73cT/+9zD//rbwP/727//+tm+//vZvP/62Lv/+te6//rWuP/61rb/+tS1//rUtP/507L//dK//9SR + hPszGg2MMxoNPDcSEg4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAADQuKz/5ebm//vkz//8483/++LM//vh + y//84Mn/+9/H//vexv/73cX/+93D//vbwf/628D/+tq+//rZvf/62Lz/+te6//rXuP/61rf/+tW1//rT + s//90r//1JGE+zMaDYwzGg08NxISDgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAANK6rv/m5+f/++XR//zk + z//848///OLN//vhy//74Mr/++DI//vexv/73cX/+93D//rcwv/728H/+9q///vZvv/62bz/+9i7//rW + uf/61bf/+tW2//3Sv//UkYT7MxoNjDMaDTw3EhIOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA07yv/+fo + 6P/85tP//OXS//zl0P/848///OPO//zhzP/84Mr/++DJ//vfx//73sX/+93E//vcwv/728H/+9vA//ra + vv/72L3/+ti7//rXuv/617j//dK//9SRhPszGg2MMxoNPDcSEg4AAAABAAAAAAAAAAAAAAAAAAAAAAAA + AADWvrD/6Onp//zn1f/85tT//ObT//zl0f/848//++PN//zizP/74cv/++DJ//vfx//73sb/+93F//rd + xP/728L/+9vA//vZv//62b7/+tm8//rXuv/90r//1JGE+zMaDYwzGg08NxISDgAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAANjAsv/p6ur//OjX//zn1v/85tT//OXT//zl0f/85ND/++PO//zizf/84cv/++DJ//vg + yP/738f/+97G//vdxP/73ML/+tvB//vav//72b7/+ti8//3Sv//UkYT7MxoNjDMaDTw3EhIOAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAA2sKz/+rr6//96dr//enY//zo1//859X//ObU//vl0v/75ND//OPP//vj + zv/84sz//OHL//zgyf/738f/+97F//vdxf/63MP/+tzB//vbwP/72r7//dK//9SRhPszGg2MMxoNPDcS + Eg4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAADcxLT/6+zs//3r3P/86tr//OnZ//3o1//859b//ObU//zm + 0v/85dH/++TP//zizv/84sz//OHL//vgyv/74Mj/+97G//vdxf/73cP/+tzC//rbwP/90r//1JGE+zMa + DYwzGg08NxISDgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAN7Gtv/t7e3//eze//3r3P/969v//enZ//zo + 2P/859b//ObU//zl0//85dL//OTQ//vkzv/8483//OLM//vgyv/74Mj/+9/H//vexv/73cT/+9zD//3S + v//UkYT7MxoNjDMaDTw3EhIOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA38e3/+7u7//97d///Oze//3s + 3f/869v//era//zo2P/86Nb//OfV//zn0//85dP//OXR//zjz//8487//OLM//vhy//84Mr/+9/I//vf + xv/73sT//dK//9SRhPszGg2MMxoNPDcSEg4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAADiyrn/7+/v//3u + 4v/97eH//ezf//3s3f/969v//Orb//3p2f/86Nj//OfW//zm1P/85dP//OXR//zk0P/8487//OLN//vi + y//84Mr/+9/I//vex//90r//1JGE+zMaDYwzGg08NxISDgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAOTM + uf/w8fH//e/k//3v4//97eH//e3f//zs3v/97Nz//erb//zp2f/96dj//OjX//zn1P/85tT/++XR//zk + 0f/85M//++LN//zizP/74cr/++DJ//3Sv//UkYT7MxoNjDMaDTw3EhIOAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAA5s27//Hy8v/+8ef//fDl//3v4//97uL//e3g//zt3v/97N3//evb//zp2v/86dn//OjX//zn + 1f/85tT//ObT//zk0f/749D//OPO//vizf/84cv//dK//9SRhPszGg2MMxoNPDcSEg4AAAABAAAAAAAA + AAAAAAAAAAAAAAAAAADo0L3/8vPz//3y6P/98uf//fHl//7v4//97+L//O7h//3s3//97N7//evc//zq + 2v/96dn//OnY//zn1v/85tX//ObT//zl0f/85ND//OPO//vizf/90r//1JGE+zMaDYwzGg08NxISDgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAOrRvv/z9PT//vPq//3z6f/+8ef//fHm//3v5P/97uP//e7i//3t + 3//97N7//Ovd//3r2//96tn//OjY//zo1v/859X//ObU//zl0v/85NH//OTP//3Sv//UkYT7MxoNjDMa + DTw3EhIOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA7NTA//X19f/99ez//fPr//3y6f/98uf//vHm//3w + 5f/97+P//e7i//3t4f/97N///evd//zq2//86tr//OjZ//3p1//959b//ObU//zl0v/75NH//dK//9SR + hPszGg2MMxoNPDcSEg4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAADu1sL/9vb2//727//99e3//vTr//7z + 6v/+8un//vHn//3w5v/98OT//e/j//zu4f/97N///eze//3r3P/86tv//enZ//zo2P/859b//OfU//zm + 0//90r//1JGE+zMaDYwzGg08NxISDgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAPDYw//39/f//vbw//71 + 7//99e7//vTs//306v/98+n//fHo//3w5v/97+T//e/j//3u4f/97d///eze//zs3f/96tv//enZ//zo + 2P/859f//OfV//3Sv//VkYX7MxoNizQaDTs3EhIOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA8tnF//j4 + +P/++PL//vfx//728P/+9e7//vTt//706//+8+n//fLo//7x5v/98OX//e/j//3u4v/97eD//O3f//zs + 3v/969z//era//zp2f/86Nf//dK//9WNgfs3HhGHNh8SOTckEg4AAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAD03Mf/+fn5///59f/++PP//vjx//738P/+9e7//vXt//307P/+8+r//vLp//3x5//+8Ob//e/k//3v + 4v/97uH//e3g//3r3v/3s7P/96ys//ahov/4mpr/1pCC+z4jF3xBKBkzQCsVDAAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAPbdx//6+/v//vv3///69f/++PT//vjy//738f/+9u///vXu//707P/+8+r//fPp//7x + 6P/+8eb//e/l//3v4//97uH/5baR/+6hR//nlTj/3os2/9WCNf+1gGHqSS8iYkg0Jyc5ORwJAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAA+ODK//z8+///+/n//vv3///69v/++fT///jz//738v/+9/D//vXu//71 + 7f/99Ov//vPq//7y6P/98ef//fDl//3v5P/rwJ7//71g//+pMf/8oiL/x4ZG7V9DM39RNys8WUAzFEBA + QAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD64sr//fz9///9+////Pn///v4//769//++fX//vnz//74 + 8v/+9vH//vbv//717f/+9Oz//fPq//3y6f/+8ef//fDl/+vHqP//zoX//rVU/82VXe5fQzSDVDgsQFg7 + MRpJSSQHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzkzP/+/v7///79///9/P///Pr///z4///6 + 9//++vb//vn0//748///9/H//vbv//317f/99O3//fPq//3z6f/+8ef/7dCv///Ylv/Ik2rwXkEzhlE6 + K0JVQi8bYEBACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/ufS///////9/f3/+/v7//n5 + +f/3+Pf/9fb2//T09P/y8vL/7/Dw/+7u7v/s7Oz/6uvq/+jp6f/l5+f/5OXk/+Lj4//u0bD/yqqG9lw/ + MKJROCxSWkIxH2BAQAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+1Kr5/dq5+frX + tvn51rT59tSz+fTRsvnxz7D578yv+e3Lrfnsyaz56caq+ebDqfnkwaf548Cm+eG+pPneu6P527mi+d+v + j8bap4YUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/AAAAHwAAAB8AAAAfAA + AAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAA + AAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAA/AAAAPwAAAH8AAAD/AAAf8oAAAAEAAAACAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzHA43MxoNeDIbDaIzGg2uMxoNrzMa + Da8zGg2vMxoNrzMaDa8zGg2vMxoNrjIbDaIzGg14MxwONwAAAAAAAAAArntu/9mtnf/WqJr/06aY/9Kk + l//MoZn/yZ6X/8aclv/EmZX/wZaT/7aRi/+4jov/MxsNoTQYDkoAAAAAAAAAALWCcv/84cv/++DI//ve + xP/73ML/+tq+//rYu//717j/+tS0//nSsf/60K7/7r2l/zMaDa40Gg1PAAAAAAAAAAC7iHX//OTP//zi + zP/74Mn/+97G//vcw//72r//+9m8//rWuP/61bX/+tOx/++/qP8zGg2vMxoNUAAAAAAAAAAAwo95//zn + 1P/85NH//OPO//zhyv/738f/+9zE//vbwP/62rz/+9e5//vVtv/wwav/MxoNrzMaDVAAAAAAAAAAAMiV + fP/86Nj//ObV//zl0v/8487/++HL//vgyP/73sT/+tzB//vZvv/62Lv/8MOv/zMaDa8zGg1QAAAAAAAA + AADPnID//Ovd//3q2v/859b//ObT//zkz//84sz/++DJ//vexv/73ML/+tu///HFsf8zGg2vMxoNUAAA + AAAAAAAA1aKD//3u4P/97N3//Orb//zo1//85tP//OTR//vizf/74cr/+9/G//vdw//yyLX/MxoNrzMa + DVAAAAAAAAAAANyph//+8OX//e7h//3s3//969v//enY//zm1f/85dH/++PO//zhyv/738f/8sm3/zMa + Da8zGg1QAAAAAAAAAADcqYf//fPq//3x5v/97+P//e3f//zr3P/96dn//efW//zl0//85M///OHL//PM + uv8zGg2vMxoNUAAAAAAAAAAA3KmH//317f/+8+r//fLn//3v5P/97eH//eze//zq2v/86Nf//ObT//zk + 0P/zzb3/NRsPqjUaDU0AAAAAAAAAANyph//++PL//vXu//307P/98uj//fDl//3u4v/97N7//era//zo + 2P/85tT/9Mm6/zogEZk9IhNDAAAAAAAAAADcqYf///r3//748//+9vD//vTs//7y6f/98eb//e/i///V + zP//1cz/9bOq/6l4bOBCKBh0SCccLgAAAAAAAAAA3KmH///9+///+/f//vn0//738f/+9e3//fPr//3x + 5//3pkP/96ZD/+CSQP5HKxqRTi4gSFk3IRcAAAAAAAAAANyph/////////77///7+P/++vX//vjx//72 + 7v/98+z/3KmH/+qzdv5oSDLCTzMkZFM3IiVVORwJAAAAAAAAAADcqYf/3KmH/9yph//cqYf/3KmH/9yp + h//eq4j/1qOE/9yph//ZqYktAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAK7/wADn/8AA + 0f/AAM//wADP/8AAzf/AAMv/wADK/8AAyP/AAMb/wADF/8APw/8= + + + + + AAABABMAMDAQAAEABABoBgAANgEAACAgEAABAAQA6AIAAJ4HAAAYGBAAAQAEAOgBAACGCgAAEBAQAAEA + BAAoAQAAbgwAADAwAAABAAgAqA4AAJYNAAAgIAAAAQAIAKgIAAA+HAAAGBgAAAEACADIBgAA5iQAABAQ + AAABAAgAaAUAAK4rAAAwMAAAAQAgAKglAAAWMQAAICAAAAEAIACoEAAAvlYAABgYAAABACAAiAkAAGZn + AAAQEAAAAQAgAGgEAADucAAAAAAAAAEAIACYvwAAVnUAABQUAAABACAAuAYAAO40AQAoKAAAAQAgAGga + AACmOwEAPDwAAAEAIABIOgAADlYBAEBAAAABACAAKEIAAFaQAQBISAAAAQAgAIhUAAB+0gEAYGAAAAEA + IAColAAABicCACgAAAAwAAAAYAAAAAEABAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA + AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIgAAAAAAAAAAAAAAAAAAAAAAAAAAIh4 + iIiAAAAAAAAAAAAAAAAAAAAAAHeIiIiP/4iAAAAAAAAAAAAAAAAAAAB3dniP////+IiAAAAAAAAAAAAA + AAAHd2YiImaP//////iAAAAAAAAAAAAAB3ZmIiIiImJ///////gAAAAAAAAAAAB2YiIiIiIiZniP//iI + gAAAAAAAAAAAh3hiIiIiZmZmdmeIiIgAAAAAAAAAAAd4iP9iJmZmeIjuamJwAAAAAAAAAAAAAHiP//92 + Z4iI5qqmZiIngAAAAAAAAAAACP////+G7mqqZqpmIiIoiIAAAAAAAAAAD/////+IboAAAAhmZmIo/4iA + AAAAAAAAD//4iIAAAAAAAAAAh2aP//+IAAAAAAAAAP//8AAAAAAAAAAAAIj///+IgAAAAAAAAAAAAAAA + AAABEREAAAD/////iAAAAAAAAAAAAAAAAAARmZERAAAA////gAAAAAAAAAAAAAAAAAEZmZmZEQAAD/// + 8AAAAAAAAAAAAAAAAAGZmZmZmREAAA8AAAAAAAAAAAAAAAAAAAEZmZmZmZERAAAAAAAAAAAAAAAAAAAA + AAAZmZmZmZmREQAAAAAAAAAAAAAAAAAAAAAZmZmZmZmZEREAAAAAAAAAAAAAAAAAAAARmZmZmZmRGZEQ + AAAAAAAAAAAAAAAAAAABmZmZmZkRmZkREAAAAAAAAAAAAAAAAAABGZmZmZEZmZkREQAAAAAAAAAAAAAA + AAAAGZmZmZGZmZEZkREAAAAAAAAAAAAAAAAAEZmZmZmZmRGZmREQAAAAAAAAAAAAAAAAAZmZmZmZkRmZ + mREREAAAAAAAAAAAAAAAARmZmZmZEZmZkRmREQAAAAAAAAAAAAAAABmZmZmZmZmZEZmZkRAAAAAAAAAA + AAAAABGZmZmZmZmRGZmZmREAAAAAAAAAAAAAAAEZmZmZmZkRmZmZmZEQAAAAAAAAAAAAAAAZmZmZmZmZ + mZmZmZkQAAAAAAAAAAAAAAARmZmZmZmZmZmZmZkQAAAAAAAAAAAAAAABmZmZmZmZmZmZmZkQAAAAAAAA + AAAAAAABGZu7uZmZmZmZmZkQAAAAAAAAAAAAAAAAEZu7u5mZmZmZmZkQAAAAAAAAAAAAAAAAAZu7u7uZ + mZmZmZkQAAAAAAAAAAAAAAAAARm7u7uZmZmZmZEQAAAAAAAAAAAAAAAAABG7u7u5mZmZmREAAAAAAAAA + AAAAAAAAAAGbu7u7mZmZkRMAAAAAAAAAAAAAAAAAAAEZu7u7mZmZETIgAAAAAAAAAAAAAAAAAAARm7u5 + mZmREyIAAAAAAAAAAAAAAAAAAAABGZmZmZkRMiAAAAAAAAAAAAAAAAAAAAAAEZmZmZETIgAAAAAAAAAA + AAAAAAAAAAAAARGZkREyIAAAAAAAAAAAAAAAAAAAAAAAAAEREQACAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////AAD/////8P8AAP////8AfwAA////wAB/AAD///wAAH8AAP//gAAAfwAA//gAAAD/ + AAD/wAAAB/8AAPwAAAA//wAA4AAAB///AADAAAAB//8AAIAAAAB//wAAgAH4AB//AACAf/8AD/8AAMH/ + /8AH/wAA//+D8AP/AAD//wD8B/8AAP/+AD4H/wAA//4AD7//AAD//gAD//8AAP//AAD//wAA//8AAD// + AAD//wAAH/8AAP//gAAH/wAA//+AAAP/AAD//8AAAP8AAP//wAAAfwAA///gAAAfAAD//+AAAA8AAP// + 8AAABwAA///wAAADAAD///gAAAEAAP///AAAAQAA///8AAABAAD///4AAAEAAP///gAAAQAA////AAAB + AAD///+AAAEAAP///4AAAQAA////wAADAAD////gAAMAAP///+AAAQAA////8AADAAD////4AAcAAP// + //wADwAA/////gAfAAD/////g78AAP///////wAAKAAAACAAAABAAAAAAQAEAAAAAACAAgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8A + AAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIAAAAAAAAAAAAAAd3iIj/iA + AAAAAAAAAAB3ZiZ/////gAAAAAAAAHdiIiImaP//iPAAAAAAiHIiIiZmZoiIiAAAAAAIeI+CZmfu7mYo + AAAAAAAACP//9u7mamZiJ4gAAAAAAA//+PiHAACHZij4iAAAAAAP+I8AAAAAAIiP//iAAAAAAPAAAAAR + EQAAD///gAAAAAAAAAABGZERAAAP//AAAAAAAAAAAZmZkREAAAAAAAAAAAAAAAGZmZmZEQAAAAAAAAAA + AAABGZmZmREQAAAAAAAAAAAAABmZmZEZERAAAAAAAAAAAAARmZmRmZEREAAAAAAAAAAAAZmZmZkRmREA + AAAAAAAAAAEZmZmRGZEREAAAAAAAAAAAGZmZmZkRmREAAAAAAAAAABGZmZmRGZmREAAAAAAAAAABmZmZ + mZmZmREAAAAAAAAAARmZmZmZmZmRAAAAAAAAAAARm7mZmZmZkQAAAAAAAAAAAZu7mZmZmZEAAAAAAAAA + AAEbu7mZmZmRAAAAAAAAAAAAEbu7mZmZEQAAAAAAAAAAAAGbu7mZkTIAAAAAAAAAAAABGbuZmRMgAAAA + AAAAAAAAABGZmZEyAAAAAAAAAAAAAAABERERIAAAAAAAAAAAAAAAAAAAAAAAAP////////gf//8AH//w + AB//AAAf8AAA/4AAD/+AAAP/gDwA/4P/AH/fw+B//4D4f/+AP///gA///4AH///AAf//wAB//+AAP//g + AB//8AAP//AAB//4AAP/+AAD//wAA//+AAP//gAD//8AA///gAP//4AH///AD///4B//////KAAAABgA + AAAwAAAAAQAEAAAAAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA + AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAACIAAAAAAAAAACIiIiI + 8AAAAAAAB3dnj//48AAAAAd2IiJnj/iPAAAIiIYmZmZmjwAAAAD4//du5qZieAAAAAD/+P+IAAhmj4gA + AAAP8AAAEAAP//+AAAAAAAABkRAAD//wAAAAAAAZmZEQAAAAAAAAAAABmZmREAAAAAAAAAABmZmRkRAA + AAAAAAAAGZkZmREAAAAAAAAAGZmZkZkRAAAAAAAAAZmZGZkZEAAAAAAAAZmZmZGZkQAAAAAAABmZmRmZ + mRAAAAAAABmZmZmZmRAAAAAAAAGbuZmZmRAAAAAAAAAbu5mZkQAAAAAAAAAZu7mZEiAAAAAAAAABm5mR + JgAAAAAAAAAAGZkSIAAAAAAAAAAAARECAAD//88A//AHAP+ABwD4AA8AgAD/AAAA/wAA4D8An3gfAP4e + HwD8B/8A/gH/AP4AfwD/AD8A/wAPAP+ABwD/gAMA/8ABAP/AAQD/4AEA//ADAP/wAQD/+AMA//wHAP/+ + LwAoAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AIiIZ2dnaIiA//+ubq6v + //CIiGamdmiIgAAAAG5gAAAAAAERGnAAAAAAAZmREAAAAAABmZmREAAAAAGZmZGRAAAAABmZGZkQAAAA + GZmZkZEAAAABmZkZkQAAAAGbmZmRAAAAABm5mRIAAAAAAZmRIiAAAAAAERIiAAAAAAAAACAAAAEAAAAB + AAAAAQAA/H8AAOB/AADgfwAA4B8AAOAPAADwBwAA8AMAAPgDAAD4AwAA/AMAAP4BAAD/AwAA//cAACgA + AAAwAAAAYAAAAAEACAAAAAAAgAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP8A/wAAM/8AAQCfAAMB + mgADApwABgCbAAYAmAAJAJoACwCcAA4AmQAQAJ0AFgCeABgAlgAcAKAAKQClAPLx8gDy7vAA8vHwAObl + 5ADl4dkA7OrmAOro5ADIx8UA4t7UAPDt5gDY1c0A09DIALOunwC4tKgA5eLZAO7r4gDm5N4Aubi1AO7t + 6gDq6eYA6OfkAJ2ajwDc2c4A7ergAOfk2gDm49kAzcvEAKuljgDTz8AA2tbHAOTi2gCwr6sA8fDsAM/L + uQDl4tUA6ObcAKmoowDn5uEA4+LdAK2spgDt7OYAwcCwAKKimQDd3dYA6enmAOTk4QDDw8AA5ubkAPLy + 8QDr6+oA39/eANTU0wDMzMsA2vLEAMLQtgCO/zUAlv5FALTSmwCHmHkAy9XDAEu0AABs/wEAKmQBAFK8 + BQA0eQMAWsoIAHP+CwBCkwcAPoYKAHj7GABy7xcAbOIWAGTSFACA/SAAVKkXADRnDwA3aRMAcdIpAHvk + LgCD3EAAieZFAEZ1IwBYkC8Ab7I/AKP/XACb81gAl+9WAFB9LgCo/GgAWog4AJ3mZgB2rk0Asvx8AGqO + UAB7kmoAPZgAADeIAAAucAAAJmAAAEWnAgAgTAEALmwDAChcBAAlUQYAPHIWAC5XEgB/yU0AnLONACNZ + AQBfdFYAEJcNAApeCgAMXwwAEFoQAOjp6ADm5+YAH6ElABRvXAAffWkAM5KIACaAeQAJTkwA5ebmAOTl + 5QA1nv8ANp//ADeg/wA4ov8AM5r/ADOZ/wA0nP8ANJv/ADKV/wAvkP8AKIP/ACZ+/wAgcv8AGmf/ABVd + /wAIQv8AC0n/AAA2/wAEO/8AB0D/AAAw/wAANf8AADL+AAAy/QAAMfwAADL7AAAx+gAAMPkAAC/4AAAv + 9wAALvUAAjX/AAQ2/wAALv8AAC3/AAAt9AAALfMAACvwAAAs8AAALO8AACvuAAAp7AAAKuwAACnqAAAn + 6QAAKOkAACjnAAAn5gAAJuUAACXmAAAl5AAAJeMAACThAAAj4AAAI98AACHcAAAi3AAAIdsAACDZAAAg + 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 + AAD//wAAH/8AAP//gAAH/wAA//+AAAP/AAD//8AAAP8AAP//wAAAfwAA///gAAAfAAD//+AAAA8AAP// + 8AAABwAA///wAAADAAD///gAAAEAAP///AAAAQAA///8AAABAAD///4AAAEAAP///gAAAQAA////AAAB + AAD///+AAAEAAP///4AAAQAA////wAADAAD////gAAMAAP///+AAAQAA////8AADAAD////4AAcAAP// + //wADwAA/////gAfAAD/////g78AAP///////wAAKAAAACAAAABAAAAAAQAIAAAAAACABAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A/wD/AAAz/wAJB6oADQKiAAsDoAAUCKsAMSpqABcEpQAeAbMAHwOuAB8B + oQApA6oAKgGmACkCpwArAqUAMwKnADsAqAA9Im4ARQCyAEQArgBNALYAUACuAE4AqQDy8fAA5eHZAOzq + 5gDq6OQAsK+tAMjHxQDi3tQA5uTfANPQyACzrp8AuLSoANnWzQDu6+IA1tTOALm4tQDu7eoA6unmAJ2a + jwDNy8QA08/AAPHw7ADo5twAqaijAOfm4QDj4t0AraymAO3s5gDEw68AwL+wAKKimQDd3dYA6enmAOTk + 4QDDw8AA8vLxAOvr6gDf394A1NTTAMzMywDa8sQAwtC2AI7/NQCW/kUAh5h5AEu0AAAqZAEAUrwFADR5 + AwBayggAQpMHAHj7GABy7xcAZNIUAID9IABUqRcANGcPADdpEwBx0ikAe+QuAInmRQBGdSMAWJAvAG+y + PwCb81gAUH0uAFqIOACy/HwAao5QALzinwB7kmoAPZgAADeIAAAucAAARacCACBMAQAubAMAPHIWAC5X + EgCcs40AX3RWAAuHCAAKdAcAEoIQABCJDwDo6egA5ufmAB1yYwAPXVUA5ebmACNxdgA2n/8AN6L/ADeg + /wAzmv8AM5n/ADSb/wA1nf8AMJX/ACmE/wAqh/8AInf/AB1v/wAZaP8AG2v/ABdh/wAZY/8AElb/ABVb + /QAQU/8ACEX/AAhD/wAAN/8ABT3/AAAx/wAANP8AADH9AAAy/QAAMfsAADD5AAAv+AAAL/cAAC71AAEz + /wACNP8ABDTzAAAu/wAALfgAAC30AAAt8wAAK/AAACzwAAAr7gAAKu0AACnsAAAp6wAAKOkAACfoAAAn + 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 + ywDh4NoA3t3VAMnJvwD4+PQA9PTxAPHx7gDt7eoA/Pz6APT08gDz8/EA8PDuAP///gD8/PsA9PTzAODg + 3wCsr6MA3+LYAMDBvgC+wLsA09vJAPT77ADv+OUAj5aJAJH/NwBofFgANHQFAGXhCwBJoggASKAIAEGR + BwBHnQkAff8aAHv4HwBbtxgAefEiADlwEQBrziIAeN0sAIXvNwBMiB8Aivc5AHnVNQCK7z4Ah9tHAEt8 + KABrrDsAR28qAG+bTQBljkcAvPePAF54SwDC5agAa35dAM3cwgA5jAAAMn8AADF4AABYeEIAxde5AIqU + gwAiWgAAQVo+AERgQgAJUlEAFmBjABRXYQA5pv8ANJ7/ADaf/wA3oP8AN6H/ADGY/wA0mv8ANZz/ACqK + /wAphP8AHW7/AB9x/wAca/8AHm3/ABdh/wARVf8AEFH8ABFN9QAANv8ABTz/AAAw/wAAMf8AADL/AAAz + /wAANP8AADX/AAAy/gAAM/4AADL9AAAw/AAAMfwAADD7AAAx+gAAMPkAAC/3AAAv9gAALvQAAC//AAAu + /gAALvwAAC76AAAu9wAAKvYAAC72AAAt9AAALfIAACvwAAAs8AAAK+8AACruAAAq7QAAKuwAACjqAAAo + 6QAAJ+gAACbnAAYs3wAAJ+4AACboAAAl5QAAJeQAACPiAAAl4gAAI+EAACThAAAi3wAAIt4AACHdAAAi + 3QAAIdwAACHaAAAf2QAAH9gAAB/XAAAf1gAAHtUAAB3WAAAd1AAAHdMAABvRAAAazwAAG88AABjLAAAY + ygAAGMkAABfKAAAWyAAAF8gAABPHAAAUxAAAFcQAAhveAAARuwAAELoAAA63AAAPtgAADrUAAA20AAAN + sgACFtgABRPKAAAJsAAACrAAAAmuAAAKrQAFDrYABQmtAPr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAlAAAAAAAAAAAAAAAAAAAAAExNHC8sMjM8RQAAAAAA + AAAAAAAAAHZvdGdqS0RDSEA7NQAAAAAAAAAAUW1pXlRzclhrTiEiODk3AAAAAAAmLSc9YnFXXF9gYV1o + SkkAAAAAAAAAADEoNEYbZltSY2VaVVZ3UxoAAAAAAAAAACQqMCseUG5wAAAAbGRZdR06IwAAAAAAAAAf + 6AAAAAAADxgAAABPPkfoNi4AAAAAAAAAAAAAAADRvc7mDQAAAEI/QSkAAAAAAAAAAAAAABezr7nBzd8T + AAAAAAAAAAAAAAAAAAAAAADJnrC4v8XS5xYAAAAAAAAAAAAAAAAAAAAJk6its8He0dYFAAAAAAAAAAAA + AAAAAAAAt5Wfqc7UvNna2xAAAAAAAAAAAAAAAAAAB5aXnqqs19zG1OQEAAAAAAAAAAAAAAAAALuPmJ2h + x7LD5dfT4gAAAAAAAAAAAAAAAAuYlZSbnK/dy8DM0OMAAAAAAAAAAAAAAADIj5Kio6myrbnCys8RAAAA + AAAAAAAAAAAUp4uGjKKaoa60vsQKAAAAAAAAAAAAAAAAA4d9f4iSmqCrsboOAAAAAAAAAAAAAAAAALWC + hIGKkZmepdUAAAAAAAAAAAAAAAAAABKOfoCDkJKU4HoAAAAAAAAAAAAAAAAAAAAIjYWJlJbYe3gAAAAA + AAAAAAAAAAAAAAAABrakpuF8eQAAAAAAAAAAAAAAAAAAAAAAABkMFQAAAAAAAP//zwD/8AcA/4AHAPgA + DwCAAP8AAAD/AADgPwCfOB8A/g4fAPwD/wD+AP8A/gB/AP8AHwD/AA8A/4AHAP+AAwD/wAEA/8ABAP/g + AQD/8AMA//ADAP/4AwD//AcA//4/ACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA + AAD/AP8Avbq1ANTRzADo5d4AgNkAAHLAAAB0mT8AAGYAADOZ/wAAM/8AAACZAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAQEBAQYGBgYGBgYBAQEBCwMDAwMEBAQEBAQEAwMDAwsCAgICBQUFBAYFBQICAgILCwsLCwsL + BQQGCwsLCwsLCwsLCwoKCgoEBgsLCwsLCwsLCwsKCQkJCgoLCwsLCwsLCwsLCgkJCQkJCgoLCwsLCwsL + CwoJCQkJCQoJCgsLCwsLCwsLCgkJCQoJCQkKCwsLCwsLCwoJCQkJCQkKCQoLCwsLCwsLCgkJCQkKCQkK + CwsLCwsLCwoJCAkJCQkJCgsLCwsLCwsLCgkICQkJCgcLCwsLCwsLCwsKCQkJCgcHBwsLCwsLCwsLCwoK + CgcHBwsLCwsLCwsLCwsLCwsLBwsLCwABAAAAAQAAAAEAAPx/AADgfwAA4H8AAOAfAADgDwAA8AcAAPAD + AAD4AwAA+AMAAPwDAAD+AQAA/wMAAP/3AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAoIBwcfJSQfQzo3LGN4dGWKgoBxegYG + BQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAEAAAAEAAABEwoJCCc2NC9MYFxQe3hzYZmmoY21vrigyMa/ + p8bKxK25493JsnZzaUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABQICAhMZGRkyMDIuUkJPOX5UdDy4OkUubzk1M1R4dWqHmJODqrOtm7nSzbrD2dO/vd3Y + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACFHwAAjGUAAIuIAACBfwAAdlUAADMUAAAABABFADMAPwATAAAABAAAAAEAAAAAAAAAAAAA + AAAAAAAA/////38AAAD////gPwAAAP//8AA/AAAA//4AAB8AAAD/4AAAHwAAAP8AAAA/AAAA+AAAAf8A + AADAAAAf/wAAAIAAAH//AAAAAAAAD/8AAACAAAAD/wAAAIHwAAH/AAAA/+AAAP8AAAD/wAAA/wAAAP/A + ACH/AAAA/8AAD/8AAAD/wAAD/wAAAP/AAAH/AAAA/+AAAH8AAAD/4AAAPwAAAP/wAAAfAAAA//AAAAcA + AAD/+AAAAwAAAP/4AAABAAAA//wAAAAAAAD//AAAAAAAAP/+AAAAAAAA//8AAAAAAAD//wAAAAAAAP// + gAAAAAAA//+AAAAAAAD//8AAAAAAAP//4AAAAAAA///gAAAAAAD///AAAAAAAP//+AABAAAA///8AAMA + AAD///4ABwAAAP///wAPAAAA////gT8AAAAoAAAAPAAAAHgAAAABACAAAAAAACA6AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAAAFAAAADxAQDiMrKSM/WVhMZENCOUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgDAwQXGRkXMTg1 + L1JbV0t4fXhmnJqTfLitpY3Ix8Goz9bQur9GRUEnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAIAAAAEAAAABgAAAAoBAAIUBAMFGQAAAAwAAAAJAAAAEAgICCAiIR86SEY/Xm9rX4SSjXunraeRwMC5 + oczKw6zLz8q0wdbRvbLMxrSivbimkODczJCgnIxpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAUAAAAIAAAAEAIB + Ah8cHRw7Q0ZAYlZjTI9dekjAXoc/1UtVPXxWUU1qgn5ylKSgkLG+uabEzsi1y9bRvcbZ1cK43NjIpN3a + zZDc2s992NfObdPSzGDEw75Xr7CrUcXGxE6wq5h3GxoVCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABgAAAAoAAAASCQgJJR8iG0Q8RjRtYXFVnYSY + c8qNqXjufJ9g/1eENf9ll0D/f7dX/7XJmeTa1Ma43NjJr+Hd0KDi3tOR4d/Ugt/d1XHb2tRi1NXSVc3O + zU3GyMdKwcPBS76/vE69vblSvb23VsHBu1e8uKZ6KighGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAgAAAAQAAAAGAAAACwAAARYMDAsrIykeTT1LMnlUbUGpZIZJ1GuTTPRnk0b/WIU2/0Bw + Hf8qWwf/IVUA/ypgA/9pmUX/YJI7/26bTv/T2sme5eTgU93e2lPX2NZO0tPTSc3Oz0fJzM1Hx8rLSMjK + ykrLzcpPz8/IV9LRyGHX1cts29jNdsfCtHzCvKiMKScgGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + AAYAAAAMAgADGhATDjMmLx5XP1ExhFZyQLRjiEbdZJBC+lqKNv9Keyb/O2wW/y1fCv8lVwH/IlYA/yNZ + AP8lXQD/KmcA/zR3BP9Pfyv/R3Uk/0JyHf9ghUbpztPQT9HV1ULR1NRF1NbYR9jZ2Urc3dxP4ODeVuTj + 3mDm5N1t5uPagOXi2JXp5tqm5eDSsb64m7rBvqOQAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAADhgc + FUFBVTGPT3A0vluEPOVdijr/VIMw/0d3Iv85aRX/LmAK/yhbA/8lWwD/Jl8A/ylkAP8sawD/L3EA/zJ3 + AP80fQD/N4MA/z+ZAP9LfyT/RXMj/0h2J/9TfTb6ytDCfuHg2m/i4Nh+4+HYjOXi2Jnm49ij6eXZruzo + 2rfs6Nm96OTTut7ZyazAvKyRnpqNcG5sX0w0MysaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAIAAAADQAAABcFBAQoIyUgT0tv + LuFLeyj/P24c/zVlEv8tXwn/KF0D/ydfAP8pZAD/LGsA/y9zAP8zegD/N4IA/zqJAP88kAD/PpYA/0Cd + AP9BowD/QqYA/1jBC/9VmSP/l6+G/8fWvf/Q3Mj64t/Sv+bh1MDo5NbH6+fYyOnk1cLd2cmzx8O1maaj + lnZ+e3FQVlRMLDAvKxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAQAAAAHAsLCjAjIh1NSEU6b3NuYJOhmYqtjJlz0iZe + BP8oXwL/KWMA/ytqAP8vcgD/M3sA/zeDAP87jAD/PpQA/0GdAP9DpQD/Ra4A/0m2AP9PvgD/W8cL/2nP + Hv962DX/hd9E/3zfM/9lzRn/i6p0/7bLp/+7xabc3NfHsMvHuJqvrJ96g4B3VFVUTjErKicXAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAEFBMSKigmIFVHQzh7bWhXnZSPebi0rZfHysWuytbRvsDn39ahj6lzvCZu + AP82gQD/OosA/z6VAP9CnwD/RKkA/0ezAP9MvgD/VMYA/2DPDv9x2ST/huRB/5ntWv+p83H/r/h3/6r8 + bP+f/lj/kP89/3H4Dv9m9QD/TasI/yhaBv8/YyHaNzcyKAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAB0dGgtpZFCBcWpRupqTeMm5sprHzsizutfSwana18iY3tvQh+Pi2nHy7fFTqs2RnDiW + AP9KswD/Tb4A/1XJAP9h1Qz/dOAk/4nqQf+e817/rvh1/7T8fP+x/3X/p/9j/5b/Rv+G/yr/eP8S/3H/ + Bf9x/wT/c/8L/3P1Ff9n0xj/XK4g/zVpD/84Yxj3IiwcUwAAAAMAAAAEAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAMCfboACK7/AC30/wAt8/8AK+//ACrs/wAo6f8AJ+f/ACXj/wAk4P8AIt3/ACDZ/wAe + 1v8AHNL/ABzR/wAZy/8AD7f/AASl/wAAnv8AAHjwAAAr0AAAAL0AAAC9AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAwAAAAMAAAAC+AAAAuQAAAK8AAACfAAAAhQAAAGIAAAA6AAAAFwAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAEBWnYAAaL/ACbl/wAw+f8ALfP/ACvw/wAq7f8AKer/ACfn/wAm5P8AJOH/ACLe/wAh + 2v8AH9f/AB3T/wAb0P8AGs7/ABbH/wANsv8AAqT/AACb/wAAaeoAABzJAAAAuwAAAL4AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC8AAAAswAAAKAAAAB7AAAARQAA + ABYAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAUFLCcAAJj5ABbG/wAz/v8ALvb/AC30/wAs8f8AKu7/ACnr/wAn6P8AJuX/ACTi/wAj + 3/8AIdv/AB/Y/wAd1P8AHND/ABrO/wAazv8AFcP/AAqt/wABov8AAJT9AABU4QAAC8MAAAC7AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAADAAAAAvwAAALsAAACpAAAAegAA + ADgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHy6AAaq/wAv9/8AMfv/AC/3/wAt9P8ALPL/ACvv/wAp7P8AKOn/ACbn/wAl + 5P8AI+D/ACHc/wAg2f8AHtb/AB3U/wAVw/8AFsf/ABjL/wASvf8AB6j/AACh/wAAhvYAADjVAAAAvQAA + AL0AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC7AAAAnQAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH62AAOi/wAt8v8ANf//ADP//wAz + //8AM///ADP//wAz//8AM///ADL+/wAy/P8AMfv/AC/5/wAu9v8AL/j/ACHb/wAAjv8ACqv/ACfn/wAn + 6P8AJOP/ACPg/wAh3P8AINn/AB7V/wAc0v8AGs7/ABjK/wAWxv8AFcX/AAeo/wAAn/0AACw1AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAjUuAACb+AASvf8ANv//ADP//wAz + //8AM///ADP//wAz//8AM///ADP//wAz/v8AMv3/ADH7/wAw+f8AMPn/ACfn/wAWw/8AKev/ACvv/wAo + 6v8AJ+f/ACXk/wAj4P8AIt3/ACDa/wAe1v8AHdP/ABvP/wAZy/8AGMn/ABO//wABov8AAGeiAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJwkAAAnv8AJuT/ADb//wAz + //8AM///ADP//wAz//8AMf//ADH//wAz//8AM///ADL9/wAx/P8AMPr/ADD6/wAx+/8ALfX/ACzw/wAq + 7v8AKev/ACfn/wAm5P8AJOH/ACLe/wAh2/8AH9f/AB3U/wAb0P8AGcz/ABnL/wAIqv8AAIbmsLDDDQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0oFAAAkeQACq7/ADP8/wA0 + //8AM///ADL//wAx//8FPf//BDr//wAv//8ALv//ADP//wAz/v8AMvz/ADH7/wAv+f8ALvf/AC30/wAs + 8f8AKu//ACns/wAo6P8AJuX/ACTi/wAj3/8AIdz/AB/Y/wAe1f8AHNH/ABvR/wAOtv8AAJH+sLDdLgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMXl8AAJr/ABzQ/wA2 + //8AM///ATH//x9w//8yl///L5H//yR6//8PUf//AC///wAv//8AM/7/ADL9/wAx+/8AMPn/AC/3/wAt + 9P8ALPL/ACvv/wAq7f8AKOr/ACfn/wAl5P8AI+D/ACLd/wAg2v8AHtb/AB7V/wASvv8AAJH/sLDfQQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAIW+AAOi/wAs + 8f8AMv//Bz///zSa//81nP//NJv//zaf//81nv//JXz//whA//8ALf//ADP//wAy/f8AMfz/ADD6/wAv + +P8ALvX/AC3z/wAs8P8AKu3/ACnq/wAn6P8AJuT/ACTh/wAi3v8AIdv/ACDb/wASv/8AAJH/sLDfNgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vAACZ9wAQ + uP8AM///Bj3//zGU//80m///M5n//zOZ//8zmf//NqD//zCU//8RU///AC3//wAz//8AM/7/ADL8/wAx + +/8AL/j/AC72/wAt9P8ALPH/ACru/wAp6/8AKOj/ACbl/wAk4v8AI9//ACPg/wAOtv8AAInxsLDLGAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABogAAA + nf8AINn/ADP//yeA//82nv//M5n//zOZ//8zmf//M5n//zWc//81nf//Fl///wAt//8AMv//ADP+/wAy + /f8AMfv/ADD5/wAv9/8ALfT/ACzy/wAr7/8AKez/ACjq/wAm5/8AJeT/ACPg/wAFqP8AAHrBAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAA + jNAABaX/ACn1/xJY//82n///M5n//zOZ//8zmf//M5n//zOZ//80m///Np///xdf//8ALf//ADP//wAz + //8AMv3/ADH8/wAw+v8AL/j/AC71/wAt8/8ALPD/ACrt/wAp6v8AKez/ABnL/wAAn/8AAEZkAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + OTsAAJv7ABC6/wE0//8ogv//Np///zOZ//8zmf//M5n//zOZ//8zmf//NJv//zWd//8RU///AC3//wAz + //8AM///ADL+/wAy/P8AMfr/AC/4/wAu9v8ALfT/ACzx/wAs8f8AJ+f/AAWn/wAAkM4AAAgKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAGmFAACd/wAb1/8KSf//Mpj//zSc//8zmf//M5n//zOZ//8zmf//M5n//zWd//8wkf//BTv//wAx + //8AM///ADP//wAz//8AMv3/ADH7/wAw+f8AL/f/AC/3/wAr8P8ACrH/AACY/wAxNKAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAIAACLygADof8AJe//FFz//zaf//80mv//M5n//zOZ//8zmf//M5n//zOZ//83of//GWP//wAt + //8AM///ADP//wAz//8AM///ADL+/wAx/P8AMv3/AC71/wAKsv8AAJn/BVJF/wByAP8AOgCJAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAuLAAAmvIAC7D/AC38/xto//82oP//M5r//zOZ//8zmf//M5n//zOZ//82oP//IXT//wAt + //8AM///ADP//wAz//8AM///ADP//wA0//8AMPn/AAuz/wAAl/8TdFn/Dp0L/wBqAP8ATAC9AAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAV2MAAJz/ABXD/wAx//8baP//Np///zSc//8zmf//M5n//zOZ//83of//Fl7//wAt + //8AM///ADP//wAz//8AM///ADX//wAx+v8AC7T/AACV/xt8Zf8XqBn/AGoA/wBdAMQADAAUAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHGXAACc/wAd1P8AMf//FVv//zGW//83oP//Np///zeh//8jef//ATP//wAy + //8AM///ADP//wAz//8ANf//ADH6/wALtP8AAJX/I4Rx/x+wJP8BaQH/AF0AxAATABIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAIAACFvQABn/8AIt3/ADH//whB//8cav//JHv//xdh//8BM///ADH//wAz + //8AM///ADP//wA1//8AMvr/AAuz/wAAlf8rjH3/KLgy/wFpAf8AWgDEABIAEgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAADAwmFAAAic0AAaD/ACHZ/wAz//8ALv//AC7//wAt//8AMv//ADP//wAz + //8ANP//ADb//wAx9/8ADLT/BAWa/zOTif8wwD7/AWgB/wBaAMQUJxQSAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhsAAIrIAACf/wAWw/8AL/T/ADb//wA2//8ANv//ADb//wA2 + //8AM/3/ACPc/wAIq/8AApP/Gmdk/zbFSP8BaQH/AFsAxAASABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDCAOAQB1mgAAnf8ABKf/ABTA/wAg2P8AJOH/ACLc/wAY + yf8ACa//AACf/wAAk9AALjapAXMA/wBqAP8AXQDFBBYEEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT0AAHGiAACM4AAAlfoAAJr+AACX/AAA + juoCAYC9BgVdZgsLIAsAAAAAAEUAjwBWALUDFAMSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaFQAANz0AAE5MAAA/QwAA + HyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////D///////g/8P//////gB/w/////hAAH/D////gAAAP8P///AAAAA/w///AAAAA + D/D//AAAAAAf8P/wAAAAAB/w/4AAAAAB//D4AAAAAD//8OAAAAAH///wgAAAAAf///CAAAAAAP//8IAA + AAAAP//wgAAAAAAP//CABAAAAAP/8MD/gAAAAf/w//+AAAAB//D//4AAAAH/8P//AAAAAD/w//8AAAAA + D/D//wAAAAAB8P//AAAAAABw//8AAAAAADD//wAAAAAAEP//AAAAAAAA//+AAAAAAAD//4AAAAAAAP// + wAAAAAAA///AAAAAAAD//8AAAAAAAP//4AAAAAAA///gAAAAAAD///AAAAAAEP//8AAAAABw///4AAAA + AfD///wAAAAB8P///AAAAADw///+AAAAAHD///4AAAAAcP///wAAAAAw////AAAAADD///+AAAAAMP// + /8AAAAAw////wAAAADD////gAAAAcP////AAAABw////8AAAAHD////4AAAA8P////wAAABw/////AAA + AHD////+AAAAcP////8AAADw/////4AAAfD/////gAAD8P/////AAAfw/////+AAD/D/////+AEf8P// + ///+D//wKAAAAEAAAACAAAAAAQAgAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAQAAAAMAAAAIAwMEFRgYFSs9PDRLSEg+SAAAAAcAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAgAAAAUAAAAOCgoKICIhHjtCQDdeZWFSg4R/a6WclX29u7Wcy9XPts1yb2ZPAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABQAAAAYAAAAHAAAABgAA + AAUAAAAHAAAABgAAAAkAAAAUEBAPJzAuKkVTUUhqeHRlj5mTf7CvqZHFvrifzcbAqMvNx7HCzsi0tbmz + nafa1cSez8q3kR8eHAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAABwAAAAkAAAAOAAAAGhMS + EzAtMSpQQlA4fUplNqEvPSNqGBYXNjs5NFVkYVh5i4Z4nKulk7fAu6bIzcexzdLNuMfW0b652dXFp9vY + ypXc2cyF2dfMddHPxmivrqVdycrHUMbDtHtLSDwyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAABwAAAAoAAAAQAgEEHxQW + Ezg0OjBdYGpYi4SUebqTqYHhdppb/GmWR/9yq0f/m7l65b22qLTMx7XG1tHAw9vWx7nd2cqs39vOnN/c + 0Yvf3NN43NrUZtbV0VrOz8xRx8jGTsHDwUy+vrxOsLCtUL2+uk/EwrducWxbTAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAAACAAAAAsAAAATBwUIJBod + F0EzPStoTmI+l2aDUcV4m17pfaJg/22WT/9PfC7/NGUQ/yleA/9gkTz/e65V/36sXP3P2L/B5eLbcuPj + 2m3j4ttj3t3ZW9jY1VPS09JMzM7OScbJykjDxcZJw8XETMTFwFHGxr9XyMe/XtXTyWXJx7xpycW1fW1o + WFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAACAAAAA0AAAAWCgsKKSAl + G0k4Ri5zUGg+omKDSc5okUjxY5E//1WGMf9FdiH/NGUR/ydYBP8gUwD/IFMA/yRbAP8saQD/WIg0/1B/ + LP9FdiH/eZxg8c7Uy2jX2tlFztLRSM7Q0UfN0NJGztDSRtDS00fU1dVJ2NnXTtzc11fe3dVk4N3UdOLf + 1ILj4NSOvbikmNHLs6t8eWtIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAATDxAOLyEr + GVI6TSt+UGw6rl+DRNdkj0P2Xo07/1GBLP9Bch3/NGQQ/ytcCP8mWQL/JFkA/yVcAP8nYQD/KmcA/yxr + AP8wcgD/OIYA/0l9I/9IdiX/QnEf/y5iB/+PpIOc3uDiQNfa10/c3NpV39/bXuLi3Wfm5d5w6Obee+jm + 3Ybo5duV6OTZpunl2LXr5te86eXVucO+p6unpYeJREQ9FQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAABwAA + AA0AAAEfPlAwklyBPuBZhjb7VYQx/0p6Jv89bRr/M2MP/ytdB/8nXAL/Jl0A/ydiAP8qZwD/Lm4A/zB1 + AP8zegD/NoAA/ziGAP86iwD/PI4A/0WqAP9Kixr/Vn83/2eMTP96nGL/tMGkxOXh2I/j39Sf5ODUqeTg + 1LTm4dS96OTVw+vm18bp5dXA39rJscrGtZiuqpt2fHluT0xKQy0rKiYRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAACQAA + AA0AAAAVAAAAIxMSETozMCxVUVpDlD9wG/84ZxT/MGAO/yteBv8oXgL/KGEA/ypnAP8tbgD/MXYA/zR9 + AP84hAD/O4sA/z6TAP8/mQD/QZ8A/0OmAP9FrAD/SbMA/023AP9lyhr/X7Qg/5OugP/m7eD/4uvb/eXl + 19Ln4tTD6uXWyOrl1cLh3M2zzMi5m66rnXuFgnhWWVdQMjIxLRUAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAA + AAwAAAAYAwMEKhkYFUM2NCxjXFlLhoaBbqarpZG+zsW1wXqUXeMfWwD/KWUA/yxsAP8wdAD/NHwA/ziF + AP88jgD/P5YA/0KeAP9EpgD/Rq4A/0m2AP9OvwD/V8cE/2TQFf912Cv/h+BD/5XoWP+d7mH/fuM0/2zn + Ev9emzL/iKV0/4KeaO26uaOpsa2hf4yJf1xjYVo3NDMwGQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAACSMiHjk6Ny5pWVVGkX54ZK6hm4PDvLaey83HscnW0b6929fHqefg24R1nVPFK3kA/zuM + AP8/lQD/Qp8A/0WoAP9IsgD/SrsA/1HGAP9bzwb/adcY/3vfMv+Q6k7/o/Jp/7D3ef+1+4D/r/5z/6H/ + Wf+Q/zz/gf8i/3H/B/9m9QD/XtgF/y1oBP8lVgL+M0EoXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAACXx2YIp3b1PFmpJ1y7qzmsTMxrK019PCo9nWyJPc2s+D4d/Xc+jo + 42D28vdJmMh1tTmdAP9OvAD/UcYA/1vRBf9p3BX/fOYv/5TvUP+m92r/tft//7j+gv+y/3b/pf9f/5T/ + Q/+C/yX/df8O/27/Af9u/wH/c/8J/3b9E/9z6hz/Zcke/1ahH/89dRb/MF0P/0BcK70PDhAdAAAACAAA + AAUAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJeUT+5sZK5tq+Xob23pIvS0MV12djQZeHh + 3Fvs7OpT8/TzTfr7+0n+/v5I//z/Qs3ws45VyQf/dugi/572Xf+q+2z/sP90/67/cP+l/2D/lf9E/4X/ + KP93/w//b/8A/2z/AP9v/wT/ev8X/4H9Jf+B8S//eNkw/2a3K/9PjyD/N2sU/ydSCf8eRwP/G0MB/x5H + Av83XBr8pKOSrVtYU2cLCgorAAAAEQAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxbVxS2dfLeN3c + 2FjT1NFS09TSTvDx8U329/dM/Pz6Tvv691P39vJb8/HsZ+/r53Pq6t6IlvVO9XXxHP+O/zb/gP8g/3T/ + DP9u/wD/bP8A/23/AP9u/gb+b+0S7HXYLMh81jq0ePMf8ID/IP9z9xP/Yt8H/1TGAv9KrgH/QpkC/zyH + Bf82dgf/L2YH/ypaCP8iTwT/L1gQ8srJtrnh283NtLCks1taVHEMDAsxAAAAEwAAAAkAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAa2dZPuvq4XXw8vNL5+jmV93d2GHt6+Vt6+jheOvo4IXq59yW7OjbqO3o2rXp5NS34tfPqLrS + mZ1x7xjja/8B/3b/B/91/RHrZtQXylCcF6w4ZxaTJDoTfxMYD3AIBAthBwILVRcmDW45bhOqV68W5WbS + F/9j1g//WM0D/1LAAf9NrwX/R5wJ/0GKDP86eQ7/K2UD/1OAMube3Nhu39vRjuDcz7bh3c7NuLWptV9d + V3QODQ0zAAAAEgAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgnIg7g28yH+Pbxeejl24no5Nem7Onbt+vn2bri3s6v08/Am7Ct + oHyIhXtWYmBZMjo5NRQAAAAAKDccGGKPQFRFZyw+JDIaIwsJDS0AAARRAAAAdgAAAI8AAACeAAAApQAA + AKEAAACVAAAAhgkICYkqPR2uVns53nGmSf1utDr/XbIf/06qC/9IoAj/RJIM/z6NBf+jvpKa6ujwROTm + 5U/i4txl4N3SjeLe0bbi3c7Nu7ert2FfWXMPDw4uAAAACwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV1ROLcbArpTW0sKavLmuf5OR + iFxoZl83NTQwGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAABaAAAAkAAA + AKwAAAC3AAAAuQAAALoAAAC7AAAAugAAALgAAACyAAAApgAAAKEXHBO0Pk4z2mB5Tvhqj1D/XJYx/0qZ + EP9nkkfNm5ibbq6urmDCw8RW0NLTT9XW1VLY19Jk2tfNh9/bzLLi3c3Lwb6xtWZkX18AAAAIAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAFAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAcAAAAqAAAAagAAIrkAAFHfAABm6gAAW+UAADnWAAASxgAAAL0AAAC8AAAAvgAAAL4AAAC9AAAAtgAA + ALAECgC6HSoT0Sc1HdElMBy+SkVHv1xbV79lZGKkb25uhYODg3KVlpdmpaenW7i5uVe+vbdmwLytiNPN + u7Hn4dDIbm1mSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAADAAAIKQAAYsAAAJj+AACi/wADp/8AAaT/AACe/wAAj/sAAGrqAAAx0gAA + BMAAAAC8AAAAvgAAAL8AAAC/AAAAvQAAALgAAAC1AAAAsQAAALESEhC+Ly8szkNCP8xIR0a3Tk1NnVxc + XIpub296a2xta5GSkWKpqKJswLqqnKWgkHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbKcAAKL/AAuv/wAbz/8AH9f/ABvQ/wAT + v/8ACa3/AAGj/wAAnP8AAID0AABE2gAADMMAAAC7AAAAvgAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAugAA + ALgKCQnBIB8d0TIxLtg4NzbLOzo5tjs7OqNPT1CQX2BhfYeFfZReWkx5AAAADgAAAAsAAAAFAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMSkcAAJ//AA20/wAn + 6P8AJ+b/ACTg/wAi3v8AIdz/AB/Y/wAZy/8ADrX/AAOk/wAAn/8AAIn4AABO3gAAEMUAAAC7AAAAvgAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvQAAALsEBATBFhUU0CgnJt0vLyzbMjIwzDo6OcBHRT7GDw4LewAA + AE0AAAA6AAAAJgAAABUAAAAKAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAEBHmjAAKi/wAk4P8AKu3/ACfm/wAl4/8AJOD/ACLd/wAg2v8AINn/AB/X/wAazv8AELn/AASl/wAA + oP8AAI35AABR3wAAD8QAAAC7AAAAvgAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAALwBAQG/Dg4NzR4d + G9shIB7ZCQkHuwAAAKAAAACUAAAAfwAAAGcBAQFMAAAANAEBASACAgIQAAAABwAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAB+ygAIrv8ALPH/ACrt/wAo6v8AJ+f/ACbk/wAk4f8AIt7/ACHb/wAf + 2P8AHtX/AB3U/wAazf8AELn/AAWk/wAAoP8AAIv4AABK3QAACsIAAAC7AAAAvgAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL0AAAC9AAAAvQAAALwAAAC9AAAAuAAAALAAAACjAAAAkAAAAHkAAABeAAAAQwEB + ASoAAAAWAAAACQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCgcIABqv/ACzx/wAs8f8AKu7/ACnr/wAn + 6P8AJuX/ACXi/wAj3/8AIdz/ACDZ/wAe1v8AHdP/ABzS/wAZy/8AD7f/AASk/wAAoP8AAIb2AAA/2AAA + A78AAAC8AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvAAA + ALcAAACtAAAAngAAAIkAAABuAAAATwAAAC8AAAAWAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAmmQAACh/wAm + 5f8AL/f/ACzx/wAr7/8AKez/ACjp/wAn5v8AJeP/ACTg/wAi3f8AINr/AB/X/wAd0/8AHNH/ABvQ/wAY + yP8ADbT/AAOi/wAAn/8AAHzyAAAx0gAAAL0AAAC9AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAALsAAAC0AAAApwAAAJAAAABvAAAARgAAAB8AAAAHAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAABARBRQAAm/8AGMn/ADL9/wAu9P8ALPL/ACvv/wAq7f8AKOr/ACfn/wAm5P8AJOH/ACLe/wAh + 2/8AH9j/AB7U/wAc0f8AG8//ABrN/wAWxP8AC67/AAGh/wAAnP8AAG3sAAAfygAAALsAAAC+AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAADAAAAAvwAAAL0AAAC2AAAApQAA + AIAAAABLAAAAGwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAI7dAAis/wAw+f8AL/j/AC71/wAt8/8ALPD/ACru/wAp + 6/8AJ+j/ACbl/wAl4v8AI9//ACHc/wAg2f8AHtX/ABzS/wAbz/8AG87/ABnN/wATv/8ACKn/AACg/wAA + lv0AAFbiAAANwwAAALsAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAALsAAACoAAAAegAAADoAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABihAAAnv8AI9//ADP+/wAv + +P8ALvb/AC30/wAs8f8AK+7/ACns/wAo6f8AJub/ACXj/wAj4P8AIt3/ACDa/wAf1/8AH9b/ABXD/wAS + vP8AGcz/ABfI/wAQuf8ABaT/AACh/wAAifcAADrWAAAAvQAAAL0AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAuQAAAJkAAABXAAAAGwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgI + LiQDApn3AA+3/wA0//8AMfv/ADD4/wAv9v8ALfT/ACzy/wAr7/8AKu3/ACjq/wAn5/8AJuT/ACTh/wAi + 3v8AI9//ABfH/wABlv8ABKH/ABrP/wAZy/8AGMn/ABXE/wAMsf8AAqH/AACe/wAAcOwAABvKAAAAuwAA + AL4AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL0AAACkAAAAZAAA + ACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 8/8ABqn/AACX/xh5X/8VqRX/AWwC/wBlAOUCJQI0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXDwAA + jtIAAp3/ACTj/wEz//8ebv//Np///zWc//8zmf//M5n//zaf//8ujv//BTv//wAx//8AM///ADP//wAz + //8AM///ADX//wAu8/8ABqn/AACW/x+Baf8dsiL/AWkC/wBmAOUAIwAvAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAC4sAACY7gAFof8AKu7/ADH//xRZ//8ujv//Np7//zag//8si///CkX//wAu + //8AM///ADP//wAz//8AM///ADX//wAu8/8ABqn/AACW/yeIdv8mui//AmkC/wBmAOUAJQAvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0wAAJ76AAem/wAs8P8AMP//Azj//xBR + //8RU///Azj//wAv//8AM///ADP//wAz//8AM///ADb//wAu8/8ABqn/AACV/y6QgP8uwjv/AmgD/wBl + AOUAJQAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNXgAA + nf4ABqX/ACjn/wA1//8AL///AC7//wAx//8AM///ADP//wAz//8ANP//ADb//wAq7P8AB6n/BAWb/zeY + jv83y0n/A2kD/wBkAOUEKQQvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAE9bAACd9AABnv8AGcj/AC/0/wA1//8ANv//ADb//wA2//8ANf//AC3y/wAZ + yf8AAqH/AAWV/wlPS/8xvED/A20E/wBjAOUAJAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIPTcAAIzFAACd/wADpf8AELr/ABrM/wAd + 0v8AGcr/AA+3/wACo/8AAJ3/AACQwwAfNHgAbgD3AGYA/wBmAOUGKwYvAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA + SlcAAHixAACO4wAAlfcAAJj6AACT9QAAi94EA3qpBQVRUgAAAAQAAAAAAC0AUABZALgAIQAvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxkAADo3AABIQAAAMjIAABcTAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + /////4f////////wA////////wAB//////wAAAH/////gAAAAf////gAAAAB////gAAAAAH///wAAAAA + Af//8AAAAAAH//8AAAAAAP//8AAAAAAf///gAAAAAf///8AAAAAA////gAAAAAAf//+AAAAAAAf//4AA + AAAAAf//gAIAAAAAf//Af8AAAAB/////wAAAAD/////AAAAAP////8AAAAAP////gAAAAAH///+AAAAA + AH///4AAAAAAH///gAAAAAAH//+AAAAAAAP//4AAAAAAAf//wAAAAAAA///AAAAAAAD//8AAAAAAAP// + 4AAAAAAA///gAAAAAAD///AAAAAAAP//8AAAAAAA///4AAAAAAD///gAAAAAAf///AAAAAAD///8AAAA + AA////4AAAAAH////gAAAAAP////AAAAAA////8AAAAAB////4AAAAAH////wAAAAAf////AAAAAA/// + /+AAAAAD////4AAAAAP////wAAAAB/////gAAAAH////+AAAAAf////8AAAAD/////4AAAAP/////gAA + AAf/////AAAAB/////+AAAAH/////4AAAA//////wAAAH//////gAAA///////AAAH//////+AAA//// + ///8AAH///////8AY////////8H//ygAAABIAAAAkAAAAAEAIAAAAAAAYFQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABwEBAhATExIhMzItNhERDxgAAAACAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABAAA + AAcAAAANAwQFGxkZFzE3NS9QWFVJdHhyYJeVj3iyv7yix6qmk5YbGhkMAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAA + AAQAAAACAAAAAgAAAAMAAAACAAAAAwAAAAQAAAAGAAAACQAAABEJCQkhIiIgO0VDPF1qZ1mCiYNwpKGa + gr2wqZDLurSaz8O7pMq9tp/CycOuueHbxcCQjYFWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAACAAAAAwAAAAOAAAAEwIAAx0SFBExEBIPLwAA + ABYAAAASAAAAGhAQDywvLipGVVNLaHt4ao2blYOssqyVwsC5oc3HwarNzMexxdDMuLvV0L6v2NTDod3Z + ypS2sZ+Fx8S2dtXUyHK9t6KEAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA + AAUAAAAJAAAADAAAABAAAAAXAwMDJx8hHkJKTUZpYm5ZlW2FW8FnkEfpaJVF5lRcRX5hXVh0i4h7m6um + lbfAuqbIy8axzdHMucrV0L7B2NPCtdvXyKbd2syU3dvPg9zZ0HPZ189m09LMXM/OylWxsa1RtLWyT8HC + wUq8t6SBPjsyIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABgAAAAoAAAAOAAAAEQAAABsNDA0tIycgS0NN + PHNse2KikaSDzp22ie+OrnT/ZZBE/1SDMf9uokf/h7pg/7/KpdjV0L/A1tLBu9rWyKzd2s6g4NzRlOHe + 04jg3tR43tzVatva1VzU1dJTzM3MTsbHxkzBw8FMvsC9Tb6+vFC6ubVTu7u1VsDAu1XDv659VFFEOAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA + AAQAAAAHAAAACwAAAA4AAAATAAACHhAQEDMnLSJUQ1I3f1x1Sa1vkFXXeZ9b9XihWf9pk0j/Tnss/zRk + Ef8mVwL/JVsA/01+Kv99rlj/aJtC/4evav7f4taa5ePdYuTj3WHh4dxZ3dzZU9bW1U7Q0dFKy83OScfK + y0jEx8hKxMbHS8bHxk7HyMFTysnBWcvKwmDU0shn2NXLbcXBtXDGwa2JTUk9OQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAcAAAAMAAAADwAAABUCAQQiFRcTOi84 + J15HWTmKXXlHt2qPTd9rl0n7YpI9/1SEL/9FdCH/NmYT/ypbB/8jVQD/IVQA/yJVAP8lWwD/KmoA/0t+ + Jv9WhjP/R3Uk/0t8KP+Lp3jf1NjUVdTX1kjN0c9Jzc/RSM3Q0UfO0NJH0NLTR9PU1UjW19ZL2tvYUd7d + 2Fng39dl4d/Wc+Lf1YDl4teM0My9lbewmpzVz7eoXlxSKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAIAAAALAAAAEwgHCCYYHRNBLz0kaEdfNJZbe0LDZo5I52eURP9djTn/UIAr/0Fy + Hv82ZhP/LV4K/ydZBP8kWAD/JFkA/yZdAP8oYQD/K2YA/yxrAP8ubgD/N4YA/0N8Gf9OfCv/RnQj/0Nz + H/8xYg3/rryqeNve3kDW2tdL2tvaT93e21Xg4d1d5OTfZefm327p5t946ebdgufk2o/m4tee5eHVrefj + 1bnr59e+497Nurayk7CrqY18AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACAAA + ABADAwQlP08zh1p8QMxchzruXYs6/1aFMv9LeSf/P24b/zVkEv8tXgr/KFsE/yZbAP8mXgD/KGIA/ytn + AP8tbQD/MHIA/zJ3AP80fAD/NoEA/ziGAP85hwD/Q6MA/0aSD/9Oei3/SXYo/1qDPP9li0r/u8StpeTh + 2YLi39SR5ODVnOTg1Kfk4NSv49/StuTg07zm4tTC6uXWxenk08Hh28q008+9nLOvn3uDf3NVXlxTMjo5 + NBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAUAAAAJAAAADQAAABIAAAAZAAABJhUUFDdATzOPSnsl/0Jw + IP86aBj/MmIQ/y1eCf8oXAP/J14A/yhhAP8qZwD/LW0A/zB0AP8zegD/NoAA/ziGAP87jAD/PZEA/0CX + AP9BnAD/Q6IA/0SnAP9EqQD/UroG/1y8Ff9kj0b/vM2v/9Xgzf/Z5NH/4eDTyOPe0bzj3tHC5eHTxujk + 1cfq5dXC497Nt9LOvqC4taeAkY6DXGVjWzdDQjwYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA + AAkAAAAOAAAAFAAAAB0FBQYsGhkWQzo4MGJhXlGEiINypK6nl7dVeDfyI1sA/yhdA/8oYAD/KWUA/yxs + AP8vcwD/M3oA/zaBAP85iAD/PI8A/z+WAP9CnQD/RKMA/0aqAP9IsQD/SbcA/02+AP9UxAL/X8wQ/27T + JP9/3Dv/dtQx/4DpMv9YoSP/t8eq/8LWtP/DzbHh5N/OvuPezrfW0sGivrqshJeUimBta2M7PDs3IAAA + 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 + 7/8AKuz/ACjq/wAn5/8AJuX/ACXi/wAj3/8AIt3/ACDa/wAf1/8AHdT/ABzS/wAc0f8AGMn/AA60/wAD + n/8AAJ//AACU/AAAWOIAABLFAAAAuwAAAL4AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC+AAAAvAAAALcAAACwAAAApQAAAJQAAACAAAAAZwAAAEwAAAAxAAAAGgAA + AAsAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhidwAAnP8AGcv/ADD5/wAs8v8AK/D/ACrt/wAp + 6/8AJ+j/ACbm/wAl4/8AJOH/ACLe/wAh2/8AH9j/AB7V/wAc0v8AG9D/ABvP/wAXxv8ADLD/AAKe/wAA + n/8AAI/5AABK3QAACcEAAAC8AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC+AAAAuwAAALYAAACsAAAAngAAAIgAAABrAAAASQAAACgAAAAPAAAAAwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAzNQAAnf4ADLD/ADD5/wAu9f8ALfL/ACvw/wAr7v8AKez/ACjq/wAn + 5/8AJeT/ACTi/wAi3/8AIdz/ACDZ/wAf1v8AHdP/ABvQ/wAazv8AGc3/ABXC/wAKrP8AAZ3/AACg/wAA + hPUAADjVAAAAvgAAALwAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC9AAAAuQAAALAAAACfAAAAgQAAAFgAAAArAAAADgAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABAAAjdIAAZ3/ACjp/wAx+/8ALvX/AC3z/wAs8f8AK+//ACrs/wAo6v8AJ+f/ACbl/wAk + 4v8AI+D/ACLd/wAg2v8AH9f/AB7U/wAc0f8AGs7/ABnM/wAYyv8AEr7/AAen/wAAnf8AAJ//AAB07QAA + I8wAAAC8AAAAvQAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL0AAAC4AAAAqAAAAIYAAABSAAAAIgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + YXsAAJz/ABjI/wAz//8AL/j/AC72/wAt9P8ALPL/ACvw/wAq7f8AKev/ACjo/wAn5v8AJeP/ACTh/wAi + 3v8AIdv/AB/Y/wAe1f8AHNL/ABvQ/wAaz/8AGcz/ABfI/wAPuP8ABKH/AACe/wAAmf4AAFvkAAAPxAAA + ALsAAAC+AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAuQAAAKUAAAB3AAAAPAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSEAAJv1AAal/wAv + +P8AMfz/AC/5/wAv9/8ALfT/AC3z/wAr8P8AKu7/ACnr/wAo6f8AJ+b/ACXk/wAk4f8AIt7/ACHc/wAg + 2f8AINn/ABrN/wAJqf8AEbv/ABnN/wAYyf8AFcT/AAyw/wACnv8AAKD/AACM+AAAPdgAAAC+AAAAvQAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAA + ALQAAACOAAAAUQAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALC3+nAACZ/wAf1/8ANf//ADH7/wAw + +f8AL/f/AC71/wAt8/8ALPH/ACvv/wAp7P8AKOr/ACfn/wAm5f8AJOL/ACPg/wAj3/8AHtT/AAaj/wAA + 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 + AAAAAHONAACb/wARuv8AMf//Dk3//zWd//8zmv//M5n//zOZ//8zmf//M5n//zOZ//8zmf//Np///y6P + //8JQf//AC7//wAz//8AM///ADL+/wAy/P8AMfv/ADD5/wAv9/8ALvX/AC3z/wAs8f8AK+//ACrs/wAo + 6v8AJ+f/ACfo/wAe1f8AAZz/AACJ1wAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkOAACU2AAA + l/8AIdv/ADP//yZ+//82n///M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zaf//8tjf//Bjz//wAv + //8AM///ADP//wAz/v8AMv3/ADH7/wAw+f8AMPj/AC72/wAt9P8ALPL/ACvw/wAq7f8AKev/ACnt/wAN + sv8AAJ//AABQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRAAAoP0ABaD/ACrz/wtJ + //8zmv//NJv//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//82oP//J4H//wEy//8AMv//ADP//wAz + //8AM/7/ADL9/wAx/P8AMfr/ADD5/wAv9v8ALvX/ACzy/wAs8P8ALfT/ABrN/wAAmv8AAJXOAAAMCgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc44AAJz/ABC2/wAu//8ZZv//NqD//zOZ + //8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//N6H//xhi//8ALf//ADP//wAz//8AM///ADP//wAy + /v8AMvz/ADH7/wAw+f8AL/f/AC71/wAw+f8AHtb/AACc/wAAmf8APzC7AAAABQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQsAAJXPAACW/wAc0v8BNP//JHv//zag//8zmf//M5n//zOZ + //8zmf//M5n//zOZ//8zmf//NZz//y2O//8DN///ADL//wAz//8AM///ADP//wAz//8AMv7/ADL8/wAx + +/8AMPr/ADL+/wAg2f8AAJv/AAKb/wNMP/8AcAD/AE8AsT5JPg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAADc0AACe9QACmv8AJur/BDr//yqH//82n///M5n//zOZ//8zmf//M5n//zOZ + //8zmf//M5r//zSa//8KRf//AC///wAz//8AM///ADP//wAz//8AM///ADP//wAy/f8ANf//ACHc/wAA + m/8AAJr/EnZU/w6jDP8AZQD/AGUA/z5lPjkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABmbgAAoP8ACKf/ACz4/wY9//8rif//Np///zOZ//8zmf//M5n//zOZ//8zmf//NJv//zKX + //8HQP//ADD//wAz//8AM///ADP//wAz//8AM///ADP//wA2//8AIt7/AACa/wAAmf8ZfF7/GbMc/wJs + A/8AawD/AD8AhQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + e6cAAJz/ABG4/wAw//8FO///KIL//zeh//80mv//M5n//zOZ//8zmf//N6L//yBz//8AL///ADP//wAz + //8AM///ADP//wAz//8AM///ADb//wAj3v8AAJr/AAGY/x+DaP8ivCj/A2wE/wBpAP8ATACEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhAAAJDQAACX/wAY + yP8AMv//AjT//x5u//80mv//NqD//zaf//82oP//JXz//wM1//8AMf//ADP//wAz//8AM///ADP//wAz + //8ANv//ACPf/wAAmv8AAJj/Joly/yvFNf8EbAb/AGkA/wBMAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwpAACf5wAAl/8AHNH/ADT//wAu + //8LR///HGr//yJ1//8UW///ATP//wAw//8AM///ADP//wAz//8AM///ADP//wA3//8AI97/AACa/wAB + mP8tkHz/M81D/wVtB/8AaAD/AEgAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABARCPQAAnfAAAJf/ABvO/wA1//8AMf//AC3//wAt + //8ALf//ADL//wAz//8AM///ADP//wAz//8ANP//ADf//wAj3v8AAJv/AgOa/zOWhv881k//Bm4J/wBo + AP8ATACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPUYAAJ3wAACY/wATvf8AL/X/ADf//wA1//8ANP//ADP//wAz + //8ANP//ADX//wA2//8AMfn/ABrK/wAAm/8AAJX/L4yB/0bgX/8Hbwv/AGgA/wBMAIQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAGBkI4AgKW2AAAnP8ABaL/ABvM/wAs7/8AMv7/ADT//wA0//8AMv3/ACvu/wAc + zv8AB6b/AACa/wAFmPkAQzT/EIUQ/wp0Dv8AaAD/AEsAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAgIhFAAAd5IAAJ32AACc/wABnv8ACKv/AA2z/wANs/8ACKv/AAGf/wAAm/8AAJ/5BASGpAAG + Li0AUQCSAGsA/wBrAP8ASwCFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAACwnAABefgAAhMIAAI/lAACX7gAAl+4AAI3iAACAvwcHan4DAzgsAAAAAAAAAAAAAAAAAEEAgQBA + AHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAB0YAAA5KAAAOCcAABoVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8AAAD/////////D/8A + AAD////////gB/8AAAD///////4AB/8AAAD/////4AAAB/8AAAD////+AAAAA/8AAAD////AAAAAA/8A + AAD///wAAAAAA/8AAAD//8AAAAAAA/8AAAD//gAAAAAAB/8AAAD//AAAAAAAD/8AAAD/wAAAAAAB//8A + AAD8AAAAAAA///8AAADwAAAAAAP///8AAADAAAAAAA////8AAADAAAAAAAH///8AAACAAAAAAAB///8A + AACAAAAAAAAf//8AAACAAAAAAAAH//8AAADAAIAAAAAB//8AAADAD/AAAAAB//8AAADh//AAAAAA//8A + AAD///AAAAAA//8AAAD///AAAAAAf/8AAAD///AAAAAAH/8AAAD//+AAAAAAA/8AAAD//+AAAAAAAH8A + AAD//+AAAAAAAB8AAAD//+AAAAAAAAcAAAD//+AAAAAAAAMAAAD//+AAAAAAAAEAAAD///AAAAAAAAEA + AAD///AAAAAAAAAAAAD///AAAAAAAAAAAAD///gAAAAAAAAAAAD///gAAAAAAAAAAAD///wAAAAAAAAA + AAD///wAAAAAAAAAAAD///4AAAAAAAAAAAD///4AAAAAAAAAAAD///8AAAAAAAEAAAD///8AAAAAAAEA + AAD///+AAAAAAAcAAAD///+AAAAAAB8AAAD////AAAAAAD8AAAD////AAAAAAB8AAAD////gAAAAAA8A + AAD////gAAAAAA8AAAD////wAAAAAAcAAAD////4AAAAAAcAAAD////4AAAAAAcAAAD////8AAAAAAcA + AAD////8AAAAAAcAAAD////+AAAAAAcAAAD/////AAAAAAcAAAD/////AAAAAAcAAAD/////gAAAAA8A + AAD/////gAAAAA8AAAD/////wAAAAA8AAAD/////4AAAAB8AAAD/////4AAAAAcAAAD/////8AAAAAcA + AAD/////+AAAAA8AAAD//////AAAAB8AAAD//////AAAAD8AAAD//////gAAAH8AAAD//////wAAAP8A + AAD//////4AAAf8AAAD//////8AAA/8AAAD//////+AAB/8AAAD///////gBz/8AAAD///////8P//8A + AAAoAAAAYAAAAMAAAAABACAAAAAAAICUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAA + AAMAAAAFAAAABgAAAAcAAAAGAAAABQAAAAUAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA + AAIAAAAEAAAABwAAAAoAAAAMAAAADQAAABMEBAYbHx8dLjw6NUdlZFhrgYBvdygoIikAAAADAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAwAAAAUAAAAIAAAACwAAAA4AAAARAAAAGA0NDSYkJCI7RUM9WWhlWHyAemedkoxztpqS + dsa4tJnMyMSqz8K+q6IuLSsSAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAA + AAEAAAABAAAAAQAAAAIAAAAEAAAABgAAAAoAAAAMAAAADwAAABMAAAEcERERLDEwLkVWVExmc29hiI6J + daeclXy+pZ6Dy6ujiM6yq5PLu7OdxsG6pcLFwKu+zsazutrTvsWrqJpkAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAGAgICCgEB + AQ0AAAAQAAAAEgAAAA8AAAAMAAAADQAAAA4AAAANAAAADQAAABAAAAASAAAAFwEBAiAdHBwzPj05TmFf + VnCFgHKTmpSAr6uki8Oyq5DMuLGXzr23n8rFwKrFzMezwNDLuLvSzbm21tG+r7iym6WsppCa3NnJjtbS + wozUzricOzo2DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABQAA + AAcAAAALAAAAEAAAABQAAAAYAAAAGgAAAB8JCAoqGhwXPzhDMGU/TzN5KC8kTQAAACMAAAAhCgoLKyMj + IT5JSENbcGxjfI+LfJypo5C2ta6Yx722n83Bu6TMx8KsyMzItcPSzru91dC/ttXRv63W0sGj19PDmNrW + yIvb2Mt+3dvRdMG/s2qyr6Rg0tHLWsjIw1HCvKaUaGRWPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAA + AAMAAAAFAAAACAMDAwwAAAARAAAAFgAAABoAAAAdAAAAJAYGBTMnKyVNT1VLcn+IeJ16kWjJiqd06Wyb + R/9pn0D/b51J7GhrWYB6dm+FoJyOqLSunL7BuqbLxb6qz8rEsMzOybfG1M+/wNfTxLrY1cSz2dXFqdnW + x5zb18qM3tvPft/c03Hd29Rm2tjSX9PTzVjNzMhUx8jEUrS1slCjo6BPv8C+T76+vkq8uKp8jYdxYgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAACAAAAAwAAAAYAAAAJAAAADgAAABMAAAAXAAAAGwAAAB4AAAAnExQSOSctI1RUXkx9f411qKa3 + mdK1yqbyqsWV/4eqbP9ahjj/VIIy/2OVPf90rEv/m7567MfEr8fOyLbIzcm4xdLNvbzX08ey2tfLq9zZ + zKTc2cub3drNkd/c0ITg3tN34N7Wat/e2F/b2tZX09TRUczNy0/Fx8VNwMLBTb6/vk29vr1Ovr+8Uby8 + uVKwr6tUv7+6Vb+/ulS+u7BwoZqBdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAQAAAAIAAAAEAAAABgAAAAoAAAAPAAAAEwAAABgAAAAbAAAAIAUDByoVFxQ+Nj0wXlBg + RIhuhluzhaNu3JS1fPaWuHz/h6pr/2iRSf9Kdyf/NWQR/zBkCv8tXwn/T38r/4W3Yf+CtVz/gLNa/63K + lPLZ2suf3NnOhd3c0X7h4NZ05OLabeTj3Gbj4dxf4N/aWdra11PV1dRPz9DPTMjLy0vDx8dKwsTFSsLE + xUvDxsVNw8XBUMTFv1PDxL1WwsK7WsTCul7W1cxixMK4ZL+9smbDwLF3m5V9eQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAACwAAABAAAAAVAAAAGQAAABwAAAAiBwYILiAj + HkU3QTBnWGtKk2qHU750m1fjdaBT/HCdTf9mk0L/WYY2/0l3Jf85aRb/Ll8K/yhZBv8lVgP/IlIB/yli + Av8jWgD/YZE+/3CgTP9aizb/T4Er/3CZUf/S3Mq+6ObjUuTl4FXh495S2dvYUNXV1E7Q0dBLy83NSsnL + zEnJy8xKyczMSsnLzEvJy8tMysvLTsrMyk/LzMhSzc3FWNDPxl7U0slk2NbMa9zZz3Hi39V30s3AfMfA + sn7FwK6NmZN8dgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAcDAwMMAAAAEQAAABYAAAAaAAAAHQAA + ACQNDQ0yISYdTERQOXJWbEWdbI1TyHKbU+pxn07/ZpZB/1uLNf9Qfyv/RnUi/z1sGf80YxH/LF0J/ydX + BP8kVgH/I1UA/yNWAP8kWQD/JVkA/y5vAP8rawD/U4Qv/1ODL/9HdiT/R3Yl/0l6Jf9qj0/+t8KxhtbY + 2ETO0tBLys/NSs3Q0ErP0dNJ0NPUSdDT1EnR09RJ0tTUSdTW1krX2NdN3NzaUODg3FXj4t1c5ePdZuXj + 2nLj4Nd949/UhuHe0pDj39SWsKqUm7iwm57QyrWusKyZZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAEQAA + ABcAAAAdAQADJhETDzgqMyJVP1EwfFt2RqhojEzRcJpP8GuaR/9jkj7/V4Yy/018Kf9FcyL/PWwa/zVk + Ev8uXgv/KFkF/yVXAf8kVwD/JFkA/yZcAP8nXwD/KWMA/ypmAP8saQD/K2gA/zR+AP81gAD/R3oi/1B/ + LP9Jdib/SXYn/0l3Jv8xYwv/d5Jov93g4kDU2ddI1NnXSNbZ2EnZ29tK29zcTd7f3VDi4uBU5ubiWujo + 42Hq6OJp6ujhcejn3nrn5NqF5eLXkuPg1J3i39On4t7SruPf0rXk4NO71c+8v6ejf7/Fw56vfHxvKgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAAACAAAABAICAgwAAAAZAwIEJiwxKFdHWziGUXQ4sGSORNtmlEP3Y5M//1uKN/9SgS//Sngn/0Nx + IP88axn/NWQS/y1eC/8oWgX/JVkB/yRZAP8lXAD/J18A/yljAP8rZwD/LWoA/y5uAP8vcQD/MXQA/zJ4 + AP80ewD/NH0A/zqLAP9BngD/RoAc/1B+Lv9DciH/QXAf/0NxIP87bBb/aIZSzOHh3Vnc3dVj39/Xa+Lg + 2HTk4dh/5eLYi+Xi15Tk4dWd4+DUo+Pf06ji3tKt49/SsOLe0bTh3dC64dzOwOXg0MPi3s3C5eDNudPO + uqbLxrOLnZmLaIuIekRIRz8dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAQAAAAIAAAAEAAAABwEBAQoAAAAPAAAAFgAAAB8DAgQsSF05nGWPRflaiDf/UoAv/0x5 + Kv9GcyX/QW4e/zpoF/8zYxD/LV4J/yhbBP8mWgH/JVwA/yZfAP8pYwD/K2cA/y1rAP8vbwD/MHMA/zJ3 + AP80fAD/Nn8A/zeDAP85hwD/O4sA/z2PAP8+kwD/P5YA/0CXAP9NvgD/RpIO/1SANP9Xgjj/bpJT/4ak + cP+btYj/uMap3+Pe06Ph3dCs4t7RseLe0rXi3tG54t7Ru+Hd0bzg3dC939vPv+Le0MLi3s/F5+LRxOXh + z7zc18Wq0867j6yomG+al4lIX11VKCwrJw0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAUAAAAIAgICCwAAABEAAAAVAAAAGgAAAB8AAAAlBQUGMBwb + HD9MVkKDRnYi/z1sGv89aBz/N2UW/zFhDv8sXgn/KFwE/yZcAf8mXgD/KGIA/ypmAP8tawD/L3AA/zB0 + AP8yeAD/NH0A/zeCAP84hgD/OosA/zyQAP8+kwD/QJgA/0KcAP9DoAD/RaQA/0eoAP9IrQD/SrEA/0Wq + AP9p0Bz/Wr0S/1mHN/+4y6r/3OXV/+Dp2v/d59f/3eLT4OPf07bi3tK74d3RvODcz73g3M7A497Pw+bi + 0cPk386+49/MrsrGtpS+u6x0hoN5T3JwaC4zMi4SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAABQAAAAgAAAANAAAAEgAAABcAAAAbAAAAIAAA + ACgKCgo1JyckS0ZEPWhrZ1uJioVzpa6mlbhlgkvtI1kA/yxfCP8oXAP/J10B/ydgAP8pZQD/LGoA/y5v + AP8xdAD/M3kA/zV+AP83gwD/OYgA/zuNAP89kgD/QJcA/0KcAP9EoQD/RqYA/0irAP9JrwD/S7QA/0y5 + AP9OvQD/UcEA/1bIA/9ezA3/atMd/2zUIP94zjj/jvJD/0mVEv+ctIn/4OnY/9Dfx//K17zw39zNwuLd + zcDi3cvD5uHPvuLdy6/W0sGYt7Omd5qXjVJjYlszRkVAGQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQAA + AAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAANAAAAFQAA + ABsAAAAiAAABKxUVFDsrKiZTTUpAcmpmVpKJg22uopuDwravlszDvabOzce1x9LOvbdJcyjrJGEA/yto + AP8tbAD/L3IA/zJ3AP80fQD/N4MA/zmIAP88jgD/PpMA/0GZAP9DnwD/RaQA/0iqAP9KrwD/S7QA/026 + AP9PvwD/UcUA/1XLAP9b0AX/ZNYR/3HcIv+A4jn/k+hU/6PtbP+u8Xv/s/SC/6b3a/9s3Rn/bPAM/1/Y + B/9KeCn/c5lX/1SDM/9rhk7drK6PsrSwo4CfnZJcaWdhOVNSTRsAAAAHAAAAAAAAAAAAAAAAAAAAAAAA + AAIAAAADAAAAAwAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAQAAAAgNDQ0eGhoYOjU0LlpLSD17ZmJQm4F6Y7SYkXjGrKSLzrqznM3GwavJz8u4wtXR + wLrY1MSv29fKndTVxIlFfBzmLXQA/zeCAP85hgD/O4wA/z6SAP9BmAD/Q58A/0alAP9IrAD/SrEA/023 + AP9PvgD/UcMA/1PJAP9XzgD/XNIG/2baEv914ib/iulC/5zvX/+v83r/v/iW/8b7nf/C/ZT/tv6A/6b+ + ZP+V/kf/hv0v/3v9Gv9x/Ar/X94C/2z7A/9HrwD/Hk0A/yJSAf8cTgD/RVg2eQAAAAAAAAACAAAAAAAA + AAAAAAACAAAAAwAAAAMAAAADAAAAAwAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDMuHVZSRWxjXk2ZcmtVuIeAZcmclHrOsKiRzMC6 + pcXLxrK+0s28t9XRv7DW0sGp2NTEntvXyo/f3NJ94+Dba+Hi22JXmijlNYcA/0OfAP9GpAD/SKoA/0qx + AP9NuAD/T78A/1HGAP9UzQD/WNIA/1/bBf9r4xP/eugp/4zuRf+h8mP/s/aB/8D7lP/J/p7/xv+Y/7z/ + hv+s/23/m/9Q/4v/M/99/x3/dP8P/3D/Bv9t/wL/a/8A/2v/AP9s/wD/a/0B/2PjB/9+9Sb/YLEk/y1g + Cf8wYgz/TWo3pwkIChIAAAAPAAAACQAAAAUAAAACAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQT0RoZl9oHRs + T8x6cVTInJR1xLiwmL3DvKezy8a0qNPPvp7X1MWT2dbJiNzZzn3f3NNz4uDaaebm4V7s7epV8PHxTvX0 + 91B8xEnfOpoA/1C9AP9SxQD/VMwA/1nTAP9f2wX/aeEQ/3fpJP+L70H/o/Zm/7X6f//D/ZX/y/+i/8r/ + n/+9/4n/rP9s/5r/Tf+J/zL/fP8b/3T/Df9v/wX/bP8A/2r/AP9p/wD/av8A/2//Af91/w3/fP8a/371 + Jv943i7/bsQu/1idJv9Abx3/NWQU/ytXDP82Xhj/O2Qd/0VOPmUEAwQXAAAAEgAAAA4AAAAIAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACJhXNWq6KAw62lh7OzrJGssKmQn8nEs43V0cV91tPIcNnXz2je3ddg4+PgWunp + 51Tv8O9Q9vf3Tfv8+0v+/v5K/f39S//6/0av6oW9RbgA/1fPAP9x6Rr/ie4+/5v0Wf+s+XL/uvyH/8L/ + k//C/5P/u/+G/6z/bv+b/0//i/8z/37/Hf90/w3/b/8F/2z/AP9r/wD/a/8A/2r/AP9u/wT/dv8R/4D/ + Iv+I/DT/jPJA/4beRf92wT//YJ40/0d7Iv8yXhP/I00G/x9IA/8eSAL/GkMA/xpDAP8mTgn/I08E/3+O + Ztehm5OPPDs4TQAAACQAAAAaAAAAEwAAAAsAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACim4J5wLummcXBsX7Myrx0zsvCZby7 + s1za29hV3t/dUubn50/u8PBN+fr6TPz9/Uz///5L//79TP38+077+vlQ9/f0Vffx9FTa8cWGfOsr/W3X + IP+Y/0z/uP+B/6//cf+i/1z/lf9F/4f/Lv98/xr/c/8N/2//BP9t/wL/bf8A/2z/AP9s/wD/b/8A/3T/ + CP91/wn/eP8S/4z/Nv+T/0P/j/dD/4HoNf9v0yf/WroU/0qiCP89kAD/NoIA/zN4Af8xcAT/LWYE/yhd + A/8mVQT/J1QI/yVPB/8dRgH/GEUA/22AVNLf2cvJzci5x5eUipg8OzhVAAAALAAAAB8AAAAWAQEBDAAA + AAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACgmYF619XMcdvc2VPe391T5efmUcDCwFDi5ONQ8vPzUPX29k/5+fhQ+vr4UPn49VX29fJa9PLuYPHu + 6Gnu7ORz6+ngfenl3Yfs5OOLrftx3m3rEf9u7xD/ev8V/3P/C/9u/wX/bP8A/2v/AP9q/wD/av8A/2v/ + AP9t/wD/cf8I/3P3Evl46STmd9A2wo3IYY+Eyk+Xc+0b6Hf/Ef9s/QP/ZfUA/2DsAP9e4gD/WtYB/1fI + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBKhgAAJzuAACV/wATv/8ALPL/ACjq/wAo6f8AJ+f/ACbl/wAl + 4/8AJOH/ACPf/wAi3f8AINv/ACDZ/wAe1v8AHdT/AB3U/wAb0P8AFMH/AAip/wABmf8AAJj/AACh/wAA + l/0AAGTnAAAeygAAALsAAAC9AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvQAAALwGBQXDExMR0hwcGtgVFBPOAgICtgAAAKwAAACoAAAAnwAAAJMAAACGAAAAdwAA + AGUAAABUAAAAQgAAADMBAQEkAQEBGQQEBBAAAAAJAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDsAAKH/AACW/wAe + 1v8ALfP/ACrs/wAp6/8AKOn/ACfn/wAm5f8AJeP/ACTh/wAj3/8AIt3/ACHb/wAg2f8AHtb/AB7U/wAd + 0/8AHNL/ABvQ/wAUwv8ACar/AACZ/wAAmP8AAKH/AACW/AAAW+QAABfHAAAAuwAAAL0AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvAAAALwAAAC7AAAAvQAA + ALwAAAC5AAAAtgAAALAAAACpAAAAnwAAAJIAAACDAAAAcgAAAGEAAABOAAAAPQAAAC4BAQEfAAAAEwAA + AAsAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAALD8AAKH/AACX/wAh2/8ALvX/ACvv/wAq7f8AKev/ACjp/wAn6P8AJub/ACbk/wAk + 4v8AI+D/ACLe/wAh3P8AINn/AB/Y/wAe1f8AHdP/ABzR/wAb0P8AGs7/ABPB/wAJqf8AAJj/AACZ/wAA + ov8AAJH6AABU4QAAEMUAAAC7AAAAvgAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC+AAAAvgAAALwAAAC4AAAAtQAAAK4AAAClAAAAmgAA + AIwAAAB8AQEBawAAAFcAAABFAAAAMgAAACIAAAAUAAAACwAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERQiwAAKD5AACU/wAb0P8AL/j/ACzy/wAr + 8P8AKu7/ACrs/wAp6v8AKOn/ACfn/wAm5f8AJeP/ACTh/wAj3/8AId3/ACHb/wAf2P8AHtb/AB3U/wAc + 0v8AG8//ABvP/wAazf8AE7//AAin/wAAmP8AAJr/AACi/wAAjPgAAEncAAAJwgAAALsAAAC+AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC+AAAAvgAAALwAAAC5AAAAtAAAAK0AAACjAAAAlwAAAIgAAAB2AAAAYAAAAEoAAAA1AAAAIQAA + ABEAAAAHAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAgAAI7dAACX/wAQuf8AMPn/AC30/wAs8v8AK/D/ACvu/wAq7P8AKev/ACjp/wAn5/8AJuX/ACXj/wAk + 4f8AI9//ACLd/wAh2/8AH9j/AB/X/wAd1P8AHNL/ABvQ/wAazf8AGs3/ABjL/wARu/8ABqX/AACX/wAA + m/8AAKL/AACD9AAAOdYAAAC+AAAAvAAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC+AAAAvQAAALsAAAC2AAAAsQAA + AKcAAACcAAAAiwAAAHYAAABeAAAAQgAAACoAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH6gAACc/wAFov8ALPH/AC/3/wAt9P8ALPL/ACzx/wAr + 7/8AKu3/ACnr/wAo6f8AJ+j/ACbm/wAl5P8AJOL/ACPg/wAi3v8AIdz/ACDa/wAf1/8AHtX/AB3T/wAc + 0f8AGs7/ABnM/wAZzP8AF8n/ABC3/wAFof8AAJf/AACd/wAAoP8AAHbuAAAozwAAALwAAAC9AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL4AAAC+AAAAvAAAALkAAAC0AAAAqgAAAJwAAACIAAAAbAAAAEwAAAArAAAAFAAA + AAcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5RAACi/wAA + lf8AINn/ADL8/wAv9v8ALvT/AC3z/wAs8f8AK/D/ACvu/wAq7P8AKer/ACjo/wAn5/8AJuX/ACXj/wAk + 4f8AI9//ACLd/wAh2v8AH9j/AB/W/wAd1P8AHNH/ABvP/wAazf8AGMv/ABnL/wAWxv8ADbP/AAOd/wAA + l/8AAKD/AACb/wAAY+cAABjHAAAAvAAAAL4AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL4AAAC9AAAAuQAA + ALIAAACmAAAAjwAAAHEAAABIAAAAJwAAAA8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAB4PAACd5AAAlf8AD7f/ADL9/wAv+P8ALvb/AC71/wAt8/8ALPL/ACvw/wAr + 7v8AKez/ACnq/wAo6f8AJ+f/ACbl/wAl4/8AJOH/ACPf/wAi3f8AINr/ACDZ/wAe1v8AHdT/ABzS/wAb + z/8AGs7/ABnL/wAYyf8AGMn/ABTC/wAKrf8AAZr/AACY/wAAov8AAJL7AABL3QAACMEAAAC8AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvgAAALwAAAC2AAAAqAAAAJAAAABnAAAAPwAAABwAAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABykwAAnv8AApz/ACrt/wAy + /f8AL/j/AC/3/wAu9f8ALfT/AC3y/wAs8P8AK+//ACrt/wAp6/8AKOr/ACfo/wAm5v8AJeT/ACTi/wAj + 4P8AIt7/ACHc/wAg2f8AH9f/AB7V/wAd0/8AG9H/ABvQ/wAbz/8AGcv/ABfI/wAWyP8AEr3/AAen/wAA + mP8AAJr/AACi/wAAgfQAADHTAAAAvgAAAL0AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC9AAAAtQAA + AKQAAACAAAAAVgAAACoAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAA7NAAAo/wAAJP/ABjJ/wA0//8AMfr/ADD5/wAv9/8ALvb/AC70/wAt8/8ALPH/ACvw/wAq + 7v8AKez/ACnq/wAo6P8AJ+f/ACbl/wAl4/8AJOH/ACPf/wAi3P8AINr/ACDY/wAe1v8AH9f/ABjI/wAK + rP8AEr7/ABnM/wAYyf8AF8f/ABbG/wAPt/8ABaD/AACX/wAAnv8AAJ//AABp6gAAGMgAAAC7AAAAvgAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC+AAAAvAAAALEAAACSAAAAaAAAADgAAAAVAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAib0AAJv/AAak/wAw+P8AMv7/ADH7/wAw + +f8AL/j/AC/2/wAu9f8ALfP/ACzy/wAr8P8AKu7/ACrs/wAp6v8AKOn/ACfn/wAm5f8AJeP/ACTh/wAj + 3/8AItz/ACHb/wAi3P8AGsz/AASe/wAAkv8ABaP/ABrP/wAZzP8AF8n/ABfH/wAWxv8AFML/AAuv/wAC + m/8AAJf/AACh/wAAk/oAAEncAAAEwAAAALwAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvQAAALUAAACaAAAAcgAA + AD8AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb + Y1UAAJ//AACT/wAe1f8ANf//ADL8/wAx+/8AMPn/ADD4/wAv9/8ALvX/AC30/wAs8v8ALPD/ACvv/wAq + 7f8AKev/ACjp/wAn5/8AJub/ACXk/wAk4v8AI+D/ACTi/wAb0P8ABJ7/AACW/wAAlv8AEbv/AB3U/wAa + z/8AGcz/ABnK/wAXyP8AFsb/ABbF/wASvP8AB6f/AACY/wAAmv8AAKL/AAB68QAAJ84AAAC8AAAAvgAA + AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBeJQAAKD/AACU/wAk4P8ANv//ADP//wAz//8AM///ADP//wAz + //8AM///ADP//wAz//8AM///ADP//wAz//8AMv7/ADL9/wAx/P8AMfv/ADD6/wAv+f8AL/f/AC72/wAt + 9P8AMPn/ABTB/wAAjf8AAJP/ABK6/wAq7v8AKOr/ACfm/wAl5P8AJOL/ACTh/wAi3v8AIdz/ACDa/wAf + 2P8AHtb/AB3U/wAc0v8AG8//ABrN/wAZy/8AF8j/ABbG/wAVxP8AFMH/AASh/wAAmP8AAJ3wAAAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKhkAAKDnAACV/wAK + qv8AMvz/ADT//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP+/wAy + /f8AMvz/ADH7/wAw+/8AMPn/AC/4/wAv9v8AMPn/ACDY/wAIoP8AE73/ACzx/wAr7v8AKev/ACjp/wAn + 5/8AJuX/ACXj/wAk4f8AI+D/ACLd/wAh2/8AINn/AB/X/wAe1P8AHdP/ABvQ/wAazv8AGcz/ABjJ/wAX + x/8AF8f/AA+4/wAAmP8AAKH/AABfgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAG9vAACh/wAAkv8AHND/ADb//wAz//8AM///ADP//wAz//8AM///ADP//wAz + //8AM///ADP//wAz//8AM///ADP//wAz//8AMv7/ADL9/wAx/P8AMfv/ADD6/wAw+f8AL/f/AC/4/wAt + 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 + //8AM///ADP//wAz//8AM///ADL9/wAy/P8AMfv/ADH6/wAw+f8AL/f/AC/2/wAu9P8AL/n/ACHb/wAC + m/8AAJr/AAKZ/wBPJ+UAOQA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkVAACe2gAA + mf8AApv/ACrs/wAv//8YYf//Np///zOa//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ + //8zmf//NZ3//yqH//8BM///ADL//wAz//8AM///ADP//wAz//8AM///ADP//wAy/v8AMv3/ADL8/wAx + +/8AMPn/ADD4/wAx/f8AIt7/AAOb/wAAmf8AA5r/AEY1/wBsAP8AbQDuACcAPwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABPRAAAofoAAJT/AAus/wAy+v8AL///H3H//zag//8zmf//M5n//zOZ + //8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//NJr//zOY//8KRf//AC///wAz//8AM///ADP//wAz + //8AM///ADP//wAz//8AMv7/ADL9/wAx/P8AMfv/ADT//wAj4f8AA5v/AACZ/wEEm/8QeEv/DJwI/wBl + AP8AZwD/AFoA5lBiUA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdYIAAKH/AACS/wAW + xP8AM///ATH//yR7//82oP//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5n//zOZ//8zmf//M5r//zSb + //8NS///AC///wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP+/wAy/f8ANf//ACXj/wAD + m/8AAJj/AQSa/xV8U/8awBz/CIQM/wBkAP8AagD/AFEAwQAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAYAAJi9AACd/wAAlP8AIdn/ADP//wM0//8lfP//N6D//zOZ//8zmf//M5n//zOZ + //8zmf//M5n//zOZ//8zmf//NJv//zGW//8HP///ADD//wAz//8AM///ADP//wAz//8AM///ADP//wAz + //8AM///ADP//wA2//8AJeT/AAOb/wAAmP8BBJr/GoBa/yLIKf8KhA//AGEA/wBpAP8AZQDFABMAFQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEiAACZ5QAAmf8AA5v/ACrq/wAz + //8CM///InX//zag//80m///M5n//zOZ//8zmf//M5n//zOZ//8zmf//N6H//yBy//8ALv//ADP//wAz + //8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADb//wAm5f8AA5z/AACX/wEEmv8fhmH/Ks81/w2H + FP8AYAD/AGkA/wBlAMUAHgAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABSSgAApfkAAJX/AAim/wAv9P8AM///ADD//xpm//80nP//NZ7//zOa//8zmf//M5n//zOa + //83oP//KYb//wQ3//8AMf//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8ANv//ACbl/wAD + nP8AAJf/AQWa/ySLaf8y10D/EIoY/wBgAP8AaQD/AGUAxgAeABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYHMAAKP/AACS/wANsP8AMvr/ADP//wAs + //8OTP//KIP//zSb//82n///NqD//zWd//8kev//BTr//wAv//8AM///ADP//wAz//8AM///ADP//wAz + //8AM///ADP//wA2//8AJuT/AAOc/wAAlv8BBJr/KY9x/zrfTf8UjR3/AF8A/wBpAP8AZQDFAB4AFAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAIeWAACh/wAAkv8AELf/ADL7/wA1//8ALv//ATL//w1M//8ZZP//G2f//w9P//8AMf//ADD//wAz + //8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADb//wAm5f8AA5z/AACW/wIFmv8ulXj/QudZ/xaP + Iv8AXwD/AGkA/wBkAMUAHAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAACIrAAAof8AAJL/AA+3/wAy+v8ANf//ADL//wAv + //8ALP//ACz//wAu//8AMv//ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz//8AN///ACbl/wAD + nP8AAJb/AgWa/zOZgP9K72T/GpMn/wBeAP8AaQD/AGMAxQomChQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCgAA + iLUAAKH/AACS/wAMrf8ALO//ADb//wA0//8AM///ADP//wAz//8AM///ADP//wAz//8AM///ADP//wAz + //8AM///ADX//wA1//8AIdn/AAOb/wAAl/8GC6D/OaCJ/1L3cf8cliv/AF0A/wBpAP8AZQDFABkAFAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFw0AAIisAACj/wAAlP8ABJ7/AB7S/wAy/P8ANv//ADX//wA0 + //8AM///ADP//wAz//8AM///ADT//wA2//8ANf//ACrs/wAQuP8AAJX/AACc/wABlv8RXU7/UO5u/yGb + Mv8AXQD/AGkA/wBlAMUAHgAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBgZ6iwAA + of4AAJn/AACU/wAJqv8AHdD/ACzv/wAy/v8ANP//ADX//wA1//8AM///AC71/wAi3f8AEbn/AAGa/wAA + k/8AAKD/AAmT8gBMLf8AagD/CHMM/wBkAP8AaQD/AGQAxQAbABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVkoAAJnOAACi/wAAmP8AAJP/AAKb/wAJq/8AD7j/ABK7/wAR + uv8AC67/AAOf/wAAlf8AAJX/AACe/wAAn/gAAIaWAAopJwBZAJkAbQD/AGIA/wBpAP8AZADFCScJFAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsKAABhZwAA + j8kAAKH+AACg/wAAnf8AAJb/AACW/wAAlv8AAJz/AACf/wAAov8AAJfiAAB+kxgYWDAAAAAAAAAAAAAA + AAMAVQCeAHAA/wBlAMQAHAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAADI0AABhbgAAbJ8AAI61AACPuQAAkLgAAHKkAABmfAAA + PEUZGToQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADACIAOQATAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA///////////////////////////////////////////8AP/////////////AAH////////// + //gAAH//////////AAAAAD/////////wAAAAAD////////8AAAAAAD////////AAAAAAAD///////gAA + AAAAAD//////4AAAAAAAAD/////+AAAAAAAAAD/////4AAAAAAAAAD/////gAAAAAAAAAH////8AAAAA + AAAAB/////AAAAAAAAAA/////wAAAAAAAAAf////+AAAAAAAAAP/////+AAAAAAAAD//////4AAAAAAA + AA//////wAAAAAAAAAP/////wAAAAAAAAAB/////wAAAAAAAAAAf////wAAAAAAAAAAH////wAAAAAAA + AAAB////wAAAAAAAAAAAf///4AA/MAAAAAAAP///4AP/4AAAAAAAP///8H//wAAAAAAAP///////wAAA + AAAAH///////wAAAAAAAH///////4AAAAAAAH///////4AAAAAAAA///////wAAAAAAAAH//////wAAA + AAAAAA//////gAAAAAAAAAP/////gAAAAAAAAAB/////gAAAAAAAAAAf////gAAAAAAAAAAP////wAAA + AAAAAAAH////wAAAAAAAAAAD////wAAAAAAAAAAB////wAAAAAAAAAAB////4AAAAAAAAAAA////4AAA + AAAAAAAA////8AAAAAAAAAAA////8AAAAAAAAAAA////+AAAAAAAAAAA////+AAAAAAAAAAA////+AAA + AAAAAAAA/////AAAAAAAAAAA/////AAAAAAAAAAA/////gAAAAAAAAAA/////gAAAAAAAAAB/////wAA + AAAAAAAB/////wAAAAAAAAAD/////4AAAAAAAAAP/////4AAAAAAAAA//////8AAAAAAAAH//////+AA + AAAAAAD//////+AAAAAAAAB///////AAAAAAAAA///////AAAAAAAAA///////gAAAAAAAAf//////gA + AAAAAAAf//////wAAAAAAAAf//////4AAAAAAAAP//////4AAAAAAAAP//////8AAAAAAAAP//////8A + AAAAAAAP//////+AAAAAAAAP///////AAAAAAAAP///////AAAAAAAAP///////gAAAAAAAP///////g + AAAAAAAf///////wAAAAAAAf///////4AAAAAAAf///////4AAAAAAA////////8AAAAAAB////////+ + AAAAAAA////////+AAAAAAAf////////AAAAAAAP////////gAAAAAAf////////wAAAAAAf//////// + wAAAAAA/////////4AAAAAB/////////8AAAAAD/////////+AAAAAH//////////AAAAAP///////// + /AAAAAf//////////gAAAA///////////4AAAB///////////8AAAD///////////+AAOH////////// + //wA/P////////////////// + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAC9ElE + QVQ4T52SWyzbcRTHS4R1CxtzLW1NpSslppSQucwl/EdEbQldbOYW3YSkXmauzTas5vaAtpRRvajLUJUS + zOJhF7bEbA97tIcle/w99P27/79L/N+d5Pc753e+OZ/knPPjAGDORY3jKf7y+wT1jnr3w7UaUmGvINQC + RQrmC0jWbBZJNaQQ6Xg8iRm7QSKHeSRYe51wNVy382TvP4G5ajdqie6bAbqvOmg+9EK93YamTRWq31Wj + wq5A8QKFnLe5kE+lIX4iHsJRPrjqS+Qc8GBFScaPJjD6aQyd7zvQ4mpBo6MRNWuPULVSiYpFBUrMpcib + z0f6TDrixqWI6IxkAaXWEtJ10I2O3edo3nqKuvU6vDrsYyRoDnpx334P5bZyUBYKuXPZkE3KIOgRsoBi + UxFp21Gj1dWKx2u1UC4r0bPfw0jo3u+Cgm6jzFYGylqMHFMOZDoZhL3RLCBvLp80bzXTfTehaqkKCks5 + 2neeMRLa99pRaisBZaNQaC3AbVMWkgzJEPQKWEA+DVDRQ9McaGD+voDi+SKoXWpGgnpXjcLFQsyczqBh + uwGZ5kwkGhMR9SKKBWTPZpOGjXocnh0yT1hPrVBtPvHEql0VzL8snth55kTyUjLEJjHC+8JZQIYxg9Ss + 0xNfrsTk0SSTwvGfY48/+nvk8SM/R5DoSIR4XQKhTYAgbRALSJ1OIcpVJRT0ujKMmRj6OMykz23gxwBi + HbEQbYkg2BQg3B6GAG0AC5AZbpFyupiy3IV8Og3SSSmGPg8xErQnWgjW+Ihy8sFz8RCyFYqr9mvgDnBZ + QNx4HCk0FdAf5Q5SpmSQ6hNwUy9GzHQ0+GY+IlYjEOIIRZAzEAEb/vBb9INPvw8LiBzkEbleDrkhDcn0 + jpN0SUjQSyGZEiN6LhphtnAELgbisv0KfK2+8DZ6g9PtxQLWj7cR2hnijnkpIpI+CZH0S4i4X0xEr0WE + /yaKBA8Fk4BBf+I36Eu8BryJVw/HbTqwM6UegAdyMQPnH6Gts4qCTK/wAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAABLklE + QVQ4T2P4//8/RRirICkYqyApGKsgOi6b8+J/bPN5FWxyGALYcPHMp//9yo7+14/eqI4uB2eAbCmY9uh/ + Rt+t//GtF1Fw1oTb/7Nnff+vHbEOhFFcAmcUzXjyf9nh3//n7fv7f9buv/+nbP/3v2/zv//t6//9b1z9 + /3/+3B//A5ufYhgCNyBn0r3/03f++V+x9O//4oW//+fM+fk/deq3/3ETvvyP7Pn0P7jl6X+f6hv/HfOO + gQ3BMCC1+/r/zg1//8dM+P4/rOMNCvavv/ffo+zif6e8I/8Nwxb9V/GcZoxhADCU/yu7T/qv6j3rv7r/ + IhSsGbL6v33W/v9aAQtQNKMYgA+r+s79r+E3F0MzCKNwcGGgRqyaQRhDgFSMVZAUjFWQFIxVkHj8nwEA + 06Dd9CHEi0cAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAABNklE + QVQ4T6WQu06EQBSG9w1EfQNfAeQSCBTIJVwCIVDRUFmQWK+d7VZaW9vJG/gIxtZGo4XWbrnteM7A2Z3d + jLdYfJPD/8//zzAzxti/kIsgI7uzDKlIfBckpCLxp4K2bc+KorhL0/Q6iiKFm0KBaZpzgE3MSedLnudX + WZa9x3F8HwQBs237jZtTAQROMYjz9I0lJzhzAU68IBNKPizLgnGr4EFSsMCZC0hVVZfAY5IkK9pMBV3X + 0dXX9H0/7oHQQdM0rK7rV5gVz/OeDMMYzc0NXqYgv7YI/v95WZYsDMMb3/f3ILzSdR28rQJ6wFtgHzga + hmHcA1dWHMdhGAKeNU1bqqo6mlMBAqEFsETwQNL54rruITzcMYlrUyj4CqmIYJjY9USkIvFTGJGLwsni + LEMq/h42+wTylm2njslBVgAAAABJRU5ErkJggg== + + + + + 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 + 8L+D8Bsb4cocWY3wtQAAAABJRU5ErkJggg== + + + + + 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 + vWcksHU/AAAAAElFTkSuQmCC + + + + + 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 + 3/8BjsB7Ooj7FCsAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB/klE + QVQ4T6WQ30tTUQDHz39QD0UQRlAPIkgPxh6yhCRCykGBL0WZjOytLKdl7KGHJmFYtAjH7uUWy3XvMswf + d3Ou8MdWils1ggZCRQ43lbbAwYpB4vbtnDMzrrsMw4cvB87h8/l+OQTAlqJ7ydL/7MEhGvQ9vQdZ6oLT + boVouwV7t4XFIvkFKMGB0nB23rqeX187kPl0CR/VJi5hsBh9VBo2nzuqgdPh0/gxeRhJXwWs8g3cDDSC + uH0fwKKMvIMyNI6/8DVTPT/bzh7RwAtqOWZdZWjpacZlbwOIMvIe+XweqdSCBo5HLLhqMnK4tfE4YmoV + QsIeeLp240rDXpzpPIXmfiOI7AlzAYMXo3c4PO4fpOdJzAVNXMImHyzfierK7TBU7ELlvh0Pj7XXwOSu + B+kdnsFqLo9kMo7O6xeQSMSQpZ8RDr3hktm+A6gz7IfgGoThxEX6UvgrKjAbb9eCOIemObAx6ZUcpqeC + MJ+vRWQug0B0WSNgoZJt5MnA22L4dw6LmRV8/p6l8E8Oq6FUkYCFSC8CHJKUUThcPg7bJA/uCyq6HcPr + kSeW9AXC84l/zXQ2a/7CmwuzWbNCYdGb0Bc4lLHCAtkPR6+Pw7bHdIGoXWB7GdMX2OXXtHkVS6w5WWie + XGtms0VvnMN33d/0BT2uV/xhsykSbLz4v4D8ATko6xzt+1ySAAAAAElFTkSuQmCC + + + + + AAABAAwAMDAQAAAAAABoBgAAxgAAACAgEAAAAAAA6AIAAC4HAAAYGBAAAAAAAOgBAAAWCgAAEBAQAAAA + AAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ + AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm + AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAAAAAAA//8AAP// + /wDd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d + 3d3d3d3d3d3d3d3d3d3d3d3d3d3QAAAAAADd3d3d3d3d3d3d3d3d3d3d3d0DMzMzMzMADd3d3d3d3d3d + 3d3d3d3d3dA7ODg4ODgzMADd3d3d3d3d3d3d3d3d3QO/g4ODg4ODgzMADd3d3d3d3d3d3d3d0Dv7ODg4 + ODg4ODgzMA3d3d3d3d3d3d3d07+/g4ODg4ODg4ODgzDd3d3d3d3d3d3d0/v7ODg4ODg4ODg4ODMN3d3d + 3d3d3d3d07+/g4ODg4ODg4ODg4Mw3d3d3d3d3d3d0/v7ODg4ODg4NwA4ODgzDd3d3d3d3d3d07+/g4OD + g4ODhwCDg4ODDd3d3d3d3d3d0/v7ODg4ODg4NwA4ODgzDd3d3d3d3d3d07+/g4ODg4ODhwCDg4ODDd3d + 3d3d3d3d0/v7ODg4ODg4MAA4ODgzDd3d3d3d3d3d07+/g4ODg4ODgAADg4ODDd3d3d3d3d3d0/v7ODg4 + ODg4MAAIODgzDd3d3d3d3d3d07+/g4ODg4ODhwADg4ODDd3d3d3d3d3d0/v7ODg4ODg4NwB4ODgzDd3d + 3d3d3d3d07+/g4ODg4ODhwCDg4ODDd3d3d3d3d3d0/v7ODg4ODg4ODg4ODgzDd3d3d3d3d3d078zAAAA + B3Nzg4ODg4ODDd3d3d3d3d3d0/MAi4uLcAAINzg4ODgzDd3d3d3d3d3d0zC4cAB3uLhwAIODg4ODDd3d + 3d3d3d3d0wuLMzMHi4uLhwAIODgzDd3d3d3d3d3d07i4OLMHuLi4uLiwg4ODDd3d3d3d3d3d3TuLO4MH + i4uLi4uLADgzDd3d3d3d3d3d3dO4OLMHuLi4uLi4uAODDd3d3d3d3d3d3d07O4MHi4uLi4cAO4AzDd3d + 3d3d3d3d3d3TOLMHuLi4uHAzA7gDDd3d3d3d3d3d3d3dO4MHi4uLi3A7MIuADd3d3d3d3d3d3d3dOLMD + Mzu4uHA4MLizDd3d3d3d3d3d3d3dO4MN3dMzi3A7MIuA3d3d3d3d3d3d3d3dOLMN3d3dMzA4MLg93d3d + 3d3d3d3d3d3dO4MN3d3d3dA7MDPd3d3d3d3d3d3d3d3dOLgw3d3d3dA4MN3d3d3d3d3d3d3d3d3d04uA + 3d3d3dA7MN3d3d3d3d3d3d3d3d3d07izDd3d3QO4MN3d3d3d3d3d3d3d3d3d0zuLMN3d3QuLMN3d3d3d + 3d3d3d3d3d3d3TO4swAAALi4MN3d3d3d3d3d3d3d3d3d3dOLi4uLi4uDDd3d3d3d3d3d3d3d3d3d3d0z + uLi4uLgw3d3d3d3d3d3d3d3d3d3d3d3dMzuLi4MN3d3d3d3d3d3d3d3d3d3d3d3d3TMzMz3d3d3d3d3d + 3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d + 3d3d3d3d3d3d3d3d3d3///////8AAP///////wAA////////AAD/+AD///8AAP/wAB///wAA/+AAA/// + AAD/wAAAf/8AAP+AAAAf/wAA/4AAAA//AAD/gAAAB/8AAP+AAAAD/wAA/4AAAAH/AAD/gAAAAf8AAP+A + AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/ + AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/wAAAAf8AAP/g + AAAB/wAA//AAAAH/AAD/+AAAAf8AAP/8AAAB/wAA//wAAAH/AAD//B4AA/8AAP/8H8AH/wAA//wf+A// + AAD//A/4P/8AAP/+D/g//wAA//4H8D//AAD//gPwP/8AAP//AAA//wAA//+AAH//AAD//8AA//8AAP// + 8AH//wAA///8B///AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ + AAAA//8A/wAAAAAAAAD//wAA////AN3d3dAAAAAA3d3d3d3d3d3d3d0DMzMzMwAh3d3d3d3d3d3QPzg4 + ODgzMwDd3d3d3d3dA/uDg4ODg4MzAN3d3d3d3T+/ODg4ODg4ODMN3d3d3d07+4ODg4ODg4ODMN3d3d3d + P784ODg4OAA4ODMN3d3d3Tv7g4ODg4MAg4ODDd3d3d0/vzg4ODg4ADg4OA3d3d3dO/uDg4ODgACDg4MN + 3d3d3T+/ODg4ODAACDg4Dd3d3d07+4ODg4OAAAODgw3d3d3dP784ODg4OAB4ODgN3d3d3Tv7g4ODg4MA + g4ODDd3d3d0/vwAACDg4dzg4OA3d3d3dOwC4uHAAh4ODg4MN3d3d3TC4cAeLhwAIeDg4Dd3d3d07iwdw + uLi4cAeDgw3d3d3d07g4sHuLi4uACDgN3d3d3d07O4C4uLi4t7CDDd3d3d3d0ziwi4uLhwB7CA3d3d3d + 3d07gLi4uLA4CLAN3d3d3d3dOLAzO4uAuAuDDd3d3d3d3TuA3dMzMDsIMN3d3d3d3d04sN3d3dC4Aw3d + 3d3d3d3dO4Dd3d3QOw3d3d3d3d3d3dO4Dd3d0LgN3d3d3d3d3d3Ti4Dd3QiLDd3d3d3d3d3d3Ti4AACI + uA3d3d3d3d3d3d3Ti4uLi4Dd3d3d3d3d3d3d3TO4uLMN3d3d3d3d3d3d3d3dMzM93d3d3d3d/gD///wA + D//4AAP/8AAA//AAAH/wAAA/8AAAH/AAAB/wAAAf8AAAH/AAAB/wAAAf8AAAH/AAAB/wAAAf8AAAH/AA + AB/wAAAf+AAAH/wAAB/+AAAf/wAAH/8AAB//DgA//w/gf/8P4f//h+H//4PB///AAf//4AP///AH///8 + H/8oAAAAGAAAADAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AN3d0AAAAN3d3d3d3d3d + AzMzMwAN3d3d3d3QOzg4ODMwAN3d3d3Tv4ODg4ODMw3d3d3T+zg4ODh4ODDd3d3Tv4ODg4MHg4Dd3d3T + +zg4ODcHODDd3d3Tv4ODg4AAg4Dd3d3T+zg4ODAAODDd3d3Tv4ODg4cHg4Dd3d3T+wAAODcHODDd3d3T + s4uHAIODg4Dd3d3TOHB4twA4ODDd3d3TizsLi4sAA4Dd3d3dODgIuLi4sDDd3d3d0zsLi4twewDd3d3d + 3TgDOLgICLDd3d3d3TsN0zMLC4Hd3d3d3TgN3d0IA13d3d3d3TsN3d0LDd3d3d3d3dOw3d0IDd3d3d3d + 3d07AACLDd3d3d3d3d3TuLiz3d3d3d3d3d3dMzM93d3d3fgP/7jwAf+L4AA/COAAH93gAA874AAPuOAA + D7DgAA/d4AAP0+AAD4vgAA974AAP3eAAD93gAA+48AAPCPgAD938AA/d/GAPO/x8Hwv8fH/d/jx/3f8A + f9P/gP8I/8H/3SgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA + AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAAAAAAAP//AAD///8A3dAAAN3d + 3d3dO3ODAA3d3d0/ODg3MN3d3Ttzg4CDDd3dPzg4ADgw3d07c4MAA4Dd3T84ODAIMN3dOwAAh4OA3d0w + d7gAODDd3Tswe4sAgN3d0zC4uHcA3d3dMDOLA4Dd3d0w3TMDPd3d3TAN3QPd3d3d0wAAA93d3d3dMzM9 + 3d3g/93dwB+zi8APg4PAB93dwAM4cMADADjAA93dwAOLO8ADiwDAA93d4AM4OPADuLjzB93d8c/TO/gP + i3D8H93dKAAAADAAAABgAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAJn/ + /wAAmcwAnP//AKP//wCm//8As///ALv//wC8//8Axf//AI/4/ACW/P8AjubpAJ39/wCs/P8Avvz+AMr+ + /wDR/v8A5f7/AIby+QCN9vwAk/n/AJ/6/wDZ/f8AfOz1AIPv+QCP9v8Akvj/ALb5/gDx/f4Ac+XyAH3m + 8gCI7PYAjvT/AOv8/gBu4fIAi/D/AIzy/wCG5vIAlfH/AI3m8gCu9f4A4/v+AGDZ7ABq3vIAiO7/AHC3 + xACY5vIApvH+AKPm8gDL9fwA1PX7AOD6/gDn+v0AQ8biAE3M5gCD6f8Ahev/AIbs/wCc7/8Aw/P8AOr6 + /QDs+/4AOb/fAFXP6wBl2PIAguf/AHnU6ACI6P8AdrG/AKPt/gDd9fsA5/f7AO77/gAmstkAMLncAD3A + 4gBQyewATsTlAF/R8gBk1fQAcNz5AHfg/AB02vUAfuP/AH/k/wCA5f8AYazBAHLD2AB6zOMAEKPSABCT + vgAThqwAF6HKABml0QAaqdYAHazWAB6k0AAirtkAIabSAB2QtgAlp84AK7LeADa43wA8tdwARcHpAFq8 + 3ABs2PkAWKzHAHje/wBrxeIAeuD/AHvh/wBVmK4AO11oAIfR6ACZ2OsAS2VtALXk8gDB6fUA0e/4AAOb + zgADms0AA5bIAASbzgAGnM8AB53QAAid0AAJntEACp7RAAuf0gAKkMEADZ/SAA2bywAMibcAD6HUAA+g + 0wAQodQAEqLVABCVwwATo9YAFKPWABObygAVpNcAF6XYABel1wAYpdgAG6faABun2QAans4AFoiuAB2o + 2wAdqdkAHqjbAB6q2QAfp9cAHJbDABmCpQAiqt0AIpS7ACeeyQAfdZIAMKzWACWEpAAkcIoANZa6ACp2 + kAA7pMcASsPtAEa64QA1gpwATLjcAFC95QBYy/IAN3CEAG3U+QB12/8Adtr/AHfd/wA4ZXQAfN7/AI/S + 6QCs6f8Aa46aAICmswBJXGMAY2ZnACWs3wAoreAALK/iAC2w4gAwseQAMbLkADOz5gAzs+UANbPmADW1 + 5gA6tukAOrLjAD646wBCteEAUMLyAFrA6ABiz/kAa9T8AGzT+wBv1f8Acdf/AHLY/wBpeoEAEX2rABd1 + ngBCuu0ASL3wAEu+8QBNv/IAT8H0AE/B8wBTw/YAVcT2AFXD9gBXxfgARJK2AGPN/ABly/oAac//AGrQ + /wBt0/8AW3yLAKfg+QBSW18AQ6jZAD2XxABKt+sAQaHPADyOtgA6iK0AOIClAF3H+gBfyfwAYsr9AGTL + /gBmzP8ARn+cAFN+lAAdbpoAJnWgADF0mABEl8MAUKraACBkjQB3d3cAcHBwAGxsbAACAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv7+/v7+/gICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICc6yYn6iosHe8/v4CAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgKnpEnn3dvbxr6PXqO1vP7+AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AqF+ah+45OTk5OTk4cvGloijd7z+AgICAgICAgICAgICAgICAgICAgICAgICAgICnoSMahS40NDQ0NDQ + 0NDQ0NCqaF2md/4CAgICAgICAgICAgICAgICAgICAgICAgJnj5SUahlI0tLS0tLS0tLS0tLS0s6qitW7 + /gICAgICAgICAgICAgICAgICAgICAgKBm5ubahJIsrKysrKysrLS0NKysrKysq9co+j+AgICAgICAgIC + AgICAgICAgICAgKCvb29aQk9b29vb29vb2+y4uLQsm9vb29va110/gICAgICAgICAgICAgICAgICAgKE + v7+/aRApcnJycnJycnJvzOnrz3JycnJycm2Ttf4CAgICAgICAgICAgICAgICAgKGw8PDaQYpWFhYWFhY + WFhXzOzpsVhYWFhYWFhRBP4CAgICAgICAgICAgICAgICAgKKx8fHaQ8jOjo6Ojo6Ojo6zOrsVTo6Ojo6 + OjpSBP4CAgICAgICAgICAgICAgICAgKL1tbJyj5IOzs7Ozs7OzxF4O3qVTs7Ozs7OztDBP4CAgICAgIC + AgICAgICAgICAgKM19fXqz4yLy8vLy8vLyNZ7+7tbCcvLy8vLy9DBP4CAgICAgICAgICAgICAgICAgKP + 2traqzQrJycnJycnJxcw9e/u7QwnJycnJycuBP4CAgICAgICAgICAgICAgICAgKR3NzcqzUrHBwcHBwc + HB0O9vXv7iIcHBwcHBwuBP4CAgICAgICAgICAgICAgICAgKS8PDwrjUeFxcXFxcXFxcdR/b1biMXFxcX + FxclBP4CAgICAgICAgICAgICAgICAgKU8/PzrkkeDQ0NDQ0NDQ0dR+b2RRcNDQ0NDQ0gBP4CAgICAgIC + AgICAgICAgICAgKW9PT0rjYRAwMDAwMDAwMXR9PmRQMDAwMDAwMgBP4CAgICAgICAgICAgICAgICAgKW + 5eXlrjcRBQUFBQUFBQUXWrnTWwUFBQUFBQUgBP4CAgICAgICAgICAgICAgICAgKa0tLSzEASBwcHBwcH + BwcYRrPltgcHBwcHBwchBP4CAgICAgICAgICAgICAgICAgKctLS0zB8kS0tAJCwZExIKCAgQPQgICAgI + CAgoBP4CAgICAgICAgICAgICAgICAgJkWFhTq3h2W3V4eEtLQCQ/NxkTCwoKCgoKCgoqBP4CAgICAgIC + AgICAgICAgICAgJkO0JhUKf6+srYwKDKbHV5S0BAPywTEgsLCwsxBP4CAgICAgICAgICAgICAgICAgJk + aUEM7tXU1Pf7897Z18CZna11ektLQDYTExMxBP4CAgICAgICAgICAgICAgICAgIEQQMD+Xx+fn3v4/Tw + 29jJxMCTg2V1ektLFBkzBP4CAgICAgICAgICAgICAgICAgIEOAMDWn6Kin7gsuX0897Z1sXCvZeNe2w1 + Hx94BP4CAgICAgICAgICAgICAgICAgICY0wVA4CZmX8mOnHS4/Tw29jI+Pz394gEcEp4BP4CAgICAgIC + AgICAgICAgICAgICAgJjY4O+voINHDxXsuX089zq1X6Ee9WQe2W3BP4CAgICAgICAgICAgICAgICAgIC + AgICAobDwYQDAxcmRHHS4/T71JGZlYielIQEBP4CAgICAgICAgICAgICAgICAgICAgICAonJx4otDAMN + IzxWsuX0oqS/voWkoJaBuQICAgICAgICAgICAgICAgICAgICAgICAozX14ylBAQEGhcmRHHRxqTFw4zH + xKCNAgICAgICAgICAgICAgICAgICAgICAgICApHd3JH/AgICBARMTqpRaKTJyY7ZwYcCAgICAgICAgIC + AgICAgICAgICAgICAgICApTx8ZS8AgICAgICBAQEl6TX1wSNqQICAgICAgICAgICAgICAgICAgICAgIC + AgICAmX09L+1AgICAgICAgICAqTf314CAgICAgICAgICAgICAgICAgICAgICAgICAgICAmXN0KqjAgIC + AgICAgICAqTy8V4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVrcW+Q6AICAgICAgICAqT09F4C + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgJcOjpPowICAgICAgICAqTS0ZgCAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgJcQicnZLUCAgICAgIColRWUqUCAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICYAwNFmd0AgICAgK6aC88QqwCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAk0DAwxi + puj//eaQGxcdZgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJBAwMDLUxdX0EVAwMaZgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICTQwDAwMDAwMDAwxnAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAmAtAwMDAwMDIGACAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgJgYEE5QjliogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AmJiYmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgL///////8AAP///////wAA//wP////AAD/+AD///8AAP/wAA///wAA/+AAAf// + AAD/wAAAf/8AAP+AAAAf/wAA/4AAAAf/AAD/gAAAA/8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+A + AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/ + AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP/A + AAAB/wAA//AAAAH/AAD//AAAAf8AAP/8AAAD/wAA//wAAAf/AAD//BwAD/8AAP/8H4Af/wAA//wf+H// + AAD//B/4f/8AAP/8D/h//wAA//4P+H//AAD//gfwf/8AAP//A+B//wAA//+AAP//AAD//8AA//8AAP// + 4AH//wAA///wA///AAD///gH//8AAP///g///wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAmf//AACZzACc//8Ao///AKb//wCz//8Au///ALz/ + /wDF//8Aj/j8AJb8/wCO5ukAnf3/AKz8/wC+/P4Ayv7/ANH+/wDl/v8AhvL5AI32/ACT+f8An/r/ANn9 + /wB87PUAg+/5AI/2/wCS+P8Atvn+APH9/gBz5fIAfebyAIjs9gCO9P8A6/z+AG7h8gCL8P8AjPL/AIbm + 8gCV8f8AjebyAK71/gDj+/4AYNnsAGre8gCI7v8AcLfEAJjm8gCm8f4Ao+byAMv1/ADU9fsA4Pr+AOf6 + /QBDxuIATczmAIPp/wCF6/8Ahuz/AJzv/wDD8/wA6vr9AOz7/gA5v98AVc/rAGXY8gCC5/8AedToAIjo + /wB2sb8Ao+3+AN31+wDn9/sA7vv+ACay2QAwudwAPcDiAFDJ7ABOxOUAX9HyAGTV9ABw3PkAd+D8AHTa + 9QB+4/8Af+T/AIDl/wBhrMEAcsPYAHrM4wAQo9IAEJO+ABOGrAAXocoAGaXRABqp1gAdrNYAHqTQACKu + 2QAhptIAHZC2ACWnzgArst4ANrjfADy13ABFwekAWrzcAGzY+QBYrMcAeN7/AGvF4gB64P8Ae+H/AFWY + rgA7XWgAh9HoAJnY6wBLZW0AteTyAMHp9QDR7/gAA5vOAAOazQADlsgABJvOAAaczwAHndAACJ3QAAme + 0QAKntEAC5/SAAqQwQANn9IADZvLAAyJtwAPodQAD6DTABCh1AASotUAEJXDABOj1gAUo9YAE5vKABWk + 1wAXpdgAF6XXABil2AAbp9oAG6fZABqezgAWiK4AHajbAB2p2QAeqNsAHqrZAB+n1wAclsMAGYKlACKq + 3QAilLsAJ57JAB91kgAwrNYAJYSkACRwigA1lroAKnaQADukxwBKw+0ARrrhADWCnABMuNwAUL3lAFjL + 8gA3cIQAbdT5AHXb/wB22v8Ad93/ADhldAB83v8Aj9LpAKzp/wBrjpoAgKazAElcYwBjZmcAJazfACit + 4AAsr+IALbDiADCx5AAxsuQAM7PmADOz5QA1s+YANbXmADq26QA6suMAPrjrAEK14QBQwvIAWsDoAGLP + +QBr1PwAbNP7AG/V/wBx1/8Actj/AGl6gQARfasAF3WeAEK67QBIvfAAS77xAE2/8gBPwfQAT8HzAFPD + 9gBVxPYAVcP2AFfF+ABEkrYAY838AGXL+gBpz/8AatD/AG3T/wBbfIsAp+D5AFJbXwBDqNkAPZfEAEq3 + 6wBBoc8API62ADqIrQA4gKUAXcf6AF/J/ABiyv0AZMv+AGbM/wBGf5wAU36UAB1umgAmdaAAMXSYAESX + wwBQqtoAIGSNAHd3dwBwcHAAbGxsAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgIC/v7+/v7+AgICAgICAgICAgICAgICAgICAgICAgIChzBuoaelqLW8/v4CAgICAgICAgICAgICAgIC + AgICAoeHcLjk5OTh2Maho3e8/gICAgICAgICAgICAgICAgJqhIxwuNDQ0NDQ0NDOa6Kw6P0CAgICAgIC + AgICAgICAmqZm3BIsrKysrLS5dGyss2kpuj/AgICAgICAgICAgICar6+cClvb29vb7Ku39Fvb2+vZuj+ + AgICAgICAgICAgJqxMRwKVdYWFhYVvvpU1dYWFhRBP4CAgICAgICAgICAmrHx3AYOjs7Ozty+uxVOjs7 + O1IE/gICAgICAgICAgICatfYcB4vLy8vJjDup3AmLy8vQwT+AgICAgICAgICAgJq3NxwHiMjIyMcW/Xu + bh0jIyMuBP4CAgICAgICAgICAmrw8HALFxcXFxcdc/VwDBcXFyUE/gICAgICAgICAgICavT0cDQDAwMD + Axe59kUDAwMDIAT+AgICAgICAgICAgJq5eRbEwMDAwMDIzC5dQMDAwMgBP4CAgICAgICAgICAmqysls3 + ExISEgkIPUYpEBAQECgE/gICAgICAgICAgICalhRbFu3dnhJJD82ExIRCgoKKgT+AgICAgICAgICAgJq + TlD59/f72sfKzLd5QDcZExIxBP4CAgICAgICAgICAmotItUEBO7j8NvWxJtMcHofFDME/gICAgICAgIC + AgICAmIVOJSPQm/l897YyPj31Ol6SgT+AgICAgICAgICAgICAmJiv5kgJ1bS4/Dq1IaFmIG3BAICAgIC + AgICAgICAgICAmLHvi0DHTtv5cyQvouhmYS5AgICAgICAgICAgICAgICYtnHn6k4LSFW0r7EltbAogIC + AgICAgICAgICAgICAgJi8dd3AgICpOlqlNm+vqkCAgICAgICAgICAgICAgICAmLL8aYCAgICAgKt8L/+ + AgICAgICAgICAgICAgICAgICYmtxougCAgICAq3jxf4CAgICAgICAgICAgICAgICAgICYi9Dpv8CAgIC + rXHH/gICAgICAgICAgICAgICAgICAgJiQg1BdP8CArpQO0H+AgICAgICAgICAgICAgICAgICAgJiGgM5 + 1bWwogwNpwICAgICAgICAgICAgICAgICAgICAgJiLgMMbGwDAzm6AgICAgICAgICAgICAgICAgICAgIC + AgJiYhoDAxVqRwICAgICAgICAgICAgICAgICAgICAgICAgICYmJiYgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgL//////4H///4AP//8AAf/+AAB//gAAH/4AAA/+AAAP/gA + AD/4AAA/+AAAP/gAAD/4AAA/+AAAP/gAAD/4AAA/+AAAP/gAAD/8AAA//gAAf/8AAH//AAD//w4B//8P + w///B8P//4PD//+Bg///wAf//+AH///wD////D///////ygAAAAYAAAAMAAAAAEACAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAACZ//8AAJnMAJz//wCj//8Apv//ALP//wC7//8AvP//AMX/ + /wCP+PwAlvz/AI7m6QCd/f8ArPz/AL78/gDK/v8A0f7/AOX+/wCG8vkAjfb8AJP5/wCf+v8A2f3/AHzs + 9QCD7/kAj/b/AJL4/wC2+f4A8f3+AHPl8gB95vIAiOz2AI70/wDr/P4AbuHyAIvw/wCM8v8AhubyAJXx + /wCN5vIArvX+AOP7/gBg2ewAat7yAIju/wBwt8QAmObyAKbx/gCj5vIAy/X8ANT1+wDg+v4A5/r9AEPG + 4gBNzOYAg+n/AIXr/wCG7P8AnO//AMPz/ADq+v0A7Pv+ADm/3wBVz+sAZdjyAILn/wB51OgAiOj/AHax + vwCj7f4A3fX7AOf3+wDu+/4AJrLZADC53AA9wOIAUMnsAE7E5QBf0fIAZNX0AHDc+QB34PwAdNr1AH7j + /wB/5P8AgOX/AGGswQByw9gAeszjABCj0gAQk74AE4asABehygAZpdEAGqnWAB2s1gAepNAAIq7ZACGm + 0gAdkLYAJafOACuy3gA2uN8APLXcAEXB6QBavNwAbNj5AFisxwB43v8Aa8XiAHrg/wB74f8AVZiuADtd + aACH0egAmdjrAEtlbQC15PIAwen1ANHv+AADm84AA5rNAAOWyAAEm84ABpzPAAed0AAIndAACZ7RAAqe + 0QALn9IACpDBAA2f0gANm8sADIm3AA+h1AAPoNMAEKHUABKi1QAQlcMAE6PWABSj1gATm8oAFaTXABel + 2AAXpdcAGKXYABun2gAbp9kAGp7OABaIrgAdqNsAHanZAB6o2wAeqtkAH6fXAByWwwAZgqUAIqrdACKU + uwAnnskAH3WSADCs1gAlhKQAJHCKADWWugAqdpAAO6THAErD7QBGuuEANYKcAEy43ABQveUAWMvyADdw + hABt1PkAddv/AHba/wB33f8AOGV0AHze/wCP0ukArOn/AGuOmgCAprMASVxjAGNmZwAlrN8AKK3gACyv + 4gAtsOIAMLHkADGy5AAzs+YAM7PlADWz5gA1teYAOrbpADqy4wA+uOsAQrXhAFDC8gBawOgAYs/5AGvU + /ABs0/sAb9X/AHHX/wBy2P8AaXqBABF9qwAXdZ4AQrrtAEi98ABLvvEATb/yAE/B9ABPwfMAU8P2AFXE + 9gBVw/YAV8X4AESStgBjzfwAZcv6AGnP/wBq0P8AbdP/AFt8iwCn4PkAUltfAEOo2QA9l8QASrfrAEGh + zwA8jrYAOoitADiApQBdx/oAX8n8AGLK/QBky/4AZsz/AEZ/nABTfpQAHW6aACZ1oAAxdJgARJfDAFCq + 2gAgZI0Ad3d3AHBwcABsbGwAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv7+/v7+AgICAgIC + AgICAgICAgICAgICc0enpaiwd//9AgICAgICAgICAgICAgLgfiTk5OTLyaKjd7wCAgICAgICAgICAmqJ + jBPQ0NDQ0NDja2Z0vAICAgICAgICAmqbmwhxcXFx0q7PcXFrpf0CAgICAgICAmq+vgVEREREcuqxRERE + BP4CAgICAgICAmrIxT4vLy8vbu1wLy8vBP4CAgICAgICAmrW1jQcHBwdMO9uHRwcBP4CAgICAgICAmrZ + 2UkDAwMDHPZwAwMDBP4CAgICAgICAmrLyz8GBg8GJrlFBgYGBP4CAgICAgICAmpRUR8kSzY2Eys9CAgI + BP4CAgICAgICAmpNotXVpFFwdnk/LBkSBP4CAgICAgICAmpMDo2DreTe1r+pMHpLBP4CAgICAgICAgJi + TkyWLkSy8srViIhbBP4CAgICAgICAgICAmq/QhYmcuKXvpCbjQICAgICAgICAgICAq3JrAJOTk9M1paW + AgICAgICAgICAgICAmzfsAICAgJq358CAgICAgICAgICAgICAmxUp7wCAgLpzqwCAgICAgICAgICAgIC + AgJiJay8/f1qWKwCAgICAgICAgICAgICAgJiLS2nbKUaLbkCAgICAgICAgICAgICAgICYmIDIAMaqQIC + AgICAgICAgICAgICAgICAgJiYmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC////Av4P + /xX8Af9C+AB/3vAAH/fwAA9K8AAPAvAADwLwAA8C8AAPYvAADyDwAA/j8AAPhvAAD7f4AA8C/gAfAv4g + PwL+PH8C/hx/Lf8Af2//AH++/4D/hP/h/wL///8CKAAAABAAAAAgAAAAAQAIAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8AAAAAAJn//wAAmcwAnP//AKP//wCm//8As///ALv//wC8//8Axf//AI/4 + /ACW/P8AjubpAJ39/wCs/P8Avvz+AMr+/wDR/v8A5f7/AIby+QCN9vwAk/n/AJ/6/wDZ/f8AfOz1AIPv + +QCP9v8Akvj/ALb5/gDx/f4Ac+XyAH3m8gCI7PYAjvT/AOv8/gBu4fIAi/D/AIzy/wCG5vIAlfH/AI3m + 8gCu9f4A4/v+AGDZ7ABq3vIAiO7/AHC3xACY5vIApvH+AKPm8gDL9fwA1PX7AOD6/gDn+v0AQ8biAE3M + 5gCD6f8Ahev/AIbs/wCc7/8Aw/P8AOr6/QDs+/4AOb/fAFXP6wBl2PIAguf/AHnU6ACI6P8AdrG/AKPt + /gDd9fsA5/f7AO77/gAmstkAMLncAD3A4gBQyewATsTlAF/R8gBk1fQAcNz5AHfg/AB02vUAfuP/AH/k + /wCA5f8AYazBAHLD2AB6zOMAEKPSABCTvgAThqwAF6HKABml0QAaqdYAHazWAB6k0AAirtkAIabSAB2Q + tgAlp84AK7LeADa43wA8tdwARcHpAFq83ABs2PkAWKzHAHje/wBrxeIAeuD/AHvh/wBVmK4AO11oAIfR + 6ACZ2OsAS2VtALXk8gDB6fUA0e/4AAObzgADms0AA5bIAASbzgAGnM8AB53QAAid0AAJntEACp7RAAuf + 0gAKkMEADZ/SAA2bywAMibcAD6HUAA+g0wAQodQAEqLVABCVwwATo9YAFKPWABObygAVpNcAF6XYABel + 1wAYpdgAG6faABun2QAans4AFoiuAB2o2wAdqdkAHqjbAB6q2QAfp9cAHJbDABmCpQAiqt0AIpS7ACee + yQAfdZIAMKzWACWEpAAkcIoANZa6ACp2kAA7pMcASsPtAEa64QA1gpwATLjcAFC95QBYy/IAN3CEAG3U + +QB12/8Adtr/AHfd/wA4ZXQAfN7/AI/S6QCs6f8Aa46aAICmswBJXGMAY2ZnACWs3wAoreAALK/iAC2w + 4gAwseQAMbLkADOz5gAzs+UANbPmADW15gA6tukAOrLjAD646wBCteEAUMLyAFrA6ABiz/kAa9T8AGzT + +wBv1f8Acdf/AHLY/wBpeoEAEX2rABd1ngBCuu0ASL3wAEu+8QBNv/IAT8H0AE/B8wBTw/YAVcT2AFXD + 9gBXxfgARJK2AGPN/ABly/oAac//AGrQ/wBt0/8AW3yLAKfg+QBSW18AQ6jZAD2XxABKt+sAQaHPADyO + tgA6iK0AOIClAF3H+gBfyfwAYsr9AGTL/gBmzP8ARn+cAFN+lAAdbpoAJnWgADF0mABEl8MAUKraACBk + jQB3d3cAcHBwAGxsbAACAgICAgICAgICAgICAgICAgICAgL9/f39AgICAgICAgICAgKKjIyMtej+AgIC + AgICAgJqij7S0oyM7ugCAgICAgICar0HclavbYmr/gICAgICAmrDKy8v4EUvBP4CAgICAgJqyz4XF25w + DQT+AgICAgICatE2CBBbKAUE/gICAgICAmquR7fnehk0ff4CAgICAgICYuDui4zWdgT+AgICAgICAgJi + jLGx7vV8AgICAgICAgICYrwCAmykcwICAgICAgICAmK8AgJsc2ICAgICAgICAgJiLry8QnMCAgICAgIC + AgICAmItGi1iAgICAgICAgICAgICYmJiAgICAgIC//8E/vh/AgLwHwIC4A9RH+AHNjbgBz0I4AcE/uAH + AgLgBwIC8Aei1fgPUXD5jz8s+Y8E/vgfAgL8HwIC/j8OjSgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAEAAAABkAAAAfAAAAHwAAABkAAAAWAAAAEQAAAAkAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAlAAAATAAAAGQAAABwAAAAbgAAAGQAAABcAAAAUgAA + AEEAAAAxAAAAJAAAABkAAAAOAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAAC0AZYaqAGGBywB9p+kAdJvmAFt61wBc + e9QASWLIACk3sgAAAJgAAACLAAAAeQAAAGQAAABNAAAANwAAACcAAAAZAAAACgAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAANAB5ocowrNb/3/L5/6fg + +f9VxPX/T8Hy/0/B8v81teb/KK7f/xSj1v8Ae6TuAGKD3gA+U8QADxSkAAAAkAAAAHwAAABiAAAARAAA + ACsAAAAXAAAACQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAJTFDAISw3QSb + zv8+tNr/8P///67o//9q0P//atD//2rQ//9q0P//atD//2rQ//9jzfz/UMLy/zW15v8bp9n/AIKu8wBi + g94AKDW5AAAAlwAAAH8AAABfAAAAPQAAAB8AAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3 + SS0Ai7rkDJ/S/xOi1f89tdv/5P///6rq//9v1f//b9X//2/V//9v1f//b9X//2/V//9v1f//b9X//2/V + //9v1f//b9X//0zC7/8qsN//B4689wBZd9sAHCWyAAAAjwAAAGoAAAA/AAAAHAAAAAcAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAKVxtcUo9b/GKXY/xil2P87tdz/2P///6bs//9y2P//ctj//3LY//9y2P//ctj//3LY + //9y2P//ctj//3LY//9y2P//ctj//3LY//9y2P//a9T8/0jB7P8OodL/AGqO5QAbJLYAAACPAAAAZAAA + ADMAAAAQAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAid0P8eqNv/Hqjb/x6o2/86tt3/zP///6Ht//912///ddv//3Xb + //912///ddv//3Xb//912///ddv//3PZ//9u1P//ctj//3Xb//912///ddv//3Xb//912///WMvy/w+i + 0v8AYYLhAA4TrAAAAH4AAABGAAAAFwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAme0f8lrN//Jazf/yWs3/84t97/u////5zv + //943v//eN7//3je//943v//eN7//3je//943v//eN7//3Ta//9ly/r/Zcv6/27U//902v//eN7//3je + //943v//eN7//3je//9EwOn/CI+89wAmM8AAAACOAAAATAAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuf0v8sr+L/LK/i/yyv + 4v83uN7/rv///5fw//974f//e+H//3vh//974f//e+H//3vh//974f//e+H//3je//9cv+v/QqfX/0q3 + 6/9s0/v/e+H//3vh//974f//e+H//3vh//974f//bNj5/xen1v8AO0/OAAAAfwAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2f + 0v8zs+b/M7Pm/zOz5v81ud//o////5Py//+A5f//gOX//4Dl//+A5f//gOX//4Dl//+A5f//gOX//3/k + //9cv+v/QaDO/0Op2v9t1Pn/gOX//4Dl//+A5f//gOX//4Dl//+A5f//gOX//2DS8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAA+g0/86tun/Orbp/zq26f83ueD/nf3//470//+D6f//g+n//4Pp//+D6f//g+n//4Pp + //+D6f//g+n//4Pp//9cv+v/P5jE/0Gh0P902vX/g+n//4Pp//+D6f//g+n//4Pp//+D6f//g+n//2LV + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABCh1P9Buez/Qbns/0G57P9Bt+D/wPP8/6Lv/f+F6///hev//4Xr + //+F6///hev//4Xr//+F6///huz//3jY7v9Dk7f/PI62/z+YxP902vX/hev//4Xr//+F6///hev//4Xr + //+F6///hev//2TX8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKi1f9IvfD/SL3w/0i98P9DueH/xfP8/6bx + /v+I7v//iO7//4ju//+I7v//iO7//4ju//+I7v//jfP//2Gswf84gKP/Ooit/zyOtv9Yttb/jfP//4ju + //+I7v//iO7//4ju//+I7v//iO7//2bZ8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSj1v9PwfT/T8H0/0/B + 9P9GuuL/y/X8/6z0/v+M8v//jPL//4zy//+M8v//jPL//4zy//+M8v//k/n//3C3xP9Gf5z/OICj/zqI + rf88jrb/kvb6/4zy//+M8v//jPL//4zy//+M8v//jPL//2nc8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWk + 1/9Tw/b/U8P2/1PD9v9Ju+P/0fb8/6/2/v+P9v//j/b//4/2//+P9v//j/b//4/2//+P9v//kfj//47m + 6f9UfpP/Rn+c/ziAo/86iK3/iOz2/4/2//+P9v//j/b//4/2//+P9v//j/b//2vf8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABel2P9dx/r/Xcf6/13H+v9NvOT/1ff8/7T4/v+T+f//k/n//5P5//+T+f//k/n//5P5 + //+T+f//k/n//5H4//9zsb7/VH6T/0Z/nP9YrMf/jvT//5P5//+T+f//k/n//5P5//+T+f//k/n//27h + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABml2P9ky/7/ZMv+/2TL/v9QveX/2vf8/7f6/v+W/P//lvz//5b8 + //+W/P//lvz//5b8//+W/P//lvz//5L4//94tMH/XnyL/1F+lf940ub/k/n//5b8//+W/P//lvz//5b8 + //+W/P//lvz//3Hj8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqm2f9mzP//Zsz//2bM//9SvuX/3/j9/7z8 + /v+Z////mf///5n///+Z////mf///5n///+Z////mf///5P5//94r73/aXqB/158i/960eT/mf///5n/ + //+Z////mf///5n///+Z////mf///3Pm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABun2f9t0///bdP//23T + //9VwOX/5vr9/8D8/v+c////nP///5z///+c////nP///5z///+c////nP///5P3//93w9z/cY+b/2l6 + gf96zOH/nP///5z///+c////nP///5z///+c////nP///3Xm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2p + 2f9z2f//c9n//3PZ//9YweX/7Pv+/8j9/v+m////pv///6b///+m////pv///6b///+m////pv///5/6 + //+I6P//dtr//27U//983v//pv///6b///+m////pv///6b///+m////pv///33m8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAB6q2f933f//d93//3fd//9aw+X/8fz+/+v8/v/u+/7/7vv+/+z7/v/q+/7/4vv+/9r7 + /v/Q/P7/yf3+/73+//+z////s////6n5//+b7///s////7P///+z////s////7P///+z////s////4bm + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACCs2f+A5f//gOX//3Dc+f9Gut//uOTy/5nY6/96y+X/iNHo/7Tj + 8v+z4/L/7vv+/+77/v/t+/7/6/v+/+n6/f/n+v3/2fv+/9D9/v/D/v//vP///7z///+8////vP///7z/ + //+8////vP///43m8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKu2f+G7P//U8zs/xqp1v9OxOX/NZa//0OY + wf9ElsT/RLLk/0u+8f8usOP/Iqrd/0C13/9Zvt//htDo/8Hp9f/u+/7/7fv+/+z7/v/q+v3/4/v9/9P9 + /v/J/v//xv///8b////G////xv///5Tm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOv2f80ud//Ob/f/4/4 + /P89haf/F3Ke/xF9q/8Rfav/IHGd/1Gq2v9ky/7/VcP2/02/8v9HvO//LbDi/x2o2v8fp9f/TLjc/4bQ + 6P/Q7/j/7vv+/+77/v/s+/7/4Pz+/9L////P////z////5vm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ + zP85v9//mf///5n///8xdJj/AprN/wWbzv8Em87/A5bI/zV9p/9pz///Zsz//17I+/9PwPP/S77x/z64 + 6/8zs+X/LbDi/xek1/8KntH/H6bT/4jR6P/S7/j/7/v+/+77/v/l/f7/2v///6Pm8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACXyrFDxuL/mf///5n///9sw9P/BZvO/w+g0/8PoNP/BJvO/0SRtf923P//bdP//2fN + //9ky/7/VcP2/02/8v9Fu+7/NbTm/zGy5P8lrN7/G53P/xKUxf8Dm87/XL/f/9bx+P/z/f7/8fz+/7Dl + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlsiSJrPZ/4by+f+Z////B53Q/x2o2/8dqNv/BpzP/4vx + //+D6P//euD//3LY//9pz///Zsz//17I+/9PwPP/S77x/zqy4/8mdaD/IGSN/xpumv8dbJb/Dom5/wCZ + zP9rxeL/5/f7/7jk8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJTGQgCYyuFNzOb/Cp7R/yit + 4P8nreD/CZ7R/5f9//+P9f//h+z//3/k//923P//bdP//2fN//9ky/7/VcP2/zqVxP8Xcp7/BJvO/wuf + 0v8Dms3/FXWi/xWazP8Dm87/IKbS/4/S6f8Amcz/AAAAfQAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAlshiDZ/S/zOz5v8wseT/DJ/S/5n///+Z////k/n//4vw//+C5///euD//3LY//9pz///Zsz//06p + 2f8Rfav/FqTX/x2o2/8bp9r/CYu7/xyVxf8Ypdj/C5/S/wCZzP8Amcz/AAAAUgAAABEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAD6HU/z646/86tun/D6DT/2DZ7P+P+fz/mf///5f9//+O9P//huz//37j + //912///bdP//2bM//8mns//MKzW/yuv4v8oreD/CpDB/y+o2f8iqt3/GqbZ/wid0P8AQFWaAAAAKAAA + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEqLV/0m98P9JvfD/EqLV/wBxltgAlsj0MLnc/1bS + 6f987PX/k/n//4rw//+C5///et///3HX//81teb/MKzW/zWz5v8zs+b/EqLV/zq26P8zs+X/Iqrd/wCP + vu8AAABBAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqTX/1XE9/9Uw/b/FaTX/wAA + AJIAAAA1AJDAVQCTxJUAlMbFAJnM/yWx2f89wOL/ScXp/17Q8v8sst//MKzW/z646/8+uOv/E6PW/02/ + 8v8wseT/A5fJ9QBNZ18AAAASAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGaXY/1/J + /P9fyfz/GKXY/wAAAJwAAABJAAAADAAAAAAAAAAAAAAAAACUxkIAkcJ2AJHBlwCUxcYAlMbmMKzW/0m9 + 8P9JvfD/AJnM/wCOvvAAibbEAFh1OAAAAAoAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAB5vN42bM//9mzP//La/i/wAzRMAAAABnAAAAHAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAjLqMMKzW/1fF+P9Wxfj/AHyl7AAAAHcAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAJTGtWLP+f9w1v//TMLv/wBiguAAAACKAAAAOQAAAAcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAjLqMMKzW/2LK/f9fyfz/AHyl7AAAAHcAAAAjAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJTFdEXB6f963///ed7//w+ayfsADhOtAAAAZwAA + ACEAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAi7mNMKzW/2bM//9mzP//AHyl7AAAAHQAAAAiAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJDAERCj0v+D6P//g+j//1DJ + 7P8AYYLhAAAAlwAAAFIAAAAYAAAAAwAAAAAAAAAAAAAAAAAAAAMAg6+VMKzW/3PZ//9x1///AH2m6gAA + AGsAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACW + yKJY0ez/jPL//4zy//8jr9n/ADxQzAAAAI4AAABPAAAAHgAAAAcAAAABAAAAAwAAABYAj77ed+D8/33i + //9l1PX/AG6S3QAAAFsAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACQwBEKn87wj/n8/5f9//+N9vz/HqXM+wAxQsgAAACUAAAAZAAAAD0AAAAtAAAAMgBN + Z38rtNz/ie///4fs//9TzOz/AGGCygAAAEEAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlshiMLnc/5n///+Z////j/n8/x2s1v8AWXbcAA4TrQAA + AJQAAACIADpOqQqax/mD7/n/k/n//5L4//8tttz/ADRGjAAAACQAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJbIojm/3/+Z////mf///5n/ + //9g2ez/JrPZ/wqQvPcTn8n7Ob/f/4by+f+Z////mf///3zs9f8Agq3iAAAAQQAAAA0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACW + yJIwudz/j/n8/5n///+Z////mf///5n///+Z////mf///5n///+Z////j/n8/x6nzvgAQVdwAAAAGAAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAlMVTCp/O8GDZ7P+Z////mf///5n///+Z////mf///5n///9z5vL/E6LN9gBr + j4kAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJDAEQCVx4MKn87wOb/f/03M5v9W0un/Tczm/x2s + 1v8Ai7rSAGGBTAAAAA0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8zl/3/M + 5f9/zOX/f8zl/wBNZkAAAAAOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP/w + A////wAA/+AAH///AAD/gAAD//8AAP8AAAB//wAA/wAAAB//AAD/AAAAB/8AAP8AAAAD/wAA/wAAAAH/ + AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8A + AAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/ + AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP+AAAAB/wAA/8AAAAH/AAD/8AAAAf8AAP/4 + AAAB/wAA//gAAAP/AAD/+AAAA/8AAP/4DgAH/wAA//gH4D//AAD/+AfgP/8AAP/4A+A//wAA//gBwD// + AAD//AAAP/8AAP/8AAA//wAA//4AAD//AAD//wAAf/8AAP//gAB//wAA///AAP//AAD//+AB//8AAP// + /Af//wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA0AAAAeAAAAJgAAACUAAAAiAAAAHwAA + ABYAAAAMAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAQQAAAGwAAAB9AAAAegAA + AHYAAABuAAAAXgAAAEcAAAAzAAAAJQAAABkAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHQBAVXNapr/iT6zO9RuJ + s+0bibPsDnuh5wBbetcANEa8AAAAmwAAAI4AAAB8AAAAYgAAAEQAAAAqAAAAFQAAAAcAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAZIaTBZbH+G/J + 5f+y6P//a9H//2vR//9r0f//ZM38/0rA7/82tub/HJK78wBig94AKDW5AAAAlwAAAH4AAABaAAAANAAA + ABYAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHmieQyf + 0v8TotX/b8nl/6rq//9w1v//cNb//3DW//9w1v//cNb//3DW//9w1v//adL8/0fA7P8emsb3AFBq1gAO + E6kAAACFAAAAWQAAACoAAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABAs9n/Hajb/x2o2/9vyeX/oO3//3Xb//912///ddv//3Xb//912///c9n//23T//9x1///ddv//3Xb + //9m0/n/LqzV+wBQatcAAACgAAAAdQAAADoAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAECz2f8oreD/KK3g/2/J5f+Y7///ed///3nf//953///ed///3nf//923P//VLvs/1nD + 9f9y2P7/ed///3nf//953///W87y/xCMtPMADhK0AAAAdgAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQLPZ/zOz5v8zs+b/b8nl/5Hy//+A5f//gOX//4Dl//+A5f//gOX//37k + //9Pr9r/Q6ve/3DY+v+A5f//gOX//4Dl//+A5f//YNLy/wCZzP8AAACPAAAALwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAs9n/Orbp/zq26f9vyeX/nff+/4Xq//+F6v//her//4Xq + //+F6v//fuL5/0Wcw/9Ansv/dNr1/4Xq//+F6v//her//4Xq//9j1vL/AJnM/wAAAI8AAAAvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f9JvfD/Sb3w/2/J5f+18v3/ie///4nv + //+J7///ie///4vx//9lu9D/Ooes/z2Su/9oyOL/ivD//4nv//+J7///ie///2fa8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQLPZ/1TD9v9Uw/b/b8nl/7z1 + /f+O9P//jvT//470//+O9P//j/X//37O1/9AgJ//Ooit/1Suzf+R9///jvT//470//+O9P//at3y/wCZ + zP8AAACPAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAs9n/W8f6/1vH + +v9vyeX/xPf9/5P5//+T+f//k/n//5P5//+T+f//kvj//2GTpf9AgJ//aMPb/5L4//+T+f//k/n//5P5 + //9u4fL/AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz + 2f9mzP//Zsz//2/J5f/L+v7/mf///5n///+Z////mf///5n///+U+f//bZak/1h9kP991+b/mf///5n/ + //+Z////mf///3Pm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQLPZ/23T//9t0///c8rl/9P7/v+Z////mf///5n///+Z////mf///5D2//9yr8b/aIyc/4Lb + 6f+Z////mf///5n///+Z////c+by/wCZzP8AAACPAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABAs9n/dtz//3bc//94yuX/5vz+/879/v/M/f7/yv3+/8r9/v+7/v//sf///5ry + //+I5v//lO7//63///+t////rf///63///+C5vL/AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f+A5f//YNLy/1y/3/+Dx+D/jNTv/5fX6/+14/L/3/X7/+z7 + /v/p+/3/4Pv9/9P8/v/K/f7/v////73///+9////vf///47m8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQLPZ/z3A4v9MxuH/LnGY/xpumv8gcZ3/T6nZ/1DB + 9P86tun/PrXi/1vA4/+L0ur/wun1/+37/v/o+/7/2/z+/87+///M////meby/wCZzP8AAACPAAAALwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlsjDYNns/4rr8P8Teab/AJnM/wCZ + zP8uh7P/aM7//17I+/9PwPP/Qrrs/zOz5f8gqdz/KqvY/2vF4//T8Pj/8Pz+/+X9/v+l5fL/AJnM/wAA + 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 + fKMdXwAAAABJRU5ErkJggg== + + + + + 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 + dwD1s6oA8cWxAPLItQDyybcA9Mm6APPMugDzzb0A/9XMAPrbvwD73MIA+93DAPvexgD738YA+9/HAPvg + yQD74coA/OHKAPzhywD84swA++LNAPvjzgD85M8A/OTQAPzk0QD85dEA/OXTAPzm0wD85tQA/ObVAP3n + 1gD86NcA/OjYAP3p2AD96dkA/OraAP3q2gD869wA/ezeAP3t4QD97uIA/e/iAP3w5QD98eYA/fHnAP7y + 6QD98+sA/fPsAP717QD+9u4A/vjxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARERERERE + AAAAAAAAAABEREREREREAQ4MCgkHBQQAREREREREAAgnJCAdGxoTAEREREREAQ4LLCklIR4cFABERERE + AAgnDzIuKiYiHxUAREREAQ4LLA82My8rJyMXAERERAgnDzIPODc0MCwoGABEREQLLA82Dzs5NzUxLRYA + REREDzIPOA8+PDoZGRIDAERERA82DzsPQT89BgYCAEREREQPOA8+D0NCQA8RAEREREREDzsPQQ8PEA0P + AERERERERA8+D0NCQA8RAEREREREREQPQQ8PEA0PAERERERERERED0NCQA8RAERERERERERERA8PEA0P + AERERERERERERPwDAAD4AwAA8AMAAOADAADAAwAAgAMAAIADAACAAwAAgAMAAIAHAACADwAAgB8AAIA/ + AACAfwAAgP8AAIH/AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABiMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2uMhsNogAAAHgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAArntu/8yhmf/Jnpf/xpyW/8SZlf/BlpP/tpGL/7iOi/8zGw2hAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABiMxoNr8+cgP/85M///OLM//vgyf/73sb/+9zC//rbv//xxbH/MxoNrwAA + AAAAAAAAAAAAAAAAAAAAAAAArntu/8yhmf/VooP//ObT//zk0f/74s3/++HK//vfxv/73cP/8si1/zMa + Da8AAAAAAAAAAAAAAAAAAABiMxoNr8+cgP/85M//3KmH//3p2P/85tX//OXR//vjzv/84cr/+9/H//LJ + t/8zGg2vAAAAAAAAAAAAAAAArntu/8yhmf/VooP//ObT/9yph//869z//enZ//3n1v/85dP//OTP//zh + y//zzLr/MxoNrwAAAAAAAAAAAAAAAM+cgP/85M//3KmH//3p2P/cqYf//e3h//3s3v/86tr//OjX//zm + 0//85ND/8829/zUbD6oAAAAAAAAAAAAAAADVooP//ObT/9yph//869z/3KmH//3w5f/97uL//eze//3q + 2v/86Nj//ObU//TJuv86IBGZAAAAAAAAAAAAAAAA3KmH//3p2P/cqYf//e3h/9yph//+8un//fHm//3v + 4v//1cz//9XM//Wzqv+peGzgAAAAdAAAAAAAAAAAAAAAANyph//869z/3KmH//3w5f/cqYf//vXt//3z + 6//98ef/96ZD//emQ//fkT//RysakQAAAEgAAAAAAAAAAAAAAADcqYf//e3h/9yph//+8un/3KmH//74 + 8f/+9u7//fPs/9yph//psnX/Y0Mu3gAAAGQAAAAlAAAAAAAAAAAAAAAA3KmH//3w5f/cqYf//vXt/9yp + h//cqYf/3quI/9ajhP/cqYf/b004pAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAANyph//+8un/3KmH//74 + 8f/+9u7//fPs/9yph//psnX/Y0Mu3gAAAGQAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAADcqYf//vXt/9yp + h//cqYf/3quI/9ajhP/cqYf/b004pAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3KmH//74 + 8f/+9u7//fPs/9yph//qs3b+aEgywgAAAGQAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyp + h//cqYf/3quI/9ajhP/cqYf/AAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwH + AAD4AwAA8AMAAOADAADAAwAAgAMAAIADAACAAwAAgAcAAIAHAACADwAAgB8AAIA/AACAfwAAgP8AAIP/ + AAAoAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgADAwMAA////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiIiIiIiIiIiIAAAAAAAABMzMzMzMzMzMyAAAAAAAAATMzMzMz + MzMzMgAAAAAAEiEzMzMzMzMzMzIAAAAAABMxMzMzMzMzMzMyAAAAAAATMTMzMzMzMzMzMgAAAAEiEzEz + MzMzMzMzMzIAAAABMxMxMzMzMzMzMzMyAAAAATMTMTMzMzMzMzMzMgAAAAEzEzEzMzMzMzMzMzIAAAAB + MxMxMzMzMzMzMzMyAAAAATMTMTMzMzMzMzMzMgAAAAEzEzEzMzMzMzMzMzIAAAABMxMxMzMzMzMzMzMy + AAAAATMTMTMzMzMzMzMzMgAAAAEzEzEzMzMzMzMzMzIAAAABMxMxMzMzMzMzMzMyAAAAATMTMTMzMzMz + MxAAAAAAAAEzEzEzMzMzMzMTMhAAAAABMxMxMzMzMzMzEyEAAAAAATMTMTMzMzMzMxIQAAAAAAEzEzEz + MzMzMzMRAAAAAAABMxMxMzMzMzMzEAAAAAAAATMTMRERERERERAAAAAAAAEzEzMzMzMzMRAAAAAAAAAB + MxMzMzMzMzEAAAAAAAAAATMRERERERERAAAAAAAAAAEzMzMzMzMRAAAAAAAAAAABMzMzMzMzEAAAAAAA + AAAAARERERERERAAAAAAAAAA//////+AAAf/gAAH/4AAB/wAAAf8AAAH/AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAP4AAAH+AAAD/gAAB/4AAA/+AA + Af/gAAP/4AAH/+AAD//gAB//4AA//+AAf/8oAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAAA + AAAAAAAAZmZmANWCNQDeizYAy49TAOeVOAC7im4A/KIiANaPgwDuoUcA15KEAMOSiwDLmXMA0JxoAMOT + jADVk4YA1pOHAP+pMQDFlYwA2JWJAMaWjACqmpAA+JqaANGjkwD+tVQA1aWZAPahogDMrYoA/71gAM2x + qAD3rKwA5baRAPezswDcu6QA372lAOvAngDWvrAA4sCmAOTBqADYwLIA5sKpANrCswDnxKsA/86FANzE + tADrx6gA6sesAN7GtgD/zJkA38e3AOzKrgDiyrkA7cyvAO/NsQDkzLkA5s27AO3QrwDx0LIA7tGwAP/Y + lgDp0b4A/tWsAP3SvwDs1MAA+te6AO7WwgD62LwA8NjDAPrZvQD62b4A+9m+APLZxQD72r8A/du7APrb + wAD728AA+9vBAPrcwgD73MIA+tzDAPvcwwD03McA+93DAPvdxAD73cUA9t3HAPvexQD73sYA+97HAPvf + xgD738cA+9/IAPvgyAD74MkA/ODJAPvgygD84MoA+eHKAPvhygD74csA/OHLAPviywD84swA++LNAPzi + zQD84s4A/OPNAPvjzgD8484A/OPPAPzkzAD749AA++TPAPzkzwD75NAA/OTQAPzk0QD75dEA/OXRAPzl + 0gD85dMA4uPjAPzm0gD85tMA/ObUAOPk5AD85tUA/ufSAPzn0wD859QA/OfVAPzn1gD959YA/OfXAPzo + 1gD86NcA/OjYAPzo2QD96dcA/enYAObn5wD86dkA/enZAP3q2QD86toA/eraAPzq2wD96tsA/evbAOjp + 6QD869wA/evcAP3r3gD97NwA/ezdAPzs3gD97N4A/ezfAOrr6gD97d8A/e3gAP3t4QDs7OwA/e7hAP3u + 4gD97uMA/e/iAP3v4wD97+QA/e/lAO7u7wD98OQA/fDlAP3w5gD+8eYA/vHnAO/w8AD98ucA/fLoAP7y + 6AD+8ukA/fPpAP7z6QD98+oA/vPqAPHy8gD99OsA/vTrAPLz8wD+9OwA/fXsAP317QD+9e0A9PT0AP71 + 7gD+9u8A9fb2APb29gD+9/AA/vfxAP/38QD++PIA/vjzAP/48wD3+PcA/vn0AP/59QD5+fkA//r2APv7 + +wD8/PsA/f39AP/+/QD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAANXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1QAAAAAAAAAA + AAAAAAAAAAAAAADV1dXV1dXV1dXV1dUWGBMRDQoKCgoKCgoKCgoKCg0SANXV1dXV1dXV1dXV1Rw9PT09 + PT09PT09PT09PT09Lw8A1dXV1dXV1dXV1QAAI5RsamViXFlWU1JNSkdEQz89DgDV1dXV1dXV1dUWGBMm + nXVyamdjXFtZVlJNS0dFQT0OANXV1dXV1dXV1Rw9PSide3ZxbGplY11ZVVNOTEpHPQ4A1dXV1dXV1QAA + I5RsK6GCe3l1b2hlY15bVlNRTEk9DgDV1dXV1dUWGBMmnXUuoYeCe3d2cm9pZV5bWVZSTz0OANXV1dXV + 1Rw9PSidezCpkIeFgX93dWxrZWJfWlhVPQ4A1dXV1dXVI5RsK6GCMq+TkY2Hgnt3dXJrZ2RfWlc9DgDV + 1dXV1dUmnXUuoYc1uJqYkoyKhoB7dHNwZmVhXD0OANXV1dXV1SidezCpkDa4n5qZk4+MhoF7enNua2Zj + PQ4A1dXV1dXVK6GCMq+TO7ulopyblo+NjIJ9enVya2Y9DgDV1dXV1dUuoYc1uJo7wKeko56blZOOh4WB + e3ZzcD0OANXV1dXV1TCpkDa4nz7Draumo6CcmZGPiImDe3Z0PQ4A1dXV1dXVMq+TO7ulQMSzrqyqpqKc + m5aRjYeCgHo9DgDV1dXV1dU1uJo7wKdCy7m0saynpqKem5qSjYeEgT0PANXV1dXV1Ta4nz7DrUbLv7q1 + sa2rpqOfnpqWkIyGPQcA1dXV1dXVO7ulQMSzUM7Bv723s7Ctp6Win5cfHRkVCQDV1dXV1dU7wKdCy7lU + 0MbCwby3tLKtqKaiHggEAgEFANXV1dXV1T7DrUbLv2DRysjFwb+5t7Kwq6ciGxAGAwDV1dXV1dXVQMSz + UM7BZNLNzMjGwr+8trSuqywqFwwA1dXV1dXV1dVCy7lU0MZt08/PzMnHwr6+trSuNzoLANXV1dXV1dXV + 1UbLv2DRyn7Uw8C4r6mhnZSLfHg5GgDV1dXV1dXV1dXVUM7BZNLNPEg4NDMxLSknJSQhICcU1dXV1dXV + 1dXV1dVU0MZt08/PzMnHwr6+trSuNzoLANXV1dXV1dXV1dXV1WDRyn7Uw8C4r6mhnZSLfHg5GgDV1dXV + 1dXV1dXV1dXVZNLNPEg4NDMxLSknJSQhICcU1dXV1dXV1dXV1dXV1dVt08/PzMnHwr6+trSuNzoLANXV + 1dXV1dXV1dXV1dXV1X7Uw8C4r6mhnZSLfHg5GgDV1dXV1dXV1dXV1dXV1dXVPEg4NDMxLSknJSQhICcU + 1dXV1dXV1dXV1dXV1dX//////8AAB/+AAAf/gAAH/gAAB/wAAAf8AAAH8AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAP4AAAH+AAAD/gAAB/4AAA/+AA + Af/gAAP/4AAH/+AAD//gAB//4AA//ygAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAIQAAADwAAAA8AAAAPAAA + ADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAOwAAADgAAAAxAAAAIQAA + AA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAABOMxoNjDMa + DYwzGg2MMxoNjDMaDYwzGg2MMxoNjDMaDYwzGg2MMxoNjDMaDYwzGg2MMxoNjDMaDYwzGg2LNBsNhQAA + AHMAAABNAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzZuK69Kf + k/DFlIr6xJOK+sKRifrCkIn6wpCJ+sKQifrCkIn6wpCJ+sKQifrCkIn6wpCJ+sKQifrCkIn6wpCJ+sKQ + ifrCkIn515KG+AAAAHMAAAAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAIQAA + ADzNsaj//dK///3Sv//90r///dK///3Sv//90r///dK///3Sv//90r///dK///3Sv//90r///dK///3S + v//90r///dK////Mmf/VkYX6NBkNhQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACEAAABOMxoNjNa+sP/o6en//OPP//vjzf/84sz/++HL//vgyf/738f/+97G//vdxf/63cT/+9vC//vb + wP/72b//+tm+//rZvP/617r//dK//9SRhPszGg2MAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAzZuK69Kfk/DFlIr62MCy/+nq6v/85dH//OTQ//vjzv/84s3//OHL//vgyf/74Mj/+9/H//ve + xv/73cT/+9zC//rbwf/72r//+9m+//rYvP/90r//1JGE+zMaDYwAAAA8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAOAAAAIQAAADzNsaj//dK///3Sv//awrP/6uvr//zm1P/75dL/++TQ//zjz//7487//OLM//zh + y//84Mn/+9/H//vexf/73cX/+tzD//rcwf/728D/+9q+//3Sv//UkYT7MxoNjAAAADwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACEAAABOMxoNjNa+sP/o6en//OPP/9zEtP/r7Oz//OfW//zm1P/85tL//OXR//vk + z//84s7//OLM//zhy//74Mr/++DI//vexv/73cX/+93D//rcwv/628D//dK//9SRhPszGg2MAAAAPAAA + AAAAAAAAAAAAAAAAAAAAAAAAzZuK69Kfk/DFlIr62MCy/+nq6v/85dH/3sa2/+3t7f/86Nj//OfW//zm + 1P/85dP//OXS//zk0P/75M7//OPN//zizP/74Mr/++DI//vfx//73sb/+93E//vcw//90r//1JGE+zMa + DYwAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAADNsaj//dK///3Sv//awrP/6uvr//zm1P/fx7f/7u7v//3q + 2v/86Nj//OjW//zn1f/859P//OXT//zl0f/848///OPO//zizP/74cv//ODK//vfyP/738b/+97E//3S + v//UkYT7MxoNjAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAANa+sP/o6en//OPP/9zEtP/r7Oz//OfW/+LK + uf/v7+///evb//zq2//96dn//OjY//zn1v/85tT//OXT//zl0f/85ND//OPO//zizf/74sv//ODK//vf + yP/73sf//dK//9SRhPszGg2MAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAA2MCy/+nq6v/85dH/3sa2/+3t + 7f/86Nj/5My5//Dx8f/87N7//ezc//3q2//86dn//enY//zo1//859T//ObU//vl0f/85NH//OTP//vi + zf/84sz/++HK//vgyf/90r//1JGE+zMaDYwAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAADawrP/6uvr//zm + 1P/fx7f/7u7v//3q2v/mzbv/8fLy//3t4P/87d7//ezd//3r2//86dr//OnZ//zo1//859X//ObU//zm + 0//85NH/++PQ//zjzv/74s3//OHL//3Sv//UkYT7MxoNjAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAANzE + tP/r7Oz//OfW/+LKuf/v7+///evb/+jQvf/y8/P//e/i//zu4f/97N///eze//3r3P/86tr//enZ//zp + 2P/859b//ObV//zm0//85dH//OTQ//zjzv/74s3//dK//9SRhPszGg2MAAAAPAAAAAAAAAAAAAAAAAAA + AAAAAAAA3sa2/+3t7f/86Nj/5My5//Dx8f/87N7/6tG+//P09P/97+T//e7j//3u4v/97d///eze//zr + 3f/969v//erZ//zo2P/86Nb//OfV//zm1P/85dL//OTR//zkz//90r//1JGE+zMaDYwAAAA8AAAAAAAA + AAAAAAAAAAAAAAAAAADfx7f/7u7v//3q2v/mzbv/8fLy//3t4P/s1MD/9fX1//7x5v/98OX//e/j//3u + 4v/97eH//ezf//3r3f/86tv//Ora//zo2f/96df//efW//zm1P/85dL/++TR//3Sv//UkYT7MxoNjAAA + ADwAAAAAAAAAAAAAAAAAAAAAAAAAAOLKuf/v7+///evb/+jQvf/y8/P//e/i/+7Wwv/29vb//vLp//7x + 5//98Ob//fDk//3v4//87uH//ezf//3s3v/969z//Orb//3p2f/86Nj//OfW//zn1P/85tP//dK//9SR + hPszGg2MAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAA5My5//Dx8f/87N7/6tG+//P09P/97+T/8NjD//f3 + 9//99Or//fPp//3x6P/98Ob//e/k//3v4//97uH//e3f//3s3v/87N3//erb//3p2f/86Nj//OfX//zn + 1f/90r//1ZGF+zMaDYsAAAA7AAAAAAAAAAAAAAAAAAAAAAAAAADmzbv/8fLy//3t4P/s1MD/9fX1//7x + 5v/y2cX/+Pj4//707f/+9Ov//vPp//3y6P/+8eb//fDl//3v4//97uL//e3g//zt3//87N7//evc//3q + 2v/86dn//OjX//3Sv//VjYH7Nx4RhwAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAOjQvf/y8/P//e/i/+7W + wv/29vb//vLp//Tcx//5+fn//vXu//717f/99Oz//vPq//7y6f/98ef//vDm//3v5P/97+L//e7h//3t + 4P/9697/97Oz//esrP/2oaL/+Jqa/9aQgvsAAAB8AAAAMwAAAAAAAAAAAAAAAAAAAAAAAAAA6tG+//P0 + 9P/97+T/8NjD//f39//99Or/9t3H//r7+//+9/H//vbv//717v/+9Oz//vPq//3z6f/+8ej//vHm//3v + 5f/97+P//e7h/+W2kf/uoUf/55U4/96LNv/VgjX/tYBh6gAAAGIAAAAnAAAAAAAAAAAAAAAAAAAAAAAA + AADs1MD/9fX1//7x5v/y2cX/+Pj4//707f/44Mr//Pz7///48//+9/L//vfw//717v/+9e3//fTr//7z + 6v/+8uj//fHn//3w5f/97+T/68Ce//+9YP//qTH//KIi/8SERfEAAAB/AAAAPAAAABQAAAAAAAAAAAAA + AAAAAAAAAAAAAO7Wwv/29vb//vLp//Tcx//5+fn//vXu//riyv/9/P3//vn1//758//++PL//vbx//72 + 7//+9e3//vTs//3z6v/98un//vHn//3w5f/rx6j//86F//61VP/IkVr2Wj4vnAAAAEAAAAAaAAAABwAA + AAAAAAAAAAAAAAAAAAAAAAAA8NjD//f39//99Or/9t3H//r7+//+9/H//OTM//7+/v//+vf//vr2//75 + 9P/++PP///fx//727//99e3//fTt//3z6v/98+n//vHn/+3Qr///2Jb/xpFp/lg8LrUAAABfAAAAGwAA + AAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAADy2cX/+Pj4//707f/44Mr//Pz7///48//+59L///////X2 + 9v/09PT/8vLy/+/w8P/u7u7/7Ozs/+rr6v/o6en/5efn/+Tl5P/i4+P/7tGw/8mog/9cPzDQAAAAewAA + ADEAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPTcx//5+fn//vXu//riyv/9/P3//vn1//7U + q//92rr/8c+x/+/MsP/ty67/7Mqt/+nHq//mxKr/5MKo/+PBp//hvqT/3rui/9u4oP/aqIP9aUo5pAAA + AEAAAAAaAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9t3H//r7+//+9/H//OTM//7+ + /v//+vf//vr2//759P/++PP///fx//727//99e3//fTt//3z6v/98+n//vHn/+3Qr///2Jb/xpFp/lg8 + LrUAAABfAAAAGwAAAAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD44Mr//Pz7///4 + 8//+59L///////X29v/09PT/8vLy/+/w8P/u7u7/7Ozs/+rr6v/o6en/5efn/+Tl5P/i4+P/7tGw/8mo + g/5cPzDQAAAAewAAADEAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPri + yv/9/P3//vn1//7Uq//92rr/8c+x/+/MsP/ty67/7Mqt/+nHq//mxKr/5MKo/+PBp//hvqT/3rui/9u4 + oP/bqYT7cFE/jQAAAEAAAAAaAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/OTM//7+/v//+vf//vr2//759P/++PP///fx//727//99e3//fTt//3z6v/98+n//vHn/+3Q + r///2Jb/yJNq8F5BM4YAAABCAAAAGwAAAAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD+59L///////X29v/09PT/8vLy/+/w8P/u7u7/7Ozs/+rr6v/o6en/5efn/+Tl + 5P/i4+P/7tGw/8qqhvZcPzCiAAAAUgAAAB8AAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7Uqvn92rn58c+w+e/Mr/nty6357Mms+enGqvnmw6n55MGn+ePA + pvnhvqT53ruj+du5ovnfr4/GAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA///////gAB//gAAP/4AAB/8AAAf8AAAH/AAAB/gAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAA/gAAAP4AAAH+AAAB/gAAA/4AAAf+AA + AP/gAAH/4AAD/+AAB//gAA//4AAf/+AAf/8oAAAAMAAAAGAAAAABAAgAAAAAAIAKAAAAAAAAAAAAAAAA + AAAAAAAAhEpKAIRSUgCcUlIAvWMYAHtaWgCMWloAlFpaAKVaWgDWcwAArWNaAJRjYwCcY2MArWNjAOd7 + AACca2sAtWtjAO+EAAC1c2MApXNrAK1zawD3jAAApXNzAL1zawC1c3MArXtrAKV7cwC9e2sArXtzALV7 + cwCte3sA3ow5AP+cAAC1hHMAvYRzAK2EewDGhHMAtYSEAN6USgDGjHMAtYyEAN6cWgDOlHsAvZSMAP+t + KQD/rTEA1px7ANachADepWsAxpyUAP+1QgDepYQA/5ycAM6llAD/tVIA5617AP+1WgDerYwA/6WlANat + nAD/vWMA57WMAN61nAD/ra0A772UAP/GcwD3vZQA3r2lAP+1tQDnvaUA98aUAP+9vQDvxqUA/86cAP/G + xgD/1qUA/9a1AP/WvQDW1tYA7961AP/evQD/3sYA/+etAP/ezgDe3t4A/+fOAP/n1gD/770A5+fnAP/v + 1gD/794A//fGAP/v5wDv7+8A9+/vAP/35wD/9+8A9/f3AP/39wD///cA////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk + ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk + ZAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBGRkZGRkZGRkZGRkZGRkZGRkZGRkAgIBAQEBAQEBAQEB + AQEBAQEBAQEBAQEBAAAABGRkZGRkZGRkZGRkZGRkZGRkZGRkCU1UVFBQUFBQUFBQT09PT09PTEtLS0tL + S0kFBGRkZGRkZGRkZGRkZGRkZGRkZGRkDE1UVFRQUFBQUFBQUE9PT09PT0xLS0tLS0kFBGRkZGRkZGRk + ZGRkZGRkZGRkBAQEDE1UVFRUUlBQUFBQUFBQT09PT09MTEtLS0YFBGRkZGRkZGRkZGRkZGRkZGQCAgEB + D1NUVFRUVFRQUFBQUFBQUE9PT09PTExLS0YGBGRkZGRkZGRkZGRkZGRkZGQJTVRUD1NUVFRUVFRSUFBQ + UFBQUFBPT09PT09MTEYGBGRkZGRkZGRkZGRkZGRkZGQMTVRUEVNVVFRUVFRUVFJQUFBQUFBQUE9PT09P + TEYKBGRkZGRkZGRkZGRkZGQEBAQMTVRUEVNVVVVUVFRUVFRSUFBQUFBQUFBPT09PT0MKBGRkZGRkZGRk + ZGRkZAICAQEPU1RUFlNVVVVVVFRUVFRUVFBQUFBQUFBQUE9PT0MKBGRkZGRkZGRkZGRkZAlNVFQPU1RU + FldVVVVVVVRUVFRUVFRSUFBQUFBQUFBPT0MLBGRkZGRkZGRkZGRkZAxNVFQRU1VUGldVVVVVVVVVVFRU + VFRUVFBQUFBQUFBQT0MOBGRkZGRkZGRkZGRkZAxNVFQRU1VVGldYWFVVVVVVVVRUVFRUVFRQUFBQUFBQ + UEMOBGRkZGRkZGRkZGRkZA9TVFQWU1VVI1dZWFhVVVVVVVVVVFRUVFRUUlBQUFBQUEMOBGRkZGRkZGRk + ZGRkZA9TVFQWV1VVI1dZWVlYVVVVVVVVVVRUVFRUVFJQUFBQUEMOBGRkZGRkZGRkZGRkZBFTVVQaV1VV + JldZWVlZWFhVVVVVVVVUVFRUVFRSUFBQUD4OBGRkZGRkZGRkZGRkZBFTVVUaV1hYJldZWVlZWVlYWFVV + VVVVVFRUVFRUVFBQUD4OBGRkZGRkZGRkZGRkZBZTVVUjV1lYKVdZWVlZWVlZWFVVVVVVVVRUVFRUVFRS + UD4VBGRkZGRkZGRkZGRkZBZXVVUjV1lZKVxbWVlZWVlZWVhVVVVVVVVVVFRUVFRUVD4VBGRkZGRkZGRk + ZGRkZBpXVVUmV1lZLVxbW1lZWVlZWVlYWFVVVVVVVVRUVFRUVDkVBGRkZGRkZGRkZGRkZBpXWFgmV1lZ + LVxbW1tZWVlZWVlZWVhVVVVVVVVUVFRUVDkZBGRkZGRkZGRkZGRkZCNXWVgpV1lZLlxbW1tbWVlZWVlZ + WVlYWFVVVVVVVVRUVDkZBGRkZGRkZGRkZGRkZCNXWVkpXFtZLlxeXltbW1lZWVlZWVlZWFhVVVVVVVVU + VDkZBGRkZGRkZGRkZGRkZCZXWVktXFtbMlxeXltbW1tbWVlZWVlZWVhYVVVVVVVVVDkdBGRkZGRkZGRk + ZGRkZCZXWVktXFtbMl1fXl5bW1tbW1lZWVlZWVlZWFhVVVVVVTMdBGRkZGRkZGRkZGRkZClXWVkuXFtb + OGBfXl5eXl5bW1tbWVlZWVlZWVhYVVVVVTMiBGRkZGRkZGRkZGRkZClcW1kuXF5eOGBfX19eXl5eW1tb + W1lZWVlZWVlZWFVVVTMiBGRkZGRkZGRkZGRkZC1cW1syXF5ePGBfX19fX15eXltbW1tZWVlZWVlZWFhY + VTMiBGRkZGRkZGRkZGRkZC1cW1syXV9ePGBfX19fX19eXl5bW1tbWVlZWUZDQz4+OTMkBGRkZGRkZGRk + ZGRkZC5cW1s4YF9ePGBfX19fX19fX15eXltbW1lZKionJycnJBcHBGRkZGRkZGRkZGRkZC5cXl44YF9f + P2BhX19fX19fX19eXl5bW1tbEjUfFBANCAMEZGRkZGRkZGRkZGRkZDJcXl48YF9fP2NhYV9fX19fX19f + Xl5eW1tbE0g1MSwrHgRkZGRkZGRkZGRkZGRkZDJdX148YF9fQWNiYWFhX19fX19fX15eXl5bGEo3NTEl + BGRkZGRkZGRkZGRkZGRkZDhgX148YF9fQWNiYmJhX19fX19fX19eXl5eG1E7NygEZGRkZGRkZGRkZGRk + ZGRkZDhgX18/YGFfRWNiYmJiYWFfX19fX19fX15eHFZALwRkZGRkZGRkZGRkZGRkZGRkZDxgX18/Y2Fh + RWNjYmJiYmJhYV9fX19fX19eIFo2BGRkZGRkZGRkZGRkZGRkZGRkZDxgX19BY2JhSGNjYGBgYGBgYGBg + YF1dXFxcIE4EZGRkZGRkZGRkZGRkZGRkZGRkZDxgX19BY2JiSEtHRERCQj09PTo6OjQ0NDAwISdkZGRk + ZGRkZGRkZGRkZGRkZGRkZD9gYV9FY2JiYmJhYV9fX19fX19fXl4cVkAvBGRkZGRkZGRkZGRkZGRkZGRk + ZGRkZD9jYWFFY2NiYmJiYmFhX19fX19fX14gWjYEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEFjYmFIY2Ng + YGBgYGBgYGBgXV1cXFwgTgRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEFjYmJIS0dEREJCPT09Ojo6NDQ0 + MDAhJ2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEVjYmJiYmFhX19fX19fX19eXhxWQC8EZGRkZGRkZGRk + ZGRkZGRkZGRkZGRkZGRkZEVjY2JiYmJiYWFfX19fX19fXiBaNgRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk + ZGRkZEhjY2BgYGBgYGBgYGBdXVxcXCBOBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEhLR0REQkI9 + PT06Ojo0NDQwMCEnZGRkZGRkZGRkZGRkZGRkZGRkZGRkZP///////wAA////////AAD//gAAAD8AAP/8 + AAAAPwAA//wAAAA/AAD//AAAAD8AAP/gAAAAPwAA/8AAAAA/AAD/wAAAAD8AAP/AAAAAPwAA/gAAAAA/ + AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA + AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/ + AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAH8AAPwA + AAAA/wAA/AAAAAH/AAD8AAAAA/8AAPwAAAAH/wAA/AAAAA//AAD8AAAAH/8AAPwAAAA//wAA/AAAAH// + AAD8AAAA//8AAPwAAAH//wAA/AAAA///AAD8AAAH//8AAPwAAA///wAA/AAAH///AAD8AAA///8AACgA + AAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAOAAAAFAAAABQAAAAUAAAAFAAA + ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABUAAAAUAAAAFAAAABQAAAAUAAAAFAAA + ABQAAAAUAAAAFAAAABQAAAAUAAAAEgAAAA4AAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA3AAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFEAAABQAAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABPAAAASQAAADcAAAAZAAAABgAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADcAAAB4MxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2wNBwPsjMa + DbAzGg2wMxoNsDMaDa8zGg2vMxoNrzMaDa8zGg2vMxoNrzMaDa8zGg2uMhsNogAAAHgAAAA3AAAADgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJJfX/+QXV3/hlNT/4RRUf+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQ + UP+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQUP+DUFD/g1BQ/4NQUP+DUFD/gk9P/4BNTf9/TEz/gE1N/zMb + DaEAAABKAAAAEgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABgAAAA4AAAAUAAAAFJRhYf/yzMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///M + zP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///MzP//zMz//8zM///M + zP//zJn/gU9P/zMaDa4AAABPAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAADcAAABQAAAAUKNwa//W1tb//ODL//vhyf/74Mj/+9/H//ve + xv/73sX/+97E//vdxP/73ML/+9zB//vbwP/62r//+tq+//vZvf/62bz/+ti6//rYuf/717n/+ta3//rV + t//61bb/+tW0//rTs///v7//jV1b/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAHgzGg2vMxoNr6VybP/X19f/++LM//vh + y//84cr//ODI//vfyP/73sf/+97F//vexP/73cP/+9zD//rcwf/728D/+9vA//vavv/72r3/+9i8//rY + u//62Lr/+te5//rWuP/61rb/+tW2//rUtP//vr3/jl9c/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkl9f/5BdXf+GU1P/hFFR/6h1 + bv/Y2Nj//OLN//zizf/74cv//ODK//vgyf/74Mj/+9/H//vexv/73sX/+93E//vcw//73ML/+9vB//vb + wP/62r7/+tq+//vZvP/72Lz/+te6//vYuf/617j/+tW3//rWt///vLz/kGBe/zMaDa8AAABQAAAAFAAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAADgAAABQAAAAUlGFh//LM + zP//zMz//8zM/6t4b//a2tr//OPP//vizv/74sz//OLL//vhy//84Mr/+9/I//vfx//838b//N7G//vd + xP/73cP/+9zD//vbwf/628D/+9q///vavv/72b3/+tm7//rYuv/62Lr/+te5//rWuP//u7r/kmFf/zMa + Da8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAANwAA + AFAAAABQo3Br/9bW1v/84Mv/++HJ/657cP/b29v//OTQ//zjz//7487//OLN//vhzP/84cr/++DK//zg + yP/838j/+9/H//vexf/73cT/+93E//vcwv/628L/+tvA//rbv//72r7/+9m9//rZvP/62Lv/+ti6//rX + uf//urn/kmNh/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAA3AAAAeDMaDa8zGg2vpXJs/9fX1//74sz/++HL/7B9cf/c3Nz/++XR//vk0P/849D//OPO//zi + zf/74c3/++HL//vhyv/74Mn/+9/I//vex//73sX/+97F//vdxP/73MP/+tzC//vbwf/727//+9q+//rZ + vv/72bz/+9i7//rXu///uLj/lGRi/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACSX1//kF1d/4ZTU/+EUVH/qHVu/9jY2P/84s3//OLN/7J/c//d3d3//ObS//zl + 0v/85NH//OPQ//zjz//84s7//OLM//vhzP/74cr//ODJ//zgyP/738f/+97G//vexf/73cT/+93D//vc + wv/73MH/+tvA//vbv//62b7/+tm8//rYu///trf/lWZk/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUYWH/8szM///MzP//zMz/q3hv/9ra2v/848//++LO/7aD + dP/f39///ObU//zl0//85dL//OTR//zk0P/748///OPO//vizf/84sv//OHL//vgyf/74Mj//N/I//zf + xv/73sX/+97E//vdw//73ML/+9zC//vbwf/72sD/+9q+//ravf//tbX/l2hl/zMaDa8AAABQAAAAFAAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjcGv/1tbW//zgy//74cn/rntw/9vb + 2//85ND//OPP/7iFdf/g4OD//OfV//zn1f/85tP//ObS//vl0f/85ND/++PQ//vjzv/84s3/++LM//vh + y//74Mr/++DJ//vgyP/838f/+97G//vdxf/73cP/+9zD//rcwv/728H/+9u///vavv//tLT/mGln/zMa + Da8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAClcmz/19fX//vi + zP/74cv/sH1x/9zc3P/75dH/++TQ/7uId//h4eH//ejX//zo1f/859X//ObU//zm0//85dL/++TQ//zk + z//7487//OPO//zizf/74cv//OHK//zgyf/74Mj/+9/H//vexv/73sX/+93E//vdw//73ML/+9zB//vb + wP//srL/mWpo/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACodW7/2NjY//zizf/84s3/sn9z/93d3f/85tL//OXS/76LeP/i4uL//OnY//3o1//86Nb//OfV//zn + 1P/85tP//ObS//zl0f/75ND//OTP//zizv/848z//OHL//zhyv/74cn/++DJ//vfyP/738f/+97G//ve + xf/73cT/+9zC//rbwv//sLH/m2xq/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACreG//2tra//zjz//74s7/toN0/9/f3//85tT//OXT/8CNef/k5OT//ena//3p + 2f/86Nj//OfX//zn1f/859T//ObU//zm0v/85dH//OTQ//vj0P/8487/++PO//vizP/74cv/++HK//zg + yf/738j//N7G//zexv/83sX/+97E//vcwv//sK//nG1r/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACue3D/29vb//zk0P/848//uIV1/+Dg4P/859X//OfV/8OQ + e//l5eX//evb//zq2v/96dn//enY//zo1v/86NX//OfV//zm1P/85tL//OXS//vl0P/85M///OPP//vj + zf/74s3/++LM//vhyv/74Mr/+9/I//vfx//738b/+93F//vexP//rq3/nW9s/zMaDa8AAABQAAAAFAAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwfXH/3Nzc//vl0f/75ND/u4h3/+Hh + 4f/96Nf//OjV/8WSff/m5ub//Ovd//3q2//96tr//OrZ//3p2P/86df//OjW//zn1v/85tT//ObT//zl + 0v/85dH//OTQ//vkz//74s7//OLN//zizP/74cr/++DJ//zgyf/738f/+9/G//vexf//rK3/n3Ft/zMa + Da8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyf3P/3d3d//zm + 0v/85dL/vot4/+Li4v/86dj//ejX/8iVfv/n5+f//Ovd//zr3f/86tv//eva//3q2v/86dj//enX//zn + 1//959X//OfV//zm1P/85dL//OTR//zk0P/848///OPO//zizf/84sz/++HL//zhyv/74Mn/+9/I//zf + x///q6v/oHJv/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAC2g3T/39/f//zm1P/85dP/wI15/+Tk5P/96dr//enZ/8qXf//p6en//e3g//3s3v/8693//Ovc//3q + 2//86dr//enZ//zo2P/86Nf//efW//zn1f/85tP//OXS//zl0v/75dH/++TQ//vjz//84s3/++LN//zh + y//84Mr/++DK//vgyP//qan/oXRw/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC4hXX/4ODg//zn1f/859X/w5B7/+Xl5f/969v//Ora/82agP/q6ur//e3g//3t + 4P/97N///eze//3r3P/86tv//erb//3q2f/86Nj//ejX//zn1v/859X//ObU//zm0//85tH//OTR//zk + 0P/8487/++PO//zizf/84cv/++HL//vgyv//qKj/onVy/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7iHf/4eHh//3o1//86NX/xZJ9/+bm5v/8693//erb/9Cd + gf/r6+v//e7i//3u4f/97eD//ezf//3r3v/969z//evb//3q2v/86dr//OnY//zp1//96Nb//OfV//zm + 1P/85tP//ObS//zl0f/85NH//OPP//zjzv/74s3/++LM//vhy///p6f/o3dz/zMaDa8AAABQAAAAFAAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+i3j/4uLi//zp2P/96Nf/yJV+/+fn + 5//8693//Ovd/9Oggv/s7Oz//u/k//3v4//97uH//e3g//3t3//97N7//ezd//zr3P/96tv//era//zp + 2f/86Nj//ejX//zo1f/859T//OfT//zl0//75dH//OXQ//zj0P/7487//OLO//vizP//paX/pXl0/zMa + Da8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAjXn/5OTk//3p + 2v/96dn/ypd//+np6f/97eD//eze/9WihP/u7u7//fDl//3w5P/97+P//e7i//3u4f/97d///ezf//3s + 3v/969z//Ovb//zq2v/96dn//enY//3o1//86Nb//OfV//zn1P/85tP//OXS//zk0f/85ND/++TP//zj + zv//pKT/pnp2/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADDkHv/5eXl//3r2//86tr/zZqA/+rq6v/97eD//e3g/9ilhf/v7+///vHm//3w5f/97+T//e7j//3v + 4f/97uD//e3g//zt3//87N7//evd//3q3P/86tv//OrZ//3p2P/96Nf//OjX//3n1f/859X//ObT//zl + 0v/85dH//OTQ//vkz///oqP/qHt3/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADFkn3/5ubm//zr3f/96tv/0J2B/+vr6//97uL//e7h/9qnhv/w8PD//vLo//3x + 5//98OX//e/k//3v5P/+7+L//e7h//3t4P/97d///eze//3r3f/869z//evb//3q2v/86dj//OjY//zo + 1//859b//ebV//3n1P/85tP//OXR//zl0P//oKD/qX14/zMaDa8AAABQAAAAFAAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIlX7/5+fn//zr3f/8693/06CC/+zs7P/+7+T//e/j/92q + iP/x8fH//fPp//3x5//+8eb//fHm//3w5f/98OT//e/j//3u4v/97uH//e3g//3t3//9693//evc//3q + 3P/86tr//enZ//zp2P/86Nf//OjW//zn1P/85tT//OXT//zl0v//oJ//qn95/zMaDa8AAABQAAAAFAAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKl3//6enp//3t4P/97N7/1aKE/+7u + 7v/98OX//fDk/+Ctiv/z8/P//vPq//3y6f/+8un//vHn//7w5v/98OX//fDk//3v4//97uL//e7h//3t + 4P/97N///eze//zs3f/969z//era//zp2f/86dj//enY//zn1v/859X//ObV//zm1P//np3/q4B7/zMa + Da8AAABQAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNmoD/6urq//3t + 4P/97eD/2KWF/+/v7//+8eb//fDl/+Owi//09PT//vTr//7z6//98ur//vLp//3y6P/98eb//fDl//3w + 5P/97+P//e/i//3u4f/87uD//e3f//zs3v/9693//Ovc//3q2//96tr//OnZ//3o1//86Nf//OjW//zn + 1f//nJ3/rIJ9/zQbDa0AAABPAAAAFAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADQnYH/6+vr//3u4v/97uH/2qeG//Dw8P/+8uj//fHn/+WyjP/19fX//fXt//707P/+9Ov//fLq//7y + 6f/98uf//fHn//7x5v/+7+X//e/j//3v4v/97+L//O7g//3s3//97N///ezd//zr3P//vL3//7i3//+z + s///rq7//6mp//+kpP//oJ//roN+/zceEaMAAABJAAAAEgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADToIL/7Ozs//7v5P/97+P/3aqI//Hx8f/98+n//fHn/+e0jv/29vb//vbv//31 + 7f/+9e3//vPr//7z6//+8un//vLo//3y5//+8eb//fDl//3w5P/97+P//e7i//3u4f/97d///e3f/7qR + iv+5j4j/toyG/7WKhf+ziIT/soeD/7GGgf+wcHD/m2pp/zshFYUAAAA4AAAADQAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVooT/7u7u//3w5f/98OT/4K2K//Pz8//+8+r//fLp/+q3 + j//4+Pj//vbw//727v/99e7//vXt//7z6//+8+v//fPq//7y6f/+8uj//fHm//3w5f/+7+X//e/k//3u + 4v/97uH//e3g/6VybP//tFL//5kA//WPAP/rhQD/4HoA/9ZwAP+/Zhn/flFO1wAAAFIAAAAeAAAABgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYpYX/7+/v//7x5v/98OX/47CL//T0 + 9P/+9Ov//vPr/+26kP/5+fn//vfx//728P/+9u///vXu//717f/+9ev//vPr//7y6v/98un//fHo//3x + 5//98eb//fDl//3v5P/97+P//e7h/6h1bv//zJn//7RS//+wRP//qzb//6gt/9mMOf9+Uk/bAAAAWAAA + ACQAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADap4b/8PDw//7y + 6P/98ef/5bKM//X19f/99e3//vTs//C9kf/6+vr//vjz//738f/+9/H//fbw//717//+9e7//vTs//30 + 6//98+r//fPp//3x6P/98ef//fHm//3x5f/98OT//e/j/6t4b///1qP//7db//+0Uv//sET/25NJ/39T + TuMAAABjAAAAJwAAAAsAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADdqoj/8fHx//3z6f/98ef/57SO//b29v/+9u///fXt//PAkv/7+/v///n0//748v/++PL//vfw//72 + 7//+9u///vXt//317P/+9Oz//fPq//7y6f/98un//fHn//7w5v/98OX//fDl/657cP//4K3//7tn//+3 + W//dm1v/gFVO7AAAAHwAAAAwAAAADAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADgrYr/8/Pz//7z6v/98un/6reP//j4+P/+9vD//vbu//XCk//9/f3//vn1//74 + 9P/++PT//vjy//738f/+9vD//vbv//717v/99O3//fTs//706//+8+r//vLp//3x6P/+8ef//fDm/7B9 + cf//67j//8B0/96hav+IW1T5QiUZjQAAAD8AAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjsIv/9PT0//706//+8+v/7bqQ//n5+f/+9/H//vbw//fE + lf/+/v7///r3///69v//+fX///jz///48v/++PH//vfw//728P/+9e7//vXt//707P/+8+z//vPq//7y + 6f/+8uj//fHn/7J/c///9cL/4Kh7/4tfVfpDJhuSAAAARAAAABUAAAAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlsoz/9fX1//317f/+9Oz/8L2R//r6 + +v/++PP//vfx//rHl///////+fn5//j4+P/39/f/9/f3//b29v/19fX/9fX1//T09P/z8/P/8/Ly//Lx + 8P/x8O//8O7s//Dt6//v7On/7uvo/7aDdP/s37b/jGBV/EQnGaMAAABKAAAAFgAAAAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADntI7/9vb2//72 + 7//99e3/88CS//v7+///+fT//vjy//7Lmf/81rH/6MGl/+W/pP/jvaL/4Lqh/963n//btZ7/2rOd/9ex + m//Vrpr/0qyZ/9CqmP/Op5b/y6WV/8mjlP/GoJL/xJ6R/7iFdf+hcWb4AAAAfAAAADAAAAAMAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADqt4//+Pj4//728P/+9u7/9cKT//39/f/++fX//vj0//749P/++PL//vfx//728P/+9u///vXu//30 + 7f/99Oz//vTr//7z6v/+8un//fHo//7x5//98Ob/sH1x///ruP//wHT/3qFq/4hbVPlCJRmNAAAAPwAA + ABEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADtupD/+fn5//738f/+9vD/98SV//7+/v//+vf///r2///59f//+PP///jy//74 + 8f/+9/D//vbw//717v/+9e3//vTs//7z7P/+8+r//vLp//7y6P/98ef/sn9z///1wv/gqHv/jF9W+UMm + G5EAAABEAAAAFQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvZH/+vr6//748//+9/H/+seX///////5+fn/+Pj4//f3 + 9//39/f/9vb2//X19f/19fX/9PT0//Pz8//z8vL/8vHw//Hw7//w7uz/8O3r/+/s6f/u6+j/toN0/+zf + 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 + AV+79HpaJTd3AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAACSklE + QVQ4T6WS2UuUURjG/XO6iJC8qGyBlAhJKcqFTBy11CStXFIsk9yaCzNsnUozG9d0CMkZdxtGs9wzZ1xD + IjHIJjXGXGqc79d3vmD0U/CiLp4D5+F9fud9X44H8F/aYowOWKI/T1qZtPbyoaedrtaXNBqKqS3JD9xc + K6S62PrMsVMj/SzPTeByjCAt9CDZW5kbK+NZ4VWK8lOObqwXUl3Gh7pYstuYHmniVmYceakaspPOMNOd + y2xfJrnJoXLZNoDBThPSj16yEkNJjfbfI7wrZ/28yh/fRJpIJz32uGxtA+gwloG9iZRI0em6X/FIizSW + RKLGV+ULKUenUe9prntKy4sHNFQWUq8voE6fj6FIS01xHlW6bMof3kB/9zqlhdeEPFWAtlodi9PNMG9R + JH034/rWxtrXZpxfTLhmW9z+zHAN93IS5NgGQGPVnb/hsWRc1gScgzGsdoez1BHEylt5ceMpuGyXcL4/ + z8dXgWRcOKkG1Otvw5yFteF4fg+cY+VdGN0VfmhCdvK6JsodXu3VMG7wJy0mQA0Q80r2dn71RbHcdZpF + 8wnCg3YQFbFf1gF3eKkzmNFKX5Ii1pesHIZirTLv8psQHO0BLDT4KrDNYUebP9ZSby6G+agB1bocnDNG + HK3HmDce5qflFNX3A4kM30eR9og7vGDyYejJbuJDD6kBFbospvv1DJfsxfb8IJ9aIplqDFMWJmYWbYuX + RdiUt4u4YO8tAK+CjFi0aRpFufL3zbocomxbLEzMLNoWL4uwLPU/+Hfh8QdZjOdNufbSGQAAAABJRU5E + rkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAABrklE + QVQ4T6WSSyhEYRiGJ5FrFrKSYlYkRBYcFOXk2qhhJMklsaJkh6UdG0Q0ahCakduEZNxyhBFRZqNcCiHR + 5JYUpdf//TozhkPiq3fz/e/znPOfjgrAv6K4pFSW5Qss0GlEShntGuIjQfnYc4HkyPCxORIHJrUsEQgu + Cg9lFWfXBaTI8O10AGpLc1FdnIMTUyCX1MSGIVsdxGrfCD7DlrlFmEanUK4VsW/w4ZKkoEBWVRB8hpeW + JLZ+n7kFCfnpidjt9JSvk8zWTsFPsDyWeQmZyXHYbvNwkciCH+Hnl1fcP75gxiJBFGKw06riEjYOQUpq + fBQkaZWWLiPDl/YnHJ0/YMBoRpg6mATl7Nj5DfJKaqjvmLGhVgz3tWBQ3wRDeyOHbYc3GJ/dQEiEQBXO + OQSawipaOobgu2l/2M1+/GoEW21XME5ZlQVZugpa8qHXpidfj/nizOiNSl06hxc2L9A/8Y0gQ0t/q/PO + 9Nong15oqS+AVkzg8OTKKXpG1pUFYm4Jh5dXtzC/vInu5jrs6d1h63BDmhCN3nEr9AzuMq0pC9I0xfzg + t/ki+FugegPoVb5EA7iipwAAAABJRU5ErkJggg== + + + + + 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 + /AK3cQW2hx6bigAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAd0SU1FB9cE + GgM6EDOT50gAAAAXdEVYdFNvZnR3YXJlAEdMRFBORyB2ZXIgMy40cYWk4QAAAAh0cE5HR0xEMwAAAABK + gCkfAAABcklEQVQ4T6WSy0rDQBSGZyEuCq6EIkgRBEEEKVLd+QZufQa1KxeuvFCoKIKgRRExT+CiIEIR + QREkIRTj0AZvoOAtUqEqWIOoJeBvzqStNfES9Ydvk5nzzcnMYeVwqRO7SxHsLHYgvRCGaZp1lmXVlJa/ + DxW7IyfakM/ngz9K3oslF8DWdAs2ppqxPtGEtfEQUvFGrMYaPnZHbeN5Dnic9fJJVsaC0HU9TBIhoH/G + 7SRwHUc2k0D90J4vkupZb7FYrGV0YbgYFbCBDFg064tAVIZhGCGmzrcDB4MC1sfBRs79Ye/VNK2L0W2D + 9wvo41d5tbl/cciZEHsVRelm2zOtHoEkcQElEDMEBbuQSUxwdFMloKf6l4De2S0o58kCjILD8R2gGg7y + ZZWA3rM8JBXBcI9AnBqRBFrOPsM+nUidVAloomhkOeeRPwkoJBGTVRJQ4dWD0zYVUtubp0Dy0GF53yWo + xP74GzwC6oLmnBb8oOt6+A0DdJG0Jr5NoQAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/CarotDAV/RightAlignToolStrip.cs b/CarotDAV/RightAlignToolStrip.cs new file mode 100644 index 0000000..7967712 --- /dev/null +++ b/CarotDAV/RightAlignToolStrip.cs @@ -0,0 +1,92 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.RightAlignToolStrip +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System.Windows.Forms; + +namespace CarotDAV +{ + public class RightAlignToolStrip : ToolStrip + { + public RightAlignToolStrip() + { + } + + public RightAlignToolStrip(params ToolStripItem[] items) + : base(items) + { + } + + protected override void OnLayout(LayoutEventArgs e) + { + int num1 = this.DisplayRectangle.Width; + int num2 = 0; + if (num1 > 0) + { + int num3 = 0; + int num4 = checked (this.Items.Count - 1); + int index = num3; + Padding padding; + while (index <= num4) + { + if (this.Items[index].Visible) + { + int num5 = num1; + padding = this.Items[index].Margin; + int horizontal = padding.Horizontal; + num1 = checked (num5 - horizontal); + if ((this.Items[index].Anchor & AnchorStyles.Left) != AnchorStyles.None && (this.Items[index].Anchor & AnchorStyles.Right) != AnchorStyles.None) + checked { ++num2; } + else if (this.Items[index] is ToolStripTextBox) + checked { ++num2; } + else + checked { num1 -= this.Items[index].Width; } + } + checked { ++index; } + } + if (this.OverflowButton.Visible) + { + int num5 = num1; + padding = this.OverflowButton.Margin; + int horizontal = padding.Horizontal; + num1 = checked (num5 - horizontal - this.OverflowButton.Width); + } + int num6 = num1; + padding = this.Padding; + int horizontal1 = padding.Horizontal; + num1 = checked (num6 - horizontal1 - 1); + } + if (num1 > 0 && num2 > 0) + { + int num3 = 0; + int num4 = checked (this.Items.Count - 1); + int index = num3; + while (index <= num4) + { + if (this.Items[index].Visible) + { + this.Items[index].AutoSize = false; + if ((this.Items[index].Anchor & AnchorStyles.Left) != AnchorStyles.None && (this.Items[index].Anchor & AnchorStyles.Right) != AnchorStyles.None) + { + this.Items[index].Width = num1 / num2; + this.Items[index].Invalidate(); + checked { num1 -= this.Items[index].Width; } + checked { --num2; } + } + else if (this.Items[index] is ToolStripTextBox) + { + this.Items[index].Width = num1 / num2; + this.Items[index].Invalidate(); + checked { num1 -= this.Items[index].Width; } + checked { --num2; } + } + } + checked { ++index; } + } + } + base.OnLayout(e); + } + } +} diff --git a/CarotDAV/ServerCertErrorPromptForm.cs b/CarotDAV/ServerCertErrorPromptForm.cs new file mode 100644 index 0000000..6d49ffe --- /dev/null +++ b/CarotDAV/ServerCertErrorPromptForm.cs @@ -0,0 +1,458 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.ServerCertErrorPromptForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Net.Security; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class ServerCertErrorPromptForm : Form + { + private IContainer components; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("RetryButton")] + private Button _RetryButton; + [AccessedThroughProperty("IgnoreButton")] + private Button _IgnoreButton; + [AccessedThroughProperty("MessageLabel")] + private Label _MessageLabel; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("TargetTextBox")] + private TextBox _TargetTextBox; + [AccessedThroughProperty("ChainErrorLabel")] + private Label _ChainErrorLabel; + [AccessedThroughProperty("NameMismatchLabel")] + private Label _NameMismatchLabel; + [AccessedThroughProperty("NotAvailableLabel")] + private Label _NotAvailableLabel; + private string pMessage; + private SslPolicyErrors pPolicyError; + private string pTarget; + + public ServerCertErrorPromptForm() + { + this.Shown += new EventHandler(this.ServerCertErrorPromptForm_Shown); + this.Load += new EventHandler(this.ServerCertErrorPromptForm_Load); + this.pMessage = string.Empty; + this.pTarget = string.Empty; + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.m_CancelButton = new Button(); + this.RetryButton = new Button(); + this.IgnoreButton = new Button(); + this.MessageLabel = new Label(); + this.Label1 = new Label(); + this.TargetTextBox = new TextBox(); + this.ChainErrorLabel = new Label(); + this.NameMismatchLabel = new Label(); + this.NotAvailableLabel = new Label(); + this.SuspendLayout(); + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + Point point1 = new Point(288, 152); + Point point2 = point1; + mCancelButton1.Location = point2; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + Size size1 = new Size(72, 24); + Size size2 = size1; + mCancelButton2.Size = size2; + this.m_CancelButton.TabIndex = 8; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.RetryButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button retryButton1 = this.RetryButton; + point1 = new Point(208, 152); + Point point3 = point1; + retryButton1.Location = point3; + this.RetryButton.Name = "RetryButton"; + Button retryButton2 = this.RetryButton; + size1 = new Size(72, 24); + Size size3 = size1; + retryButton2.Size = size3; + this.RetryButton.TabIndex = 7; + this.RetryButton.Text = "Retry"; + this.RetryButton.UseVisualStyleBackColor = true; + this.IgnoreButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button ignoreButton1 = this.IgnoreButton; + point1 = new Point(128, 152); + Point point4 = point1; + ignoreButton1.Location = point4; + this.IgnoreButton.Name = "IgnoreButton"; + Button ignoreButton2 = this.IgnoreButton; + size1 = new Size(72, 25); + Size size4 = size1; + ignoreButton2.Size = size4; + this.IgnoreButton.TabIndex = 6; + this.IgnoreButton.Text = "Ignore"; + this.IgnoreButton.UseVisualStyleBackColor = true; + this.MessageLabel.AutoSize = true; + Label messageLabel1 = this.MessageLabel; + point1 = new Point(8, 8); + Point point5 = point1; + messageLabel1.Location = point5; + this.MessageLabel.Name = "MessageLabel"; + Label messageLabel2 = this.MessageLabel; + size1 = new Size(79, 12); + Size size5 = size1; + messageLabel2.Size = size5; + this.MessageLabel.TabIndex = 0; + this.MessageLabel.Text = "Error Message"; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 24); + Point point6 = point1; + label1_1.Location = point6; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(38, 12); + Size size6 = size1; + label1_2.Size = size6; + this.Label1.TabIndex = 1; + this.Label1.Text = "Target"; + this.TargetTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox targetTextBox1 = this.TargetTextBox; + point1 = new Point(8, 40); + Point point7 = point1; + targetTextBox1.Location = point7; + this.TargetTextBox.Multiline = true; + this.TargetTextBox.Name = "TargetTextBox"; + this.TargetTextBox.ReadOnly = true; + TextBox targetTextBox2 = this.TargetTextBox; + size1 = new Size(352, 32); + Size size7 = size1; + targetTextBox2.Size = size7; + this.TargetTextBox.TabIndex = 2; + this.TargetTextBox.TabStop = false; + this.ChainErrorLabel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + Label chainErrorLabel1 = this.ChainErrorLabel; + point1 = new Point(32, 80); + Point point8 = point1; + chainErrorLabel1.Location = point8; + this.ChainErrorLabel.Name = "ChainErrorLabel"; + Label chainErrorLabel2 = this.ChainErrorLabel; + size1 = new Size(328, 16); + Size size8 = size1; + chainErrorLabel2.Size = size8; + this.ChainErrorLabel.TabIndex = 3; + this.ChainErrorLabel.Text = "-"; + this.NameMismatchLabel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + Label nameMismatchLabel1 = this.NameMismatchLabel; + point1 = new Point(32, 104); + Point point9 = point1; + nameMismatchLabel1.Location = point9; + this.NameMismatchLabel.Name = "NameMismatchLabel"; + Label nameMismatchLabel2 = this.NameMismatchLabel; + size1 = new Size(328, 16); + Size size9 = size1; + nameMismatchLabel2.Size = size9; + this.NameMismatchLabel.TabIndex = 4; + this.NameMismatchLabel.Text = "-"; + this.NotAvailableLabel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + Label notAvailableLabel1 = this.NotAvailableLabel; + point1 = new Point(32, 128); + Point point10 = point1; + notAvailableLabel1.Location = point10; + this.NotAvailableLabel.Name = "NotAvailableLabel"; + Label notAvailableLabel2 = this.NotAvailableLabel; + size1 = new Size(328, 16); + Size size10 = size1; + notAvailableLabel2.Size = size10; + this.NotAvailableLabel.TabIndex = 5; + this.NotAvailableLabel.Text = "-"; + this.AcceptButton = (IButtonControl) this.RetryButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(368, 184); + this.ClientSize = size1; + this.Controls.Add((Control) this.NotAvailableLabel); + this.Controls.Add((Control) this.NameMismatchLabel); + this.Controls.Add((Control) this.ChainErrorLabel); + this.Controls.Add((Control) this.TargetTextBox); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.MessageLabel); + this.Controls.Add((Control) this.IgnoreButton); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.RetryButton); + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(384, 221); + this.MinimumSize = size1; + this.Name = nameof (ServerCertErrorPromptForm); + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Server Certificate Error"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.m_CancelButton_Click); + if (this._m_CancelButton != null) + this._m_CancelButton.Click -= eventHandler; + this._m_CancelButton = value; + if (this._m_CancelButton == null) + return; + this._m_CancelButton.Click += eventHandler; + } + } + + internal virtual Button RetryButton + { + get + { + return this._RetryButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RetryButton_Click); + if (this._RetryButton != null) + this._RetryButton.Click -= eventHandler; + this._RetryButton = value; + if (this._RetryButton == null) + return; + this._RetryButton.Click += eventHandler; + } + } + + internal virtual Button IgnoreButton + { + get + { + return this._IgnoreButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.IgnoreButton_Click); + if (this._IgnoreButton != null) + this._IgnoreButton.Click -= eventHandler; + this._IgnoreButton = value; + if (this._IgnoreButton == null) + return; + this._IgnoreButton.Click += eventHandler; + } + } + + internal virtual Label MessageLabel + { + get + { + return this._MessageLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MessageLabel = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual TextBox TargetTextBox + { + get + { + return this._TargetTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TargetTextBox = value; + } + } + + internal virtual Label ChainErrorLabel + { + get + { + return this._ChainErrorLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ChainErrorLabel = value; + } + } + + internal virtual Label NameMismatchLabel + { + get + { + return this._NameMismatchLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NameMismatchLabel = value; + } + } + + internal virtual Label NotAvailableLabel + { + get + { + return this._NotAvailableLabel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NotAvailableLabel = value; + } + } + + public string Message + { + get + { + return this.pMessage; + } + set + { + if (value == null) + value = string.Empty; + if (value.Length == 0) + value = "Server certificate error occurred."; + this.pMessage = value; + } + } + + public SslPolicyErrors PolicyError + { + get + { + return this.pPolicyError; + } + set + { + this.pPolicyError = value; + if ((this.pPolicyError & SslPolicyErrors.RemoteCertificateChainErrors) != SslPolicyErrors.None) + { + this.ChainErrorLabel.Text = "Server certificate is not issued by trusted authority."; + this.ChainErrorLabel.ForeColor = Color.Red; + } + else + { + this.ChainErrorLabel.Text = "Server certificate is issued by trusted authority."; + this.ChainErrorLabel.ForeColor = Color.Black; + } + if ((this.pPolicyError & SslPolicyErrors.RemoteCertificateNameMismatch) != SslPolicyErrors.None) + { + this.NameMismatchLabel.Text = "Server certificate is not issued for the connected server."; + this.NameMismatchLabel.ForeColor = Color.Red; + } + else + { + this.NameMismatchLabel.Text = "Server certificate is issued for the connected server."; + this.NameMismatchLabel.ForeColor = Color.Black; + } + if ((this.pPolicyError & SslPolicyErrors.RemoteCertificateNotAvailable) != SslPolicyErrors.None) + { + this.NotAvailableLabel.Text = "Server certificate is not available any more."; + this.NotAvailableLabel.ForeColor = Color.Red; + } + else + { + this.NotAvailableLabel.Text = "Server Certificate is still available."; + this.NotAvailableLabel.ForeColor = Color.Black; + } + } + } + + public string Target + { + get + { + return this.pTarget; + } + set + { + if (value == null) + value = string.Empty; + this.pTarget = value; + this.TargetTextBox.Text = this.pTarget; + } + } + + private void ServerCertErrorPromptForm_Shown(object sender, EventArgs e) + { + this.Activate(); + ((Control) this.AcceptButton).Focus(); + } + + private void IgnoreButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Ignore; + } + + private void RetryButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Retry; + } + + private void m_CancelButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + public static DialogResult ShowDialog(IWin32Window owner, string message, SslPolicyErrors policyerror, string target) + { + using (ServerCertErrorPromptForm certErrorPromptForm = new ServerCertErrorPromptForm()) + { + certErrorPromptForm.Message = message; + certErrorPromptForm.Target = target; + certErrorPromptForm.PolicyError = policyerror; + certErrorPromptForm.RetryButton.Focus(); + return certErrorPromptForm.ShowDialog(owner); + } + } + + private void ServerCertErrorPromptForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + } + } +} diff --git a/CarotDAV/ServerCertErrorPromptForm.resx b/CarotDAV/ServerCertErrorPromptForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/ServerCertErrorPromptForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/SettingSupport.cs b/CarotDAV/SettingSupport.cs new file mode 100644 index 0000000..3c74bb4 --- /dev/null +++ b/CarotDAV/SettingSupport.cs @@ -0,0 +1,80 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.SettingSupport +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System.Collections; +using System.Reflection; +using System.Runtime.CompilerServices; + +namespace CarotDAV +{ + public class SettingSupport + { + public static bool IsSameType(object object1, object object2) + { + if (object1 == null) + return object2 == null; + if (object2 == null) + return false; + return object1.GetType() == object2.GetType(); + } + + public static bool IsSameContents(object object1, object object2, bool includenonpublic) + { + if (object.ReferenceEquals(RuntimeHelpers.GetObjectValue(object1), RuntimeHelpers.GetObjectValue(object2))) + return true; + if (!SettingSupport.IsSameType(RuntimeHelpers.GetObjectValue(object1), RuntimeHelpers.GetObjectValue(object2))) + return false; + BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public; + if (includenonpublic) + bindingAttr |= BindingFlags.NonPublic; + FieldInfo[] fields = object1.GetType().GetFields(bindingAttr); + FieldInfo[] fieldInfoArray1 = fields; + int index1 = 0; + while (index1 < fieldInfoArray1.Length) + { + FieldInfo fieldInfo = fieldInfoArray1[index1]; + object objectValue = RuntimeHelpers.GetObjectValue(fieldInfo.GetValue(RuntimeHelpers.GetObjectValue(object1))); + if (objectValue == null) + { + if (fieldInfo.GetValue(RuntimeHelpers.GetObjectValue(object2)) != null) + return false; + } + else if ((fieldInfo.FieldType.IsPrimitive || fieldInfo.FieldType.IsEnum) && !objectValue.Equals(RuntimeHelpers.GetObjectValue(fieldInfo.GetValue(RuntimeHelpers.GetObjectValue(object2))))) + return false; + checked { ++index1; } + } + FieldInfo[] fieldInfoArray2 = fields; + int index2 = 0; + while (index2 < fieldInfoArray2.Length) + { + FieldInfo fieldInfo = fieldInfoArray2[index2]; + object objectValue1 = RuntimeHelpers.GetObjectValue(fieldInfo.GetValue(RuntimeHelpers.GetObjectValue(object1))); + object objectValue2 = RuntimeHelpers.GetObjectValue(fieldInfo.GetValue(RuntimeHelpers.GetObjectValue(object2))); + if (objectValue1 != null && !fieldInfo.FieldType.IsPrimitive && !fieldInfo.FieldType.IsEnum && (fieldInfo.FieldType.IsValueType || !object.ReferenceEquals(RuntimeHelpers.GetObjectValue(objectValue1), RuntimeHelpers.GetObjectValue(objectValue2)))) + { + if (objectValue1 is ICollection) + { + ICollection collection1 = (ICollection) objectValue1; + ICollection collection2 = (ICollection) objectValue2; + if (collection1.Count != collection2.Count) + return false; + IEnumerator enumerator1 = collection1.GetEnumerator(); + IEnumerator enumerator2 = collection2.GetEnumerator(); + while (enumerator1.MoveNext() && enumerator2.MoveNext()) + { + if (!SettingSupport.IsSameContents(RuntimeHelpers.GetObjectValue(enumerator1.Current), RuntimeHelpers.GetObjectValue(enumerator2.Current), includenonpublic)) + return false; + } + } + else if (!objectValue1.Equals(RuntimeHelpers.GetObjectValue(objectValue2))) + return false; + } + checked { ++index2; } + } + return true; + } + } +} diff --git a/CarotDAV/SimpleResourceInfo.cs b/CarotDAV/SimpleResourceInfo.cs new file mode 100644 index 0000000..98f7462 --- /dev/null +++ b/CarotDAV/SimpleResourceInfo.cs @@ -0,0 +1,89 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.SimpleResourceInfo +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Rei.Fs; +using System; +using System.Diagnostics; +using System.IO; + +namespace CarotDAV +{ + [DebuggerDisplay("{DebuggerString}")] + [Serializable] + public class SimpleResourceInfo : ICloneable + { + public string Name; + public long Size; + public DateTime LastModifiedTime; + public bool IsCollection; + + public SimpleResourceInfo() + { + this.Name = (string) null; + } + + public SimpleResourceInfo(string name, long size, DateTime lastmodified, bool iscollection) + { + this.Name = name; + this.Size = size; + this.LastModifiedTime = lastmodified; + this.IsCollection = iscollection; + } + + public SimpleResourceInfo(ResourceInfo ri) + { + this.Name = ri.Id.ToString(); + this.Size = ri.Size; + this.LastModifiedTime = ri.LastModifiedTime; + this.IsCollection = ri.IsCollection; + } + + public string DebuggerString + { + get + { + return this.ToString(); + } + } + + public override string ToString() + { + string str1 = ""; + string str2 = this.Name != null ? str1 + this.Name : str1 + "Noname"; + return (!this.IsCollection ? str2 + " " : str2 + " ") + this.Size.ToString(); + } + + public object Clone() + { + return (object) (SimpleResourceInfo) this.MemberwiseClone(); + } + + public static SimpleResourceInfo CreateLocalFileInfo(string path) + { + if (File.Exists(path)) + { + FileInfo fileInfo = new FileInfo(path); + return new SimpleResourceInfo() + { + Name = path, + Size = fileInfo.Length, + LastModifiedTime = fileInfo.LastWriteTime, + IsCollection = false + }; + } + if (!Directory.Exists(path)) + return (SimpleResourceInfo) null; + DirectoryInfo directoryInfo = new DirectoryInfo(path); + return new SimpleResourceInfo() + { + Name = path, + Size = 0, + LastModifiedTime = directoryInfo.LastWriteTime, + IsCollection = true + }; + } + } +} diff --git a/CarotDAV/TaskbarManager.cs b/CarotDAV/TaskbarManager.cs new file mode 100644 index 0000000..452e968 --- /dev/null +++ b/CarotDAV/TaskbarManager.cs @@ -0,0 +1,498 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.TaskbarManager +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class TaskbarManager + { + private static int pTaskbarButtonCreatedMessage = -1; + private static TaskbarManager.ITaskbarList4 pTaskbarList4; + private static TaskbarManager.PropertyKey PKEY_Title; + + [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern int RegisterWindowMessage([MarshalAs(UnmanagedType.LPWStr)] string lpString); + + [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern int SetCurrentProcessExplicitAppUserModelID([MarshalAs(UnmanagedType.LPWStr)] string AppID); + + [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern void SHAddToRecentDocs(TaskbarManager.SHARD uflag, [In] ref TaskbarManager.SHARDAPPIDINFOLINK pv); + + static TaskbarManager() + { + try + { + TaskbarManager.pTaskbarList4 = Activator.CreateInstance(System.Type.GetTypeFromCLSID(new Guid("56FDF344-FD6D-11d0-958A-006097C9A090"))) as TaskbarManager.ITaskbarList4; + if (TaskbarManager.pTaskbarList4 != null) + TaskbarManager.pTaskbarList4.HrInit(); + } + catch (COMException ex) + { + ProjectData.SetProjectError((Exception) ex); + TaskbarManager.pTaskbarList4 = (TaskbarManager.ITaskbarList4) null; + ProjectData.ClearProjectError(); + } + catch (NotImplementedException ex) + { + ProjectData.SetProjectError((Exception) ex); + TaskbarManager.pTaskbarList4 = (TaskbarManager.ITaskbarList4) null; + ProjectData.ClearProjectError(); + } + TaskbarManager.PKEY_Title = new TaskbarManager.PropertyKey(); + TaskbarManager.PKEY_Title.fmtid = new Guid("F29F85E0-4FF9-1068-AB91-08002B27B3D9"); + TaskbarManager.PKEY_Title.pid = 2; + } + + public static int TaskbarButtonCreatedMessage + { + get + { + return TaskbarManager.pTaskbarButtonCreatedMessage; + } + } + + public static void RegisterTaskbarMessage() + { + try + { + if (TaskbarManager.pTaskbarButtonCreatedMessage != -1) + return; + TaskbarManager.pTaskbarButtonCreatedMessage = TaskbarManager.RegisterWindowMessage("TaskbarButtonCreated"); + } + catch (DllNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (EntryPointNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + public static void SetAppUserModelID(string AppID) + { + try + { + TaskbarManager.SetCurrentProcessExplicitAppUserModelID(AppID); + } + catch (DllNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (EntryPointNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + private static TaskbarManager.IShellLinkW CreateShellLink(string apppath, string arguments, string title, string tooltip, string iconpath, int iconindex) + { + try + { + TaskbarManager.IShellLinkW instance = Activator.CreateInstance(System.Type.GetTypeFromCLSID(new Guid("00021401-0000-0000-C000-000000000046"))) as TaskbarManager.IShellLinkW; + if (instance == null) + return (TaskbarManager.IShellLinkW) null; + TaskbarManager.IPropertyStore propertyStore = instance as TaskbarManager.IPropertyStore; + if (propertyStore == null) + return (TaskbarManager.IShellLinkW) null; + instance.SetPath(apppath); + if (arguments != null) + instance.SetArguments(arguments); + if (iconpath != null) + instance.SetIconLocation(iconpath, iconindex); + if (tooltip != null) + instance.SetDescription(tooltip); + propertyStore.SetValue(ref TaskbarManager.PKEY_Title, ref new TaskbarManager.PropVariant() + { + _ptr = Marshal.StringToCoTaskMemUni(title), + _valueType = VarEnum.VT_LPWSTR + }); + propertyStore.Commit(); + return instance; + } + catch (COMException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (NotImplementedException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + return (TaskbarManager.IShellLinkW) null; + } + + public static void AddToRecent(string appid, string apppath, string arguments, string title, string tooltip, string iconpath, int iconindex) + { + if (!TaskbarManager.IsSupportJumpList) + return; + TaskbarManager.IShellLinkW shellLink = TaskbarManager.CreateShellLink(apppath, arguments, title, tooltip, iconpath, iconindex); + if (shellLink == null) + return; + TaskbarManager.SHARDAPPIDINFOLINK pv; + pv.psl = shellLink; + pv.pszAppID = appid; + TaskbarManager.SHAddToRecentDocs(TaskbarManager.SHARD.SHARD_APPIDINFOLINK, ref pv); + } + + public static void SetJumpListKnownCategory(string appid, bool frequent) + { + if (!TaskbarManager.IsSupportJumpList) + return; + try + { + TaskbarManager.ICustomDestinationList instance = Activator.CreateInstance(System.Type.GetTypeFromCLSID(new Guid("77F10CF0-3DB5-4966-B520-B7C54FD35ED6"))) as TaskbarManager.ICustomDestinationList; + if (instance == null) + return; + Guid riid = new Guid("92CA9DCD-5622-4BBA-A805-5E9F541BD8C9"); + object ppvObject = (object) null; + instance.SetAppID(appid); + uint cMaxSlots; + instance.BeginList(out cMaxSlots, ref riid, out ppvObject); + if (frequent) + instance.AppendKnownCategory(TaskbarManager.KnownDestinationCategory.Frequent); + else + instance.AppendKnownCategory(TaskbarManager.KnownDestinationCategory.Recent); + instance.CommitList(); + } + catch (COMException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (NotImplementedException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + public static void ClearJumpList(string appid) + { + if (!TaskbarManager.IsSupportJumpList) + return; + try + { + TaskbarManager.IApplicationDestination instance = Activator.CreateInstance(System.Type.GetTypeFromCLSID(new Guid("86C14003-4D6B-4EF3-A7B4-0506663B2E68"))) as TaskbarManager.IApplicationDestination; + if (instance == null) + return; + instance.SetAppID(appid); + instance.RemoveAllDestinations(); + } + catch (COMException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (NotImplementedException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + + public static void SetProgressState(Control control, TaskbarManager.TaskbarProgressBarStatus tbpFlags) + { + if (!TaskbarManager.IsSupportJumpList) + return; + try + { + TaskbarManager.pTaskbarList4.SetProgressState(control.Handle, tbpFlags); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + public static void SetProgressValue(Control control, ulong ullCompleted, ulong ullTotal) + { + if (!TaskbarManager.IsSupportJumpList) + return; + TaskbarManager.pTaskbarList4.SetProgressValue(control.Handle, ullCompleted, ullTotal); + } + + public static bool IsSupportJumpList + { + get + { + return TaskbarManager.pTaskbarList4 != null; + } + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("C43DC798-95D1-4BEA-9030-BB99E2983A1A")] + [ComImport] + private interface ITaskbarList4 + { + void HrInit(); + + void AddTab(IntPtr hwnd); + + void DeleteTab(IntPtr hwnd); + + void ActivateTab(IntPtr hwnd); + + void SetActiveAlt(IntPtr hwnd); + + void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); + + void SetProgressValue(IntPtr hwnd, ulong ullCompleted, ulong ullTotal); + + void SetProgressState(IntPtr hwnd, TaskbarManager.TaskbarProgressBarStatus tbpFlags); + + void RegisterTab(IntPtr hwndTab, IntPtr hwndMDI); + + void UnregisterTab(IntPtr hwndTab); + + void SetTabOrder(IntPtr hwndTab, IntPtr hwndInsertBefore); + + void SetTabActive(IntPtr hwndTab, IntPtr hwndInsertBefore, uint dwReserved); + + void ThumbBarAddButtons(IntPtr hwnd, uint cButtons, [MarshalAs(UnmanagedType.LPArray)] TaskbarManager.ThumbButton[] pButtons); + + void ThumbBarSetImageList(IntPtr hwnd, IntPtr himl); + + void ThumbBarUpdateButtons(IntPtr hwnd, uint cButtons, [MarshalAs(UnmanagedType.LPArray)] TaskbarManager.ThumbButton[] pButtons); + + void SetOverlayIcon(IntPtr hwnd, IntPtr hIcon, [MarshalAs(UnmanagedType.LPWStr)] string pszDescription); + + void SetThumbnailClip(IntPtr hwnd, IntPtr prcClip); + + void SetThumbnailTooltip(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)] string pszTip); + + void SetTabProperties(IntPtr hwndTab, TaskbarManager.SetTabPropertiesOption stpFlags); + } + + public enum TaskbarProgressBarStatus + { + NoProgress = 0, + Indeterminate = 1, + Normal = 2, + Error = 4, + Paused = 8, + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct ThumbButton + { + internal const int Clicked = 6144; + [MarshalAs(UnmanagedType.U4)] + internal TaskbarManager.ThumbButtonMask Mask; + internal uint Id; + internal uint Bitmap; + internal IntPtr Icon; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + internal string Tip; + [MarshalAs(UnmanagedType.U4)] + internal TaskbarManager.ThumbButtonOptions Flags; + } + + public enum ThumbButtonMask + { + Bitmap = 1, + Icon = 2, + Tooltip = 4, + THB_FLAGS = 8, + } + + [Flags] + public enum ThumbButtonOptions + { + Disabled = 1, + DismissOnClick = 2, + Enabled = 0, + Hidden = 8, + NoBackground = 4, + NonInteractive = 16, + } + + public enum SetTabPropertiesOption + { + None = 0, + UseAppThumbnailAlways = 1, + UseAppThumbnailWhenActive = 2, + UseAppPeekAlways = 4, + UseAppPeekWhenActive = 8, + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("6332DEBF-87B5-4670-90C0-5E57B408A49E")] + [ComImport] + private interface ICustomDestinationList + { + void SetAppID([MarshalAs(UnmanagedType.LPWStr)] string pszAppID); + + void BeginList(out uint cMaxSlots, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject); + + void AppendCategory([MarshalAs(UnmanagedType.LPWStr)] string pszCategory, [MarshalAs(UnmanagedType.Interface)] TaskbarManager.IObjectArray poa); + + void AppendKnownCategory([MarshalAs(UnmanagedType.I4)] TaskbarManager.KnownDestinationCategory category); + + void AddUserTasks([MarshalAs(UnmanagedType.Interface)] TaskbarManager.IObjectArray poa); + + void CommitList(); + + void GetRemovedDestinations(ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject); + + void DeleteList([MarshalAs(UnmanagedType.LPWStr)] string pszAppID); + + void AbortList(); + } + + [Guid("92CA9DCD-5622-4BBA-A805-5E9F541BD8C9")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport] + private interface IObjectArray + { + void GetCount(out uint cObjects); + + void GetAt(uint iIndex, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject); + } + + public enum KnownDestinationCategory + { + Frequent = 1, + Recent = 2, + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("000214F9-0000-0000-C000-000000000046")] + [ComImport] + private interface IShellLinkW + { + void GetPath([MarshalAs(UnmanagedType.LPWStr), Out] StringBuilder pszFile, int cchMaxPath, IntPtr pfd, uint fFlags); + + void GetIDList(out IntPtr ppidl); + + void SetIDList(IntPtr pidl); + + void GetDescription([MarshalAs(UnmanagedType.LPWStr), Out] StringBuilder pszFile, int cchMaxName); + + void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); + + void GetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr), Out] StringBuilder pszDir, int cchMaxPath); + + void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir); + + void GetArguments([MarshalAs(UnmanagedType.LPWStr), Out] StringBuilder pszArgs, int cchMaxPath); + + void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs); + + void GetHotKey(out short wHotKey); + + void SetHotKey(short wHotKey); + + void GetShowCmd(out uint iShowCmd); + + void SetShowCmd(uint iShowCmd); + + void GetIconLocation([MarshalAs(UnmanagedType.LPWStr)] out StringBuilder pszIconPath, int cchIconPath, out int iIcon); + + void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); + + void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, uint dwReserved); + + void Resolve(IntPtr hwnd, uint fFlags); + + void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99")] + [ComImport] + private interface IPropertyStore + { + void GetCount(out uint propertyCount); + + void GetAt([In] uint propertyIndex, out TaskbarManager.PropertyKey key); + + void GetValue([In] ref TaskbarManager.PropertyKey key, out TaskbarManager.PropVariant pv); + + void SetValue([In] ref TaskbarManager.PropertyKey key, [In] ref TaskbarManager.PropVariant pv); + + void Commit(); + } + + private struct PropertyKey + { + public Guid fmtid; + public int pid; + } + + [StructLayout(LayoutKind.Explicit)] + private struct PropVariant + { + [FieldOffset(0)] + public VarEnum _valueType; + [FieldOffset(8)] + public IntPtr _ptr; + [FieldOffset(8)] + public sbyte _sbyte; + [FieldOffset(8)] + public short _short; + [FieldOffset(8)] + public int _int32; + [FieldOffset(8)] + public long _long; + [FieldOffset(8)] + public byte _byte; + [FieldOffset(8)] + public ushort _ushort; + [FieldOffset(8)] + public uint _uint32; + [FieldOffset(8)] + public ulong _ulong; + [FieldOffset(8)] + public double _double; + [FieldOffset(8)] + public float _float; + } + + private struct SHARDAPPIDINFOLINK + { + public TaskbarManager.IShellLinkW psl; + [MarshalAs(UnmanagedType.LPWStr)] + public string pszAppID; + } + + private enum SHARD + { + SHARD_PIDL = 1, + SHARD_PATHA = 2, + SHARD_PATHW = 3, + SHARD_APPIDINFO = 4, + SHARD_APPIDINFOIDLIST = 5, + SHARD_LINK = 6, + SHARD_APPIDINFOLINK = 7, + SHARD_SHELLITEM = 8, + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("12337D35-94C6-48A0-BCE7-6A9C69D4D600")] + [ComImport] + private interface IApplicationDestination + { + void SetAppID([MarshalAs(UnmanagedType.LPWStr)] string pszFile); + + void RemoveDestination(object punk); + + void RemoveAllDestinations(); + } + } +} diff --git a/CarotDAV/UpDownForm.cs b/CarotDAV/UpDownForm.cs new file mode 100644 index 0000000..f8e7b2e --- /dev/null +++ b/CarotDAV/UpDownForm.cs @@ -0,0 +1,1884 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.UpDownForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Com; +using Rei.Fs; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class UpDownForm : Form + { + private IContainer components; + [AccessedThroughProperty("TotalProgressBar")] + private ProgressBar _TotalProgressBar; + [AccessedThroughProperty("FileProgressBar")] + private ProgressBar _FileProgressBar; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("FileInfoTextBox")] + private TextBox _FileInfoTextBox; + [AccessedThroughProperty("TotalInfoTextBox")] + private TextBox _TotalInfoTextBox; + [AccessedThroughProperty("AsyncCopy1")] + private AsyncCopy _AsyncCopy1; + [AccessedThroughProperty("SourceTextBox")] + private TextBox _SourceTextBox; + [AccessedThroughProperty("CheckBoxStopFile")] + private CheckBox _CheckBoxStopFile; + [AccessedThroughProperty("ExpandButton")] + private Button _ExpandButton; + [AccessedThroughProperty("MessageTextBox")] + private TextBox _MessageTextBox; + [AccessedThroughProperty("SplitContainer1")] + private SplitContainer _SplitContainer1; + [AccessedThroughProperty("Button1")] + private Button _Button1; + [AccessedThroughProperty("OnErrorGroupBox")] + private GroupBox _OnErrorGroupBox; + [AccessedThroughProperty("RadioButtonErrorPrompt")] + private RadioButton _RadioButtonErrorPrompt; + [AccessedThroughProperty("RadioButtonErrorIgnore")] + private RadioButton _RadioButtonErrorIgnore; + [AccessedThroughProperty("GroupBox3")] + private GroupBox _GroupBox3; + [AccessedThroughProperty("RadioButtonOtherPrompt")] + private RadioButton _RadioButtonOtherPrompt; + [AccessedThroughProperty("RadioButtonOtherDelete")] + private RadioButton _RadioButtonOtherDelete; + [AccessedThroughProperty("RadioButtonOtherSkip")] + private RadioButton _RadioButtonOtherSkip; + [AccessedThroughProperty("GroupBox2")] + private GroupBox _GroupBox2; + [AccessedThroughProperty("RadioButtonFolderPrompt")] + private RadioButton _RadioButtonFolderPrompt; + [AccessedThroughProperty("RadioButtonFolderIntegrate")] + private RadioButton _RadioButtonFolderIntegrate; + [AccessedThroughProperty("RadioButtonFolderDelete")] + private RadioButton _RadioButtonFolderDelete; + [AccessedThroughProperty("RadioButtonFolderSkip")] + private RadioButton _RadioButtonFolderSkip; + [AccessedThroughProperty("GroupBox1")] + private GroupBox _GroupBox1; + [AccessedThroughProperty("RadioButtonFilePrompt")] + private RadioButton _RadioButtonFilePrompt; + [AccessedThroughProperty("RadioButtonFileOverwrite")] + private RadioButton _RadioButtonFileOverwrite; + [AccessedThroughProperty("RadioButtonFileOverwriteNewer")] + private RadioButton _RadioButtonFileOverwriteNewer; + [AccessedThroughProperty("RadioButtonFileResume")] + private RadioButton _RadioButtonFileResume; + [AccessedThroughProperty("RadioButtonFileDelete")] + private RadioButton _RadioButtonFileDelete; + [AccessedThroughProperty("RadioButtonFileSkip")] + private RadioButton _RadioButtonFileSkip; + [AccessedThroughProperty("RadioButtonFileChangeName")] + private RadioButton _RadioButtonFileChangeName; + [AccessedThroughProperty("RadioButtonOtherChangeName")] + private RadioButton _RadioButtonOtherChangeName; + [AccessedThroughProperty("RadioButtonFolderChangeName")] + private RadioButton _RadioButtonFolderChangeName; + [AccessedThroughProperty("Timer1")] + private Timer _Timer1; + [AccessedThroughProperty("TextBoxFileFolderCount")] + private TextBox _TextBoxFileFolderCount; + private string pTitle; + private bool pShowCancelDialog; + private MainForm pMainForm; + private ConflictPromptManager pConflictManager; + private ErrorPromptManager pErrorManager; + private bool pEnableResume; + private UpDownForm.TransferDirectionType pDirection; + private int panel2height; + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + this.TotalProgressBar = new ProgressBar(); + this.FileProgressBar = new ProgressBar(); + this.Label1 = new Label(); + this.Label2 = new Label(); + this.m_CancelButton = new Button(); + this.FileInfoTextBox = new TextBox(); + this.TotalInfoTextBox = new TextBox(); + this.SourceTextBox = new TextBox(); + this.CheckBoxStopFile = new CheckBox(); + this.ExpandButton = new Button(); + this.MessageTextBox = new TextBox(); + this.SplitContainer1 = new SplitContainer(); + this.TextBoxFileFolderCount = new TextBox(); + this.Button1 = new Button(); + this.OnErrorGroupBox = new GroupBox(); + this.RadioButtonErrorPrompt = new RadioButton(); + this.RadioButtonErrorIgnore = new RadioButton(); + this.GroupBox3 = new GroupBox(); + this.RadioButtonOtherPrompt = new RadioButton(); + this.RadioButtonOtherDelete = new RadioButton(); + this.RadioButtonOtherSkip = new RadioButton(); + this.RadioButtonOtherChangeName = new RadioButton(); + this.GroupBox2 = new GroupBox(); + this.RadioButtonFolderPrompt = new RadioButton(); + this.RadioButtonFolderIntegrate = new RadioButton(); + this.RadioButtonFolderDelete = new RadioButton(); + this.RadioButtonFolderSkip = new RadioButton(); + this.RadioButtonFolderChangeName = new RadioButton(); + this.GroupBox1 = new GroupBox(); + this.RadioButtonFilePrompt = new RadioButton(); + this.RadioButtonFileOverwrite = new RadioButton(); + this.RadioButtonFileOverwriteNewer = new RadioButton(); + this.RadioButtonFileResume = new RadioButton(); + this.RadioButtonFileDelete = new RadioButton(); + this.RadioButtonFileChangeName = new RadioButton(); + this.RadioButtonFileSkip = new RadioButton(); + this.Timer1 = new Timer(this.components); + this.AsyncCopy1 = new AsyncCopy(this.components); + this.SplitContainer1.Panel1.SuspendLayout(); + this.SplitContainer1.Panel2.SuspendLayout(); + this.SplitContainer1.SuspendLayout(); + this.OnErrorGroupBox.SuspendLayout(); + this.GroupBox3.SuspendLayout(); + this.GroupBox2.SuspendLayout(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + this.TotalProgressBar.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + ProgressBar totalProgressBar1 = this.TotalProgressBar; + Point point1 = new Point(8, 97); + Point point2 = point1; + totalProgressBar1.Location = point2; + this.TotalProgressBar.Maximum = 1000; + this.TotalProgressBar.Name = "TotalProgressBar"; + ProgressBar totalProgressBar2 = this.TotalProgressBar; + Size size1 = new Size(296, 16); + Size size2 = size1; + totalProgressBar2.Size = size2; + this.TotalProgressBar.TabIndex = 5; + this.FileProgressBar.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + ProgressBar fileProgressBar1 = this.FileProgressBar; + point1 = new Point(8, 137); + Point point3 = point1; + fileProgressBar1.Location = point3; + this.FileProgressBar.Maximum = 1000; + this.FileProgressBar.Name = "FileProgressBar"; + ProgressBar fileProgressBar2 = this.FileProgressBar; + size1 = new Size(296, 16); + Size size3 = size1; + fileProgressBar2.Size = size3; + this.FileProgressBar.TabIndex = 8; + this.Label1.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 64); + Point point4 = point1; + label1_1.Location = point4; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(31, 12); + Size size4 = size1; + label1_2.Size = size4; + this.Label1.TabIndex = 2; + this.Label1.Text = "Total"; + this.Label2.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(8, 121); + Point point5 = point1; + label2_1.Location = point5; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(24, 12); + Size size5 = size1; + label2_2.Size = size5; + this.Label2.TabIndex = 6; + this.Label2.Text = "File"; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(232, 161); + Point point6 = point1; + mCancelButton1.Location = point6; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size6 = size1; + mCancelButton2.Size = size6; + this.m_CancelButton.TabIndex = 12; + this.m_CancelButton.Text = "Stop now"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.FileInfoTextBox.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.FileInfoTextBox.BorderStyle = BorderStyle.None; + TextBox fileInfoTextBox1 = this.FileInfoTextBox; + point1 = new Point(48, 121); + Point point7 = point1; + fileInfoTextBox1.Location = point7; + this.FileInfoTextBox.Name = "FileInfoTextBox"; + this.FileInfoTextBox.ReadOnly = true; + TextBox fileInfoTextBox2 = this.FileInfoTextBox; + size1 = new Size(251, 12); + Size size7 = size1; + fileInfoTextBox2.Size = size7; + this.FileInfoTextBox.TabIndex = 7; + this.FileInfoTextBox.TabStop = false; + this.FileInfoTextBox.Text = "File Transfer Information"; + this.TotalInfoTextBox.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.TotalInfoTextBox.BorderStyle = BorderStyle.None; + TextBox totalInfoTextBox1 = this.TotalInfoTextBox; + point1 = new Point(48, 81); + Point point8 = point1; + totalInfoTextBox1.Location = point8; + this.TotalInfoTextBox.Name = "TotalInfoTextBox"; + this.TotalInfoTextBox.ReadOnly = true; + TextBox totalInfoTextBox2 = this.TotalInfoTextBox; + size1 = new Size(256, 12); + Size size8 = size1; + totalInfoTextBox2.Size = size8; + this.TotalInfoTextBox.TabIndex = 4; + this.TotalInfoTextBox.TabStop = false; + this.TotalInfoTextBox.Text = "Total Transfer Information"; + this.SourceTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox sourceTextBox1 = this.SourceTextBox; + point1 = new Point(8, 24); + Point point9 = point1; + sourceTextBox1.Location = point9; + this.SourceTextBox.Multiline = true; + this.SourceTextBox.Name = "SourceTextBox"; + this.SourceTextBox.ReadOnly = true; + TextBox sourceTextBox2 = this.SourceTextBox; + size1 = new Size(296, 32); + Size size9 = size1; + sourceTextBox2.Size = size9; + this.SourceTextBox.TabIndex = 1; + this.SourceTextBox.TabStop = false; + this.CheckBoxStopFile.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.CheckBoxStopFile.Appearance = Appearance.Button; + CheckBox checkBoxStopFile1 = this.CheckBoxStopFile; + point1 = new Point(128, 161); + Point point10 = point1; + checkBoxStopFile1.Location = point10; + this.CheckBoxStopFile.Name = "CheckBoxStopFile"; + CheckBox checkBoxStopFile2 = this.CheckBoxStopFile; + size1 = new Size(96, 24); + Size size10 = size1; + checkBoxStopFile2.Size = size10; + this.CheckBoxStopFile.TabIndex = 11; + this.CheckBoxStopFile.Text = "Stop after file"; + this.CheckBoxStopFile.TextAlign = ContentAlignment.MiddleCenter; + this.ExpandButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.ExpandButton.Image = (Image) CarotDAV.My.Resources.Resources.MoveUp; + Button expandButton1 = this.ExpandButton; + point1 = new Point(8, 161); + Point point11 = point1; + expandButton1.Location = point11; + this.ExpandButton.Name = "ExpandButton"; + Button expandButton2 = this.ExpandButton; + size1 = new Size(24, 24); + Size size11 = size1; + expandButton2.Size = size11; + this.ExpandButton.TabIndex = 9; + this.ExpandButton.UseVisualStyleBackColor = true; + this.MessageTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + this.MessageTextBox.BorderStyle = BorderStyle.None; + TextBox messageTextBox1 = this.MessageTextBox; + point1 = new Point(8, 8); + Point point12 = point1; + messageTextBox1.Location = point12; + this.MessageTextBox.Name = "MessageTextBox"; + this.MessageTextBox.ReadOnly = true; + TextBox messageTextBox2 = this.MessageTextBox; + size1 = new Size(296, 12); + Size size12 = size1; + messageTextBox2.Size = size12; + this.MessageTextBox.TabIndex = 0; + this.MessageTextBox.TabStop = false; + this.MessageTextBox.Text = "Message"; + this.SplitContainer1.Dock = DockStyle.Fill; + this.SplitContainer1.FixedPanel = FixedPanel.Panel1; + SplitContainer splitContainer1_1 = this.SplitContainer1; + point1 = new Point(0, 0); + Point point13 = point1; + splitContainer1_1.Location = point13; + this.SplitContainer1.Name = "SplitContainer1"; + this.SplitContainer1.Orientation = Orientation.Horizontal; + this.SplitContainer1.Panel1.Controls.Add((Control) this.TextBoxFileFolderCount); + this.SplitContainer1.Panel1.Controls.Add((Control) this.Button1); + this.SplitContainer1.Panel1.Controls.Add((Control) this.ExpandButton); + this.SplitContainer1.Panel1.Controls.Add((Control) this.MessageTextBox); + this.SplitContainer1.Panel1.Controls.Add((Control) this.CheckBoxStopFile); + this.SplitContainer1.Panel1.Controls.Add((Control) this.TotalProgressBar); + this.SplitContainer1.Panel1.Controls.Add((Control) this.SourceTextBox); + this.SplitContainer1.Panel1.Controls.Add((Control) this.FileProgressBar); + this.SplitContainer1.Panel1.Controls.Add((Control) this.Label1); + this.SplitContainer1.Panel1.Controls.Add((Control) this.TotalInfoTextBox); + this.SplitContainer1.Panel1.Controls.Add((Control) this.Label2); + this.SplitContainer1.Panel1.Controls.Add((Control) this.FileInfoTextBox); + this.SplitContainer1.Panel1.Controls.Add((Control) this.m_CancelButton); + this.SplitContainer1.Panel1MinSize = 0; + this.SplitContainer1.Panel2.Controls.Add((Control) this.OnErrorGroupBox); + this.SplitContainer1.Panel2.Controls.Add((Control) this.GroupBox3); + this.SplitContainer1.Panel2.Controls.Add((Control) this.GroupBox2); + this.SplitContainer1.Panel2.Controls.Add((Control) this.GroupBox1); + this.SplitContainer1.Panel2MinSize = 0; + SplitContainer splitContainer1_2 = this.SplitContainer1; + size1 = new Size(313, 410); + Size size13 = size1; + splitContainer1_2.Size = size13; + this.SplitContainer1.SplitterDistance = 192; + this.SplitContainer1.SplitterWidth = 1; + this.SplitContainer1.TabIndex = 0; + this.TextBoxFileFolderCount.BorderStyle = BorderStyle.None; + TextBox boxFileFolderCount1 = this.TextBoxFileFolderCount; + point1 = new Point(48, 64); + Point point14 = point1; + boxFileFolderCount1.Location = point14; + this.TextBoxFileFolderCount.Name = "TextBoxFileFolderCount"; + this.TextBoxFileFolderCount.ReadOnly = true; + TextBox boxFileFolderCount2 = this.TextBoxFileFolderCount; + size1 = new Size(256, 12); + Size size14 = size1; + boxFileFolderCount2.Size = size14; + this.TextBoxFileFolderCount.TabIndex = 3; + this.TextBoxFileFolderCount.TabStop = false; + this.TextBoxFileFolderCount.Text = "File and Folder Counter"; + this.Button1.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.Button1.Image = (Image) CarotDAV.My.Resources.Resources.OptionsHS; + Button button1_1 = this.Button1; + point1 = new Point(40, 161); + Point point15 = point1; + button1_1.Location = point15; + this.Button1.Name = "Button1"; + Button button1_2 = this.Button1; + size1 = new Size(24, 24); + Size size15 = size1; + button1_2.Size = size15; + this.Button1.TabIndex = 10; + this.Button1.UseVisualStyleBackColor = true; + this.Button1.Visible = false; + this.OnErrorGroupBox.Controls.Add((Control) this.RadioButtonErrorPrompt); + this.OnErrorGroupBox.Controls.Add((Control) this.RadioButtonErrorIgnore); + GroupBox onErrorGroupBox1 = this.OnErrorGroupBox; + point1 = new Point(8, 8); + Point point16 = point1; + onErrorGroupBox1.Location = point16; + this.OnErrorGroupBox.Name = "OnErrorGroupBox"; + GroupBox onErrorGroupBox2 = this.OnErrorGroupBox; + size1 = new Size(144, 56); + Size size16 = size1; + onErrorGroupBox2.Size = size16; + this.OnErrorGroupBox.TabIndex = 0; + this.OnErrorGroupBox.TabStop = false; + this.OnErrorGroupBox.Text = "On Error"; + this.RadioButtonErrorPrompt.AutoSize = true; + RadioButton buttonErrorPrompt1 = this.RadioButtonErrorPrompt; + point1 = new Point(16, 16); + Point point17 = point1; + buttonErrorPrompt1.Location = point17; + this.RadioButtonErrorPrompt.Name = "RadioButtonErrorPrompt"; + RadioButton buttonErrorPrompt2 = this.RadioButtonErrorPrompt; + size1 = new Size(59, 16); + Size size17 = size1; + buttonErrorPrompt2.Size = size17; + this.RadioButtonErrorPrompt.TabIndex = 0; + this.RadioButtonErrorPrompt.TabStop = true; + this.RadioButtonErrorPrompt.Text = "Prompt"; + this.RadioButtonErrorPrompt.UseVisualStyleBackColor = true; + this.RadioButtonErrorIgnore.AutoSize = true; + RadioButton buttonErrorIgnore1 = this.RadioButtonErrorIgnore; + point1 = new Point(16, 32); + Point point18 = point1; + buttonErrorIgnore1.Location = point18; + this.RadioButtonErrorIgnore.Name = "RadioButtonErrorIgnore"; + RadioButton buttonErrorIgnore2 = this.RadioButtonErrorIgnore; + size1 = new Size(54, 16); + Size size18 = size1; + buttonErrorIgnore2.Size = size18; + this.RadioButtonErrorIgnore.TabIndex = 1; + this.RadioButtonErrorIgnore.TabStop = true; + this.RadioButtonErrorIgnore.Text = "Ignore"; + this.RadioButtonErrorIgnore.UseVisualStyleBackColor = true; + this.GroupBox3.Controls.Add((Control) this.RadioButtonOtherPrompt); + this.GroupBox3.Controls.Add((Control) this.RadioButtonOtherDelete); + this.GroupBox3.Controls.Add((Control) this.RadioButtonOtherSkip); + this.GroupBox3.Controls.Add((Control) this.RadioButtonOtherChangeName); + GroupBox groupBox3_1 = this.GroupBox3; + point1 = new Point(160, 120); + Point point19 = point1; + groupBox3_1.Location = point19; + this.GroupBox3.Name = "GroupBox3"; + GroupBox groupBox3_2 = this.GroupBox3; + size1 = new Size(144, 88); + Size size19 = size1; + groupBox3_2.Size = size19; + this.GroupBox3.TabIndex = 3; + this.GroupBox3.TabStop = false; + this.GroupBox3.Text = "On Other Confliction"; + this.RadioButtonOtherPrompt.AutoSize = true; + RadioButton buttonOtherPrompt1 = this.RadioButtonOtherPrompt; + point1 = new Point(16, 16); + Point point20 = point1; + buttonOtherPrompt1.Location = point20; + this.RadioButtonOtherPrompt.Name = "RadioButtonOtherPrompt"; + RadioButton buttonOtherPrompt2 = this.RadioButtonOtherPrompt; + size1 = new Size(59, 16); + Size size20 = size1; + buttonOtherPrompt2.Size = size20; + this.RadioButtonOtherPrompt.TabIndex = 0; + this.RadioButtonOtherPrompt.TabStop = true; + this.RadioButtonOtherPrompt.Text = "Prompt"; + this.RadioButtonOtherPrompt.UseVisualStyleBackColor = true; + this.RadioButtonOtherDelete.AutoSize = true; + RadioButton buttonOtherDelete1 = this.RadioButtonOtherDelete; + point1 = new Point(16, 32); + Point point21 = point1; + buttonOtherDelete1.Location = point21; + this.RadioButtonOtherDelete.Name = "RadioButtonOtherDelete"; + RadioButton buttonOtherDelete2 = this.RadioButtonOtherDelete; + size1 = new Size(108, 16); + Size size21 = size1; + buttonOtherDelete2.Size = size21; + this.RadioButtonOtherDelete.TabIndex = 1; + this.RadioButtonOtherDelete.TabStop = true; + this.RadioButtonOtherDelete.Text = "Delete and Write"; + this.RadioButtonOtherDelete.UseVisualStyleBackColor = true; + this.RadioButtonOtherSkip.AutoSize = true; + RadioButton radioButtonOtherSkip1 = this.RadioButtonOtherSkip; + point1 = new Point(16, 48); + Point point22 = point1; + radioButtonOtherSkip1.Location = point22; + this.RadioButtonOtherSkip.Name = "RadioButtonOtherSkip"; + RadioButton radioButtonOtherSkip2 = this.RadioButtonOtherSkip; + size1 = new Size(45, 16); + Size size22 = size1; + radioButtonOtherSkip2.Size = size22; + this.RadioButtonOtherSkip.TabIndex = 2; + this.RadioButtonOtherSkip.TabStop = true; + this.RadioButtonOtherSkip.Text = "Skip"; + this.RadioButtonOtherSkip.UseVisualStyleBackColor = true; + this.RadioButtonOtherChangeName.AutoSize = true; + RadioButton buttonOtherChangeName1 = this.RadioButtonOtherChangeName; + point1 = new Point(16, 64); + Point point23 = point1; + buttonOtherChangeName1.Location = point23; + this.RadioButtonOtherChangeName.Name = "RadioButtonOtherChangeName"; + RadioButton buttonOtherChangeName2 = this.RadioButtonOtherChangeName; + size1 = new Size(94, 16); + Size size23 = size1; + buttonOtherChangeName2.Size = size23; + this.RadioButtonOtherChangeName.TabIndex = 3; + this.RadioButtonOtherChangeName.TabStop = true; + this.RadioButtonOtherChangeName.Text = "Change Name"; + this.RadioButtonOtherChangeName.UseVisualStyleBackColor = true; + this.GroupBox2.Controls.Add((Control) this.RadioButtonFolderPrompt); + this.GroupBox2.Controls.Add((Control) this.RadioButtonFolderIntegrate); + this.GroupBox2.Controls.Add((Control) this.RadioButtonFolderDelete); + this.GroupBox2.Controls.Add((Control) this.RadioButtonFolderSkip); + this.GroupBox2.Controls.Add((Control) this.RadioButtonFolderChangeName); + GroupBox groupBox2_1 = this.GroupBox2; + point1 = new Point(160, 8); + Point point24 = point1; + groupBox2_1.Location = point24; + this.GroupBox2.Name = "GroupBox2"; + GroupBox groupBox2_2 = this.GroupBox2; + size1 = new Size(144, 104); + Size size24 = size1; + groupBox2_2.Size = size24; + this.GroupBox2.TabIndex = 2; + this.GroupBox2.TabStop = false; + this.GroupBox2.Text = "On Folder Confliction"; + this.RadioButtonFolderPrompt.AutoSize = true; + RadioButton buttonFolderPrompt1 = this.RadioButtonFolderPrompt; + point1 = new Point(16, 16); + Point point25 = point1; + buttonFolderPrompt1.Location = point25; + this.RadioButtonFolderPrompt.Name = "RadioButtonFolderPrompt"; + RadioButton buttonFolderPrompt2 = this.RadioButtonFolderPrompt; + size1 = new Size(59, 16); + Size size25 = size1; + buttonFolderPrompt2.Size = size25; + this.RadioButtonFolderPrompt.TabIndex = 0; + this.RadioButtonFolderPrompt.TabStop = true; + this.RadioButtonFolderPrompt.Text = "Prompt"; + this.RadioButtonFolderPrompt.UseVisualStyleBackColor = true; + this.RadioButtonFolderIntegrate.AutoSize = true; + RadioButton buttonFolderIntegrate1 = this.RadioButtonFolderIntegrate; + point1 = new Point(16, 32); + Point point26 = point1; + buttonFolderIntegrate1.Location = point26; + this.RadioButtonFolderIntegrate.Name = "RadioButtonFolderIntegrate"; + RadioButton buttonFolderIntegrate2 = this.RadioButtonFolderIntegrate; + size1 = new Size(68, 16); + Size size26 = size1; + buttonFolderIntegrate2.Size = size26; + this.RadioButtonFolderIntegrate.TabIndex = 1; + this.RadioButtonFolderIntegrate.TabStop = true; + this.RadioButtonFolderIntegrate.Text = "Integrate"; + this.RadioButtonFolderIntegrate.UseVisualStyleBackColor = true; + this.RadioButtonFolderDelete.AutoSize = true; + RadioButton buttonFolderDelete1 = this.RadioButtonFolderDelete; + point1 = new Point(16, 48); + Point point27 = point1; + buttonFolderDelete1.Location = point27; + this.RadioButtonFolderDelete.Name = "RadioButtonFolderDelete"; + RadioButton buttonFolderDelete2 = this.RadioButtonFolderDelete; + size1 = new Size(108, 16); + Size size27 = size1; + buttonFolderDelete2.Size = size27; + this.RadioButtonFolderDelete.TabIndex = 2; + this.RadioButtonFolderDelete.TabStop = true; + this.RadioButtonFolderDelete.Text = "Delete and Write"; + this.RadioButtonFolderDelete.UseVisualStyleBackColor = true; + this.RadioButtonFolderSkip.AutoSize = true; + RadioButton buttonFolderSkip1 = this.RadioButtonFolderSkip; + point1 = new Point(16, 64); + Point point28 = point1; + buttonFolderSkip1.Location = point28; + this.RadioButtonFolderSkip.Name = "RadioButtonFolderSkip"; + RadioButton buttonFolderSkip2 = this.RadioButtonFolderSkip; + size1 = new Size(45, 16); + Size size28 = size1; + buttonFolderSkip2.Size = size28; + this.RadioButtonFolderSkip.TabIndex = 3; + this.RadioButtonFolderSkip.TabStop = true; + this.RadioButtonFolderSkip.Text = "Skip"; + this.RadioButtonFolderSkip.UseVisualStyleBackColor = true; + this.RadioButtonFolderChangeName.AutoSize = true; + RadioButton folderChangeName1 = this.RadioButtonFolderChangeName; + point1 = new Point(16, 80); + Point point29 = point1; + folderChangeName1.Location = point29; + this.RadioButtonFolderChangeName.Name = "RadioButtonFolderChangeName"; + RadioButton folderChangeName2 = this.RadioButtonFolderChangeName; + size1 = new Size(94, 16); + Size size29 = size1; + folderChangeName2.Size = size29; + this.RadioButtonFolderChangeName.TabIndex = 4; + this.RadioButtonFolderChangeName.TabStop = true; + this.RadioButtonFolderChangeName.Text = "Change Name"; + this.RadioButtonFolderChangeName.UseVisualStyleBackColor = true; + this.GroupBox1.Controls.Add((Control) this.RadioButtonFilePrompt); + this.GroupBox1.Controls.Add((Control) this.RadioButtonFileOverwrite); + this.GroupBox1.Controls.Add((Control) this.RadioButtonFileOverwriteNewer); + this.GroupBox1.Controls.Add((Control) this.RadioButtonFileResume); + this.GroupBox1.Controls.Add((Control) this.RadioButtonFileDelete); + this.GroupBox1.Controls.Add((Control) this.RadioButtonFileChangeName); + this.GroupBox1.Controls.Add((Control) this.RadioButtonFileSkip); + GroupBox groupBox1_1 = this.GroupBox1; + point1 = new Point(8, 72); + Point point30 = point1; + groupBox1_1.Location = point30; + this.GroupBox1.Name = "GroupBox1"; + GroupBox groupBox1_2 = this.GroupBox1; + size1 = new Size(144, 136); + Size size30 = size1; + groupBox1_2.Size = size30; + this.GroupBox1.TabIndex = 1; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "On File Confliction"; + this.RadioButtonFilePrompt.AutoSize = true; + RadioButton buttonFilePrompt1 = this.RadioButtonFilePrompt; + point1 = new Point(16, 16); + Point point31 = point1; + buttonFilePrompt1.Location = point31; + this.RadioButtonFilePrompt.Name = "RadioButtonFilePrompt"; + RadioButton buttonFilePrompt2 = this.RadioButtonFilePrompt; + size1 = new Size(59, 16); + Size size31 = size1; + buttonFilePrompt2.Size = size31; + this.RadioButtonFilePrompt.TabIndex = 0; + this.RadioButtonFilePrompt.TabStop = true; + this.RadioButtonFilePrompt.Text = "Prompt"; + this.RadioButtonFilePrompt.UseVisualStyleBackColor = true; + this.RadioButtonFileOverwrite.AutoSize = true; + RadioButton buttonFileOverwrite1 = this.RadioButtonFileOverwrite; + point1 = new Point(16, 32); + Point point32 = point1; + buttonFileOverwrite1.Location = point32; + this.RadioButtonFileOverwrite.Name = "RadioButtonFileOverwrite"; + RadioButton buttonFileOverwrite2 = this.RadioButtonFileOverwrite; + size1 = new Size(72, 16); + Size size32 = size1; + buttonFileOverwrite2.Size = size32; + this.RadioButtonFileOverwrite.TabIndex = 1; + this.RadioButtonFileOverwrite.TabStop = true; + this.RadioButtonFileOverwrite.Text = "Overwirte"; + this.RadioButtonFileOverwrite.UseVisualStyleBackColor = true; + this.RadioButtonFileOverwriteNewer.AutoSize = true; + RadioButton fileOverwriteNewer1 = this.RadioButtonFileOverwriteNewer; + point1 = new Point(16, 48); + Point point33 = point1; + fileOverwriteNewer1.Location = point33; + this.RadioButtonFileOverwriteNewer.Name = "RadioButtonFileOverwriteNewer"; + RadioButton fileOverwriteNewer2 = this.RadioButtonFileOverwriteNewer; + size1 = new Size(117, 16); + Size size33 = size1; + fileOverwriteNewer2.Size = size33; + this.RadioButtonFileOverwriteNewer.TabIndex = 2; + this.RadioButtonFileOverwriteNewer.TabStop = true; + this.RadioButtonFileOverwriteNewer.Text = "Overwirte if newer"; + this.RadioButtonFileOverwriteNewer.UseVisualStyleBackColor = true; + this.RadioButtonFileResume.AutoSize = true; + RadioButton buttonFileResume1 = this.RadioButtonFileResume; + point1 = new Point(16, 64); + Point point34 = point1; + buttonFileResume1.Location = point34; + this.RadioButtonFileResume.Name = "RadioButtonFileResume"; + RadioButton buttonFileResume2 = this.RadioButtonFileResume; + size1 = new Size(116, 16); + Size size34 = size1; + buttonFileResume2.Size = size34; + this.RadioButtonFileResume.TabIndex = 3; + this.RadioButtonFileResume.TabStop = true; + this.RadioButtonFileResume.Text = "Resume if smaller"; + this.RadioButtonFileResume.UseVisualStyleBackColor = true; + this.RadioButtonFileDelete.AutoSize = true; + RadioButton buttonFileDelete1 = this.RadioButtonFileDelete; + point1 = new Point(16, 80); + Point point35 = point1; + buttonFileDelete1.Location = point35; + this.RadioButtonFileDelete.Name = "RadioButtonFileDelete"; + RadioButton buttonFileDelete2 = this.RadioButtonFileDelete; + size1 = new Size(108, 16); + Size size35 = size1; + buttonFileDelete2.Size = size35; + this.RadioButtonFileDelete.TabIndex = 4; + this.RadioButtonFileDelete.TabStop = true; + this.RadioButtonFileDelete.Text = "Delete and Write"; + this.RadioButtonFileDelete.UseVisualStyleBackColor = true; + this.RadioButtonFileChangeName.AutoSize = true; + RadioButton buttonFileChangeName1 = this.RadioButtonFileChangeName; + point1 = new Point(16, 112); + Point point36 = point1; + buttonFileChangeName1.Location = point36; + this.RadioButtonFileChangeName.Name = "RadioButtonFileChangeName"; + RadioButton buttonFileChangeName2 = this.RadioButtonFileChangeName; + size1 = new Size(94, 16); + Size size36 = size1; + buttonFileChangeName2.Size = size36; + this.RadioButtonFileChangeName.TabIndex = 6; + this.RadioButtonFileChangeName.TabStop = true; + this.RadioButtonFileChangeName.Text = "Change Name"; + this.RadioButtonFileChangeName.UseVisualStyleBackColor = true; + this.RadioButtonFileSkip.AutoSize = true; + RadioButton radioButtonFileSkip1 = this.RadioButtonFileSkip; + point1 = new Point(16, 96); + Point point37 = point1; + radioButtonFileSkip1.Location = point37; + this.RadioButtonFileSkip.Name = "RadioButtonFileSkip"; + RadioButton radioButtonFileSkip2 = this.RadioButtonFileSkip; + size1 = new Size(45, 16); + Size size37 = size1; + radioButtonFileSkip2.Size = size37; + this.RadioButtonFileSkip.TabIndex = 5; + this.RadioButtonFileSkip.TabStop = true; + this.RadioButtonFileSkip.Text = "Skip"; + this.RadioButtonFileSkip.UseVisualStyleBackColor = true; + this.Timer1.Interval = 50; + this.AsyncCopy1.StopAfterFile = false; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(313, 410); + this.ClientSize = size1; + this.Controls.Add((Control) this.SplitContainer1); + this.MaximizeBox = false; + size1 = new Size(329, 448); + this.MinimumSize = size1; + this.Name = nameof (UpDownForm); + this.StartPosition = FormStartPosition.Manual; + this.Text = "UpDown"; + this.SplitContainer1.Panel1.ResumeLayout(false); + this.SplitContainer1.Panel1.PerformLayout(); + this.SplitContainer1.Panel2.ResumeLayout(false); + this.SplitContainer1.ResumeLayout(false); + this.OnErrorGroupBox.ResumeLayout(false); + this.OnErrorGroupBox.PerformLayout(); + this.GroupBox3.ResumeLayout(false); + this.GroupBox3.PerformLayout(); + this.GroupBox2.ResumeLayout(false); + this.GroupBox2.PerformLayout(); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + } + + internal virtual ProgressBar TotalProgressBar + { + get + { + return this._TotalProgressBar; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TotalProgressBar = value; + } + } + + internal virtual ProgressBar FileProgressBar + { + get + { + return this._FileProgressBar; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._FileProgressBar = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.m_CancelButton_Click); + if (this._m_CancelButton != null) + this._m_CancelButton.Click -= eventHandler; + this._m_CancelButton = value; + if (this._m_CancelButton == null) + return; + this._m_CancelButton.Click += eventHandler; + } + } + + internal virtual TextBox FileInfoTextBox + { + get + { + return this._FileInfoTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._FileInfoTextBox = value; + } + } + + internal virtual TextBox TotalInfoTextBox + { + get + { + return this._TotalInfoTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TotalInfoTextBox = value; + } + } + + internal virtual AsyncCopy AsyncCopy1 + { + get + { + return this._AsyncCopy1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler1 = new EventHandler(this.AsyncCopy1_RemoteResourceChanged); + EventHandler eventHandler2 = new EventHandler(this.AsyncCopy1_ExceptionOccurred); + EventHandler eventHandler3 = new EventHandler(this.AsyncCopy1_CopyConflicted); + AsyncCompletedEventHandler completedEventHandler = new AsyncCompletedEventHandler(this.AsyncCopy1_CopyCompleted); + if (this._AsyncCopy1 != null) + { + this._AsyncCopy1.RemoteResourceChanged -= eventHandler1; + this._AsyncCopy1.ExceptionOccurred -= eventHandler2; + this._AsyncCopy1.ConflictionOccurred -= eventHandler3; + this._AsyncCopy1.CopyCompleted -= completedEventHandler; + } + this._AsyncCopy1 = value; + if (this._AsyncCopy1 == null) + return; + this._AsyncCopy1.RemoteResourceChanged += eventHandler1; + this._AsyncCopy1.ExceptionOccurred += eventHandler2; + this._AsyncCopy1.ConflictionOccurred += eventHandler3; + this._AsyncCopy1.CopyCompleted += completedEventHandler; + } + } + + internal virtual TextBox SourceTextBox + { + get + { + return this._SourceTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SourceTextBox = value; + } + } + + internal virtual CheckBox CheckBoxStopFile + { + get + { + return this._CheckBoxStopFile; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckBoxStopFile_CheckedChanged); + if (this._CheckBoxStopFile != null) + this._CheckBoxStopFile.CheckedChanged -= eventHandler; + this._CheckBoxStopFile = value; + if (this._CheckBoxStopFile == null) + return; + this._CheckBoxStopFile.CheckedChanged += eventHandler; + } + } + + internal virtual Button ExpandButton + { + get + { + return this._ExpandButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ExpandButton_Click); + if (this._ExpandButton != null) + this._ExpandButton.Click -= eventHandler; + this._ExpandButton = value; + if (this._ExpandButton == null) + return; + this._ExpandButton.Click += eventHandler; + } + } + + internal virtual TextBox MessageTextBox + { + get + { + return this._MessageTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MessageTextBox = value; + } + } + + internal virtual SplitContainer SplitContainer1 + { + get + { + return this._SplitContainer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SplitContainer1 = value; + } + } + + internal virtual Button Button1 + { + get + { + return this._Button1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ExpandButton_Click); + if (this._Button1 != null) + this._Button1.Click -= eventHandler; + this._Button1 = value; + if (this._Button1 == null) + return; + this._Button1.Click += eventHandler; + } + } + + internal virtual GroupBox OnErrorGroupBox + { + get + { + return this._OnErrorGroupBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OnErrorGroupBox = value; + } + } + + internal virtual RadioButton RadioButtonErrorPrompt + { + get + { + return this._RadioButtonErrorPrompt; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonError_CheckedChanged); + if (this._RadioButtonErrorPrompt != null) + this._RadioButtonErrorPrompt.CheckedChanged -= eventHandler; + this._RadioButtonErrorPrompt = value; + if (this._RadioButtonErrorPrompt == null) + return; + this._RadioButtonErrorPrompt.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonErrorIgnore + { + get + { + return this._RadioButtonErrorIgnore; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonError_CheckedChanged); + if (this._RadioButtonErrorIgnore != null) + this._RadioButtonErrorIgnore.CheckedChanged -= eventHandler; + this._RadioButtonErrorIgnore = value; + if (this._RadioButtonErrorIgnore == null) + return; + this._RadioButtonErrorIgnore.CheckedChanged += eventHandler; + } + } + + internal virtual GroupBox GroupBox3 + { + get + { + return this._GroupBox3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBox3 = value; + } + } + + internal virtual RadioButton RadioButtonOtherPrompt + { + get + { + return this._RadioButtonOtherPrompt; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonOther_CheckedChanged); + if (this._RadioButtonOtherPrompt != null) + this._RadioButtonOtherPrompt.CheckedChanged -= eventHandler; + this._RadioButtonOtherPrompt = value; + if (this._RadioButtonOtherPrompt == null) + return; + this._RadioButtonOtherPrompt.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonOtherDelete + { + get + { + return this._RadioButtonOtherDelete; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonOther_CheckedChanged); + if (this._RadioButtonOtherDelete != null) + this._RadioButtonOtherDelete.CheckedChanged -= eventHandler; + this._RadioButtonOtherDelete = value; + if (this._RadioButtonOtherDelete == null) + return; + this._RadioButtonOtherDelete.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonOtherSkip + { + get + { + return this._RadioButtonOtherSkip; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonOther_CheckedChanged); + if (this._RadioButtonOtherSkip != null) + this._RadioButtonOtherSkip.CheckedChanged -= eventHandler; + this._RadioButtonOtherSkip = value; + if (this._RadioButtonOtherSkip == null) + return; + this._RadioButtonOtherSkip.CheckedChanged += eventHandler; + } + } + + internal virtual GroupBox GroupBox2 + { + get + { + return this._GroupBox2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBox2 = value; + } + } + + internal virtual RadioButton RadioButtonFolderPrompt + { + get + { + return this._RadioButtonFolderPrompt; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFolder_CheckedChanged); + if (this._RadioButtonFolderPrompt != null) + this._RadioButtonFolderPrompt.CheckedChanged -= eventHandler; + this._RadioButtonFolderPrompt = value; + if (this._RadioButtonFolderPrompt == null) + return; + this._RadioButtonFolderPrompt.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFolderIntegrate + { + get + { + return this._RadioButtonFolderIntegrate; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFolder_CheckedChanged); + if (this._RadioButtonFolderIntegrate != null) + this._RadioButtonFolderIntegrate.CheckedChanged -= eventHandler; + this._RadioButtonFolderIntegrate = value; + if (this._RadioButtonFolderIntegrate == null) + return; + this._RadioButtonFolderIntegrate.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFolderDelete + { + get + { + return this._RadioButtonFolderDelete; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFolder_CheckedChanged); + if (this._RadioButtonFolderDelete != null) + this._RadioButtonFolderDelete.CheckedChanged -= eventHandler; + this._RadioButtonFolderDelete = value; + if (this._RadioButtonFolderDelete == null) + return; + this._RadioButtonFolderDelete.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFolderSkip + { + get + { + return this._RadioButtonFolderSkip; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFolder_CheckedChanged); + if (this._RadioButtonFolderSkip != null) + this._RadioButtonFolderSkip.CheckedChanged -= eventHandler; + this._RadioButtonFolderSkip = value; + if (this._RadioButtonFolderSkip == null) + return; + this._RadioButtonFolderSkip.CheckedChanged += eventHandler; + } + } + + internal virtual GroupBox GroupBox1 + { + get + { + return this._GroupBox1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBox1 = value; + } + } + + internal virtual RadioButton RadioButtonFilePrompt + { + get + { + return this._RadioButtonFilePrompt; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFile_CheckedChanged); + if (this._RadioButtonFilePrompt != null) + this._RadioButtonFilePrompt.CheckedChanged -= eventHandler; + this._RadioButtonFilePrompt = value; + if (this._RadioButtonFilePrompt == null) + return; + this._RadioButtonFilePrompt.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFileOverwrite + { + get + { + return this._RadioButtonFileOverwrite; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFile_CheckedChanged); + if (this._RadioButtonFileOverwrite != null) + this._RadioButtonFileOverwrite.CheckedChanged -= eventHandler; + this._RadioButtonFileOverwrite = value; + if (this._RadioButtonFileOverwrite == null) + return; + this._RadioButtonFileOverwrite.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFileOverwriteNewer + { + get + { + return this._RadioButtonFileOverwriteNewer; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFile_CheckedChanged); + if (this._RadioButtonFileOverwriteNewer != null) + this._RadioButtonFileOverwriteNewer.CheckedChanged -= eventHandler; + this._RadioButtonFileOverwriteNewer = value; + if (this._RadioButtonFileOverwriteNewer == null) + return; + this._RadioButtonFileOverwriteNewer.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFileResume + { + get + { + return this._RadioButtonFileResume; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFile_CheckedChanged); + if (this._RadioButtonFileResume != null) + this._RadioButtonFileResume.CheckedChanged -= eventHandler; + this._RadioButtonFileResume = value; + if (this._RadioButtonFileResume == null) + return; + this._RadioButtonFileResume.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFileDelete + { + get + { + return this._RadioButtonFileDelete; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFile_CheckedChanged); + if (this._RadioButtonFileDelete != null) + this._RadioButtonFileDelete.CheckedChanged -= eventHandler; + this._RadioButtonFileDelete = value; + if (this._RadioButtonFileDelete == null) + return; + this._RadioButtonFileDelete.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFileSkip + { + get + { + return this._RadioButtonFileSkip; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFile_CheckedChanged); + if (this._RadioButtonFileSkip != null) + this._RadioButtonFileSkip.CheckedChanged -= eventHandler; + this._RadioButtonFileSkip = value; + if (this._RadioButtonFileSkip == null) + return; + this._RadioButtonFileSkip.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFileChangeName + { + get + { + return this._RadioButtonFileChangeName; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFile_CheckedChanged); + if (this._RadioButtonFileChangeName != null) + this._RadioButtonFileChangeName.CheckedChanged -= eventHandler; + this._RadioButtonFileChangeName = value; + if (this._RadioButtonFileChangeName == null) + return; + this._RadioButtonFileChangeName.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonOtherChangeName + { + get + { + return this._RadioButtonOtherChangeName; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonOther_CheckedChanged); + if (this._RadioButtonOtherChangeName != null) + this._RadioButtonOtherChangeName.CheckedChanged -= eventHandler; + this._RadioButtonOtherChangeName = value; + if (this._RadioButtonOtherChangeName == null) + return; + this._RadioButtonOtherChangeName.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton RadioButtonFolderChangeName + { + get + { + return this._RadioButtonFolderChangeName; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RadioButtonFolder_CheckedChanged); + if (this._RadioButtonFolderChangeName != null) + this._RadioButtonFolderChangeName.CheckedChanged -= eventHandler; + this._RadioButtonFolderChangeName = value; + if (this._RadioButtonFolderChangeName == null) + return; + this._RadioButtonFolderChangeName.CheckedChanged += eventHandler; + } + } + + internal virtual Timer Timer1 + { + get + { + return this._Timer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.Timer1_Tick); + if (this._Timer1 != null) + this._Timer1.Tick -= eventHandler; + this._Timer1 = value; + if (this._Timer1 == null) + return; + this._Timer1.Tick += eventHandler; + } + } + + internal virtual TextBox TextBoxFileFolderCount + { + get + { + return this._TextBoxFileFolderCount; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxFileFolderCount = value; + } + } + + public event EventHandler TransferFinished; + + public event EventHandler RemoteResourceChanged; + + public string Title + { + get + { + return this.pTitle; + } + set + { + this.pTitle = value; + } + } + + public MainForm MainForm + { + get + { + return this.pMainForm; + } + set + { + this.pMainForm = value; + } + } + + public void SetClient(UpDownForm.TransferDirectionType direction, FsBase fs, CacheManager cm, UCSNormalization downnormalization, UCSNormalization uploadnormalization) + { + this.pDirection = direction; + this.pEnableResume = direction != UpDownForm.TransferDirectionType.Download ? (fs.Ability & FsAbility.PartialWrite) != FsAbility.None : (fs.Ability & FsAbility.PartialRead) != FsAbility.None; + this.AsyncCopy1.SetClient(fs, cm, downnormalization, uploadnormalization); + } + + public void Download(ResourceId[] remoteids, string localdir) + { + if (this.pDirection != UpDownForm.TransferDirectionType.Download) + throw new Exception(); + this.AsyncCopy1.Download(remoteids, localdir); + if (!this.AsyncCopy1.IsBusy) + this.AsyncCopy1.DavCopyAsync(); + this.m_CancelButton.Text = "Cancel"; + this.Activate(); + } + + public void Upload(string[] localfiles, ResourceId remoteid, IDataObject dobj, DragDropEffects finisheffect) + { + if (this.pDirection != UpDownForm.TransferDirectionType.Upload) + throw new Exception(); + this.AsyncCopy1.Upload(localfiles, remoteid, dobj, finisheffect); + if (!this.AsyncCopy1.IsBusy) + this.AsyncCopy1.DavCopyAsync(); + this.m_CancelButton.Text = "Cancel"; + this.Activate(); + } + + public void UploadDescriptors(VirtualFileInfo[] vfinfos, ResourceId remoteid, IDataObject dobj, DragDropEffects finisheffect) + { + if (this.pDirection != UpDownForm.TransferDirectionType.Upload) + throw new Exception(); + this.AsyncCopy1.UploadDescriptors(vfinfos, remoteid, dobj, finisheffect); + if (!this.AsyncCopy1.IsBusy) + this.AsyncCopy1.DavCopyAsync(); + this.m_CancelButton.Text = "Cancel"; + this.Activate(); + } + + public UpDownForm() + { + this.Shown += new EventHandler(this.UpDownForm_Shown); + this.FormClosing += new FormClosingEventHandler(this.UpDownForm_FormClosing); + this.Disposed += new EventHandler(this.UpDownForm_Disposed); + this.Load += new EventHandler(this.UpDownForm_Load); + this.InitializeComponent(); + this.panel2height = checked (this.SplitContainer1.Panel2.Height + this.SplitContainer1.SplitterWidth); + this.SuspendLayout(); + this.SplitContainer1.SuspendLayout(); + this.SplitContainer1.Panel1.SuspendLayout(); + this.MinimumSize = new Size(this.MinimumSize.Width, checked (this.MinimumSize.Height - this.panel2height)); + this.SplitContainer1.Panel2Collapsed = true; + this.Height = checked (this.Height - this.SplitContainer1.Height - this.SplitContainer1.SplitterDistance); + this.ResumeLayout(); + this.SplitContainer1.ResumeLayout(); + this.SplitContainer1.Panel1.ResumeLayout(); + this.ExpandButton.Image = (Image) CarotDAV.My.Resources.Resources.MoveDown; + } + + private void UpDownForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + this.pConflictManager = new ConflictPromptManager(); + this.pErrorManager = new ErrorPromptManager(); + this.RadioButtonErrorPrompt.Checked = true; + this.RadioButtonFilePrompt.Checked = true; + this.RadioButtonFolderPrompt.Checked = true; + this.RadioButtonOtherPrompt.Checked = true; + this.RadioButtonFileResume.Enabled = this.pEnableResume; + this.Timer1.Start(); + } + + private void UpDownForm_Shown(object sender, EventArgs e) + { + this.Text = this.Title; + this.m_CancelButton.Text = "Stop"; + this.MessageTextBox.Focus(); + } + + private void UpDownForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason != CloseReason.UserClosing) + return; + if (!this.AsyncCopy1.IsBusy) + e.Cancel = false; + else if (this.pShowCancelDialog) + { + e.Cancel = true; + } + else + { + this.pShowCancelDialog = true; + DialogResult dialogResult = MessageBox.Show("Are you sure to cancel upload / download ?", "Cancel task " + this.Title, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); + this.pShowCancelDialog = false; + if (dialogResult != DialogResult.Yes && this.AsyncCopy1.IsBusy) + e.Cancel = true; + else + this.AsyncCopy1.DavCopyAsyncCancel(); + } + } + + private void UpDownForm_Disposed(object sender, EventArgs e) + { + this.AsyncCopy1.DavCopyAsyncCancel(); + } + + private void m_CancelButton_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void CheckBoxStopFile_CheckedChanged(object sender, EventArgs e) + { + this.AsyncCopy1.StopAfterFile = this.CheckBoxStopFile.Checked; + } + + private void AsyncCopy1_CopyCompleted(object sender, AsyncCompletedEventArgs e) + { + if (this.IsDisposed) + return; + if (e.Cancelled) + { + this.MessageTextBox.Text = "Transfer cancelled."; + this.CheckBoxStopFile.Enabled = false; + this.m_CancelButton.Text = "Close"; + this.Text = this.Title; + this.AsyncCopy1.Clear(); + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.NoProgress); + EventHandler transferFinishedEvent = this.TransferFinishedEvent; + if (transferFinishedEvent != null) + transferFinishedEvent((object) this, EventArgs.Empty); + if (!this.AsyncCopy1.StopAfterFile) + return; + this.Close(); + } + else if (e.Error != null) + { + int num = (int) MessageBox.Show("Error occurred during transfer.\r\n" + e.Error.Message + "\r\n" + e.Error.StackTrace); + this.MessageTextBox.Text = "Transfer completed."; + this.m_CancelButton.Text = "Close"; + this.Text = this.Title; + this.AsyncCopy1.Clear(); + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.NoProgress); + EventHandler transferFinishedEvent = this.TransferFinishedEvent; + if (transferFinishedEvent == null) + return; + transferFinishedEvent((object) this, EventArgs.Empty); + } + else if (this.AsyncCopy1.UncompleteTaskCount > 0) + { + this.AsyncCopy1.DavCopyAsync(); + } + else + { + this.MessageTextBox.Text = "Transfer completed."; + this.SourceTextBox.Text = ""; + this.m_CancelButton.Text = "Close"; + this.Text = "100.0% " + this.Title; + this.AsyncCopy1.Clear(); + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.NoProgress); + EventHandler transferFinishedEvent = this.TransferFinishedEvent; + if (transferFinishedEvent != null) + transferFinishedEvent((object) this, EventArgs.Empty); + this.Close(); + } + } + + private void Timer1_Tick(object sender, EventArgs e) + { + if (this.IsDisposed || this.AsyncCopy1 == null) + return; + AsyncCopy.StateContainer state = this.AsyncCopy1.GetState(); + switch (state.CurrentState) + { + case AsyncCopy.DavCopyStateType.DownloadProperty: + this.MessageTextBox.Text = "Downloading Resouce Properties."; + break; + case AsyncCopy.DavCopyStateType.ConfirmFolder: + this.MessageTextBox.Text = "Confirm Folder."; + break; + case AsyncCopy.DavCopyStateType.SetFolderAttribute: + this.MessageTextBox.Text = "Set Folder Attributes."; + break; + case AsyncCopy.DavCopyStateType.DownloadFile: + this.MessageTextBox.Text = "Downloading File."; + break; + case AsyncCopy.DavCopyStateType.SearchDirectory: + this.MessageTextBox.Text = "Search Local Directory."; + break; + case AsyncCopy.DavCopyStateType.MakingCollection: + this.MessageTextBox.Text = "Making Collection."; + break; + case AsyncCopy.DavCopyStateType.UploadFile: + this.MessageTextBox.Text = "Uploading File."; + break; + case AsyncCopy.DavCopyStateType.UploadProperty: + this.MessageTextBox.Text = "Uploading Property."; + break; + case AsyncCopy.DavCopyStateType.Finished: + this.MessageTextBox.Text = "Finished"; + break; + } + this.SourceTextBox.Text = state.CurrentDesc; + double d1 = (double) state.TotalProgress / state.TotalSeconds; + double d2 = (double) state.CurrentProgress / state.CurrentSeconds; + string str1 = state.TotalProgress.ToString("#,0;?") + " / " + state.TotalCost.ToString("#,0;?"); + string str2; + double num1; + if (double.IsNaN(d1)) + { + str2 = str1 + " ?"; + } + else + { + string str3 = str1; + string str4 = " "; + num1 = d1 / 1024.0; + string str5 = num1.ToString("#,0.0;?"); + str2 = str3 + str4 + str5; + } + this.TotalInfoTextBox.Text = str2 + " kiB/s"; + string str6 = state.CurrentProgress.ToString("#,0;?") + " / " + state.CurrentCost.ToString("#,0;?"); + string str7; + if (double.IsNaN(d2)) + { + str7 = str6 + " ?"; + } + else + { + string str3 = str6; + string str4 = " "; + num1 = d2 / 1024.0; + string str5 = num1.ToString("#,0.0;?"); + str7 = str3 + str4 + str5; + } + this.FileInfoTextBox.Text = str7 + " kiB/s"; + this.TextBoxFileFolderCount.Text = state.CurrentFiles.ToString() + "/" + state.TotalFiles.ToString() + " Files " + state.CurrentFolders.ToString() + "/" + state.TotalFolders.ToString() + " Folders"; + int num2 = 0; + int num3 = 0; + try + { + if (state.TotalCost > 0L) + { + num2 = checked ((int) Math.Round(unchecked ((double) checked (1000L * state.TotalProgress) / (double) state.TotalCost))); + this.TotalProgressBar.Value = checked ((int) Math.Round(unchecked ((double) checked (1000L * state.TotalProgress) / (double) state.TotalCost))); + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.Normal); + TaskbarManager.SetProgressValue((Control) this, checked ((ulong) state.TotalProgress), checked ((ulong) state.TotalCost)); + } + else + { + this.TotalProgressBar.Value = 0; + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.Indeterminate); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + try + { + if (state.CurrentCost > 0L) + { + num3 = checked ((int) Math.Round(unchecked ((double) checked (1000L * state.CurrentProgress) / (double) state.CurrentCost))); + this.FileProgressBar.Value = checked ((int) Math.Round(unchecked ((double) checked (1000L * state.CurrentProgress) / (double) state.CurrentCost))); + } + else + this.FileProgressBar.Value = 0; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + if (num2 <= 0) + this.Text = this.Title; + else + this.Text = ((double) num2 / 10.0).ToString("0.0") + "% " + this.Title; + } + + private void AsyncCopy1_CopyConflicted(object sender, AsyncCopy.CopyConflictedEventArgs e) + { + if (this.InvokeRequired) + { + this.Invoke((Delegate) new EventHandler(this.AsyncCopy1_CopyConflicted), RuntimeHelpers.GetObjectValue(sender), (object) e); + } + else + { + if (this.IsDisposed) + return; + if (this.pConflictManager.IsRegistered(e.Type)) + { + e.Result.Action = this.pConflictManager.GetAction(e.Type); + e.Result.ToAll = false; + } + else + { + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.Paused); + e.Result = ConflictPromptForm.ShowDialog((IWin32Window) this, e.Source, e.Destination, e.Type, e.EnableResume, e.DestinationAbility, e.RetryMinutes); + if (e.Result.ToAll) + { + if (e.Result.Type == ConflictType.FolderToFile) + this.pConflictManager.RegisterAction(new ConflictPromptFormResult() + { + Action = e.Result.Action, + ToAll = true, + Type = ConflictType.FileToFolder + }); + else + this.pConflictManager.RegisterAction(e.Result); + switch (e.Result.Type) + { + case ConflictType.FolderToFolder: + switch (e.Result.Action) + { + case ConflictAction.Integrate: + this.RadioButtonFolderIntegrate.Checked = true; + break; + case ConflictAction.DeleteTarget: + this.RadioButtonFolderDelete.Checked = true; + break; + case ConflictAction.ChangeName: + this.RadioButtonFolderChangeName.Checked = true; + break; + case ConflictAction.Skip: + this.RadioButtonFileSkip.Checked = true; + break; + } + case ConflictType.FileToFolder: + switch (e.Result.Action) + { + case ConflictAction.DeleteTarget: + this.RadioButtonOtherDelete.Checked = true; + break; + case ConflictAction.ChangeName: + this.RadioButtonOtherChangeName.Checked = true; + break; + case ConflictAction.Skip: + this.RadioButtonOtherSkip.Checked = true; + break; + } + case ConflictType.FileToFile: + switch (e.Result.Action) + { + case ConflictAction.Overwrite: + this.RadioButtonFileOverwrite.Checked = true; + break; + case ConflictAction.OverwriteNewer: + this.RadioButtonFileOverwriteNewer.Checked = true; + break; + case ConflictAction.Resume: + this.RadioButtonFileResume.Checked = true; + break; + case ConflictAction.DeleteTarget: + this.RadioButtonFileDelete.Checked = true; + break; + case ConflictAction.ChangeName: + this.RadioButtonFileChangeName.Checked = true; + break; + case ConflictAction.Skip: + this.RadioButtonFileSkip.Checked = true; + break; + } + } + } + e.Result.ToAll = false; + } + } + } + + private void AsyncCopy1_ExceptionOccurred(object sender, ExceptionOccurredEventArgs e) + { + if (this.InvokeRequired) + { + this.Invoke((Delegate) new EventHandler(this.AsyncCopy1_ExceptionOccurred), RuntimeHelpers.GetObjectValue(sender), (object) e); + } + else + { + if (this.IsDisposed) + return; + TaskbarManager.SetProgressState((Control) this, TaskbarManager.TaskbarProgressBarStatus.Error); + if (this.pErrorManager.IgnoreAll()) + { + e.Result.Action = ErrorAction.Ignore; + e.Result.ToAll = false; + } + else + { + e.Result = ErrorPromptForm.ShowDialog((IWin32Window) this, e.Message, e.Target, e.Exception, e.Type, e.RetryMinutes); + if (e.Result.ToAll) + { + this.pErrorManager.RegisterAction(e.Result); + if (e.Result.Action == ErrorAction.Ignore) + this.RadioButtonErrorIgnore.Checked = true; + } + e.Result.ToAll = false; + } + } + } + + private void AsyncCopy1_RemoteResourceChanged(object sender, ResourceChangedEventArgs e) + { + EventHandler resourceChangedEvent = this.RemoteResourceChangedEvent; + if (resourceChangedEvent == null) + return; + resourceChangedEvent((object) this, e); + } + + private void ExpandButton_Click(object sender, EventArgs e) + { + if (this.SplitContainer1.Panel2Collapsed) + { + this.SuspendLayout(); + this.SplitContainer1.SuspendLayout(); + this.SplitContainer1.Panel2.SuspendLayout(); + int num = checked (this.SplitContainer1.Panel2.ClientSize.Height + this.SplitContainer1.SplitterWidth); + this.SplitContainer1.Panel2Collapsed = false; + this.Height = checked (this.Height + num); + this.MinimumSize = new Size(this.MinimumSize.Width, checked (this.MinimumSize.Height + this.panel2height)); + this.ResumeLayout(); + this.SplitContainer1.ResumeLayout(); + this.SplitContainer1.Panel2.ResumeLayout(); + this.ExpandButton.Image = (Image) CarotDAV.My.Resources.Resources.MoveUp; + } + else + { + this.SuspendLayout(); + this.SplitContainer1.SuspendLayout(); + this.SplitContainer1.Panel1.SuspendLayout(); + this.MinimumSize = new Size(this.MinimumSize.Width, checked (this.MinimumSize.Height - this.panel2height)); + this.SplitContainer1.Panel2Collapsed = true; + this.Height = checked (this.Height - this.SplitContainer1.Height - this.SplitContainer1.SplitterDistance); + this.ResumeLayout(); + this.SplitContainer1.ResumeLayout(); + this.SplitContainer1.Panel1.ResumeLayout(); + this.ExpandButton.Image = (Image) CarotDAV.My.Resources.Resources.MoveDown; + } + } + + private void RadioButtonError_CheckedChanged(object sender, EventArgs e) + { + ErrorPromptFormResult r = new ErrorPromptFormResult(); + r.ToAll = true; + if (this.RadioButtonErrorPrompt.Checked) + r.Action = ErrorAction.Retry; + else if (this.RadioButtonErrorIgnore.Checked) + r.Action = ErrorAction.Ignore; + this.pErrorManager.RegisterAction(r); + } + + private void RadioButtonFile_CheckedChanged(object sender, EventArgs e) + { + ConflictPromptFormResult r = new ConflictPromptFormResult(); + r.Type = ConflictType.FileToFile; + r.ToAll = true; + if (this.RadioButtonFilePrompt.Checked) + r.Action = ConflictAction.Retry; + else if (this.RadioButtonFileOverwrite.Checked) + r.Action = ConflictAction.Overwrite; + else if (this.RadioButtonFileOverwriteNewer.Checked) + r.Action = ConflictAction.OverwriteNewer; + else if (this.RadioButtonFileResume.Checked) + r.Action = ConflictAction.Resume; + else if (this.RadioButtonFileDelete.Checked) + r.Action = ConflictAction.DeleteTarget; + else if (this.RadioButtonFileSkip.Checked) + r.Action = ConflictAction.Skip; + else if (this.RadioButtonFileChangeName.Checked) + r.Action = ConflictAction.ChangeName; + this.pConflictManager.RegisterAction(r); + } + + private void RadioButtonFolder_CheckedChanged(object sender, EventArgs e) + { + ConflictPromptFormResult r = new ConflictPromptFormResult(); + r.Type = ConflictType.FolderToFolder; + r.ToAll = true; + if (this.RadioButtonFolderPrompt.Checked) + r.Action = ConflictAction.Retry; + else if (this.RadioButtonFolderIntegrate.Checked) + r.Action = ConflictAction.Integrate; + else if (this.RadioButtonFolderDelete.Checked) + r.Action = ConflictAction.DeleteTarget; + else if (this.RadioButtonFolderSkip.Checked) + r.Action = ConflictAction.Skip; + else if (this.RadioButtonFolderChangeName.Checked) + r.Action = ConflictAction.ChangeName; + this.pConflictManager.RegisterAction(r); + } + + private void RadioButtonOther_CheckedChanged(object sender, EventArgs e) + { + ConflictPromptFormResult r = new ConflictPromptFormResult(); + r.Type = ConflictType.FileToFolder; + r.ToAll = true; + if (this.RadioButtonOtherPrompt.Checked) + r.Action = ConflictAction.Retry; + else if (this.RadioButtonOtherDelete.Checked) + r.Action = ConflictAction.DeleteTarget; + else if (this.RadioButtonOtherSkip.Checked) + r.Action = ConflictAction.Skip; + else if (this.RadioButtonOtherChangeName.Checked) + r.Action = ConflictAction.ChangeName; + this.pConflictManager.RegisterAction(r); + } + + public enum TransferDirectionType + { + Download, + Upload, + } + } +} diff --git a/CarotDAV/UpDownForm.resx b/CarotDAV/UpDownForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/UpDownForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/WallMarkListView.cs b/CarotDAV/WallMarkListView.cs new file mode 100644 index 0000000..1911afa --- /dev/null +++ b/CarotDAV/WallMarkListView.cs @@ -0,0 +1,202 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.WallMarkListView +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace CarotDAV +{ + public class WallMarkListView : ListView + { + private const int LVM_FIRST = 4096; + private const int LVM_SETBKIMAGE = 4234; + private const int LVM_GETBKCOLOR = 4096; + private const int LVM_SETTILEINFO = 4260; + private const int LVIS_CUT = 4; + private const int LVIS_DROPHILITED = 8; + private const int LVIS_GLOW = 16; + private const int LVIS_ACTIVATING = 32; + private const int LVIS_OVERLAYMASK = 3840; + private const int LVM_SETIMAGELIST = 4099; + private const int LVM_SETITEMSTATE = 4139; + + public WallMarkListView() + { + int num = (int) Application.OleRequired(); + this.DoubleBuffered = true; + } + + protected override void CreateHandle() + { + base.CreateHandle(); + if (this.BackgroundImage == null) + return; + this.SetBackgroundImage(); + } + + protected override void OnBackgroundImageChanged(EventArgs e) + { + this.SetBackgroundImage(); + } + + protected override void OnEnabledChanged(EventArgs e) + { + base.OnEnabledChanged(e); + this.SetBackgroundImage(); + } + + public void SetBackgroundImage() + { + int num = (int) Application.OleRequired(); + WallMarkListView.LVBKIMAGE lParam = new WallMarkListView.LVBKIMAGE(); + lParam.ulFlags = WallMarkListView.LVBKIF.LVBKIF_SOURCE_NONE; + WallMarkListView.SendMessage(this.Handle, 4234, IntPtr.Zero, lParam); + if (this.BackgroundImage == null) + { + lParam.ulFlags = WallMarkListView.LVBKIF.LVBKIF_SOURCE_NONE; + lParam.hBmp = IntPtr.Zero; + WallMarkListView.SendMessage(this.Handle, 4234, IntPtr.Zero, lParam); + } + else + { + lParam.ulFlags = WallMarkListView.LVBKIF.LVBKIF_TYPE_WATERMARK; + using (Bitmap bitmap = new Bitmap(this.BackgroundImage.Width, this.BackgroundImage.Height, PixelFormat.Format32bppArgb)) + { + Color color = !this.Enabled ? SystemColors.Control : this.BackColor; + using (Graphics graphics = Graphics.FromImage((Image) bitmap)) + { + graphics.Clear(color); + graphics.DrawImage(this.BackgroundImage, 0, 0); + } + lParam.hBmp = bitmap.GetHbitmap(); + } + WallMarkListView.SendMessage(this.Handle, 4234, IntPtr.Zero, lParam); + } + this.Invalidate(); + } + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, WallMarkListView.LVBKIMAGE lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, WallMarkListView.LVTILEINFO lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, WallMarkListView.LVITEM lParam); + + [DllImport("comctl32.dll")] + private static extern int ImageList_SetOverlayImage(IntPtr himl, int iImage, int iOverlay); + + public void SetTileVisibleColumn(int itemindex, int[] columns) + { + if (columns == null) + columns = new int[0]; + WallMarkListView.LVTILEINFO lParam = new WallMarkListView.LVTILEINFO(); + lParam.cbSize = checked ((uint) Marshal.SizeOf((object) lParam)); + lParam.iItem = itemindex; + lParam.cColumns = checked ((uint) columns.Length); + lParam.puColumns = Marshal.AllocHGlobal(checked (columns.Length * 4)); + int num1 = 0; + int num2 = checked (columns.Length - 1); + int index = num1; + while (index <= num2) + { + Marshal.WriteInt32(lParam.puColumns, checked (index * 4), columns[index]); + checked { ++index; } + } + WallMarkListView.SendMessage(this.Handle, 4260, IntPtr.Zero, lParam); + Marshal.FreeHGlobal(lParam.puColumns); + } + + public static void SetOverlayIcon(ImageList imagelist, int index, int overlayindex) + { + WallMarkListView.ImageList_SetOverlayImage(imagelist.Handle, index, overlayindex); + } + + public static void ListViewOverlay(ListViewItem listitem, uint overlayIndex) + { + if ((long) overlayIndex > 15L) + throw new ArgumentOutOfRangeException(nameof (overlayIndex)); + WallMarkListView.SendMessage(listitem.ListView.Handle, 4139, new IntPtr(listitem.Index), new WallMarkListView.LVITEM() + { + stateMask = 3840, + state = checked ((int) (((long) overlayIndex & 15L) << 8)) + }); + } + + public static void ListViewItemSetStateCut(ListViewItem listitem, bool value) + { + WallMarkListView.SendMessage(listitem.ListView.Handle, 4139, new IntPtr(listitem.Index), new WallMarkListView.LVITEM() + { + stateMask = 4, + state = !value ? 0 : 4 + }); + } + + public static void ListViewItemSetStateDropHilited(ListViewItem listitem, bool value) + { + WallMarkListView.SendMessage(listitem.ListView.Handle, 4139, new IntPtr(listitem.Index), new WallMarkListView.LVITEM() + { + stateMask = 8, + state = !value ? 0 : 8 + }); + } + + [Flags] + private enum LVBKIF + { + LVBKIF_SOURCE_NONE = 0, + LVBKIF_SOURCE_HBITMAP = 1, + LVBKIF_SOURCE_URL = 2, + LVBKIF_SOURCE_MASK = LVBKIF_SOURCE_URL | LVBKIF_SOURCE_HBITMAP, + LVBKIF_STYLE_NORMAL = 0, + LVBKIF_STYLE_TIKE = 16, + LVBKIF_STYLE_MASK = LVBKIF_STYLE_TIKE, + LVBKIF_TYPE_WATERMARK = 268435456, + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private class LVBKIMAGE + { + public WallMarkListView.LVBKIF ulFlags; + public IntPtr hBmp; + public string pszImage; + public uint cchImageMax; + public int xOffset; + public int yOffset; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private class LVTILEINFO + { + public uint cbSize; + public int iItem; + public uint cColumns; + public IntPtr puColumns; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public class LVITEM + { + public int mask; + public int iItem; + public int iSubItem; + public int state; + public int stateMask; + public string pszText; + public int cchTextMax; + public int iImage; + public IntPtr lParam; + public int iIndent; + public int iGroupId; + public int cColumns; + public IntPtr puColumns; + } + } +} diff --git a/CarotDAV/WebDAVClientSetting.cs b/CarotDAV/WebDAVClientSetting.cs new file mode 100644 index 0000000..d865a4e --- /dev/null +++ b/CarotDAV/WebDAVClientSetting.cs @@ -0,0 +1,90 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.WebDAVClientSetting +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Rei.Fs; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Serialization; + +namespace CarotDAV +{ + [XmlRoot] + [Serializable] + public class WebDAVClientSetting + { + private List pConnectionSettingList; + [XmlIgnore] + public string MasterPassword; + public Size FormSize; + public Size ConnectionSettingListFormSize; + public View View; + public bool ShowLogWindow; + public bool ShowStatusBar; + public int[] ColumnIndexs; + public int[] ColumnWidth; + public bool AutoColumnWidth; + public WebDAVClientSetting.GroupType Group; + public string SortString; + public bool VersionCheckEnabled; + public bool EnableFileLogging; + public string BackgroundImagePath; + public string LastConnectionSetting; + public int MaxFaviconSize; + public string ServerIP; + public int ServerPort; + public bool AutoEnableDAVServer; + public string AutoMoundDriveLetter; + public bool AutoMoundWebFolder; + [XmlAnyElement] + public XmlElement[] OtherElements; + [XmlIgnore] + public List UnsupportedConections; + [XmlAnyElement("EncryptedData")] + public XmlElement[] EncryptedElements; + + public WebDAVClientSetting() + { + this.ColumnIndexs = new int[0]; + this.ColumnWidth = new int[0]; + this.pConnectionSettingList = new List(); + this.ShowLogWindow = false; + this.ShowStatusBar = false; + this.SortString = ""; + this.EnableFileLogging = false; + this.BackgroundImagePath = ""; + this.View = View.Details; + this.AutoColumnWidth = true; + this.Group = WebDAVClientSetting.GroupType.None; + this.LastConnectionSetting = ""; + this.MaxFaviconSize = 1048576; + this.VersionCheckEnabled = true; + this.ServerIP = "127.0.0.1"; + this.ServerPort = 12346; + this.AutoEnableDAVServer = false; + this.AutoMoundDriveLetter = ""; + this.AutoMoundWebFolder = false; + } + + public List ConnectionSettings + { + get + { + return this.pConnectionSettingList; + } + } + + public enum GroupType + { + None, + Name, + Type, + Size, + } + } +} diff --git a/CarotDAV/WebDAVClientSettingForm.cs b/CarotDAV/WebDAVClientSettingForm.cs new file mode 100644 index 0000000..0b06fc5 --- /dev/null +++ b/CarotDAV/WebDAVClientSettingForm.cs @@ -0,0 +1,1230 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.WebDAVClientSettingForm +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Net; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace CarotDAV +{ + [DesignerGenerated] + public class WebDAVClientSettingForm : Form + { + private IContainer components; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("TabControl1")] + private TabControl _TabControl1; + [AccessedThroughProperty("GeneralTabPage")] + private TabPage _GeneralTabPage; + [AccessedThroughProperty("BackgroundImageButton")] + private Button _BackgroundImageButton; + [AccessedThroughProperty("ClearJumpListButton")] + private Button _ClearJumpListButton; + [AccessedThroughProperty("TabPage1")] + private TabPage _TabPage1; + [AccessedThroughProperty("ServerAutoEnableCheckBox")] + private CheckBox _ServerAutoEnableCheckBox; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("ServerPortTextBox")] + private TextBox _ServerPortTextBox; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("ServerIPTextBox")] + private TextBox _ServerIPTextBox; + [AccessedThroughProperty("MaxSizeUpDown")] + private NumericUpDown _MaxSizeUpDown; + [AccessedThroughProperty("MaxSizeChangeButton")] + private Button _MaxSizeChangeButton; + [AccessedThroughProperty("SetMasterPasswordButton")] + private Button _SetMasterPasswordButton; + [AccessedThroughProperty("Label3")] + private Label _Label3; + [AccessedThroughProperty("BackgroundImagepathTextBox")] + private TextBox _BackgroundImagepathTextBox; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("GroupBox1")] + private GroupBox _GroupBox1; + [AccessedThroughProperty("OpenFileDialog1")] + private OpenFileDialog _OpenFileDialog1; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("MasterPasswordTextBox")] + private TextBox _MasterPasswordTextBox; + [AccessedThroughProperty("ClearFaviconButton")] + private Button _ClearFaviconButton; + [AccessedThroughProperty("Label7")] + private Label _Label7; + [AccessedThroughProperty("Label6")] + private Label _Label6; + [AccessedThroughProperty("AutoMoundFolderCheckBox")] + private CheckBox _AutoMoundFolderCheckBox; + [AccessedThroughProperty("AutoMoundDriveCheckBox")] + private CheckBox _AutoMoundDriveCheckBox; + [AccessedThroughProperty("AutoMoundDriveLetterComboBox")] + private ComboBox _AutoMoundDriveLetterComboBox; + [AccessedThroughProperty("Label8")] + private Label _Label8; + [AccessedThroughProperty("Label9")] + private Label _Label9; + [AccessedThroughProperty("RebootWebClientButton")] + private Button _RebootWebClientButton; + [AccessedThroughProperty("Label10")] + private Label _Label10; + private const int BCM_FIRST = 5632; + private const int BCM_SETSHIELD = 5644; + + public WebDAVClientSettingForm() + { + this.Load += new EventHandler(this.WebDAVClientSettingForm_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.OKButton = new Button(); + this.m_CancelButton = new Button(); + this.TabControl1 = new TabControl(); + this.GeneralTabPage = new TabPage(); + this.Label7 = new Label(); + this.Label6 = new Label(); + this.Label5 = new Label(); + this.MasterPasswordTextBox = new TextBox(); + this.BackgroundImagepathTextBox = new TextBox(); + this.Label4 = new Label(); + this.SetMasterPasswordButton = new Button(); + this.ClearFaviconButton = new Button(); + this.ClearJumpListButton = new Button(); + this.BackgroundImageButton = new Button(); + this.TabPage1 = new TabPage(); + this.Label9 = new Label(); + this.GroupBox1 = new GroupBox(); + this.Label3 = new Label(); + this.MaxSizeUpDown = new NumericUpDown(); + this.MaxSizeChangeButton = new Button(); + this.RebootWebClientButton = new Button(); + this.AutoMoundFolderCheckBox = new CheckBox(); + this.AutoMoundDriveLetterComboBox = new ComboBox(); + this.AutoMoundDriveCheckBox = new CheckBox(); + this.ServerAutoEnableCheckBox = new CheckBox(); + this.Label2 = new Label(); + this.ServerPortTextBox = new TextBox(); + this.Label10 = new Label(); + this.Label8 = new Label(); + this.Label1 = new Label(); + this.ServerIPTextBox = new TextBox(); + this.OpenFileDialog1 = new OpenFileDialog(); + this.TabControl1.SuspendLayout(); + this.GeneralTabPage.SuspendLayout(); + this.TabPage1.SuspendLayout(); + this.GroupBox1.SuspendLayout(); + this.MaxSizeUpDown.BeginInit(); + this.SuspendLayout(); + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + Point point1 = new Point(216, 312); + Point point2 = point1; + okButton1.Location = point2; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + Size size1 = new Size(72, 24); + Size size2 = size1; + okButton2.Size = size2; + this.OKButton.TabIndex = 1; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(296, 312); + Point point3 = point1; + mCancelButton1.Location = point3; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size3 = size1; + mCancelButton2.Size = size3; + this.m_CancelButton.TabIndex = 2; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.TabControl1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.TabControl1.Controls.Add((Control) this.GeneralTabPage); + this.TabControl1.Controls.Add((Control) this.TabPage1); + TabControl tabControl1_1 = this.TabControl1; + point1 = new Point(8, 8); + Point point4 = point1; + tabControl1_1.Location = point4; + this.TabControl1.Name = "TabControl1"; + this.TabControl1.SelectedIndex = 0; + TabControl tabControl1_2 = this.TabControl1; + size1 = new Size(362, 298); + Size size4 = size1; + tabControl1_2.Size = size4; + this.TabControl1.TabIndex = 0; + this.GeneralTabPage.Controls.Add((Control) this.Label7); + this.GeneralTabPage.Controls.Add((Control) this.Label6); + this.GeneralTabPage.Controls.Add((Control) this.Label5); + this.GeneralTabPage.Controls.Add((Control) this.MasterPasswordTextBox); + this.GeneralTabPage.Controls.Add((Control) this.BackgroundImagepathTextBox); + this.GeneralTabPage.Controls.Add((Control) this.Label4); + this.GeneralTabPage.Controls.Add((Control) this.SetMasterPasswordButton); + this.GeneralTabPage.Controls.Add((Control) this.ClearFaviconButton); + this.GeneralTabPage.Controls.Add((Control) this.ClearJumpListButton); + this.GeneralTabPage.Controls.Add((Control) this.BackgroundImageButton); + TabPage generalTabPage1 = this.GeneralTabPage; + point1 = new Point(4, 22); + Point point5 = point1; + generalTabPage1.Location = point5; + this.GeneralTabPage.Name = "GeneralTabPage"; + TabPage generalTabPage2 = this.GeneralTabPage; + Padding padding1 = new Padding(3); + Padding padding2 = padding1; + generalTabPage2.Padding = padding2; + TabPage generalTabPage3 = this.GeneralTabPage; + size1 = new Size(354, 272); + Size size5 = size1; + generalTabPage3.Size = size5; + this.GeneralTabPage.TabIndex = 0; + this.GeneralTabPage.Text = "General"; + this.GeneralTabPage.UseVisualStyleBackColor = true; + this.Label7.AutoSize = true; + Label label7_1 = this.Label7; + point1 = new Point(32, 136); + Point point6 = point1; + label7_1.Location = point6; + this.Label7.Name = "Label7"; + Label label7_2 = this.Label7; + size1 = new Size(81, 12); + Size size6 = size1; + label7_2.Size = size6; + this.Label7.TabIndex = 5; + this.Label7.Text = "Favicon Cache"; + this.Label7.TextAlign = ContentAlignment.MiddleRight; + this.Label6.AutoSize = true; + Label label6_1 = this.Label6; + point1 = new Point(59, 96); + Point point7 = point1; + label6_1.Location = point7; + this.Label6.Name = "Label6"; + Label label6_2 = this.Label6; + size1 = new Size(56, 12); + Size size7 = size1; + label6_2.Size = size7; + this.Label6.TabIndex = 5; + this.Label6.Text = "Jump List"; + this.Label6.TextAlign = ContentAlignment.MiddleRight; + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + point1 = new Point(22, 56); + Point point8 = point1; + label5_1.Location = point8; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + size1 = new Size(93, 12); + Size size8 = size1; + label5_2.Size = size8; + this.Label5.TabIndex = 5; + this.Label5.Text = "Master Password"; + this.Label5.TextAlign = ContentAlignment.MiddleRight; + TextBox masterPasswordTextBox1 = this.MasterPasswordTextBox; + point1 = new Point(120, 56); + Point point9 = point1; + masterPasswordTextBox1.Location = point9; + this.MasterPasswordTextBox.Name = "MasterPasswordTextBox"; + this.MasterPasswordTextBox.ReadOnly = true; + TextBox masterPasswordTextBox2 = this.MasterPasswordTextBox; + size1 = new Size(168, 19); + Size size9 = size1; + masterPasswordTextBox2.Size = size9; + this.MasterPasswordTextBox.TabIndex = 4; + this.MasterPasswordTextBox.UseSystemPasswordChar = true; + TextBox imagepathTextBox1 = this.BackgroundImagepathTextBox; + point1 = new Point(120, 16); + Point point10 = point1; + imagepathTextBox1.Location = point10; + this.BackgroundImagepathTextBox.Name = "BackgroundImagepathTextBox"; + TextBox imagepathTextBox2 = this.BackgroundImagepathTextBox; + size1 = new Size(168, 19); + Size size10 = size1; + imagepathTextBox2.Size = size10; + this.BackgroundImagepathTextBox.TabIndex = 4; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(16, 16); + Point point11 = point1; + label4_1.Location = point11; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(99, 12); + Size size11 = size1; + label4_2.Size = size11; + this.Label4.TabIndex = 3; + this.Label4.Text = "Background Image"; + this.Label4.TextAlign = ContentAlignment.MiddleRight; + Button masterPasswordButton1 = this.SetMasterPasswordButton; + point1 = new Point(296, 56); + Point point12 = point1; + masterPasswordButton1.Location = point12; + this.SetMasterPasswordButton.Name = "SetMasterPasswordButton"; + Button masterPasswordButton2 = this.SetMasterPasswordButton; + size1 = new Size(48, 24); + Size size12 = size1; + masterPasswordButton2.Size = size12; + this.SetMasterPasswordButton.TabIndex = 2; + this.SetMasterPasswordButton.Text = "Set"; + this.SetMasterPasswordButton.UseVisualStyleBackColor = true; + Button clearFaviconButton1 = this.ClearFaviconButton; + point1 = new Point(120, 136); + Point point13 = point1; + clearFaviconButton1.Location = point13; + this.ClearFaviconButton.Name = "ClearFaviconButton"; + Button clearFaviconButton2 = this.ClearFaviconButton; + size1 = new Size(72, 24); + Size size13 = size1; + clearFaviconButton2.Size = size13; + this.ClearFaviconButton.TabIndex = 1; + this.ClearFaviconButton.Text = "Clear"; + this.ClearFaviconButton.UseVisualStyleBackColor = true; + Button clearJumpListButton1 = this.ClearJumpListButton; + point1 = new Point(120, 96); + Point point14 = point1; + clearJumpListButton1.Location = point14; + this.ClearJumpListButton.Name = "ClearJumpListButton"; + Button clearJumpListButton2 = this.ClearJumpListButton; + size1 = new Size(72, 24); + Size size14 = size1; + clearJumpListButton2.Size = size14; + this.ClearJumpListButton.TabIndex = 1; + this.ClearJumpListButton.Text = "Clear"; + this.ClearJumpListButton.UseVisualStyleBackColor = true; + Button backgroundImageButton1 = this.BackgroundImageButton; + point1 = new Point(296, 16); + Point point15 = point1; + backgroundImageButton1.Location = point15; + this.BackgroundImageButton.Name = "BackgroundImageButton"; + Button backgroundImageButton2 = this.BackgroundImageButton; + size1 = new Size(48, 23); + Size size15 = size1; + backgroundImageButton2.Size = size15; + this.BackgroundImageButton.TabIndex = 0; + this.BackgroundImageButton.Text = "..."; + this.BackgroundImageButton.UseVisualStyleBackColor = true; + this.TabPage1.Controls.Add((Control) this.Label9); + this.TabPage1.Controls.Add((Control) this.GroupBox1); + this.TabPage1.Controls.Add((Control) this.RebootWebClientButton); + this.TabPage1.Controls.Add((Control) this.AutoMoundFolderCheckBox); + this.TabPage1.Controls.Add((Control) this.AutoMoundDriveLetterComboBox); + this.TabPage1.Controls.Add((Control) this.AutoMoundDriveCheckBox); + this.TabPage1.Controls.Add((Control) this.ServerAutoEnableCheckBox); + this.TabPage1.Controls.Add((Control) this.Label2); + this.TabPage1.Controls.Add((Control) this.ServerPortTextBox); + this.TabPage1.Controls.Add((Control) this.Label10); + this.TabPage1.Controls.Add((Control) this.Label8); + this.TabPage1.Controls.Add((Control) this.Label1); + this.TabPage1.Controls.Add((Control) this.ServerIPTextBox); + TabPage tabPage1_1 = this.TabPage1; + point1 = new Point(4, 22); + Point point16 = point1; + tabPage1_1.Location = point16; + this.TabPage1.Name = "TabPage1"; + TabPage tabPage1_2 = this.TabPage1; + padding1 = new Padding(3); + Padding padding3 = padding1; + tabPage1_2.Padding = padding3; + TabPage tabPage1_3 = this.TabPage1; + size1 = new Size(354, 272); + Size size16 = size1; + tabPage1_3.Size = size16; + this.TabPage1.TabIndex = 1; + this.TabPage1.Text = "DAV Server"; + this.TabPage1.UseVisualStyleBackColor = true; + Label label9_1 = this.Label9; + point1 = new Point(160, 24); + Point point17 = point1; + label9_1.Location = point17; + this.Label9.Name = "Label9"; + Label label9_2 = this.Label9; + size1 = new Size(192, 32); + Size size17 = size1; + label9_2.Size = size17; + this.Label9.TabIndex = 10; + this.Label9.Text = "2000: port 80 and Folder\r\nXP: (port 80 and Drive) or ( Folder )"; + this.GroupBox1.Controls.Add((Control) this.Label3); + this.GroupBox1.Controls.Add((Control) this.MaxSizeUpDown); + this.GroupBox1.Controls.Add((Control) this.MaxSizeChangeButton); + GroupBox groupBox1_1 = this.GroupBox1; + point1 = new Point(16, 208); + Point point18 = point1; + groupBox1_1.Location = point18; + this.GroupBox1.Name = "GroupBox1"; + GroupBox groupBox1_2 = this.GroupBox1; + size1 = new Size(328, 56); + Size size18 = size1; + groupBox1_2.Size = size18; + this.GroupBox1.TabIndex = 9; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Registry Setting"; + this.Label3.AutoSize = true; + Label label3_1 = this.Label3; + point1 = new Point(56, 24); + Point point19 = point1; + label3_1.Location = point19; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(74, 12); + Size size19 = size1; + label3_2.Size = size19; + this.Label3.TabIndex = 0; + this.Label3.Text = "Max File Size"; + NumericUpDown maxSizeUpDown1 = this.MaxSizeUpDown; + Decimal num1 = new Decimal(new int[4] + { + 1000000, + 0, + 0, + 0 + }); + Decimal num2 = num1; + maxSizeUpDown1.Increment = num2; + NumericUpDown maxSizeUpDown2 = this.MaxSizeUpDown; + point1 = new Point(136, 24); + Point point20 = point1; + maxSizeUpDown2.Location = point20; + NumericUpDown maxSizeUpDown3 = this.MaxSizeUpDown; + num1 = new Decimal(new int[4]{ -1, 0, 0, 0 }); + Decimal num3 = num1; + maxSizeUpDown3.Maximum = num3; + this.MaxSizeUpDown.Name = "MaxSizeUpDown"; + NumericUpDown maxSizeUpDown4 = this.MaxSizeUpDown; + size1 = new Size(96, 19); + Size size20 = size1; + maxSizeUpDown4.Size = size20; + this.MaxSizeUpDown.TabIndex = 1; + this.MaxSizeUpDown.TextAlign = HorizontalAlignment.Right; + this.MaxSizeUpDown.ThousandsSeparator = true; + Button sizeChangeButton1 = this.MaxSizeChangeButton; + point1 = new Point(240, 16); + Point point21 = point1; + sizeChangeButton1.Location = point21; + this.MaxSizeChangeButton.Name = "MaxSizeChangeButton"; + Button sizeChangeButton2 = this.MaxSizeChangeButton; + size1 = new Size(72, 23); + Size size21 = size1; + sizeChangeButton2.Size = size21; + this.MaxSizeChangeButton.TabIndex = 2; + this.MaxSizeChangeButton.Text = "Change"; + this.MaxSizeChangeButton.UseVisualStyleBackColor = true; + Button rebootWebClientButton1 = this.RebootWebClientButton; + point1 = new Point(208, 144); + Point point22 = point1; + rebootWebClientButton1.Location = point22; + this.RebootWebClientButton.Name = "RebootWebClientButton"; + Button rebootWebClientButton2 = this.RebootWebClientButton; + size1 = new Size(72, 23); + Size size22 = size1; + rebootWebClientButton2.Size = size22; + this.RebootWebClientButton.TabIndex = 2; + this.RebootWebClientButton.Text = "Reboot"; + this.RebootWebClientButton.UseVisualStyleBackColor = true; + this.AutoMoundFolderCheckBox.AutoSize = true; + CheckBox moundFolderCheckBox1 = this.AutoMoundFolderCheckBox; + point1 = new Point(48, 176); + Point point23 = point1; + moundFolderCheckBox1.Location = point23; + this.AutoMoundFolderCheckBox.Name = "AutoMoundFolderCheckBox"; + CheckBox moundFolderCheckBox2 = this.AutoMoundFolderCheckBox; + size1 = new Size(191, 16); + Size size23 = size1; + moundFolderCheckBox2.Size = size23; + this.AutoMoundFolderCheckBox.TabIndex = 8; + this.AutoMoundFolderCheckBox.Text = "Auto Mount/Unmount WebFolder"; + this.AutoMoundFolderCheckBox.UseVisualStyleBackColor = true; + this.AutoMoundDriveLetterComboBox.DropDownStyle = ComboBoxStyle.DropDownList; + this.AutoMoundDriveLetterComboBox.FormattingEnabled = true; + ComboBox driveLetterComboBox1 = this.AutoMoundDriveLetterComboBox; + point1 = new Point(136, 120); + Point point24 = point1; + driveLetterComboBox1.Location = point24; + this.AutoMoundDriveLetterComboBox.Name = "AutoMoundDriveLetterComboBox"; + ComboBox driveLetterComboBox2 = this.AutoMoundDriveLetterComboBox; + size1 = new Size(48, 20); + Size size24 = size1; + driveLetterComboBox2.Size = size24; + this.AutoMoundDriveLetterComboBox.TabIndex = 7; + this.AutoMoundDriveCheckBox.AutoSize = true; + CheckBox moundDriveCheckBox1 = this.AutoMoundDriveCheckBox; + point1 = new Point(48, 96); + Point point25 = point1; + moundDriveCheckBox1.Location = point25; + this.AutoMoundDriveCheckBox.Name = "AutoMoundDriveCheckBox"; + CheckBox moundDriveCheckBox2 = this.AutoMoundDriveCheckBox; + size1 = new Size(165, 16); + Size size25 = size1; + moundDriveCheckBox2.Size = size25; + this.AutoMoundDriveCheckBox.TabIndex = 5; + this.AutoMoundDriveCheckBox.Text = "Auto Mount/Unmount Drive"; + this.AutoMoundDriveCheckBox.UseVisualStyleBackColor = true; + this.ServerAutoEnableCheckBox.AutoSize = true; + CheckBox autoEnableCheckBox1 = this.ServerAutoEnableCheckBox; + point1 = new Point(48, 72); + Point point26 = point1; + autoEnableCheckBox1.Location = point26; + this.ServerAutoEnableCheckBox.Name = "ServerAutoEnableCheckBox"; + CheckBox autoEnableCheckBox2 = this.ServerAutoEnableCheckBox; + size1 = new Size(151, 16); + Size size26 = size1; + autoEnableCheckBox2.Size = size26; + this.ServerAutoEnableCheckBox.TabIndex = 4; + this.ServerAutoEnableCheckBox.Text = "Auto Enable DAV Server"; + this.ServerAutoEnableCheckBox.UseVisualStyleBackColor = true; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(16, 40); + Point point27 = point1; + label2_1.Location = point27; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(26, 12); + Size size27 = size1; + label2_2.Size = size27; + this.Label2.TabIndex = 2; + this.Label2.Text = "Port"; + this.Label2.TextAlign = ContentAlignment.TopRight; + TextBox serverPortTextBox1 = this.ServerPortTextBox; + point1 = new Point(48, 40); + Point point28 = point1; + serverPortTextBox1.Location = point28; + this.ServerPortTextBox.Name = "ServerPortTextBox"; + TextBox serverPortTextBox2 = this.ServerPortTextBox; + size1 = new Size(100, 19); + Size size28 = size1; + serverPortTextBox2.Size = size28; + this.ServerPortTextBox.TabIndex = 3; + this.Label10.AutoSize = true; + Label label10_1 = this.Label10; + point1 = new Point(64, 152); + Point point29 = point1; + label10_1.Location = point29; + this.Label10.Name = "Label10"; + Label label10_2 = this.Label10; + size1 = new Size(138, 12); + Size size29 = size1; + label10_2.Size = size29; + this.Label10.TabIndex = 6; + this.Label10.Text = "Reboot WebClient Service"; + this.Label10.TextAlign = ContentAlignment.MiddleRight; + this.Label8.AutoSize = true; + Label label8_1 = this.Label8; + point1 = new Point(64, 120); + Point point30 = point1; + label8_1.Location = point30; + this.Label8.Name = "Label8"; + Label label8_2 = this.Label8; + size1 = new Size(66, 12); + Size size30 = size1; + label8_2.Size = size30; + this.Label8.TabIndex = 6; + this.Label8.Text = "Drive Letter"; + this.Label8.TextAlign = ContentAlignment.MiddleRight; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(27, 16); + Point point31 = point1; + label1_1.Location = point31; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(15, 12); + Size size31 = size1; + label1_2.Size = size31; + this.Label1.TabIndex = 0; + this.Label1.Text = "IP"; + this.Label1.TextAlign = ContentAlignment.TopRight; + TextBox serverIpTextBox1 = this.ServerIPTextBox; + point1 = new Point(48, 16); + Point point32 = point1; + serverIpTextBox1.Location = point32; + this.ServerIPTextBox.Name = "ServerIPTextBox"; + TextBox serverIpTextBox2 = this.ServerIPTextBox; + size1 = new Size(100, 19); + Size size32 = size1; + serverIpTextBox2.Size = size32; + this.ServerIPTextBox.TabIndex = 1; + this.OpenFileDialog1.FileName = "OpenFileDialog1"; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(377, 344); + this.ClientSize = size1; + this.Controls.Add((Control) this.TabControl1); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.OKButton); + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(393, 382); + this.MinimumSize = size1; + this.Name = nameof (WebDAVClientSettingForm); + this.ShowInTaskbar = false; + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Setting and Tool"; + this.TabControl1.ResumeLayout(false); + this.GeneralTabPage.ResumeLayout(false); + this.GeneralTabPage.PerformLayout(); + this.TabPage1.ResumeLayout(false); + this.TabPage1.PerformLayout(); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.MaxSizeUpDown.EndInit(); + this.ResumeLayout(false); + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._m_CancelButton = value; + } + } + + internal virtual TabControl TabControl1 + { + get + { + return this._TabControl1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TabControl1 = value; + } + } + + internal virtual TabPage GeneralTabPage + { + get + { + return this._GeneralTabPage; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GeneralTabPage = value; + } + } + + internal virtual Button BackgroundImageButton + { + get + { + return this._BackgroundImageButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.BackgroundImageButton_Click); + if (this._BackgroundImageButton != null) + this._BackgroundImageButton.Click -= eventHandler; + this._BackgroundImageButton = value; + if (this._BackgroundImageButton == null) + return; + this._BackgroundImageButton.Click += eventHandler; + } + } + + internal virtual Button ClearJumpListButton + { + get + { + return this._ClearJumpListButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ClearJumpListButton_Click); + if (this._ClearJumpListButton != null) + this._ClearJumpListButton.Click -= eventHandler; + this._ClearJumpListButton = value; + if (this._ClearJumpListButton == null) + return; + this._ClearJumpListButton.Click += eventHandler; + } + } + + internal virtual TabPage TabPage1 + { + get + { + return this._TabPage1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TabPage1 = value; + } + } + + internal virtual CheckBox ServerAutoEnableCheckBox + { + get + { + return this._ServerAutoEnableCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ServerAutoEnableCheckBox = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual TextBox ServerPortTextBox + { + get + { + return this._ServerPortTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBox_Validated); + if (this._ServerPortTextBox != null) + this._ServerPortTextBox.Validated -= eventHandler; + this._ServerPortTextBox = value; + if (this._ServerPortTextBox == null) + return; + this._ServerPortTextBox.Validated += eventHandler; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual TextBox ServerIPTextBox + { + get + { + return this._ServerIPTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ServerIPTextBox = value; + } + } + + internal virtual NumericUpDown MaxSizeUpDown + { + get + { + return this._MaxSizeUpDown; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MaxSizeUpDown = value; + } + } + + internal virtual Button MaxSizeChangeButton + { + get + { + return this._MaxSizeChangeButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.MaxSizeChangeButton_Click); + if (this._MaxSizeChangeButton != null) + this._MaxSizeChangeButton.Click -= eventHandler; + this._MaxSizeChangeButton = value; + if (this._MaxSizeChangeButton == null) + return; + this._MaxSizeChangeButton.Click += eventHandler; + } + } + + internal virtual Button SetMasterPasswordButton + { + get + { + return this._SetMasterPasswordButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SetMasterPasswordButton_Click); + if (this._SetMasterPasswordButton != null) + this._SetMasterPasswordButton.Click -= eventHandler; + this._SetMasterPasswordButton = value; + if (this._SetMasterPasswordButton == null) + return; + this._SetMasterPasswordButton.Click += eventHandler; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + internal virtual TextBox BackgroundImagepathTextBox + { + get + { + return this._BackgroundImagepathTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._BackgroundImagepathTextBox = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual GroupBox GroupBox1 + { + get + { + return this._GroupBox1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBox1 = value; + } + } + + internal virtual OpenFileDialog OpenFileDialog1 + { + get + { + return this._OpenFileDialog1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OpenFileDialog1 = value; + } + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual TextBox MasterPasswordTextBox + { + get + { + return this._MasterPasswordTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MasterPasswordTextBox = value; + } + } + + internal virtual Button ClearFaviconButton + { + get + { + return this._ClearFaviconButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ClearFaviconButton_Click); + if (this._ClearFaviconButton != null) + this._ClearFaviconButton.Click -= eventHandler; + this._ClearFaviconButton = value; + if (this._ClearFaviconButton == null) + return; + this._ClearFaviconButton.Click += eventHandler; + } + } + + internal virtual Label Label7 + { + get + { + return this._Label7; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label7 = value; + } + } + + internal virtual Label Label6 + { + get + { + return this._Label6; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label6 = value; + } + } + + internal virtual CheckBox AutoMoundFolderCheckBox + { + get + { + return this._AutoMoundFolderCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._AutoMoundFolderCheckBox = value; + } + } + + internal virtual CheckBox AutoMoundDriveCheckBox + { + get + { + return this._AutoMoundDriveCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckBox_CheckedChanged); + if (this._AutoMoundDriveCheckBox != null) + this._AutoMoundDriveCheckBox.CheckedChanged -= eventHandler; + this._AutoMoundDriveCheckBox = value; + if (this._AutoMoundDriveCheckBox == null) + return; + this._AutoMoundDriveCheckBox.CheckedChanged += eventHandler; + } + } + + internal virtual ComboBox AutoMoundDriveLetterComboBox + { + get + { + return this._AutoMoundDriveLetterComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._AutoMoundDriveLetterComboBox = value; + } + } + + internal virtual Label Label8 + { + get + { + return this._Label8; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label8 = value; + } + } + + internal virtual Label Label9 + { + get + { + return this._Label9; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label9 = value; + } + } + + internal virtual Button RebootWebClientButton + { + get + { + return this._RebootWebClientButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.RebootWebClientButton_Click); + if (this._RebootWebClientButton != null) + this._RebootWebClientButton.Click -= eventHandler; + this._RebootWebClientButton = value; + if (this._RebootWebClientButton == null) + return; + this._RebootWebClientButton.Click += eventHandler; + } + } + + internal virtual Label Label10 + { + get + { + return this._Label10; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label10 = value; + } + } + + [DllImport("shlwapi.dll")] + private static extern bool PathRelativePathTo(StringBuilder path, string from, int attrFrom, string to, int attrTo); + + private void WebDAVClientSettingForm_Load(object sender, EventArgs e) + { + this.Icon = CarotDAV.My.Resources.Resources.CarotDAV; + this.AutoMoundDriveLetterComboBox.BeginUpdate(); + this.AutoMoundDriveLetterComboBox.Items.Clear(); + this.AutoMoundDriveLetterComboBox.Items.Add((object) "Auto"); + string[] logicalDrives = Environment.GetLogicalDrives(); + int num1 = 3; + do + { + string str = Conversions.ToString(Strings.Chr(checked (num1 + 65))); + int num2 = 0; + int num3 = checked (logicalDrives.Length - 1); + int index = num2; + while (index <= num3) + { + if (Operators.CompareString(logicalDrives[index].ToUpperInvariant(), str.ToUpperInvariant() + ":\\", false) != 0) + checked { ++index; } + else + goto label_6; + } + this.AutoMoundDriveLetterComboBox.Items.Add((object) str.ToUpperInvariant()); +label_6: + checked { ++num1; } + } + while (num1 <= 25); + WebDAVClientSetting tag = (WebDAVClientSetting) this.Tag; + this.BackgroundImagepathTextBox.Text = tag.BackgroundImagePath; + this.MasterPasswordTextBox.Text = tag.MasterPassword; + this.ServerAutoEnableCheckBox.Checked = tag.AutoEnableDAVServer; + this.ServerIPTextBox.Text = tag.ServerIP; + this.ServerPortTextBox.Text = tag.ServerPort.ToString(); + this.AutoMoundDriveCheckBox.Checked = false; + this.AutoMoundDriveLetterComboBox.SelectedIndex = 0; + int num4 = 0; + int num5 = checked (this.AutoMoundDriveLetterComboBox.Items.Count - 1); + int index1 = num4; + while (index1 <= num5) + { + if (Operators.CompareString(this.AutoMoundDriveLetterComboBox.Items[index1].ToString().ToUpperInvariant(), tag.AutoMoundDriveLetter.ToUpperInvariant(), false) == 0) + { + this.AutoMoundDriveCheckBox.Checked = true; + this.AutoMoundDriveLetterComboBox.SelectedIndex = index1; + } + checked { ++index1; } + } + this.AutoMoundDriveLetterComboBox.EndUpdate(); + this.AutoMoundFolderCheckBox.Checked = tag.AutoMoundWebFolder; + this.MaxSizeUpDown.Value = new Decimal(NetDriveManager.ReadMaxFileSize()); + WebDAVClientSettingForm.SetShieldIcon(this.MaxSizeChangeButton, true); + WebDAVClientSettingForm.SetShieldIcon(this.RebootWebClientButton, true); + this.UpdateEnabled(); + } + + private void TextBox_TextChanged(object sender, EventArgs e) + { + this.UpdateEnabled(); + } + + private void CheckedChanged(object sender, EventArgs e) + { + this.UpdateEnabled(); + } + + private void OKButton_Click(object sender, EventArgs e) + { + WebDAVClientSetting tag = (WebDAVClientSetting) this.Tag; + tag.BackgroundImagePath = this.BackgroundImagepathTextBox.Text.Trim(); + tag.MasterPassword = this.MasterPasswordTextBox.Text; + tag.ServerIP = this.ServerIPTextBox.Text.Trim(); + tag.ServerPort = int.Parse(this.ServerPortTextBox.Text.Trim()); + tag.AutoEnableDAVServer = this.ServerAutoEnableCheckBox.Checked; + tag.AutoMoundDriveLetter = !this.AutoMoundDriveCheckBox.Checked ? "" : this.AutoMoundDriveLetterComboBox.SelectedItem.ToString(); + tag.AutoMoundWebFolder = this.AutoMoundFolderCheckBox.Checked; + this.DialogResult = DialogResult.OK; + } + + public void UpdateEnabled() + { + bool flag = true; + this.AutoMoundDriveLetterComboBox.Enabled = this.AutoMoundDriveCheckBox.Checked; + this.ClearJumpListButton.Enabled = !XmlSettingManager.IsPortable && TaskbarManager.IsSupportJumpList; + int result = 0; + IPAddress address = (IPAddress) null; + this.OKButton.Enabled = flag && IPAddress.TryParse(this.ServerIPTextBox.Text.Trim(), out address) && int.TryParse(this.ServerPortTextBox.Text.Trim(), out result) && result > 0 && result < 65536; + } + + private void CheckBox_CheckedChanged(object sender, EventArgs e) + { + this.UpdateEnabled(); + } + + private void TextBox_Validated(object sender, EventArgs e) + { + this.UpdateEnabled(); + } + + private void BackgroundImageButton_Click(object sender, EventArgs e) + { + this.OpenFileDialog1.Title = "Select Background Image"; + this.OpenFileDialog1.CheckFileExists = true; + this.OpenFileDialog1.CheckPathExists = true; + this.OpenFileDialog1.Filter = "Image File(*.bmp,*.jpg,*.png)|*.bmp;*.jpg;*.png"; + this.OpenFileDialog1.Multiselect = false; + string str = XmlSettingManager.SettingFolder + "\\"; + if (string.IsNullOrEmpty(this.BackgroundImagepathTextBox.Text)) + this.OpenFileDialog1.FileName = str + "background.png"; + else + this.OpenFileDialog1.FileName = this.BackgroundImagepathTextBox.Text; + if (this.OpenFileDialog1.ShowDialog((IWin32Window) this) != DialogResult.OK) + return; + if (this.OpenFileDialog1.FileName.StartsWith(str)) + this.BackgroundImagepathTextBox.Text = this.OpenFileDialog1.FileName.Substring(str.Length); + else + this.BackgroundImagepathTextBox.Text = this.OpenFileDialog1.FileName; + } + + private void SetMasterPasswordButton_Click(object sender, EventArgs e) + { + MasterPasswordChangeForm passwordChangeForm = new MasterPasswordChangeForm(); + passwordChangeForm.MasterPassword = this.MasterPasswordTextBox.Text; + if (passwordChangeForm.ShowDialog() != DialogResult.OK) + return; + this.MasterPasswordTextBox.Text = passwordChangeForm.NewMasterPassword; + } + + private void ClearJumpListButton_Click(object sender, EventArgs e) + { + if (MessageBox.Show((IWin32Window) this, "Are you sure to clear all Jump List?", "Confirm Jump List Clear", MessageBoxButtons.YesNo) != DialogResult.Yes) + return; + TaskbarManager.ClearJumpList(MainForm.AppUserModelId); + } + + private void ClearFaviconButton_Click(object sender, EventArgs e) + { + if (MessageBox.Show((IWin32Window) this, "Are you sure to clear all Favicon Cache?", "Confirm Favicon Cache Clear", MessageBoxButtons.YesNo) != DialogResult.Yes) + return; + string faviconFolder = XmlSettingManager.FaviconFolder; + try + { + Directory.Delete(faviconFolder, true); + } + catch (DirectoryNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show(ex.ToString()); + ProjectData.ClearProjectError(); + } + } + + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + + public static void SetShieldIcon(Button targetButton, bool showShield) + { + if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6) + return; + targetButton.FlatStyle = FlatStyle.System; + WebDAVClientSettingForm.SendMessage(new HandleRef((object) targetButton, targetButton.Handle), 5644U, IntPtr.Zero, showShield ? new IntPtr(1) : IntPtr.Zero); + } + + private void MaxSizeChangeButton_Click(object sender, EventArgs e) + { + NetDriveManager.WriteMaxFileSize(Convert.ToInt64(this.MaxSizeUpDown.Value), this.Handle); + } + + private void RebootWebClientButton_Click(object sender, EventArgs e) + { + NetDriveManager.RebootWebClient(this.Handle); + } + } +} diff --git a/CarotDAV/WebDAVClientSettingForm.resx b/CarotDAV/WebDAVClientSettingForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/CarotDAV/WebDAVClientSettingForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CarotDAV/XmlSettingManager.cs b/CarotDAV/XmlSettingManager.cs new file mode 100644 index 0000000..09fd51d --- /dev/null +++ b/CarotDAV/XmlSettingManager.cs @@ -0,0 +1,365 @@ +// Decompiled with JetBrains decompiler +// Type: CarotDAV.XmlSettingManager +// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null +// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Security.Cryptography; +using System.Security.Cryptography.Xml; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +namespace CarotDAV +{ + public class XmlSettingManager + { + private static string pSettingFolder = (string) null; + private const string FormatName = "CarotDAV Encryption 1.0 "; + private const string SettingFileName = "Setting.xml"; + private const string FaviconFolderName = "Favicon"; + private static bool pIsPortable; + private static XmlAttributeOverrides attroverrides; + + static XmlSettingManager() + { + Assembly entryAssembly = Assembly.GetEntryAssembly(); + string directoryName = Path.GetDirectoryName(entryAssembly.Location); + XmlSettingManager.pIsPortable = !File.Exists(Path.Combine(directoryName, "Installed.txt")); + if (XmlSettingManager.pIsPortable) + { + XmlSettingManager.pSettingFolder = directoryName; + } + else + { + string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string str1 = "Rei Software"; + string str2 = "CarotDAV"; + object[] customAttributes = entryAssembly.GetCustomAttributes(typeof (AssemblyCompanyAttribute), false); + if (customAttributes != null && customAttributes.Length > 0) + str1 = ((AssemblyCompanyAttribute) customAttributes[0]).Company; + XmlSettingManager.pSettingFolder = string.Join(Conversions.ToString(Path.DirectorySeparatorChar), new string[3] + { + folderPath, + str1, + str2 + }); + } + } + + public static bool IsPortable + { + get + { + return XmlSettingManager.pIsPortable; + } + } + + public static string SettingFolder + { + get + { + return XmlSettingManager.pSettingFolder; + } + } + + public static string FaviconFolder + { + get + { + return Path.Combine(XmlSettingManager.SettingFolder, "Favicon"); + } + } + + private static SymmetricAlgorithm CreateCrypto(string password) + { + Rijndael rijndael = Rijndael.Create(); + rijndael.Mode = CipherMode.CBC; + rijndael.Padding = PaddingMode.None; + rijndael.BlockSize = 128; + rijndael.KeySize = 256; + byte[] bytes = Encoding.UTF8.GetBytes("CarotDAV Encryption 1.0 "); + Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, bytes, 1024); + rijndael.Key = rfc2898DeriveBytes.GetBytes(checked ((int) Math.Round(unchecked ((double) rijndael.KeySize / 8.0)))); + rijndael.IV = rfc2898DeriveBytes.GetBytes(checked ((int) Math.Round(unchecked ((double) rijndael.BlockSize / 8.0)))); + return (SymmetricAlgorithm) rijndael; + } + + private static XmlAttributeOverrides GetSerializerAttributes() + { + if (XmlSettingManager.attroverrides == null) + { + XmlAttributes attributes = new XmlAttributes(); + int num1 = 0; + int num2 = checked (FsManager.FsTypes.Length - 1); + int index = num1; + while (index <= num2) + { + attributes.XmlArrayItems.Add(new XmlArrayItemAttribute() + { + Type = FsManager.FsTypes[index] + }); + checked { ++index; } + } + XmlSettingManager.attroverrides = new XmlAttributeOverrides(); + XmlSettingManager.attroverrides.Add(typeof (WebDAVClientSetting), "ConnectionSettings", attributes); + } + return XmlSettingManager.attroverrides; + } + + public static void SaveSetting(WebDAVClientSetting setting) + { + XmlSerializer xmls = new XmlSerializer(typeof (WebDAVClientSetting), XmlSettingManager.GetSerializerAttributes()); + string settingFolder = XmlSettingManager.SettingFolder; + if (!Directory.Exists(settingFolder)) + Directory.CreateDirectory(settingFolder); + XmlSettingManager.InnerSaveSetting(Path.Combine(settingFolder, "Setting.xml"), xmls, setting); + } + + private static void InnerSaveSetting(string filepath, XmlSerializer xmls, WebDAVClientSetting setting) + { + byte[] array; + using (MemoryStream memoryStream = new MemoryStream()) + { + using (StreamWriter streamWriter = new StreamWriter((Stream) memoryStream)) + xmls.Serialize((TextWriter) streamWriter, (object) setting); + array = memoryStream.ToArray(); + } + XmlDocument document = new XmlDocument(); + using (MemoryStream memoryStream = new MemoryStream(array)) + document.Load((Stream) memoryStream); + IEnumerator enumerator1; + try + { + enumerator1 = document.GetElementsByTagName("ConnectionSettings").GetEnumerator(); + if (enumerator1.MoveNext()) + { + XmlNode current = (XmlNode) enumerator1.Current; + int num1 = 0; + int num2 = checked (setting.UnsupportedConections.Count - 1); + int index = num1; + while (index <= num2) + { + current.AppendChild(document.ImportNode((XmlNode) setting.UnsupportedConections[index], true)); + checked { ++index; } + } + } + } + finally + { + if (enumerator1 is IDisposable) + (enumerator1 as IDisposable).Dispose(); + } + if (!string.IsNullOrEmpty(setting.MasterPassword)) + { + List xmlElementList = new List(); + try + { + foreach (XmlNode xmlNode in document.GetElementsByTagName("ConnectionSettings")) + xmlElementList.Add((XmlElement) xmlNode); + } + finally + { + IEnumerator enumerator2; + if (enumerator2 is IDisposable) + (enumerator2 as IDisposable).Dispose(); + } + try + { + foreach (XmlNode xmlNode in document.GetElementsByTagName("LastConnectionSetting")) + xmlElementList.Add((XmlElement) xmlNode); + } + finally + { + IEnumerator enumerator2; + if (enumerator2 is IDisposable) + (enumerator2 as IDisposable).Dispose(); + } + SymmetricAlgorithm crypto = XmlSettingManager.CreateCrypto(setting.MasterPassword); + int num1 = 0; + int num2 = checked (xmlElementList.Count - 1); + int index = num1; + while (index <= num2) + { + EncryptedXml encryptedXml = new EncryptedXml(document); + EncryptedData encryptedData = new EncryptedData(); + encryptedData.Type = "http://www.w3.org/2001/04/xmlenc#Element"; + encryptedData.EncryptionMethod = new EncryptionMethod("http://www.w3.org/2001/04/xmlenc#aes256-cbc"); + encryptedData.CipherData.CipherValue = encryptedXml.EncryptData(xmlElementList[index], crypto, false); + EncryptedXml.ReplaceElement(xmlElementList[index], encryptedData, false); + checked { ++index; } + } + } + using (MemoryStream memoryStream = new MemoryStream()) + { + document.Save((Stream) memoryStream); + array = memoryStream.ToArray(); + } + using (FileStream fileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write)) + fileStream.Write(array, 0, array.Length); + } + + public static WebDAVClientSetting LoadSetting(string masterpassword) + { + XmlAttributeOverrides attributeOverrides = new XmlAttributeOverrides(); + XmlSerializer xmls = new XmlSerializer(typeof (WebDAVClientSetting), XmlSettingManager.GetSerializerAttributes()); + XmlSettingManager.UnknownElementManager unknownElementManager = new XmlSettingManager.UnknownElementManager(); + xmls.UnknownElement += new XmlElementEventHandler(unknownElementManager.OnUnknownElement); + string settingFolder = XmlSettingManager.SettingFolder; + if (!Directory.Exists(settingFolder)) + Directory.CreateDirectory(settingFolder); + WebDAVClientSetting davClientSetting = XmlSettingManager.InnerLoadSetting(Path.Combine(settingFolder, "Setting.xml"), xmls, masterpassword) ?? new WebDAVClientSetting(); + int index = 0; + while (index < checked (davClientSetting.ConnectionSettings.Count - 1)) + { + if ((object) davClientSetting.ConnectionSettings[index].TargetUri == null) + davClientSetting.ConnectionSettings.RemoveAt(index); + else + checked { ++index; } + } + davClientSetting.UnsupportedConections = unknownElementManager.UnsupportedConections; + return davClientSetting; + } + + private static WebDAVClientSetting InnerLoadSetting(string filepath, XmlSerializer xmls, string masterpassword) + { + WebDAVClientSetting davClientSetting = (WebDAVClientSetting) null; + if (!File.Exists(filepath)) + return (WebDAVClientSetting) null; + XmlDocument document = new XmlDocument(); + document.Load(filepath); + XmlNodeList elementsByTagName = document.GetElementsByTagName("EncryptedData"); + if (elementsByTagName.Count > 0) + { + if (string.IsNullOrEmpty(masterpassword)) + throw new MasterPasswordException(false); + SymmetricAlgorithm crypto = XmlSettingManager.CreateCrypto(masterpassword); + try + { + int num1 = 0; + int num2 = checked (elementsByTagName.Count - 1); + int num3 = num1; + while (num3 <= num2) + { + EncryptedData encryptedData = new EncryptedData(); + EncryptedXml encryptedXml = new EncryptedXml(document); + encryptedData.LoadXml((XmlElement) elementsByTagName[0]); + encryptedXml.ReplaceData((XmlElement) elementsByTagName[0], encryptedXml.DecryptData(encryptedData, crypto)); + checked { ++num3; } + } + } + catch (CryptographicException ex) + { + ProjectData.SetProjectError((Exception) ex); + throw new MasterPasswordException(true); + } + } + byte[] array; + using (MemoryStream memoryStream = new MemoryStream()) + { + document.Save((Stream) memoryStream); + array = memoryStream.ToArray(); + } + using (MemoryStream memoryStream = new MemoryStream(array)) + davClientSetting = (WebDAVClientSetting) xmls.Deserialize((Stream) memoryStream); + davClientSetting.MasterPassword = masterpassword; + return davClientSetting; + } + + public static void ExportSetting(ConnectionSettingBase connectionsetting, string filename) + { + using (MemoryStream memoryStream = new MemoryStream()) + { + using (StreamWriter streamWriter = new StreamWriter((Stream) memoryStream)) + new XmlSerializer(connectionsetting.GetType()).Serialize((TextWriter) streamWriter, (object) connectionsetting); + using (FileStream fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write)) + { + byte[] array = memoryStream.ToArray(); + fileStream.Write(array, 0, array.Length); + } + } + } + + public static ConnectionSettingBase ImportSetting(string filename) + { + ConnectionSettingBase connectionSettingBase1; + ConnectionSettingBase connectionSettingBase2; + try + { + using (TextReader textReader = (TextReader) new StreamReader(filename)) + connectionSettingBase1 = (ConnectionSettingBase) new XmlSerializer(typeof (ConnectionSettingBase), FsManager.FsTypes).Deserialize(textReader); + connectionSettingBase2 = connectionSettingBase1; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + int num1 = 0; + int num2 = checked (FsManager.FsTypes.Length - 1); + int index = num1; + while (index <= num2) + { + try + { + using (TextReader textReader = (TextReader) new StreamReader(filename)) + connectionSettingBase1 = (ConnectionSettingBase) new XmlSerializer(FsManager.FsTypes[index]).Deserialize(textReader); + connectionSettingBase2 = connectionSettingBase1; + ProjectData.ClearProjectError(); + goto label_17; + } + catch (Exception ex2) + { + ProjectData.SetProjectError(ex2); + ProjectData.ClearProjectError(); + } + checked { ++index; } + } + throw; + } +label_17: + return connectionSettingBase2; + } + + public static ConnectionSettingBase CopyConnectionSetting(ConnectionSettingBase cs) + { + XmlSerializer xmlSerializer = new XmlSerializer(typeof (ConnectionSettingBase), FsManager.FsTypes); + StringBuilder sb = new StringBuilder(); + using (StringWriter stringWriter = new StringWriter(sb)) + xmlSerializer.Serialize((TextWriter) stringWriter, (object) cs); + using (StringReader stringReader = new StringReader(sb.ToString())) + return (ConnectionSettingBase) xmlSerializer.Deserialize((TextReader) stringReader); + } + + public static string XmlSerializeConnectionSetting(ConnectionSettingBase cs) + { + XmlSerializer xmlSerializer = new XmlSerializer(typeof (ConnectionSettingBase), FsManager.FsTypes); + StringBuilder sb = new StringBuilder(); + using (StringWriter stringWriter = new StringWriter(sb)) + xmlSerializer.Serialize((TextWriter) stringWriter, (object) cs); + return sb.ToString(); + } + + private class UnknownElementManager + { + public List UnsupportedConections; + + public UnknownElementManager() + { + this.UnsupportedConections = new List(); + } + + public void OnUnknownElement(object sender, XmlElementEventArgs e) + { + if (!e.ExpectedElements.Contains("ConnectionSetting")) + return; + this.UnsupportedConections.Add(e.Element); + } + } + } +} diff --git a/CarotDAV/lib/Rei.Com.dll b/CarotDAV/lib/Rei.Com.dll new file mode 100644 index 0000000..1c44fd8 Binary files /dev/null and b/CarotDAV/lib/Rei.Com.dll differ diff --git a/CarotDAV/lib/Rei.Fs.Webdav.dll b/CarotDAV/lib/Rei.Fs.Webdav.dll new file mode 100644 index 0000000..9fa3497 Binary files /dev/null and b/CarotDAV/lib/Rei.Fs.Webdav.dll differ diff --git a/CarotDAV/lib/Rei.Fs.dll b/CarotDAV/lib/Rei.Fs.dll new file mode 100644 index 0000000..7105c41 Binary files /dev/null and b/CarotDAV/lib/Rei.Fs.dll differ diff --git a/CarotDAV/lib/Rei.Net.HttpServer.dll b/CarotDAV/lib/Rei.Net.HttpServer.dll new file mode 100644 index 0000000..1fdfdc3 Binary files /dev/null and b/CarotDAV/lib/Rei.Net.HttpServer.dll differ diff --git a/Rei.Com/AssemblyInfo.cs b/Rei.Com/AssemblyInfo.cs new file mode 100644 index 0000000..56cb522 --- /dev/null +++ b/Rei.Com/AssemblyInfo.cs @@ -0,0 +1,12 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: ComVisible(false)] +[assembly: AssemblyCopyright("Copyright (C) Rei HOBARA 2007-2016")] +[assembly: AssemblyProduct("Rei.COM")] +[assembly: AssemblyTrademark("")] +[assembly: Guid("792a1fdb-d92e-4b82-bff2-32b999c79d5c")] +[assembly: AssemblyCompany("Rei Software")] +[assembly: AssemblyDescription("COM Support Library")] +[assembly: AssemblyTitle("Rei.COM")] +[assembly: AssemblyVersion("1.13.2.9255")] diff --git a/Rei.Com/ComStreamAdapterStream.cs b/Rei.Com/ComStreamAdapterStream.cs new file mode 100644 index 0000000..e89d613 --- /dev/null +++ b/Rei.Com/ComStreamAdapterStream.cs @@ -0,0 +1,102 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.ComStreamAdapterStream +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +namespace Rei.Com +{ + public class ComStreamAdapterStream : Stream + { + private IStream pStream; + private System.Runtime.InteropServices.ComTypes.STATSTG pStat; + + public ComStreamAdapterStream(IStream istream) + { + this.pStream = istream; + this.pStat = new System.Runtime.InteropServices.ComTypes.STATSTG(); + this.pStream.Stat(out this.pStat, 0); + } + + public override bool CanRead + { + get + { + return true; + } + } + + public override bool CanSeek + { + get + { + return true; + } + } + + public override bool CanWrite + { + get + { + return true; + } + } + + public override void Flush() + { + throw new NotImplementedException(); + } + + public override long Length + { + get + { + return this.pStat.cbSize; + } + } + + public override long Position + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + IntPtr num = Marshal.AllocHGlobal(4); + byte[] pv = new byte[checked (count - 1 + 1)]; + this.pStream.Read(pv, count, num); + int length = Marshal.ReadInt32(num, 0); + Array.Copy((Array) pv, 0, (Array) buffer, offset, length); + return length; + } + + public override long Seek(long offset, SeekOrigin origin) + { + IntPtr num = Marshal.AllocHGlobal(4); + this.pStream.Seek(offset, (int) origin, num); + return Marshal.ReadInt64(num, 0); + } + + public override void SetLength(long value) + { + this.pStream.SetSize(value); + } + + public override void Write(byte[] buffer, int offset, int count) + { + this.pStream.Write(buffer, count, IntPtr.Zero); + } + } +} diff --git a/Rei.Com/DataObject.cs b/Rei.Com/DataObject.cs new file mode 100644 index 0000000..af123c5 --- /dev/null +++ b/Rei.Com/DataObject.cs @@ -0,0 +1,1054 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.DataObject +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Rei.Com +{ + public class DataObject : System.Runtime.InteropServices.ComTypes.IDataObject, IDisposable, IAsyncOperation + { + private static DateTime win32timeorigin = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc); + private static readonly byte[] serializedObjectID = new Guid("FD9EA796-3B13-4370-A679-56106BB288FB").ToByteArray(); + public const int S_OK = 0; + public const int S_FALSE = 1; + public const int E_FAIL = -2147467259; + public const int E_UNEXPECTED = -2147418113; + public const int E_NOTIMPL = -2147483647; + public const int E_INVALIDARG = -2147483645; + public const int OLE_E_ADVISENOTSUPPORTED = -2147221501; + private const int DV_E_LINDEX = -2147221400; + private const int DV_E_FORMATETC = -2147221404; + private const int DV_E_TYMED = -2147221399; + private const int DV_E_DVASPECT = -2147221397; + private const int DV_E_DVTARGETDEVICE = -2147221403; + private const int STG_E_MEDIUMFULL = -2147286928; + public object Tag; + private List pData; + private bool disposedValue; + private bool pAsyncSupported; + private bool pInOperation; + private object pInOperationLock; + + private List Data + { + get + { + return this.pData; + } + } + + public DataObject() + { + this.disposedValue = false; + this.pData = new List(); + this.pInOperationLock = RuntimeHelpers.GetObjectValue(new object()); + this.pInOperation = false; + this.pAsyncSupported = false; + } + + public virtual FORMATETC[] SupportedFormats() + { + return new FORMATETC[0]; + } + + [DllImport("ole32.dll")] + internal static extern int OleIsCurrentClipboard(System.Runtime.InteropServices.ComTypes.IDataObject pDataObject); + + [DllImport("OLE32.DLL")] + internal static extern void ReleaseStgMedium(ref STGMEDIUM medium); + + [DllImport("Kernel32.dll")] + internal static extern int GlobalSize(IntPtr handle); + + [DllImport("Kernel32.dll")] + internal static extern IntPtr GlobalLock(IntPtr handle); + + [DllImport("Kernel32.dll")] + internal static extern bool GlobalUnlock(IntPtr handle); + + [DllImport("Kernel32.dll")] + internal static extern IntPtr GlobalFree(IntPtr handle); + + protected virtual void Dispose(bool disposing) + { + if (!this.disposedValue && disposing) + { + int num1 = 0; + int num2 = checked (this.Data.Count - 1); + int index = num1; + while (index <= num2) + { + DataObject.ObjectEntry objectEntry = this.Data[index]; + IDisposable receivedistream = objectEntry.receivedistream as IDisposable; + if (receivedistream != null) + receivedistream.Dispose(); + objectEntry = this.Data[index]; + if (objectEntry.istreamcreator != null) + this.Data[index].istreamcreator.Dispose(); + checked { ++index; } + } + this.Data.Clear(); + } + this.disposedValue = true; + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + ~DataObject() + { + this.Dispose(false); + // ISSUE: explicit finalizer call + base.Finalize(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public int DAdvise(ref FORMATETC pFormatetc, ADVF advf, IAdviseSink adviseSink, ref int connection) + { + return -2147221501; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void DUnadvise(int connection) + { + Marshal.ThrowExceptionForHR(-2147221501); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public int EnumDAdvise(ref IEnumSTATDATA enumAdvise) + { + return -2147221501; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public int GetCanonicalFormatEtc(ref FORMATETC formatIn, ref FORMATETC formatOut) + { + formatOut = formatIn; + return -2147221404; + } + + protected int IndexOf(FORMATETC format) + { + if (format.ptd != IntPtr.Zero) + return -2147221403; + if (format.dwAspect != DVASPECT.DVASPECT_CONTENT) + return -2147221397; + int num1 = 0; + int num2 = checked (this.Data.Count - 1); + int index = num1; + while (index <= num2) + { + if ((int) this.Data[index].Format.cfFormat == (int) format.cfFormat && this.Data[index].Format.dwAspect == format.dwAspect && this.Data[index].Format.lindex == format.lindex) + { + if ((this.Data[index].Format.tymed & format.tymed) != TYMED.TYMED_NULL) + return index; + return -2147221399; + } + checked { ++index; } + } + return -2147221404; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerStepThrough] + public virtual int QueryGetData(ref FORMATETC format) + { + DataObject.DataEventArgs e = new DataObject.DataEventArgs(format); + this.OnDataQueried(e); + if (e.QueryResult == DataObject.QueryGetDataResultType.Exists) + return 0; + if (e.QueryResult == DataObject.QueryGetDataResultType.None) + return 1; + int num = this.IndexOf(format); + if (num >= 0) + return 0; + return num; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerStepThrough] + public virtual void GetData(ref FORMATETC format, ref STGMEDIUM medium) + { + if ((format.tymed & (TYMED.TYMED_HGLOBAL | TYMED.TYMED_ISTREAM)) == TYMED.TYMED_NULL) + Marshal.ThrowExceptionForHR(-2147483647); + try + { + this.OnDataRequested(new DataObject.DataEventArgs(format)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Marshal.ThrowExceptionForHR(-2147418113); + ProjectData.ClearProjectError(); + } + int errorCode = this.IndexOf(format); + if (errorCode < 0) + Marshal.ThrowExceptionForHR(errorCode); + DataObject.ObjectEntry objectEntry = this.Data[errorCode]; + medium.tymed = objectEntry.Format.tymed; + medium.pUnkForRelease = (object) null; + switch (objectEntry.Format.tymed) + { + case TYMED.TYMED_HGLOBAL: + medium.unionmember = Marshal.AllocHGlobal(objectEntry.hglobal.Length); + Marshal.Copy(objectEntry.hglobal, 0, medium.unionmember, objectEntry.hglobal.Length); + break; + case TYMED.TYMED_ISTREAM: + System.Runtime.InteropServices.ComTypes.IStream stream = objectEntry.istreamcreator.Create(); + medium.unionmember = Marshal.GetIUnknownForObject((object) stream); + break; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerStepThrough] + public virtual void GetDataHere(ref FORMATETC format, ref STGMEDIUM medium) + { + if ((format.tymed & (TYMED.TYMED_HGLOBAL | TYMED.TYMED_ISTREAM)) == TYMED.TYMED_NULL) + Marshal.ThrowExceptionForHR(-2147483647); + if (format.tymed != medium.tymed) + Marshal.ThrowExceptionForHR(-2147221404); + this.OnDataRequested(new DataObject.DataEventArgs(format)); + int errorCode = this.IndexOf(format); + if (errorCode < 0) + Marshal.ThrowExceptionForHR(errorCode); + DataObject.ObjectEntry objectEntry = this.Data[errorCode]; + medium.tymed = objectEntry.Format.tymed; + medium.pUnkForRelease = (object) null; + switch (objectEntry.Format.tymed) + { + case TYMED.TYMED_HGLOBAL: + if (DataObject.GlobalSize(medium.unionmember) < objectEntry.hglobal.Length) + Marshal.ThrowExceptionForHR(-2147286928); + Marshal.Copy(objectEntry.hglobal, 0, medium.unionmember, objectEntry.hglobal.Length); + break; + case TYMED.TYMED_ISTREAM: + Marshal.ThrowExceptionForHR(-2147483647); + break; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerStepThrough] + public virtual void SetData([In] ref FORMATETC format, [In] ref STGMEDIUM medium, bool release) + { + if ((medium.tymed & medium.tymed - 1) != TYMED.TYMED_NULL) + Marshal.ThrowExceptionForHR(-2147221399); + if (format.tymed != medium.tymed) + Marshal.ThrowExceptionForHR(-2147221404); + if (medium.tymed != TYMED.TYMED_HGLOBAL && medium.tymed != TYMED.TYMED_ISTREAM) + Marshal.ThrowExceptionForHR(-2147483647); + if (medium.unionmember == IntPtr.Zero) + Marshal.ThrowExceptionForHR(-2147483645); + int i = this.IndexOf(format); + if (i >= 0) + this.RemoveAt(i); + DataObject.ObjectEntry objectEntry = new DataObject.ObjectEntry(format); + switch (objectEntry.Format.tymed) + { + case TYMED.TYMED_HGLOBAL: + int length = DataObject.GlobalSize(medium.unionmember); + objectEntry.hglobal = new byte[checked (length - 1 + 1)]; + Marshal.Copy(DataObject.GlobalLock(medium.unionmember), objectEntry.hglobal, 0, length); + DataObject.GlobalUnlock(medium.unionmember); + break; + case TYMED.TYMED_ISTREAM: + objectEntry.receivedistream = (System.Runtime.InteropServices.ComTypes.IStream) Marshal.GetTypedObjectForIUnknown(medium.unionmember, typeof (System.Runtime.InteropServices.ComTypes.IStream)); + break; + } + if (release) + DataObject.ReleaseStgMedium(ref medium); + this.Data.Add(objectEntry); + this.OnDataStored(new DataObject.DataEventArgs(format)); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerStepThrough] + public virtual IEnumFORMATETC EnumFormatEtc(DATADIR direction) + { + if (direction == DATADIR.DATADIR_SET) + Marshal.ThrowExceptionForHR(-2147221501); + FORMATETC[] formatetcArray = this.SupportedFormats(); + List formatetcList = new List(); + int num1 = 0; + int num2 = checked (formatetcArray.Length - 1); + int index1 = num1; + FORMATETC format1; + FORMATETC formatetc1; + while (index1 <= num2) + { + bool flag = false; + int num3 = 0; + int num4 = checked (formatetcList.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + format1 = formatetcList[index2]; + if ((int) format1.cfFormat == (int) formatetcArray[index1].cfFormat) + { + formatetc1 = formatetcList[index2]; + if (formatetc1.dwAspect == formatetcArray[index1].dwAspect) + { + flag = true; + FORMATETC formatetc2 = formatetcList[index2]; + // ISSUE: explicit reference operation + // ISSUE: variable of a reference type + FORMATETC& local = @formatetc2; + formatetc1 = formatetcList[index2]; + int num5 = (int) (formatetc1.tymed | formatetcArray[index1].tymed); + // ISSUE: explicit reference operation + (^local).tymed = (TYMED) num5; + formatetcList[index2] = formatetc2; + break; + } + } + checked { ++index2; } + } + if (!flag) + { + FORMATETC formatetc2 = formatetcArray[index1]; + formatetc2.lindex = -1; + formatetc2.ptd = new IntPtr(); + formatetcList.Add(formatetc2); + } + checked { ++index1; } + } + int num6 = 0; + int num7 = checked (this.Data.Count - 1); + int index3 = num6; + while (index3 <= num7) + { + bool flag = false; + int num3 = 0; + int num4 = checked (formatetcList.Count - 1); + int index2 = num3; + DataObject.ObjectEntry objectEntry; + while (index2 <= num4) + { + formatetc1 = formatetcList[index2]; + int cfFormat1 = (int) formatetc1.cfFormat; + format1 = this.Data[index3].Format; + int cfFormat2 = (int) format1.cfFormat; + if (cfFormat1 == cfFormat2) + { + FORMATETC format2 = formatetcList[index2]; + int dwAspect1 = (int) format2.dwAspect; + objectEntry = this.Data[index3]; + int dwAspect2 = (int) objectEntry.Format.dwAspect; + if (dwAspect1 == dwAspect2) + { + flag = true; + FORMATETC formatetc2 = formatetcList[index2]; + // ISSUE: explicit reference operation + // ISSUE: variable of a reference type + FORMATETC& local = @formatetc2; + int tymed1 = (int) formatetcList[index2].tymed; + objectEntry = this.Data[index3]; + format2 = objectEntry.Format; + int tymed2 = (int) format2.tymed; + int num5 = tymed1 | tymed2; + // ISSUE: explicit reference operation + (^local).tymed = (TYMED) num5; + formatetcList[index2] = formatetc2; + break; + } + } + checked { ++index2; } + } + if (!flag) + { + objectEntry = this.Data[index3]; + FORMATETC format2 = objectEntry.Format; + format2.lindex = -1; + format2.ptd = new IntPtr(); + formatetcList.Add(format2); + } + checked { ++index3; } + } + return (IEnumFORMATETC) new DataObject._EnumFormatEtc(formatetcList.ToArray(), direction, 0); + } + + public bool AsyncSupported + { + get + { + return this.pAsyncSupported; + } + set + { + this.pAsyncSupported = value; + } + } + + public bool IsInOperation + { + get + { + bool pfInAsyncOp; + this.InOperation(ref pfInAsyncOp); + return pfInAsyncOp; + } + } + + public bool IsCurrentClipboard + { + get + { + return DataObject.OleIsCurrentClipboard((System.Runtime.InteropServices.ComTypes.IDataObject) this) == 0; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void GetAsyncMode(ref bool pfIsOpAsync) + { + pfIsOpAsync = this.AsyncSupported; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void SetAsyncMode(bool fDoOpAsync) + { + this.AsyncSupported = fDoOpAsync; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void StartOperation(IntPtr pbcReserved) + { + bool flag = false; + object pInOperationLock = this.pInOperationLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pInOperationLock); + Monitor.Enter(pInOperationLock); + try + { + if (!this.pInOperation) + { + this.pInOperation = true; + flag = true; + } + } + finally + { + Monitor.Exit(pInOperationLock); + } + if (!flag) + return; + this.OnAsyncOperationStart(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void EndOperation(IntPtr hResult, IntPtr pbcReserved, int dwEffects) + { + bool flag = false; + object pInOperationLock = this.pInOperationLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pInOperationLock); + Monitor.Enter(pInOperationLock); + try + { + if (this.pInOperation) + { + this.pInOperation = false; + flag = true; + } + } + finally + { + Monitor.Exit(pInOperationLock); + } + if (flag) + this.OnAsyncOperationFinished(new DataObject.AsyncOperationFinishedEventArgs(hResult, dwEffects)); + if (hResult.ToInt32() == 0) + return; + Marshal.ThrowExceptionForHR(hResult.ToInt32()); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void InOperation(ref bool pfInAsyncOp) + { + object pInOperationLock = this.pInOperationLock; + ObjectFlowControl.CheckForSyncLockOnValueType(pInOperationLock); + Monitor.Enter(pInOperationLock); + try + { + pfInAsyncOp = this.pInOperation; + } + finally + { + Monitor.Exit(pInOperationLock); + } + } + + public static string FormatToString(FORMATETC format) + { + int id = (int) format.cfFormat >= 0 ? (int) format.cfFormat : checked ((int) format.cfFormat + 65536); + string str1 = DataFormats.GetFormat(id).Name + "(" + id.ToString() + ") / "; + if ((format.dwAspect & DVASPECT.DVASPECT_CONTENT) != (DVASPECT) 0) + str1 += "CONTENT "; + if ((format.dwAspect & DVASPECT.DVASPECT_DOCPRINT) != (DVASPECT) 0) + str1 += "DOCPRINT "; + if ((format.dwAspect & DVASPECT.DVASPECT_ICON) != (DVASPECT) 0) + str1 += "ICON "; + if ((format.dwAspect & DVASPECT.DVASPECT_THUMBNAIL) != (DVASPECT) 0) + str1 += "THUMBNAIL "; + string str2 = str1 + "/ " + format.lindex.ToString() + " "; + if ((format.tymed & TYMED.TYMED_ENHMF) != TYMED.TYMED_NULL) + str2 += "ENHMF "; + if ((format.tymed & TYMED.TYMED_FILE) != TYMED.TYMED_NULL) + str2 += "FILE "; + if ((format.tymed & TYMED.TYMED_GDI) != TYMED.TYMED_NULL) + str2 += "GDI "; + if ((format.tymed & TYMED.TYMED_HGLOBAL) != TYMED.TYMED_NULL) + str2 += "HGLOBAL "; + if ((format.tymed & TYMED.TYMED_ISTORAGE) != TYMED.TYMED_NULL) + str2 += "ISTORAGE "; + if ((format.tymed & TYMED.TYMED_ISTREAM) != TYMED.TYMED_NULL) + str2 += "ISTREAM "; + if ((format.tymed & TYMED.TYMED_MFPICT) != TYMED.TYMED_NULL) + str2 += "MFPICT "; + if (format.tymed == TYMED.TYMED_NULL) + str2 += "NULL "; + return str2; + } + + private static string FormatToString(STGMEDIUM medium) + { + if (medium.pUnkForRelease == null) + return "medium(" + medium.tymed.ToString() + "[" + medium.unionmember.ToString() + "] null"; + return "medium(" + medium.tymed.ToString() + "[" + medium.unionmember.ToString() + "] " + medium.pUnkForRelease.GetType().ToString(); + } + + public static short MakecfFormat(string format) + { + DataFormats.Format format1 = DataFormats.GetFormat(format); + if (format1.Id > (int) short.MaxValue) + return checked ((short) (format1.Id - 65536)); + return checked ((short) format1.Id); + } + + public byte[] GetHGlobal(string format) + { + FORMATETC format1; + format1.lindex = -1; + format1.dwAspect = DVASPECT.DVASPECT_CONTENT; + format1.tymed = TYMED.TYMED_HGLOBAL; + format1.cfFormat = DataObject.MakecfFormat(format); + int index = this.IndexOf(format1); + if (index < 0) + return (byte[]) null; + return this.Data[index].hglobal; + } + + public DragDropEffects GetPreferredDropEffect() + { + byte[] hglobal = this.GetHGlobal(ShellClipboardFormats.PreferredDropEffect); + if (hglobal == null) + return DragDropEffects.None; + return (DragDropEffects) BitConverter.ToInt32(hglobal, 0); + } + + public DragDropEffects GetPerformedDropEffect() + { + byte[] hglobal = this.GetHGlobal(ShellClipboardFormats.PerformedDropEffect); + if (hglobal == null) + return DragDropEffects.None; + return (DragDropEffects) BitConverter.ToInt32(hglobal, 0); + } + + public DragDropEffects GetLogicalPerformedDropEffect() + { + byte[] hglobal = this.GetHGlobal(ShellClipboardFormats.LogicalPerformedDropEffect); + if (hglobal == null) + return DragDropEffects.None; + return (DragDropEffects) BitConverter.ToInt32(hglobal, 0); + } + + public DragDropEffects GetPasteSucceeded() + { + byte[] hglobal = this.GetHGlobal(ShellClipboardFormats.PasteSucceeded); + if (hglobal == null) + return DragDropEffects.None; + return (DragDropEffects) BitConverter.ToInt32(hglobal, 0); + } + + public Guid GetTargetCLSID() + { + byte[] hglobal = this.GetHGlobal(ShellClipboardFormats.TargetCLSID); + if (hglobal == null) + { + Guid guid; + return guid; + } + return new Guid(hglobal); + } + + public DropDesctiption GetDropDesctiption() + { + byte[] hglobal = this.GetHGlobal(ShellClipboardFormats.DropDescription); + if (hglobal == null) + { + DropDesctiption dropDesctiption; + return dropDesctiption; + } + return new DropDesctiption() + { + type = BitConverter.ToInt32(hglobal, 0), + szMessage = Encoding.Unicode.GetString(hglobal, 4, 260), + szInsert = Encoding.Unicode.GetString(hglobal, 264, 260) + }; + } + + private void SetObjectEntry(DataObject.ObjectEntry e) + { + int i = this.IndexOf(e.Format); + if (i >= 0) + this.RemoveAt(i); + this.Data.Add(e); + } + + private void SetHGlobal(string format, byte[] buf) + { + FORMATETC f; + f.cfFormat = DataObject.MakecfFormat(format); + f.dwAspect = DVASPECT.DVASPECT_CONTENT; + f.lindex = -1; + f.tymed = TYMED.TYMED_HGLOBAL; + this.SetObjectEntry(new DataObject.ObjectEntry(f) + { + hglobal = buf + }); + } + + public void SetPreferredDropEffect(DragDropEffects effect) + { + byte[] bytes = BitConverter.GetBytes((int) effect); + this.SetHGlobal(ShellClipboardFormats.PreferredDropEffect, bytes); + } + + public void SetInDragLoop(bool value) + { + byte[] bytes = BitConverter.GetBytes(!value ? 0 : 1); + this.SetHGlobal(ShellClipboardFormats.InShellDragLoop, bytes); + } + + public void SetUntrustedDragDrop() + { + byte[] bytes = BitConverter.GetBytes(6155); + this.SetHGlobal(ShellClipboardFormats.UntrustedDragDrop, bytes); + } + + public void SetText(string str) + { + str += "\0"; + byte[] bytes1 = Encoding.Default.GetBytes(str); + this.SetHGlobal(DataFormats.Text, bytes1); + byte[] bytes2 = Encoding.Unicode.GetBytes(str); + this.SetHGlobal(DataFormats.UnicodeText, bytes2); + } + + public void SetTexts(string[] strs) + { + this.SetText(string.Join("\r\n", strs)); + } + + public void SetUri(Uri uri) + { + string s = uri.AbsoluteUri + "\0"; + byte[] bytes1 = Encoding.Unicode.GetBytes(s); + this.SetHGlobal(ShellClipboardFormats.UniformResourceLocatorW, bytes1); + byte[] bytes2 = Encoding.Default.GetBytes(s); + this.SetHGlobal(ShellClipboardFormats.UniformResourceLocator, bytes2); + } + + public void SetFileDropList(StringCollection paths) + { + string[] strArray = new string[checked (paths.Count - 1 + 1)]; + paths.CopyTo(strArray, 0); + this.SetFileDropList(strArray); + } + + public void SetFileDropList(string[] paths) + { + DropFiles dropFiles; + dropFiles.pFiles = Marshal.SizeOf((object) dropFiles); + dropFiles.pt = new POINTL(); + dropFiles.fNC = false; + dropFiles.fWide = true; + byte[] bytes = Encoding.Unicode.GetBytes(string.Join("\0", paths) + "\0\0"); + int num1 = Marshal.SizeOf((object) dropFiles); + byte[] numArray = new byte[checked (Marshal.SizeOf((object) dropFiles) + bytes.Length - 1 + 1)]; + IntPtr num2 = Marshal.AllocHGlobal(Marshal.SizeOf((object) dropFiles)); + try + { + Marshal.StructureToPtr((object) dropFiles, num2, false); + Marshal.Copy(num2, numArray, 0, num1); + bytes.CopyTo((Array) numArray, num1); + } + finally + { + Marshal.FreeHGlobal(num2); + } + this.SetHGlobal(DataFormats.FileDrop, numArray); + } + + public void SetManagedObject(object data) + { + BinaryFormatter binaryFormatter = new BinaryFormatter(); + byte[] array; + using (MemoryStream memoryStream = new MemoryStream()) + { + memoryStream.Write(DataObject.serializedObjectID, 0, DataObject.serializedObjectID.Length); + binaryFormatter.Serialize((Stream) memoryStream, RuntimeHelpers.GetObjectValue(data)); + array = memoryStream.ToArray(); + } + this.SetHGlobal(data.GetType().FullName, array); + } + + public void SetVirtualFiles(VirtualFileInfo[] finfos, bool showprogress) + { + int num1 = 0; + int num2 = checked (finfos.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (finfos[index1].IStreamCreator != null) + { + FORMATETC f; + f.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.FileContents); + f.dwAspect = DVASPECT.DVASPECT_CONTENT; + f.lindex = index1; + f.tymed = TYMED.TYMED_ISTREAM; + this.SetObjectEntry(new DataObject.ObjectEntry(f) + { + istreamcreator = finfos[index1].IStreamCreator + }); + } + checked { ++index1; } + } + int num3 = Marshal.SizeOf(typeof (FileDescriptor)); + byte[] numArray = new byte[checked (num3 * finfos.Length + 4 - 1 + 1)]; + BitConverter.GetBytes(finfos.Length).CopyTo((Array) numArray, 0); + IntPtr num4 = Marshal.AllocHGlobal(num3); + try + { + int num5 = 0; + int num6 = checked (finfos.Length - 1); + int index2 = num5; + while (index2 <= num6) + { + FileDescriptor fileDescriptor = new FileDescriptor(); + fileDescriptor.cFileName = finfos[index2].FileName; + fileDescriptor.dwFlags = finfos[index2].Flags & ~(FDFlags.FD_CLSID | FDFlags.FD_SIZEPOINT | FDFlags.FD_PROGRESSUI | FDFlags.FD_LINKUI); + if ((finfos[index2].Flags & FDFlags.FD_ATTRIBUTES) != (FDFlags) 0) + fileDescriptor.dwFileAttributes = finfos[index2].FileAttributes; + if ((finfos[index2].Flags & FDFlags.FD_CREATETIME) != (FDFlags) 0) + fileDescriptor.ftCreationTime = DataObject.ToFileTime(finfos[index2].CreationTime); + if ((finfos[index2].Flags & FDFlags.FD_ACCESSTIME) != (FDFlags) 0) + fileDescriptor.ftLastAccessTime = DataObject.ToFileTime(finfos[index2].LastAccessTime); + if ((finfos[index2].Flags & FDFlags.FD_WRITESTIME) != (FDFlags) 0) + fileDescriptor.ftLastWriteTime = DataObject.ToFileTime(finfos[index2].LastWriteTime); + if ((finfos[index2].Flags & FDFlags.FD_FILESIZE) != (FDFlags) 0) + fileDescriptor.FileSize = finfos[index2].FileSize; + if (showprogress) + fileDescriptor.dwFlags = fileDescriptor.dwFlags | FDFlags.FD_PROGRESSUI; + Marshal.StructureToPtr((object) fileDescriptor, num4, false); + Marshal.Copy(num4, numArray, checked (index2 * num3 + 4), num3); + checked { ++index2; } + } + } + finally + { + Marshal.FreeHGlobal(num4); + } + this.SetHGlobal(ShellClipboardFormats.FileGroupDescriptorW, numArray); + } + + public void RemoveAt(int i) + { + IDisposable receivedistream = this.Data[i].receivedistream as IDisposable; + if (receivedistream != null) + receivedistream.Dispose(); + if (this.Data[i].istreamcreator != null) + this.Data[i].istreamcreator.Dispose(); + this.Data.RemoveAt(i); + } + + public bool Remove(FORMATETC format) + { + int i = this.IndexOf(format); + if (i < 0) + return false; + this.RemoveAt(i); + return true; + } + + public void RemoveTexts() + { + FORMATETC format; + format.lindex = -1; + format.dwAspect = DVASPECT.DVASPECT_CONTENT; + format.tymed = TYMED.TYMED_HGLOBAL; + format.cfFormat = DataObject.MakecfFormat(DataFormats.UnicodeText); + this.Remove(format); + } + + public void RemoveUris() + { + FORMATETC format; + format.lindex = -1; + format.dwAspect = DVASPECT.DVASPECT_CONTENT; + format.tymed = TYMED.TYMED_HGLOBAL; + format.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.UniformResourceLocatorW); + this.Remove(format); + } + + public void RemoveVirtualFiles() + { + FORMATETC format; + format.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.FileContents); + format.dwAspect = DVASPECT.DVASPECT_CONTENT; + format.tymed = TYMED.TYMED_ISTREAM; + format.lindex = 0; + while (this.Remove(format)) + format.lindex = checked (format.lindex + 1); + format.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.FileGroupDescriptorW); + format.dwAspect = DVASPECT.DVASPECT_CONTENT; + format.tymed = TYMED.TYMED_HGLOBAL; + format.lindex = -1; + this.Remove(format); + format.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.FileGroupDescriptor); + format.dwAspect = DVASPECT.DVASPECT_CONTENT; + format.tymed = TYMED.TYMED_HGLOBAL; + format.lindex = -1; + this.Remove(format); + } + + public void RemoveAll() + { + while (this.Data.Count > 0) + this.RemoveAt(checked (this.Data.Count - 1)); + } + + internal static long ToFileTime(DateTime time) + { + if (DateTime.Compare(time, DataObject.win32timeorigin) < 0) + return 0; + return time.ToFileTime(); + } + + public event EventHandler AsyncOperationStart; + + public event EventHandler AsyncOperationFinished; + + public event EventHandler DataRequested; + + public event EventHandler DataStored; + + public event EventHandler DataQueried; + + protected virtual void OnAsyncOperationStart() + { + EventHandler operationStartEvent = this.AsyncOperationStartEvent; + if (operationStartEvent == null) + return; + operationStartEvent((object) this, EventArgs.Empty); + } + + protected virtual void OnAsyncOperationFinished(DataObject.AsyncOperationFinishedEventArgs e) + { + EventHandler operationFinishedEvent = this.AsyncOperationFinishedEvent; + if (operationFinishedEvent == null) + return; + operationFinishedEvent((object) this, e); + } + + protected virtual void OnDataRequested(DataObject.DataEventArgs e) + { + EventHandler dataRequestedEvent = this.DataRequestedEvent; + if (dataRequestedEvent == null) + return; + dataRequestedEvent((object) this, e); + } + + protected virtual void OnDataStored(DataObject.DataEventArgs e) + { + EventHandler dataStoredEvent = this.DataStoredEvent; + if (dataStoredEvent == null) + return; + dataStoredEvent((object) this, e); + } + + protected virtual void OnDataQueried(DataObject.DataEventArgs e) + { + EventHandler dataQueriedEvent = this.DataQueriedEvent; + if (dataQueriedEvent == null) + return; + dataQueriedEvent((object) this, e); + } + + public class AsyncOperationFinishedEventArgs : EventArgs + { + private IntPtr pResult; + private DragDropEffects pEffect; + + public AsyncOperationFinishedEventArgs(IntPtr result, int effect) + { + this.pResult = result; + this.pEffect = (DragDropEffects) effect; + } + + public IntPtr Result + { + get + { + return this.pResult; + } + } + + public DragDropEffects Effect + { + get + { + return this.pEffect; + } + } + } + + public enum QueryGetDataResultType + { + None, + Exists, + FromData, + } + + public class DataEventArgs : EventArgs + { + private FORMATETC pFormat; + private DataObject.QueryGetDataResultType pResponse; + + public DataEventArgs(FORMATETC format) + { + this.pFormat = format; + this.pResponse = DataObject.QueryGetDataResultType.FromData; + } + + public FORMATETC Format + { + get + { + return this.pFormat; + } + } + + public DataObject.QueryGetDataResultType QueryResult + { + get + { + return this.pResponse; + } + set + { + this.pResponse = value; + } + } + } + + [DebuggerDisplay("{ToString()}")] + private struct ObjectEntry + { + public FORMATETC pformatetc; + public byte[] hglobal; + public IStreamCreator istreamcreator; + public System.Runtime.InteropServices.ComTypes.IStream receivedistream; + + public ObjectEntry(FORMATETC f) + { + this = new DataObject.ObjectEntry(); + this.pformatetc = f; + } + + public FORMATETC Format + { + get + { + return this.pformatetc; + } + } + + public override string ToString() + { + return DataObject.FormatToString(this.pformatetc); + } + } + + public class _EnumFormatEtc : IEnumFORMATETC + { + private FORMATETC[] pFormats; + private DATADIR pdirection; + private int pindex; + + internal _EnumFormatEtc(FORMATETC[] list, DATADIR direction, int index) + { + this.pFormats = list; + this.pdirection = direction; + this.pindex = index; + } + + public void Clone(ref IEnumFORMATETC newEnum) + { + newEnum = (IEnumFORMATETC) new DataObject._EnumFormatEtc(this.pFormats, this.pdirection, this.pindex); + } + + public int Reset() + { + this.pindex = 0; + int num; + return num; + } + + public int Next(int celt, FORMATETC[] rgelt, int[] pceltFetched) + { + int num1 = checked (this.pindex + celt) <= this.pFormats.Length ? celt : checked (this.pFormats.Length - this.pindex); + if (num1 == 0) + return 1; + int num2 = 0; + int num3 = checked (num1 - 1); + int index = num2; + while (index <= num3) + { + FORMATETC pFormat = this.pFormats[checked (this.pindex + index)]; + rgelt[index] = pFormat; + checked { ++index; } + } + this.pindex = checked (this.pindex + num1); + if (pceltFetched != null) + pceltFetched[0] = num1; + return num1 != celt ? 1 : 0; + } + + public int Skip(int celt) + { + if (checked (this.pindex + celt) >= this.pFormats.Length) + return 1; + this.pindex = checked (this.pindex + celt); + return 0; + } + } + } +} diff --git a/Rei.Com/DataObjectHelper.cs b/Rei.Com/DataObjectHelper.cs new file mode 100644 index 0000000..e7f459a --- /dev/null +++ b/Rei.Com/DataObjectHelper.cs @@ -0,0 +1,283 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.DataObjectHelper +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Windows.Forms; + +namespace Rei.Com +{ + public class DataObjectHelper + { + public static VirtualFileInfo[] GetVirtualFileInfo(System.Windows.Forms.IDataObject dobj) + { + IntPtr zero = IntPtr.Zero; + List virtualFileInfoList = new List(); + using (MemoryStream data = (MemoryStream) dobj.GetData("FileGroupDescriptorW")) + { + if (data == null) + return new VirtualFileInfo[0]; + byte[] numArray1 = new byte[checked ((int) (data.Length - 1L) + 1)]; + data.Read(numArray1, 0, numArray1.Length); + int int32 = BitConverter.ToInt32(numArray1, 0); + IntPtr num1 = Marshal.AllocHGlobal(numArray1.Length); + try + { + Marshal.Copy(numArray1, 0, num1, numArray1.Length); + IntPtr ptr = new IntPtr(checked (num1.ToInt64() + (long) Marshal.SizeOf((object) int32))); + int num2 = 0; + int num3 = checked (int32 - 1); + int num4 = num2; + while (num4 <= num3) + { + object structure = Marshal.PtrToStructure(ptr, typeof (FileDescriptor)); + FileDescriptor fileDescriptor1; + FileDescriptor fileDescriptor2 = structure != null ? (FileDescriptor) structure : fileDescriptor1; + VirtualFileInfo virtualFileInfo = new VirtualFileInfo(); + virtualFileInfo.FileName = fileDescriptor2.cFileName; + virtualFileInfo.Flags = fileDescriptor2.dwFlags; + if ((fileDescriptor2.dwFlags & FDFlags.FD_CLSID) == (FDFlags) 0) + ; + if ((fileDescriptor2.dwFlags & FDFlags.FD_SIZEPOINT) == (FDFlags) 0) + ; + if ((fileDescriptor2.dwFlags & FDFlags.FD_ATTRIBUTES) != (FDFlags) 0) + virtualFileInfo.FileAttributes = fileDescriptor2.dwFileAttributes; + if ((fileDescriptor2.dwFlags & FDFlags.FD_CREATETIME) != (FDFlags) 0) + virtualFileInfo.CreationTime = DateTime.FromFileTime(fileDescriptor2.ftCreationTime); + if ((fileDescriptor2.dwFlags & FDFlags.FD_ACCESSTIME) != (FDFlags) 0) + virtualFileInfo.LastAccessTime = DateTime.FromFileTime(fileDescriptor2.ftLastAccessTime); + if ((fileDescriptor2.dwFlags & FDFlags.FD_WRITESTIME) != (FDFlags) 0) + virtualFileInfo.LastWriteTime = DateTime.FromFileTime(fileDescriptor2.ftLastWriteTime); + if ((fileDescriptor2.dwFlags & FDFlags.FD_FILESIZE) != (FDFlags) 0) + virtualFileInfo.FileSize = fileDescriptor2.FileSize; + FORMATETC format = new FORMATETC(); + format.cfFormat = BitConverter.ToInt16(BitConverter.GetBytes(DataFormats.GetFormat("FileContents").Id), 0); + format.dwAspect = DVASPECT.DVASPECT_CONTENT; + format.lindex = num4; + format.ptd = IntPtr.Zero; + format.tymed = TYMED.TYMED_HGLOBAL | TYMED.TYMED_ISTREAM; + STGMEDIUM medium = new STGMEDIUM(); + try + { + ((System.Runtime.InteropServices.ComTypes.IDataObject) dobj).GetData(ref format, out medium); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + virtualFileInfo.FileAttributes = virtualFileInfo.FileAttributes | FileAttributes.System; + ProjectData.ClearProjectError(); + } + if (medium.tymed == TYMED.TYMED_HGLOBAL) + { + IntPtr unionmember = medium.unionmember; + if (unionmember == IntPtr.Zero) + return (VirtualFileInfo[]) null; + int length = DataObject.GlobalSize(unionmember); + byte[] numArray2 = new byte[checked (length - 1 + 1)]; + Marshal.Copy(unionmember, numArray2, 0, length); + virtualFileInfo.ManageStream = (Stream) new MemoryStream(numArray2); + } + else + { + if (medium.tymed == TYMED.TYMED_ISTORAGE) + throw new Exception("doesn't support IStorage"); + if (medium.tymed == TYMED.TYMED_ISTREAM) + { + System.Runtime.InteropServices.ComTypes.IStream objectForIunknown = (System.Runtime.InteropServices.ComTypes.IStream) Marshal.GetObjectForIUnknown(medium.unionmember); + Marshal.Release(medium.unionmember); + virtualFileInfo.ManageStream = (Stream) new ComStreamAdapterStream(objectForIunknown); + } + } + if (virtualFileInfo.ManageStream == null) + virtualFileInfo.ManageStream = (Stream) new MemoryStream(); + virtualFileInfoList.Add(virtualFileInfo); + ptr = new IntPtr(checked (ptr.ToInt64() + (long) Marshal.SizeOf((object) fileDescriptor2))); + checked { ++num4; } + } + } + finally + { + Marshal.FreeHGlobal(num1); + } + } + return virtualFileInfoList.ToArray(); + } + + public static DragDropEffects GetPreferredDragEffect(System.Windows.Forms.IDataObject dataobject) + { + DragDropEffects dragDropEffects = DragDropEffects.None; + if (dataobject.GetDataPresent(ShellClipboardFormats.PreferredDropEffect)) + { + MemoryStream data = dataobject.GetData(ShellClipboardFormats.PreferredDropEffect) as MemoryStream; + try + { + if (data != null) + { + byte[] buffer = new byte[4]; + data.Read(buffer, 0, 4); + data.Dispose(); + dragDropEffects = (DragDropEffects) BitConverter.ToInt32(buffer, 0); + } + } + finally + { + if (data != null) + data.Dispose(); + } + } + return dragDropEffects; + } + + public static Uri GetUniformResourceLocator(System.Windows.Forms.IDataObject dataobject) + { + Uri result = (Uri) null; + string uriString; + if (dataobject.GetDataPresent(ShellClipboardFormats.UniformResourceLocatorW)) + { + MemoryStream data = dataobject.GetData(ShellClipboardFormats.UniformResourceLocatorW) as MemoryStream; + if (data != null) + { + using (StreamReader streamReader = new StreamReader((Stream) data, Encoding.Unicode)) + uriString = streamReader.ReadToEnd(); + int length = uriString.IndexOf(char.MinValue); + if (length >= 0) + uriString = uriString.Substring(0, length); + if (Uri.TryCreate(uriString, UriKind.Absolute, out result)) + return result; + } + } + if (dataobject.GetDataPresent(ShellClipboardFormats.UniformResourceLocator)) + { + MemoryStream data = dataobject.GetData(ShellClipboardFormats.UniformResourceLocator) as MemoryStream; + if (data != null) + { + using (StreamReader streamReader = new StreamReader((Stream) data, Encoding.Default)) + uriString = streamReader.ReadToEnd(); + int length = uriString.IndexOf(char.MinValue); + if (length >= 0) + uriString = uriString.Substring(0, length); + if (Uri.TryCreate(uriString, UriKind.Absolute, out result)) + return result; + } + } + return (Uri) null; + } + + public static void SetPerformedDragEffect(System.Windows.Forms.IDataObject dataobject, DragDropEffects effect) + { + System.Runtime.InteropServices.ComTypes.IDataObject dataObject = dataobject as System.Runtime.InteropServices.ComTypes.IDataObject; + if (dataObject == null) + return; + FORMATETC formatIn; + formatIn.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.PerformedDropEffect); + formatIn.dwAspect = DVASPECT.DVASPECT_CONTENT; + formatIn.lindex = -1; + formatIn.ptd = new IntPtr(); + formatIn.tymed = TYMED.TYMED_HGLOBAL; + STGMEDIUM medium; + medium.tymed = TYMED.TYMED_HGLOBAL; + medium.pUnkForRelease = (object) null; + medium.unionmember = Marshal.AllocHGlobal(4); + Marshal.WriteInt32(medium.unionmember, 0, (int) effect); + dataObject.SetData(ref formatIn, ref medium, true); + } + + public static void SetLogicalPerformedDragEffect(System.Windows.Forms.IDataObject dataobject, DragDropEffects effect) + { + System.Runtime.InteropServices.ComTypes.IDataObject dataObject = dataobject as System.Runtime.InteropServices.ComTypes.IDataObject; + if (dataObject == null) + return; + FORMATETC formatIn; + formatIn.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.LogicalPerformedDropEffect); + formatIn.dwAspect = DVASPECT.DVASPECT_CONTENT; + formatIn.lindex = -1; + formatIn.ptd = new IntPtr(); + formatIn.tymed = TYMED.TYMED_HGLOBAL; + STGMEDIUM medium; + medium.tymed = TYMED.TYMED_HGLOBAL; + medium.pUnkForRelease = (object) null; + medium.unionmember = Marshal.AllocHGlobal(4); + Marshal.WriteInt32(medium.unionmember, 0, (int) effect); + dataObject.SetData(ref formatIn, ref medium, true); + } + + public static void SetPasteSucceeded(System.Windows.Forms.IDataObject dataobject, DragDropEffects effect) + { + System.Runtime.InteropServices.ComTypes.IDataObject dataObject = dataobject as System.Runtime.InteropServices.ComTypes.IDataObject; + if (dataObject == null) + return; + FORMATETC formatIn; + formatIn.cfFormat = DataObject.MakecfFormat(ShellClipboardFormats.PasteSucceeded); + formatIn.dwAspect = DVASPECT.DVASPECT_CONTENT; + formatIn.lindex = -1; + formatIn.ptd = new IntPtr(); + formatIn.tymed = TYMED.TYMED_HGLOBAL; + STGMEDIUM medium; + medium.tymed = TYMED.TYMED_HGLOBAL; + medium.pUnkForRelease = (object) null; + medium.unionmember = Marshal.AllocHGlobal(4); + Marshal.WriteInt32(medium.unionmember, 0, (int) effect); + dataObject.SetData(ref formatIn, ref medium, true); + } + + public static bool CanAsync(System.Windows.Forms.IDataObject dobj) + { + object objectValue1 = RuntimeHelpers.GetObjectValue(typeof (System.Windows.Forms.DataObject).GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue((object) dobj)); + IAsyncOperation objectValue2 = RuntimeHelpers.GetObjectValue(objectValue1.GetType().GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(RuntimeHelpers.GetObjectValue(objectValue1))) as IAsyncOperation; + if (objectValue2 == null) + return false; + bool pfIsOpAsync; + objectValue2.GetAsyncMode(out pfIsOpAsync); + return pfIsOpAsync; + } + + public static void SetAsyncMode(System.Windows.Forms.IDataObject dobj, bool r) + { + object objectValue1 = RuntimeHelpers.GetObjectValue(typeof (System.Windows.Forms.DataObject).GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue((object) dobj)); + IAsyncOperation objectValue2 = RuntimeHelpers.GetObjectValue(objectValue1.GetType().GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(RuntimeHelpers.GetObjectValue(objectValue1))) as IAsyncOperation; + if (objectValue2 == null) + return; + objectValue2.SetAsyncMode(r); + } + + public static bool StartAsyncOperation(System.Windows.Forms.IDataObject dobj) + { + object objectValue1 = RuntimeHelpers.GetObjectValue(typeof (System.Windows.Forms.DataObject).GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue((object) dobj)); + IAsyncOperation objectValue2 = RuntimeHelpers.GetObjectValue(objectValue1.GetType().GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(RuntimeHelpers.GetObjectValue(objectValue1))) as IAsyncOperation; + if (objectValue2 != null) + { + bool pfIsOpAsync = false; + objectValue2.GetAsyncMode(out pfIsOpAsync); + if (pfIsOpAsync) + { + objectValue2.StartOperation(IntPtr.Zero); + return true; + } + } + return false; + } + + public static void EndAsyncOperation(System.Windows.Forms.IDataObject dobj, DragDropEffects dwEffect) + { + object objectValue1 = RuntimeHelpers.GetObjectValue(typeof (System.Windows.Forms.DataObject).GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue((object) dobj)); + IAsyncOperation objectValue2 = RuntimeHelpers.GetObjectValue(objectValue1.GetType().GetField("innerData", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(RuntimeHelpers.GetObjectValue(objectValue1))) as IAsyncOperation; + if (objectValue2 == null) + return; + bool pfIsOpAsync = false; + objectValue2.GetAsyncMode(out pfIsOpAsync); + if (!pfIsOpAsync) + return; + objectValue2.EndOperation(IntPtr.Zero, IntPtr.Zero, (int) dwEffect); + } + } +} diff --git a/Rei.Com/DropDesctiption.cs b/Rei.Com/DropDesctiption.cs new file mode 100644 index 0000000..48482d4 --- /dev/null +++ b/Rei.Com/DropDesctiption.cs @@ -0,0 +1,19 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.DropDesctiption +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System.Runtime.InteropServices; + +namespace Rei.Com +{ + public struct DropDesctiption + { + public int type; + [MarshalAs(UnmanagedType.LPWStr)] + public string szMessage; + [MarshalAs(UnmanagedType.LPWStr)] + public string szInsert; + } +} diff --git a/Rei.Com/DropFiles.cs b/Rei.Com/DropFiles.cs new file mode 100644 index 0000000..8c44317 --- /dev/null +++ b/Rei.Com/DropFiles.cs @@ -0,0 +1,16 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.DropFiles +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +namespace Rei.Com +{ + public struct DropFiles + { + public int pFiles; + public POINTL pt; + public bool fNC; + public bool fWide; + } +} diff --git a/Rei.Com/FDFlags.cs b/Rei.Com/FDFlags.cs new file mode 100644 index 0000000..250102d --- /dev/null +++ b/Rei.Com/FDFlags.cs @@ -0,0 +1,24 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.FDFlags +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System; + +namespace Rei.Com +{ + [Flags] + public enum FDFlags + { + FD_CLSID = 1, + FD_SIZEPOINT = 2, + FD_ATTRIBUTES = 4, + FD_CREATETIME = 8, + FD_ACCESSTIME = 16, + FD_WRITESTIME = 32, + FD_FILESIZE = 64, + FD_PROGRESSUI = 16384, + FD_LINKUI = 32768, + } +} diff --git a/Rei.Com/FileDescriptor.cs b/Rei.Com/FileDescriptor.cs new file mode 100644 index 0000000..bb77d88 --- /dev/null +++ b/Rei.Com/FileDescriptor.cs @@ -0,0 +1,42 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.FileDescriptor +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace Rei.Com +{ + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct FileDescriptor + { + public FDFlags dwFlags; + public Guid clsid; + public SIZEL sizel; + public POINTL pointl; + public FileAttributes dwFileAttributes; + public long ftCreationTime; + public long ftLastAccessTime; + public long ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string cFileName; + + public ulong FileSize + { + get + { + return checked (4294967296UL * (ulong) this.nFileSizeHigh + (ulong) this.nFileSizeLow); + } + set + { + this.nFileSizeHigh = checked ((uint) (value >> 32)); + this.nFileSizeLow = checked ((uint) (unchecked ((long) value) & (long) uint.MaxValue)); + } + } + } +} diff --git a/Rei.Com/FileGroupDescriptor.cs b/Rei.Com/FileGroupDescriptor.cs new file mode 100644 index 0000000..2f0bdf3 --- /dev/null +++ b/Rei.Com/FileGroupDescriptor.cs @@ -0,0 +1,17 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.FileGroupDescriptor +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System.Runtime.InteropServices; + +namespace Rei.Com +{ + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct FileGroupDescriptor + { + public uint cItems; + public FileDescriptor[] fgd; + } +} diff --git a/Rei.Com/IAsyncOperation.cs b/Rei.Com/IAsyncOperation.cs new file mode 100644 index 0000000..540122a --- /dev/null +++ b/Rei.Com/IAsyncOperation.cs @@ -0,0 +1,27 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.IAsyncOperation +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System; +using System.Runtime.InteropServices; + +namespace Rei.Com +{ + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("3D8B0590-F691-11D2-8EA9-006097DF5BD4")] + [ComImport] + public interface IAsyncOperation + { + void SetAsyncMode(bool fDoOpAsync); + + void GetAsyncMode(out bool pfIsOpAsync); + + void StartOperation(IntPtr pbcReserved); + + void InOperation(out bool pfInAsyncOp); + + void EndOperation(IntPtr hResult, IntPtr pbcReserved, int dwEffects); + } +} diff --git a/Rei.Com/IStreamCreator.cs b/Rei.Com/IStreamCreator.cs new file mode 100644 index 0000000..0a15ca0 --- /dev/null +++ b/Rei.Com/IStreamCreator.cs @@ -0,0 +1,17 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.IStreamCreator +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System.Runtime.InteropServices.ComTypes; + +namespace Rei.Com +{ + public interface IStreamCreator + { + IStream Create(); + + void Dispose(); + } +} diff --git a/Rei.Com/My/MyApplication.cs b/Rei.Com/My/MyApplication.cs new file mode 100644 index 0000000..df28146 --- /dev/null +++ b/Rei.Com/My/MyApplication.cs @@ -0,0 +1,18 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.My.MyApplication +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using Microsoft.VisualBasic.ApplicationServices; +using System.CodeDom.Compiler; +using System.ComponentModel; + +namespace Rei.Com.My +{ + [EditorBrowsable(EditorBrowsableState.Never)] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal class MyApplication : ApplicationBase + { + } +} diff --git a/Rei.Com/My/MyComputer.cs b/Rei.Com/My/MyComputer.cs new file mode 100644 index 0000000..77c8468 --- /dev/null +++ b/Rei.Com/My/MyComputer.cs @@ -0,0 +1,24 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.My.MyComputer +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using Microsoft.VisualBasic.Devices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; + +namespace Rei.Com.My +{ + [GeneratedCode("MyTemplate", "8.0.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + internal class MyComputer : Computer + { + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public MyComputer() + { + } + } +} diff --git a/Rei.Com/My/MyProject.cs b/Rei.Com/My/MyProject.cs new file mode 100644 index 0000000..ac5f7e4 --- /dev/null +++ b/Rei.Com/My/MyProject.cs @@ -0,0 +1,148 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.My.MyProject +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.ApplicationServices; +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.VisualBasic.MyServices.Internal; +using System; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Rei.Com.My +{ + [HideModuleName] + [StandardModule] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal sealed class MyProject + { + private static readonly MyProject.ThreadSafeObjectProvider m_ComputerObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_AppObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_UserObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_MyWebServicesObjectProvider = new MyProject.ThreadSafeObjectProvider(); + + [HelpKeyword("My.Computer")] + internal static MyComputer Computer + { + [DebuggerHidden] get + { + return MyProject.m_ComputerObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.Application")] + internal static MyApplication Application + { + [DebuggerHidden] get + { + return MyProject.m_AppObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.User")] + internal static User User + { + [DebuggerHidden] get + { + return MyProject.m_UserObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.WebServices")] + internal static MyProject.MyWebServices WebServices + { + [DebuggerHidden] get + { + return MyProject.m_MyWebServicesObjectProvider.GetInstance; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [MyGroupCollection("System.Web.Services.Protocols.SoapHttpClientProtocol", "Create__Instance__", "Dispose__Instance__", "")] + internal sealed class MyWebServices + { + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public override bool Equals(object o) + { + return base.Equals(RuntimeHelpers.GetObjectValue(o)); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public override int GetHashCode() + { + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + internal new Type GetType() + { + return typeof (MyProject.MyWebServices); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override string ToString() + { + return base.ToString(); + } + + [DebuggerHidden] + private static T Create__Instance__(T instance) where T : new() + { + if ((object) instance == null) + return Activator.CreateInstance(); + return instance; + } + + [DebuggerHidden] + private void Dispose__Instance__(ref T instance) + { + instance = default (T); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public MyWebServices() + { + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [ComVisible(false)] + internal sealed class ThreadSafeObjectProvider where T : new() + { + private readonly ContextValue m_Context; + + internal T GetInstance + { + [DebuggerHidden] get + { + T instance = this.m_Context.Value; + if ((object) instance == null) + { + instance = Activator.CreateInstance(); + this.m_Context.Value = instance; + } + return instance; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public ThreadSafeObjectProvider() + { + this.m_Context = new ContextValue(); + } + } + } +} diff --git a/Rei.Com/My/MySettings.cs b/Rei.Com/My/MySettings.cs new file mode 100644 index 0000000..2c89fb3 --- /dev/null +++ b/Rei.Com/My/MySettings.cs @@ -0,0 +1,29 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.My.MySettings +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Configuration; +using System.Runtime.CompilerServices; + +namespace Rei.Com.My +{ + [EditorBrowsable(EditorBrowsableState.Advanced)] + [CompilerGenerated] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed class MySettings : ApplicationSettingsBase + { + private static MySettings defaultInstance = (MySettings) SettingsBase.Synchronized((SettingsBase) new MySettings()); + + public static MySettings Default + { + get + { + return MySettings.defaultInstance; + } + } + } +} diff --git a/Rei.Com/My/MySettingsProperty.cs b/Rei.Com/My/MySettingsProperty.cs new file mode 100644 index 0000000..3092c24 --- /dev/null +++ b/Rei.Com/My/MySettingsProperty.cs @@ -0,0 +1,30 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.My.MySettingsProperty +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace Rei.Com.My +{ + [StandardModule] + [HideModuleName] + [CompilerGenerated] + [DebuggerNonUserCode] + internal sealed class MySettingsProperty + { + [HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} diff --git a/Rei.Com/My/Resources/Resources.cs b/Rei.Com/My/Resources/Resources.cs new file mode 100644 index 0000000..902b176 --- /dev/null +++ b/Rei.Com/My/Resources/Resources.cs @@ -0,0 +1,52 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.My.Resources.Resources +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace Rei.Com.My.Resources +{ + [CompilerGenerated] + [HideModuleName] + [DebuggerNonUserCode] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [StandardModule] + internal sealed class Resources + { + private static ResourceManager resourceMan; + private static CultureInfo resourceCulture; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals((object) Rei.Com.My.Resources.Resources.resourceMan, (object) null)) + Rei.Com.My.Resources.Resources.resourceMan = new ResourceManager("Rei.Com.Resources", typeof (Rei.Com.My.Resources.Resources).Assembly); + return Rei.Com.My.Resources.Resources.resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get + { + return Rei.Com.My.Resources.Resources.resourceCulture; + } + set + { + Rei.Com.My.Resources.Resources.resourceCulture = value; + } + } + } +} diff --git a/Rei.Com/POINTL.cs b/Rei.Com/POINTL.cs new file mode 100644 index 0000000..d2a2484 --- /dev/null +++ b/Rei.Com/POINTL.cs @@ -0,0 +1,14 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.POINTL +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +namespace Rei.Com +{ + public struct POINTL + { + public int x; + public int y; + } +} diff --git a/Rei.Com/Rei.Com.csproj b/Rei.Com/Rei.Com.csproj new file mode 100644 index 0000000..b2ef244 --- /dev/null +++ b/Rei.Com/Rei.Com.csproj @@ -0,0 +1,66 @@ + + + + + Debug + AnyCPU + {0D383F20-FCCC-4F1D-BB46-5A5B5B7E29FE} + Library + Rei.Com + v3.5 + 1.13.2.9255 + 512 + Rei.Com + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Rei.Com/Resources.resx b/Rei.Com/Resources.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/Rei.Com/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rei.Com/SIZEL.cs b/Rei.Com/SIZEL.cs new file mode 100644 index 0000000..8f5b287 --- /dev/null +++ b/Rei.Com/SIZEL.cs @@ -0,0 +1,14 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.SIZEL +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +namespace Rei.Com +{ + public struct SIZEL + { + public int cx; + public int cy; + } +} diff --git a/Rei.Com/ShellClipboardFormats.cs b/Rei.Com/ShellClipboardFormats.cs new file mode 100644 index 0000000..4a9f091 --- /dev/null +++ b/Rei.Com/ShellClipboardFormats.cs @@ -0,0 +1,37 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.ShellClipboardFormats +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +namespace Rei.Com +{ + public sealed class ShellClipboardFormats + { + public static readonly string ShellIDListArray = "Shell IDList Array"; + public static readonly string ShellObjectsOffsets = "Shell Objects Offsets"; + public static readonly string NetResource = "Net Resource"; + public static readonly string FileGroupDescriptor = nameof (FileGroupDescriptor); + public static readonly string FileGroupDescriptorW = nameof (FileGroupDescriptorW); + public static readonly string FileContents = nameof (FileContents); + public static readonly string FileName = nameof (FileName); + public static readonly string FileNameW = nameof (FileNameW); + public static readonly string PrinterFri = nameof (PrinterFri); + public static readonly string FileNameMap = nameof (FileNameMap); + public static readonly string FileNameMapW = nameof (FileNameMapW); + public static readonly string UniformResourceLocator = nameof (UniformResourceLocator); + public static readonly string UniformResourceLocatorW = nameof (UniformResourceLocatorW); + public static readonly string PreferredDropEffect = "Preferred DropEffect"; + public static readonly string PerformedDropEffect = "Performed DropEffect"; + public static readonly string PasteSucceeded = "Paste Succeeded"; + public static readonly string InShellDragLoop = nameof (InShellDragLoop); + public static readonly string DragContext = nameof (DragContext); + public static readonly string MountedVolume = nameof (MountedVolume); + public static readonly string PersistedDataObject = nameof (PersistedDataObject); + public static readonly string TargetCLSID = "TarCLSID"; + public static readonly string LogicalPerformedDropEffect = "Logical Performed DropEffect"; + public static readonly string AutoplayEnumeratedIDListArray = "Autoplay Enumerated IDList Array"; + public static readonly string DropDescription = nameof (DropDescription); + public static readonly string UntrustedDragDrop = nameof (UntrustedDragDrop); + } +} diff --git a/Rei.Com/VirtualFileInfo.cs b/Rei.Com/VirtualFileInfo.cs new file mode 100644 index 0000000..bc6a55f --- /dev/null +++ b/Rei.Com/VirtualFileInfo.cs @@ -0,0 +1,39 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Com.VirtualFileInfo +// Assembly: Rei.Com, Version=1.13.2.9255, Culture=neutral, PublicKeyToken=null +// MVID: 608BC623-FF3D-4118-BA82-AC691A688790 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Com.dll + +using System; +using System.Diagnostics; +using System.IO; + +namespace Rei.Com +{ + [DebuggerDisplay("{DebuggerString}")] + public class VirtualFileInfo + { + public string FileName; + public FDFlags Flags; + public ulong FileSize; + public FileAttributes FileAttributes; + public DateTime CreationTime; + public DateTime LastAccessTime; + public DateTime LastWriteTime; + public IStreamCreator IStreamCreator; + public Stream ManageStream; + + public string DebuggerString + { + get + { + return string.Join(" ", new string[3] + { + this.FileName, + this.FileSize.ToString(), + this.LastWriteTime.ToString() + }); + } + } + } +} diff --git a/Rei.Fs.Webdav/AssemblyInfo.cs b/Rei.Fs.Webdav/AssemblyInfo.cs new file mode 100644 index 0000000..d5a078c --- /dev/null +++ b/Rei.Fs.Webdav/AssemblyInfo.cs @@ -0,0 +1,12 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyCompany("Rei Software")] +[assembly: AssemblyCopyright("Copyright (C) Rei HOBARA 2007-2016")] +[assembly: AssemblyDescription("WebDAV Support Library")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyTitle("Rei.Fs.WebDAV")] +[assembly: AssemblyProduct("Rei.Fs.WebDAV")] +[assembly: Guid("72c8af21-4017-4407-a1e4-2bba7bae25f0")] +[assembly: ComVisible(false)] +[assembly: AssemblyVersion("1.13.2.18288")] diff --git a/Rei.Fs.Webdav/ConnectionSetting.cs b/Rei.Fs.Webdav/ConnectionSetting.cs new file mode 100644 index 0000000..8b955c6 --- /dev/null +++ b/Rei.Fs.Webdav/ConnectionSetting.cs @@ -0,0 +1,275 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.ConnectionSetting +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; + +namespace Rei.Fs.Webdav +{ + [Serializable] + public class ConnectionSetting : ConnectionSettingBase + { + public bool UseDefaultCredential; + public List ClientCertificates; + public bool UsePreAuthentication_Basic; + public bool UsePreAuthentication_WSSE; + private string[] pAuthModules; + [XmlIgnore] + public SslProtocols DisableTlsVersions; + public string URIRequestEncoding; + public string URIResponseEncoding; + public string CredentialEncoding; + public bool DontRequestGzip; + public bool DontRequestDeflate; + public bool RequestTranslatef; + public bool DontExpect100; + public bool SendEmptyPUT; + public bool DontUpdateProperty; + public bool UseFullUriInDestinationHeader; + public string UploadCompression; + public bool DontVerifyContentRange; + public bool RedirectionCollectionOnly; + public bool RemoveLastSlashOnMKCOL; + public bool DisableUploadResume; + + public ConnectionSetting() + { + this.UseDefaultCredential = false; + this.UsePreAuthentication_Basic = false; + this.UsePreAuthentication_WSSE = false; + this.AuthModules = new string[0]; + this.DisableTlsVersions = SslProtocols.None; + this.ClientCertificates = new List(); + this.URIRequestEncoding = "UTF-8"; + this.URIResponseEncoding = "UTF-8"; + this.CredentialEncoding = "UTF-8"; + this.DontRequestGzip = false; + this.DontRequestDeflate = false; + this.RequestTranslatef = true; + this.DontExpect100 = false; + this.SendEmptyPUT = false; + this.DontUpdateProperty = false; + this.UseFullUriInDestinationHeader = true; + this.DontVerifyContentRange = false; + this.RedirectionCollectionOnly = false; + this.RemoveLastSlashOnMKCOL = true; + this.UploadCompression = "None"; + this.DisableUploadResume = true; + } + + public static string TypeName + { + get + { + return "WebDAV"; + } + } + + public static bool TryCreate(Uri target, ref ConnectionSettingBase c) + { + if (Operators.CompareString(target.Scheme, Uri.UriSchemeHttp, false) != 0 && Operators.CompareString(target.Scheme, Uri.UriSchemeHttps, false) != 0) + return false; + c = (ConnectionSettingBase) new ConnectionSetting(); + c.TargetUri = target; + return true; + } + + public new static Icon GetDefaultFavicon() + { + return Rei.Fs.Webdav.My.Resources.Resources.WebDAVFolder; + } + + public override SecureType SecureType + { + get + { + return Operators.CompareString(this.TargetUri.Scheme, Uri.UriSchemeHttps, false) == 0 ? SecureType.Secure : SecureType.None; + } + } + + [XmlIgnore] + public string[] AuthModules + { + get + { + return this.pAuthModules; + } + set + { + if (value == null) + value = new string[0]; + this.pAuthModules = value; + } + } + + [Browsable(false)] + [XmlElement("AuthModules")] + public string AuthModules_ForSerialization + { + get + { + return string.Join(",", this.pAuthModules); + } + set + { + this.pAuthModules = value.Split(new char[2] + { + ' ', + ',' + }, StringSplitOptions.RemoveEmptyEntries); + } + } + + [XmlElement("DisableTlsVersions")] + [Browsable(false)] + public string DisableTlsVersions_ForSerialization + { + get + { + string str = ""; + if ((this.DisableTlsVersions & SslProtocols.Ssl2) != SslProtocols.None) + str += "ssl2 "; + if ((this.DisableTlsVersions & SslProtocols.Ssl3) != SslProtocols.None) + str += "ssl3 "; + if ((this.DisableTlsVersions & SslProtocols.Tls) != SslProtocols.None) + str += "tls10 "; + if ((this.DisableTlsVersions & SslProtocols.Tls11) != SslProtocols.None) + str += "tls11 "; + if ((this.DisableTlsVersions & SslProtocols.Tls12) != SslProtocols.None) + str += "tls12 "; + return str.Trim(); + } + set + { + this.DisableTlsVersions = SslProtocols.None; + value = value.ToLowerInvariant(); + if (value.Contains("ssl2")) + this.DisableTlsVersions = this.DisableTlsVersions | SslProtocols.Ssl2; + if (value.Contains("ssl3")) + this.DisableTlsVersions = this.DisableTlsVersions | SslProtocols.Ssl3; + if (value.Contains("tls10")) + this.DisableTlsVersions = this.DisableTlsVersions | SslProtocols.Tls; + if (value.Contains("tls11")) + this.DisableTlsVersions = this.DisableTlsVersions | SslProtocols.Tls11; + if (!value.Contains("tls12")) + return; + this.DisableTlsVersions = this.DisableTlsVersions | SslProtocols.Tls12; + } + } + + public override FsBase GetBaseClient() + { + return (FsBase) this.InnerGetClient(); + } + + public WebdavFs InnerGetClient() + { + WebdavFs webdavFs = new WebdavFs(this); + webdavFs.UseDefaultCredential = this.UseDefaultCredential; + webdavFs.UsePreAuthentication_Basic = this.UsePreAuthentication_Basic; + webdavFs.UsePreAuthentication_WSSE = this.UsePreAuthentication_WSSE; + webdavFs.AuthModules = this.AuthModules; + webdavFs.DisableTlsVersions = this.DisableTlsVersions; + X509Store x509Store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + x509Store.Open(OpenFlags.ReadOnly); + try + { + int num1 = 0; + int num2 = checked (this.ClientCertificates.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + int num3 = 0; + int num4 = checked (x509Store.Certificates.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + if (Operators.CompareString(this.ClientCertificates[index1], x509Store.Certificates[index2].Thumbprint, false) == 0) + { + webdavFs.ClientCertificates.Add(x509Store.Certificates[index2]); + break; + } + checked { ++index2; } + } + checked { ++index1; } + } + } + finally + { + x509Store.Close(); + } + webdavFs.URIRequestEncoding = Encoding.GetEncoding(this.URIRequestEncoding.Trim()); + webdavFs.URIResponseEncoding = Encoding.GetEncoding(this.URIResponseEncoding.Trim()); + webdavFs.CredentialEncoding = Encoding.GetEncoding(this.CredentialEncoding.Trim()); + webdavFs.DontRequestGzip = this.DontRequestGzip; + webdavFs.DontRequestDeflate = this.DontRequestDeflate; + webdavFs.RequestTranslatef = this.RequestTranslatef; + webdavFs.DontExpect100 = this.DontExpect100; + webdavFs.SendEmptyPUT = this.SendEmptyPUT; + webdavFs.DontUpdateProperty = this.DontUpdateProperty; + webdavFs.UseFullUriInDestinationHeader = this.UseFullUriInDestinationHeader; + webdavFs.DontVerifyContentRange = this.DontVerifyContentRange; + webdavFs.RedirectionCollectionOnly = this.RedirectionCollectionOnly; + webdavFs.UploadCompression = this.UploadCompression; + webdavFs.RemoveLastSlashOnMKCOL = this.RemoveLastSlashOnMKCOL; + webdavFs.DisableUploadResume = this.DisableUploadResume; + if (this.Proxy == ProxyType.Default) + webdavFs.Proxy = WebRequest.GetSystemWebProxy(); + else if (this.Proxy == ProxyType.Specify) + { + int length = this.ProxyUserName.IndexOf("\\"); + NetworkCredential networkCredential = length < 0 ? new NetworkCredential(this.ProxyUserName, this.ProxyPassword) : new NetworkCredential(this.ProxyUserName.Substring(checked (length + 1)), this.ProxyPassword, this.ProxyUserName.Substring(0, length)); + webdavFs.Proxy = (IWebProxy) new WebProxy(this.ProxyUri, this.ProxyByPassLocal, this.ProxyByPassList, (ICredentials) networkCredential); + } + else + webdavFs.Proxy = (IWebProxy) null; + webdavFs.ConnectTimeout = this.ConnectTimeout; + webdavFs.ReadWriteTimeout = this.ReadWriteTimeout; + return webdavFs; + } + + public override Form GetSettingForm() + { + return (Form) new ConnectionSettingForm(); + } + + public override bool DoAuthorization(Uri target, bool PersistSelectable) + { + using (AuthDialog authDialog = new AuthDialog()) + { + authDialog.Target = target.ToString(); + authDialog.UserName = this.UserName; + authDialog.Password = this.Password; + if (PersistSelectable && !this.DontSave) + { + authDialog.ShowRememberCheckBox = true; + authDialog.Remember = false; + } + else + { + authDialog.ShowRememberCheckBox = false; + authDialog.Remember = true; + } + if (authDialog.ShowDialog() == DialogResult.OK) + { + this.SetUserPass(authDialog.UserName, authDialog.Password); + if (authDialog.Remember) + this.NeedPersist = true; + return true; + } + } + return false; + } + } +} diff --git a/Rei.Fs.Webdav/ConnectionSettingForm.cs b/Rei.Fs.Webdav/ConnectionSettingForm.cs new file mode 100644 index 0000000..b486099 --- /dev/null +++ b/Rei.Fs.Webdav/ConnectionSettingForm.cs @@ -0,0 +1,3493 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.ConnectionSettingForm +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Net; +using System.Runtime.CompilerServices; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Windows.Forms; + +namespace Rei.Fs.Webdav +{ + [DesignerGenerated] + public class ConnectionSettingForm : Form + { + private IContainer components; + [AccessedThroughProperty("SettingNameTextBox")] + private TextBox _SettingNameTextBox; + [AccessedThroughProperty("URITextBox")] + private TextBox _URITextBox; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("UserNameTextBox")] + private TextBox _UserNameTextBox; + [AccessedThroughProperty("PasswordTextBox")] + private TextBox _PasswordTextBox; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("DontSaveCheckBox")] + private CheckBox _DontSaveCheckBox; + [AccessedThroughProperty("TestButton")] + private Button _TestButton; + [AccessedThroughProperty("TabControl1")] + private TabControl _TabControl1; + [AccessedThroughProperty("GeneralTabPage")] + private TabPage _GeneralTabPage; + [AccessedThroughProperty("AdvancedTabPage")] + private TabPage _AdvancedTabPage; + [AccessedThroughProperty("CheckBox1")] + private CheckBox _CheckBox1; + [AccessedThroughProperty("CheckBox2")] + private CheckBox _CheckBox2; + [AccessedThroughProperty("NotReqGzipCheckBox")] + private CheckBox _NotReqGzipCheckBox; + [AccessedThroughProperty("SendTranslateFCheckBox")] + private CheckBox _SendTranslateFCheckBox; + [AccessedThroughProperty("EmptyPUTCheckBox")] + private CheckBox _EmptyPUTCheckBox; + [AccessedThroughProperty("AuthTabPage")] + private TabPage _AuthTabPage; + [AccessedThroughProperty("PreAuthBasicCheckBox")] + private CheckBox _PreAuthBasicCheckBox; + [AccessedThroughProperty("EncodingTab")] + private TabPage _EncodingTab; + [AccessedThroughProperty("Label6")] + private Label _Label6; + [AccessedThroughProperty("ResponseEncodingComboBox")] + private ComboBox _ResponseEncodingComboBox; + [AccessedThroughProperty("Label3")] + private Label _Label3; + [AccessedThroughProperty("RequestEncodingComboBox")] + private ComboBox _RequestEncodingComboBox; + [AccessedThroughProperty("PreAuthWSSECheckBox")] + private CheckBox _PreAuthWSSECheckBox; + [AccessedThroughProperty("Label7")] + private Label _Label7; + [AccessedThroughProperty("CredentialEncodingComboBox")] + private ComboBox _CredentialEncodingComboBox; + [AccessedThroughProperty("ProxyTabPage")] + private TabPage _ProxyTabPage; + [AccessedThroughProperty("NotReqDeflateCheckBox")] + private CheckBox _NotReqDeflateCheckBox; + [AccessedThroughProperty("UseDefaultCredentialCheckBox")] + private CheckBox _UseDefaultCredentialCheckBox; + [AccessedThroughProperty("NotExpect100CheckBox")] + private CheckBox _NotExpect100CheckBox; + [AccessedThroughProperty("TimeoutTabPage")] + private TabPage _TimeoutTabPage; + [AccessedThroughProperty("ConnectionTimeoutComboBox")] + private ComboBox _ConnectionTimeoutComboBox; + [AccessedThroughProperty("StreamTimeoutComboBox")] + private ComboBox _StreamTimeoutComboBox; + [AccessedThroughProperty("Label11")] + private Label _Label11; + [AccessedThroughProperty("Label10")] + private Label _Label10; + [AccessedThroughProperty("NoProxyRadio")] + private RadioButton _NoProxyRadio; + [AccessedThroughProperty("SpecifyProxyRadio")] + private RadioButton _SpecifyProxyRadio; + [AccessedThroughProperty("DefaultProxyRadio")] + private RadioButton _DefaultProxyRadio; + [AccessedThroughProperty("ProxyBypassLocalCheckBox")] + private CheckBox _ProxyBypassLocalCheckBox; + [AccessedThroughProperty("ProxyURITextBox")] + private TextBox _ProxyURITextBox; + [AccessedThroughProperty("Label15")] + private Label _Label15; + [AccessedThroughProperty("Label14")] + private Label _Label14; + [AccessedThroughProperty("Label13")] + private Label _Label13; + [AccessedThroughProperty("Label12")] + private Label _Label12; + [AccessedThroughProperty("ProxyPasswordTextBox")] + private TextBox _ProxyPasswordTextBox; + [AccessedThroughProperty("ProxyUsernameTextBox")] + private TextBox _ProxyUsernameTextBox; + [AccessedThroughProperty("ProxyBypassListTextBox")] + private TextBox _ProxyBypassListTextBox; + [AccessedThroughProperty("ProxyUseDefaultCredential")] + private CheckBox _ProxyUseDefaultCredential; + [AccessedThroughProperty("DontUpdatePropertyCheckBox")] + private CheckBox _DontUpdatePropertyCheckBox; + [AccessedThroughProperty("FullUriDestCheckBox")] + private CheckBox _FullUriDestCheckBox; + [AccessedThroughProperty("Label16")] + private Label _Label16; + [AccessedThroughProperty("UploadFilenameNormalizationComboBox")] + private ComboBox _UploadFilenameNormalizationComboBox; + [AccessedThroughProperty("DownloadFilenameNormalizationComboBox")] + private ComboBox _DownloadFilenameNormalizationComboBox; + [AccessedThroughProperty("Label17")] + private Label _Label17; + [AccessedThroughProperty("CheckBoxAuthWSSE")] + private CheckBox _CheckBoxAuthWSSE; + [AccessedThroughProperty("CheckBoxAuthNegotiate")] + private CheckBox _CheckBoxAuthNegotiate; + [AccessedThroughProperty("CheckBoxAuthKerberos")] + private CheckBox _CheckBoxAuthKerberos; + [AccessedThroughProperty("CheckBoxAuthNTLM")] + private CheckBox _CheckBoxAuthNTLM; + [AccessedThroughProperty("CheckBoxAuthDigest")] + private CheckBox _CheckBoxAuthDigest; + [AccessedThroughProperty("CheckBoxAuthBasic")] + private CheckBox _CheckBoxAuthBasic; + [AccessedThroughProperty("GroupBoxAuthMethods")] + private GroupBox _GroupBoxAuthMethods; + [AccessedThroughProperty("Label8")] + private Label _Label8; + [AccessedThroughProperty("UploadCompressionComboBox")] + private ComboBox _UploadCompressionComboBox; + [AccessedThroughProperty("NotVeryfyRange")] + private CheckBox _NotVeryfyRange; + [AccessedThroughProperty("RedirectionCollectionOnly")] + private CheckBox _RedirectionCollectionOnly; + [AccessedThroughProperty("TabPage1")] + private TabPage _TabPage1; + [AccessedThroughProperty("Label9")] + private Label _Label9; + [AccessedThroughProperty("Label18")] + private Label _Label18; + [AccessedThroughProperty("SplitSizeComboBox")] + private ComboBox _SplitSizeComboBox; + [AccessedThroughProperty("AutoSplitCheckBox")] + private CheckBox _AutoSplitCheckBox; + [AccessedThroughProperty("Label19")] + private Label _Label19; + [AccessedThroughProperty("EncryptKeyTextBox")] + private TextBox _EncryptKeyTextBox; + [AccessedThroughProperty("EncryptionCheck")] + private CheckBox _EncryptionCheck; + [AccessedThroughProperty("CheckBoxAuthPassport")] + private CheckBox _CheckBoxAuthPassport; + [AccessedThroughProperty("Label20")] + private Label _Label20; + [AccessedThroughProperty("ComboBoxEscapeString")] + private ComboBox _ComboBoxEscapeString; + [AccessedThroughProperty("GroupBoxTLS")] + private GroupBox _GroupBoxTLS; + [AccessedThroughProperty("CheckBoxTLS12")] + private CheckBox _CheckBoxTLS12; + [AccessedThroughProperty("CheckBoxTLS11")] + private CheckBox _CheckBoxTLS11; + [AccessedThroughProperty("CheckBoxTLS10")] + private CheckBox _CheckBoxTLS10; + [AccessedThroughProperty("CheckBoxSSL30")] + private CheckBox _CheckBoxSSL30; + [AccessedThroughProperty("HideUnencDirCheckBox")] + private CheckBox _HideUnencDirCheckBox; + [AccessedThroughProperty("HideUnencFileCheckBox")] + private CheckBox _HideUnencFileCheckBox; + [AccessedThroughProperty("SelectClientCertButton")] + private Button _SelectClientCertButton; + [AccessedThroughProperty("ClientCertificateListBox")] + private ListBox _ClientCertificateListBox; + [AccessedThroughProperty("GroupBox1")] + private GroupBox _GroupBox1; + [AccessedThroughProperty("RequestWithoutLastSlash")] + private CheckBox _RequestWithoutLastSlash; + [AccessedThroughProperty("DisableUploadResumeCheckBox")] + private CheckBox _DisableUploadResumeCheckBox; + private List certlist; + + public ConnectionSettingForm() + { + this.Load += new EventHandler(this.ConnectionSettingForm_Load); + this.certlist = new List(); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.SettingNameTextBox = new TextBox(); + this.URITextBox = new TextBox(); + this.OKButton = new Button(); + this.m_CancelButton = new Button(); + this.Label1 = new Label(); + this.Label2 = new Label(); + this.UserNameTextBox = new TextBox(); + this.PasswordTextBox = new TextBox(); + this.Label4 = new Label(); + this.Label5 = new Label(); + this.DontSaveCheckBox = new CheckBox(); + this.TestButton = new Button(); + this.TabControl1 = new TabControl(); + this.GeneralTabPage = new TabPage(); + this.UseDefaultCredentialCheckBox = new CheckBox(); + this.AuthTabPage = new TabPage(); + this.GroupBox1 = new GroupBox(); + this.ClientCertificateListBox = new ListBox(); + this.SelectClientCertButton = new Button(); + this.GroupBoxTLS = new GroupBox(); + this.CheckBoxTLS12 = new CheckBox(); + this.CheckBoxTLS11 = new CheckBox(); + this.CheckBoxTLS10 = new CheckBox(); + this.CheckBoxSSL30 = new CheckBox(); + this.GroupBoxAuthMethods = new GroupBox(); + this.CheckBoxAuthPassport = new CheckBox(); + this.CheckBoxAuthWSSE = new CheckBox(); + this.CheckBoxAuthNegotiate = new CheckBox(); + this.CheckBoxAuthKerberos = new CheckBox(); + this.CheckBoxAuthNTLM = new CheckBox(); + this.CheckBoxAuthDigest = new CheckBox(); + this.CheckBoxAuthBasic = new CheckBox(); + this.PreAuthWSSECheckBox = new CheckBox(); + this.PreAuthBasicCheckBox = new CheckBox(); + this.EncodingTab = new TabPage(); + this.Label17 = new Label(); + this.Label16 = new Label(); + this.UploadFilenameNormalizationComboBox = new ComboBox(); + this.DownloadFilenameNormalizationComboBox = new ComboBox(); + this.Label7 = new Label(); + this.CredentialEncodingComboBox = new ComboBox(); + this.Label6 = new Label(); + this.ResponseEncodingComboBox = new ComboBox(); + this.Label3 = new Label(); + this.RequestEncodingComboBox = new ComboBox(); + this.AdvancedTabPage = new TabPage(); + this.DisableUploadResumeCheckBox = new CheckBox(); + this.RequestWithoutLastSlash = new CheckBox(); + this.RedirectionCollectionOnly = new CheckBox(); + this.NotVeryfyRange = new CheckBox(); + this.Label8 = new Label(); + this.UploadCompressionComboBox = new ComboBox(); + this.FullUriDestCheckBox = new CheckBox(); + this.DontUpdatePropertyCheckBox = new CheckBox(); + this.NotExpect100CheckBox = new CheckBox(); + this.NotReqDeflateCheckBox = new CheckBox(); + this.EmptyPUTCheckBox = new CheckBox(); + this.SendTranslateFCheckBox = new CheckBox(); + this.NotReqGzipCheckBox = new CheckBox(); + this.CheckBox2 = new CheckBox(); + this.CheckBox1 = new CheckBox(); + this.ProxyTabPage = new TabPage(); + this.ProxyUseDefaultCredential = new CheckBox(); + this.Label15 = new Label(); + this.Label14 = new Label(); + this.Label13 = new Label(); + this.Label12 = new Label(); + this.ProxyPasswordTextBox = new TextBox(); + this.ProxyUsernameTextBox = new TextBox(); + this.ProxyBypassListTextBox = new TextBox(); + this.ProxyBypassLocalCheckBox = new CheckBox(); + this.ProxyURITextBox = new TextBox(); + this.NoProxyRadio = new RadioButton(); + this.SpecifyProxyRadio = new RadioButton(); + this.DefaultProxyRadio = new RadioButton(); + this.TimeoutTabPage = new TabPage(); + this.Label11 = new Label(); + this.Label10 = new Label(); + this.StreamTimeoutComboBox = new ComboBox(); + this.ConnectionTimeoutComboBox = new ComboBox(); + this.TabPage1 = new TabPage(); + this.HideUnencDirCheckBox = new CheckBox(); + this.HideUnencFileCheckBox = new CheckBox(); + this.ComboBoxEscapeString = new ComboBox(); + this.Label19 = new Label(); + this.EncryptKeyTextBox = new TextBox(); + this.EncryptionCheck = new CheckBox(); + this.Label9 = new Label(); + this.Label20 = new Label(); + this.Label18 = new Label(); + this.SplitSizeComboBox = new ComboBox(); + this.AutoSplitCheckBox = new CheckBox(); + this.TabControl1.SuspendLayout(); + this.GeneralTabPage.SuspendLayout(); + this.AuthTabPage.SuspendLayout(); + this.GroupBox1.SuspendLayout(); + this.GroupBoxTLS.SuspendLayout(); + this.GroupBoxAuthMethods.SuspendLayout(); + this.EncodingTab.SuspendLayout(); + this.AdvancedTabPage.SuspendLayout(); + this.ProxyTabPage.SuspendLayout(); + this.TimeoutTabPage.SuspendLayout(); + this.TabPage1.SuspendLayout(); + this.SuspendLayout(); + this.SettingNameTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox settingNameTextBox1 = this.SettingNameTextBox; + Point point1 = new Point(16, 24); + Point point2 = point1; + settingNameTextBox1.Location = point2; + this.SettingNameTextBox.Name = "SettingNameTextBox"; + TextBox settingNameTextBox2 = this.SettingNameTextBox; + Size size1 = new Size(321, 19); + Size size2 = size1; + settingNameTextBox2.Size = size2; + this.SettingNameTextBox.TabIndex = 1; + this.URITextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox uriTextBox1 = this.URITextBox; + point1 = new Point(16, 64); + Point point3 = point1; + uriTextBox1.Location = point3; + this.URITextBox.Name = "URITextBox"; + TextBox uriTextBox2 = this.URITextBox; + size1 = new Size(321, 19); + Size size3 = size1; + uriTextBox2.Size = size3; + this.URITextBox.TabIndex = 3; + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button okButton1 = this.OKButton; + point1 = new Point(216, 361); + Point point4 = point1; + okButton1.Location = point4; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + size1 = new Size(72, 24); + Size size4 = size1; + okButton2.Size = size4; + this.OKButton.TabIndex = 2; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(296, 361); + Point point5 = point1; + mCancelButton1.Location = point5; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size5 = size1; + mCancelButton2.Size = size5; + this.m_CancelButton.TabIndex = 3; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 8); + Point point6 = point1; + label1_1.Location = point6; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(74, 12); + Size size6 = size1; + label1_2.Size = size6; + this.Label1.TabIndex = 0; + this.Label1.Text = "Setting Name"; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(8, 48); + Point point7 = point1; + label2_1.Location = point7; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(224, 12); + Size size7 = size1; + label2_2.Size = size7; + this.Label2.TabIndex = 2; + this.Label2.Text = "URI (http|https)://hostname[:port]/[path/]"; + this.UserNameTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox userNameTextBox1 = this.UserNameTextBox; + point1 = new Point(16, 160); + Point point8 = point1; + userNameTextBox1.Location = point8; + this.UserNameTextBox.Name = "UserNameTextBox"; + TextBox userNameTextBox2 = this.UserNameTextBox; + size1 = new Size(321, 19); + Size size8 = size1; + userNameTextBox2.Size = size8; + this.UserNameTextBox.TabIndex = 7; + this.PasswordTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox passwordTextBox1 = this.PasswordTextBox; + point1 = new Point(16, 200); + Point point9 = point1; + passwordTextBox1.Location = point9; + this.PasswordTextBox.Name = "PasswordTextBox"; + TextBox passwordTextBox2 = this.PasswordTextBox; + size1 = new Size(321, 19); + Size size9 = size1; + passwordTextBox2.Size = size9; + this.PasswordTextBox.TabIndex = 9; + this.PasswordTextBox.UseSystemPasswordChar = true; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(8, 144); + Point point10 = point1; + label4_1.Location = point10; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(163, 12); + Size size10 = size1; + label4_2.Size = size10; + this.Label4.TabIndex = 6; + this.Label4.Text = "Username [domain\\]username"; + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + point1 = new Point(8, 184); + Point point11 = point1; + label5_1.Location = point11; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + size1 = new Size(54, 12); + Size size11 = size1; + label5_2.Size = size11; + this.Label5.TabIndex = 8; + this.Label5.Text = "Password"; + this.DontSaveCheckBox.AutoSize = true; + CheckBox dontSaveCheckBox1 = this.DontSaveCheckBox; + point1 = new Point(8, 120); + Point point12 = point1; + dontSaveCheckBox1.Location = point12; + this.DontSaveCheckBox.Name = "DontSaveCheckBox"; + CheckBox dontSaveCheckBox2 = this.DontSaveCheckBox; + size1 = new Size(208, 16); + Size size12 = size1; + dontSaveCheckBox2.Size = size12; + this.DontSaveCheckBox.TabIndex = 5; + this.DontSaveCheckBox.Text = "Don't save Username and Password"; + this.DontSaveCheckBox.UseVisualStyleBackColor = true; + this.TestButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button testButton1 = this.TestButton; + point1 = new Point(136, 361); + Point point13 = point1; + testButton1.Location = point13; + this.TestButton.Name = "TestButton"; + Button testButton2 = this.TestButton; + size1 = new Size(72, 24); + Size size13 = size1; + testButton2.Size = size13; + this.TestButton.TabIndex = 1; + this.TestButton.Text = "Test"; + this.TestButton.UseVisualStyleBackColor = true; + this.TabControl1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.TabControl1.Controls.Add((Control) this.GeneralTabPage); + this.TabControl1.Controls.Add((Control) this.AuthTabPage); + this.TabControl1.Controls.Add((Control) this.EncodingTab); + this.TabControl1.Controls.Add((Control) this.AdvancedTabPage); + this.TabControl1.Controls.Add((Control) this.ProxyTabPage); + this.TabControl1.Controls.Add((Control) this.TimeoutTabPage); + this.TabControl1.Controls.Add((Control) this.TabPage1); + TabControl tabControl1_1 = this.TabControl1; + point1 = new Point(8, 8); + Point point14 = point1; + tabControl1_1.Location = point14; + this.TabControl1.Name = "TabControl1"; + this.TabControl1.SelectedIndex = 0; + TabControl tabControl1_2 = this.TabControl1; + size1 = new Size(362, 347); + Size size14 = size1; + tabControl1_2.Size = size14; + this.TabControl1.TabIndex = 0; + this.GeneralTabPage.Controls.Add((Control) this.UseDefaultCredentialCheckBox); + this.GeneralTabPage.Controls.Add((Control) this.URITextBox); + this.GeneralTabPage.Controls.Add((Control) this.SettingNameTextBox); + this.GeneralTabPage.Controls.Add((Control) this.DontSaveCheckBox); + this.GeneralTabPage.Controls.Add((Control) this.Label1); + this.GeneralTabPage.Controls.Add((Control) this.Label5); + this.GeneralTabPage.Controls.Add((Control) this.Label2); + this.GeneralTabPage.Controls.Add((Control) this.Label4); + this.GeneralTabPage.Controls.Add((Control) this.PasswordTextBox); + this.GeneralTabPage.Controls.Add((Control) this.UserNameTextBox); + TabPage generalTabPage1 = this.GeneralTabPage; + point1 = new Point(4, 22); + Point point15 = point1; + generalTabPage1.Location = point15; + this.GeneralTabPage.Name = "GeneralTabPage"; + TabPage generalTabPage2 = this.GeneralTabPage; + Padding padding1 = new Padding(3); + Padding padding2 = padding1; + generalTabPage2.Padding = padding2; + TabPage generalTabPage3 = this.GeneralTabPage; + size1 = new Size(354, 321); + Size size15 = size1; + generalTabPage3.Size = size15; + this.GeneralTabPage.TabIndex = 0; + this.GeneralTabPage.Text = "General"; + this.GeneralTabPage.UseVisualStyleBackColor = true; + this.UseDefaultCredentialCheckBox.AutoSize = true; + CheckBox credentialCheckBox1 = this.UseDefaultCredentialCheckBox; + point1 = new Point(8, 96); + Point point16 = point1; + credentialCheckBox1.Location = point16; + this.UseDefaultCredentialCheckBox.Name = "UseDefaultCredentialCheckBox"; + CheckBox credentialCheckBox2 = this.UseDefaultCredentialCheckBox; + size1 = new Size(201, 16); + Size size16 = size1; + credentialCheckBox2.Size = size16; + this.UseDefaultCredentialCheckBox.TabIndex = 4; + this.UseDefaultCredentialCheckBox.Text = "Integrated Windows Authentication"; + this.UseDefaultCredentialCheckBox.UseVisualStyleBackColor = true; + this.AuthTabPage.Controls.Add((Control) this.GroupBox1); + this.AuthTabPage.Controls.Add((Control) this.GroupBoxTLS); + this.AuthTabPage.Controls.Add((Control) this.GroupBoxAuthMethods); + this.AuthTabPage.Controls.Add((Control) this.PreAuthWSSECheckBox); + this.AuthTabPage.Controls.Add((Control) this.PreAuthBasicCheckBox); + TabPage authTabPage1 = this.AuthTabPage; + point1 = new Point(4, 22); + Point point17 = point1; + authTabPage1.Location = point17; + this.AuthTabPage.Name = "AuthTabPage"; + TabPage authTabPage2 = this.AuthTabPage; + padding1 = new Padding(3); + Padding padding3 = padding1; + authTabPage2.Padding = padding3; + TabPage authTabPage3 = this.AuthTabPage; + size1 = new Size(354, 321); + Size size17 = size1; + authTabPage3.Size = size17; + this.AuthTabPage.TabIndex = 1; + this.AuthTabPage.Text = "Auth"; + this.AuthTabPage.UseVisualStyleBackColor = true; + this.GroupBox1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.GroupBox1.Controls.Add((Control) this.ClientCertificateListBox); + this.GroupBox1.Controls.Add((Control) this.SelectClientCertButton); + GroupBox groupBox1_1 = this.GroupBox1; + point1 = new Point(8, 184); + Point point18 = point1; + groupBox1_1.Location = point18; + this.GroupBox1.Name = "GroupBox1"; + GroupBox groupBox1_2 = this.GroupBox1; + size1 = new Size(336, 104); + Size size18 = size1; + groupBox1_2.Size = size18; + this.GroupBox1.TabIndex = 4; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Client Certificate"; + this.ClientCertificateListBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.ClientCertificateListBox.FormattingEnabled = true; + this.ClientCertificateListBox.HorizontalScrollbar = true; + this.ClientCertificateListBox.ItemHeight = 12; + ListBox certificateListBox1 = this.ClientCertificateListBox; + point1 = new Point(8, 24); + Point point19 = point1; + certificateListBox1.Location = point19; + this.ClientCertificateListBox.Name = "ClientCertificateListBox"; + this.ClientCertificateListBox.SelectionMode = SelectionMode.None; + ListBox certificateListBox2 = this.ClientCertificateListBox; + size1 = new Size(320, 40); + Size size19 = size1; + certificateListBox2.Size = size19; + this.ClientCertificateListBox.TabIndex = 0; + this.SelectClientCertButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button clientCertButton1 = this.SelectClientCertButton; + point1 = new Point(264, 72); + Point point20 = point1; + clientCertButton1.Location = point20; + this.SelectClientCertButton.Name = "SelectClientCertButton"; + Button clientCertButton2 = this.SelectClientCertButton; + size1 = new Size(64, 23); + Size size20 = size1; + clientCertButton2.Size = size20; + this.SelectClientCertButton.TabIndex = 1; + this.SelectClientCertButton.Text = "Select"; + this.SelectClientCertButton.UseVisualStyleBackColor = true; + this.GroupBoxTLS.Controls.Add((Control) this.CheckBoxTLS12); + this.GroupBoxTLS.Controls.Add((Control) this.CheckBoxTLS11); + this.GroupBoxTLS.Controls.Add((Control) this.CheckBoxTLS10); + this.GroupBoxTLS.Controls.Add((Control) this.CheckBoxSSL30); + GroupBox groupBoxTls1 = this.GroupBoxTLS; + point1 = new Point(208, 56); + Point point21 = point1; + groupBoxTls1.Location = point21; + this.GroupBoxTLS.Name = "GroupBoxTLS"; + GroupBox groupBoxTls2 = this.GroupBoxTLS; + size1 = new Size(136, 120); + Size size21 = size1; + groupBoxTls2.Size = size21; + this.GroupBoxTLS.TabIndex = 3; + this.GroupBoxTLS.TabStop = false; + this.GroupBoxTLS.Text = "TLS/SSL"; + this.CheckBoxTLS12.AutoSize = true; + CheckBox checkBoxTlS12_1 = this.CheckBoxTLS12; + point1 = new Point(16, 96); + Point point22 = point1; + checkBoxTlS12_1.Location = point22; + this.CheckBoxTLS12.Name = "CheckBoxTLS12"; + CheckBox checkBoxTlS12_2 = this.CheckBoxTLS12; + size1 = new Size(100, 16); + Size size22 = size1; + checkBoxTlS12_2.Size = size22; + this.CheckBoxTLS12.TabIndex = 3; + this.CheckBoxTLS12.Text = "Disable TLS1.2"; + this.CheckBoxTLS12.UseVisualStyleBackColor = true; + this.CheckBoxTLS11.AutoSize = true; + CheckBox checkBoxTlS11_1 = this.CheckBoxTLS11; + point1 = new Point(16, 72); + Point point23 = point1; + checkBoxTlS11_1.Location = point23; + this.CheckBoxTLS11.Name = "CheckBoxTLS11"; + CheckBox checkBoxTlS11_2 = this.CheckBoxTLS11; + size1 = new Size(100, 16); + Size size23 = size1; + checkBoxTlS11_2.Size = size23; + this.CheckBoxTLS11.TabIndex = 2; + this.CheckBoxTLS11.Text = "Disable TLS1.1"; + this.CheckBoxTLS11.UseVisualStyleBackColor = true; + this.CheckBoxTLS10.AutoSize = true; + CheckBox checkBoxTlS10_1 = this.CheckBoxTLS10; + point1 = new Point(16, 48); + Point point24 = point1; + checkBoxTlS10_1.Location = point24; + this.CheckBoxTLS10.Name = "CheckBoxTLS10"; + CheckBox checkBoxTlS10_2 = this.CheckBoxTLS10; + size1 = new Size(100, 16); + Size size24 = size1; + checkBoxTlS10_2.Size = size24; + this.CheckBoxTLS10.TabIndex = 1; + this.CheckBoxTLS10.Text = "Disable TLS1.0"; + this.CheckBoxTLS10.UseVisualStyleBackColor = true; + this.CheckBoxSSL30.AutoSize = true; + CheckBox checkBoxSsL30_1 = this.CheckBoxSSL30; + point1 = new Point(16, 24); + Point point25 = point1; + checkBoxSsL30_1.Location = point25; + this.CheckBoxSSL30.Name = "CheckBoxSSL30"; + CheckBox checkBoxSsL30_2 = this.CheckBoxSSL30; + size1 = new Size(100, 16); + Size size25 = size1; + checkBoxSsL30_2.Size = size25; + this.CheckBoxSSL30.TabIndex = 0; + this.CheckBoxSSL30.Text = "Disable SSL3.0"; + this.CheckBoxSSL30.UseVisualStyleBackColor = true; + this.GroupBoxAuthMethods.Controls.Add((Control) this.CheckBoxAuthPassport); + this.GroupBoxAuthMethods.Controls.Add((Control) this.CheckBoxAuthWSSE); + this.GroupBoxAuthMethods.Controls.Add((Control) this.CheckBoxAuthNegotiate); + this.GroupBoxAuthMethods.Controls.Add((Control) this.CheckBoxAuthKerberos); + this.GroupBoxAuthMethods.Controls.Add((Control) this.CheckBoxAuthNTLM); + this.GroupBoxAuthMethods.Controls.Add((Control) this.CheckBoxAuthDigest); + this.GroupBoxAuthMethods.Controls.Add((Control) this.CheckBoxAuthBasic); + GroupBox groupBoxAuthMethods1 = this.GroupBoxAuthMethods; + point1 = new Point(8, 56); + Point point26 = point1; + groupBoxAuthMethods1.Location = point26; + this.GroupBoxAuthMethods.Name = "GroupBoxAuthMethods"; + GroupBox groupBoxAuthMethods2 = this.GroupBoxAuthMethods; + size1 = new Size(192, 120); + Size size26 = size1; + groupBoxAuthMethods2.Size = size26; + this.GroupBoxAuthMethods.TabIndex = 2; + this.GroupBoxAuthMethods.TabStop = false; + this.GroupBoxAuthMethods.Text = "Authentication Methods"; + this.CheckBoxAuthPassport.AutoSize = true; + CheckBox checkBoxAuthPassport1 = this.CheckBoxAuthPassport; + point1 = new Point(112, 72); + Point point27 = point1; + checkBoxAuthPassport1.Location = point27; + this.CheckBoxAuthPassport.Name = "CheckBoxAuthPassport"; + CheckBox checkBoxAuthPassport2 = this.CheckBoxAuthPassport; + size1 = new Size(69, 16); + Size size27 = size1; + checkBoxAuthPassport2.Size = size27; + this.CheckBoxAuthPassport.TabIndex = 6; + this.CheckBoxAuthPassport.Text = "Passport"; + this.CheckBoxAuthPassport.UseVisualStyleBackColor = true; + this.CheckBoxAuthWSSE.AutoSize = true; + CheckBox checkBoxAuthWsse1 = this.CheckBoxAuthWSSE; + point1 = new Point(112, 48); + Point point28 = point1; + checkBoxAuthWsse1.Location = point28; + this.CheckBoxAuthWSSE.Name = "CheckBoxAuthWSSE"; + CheckBox checkBoxAuthWsse2 = this.CheckBoxAuthWSSE; + size1 = new Size(54, 16); + Size size28 = size1; + checkBoxAuthWsse2.Size = size28; + this.CheckBoxAuthWSSE.TabIndex = 5; + this.CheckBoxAuthWSSE.Text = "WSSE"; + this.CheckBoxAuthWSSE.UseVisualStyleBackColor = true; + this.CheckBoxAuthNegotiate.AutoSize = true; + CheckBox boxAuthNegotiate1 = this.CheckBoxAuthNegotiate; + point1 = new Point(112, 24); + Point point29 = point1; + boxAuthNegotiate1.Location = point29; + this.CheckBoxAuthNegotiate.Name = "CheckBoxAuthNegotiate"; + CheckBox boxAuthNegotiate2 = this.CheckBoxAuthNegotiate; + size1 = new Size(73, 16); + Size size29 = size1; + boxAuthNegotiate2.Size = size29; + this.CheckBoxAuthNegotiate.TabIndex = 4; + this.CheckBoxAuthNegotiate.Text = "Negotiate"; + this.CheckBoxAuthNegotiate.UseVisualStyleBackColor = true; + this.CheckBoxAuthKerberos.AutoSize = true; + CheckBox checkBoxAuthKerberos1 = this.CheckBoxAuthKerberos; + point1 = new Point(16, 96); + Point point30 = point1; + checkBoxAuthKerberos1.Location = point30; + this.CheckBoxAuthKerberos.Name = "CheckBoxAuthKerberos"; + CheckBox checkBoxAuthKerberos2 = this.CheckBoxAuthKerberos; + size1 = new Size(69, 16); + Size size30 = size1; + checkBoxAuthKerberos2.Size = size30; + this.CheckBoxAuthKerberos.TabIndex = 3; + this.CheckBoxAuthKerberos.Text = "Kerberos"; + this.CheckBoxAuthKerberos.UseVisualStyleBackColor = true; + this.CheckBoxAuthNTLM.AutoSize = true; + CheckBox checkBoxAuthNtlm1 = this.CheckBoxAuthNTLM; + point1 = new Point(16, 72); + Point point31 = point1; + checkBoxAuthNtlm1.Location = point31; + this.CheckBoxAuthNTLM.Name = "CheckBoxAuthNTLM"; + CheckBox checkBoxAuthNtlm2 = this.CheckBoxAuthNTLM; + size1 = new Size(54, 16); + Size size31 = size1; + checkBoxAuthNtlm2.Size = size31; + this.CheckBoxAuthNTLM.TabIndex = 2; + this.CheckBoxAuthNTLM.Text = "NTLM"; + this.CheckBoxAuthNTLM.UseVisualStyleBackColor = true; + this.CheckBoxAuthDigest.AutoSize = true; + CheckBox checkBoxAuthDigest1 = this.CheckBoxAuthDigest; + point1 = new Point(16, 48); + Point point32 = point1; + checkBoxAuthDigest1.Location = point32; + this.CheckBoxAuthDigest.Name = "CheckBoxAuthDigest"; + CheckBox checkBoxAuthDigest2 = this.CheckBoxAuthDigest; + size1 = new Size(57, 16); + Size size32 = size1; + checkBoxAuthDigest2.Size = size32; + this.CheckBoxAuthDigest.TabIndex = 1; + this.CheckBoxAuthDigest.Text = "Digest"; + this.CheckBoxAuthDigest.UseVisualStyleBackColor = true; + this.CheckBoxAuthBasic.AutoSize = true; + CheckBox checkBoxAuthBasic1 = this.CheckBoxAuthBasic; + point1 = new Point(16, 24); + Point point33 = point1; + checkBoxAuthBasic1.Location = point33; + this.CheckBoxAuthBasic.Name = "CheckBoxAuthBasic"; + CheckBox checkBoxAuthBasic2 = this.CheckBoxAuthBasic; + size1 = new Size(53, 16); + Size size33 = size1; + checkBoxAuthBasic2.Size = size33; + this.CheckBoxAuthBasic.TabIndex = 0; + this.CheckBoxAuthBasic.Text = "Basic"; + this.CheckBoxAuthBasic.UseVisualStyleBackColor = true; + this.PreAuthWSSECheckBox.AutoSize = true; + CheckBox authWsseCheckBox1 = this.PreAuthWSSECheckBox; + point1 = new Point(8, 32); + Point point34 = point1; + authWsseCheckBox1.Location = point34; + this.PreAuthWSSECheckBox.Name = "PreAuthWSSECheckBox"; + CheckBox authWsseCheckBox2 = this.PreAuthWSSECheckBox; + size1 = new Size(180, 16); + Size size34 = size1; + authWsseCheckBox2.Size = size34; + this.PreAuthWSSECheckBox.TabIndex = 1; + this.PreAuthWSSECheckBox.Text = "Use WSSE PRE authentication"; + this.PreAuthWSSECheckBox.UseVisualStyleBackColor = true; + this.PreAuthBasicCheckBox.AutoSize = true; + CheckBox authBasicCheckBox1 = this.PreAuthBasicCheckBox; + point1 = new Point(8, 8); + Point point35 = point1; + authBasicCheckBox1.Location = point35; + this.PreAuthBasicCheckBox.Name = "PreAuthBasicCheckBox"; + CheckBox authBasicCheckBox2 = this.PreAuthBasicCheckBox; + size1 = new Size(179, 16); + Size size35 = size1; + authBasicCheckBox2.Size = size35; + this.PreAuthBasicCheckBox.TabIndex = 0; + this.PreAuthBasicCheckBox.Text = "Use Basic PRE authentication"; + this.PreAuthBasicCheckBox.UseVisualStyleBackColor = true; + this.EncodingTab.Controls.Add((Control) this.Label17); + this.EncodingTab.Controls.Add((Control) this.Label16); + this.EncodingTab.Controls.Add((Control) this.UploadFilenameNormalizationComboBox); + this.EncodingTab.Controls.Add((Control) this.DownloadFilenameNormalizationComboBox); + this.EncodingTab.Controls.Add((Control) this.Label7); + this.EncodingTab.Controls.Add((Control) this.CredentialEncodingComboBox); + this.EncodingTab.Controls.Add((Control) this.Label6); + this.EncodingTab.Controls.Add((Control) this.ResponseEncodingComboBox); + this.EncodingTab.Controls.Add((Control) this.Label3); + this.EncodingTab.Controls.Add((Control) this.RequestEncodingComboBox); + TabPage encodingTab1 = this.EncodingTab; + point1 = new Point(4, 22); + Point point36 = point1; + encodingTab1.Location = point36; + this.EncodingTab.Name = "EncodingTab"; + TabPage encodingTab2 = this.EncodingTab; + padding1 = new Padding(3); + Padding padding4 = padding1; + encodingTab2.Padding = padding4; + TabPage encodingTab3 = this.EncodingTab; + size1 = new Size(354, 321); + Size size36 = size1; + encodingTab3.Size = size36; + this.EncodingTab.TabIndex = 2; + this.EncodingTab.Text = "Encoding"; + this.EncodingTab.UseVisualStyleBackColor = true; + Label label17_1 = this.Label17; + point1 = new Point(8, 160); + Point point37 = point1; + label17_1.Location = point37; + this.Label17.Name = "Label17"; + Label label17_2 = this.Label17; + size1 = new Size(144, 32); + Size size37 = size1; + label17_2.Size = size37; + this.Label17.TabIndex = 9; + this.Label17.Text = "Upload Filename Normalization"; + Label label16_1 = this.Label16; + point1 = new Point(8, 128); + Point point38 = point1; + label16_1.Location = point38; + this.Label16.Name = "Label16"; + Label label16_2 = this.Label16; + size1 = new Size(144, 32); + Size size38 = size1; + label16_2.Size = size38; + this.Label16.TabIndex = 8; + this.Label16.Text = "Download Filename Normalization"; + this.UploadFilenameNormalizationComboBox.DropDownStyle = ComboBoxStyle.DropDownList; + this.UploadFilenameNormalizationComboBox.FormattingEnabled = true; + ComboBox normalizationComboBox1 = this.UploadFilenameNormalizationComboBox; + point1 = new Point(160, 160); + Point point39 = point1; + normalizationComboBox1.Location = point39; + this.UploadFilenameNormalizationComboBox.Name = "UploadFilenameNormalizationComboBox"; + ComboBox normalizationComboBox2 = this.UploadFilenameNormalizationComboBox; + size1 = new Size(136, 20); + Size size39 = size1; + normalizationComboBox2.Size = size39; + this.UploadFilenameNormalizationComboBox.TabIndex = 7; + this.DownloadFilenameNormalizationComboBox.DropDownStyle = ComboBoxStyle.DropDownList; + this.DownloadFilenameNormalizationComboBox.FormattingEnabled = true; + ComboBox normalizationComboBox3 = this.DownloadFilenameNormalizationComboBox; + point1 = new Point(160, 128); + Point point40 = point1; + normalizationComboBox3.Location = point40; + this.DownloadFilenameNormalizationComboBox.Name = "DownloadFilenameNormalizationComboBox"; + ComboBox normalizationComboBox4 = this.DownloadFilenameNormalizationComboBox; + size1 = new Size(136, 20); + Size size40 = size1; + normalizationComboBox4.Size = size40; + this.DownloadFilenameNormalizationComboBox.TabIndex = 6; + Label label7_1 = this.Label7; + point1 = new Point(8, 64); + Point point41 = point1; + label7_1.Location = point41; + this.Label7.Name = "Label7"; + Label label7_2 = this.Label7; + size1 = new Size(240, 32); + Size size41 = size1; + label7_2.Size = size41; + this.Label7.TabIndex = 4; + this.Label7.Text = "Username and Password encoding\r\n (for Basic/WSSE Preauthentication)"; + this.CredentialEncodingComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; + this.CredentialEncodingComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; + this.CredentialEncodingComboBox.FormattingEnabled = true; + this.CredentialEncodingComboBox.Items.AddRange(new object[3] + { + (object) "EUC-jp", + (object) "Shift-JIS", + (object) "UTF-8" + }); + ComboBox encodingComboBox1 = this.CredentialEncodingComboBox; + point1 = new Point(160, 96); + Point point42 = point1; + encodingComboBox1.Location = point42; + this.CredentialEncodingComboBox.Name = "CredentialEncodingComboBox"; + ComboBox encodingComboBox2 = this.CredentialEncodingComboBox; + size1 = new Size(136, 20); + Size size42 = size1; + encodingComboBox2.Size = size42; + this.CredentialEncodingComboBox.Sorted = true; + this.CredentialEncodingComboBox.TabIndex = 5; + this.Label6.AutoSize = true; + Label label6_1 = this.Label6; + point1 = new Point(8, 40); + Point point43 = point1; + label6_1.Location = point43; + this.Label6.Name = "Label6"; + Label label6_2 = this.Label6; + size1 = new Size(141, 12); + Size size43 = size1; + label6_2.Size = size43; + this.Label6.TabIndex = 2; + this.Label6.Text = "URI encoding for response"; + this.ResponseEncodingComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; + this.ResponseEncodingComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; + this.ResponseEncodingComboBox.FormattingEnabled = true; + this.ResponseEncodingComboBox.Items.AddRange(new object[3] + { + (object) "EUC-jp", + (object) "Shift-JIS", + (object) "UTF-8" + }); + ComboBox encodingComboBox3 = this.ResponseEncodingComboBox; + point1 = new Point(160, 40); + Point point44 = point1; + encodingComboBox3.Location = point44; + this.ResponseEncodingComboBox.Name = "ResponseEncodingComboBox"; + ComboBox encodingComboBox4 = this.ResponseEncodingComboBox; + size1 = new Size(136, 20); + Size size44 = size1; + encodingComboBox4.Size = size44; + this.ResponseEncodingComboBox.Sorted = true; + this.ResponseEncodingComboBox.TabIndex = 3; + this.Label3.AutoSize = true; + Label label3_1 = this.Label3; + point1 = new Point(8, 16); + Point point45 = point1; + label3_1.Location = point45; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(133, 12); + Size size45 = size1; + label3_2.Size = size45; + this.Label3.TabIndex = 0; + this.Label3.Text = "URI encoding for request"; + this.RequestEncodingComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; + this.RequestEncodingComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; + this.RequestEncodingComboBox.FormattingEnabled = true; + this.RequestEncodingComboBox.Items.AddRange(new object[3] + { + (object) "EUC-jp", + (object) "Shift-JIS", + (object) "UTF-8" + }); + ComboBox encodingComboBox5 = this.RequestEncodingComboBox; + point1 = new Point(160, 16); + Point point46 = point1; + encodingComboBox5.Location = point46; + this.RequestEncodingComboBox.Name = "RequestEncodingComboBox"; + ComboBox encodingComboBox6 = this.RequestEncodingComboBox; + size1 = new Size(136, 20); + Size size46 = size1; + encodingComboBox6.Size = size46; + this.RequestEncodingComboBox.Sorted = true; + this.RequestEncodingComboBox.TabIndex = 1; + this.AdvancedTabPage.Controls.Add((Control) this.DisableUploadResumeCheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.RequestWithoutLastSlash); + this.AdvancedTabPage.Controls.Add((Control) this.RedirectionCollectionOnly); + this.AdvancedTabPage.Controls.Add((Control) this.NotVeryfyRange); + this.AdvancedTabPage.Controls.Add((Control) this.Label8); + this.AdvancedTabPage.Controls.Add((Control) this.UploadCompressionComboBox); + this.AdvancedTabPage.Controls.Add((Control) this.FullUriDestCheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.DontUpdatePropertyCheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.NotExpect100CheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.NotReqDeflateCheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.EmptyPUTCheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.SendTranslateFCheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.NotReqGzipCheckBox); + this.AdvancedTabPage.Controls.Add((Control) this.CheckBox2); + this.AdvancedTabPage.Controls.Add((Control) this.CheckBox1); + TabPage advancedTabPage1 = this.AdvancedTabPage; + point1 = new Point(4, 22); + Point point47 = point1; + advancedTabPage1.Location = point47; + this.AdvancedTabPage.Name = "AdvancedTabPage"; + TabPage advancedTabPage2 = this.AdvancedTabPage; + padding1 = new Padding(3); + Padding padding5 = padding1; + advancedTabPage2.Padding = padding5; + TabPage advancedTabPage3 = this.AdvancedTabPage; + size1 = new Size(354, 321); + Size size47 = size1; + advancedTabPage3.Size = size47; + this.AdvancedTabPage.TabIndex = 3; + this.AdvancedTabPage.Text = "Advanced"; + this.AdvancedTabPage.UseVisualStyleBackColor = true; + this.DisableUploadResumeCheckBox.AutoSize = true; + CheckBox uploadResumeCheckBox1 = this.DisableUploadResumeCheckBox; + point1 = new Point(8, 256); + Point point48 = point1; + uploadResumeCheckBox1.Location = point48; + this.DisableUploadResumeCheckBox.Name = "DisableUploadResumeCheckBox"; + CheckBox uploadResumeCheckBox2 = this.DisableUploadResumeCheckBox; + size1 = new Size(146, 16); + Size size48 = size1; + uploadResumeCheckBox2.Size = size48; + this.DisableUploadResumeCheckBox.TabIndex = 10; + this.DisableUploadResumeCheckBox.Text = "Disable Upload Resume"; + this.DisableUploadResumeCheckBox.UseVisualStyleBackColor = true; + this.RequestWithoutLastSlash.AutoSize = true; + CheckBox withoutLastSlash1 = this.RequestWithoutLastSlash; + point1 = new Point(8, 232); + Point point49 = point1; + withoutLastSlash1.Location = point49; + this.RequestWithoutLastSlash.Name = "RequestWithoutLastSlash"; + CheckBox withoutLastSlash2 = this.RequestWithoutLastSlash; + size1 = new Size(219, 16); + Size size49 = size1; + withoutLastSlash2.Size = size49; + this.RequestWithoutLastSlash.TabIndex = 9; + this.RequestWithoutLastSlash.Text = "Request without last slash on MKCOL"; + this.RequestWithoutLastSlash.UseVisualStyleBackColor = true; + this.RedirectionCollectionOnly.AutoSize = true; + CheckBox redirectionCollectionOnly1 = this.RedirectionCollectionOnly; + point1 = new Point(8, 208); + Point point50 = point1; + redirectionCollectionOnly1.Location = point50; + this.RedirectionCollectionOnly.Name = "RedirectionCollectionOnly"; + CheckBox redirectionCollectionOnly2 = this.RedirectionCollectionOnly; + size1 = new Size(211, 16); + Size size50 = size1; + redirectionCollectionOnly2.Size = size50; + this.RedirectionCollectionOnly.TabIndex = 8; + this.RedirectionCollectionOnly.Text = "Follow redirection only for collection"; + this.RedirectionCollectionOnly.UseVisualStyleBackColor = true; + this.NotVeryfyRange.AutoSize = true; + CheckBox notVeryfyRange1 = this.NotVeryfyRange; + point1 = new Point(8, 184); + Point point51 = point1; + notVeryfyRange1.Location = point51; + this.NotVeryfyRange.Name = "NotVeryfyRange"; + CheckBox notVeryfyRange2 = this.NotVeryfyRange; + size1 = new Size(203, 16); + Size size51 = size1; + notVeryfyRange2.Size = size51; + this.NotVeryfyRange.TabIndex = 7; + this.NotVeryfyRange.Text = "Don't verify Content-Range header"; + this.NotVeryfyRange.UseVisualStyleBackColor = true; + this.Label8.AutoSize = true; + Label label8_1 = this.Label8; + point1 = new Point(8, 288); + Point point52 = point1; + label8_1.Location = point52; + this.Label8.Name = "Label8"; + Label label8_2 = this.Label8; + size1 = new Size(110, 12); + Size size52 = size1; + label8_2.Size = size52; + this.Label8.TabIndex = 11; + this.Label8.Text = "Upload Compression"; + this.UploadCompressionComboBox.DropDownStyle = ComboBoxStyle.DropDownList; + this.UploadCompressionComboBox.FormattingEnabled = true; + ComboBox compressionComboBox1 = this.UploadCompressionComboBox; + point1 = new Point(128, 288); + Point point53 = point1; + compressionComboBox1.Location = point53; + this.UploadCompressionComboBox.Name = "UploadCompressionComboBox"; + ComboBox compressionComboBox2 = this.UploadCompressionComboBox; + size1 = new Size(121, 20); + Size size53 = size1; + compressionComboBox2.Size = size53; + this.UploadCompressionComboBox.TabIndex = 12; + this.FullUriDestCheckBox.AutoSize = true; + CheckBox fullUriDestCheckBox1 = this.FullUriDestCheckBox; + point1 = new Point(8, 160); + Point point54 = point1; + fullUriDestCheckBox1.Location = point54; + this.FullUriDestCheckBox.Name = "FullUriDestCheckBox"; + CheckBox fullUriDestCheckBox2 = this.FullUriDestCheckBox; + size1 = new Size(217, 16); + Size size54 = size1; + fullUriDestCheckBox2.Size = size54; + this.FullUriDestCheckBox.TabIndex = 6; + this.FullUriDestCheckBox.Text = "Send full URI in \"Destination\" header"; + this.FullUriDestCheckBox.UseVisualStyleBackColor = true; + this.DontUpdatePropertyCheckBox.AutoSize = true; + CheckBox propertyCheckBox1 = this.DontUpdatePropertyCheckBox; + point1 = new Point(8, 136); + Point point55 = point1; + propertyCheckBox1.Location = point55; + this.DontUpdatePropertyCheckBox.Name = "DontUpdatePropertyCheckBox"; + CheckBox propertyCheckBox2 = this.DontUpdatePropertyCheckBox; + size1 = new Size(134, 16); + Size size55 = size1; + propertyCheckBox2.Size = size55; + this.DontUpdatePropertyCheckBox.TabIndex = 5; + this.DontUpdatePropertyCheckBox.Text = "Don't update property"; + this.DontUpdatePropertyCheckBox.UseVisualStyleBackColor = true; + this.NotExpect100CheckBox.AutoSize = true; + CheckBox expect100CheckBox1 = this.NotExpect100CheckBox; + point1 = new Point(8, 88); + Point point56 = point1; + expect100CheckBox1.Location = point56; + this.NotExpect100CheckBox.Name = "NotExpect100CheckBox"; + CheckBox expect100CheckBox2 = this.NotExpect100CheckBox; + size1 = new Size(256, 16); + Size size56 = size1; + expect100CheckBox2.Size = size56; + this.NotExpect100CheckBox.TabIndex = 3; + this.NotExpect100CheckBox.Text = "Don't request \"Expect: 100-Continue\" header"; + this.NotExpect100CheckBox.UseVisualStyleBackColor = true; + this.NotReqDeflateCheckBox.AutoSize = true; + CheckBox reqDeflateCheckBox1 = this.NotReqDeflateCheckBox; + point1 = new Point(8, 40); + Point point57 = point1; + reqDeflateCheckBox1.Location = point57; + this.NotReqDeflateCheckBox.Name = "NotReqDeflateCheckBox"; + CheckBox reqDeflateCheckBox2 = this.NotReqDeflateCheckBox; + size1 = new Size(197, 16); + Size size57 = size1; + reqDeflateCheckBox2.Size = size57; + this.NotReqDeflateCheckBox.TabIndex = 1; + this.NotReqDeflateCheckBox.Text = "Don't request deflate (zlib) coding"; + this.NotReqDeflateCheckBox.UseVisualStyleBackColor = true; + this.EmptyPUTCheckBox.AutoSize = true; + CheckBox emptyPutCheckBox1 = this.EmptyPUTCheckBox; + point1 = new Point(8, 112); + Point point58 = point1; + emptyPutCheckBox1.Location = point58; + this.EmptyPUTCheckBox.Name = "EmptyPUTCheckBox"; + CheckBox emptyPutCheckBox2 = this.EmptyPUTCheckBox; + size1 = new Size(245, 16); + Size size58 = size1; + emptyPutCheckBox2.Size = size58; + this.EmptyPUTCheckBox.TabIndex = 4; + this.EmptyPUTCheckBox.Text = "Always send empty PUT befor actural PUT"; + this.EmptyPUTCheckBox.UseVisualStyleBackColor = true; + this.SendTranslateFCheckBox.AutoSize = true; + CheckBox translateFcheckBox1 = this.SendTranslateFCheckBox; + point1 = new Point(8, 64); + Point point59 = point1; + translateFcheckBox1.Location = point59; + this.SendTranslateFCheckBox.Name = "SendTranslateFCheckBox"; + CheckBox translateFcheckBox2 = this.SendTranslateFCheckBox; + size1 = new Size(161, 16); + Size size59 = size1; + translateFcheckBox2.Size = size59; + this.SendTranslateFCheckBox.TabIndex = 2; + this.SendTranslateFCheckBox.Text = "Send \"Translate: f\" header"; + this.SendTranslateFCheckBox.UseVisualStyleBackColor = true; + this.NotReqGzipCheckBox.AutoSize = true; + CheckBox notReqGzipCheckBox1 = this.NotReqGzipCheckBox; + point1 = new Point(8, 16); + Point point60 = point1; + notReqGzipCheckBox1.Location = point60; + this.NotReqGzipCheckBox.Name = "NotReqGzipCheckBox"; + CheckBox notReqGzipCheckBox2 = this.NotReqGzipCheckBox; + size1 = new Size(153, 16); + Size size60 = size1; + notReqGzipCheckBox2.Size = size60; + this.NotReqGzipCheckBox.TabIndex = 0; + this.NotReqGzipCheckBox.Text = "Don't request gzip coding"; + this.NotReqGzipCheckBox.UseVisualStyleBackColor = true; + this.CheckBox2.AutoSize = true; + CheckBox checkBox2_1 = this.CheckBox2; + point1 = new Point(192, 152); + Point point61 = point1; + checkBox2_1.Location = point61; + this.CheckBox2.Name = "CheckBox2"; + CheckBox checkBox2_2 = this.CheckBox2; + size1 = new Size(156, 16); + Size size61 = size1; + checkBox2_2.Size = size61; + this.CheckBox2.TabIndex = 14; + this.CheckBox2.Text = "Don't use LOCK/UNLOCK"; + this.CheckBox2.UseVisualStyleBackColor = true; + this.CheckBox2.Visible = false; + this.CheckBox1.AutoSize = true; + CheckBox checkBox1_1 = this.CheckBox1; + point1 = new Point(192, 128); + Point point62 = point1; + checkBox1_1.Location = point62; + this.CheckBox1.Name = "CheckBox1"; + CheckBox checkBox1_2 = this.CheckBox1; + size1 = new Size(198, 16); + Size size62 = size1; + checkBox1_2.Size = size62; + this.CheckBox1.TabIndex = 13; + this.CheckBox1.Text = "Don't send with chunked encoding"; + this.CheckBox1.UseVisualStyleBackColor = true; + this.CheckBox1.Visible = false; + this.ProxyTabPage.Controls.Add((Control) this.ProxyUseDefaultCredential); + this.ProxyTabPage.Controls.Add((Control) this.Label15); + this.ProxyTabPage.Controls.Add((Control) this.Label14); + this.ProxyTabPage.Controls.Add((Control) this.Label13); + this.ProxyTabPage.Controls.Add((Control) this.Label12); + this.ProxyTabPage.Controls.Add((Control) this.ProxyPasswordTextBox); + this.ProxyTabPage.Controls.Add((Control) this.ProxyUsernameTextBox); + this.ProxyTabPage.Controls.Add((Control) this.ProxyBypassListTextBox); + this.ProxyTabPage.Controls.Add((Control) this.ProxyBypassLocalCheckBox); + this.ProxyTabPage.Controls.Add((Control) this.ProxyURITextBox); + this.ProxyTabPage.Controls.Add((Control) this.NoProxyRadio); + this.ProxyTabPage.Controls.Add((Control) this.SpecifyProxyRadio); + this.ProxyTabPage.Controls.Add((Control) this.DefaultProxyRadio); + TabPage proxyTabPage1 = this.ProxyTabPage; + point1 = new Point(4, 22); + Point point63 = point1; + proxyTabPage1.Location = point63; + this.ProxyTabPage.Name = "ProxyTabPage"; + TabPage proxyTabPage2 = this.ProxyTabPage; + size1 = new Size(354, 321); + Size size63 = size1; + proxyTabPage2.Size = size63; + this.ProxyTabPage.TabIndex = 4; + this.ProxyTabPage.Text = "Proxy"; + this.ProxyTabPage.UseVisualStyleBackColor = true; + this.ProxyUseDefaultCredential.AutoSize = true; + CheckBox defaultCredential1 = this.ProxyUseDefaultCredential; + point1 = new Point(96, 136); + Point point64 = point1; + defaultCredential1.Location = point64; + this.ProxyUseDefaultCredential.Name = "ProxyUseDefaultCredential"; + CheckBox defaultCredential2 = this.ProxyUseDefaultCredential; + size1 = new Size(201, 16); + Size size64 = size1; + defaultCredential2.Size = size64; + this.ProxyUseDefaultCredential.TabIndex = 12; + this.ProxyUseDefaultCredential.Text = "Integrated Windows Authentication"; + this.ProxyUseDefaultCredential.UseVisualStyleBackColor = true; + this.Label15.AutoSize = true; + Label label15_1 = this.Label15; + point1 = new Point(24, 64); + Point point65 = point1; + label15_1.Location = point65; + this.Label15.Name = "Label15"; + Label label15_2 = this.Label15; + size1 = new Size(60, 12); + Size size65 = size1; + label15_2.Size = size65; + this.Label15.TabIndex = 11; + this.Label15.Text = "Proxy URL"; + this.Label14.AutoSize = true; + Label label14_1 = this.Label14; + point1 = new Point(24, 112); + Point point66 = point1; + label14_1.Location = point66; + this.Label14.Name = "Label14"; + Label label14_2 = this.Label14; + size1 = new Size(63, 12); + Size size66 = size1; + label14_2.Size = size66; + this.Label14.TabIndex = 10; + this.Label14.Text = "Bypass list"; + this.Label13.AutoSize = true; + Label label13_1 = this.Label13; + point1 = new Point(24, 184); + Point point67 = point1; + label13_1.Location = point67; + this.Label13.Name = "Label13"; + Label label13_2 = this.Label13; + size1 = new Size(54, 12); + Size size67 = size1; + label13_2.Size = size67; + this.Label13.TabIndex = 9; + this.Label13.Text = "Password"; + this.Label12.AutoSize = true; + Label label12_1 = this.Label12; + point1 = new Point(24, 160); + Point point68 = point1; + label12_1.Location = point68; + this.Label12.Name = "Label12"; + Label label12_2 = this.Label12; + size1 = new Size(56, 12); + Size size68 = size1; + label12_2.Size = size68; + this.Label12.TabIndex = 8; + this.Label12.Text = "Username"; + this.ProxyPasswordTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox proxyPasswordTextBox1 = this.ProxyPasswordTextBox; + point1 = new Point(96, 184); + Point point69 = point1; + proxyPasswordTextBox1.Location = point69; + this.ProxyPasswordTextBox.Name = "ProxyPasswordTextBox"; + TextBox proxyPasswordTextBox2 = this.ProxyPasswordTextBox; + size1 = new Size(233, 19); + Size size69 = size1; + proxyPasswordTextBox2.Size = size69; + this.ProxyPasswordTextBox.TabIndex = 7; + this.ProxyUsernameTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox proxyUsernameTextBox1 = this.ProxyUsernameTextBox; + point1 = new Point(96, 160); + Point point70 = point1; + proxyUsernameTextBox1.Location = point70; + this.ProxyUsernameTextBox.Name = "ProxyUsernameTextBox"; + TextBox proxyUsernameTextBox2 = this.ProxyUsernameTextBox; + size1 = new Size(233, 19); + Size size70 = size1; + proxyUsernameTextBox2.Size = size70; + this.ProxyUsernameTextBox.TabIndex = 6; + this.ProxyBypassListTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox bypassListTextBox1 = this.ProxyBypassListTextBox; + point1 = new Point(96, 112); + Point point71 = point1; + bypassListTextBox1.Location = point71; + this.ProxyBypassListTextBox.Name = "ProxyBypassListTextBox"; + TextBox bypassListTextBox2 = this.ProxyBypassListTextBox; + size1 = new Size(233, 19); + Size size71 = size1; + bypassListTextBox2.Size = size71; + this.ProxyBypassListTextBox.TabIndex = 5; + this.ProxyBypassLocalCheckBox.AutoSize = true; + CheckBox bypassLocalCheckBox1 = this.ProxyBypassLocalCheckBox; + point1 = new Point(96, 88); + Point point72 = point1; + bypassLocalCheckBox1.Location = point72; + this.ProxyBypassLocalCheckBox.Name = "ProxyBypassLocalCheckBox"; + CheckBox bypassLocalCheckBox2 = this.ProxyBypassLocalCheckBox; + size1 = new Size(90, 16); + Size size72 = size1; + bypassLocalCheckBox2.Size = size72; + this.ProxyBypassLocalCheckBox.TabIndex = 4; + this.ProxyBypassLocalCheckBox.Text = "Bypass local"; + this.ProxyBypassLocalCheckBox.UseVisualStyleBackColor = true; + this.ProxyURITextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox proxyUriTextBox1 = this.ProxyURITextBox; + point1 = new Point(96, 64); + Point point73 = point1; + proxyUriTextBox1.Location = point73; + this.ProxyURITextBox.Name = "ProxyURITextBox"; + TextBox proxyUriTextBox2 = this.ProxyURITextBox; + size1 = new Size(233, 19); + Size size73 = size1; + proxyUriTextBox2.Size = size73; + this.ProxyURITextBox.TabIndex = 3; + this.NoProxyRadio.AutoSize = true; + RadioButton noProxyRadio1 = this.NoProxyRadio; + point1 = new Point(16, 208); + Point point74 = point1; + noProxyRadio1.Location = point74; + this.NoProxyRadio.Name = "NoProxyRadio"; + RadioButton noProxyRadio2 = this.NoProxyRadio; + size1 = new Size(70, 16); + Size size74 = size1; + noProxyRadio2.Size = size74; + this.NoProxyRadio.TabIndex = 2; + this.NoProxyRadio.Text = "No Proxy"; + this.NoProxyRadio.UseVisualStyleBackColor = true; + this.SpecifyProxyRadio.AutoSize = true; + RadioButton specifyProxyRadio1 = this.SpecifyProxyRadio; + point1 = new Point(16, 40); + Point point75 = point1; + specifyProxyRadio1.Location = point75; + this.SpecifyProxyRadio.Name = "SpecifyProxyRadio"; + RadioButton specifyProxyRadio2 = this.SpecifyProxyRadio; + size1 = new Size(94, 16); + Size size75 = size1; + specifyProxyRadio2.Size = size75; + this.SpecifyProxyRadio.TabIndex = 1; + this.SpecifyProxyRadio.Text = "Specify Proxy"; + this.SpecifyProxyRadio.UseVisualStyleBackColor = true; + this.DefaultProxyRadio.AutoSize = true; + this.DefaultProxyRadio.Checked = true; + RadioButton defaultProxyRadio1 = this.DefaultProxyRadio; + point1 = new Point(16, 16); + Point point76 = point1; + defaultProxyRadio1.Location = point76; + this.DefaultProxyRadio.Name = "DefaultProxyRadio"; + RadioButton defaultProxyRadio2 = this.DefaultProxyRadio; + size1 = new Size(93, 16); + Size size76 = size1; + defaultProxyRadio2.Size = size76; + this.DefaultProxyRadio.TabIndex = 0; + this.DefaultProxyRadio.TabStop = true; + this.DefaultProxyRadio.Text = "Default Proxy"; + this.DefaultProxyRadio.UseVisualStyleBackColor = true; + this.TimeoutTabPage.Controls.Add((Control) this.Label11); + this.TimeoutTabPage.Controls.Add((Control) this.Label10); + this.TimeoutTabPage.Controls.Add((Control) this.StreamTimeoutComboBox); + this.TimeoutTabPage.Controls.Add((Control) this.ConnectionTimeoutComboBox); + TabPage timeoutTabPage1 = this.TimeoutTabPage; + point1 = new Point(4, 22); + Point point77 = point1; + timeoutTabPage1.Location = point77; + this.TimeoutTabPage.Name = "TimeoutTabPage"; + TabPage timeoutTabPage2 = this.TimeoutTabPage; + size1 = new Size(354, 321); + Size size77 = size1; + timeoutTabPage2.Size = size77; + this.TimeoutTabPage.TabIndex = 5; + this.TimeoutTabPage.Text = "Timeout"; + this.TimeoutTabPage.UseVisualStyleBackColor = true; + this.Label11.AutoSize = true; + Label label11_1 = this.Label11; + point1 = new Point(16, 64); + Point point78 = point1; + label11_1.Location = point78; + this.Label11.Name = "Label11"; + Label label11_2 = this.Label11; + size1 = new Size(164, 12); + Size size78 = size1; + label11_2.Size = size78; + this.Label11.TabIndex = 2; + this.Label11.Text = "Stream Read Write Timeout [s]"; + this.Label10.AutoSize = true; + Label label10_1 = this.Label10; + point1 = new Point(16, 16); + Point point79 = point1; + label10_1.Location = point79; + this.Label10.Name = "Label10"; + Label label10_2 = this.Label10; + size1 = new Size(125, 12); + Size size79 = size1; + label10_2.Size = size79; + this.Label10.TabIndex = 0; + this.Label10.Text = "Connection Timeout [s]"; + this.StreamTimeoutComboBox.FormattingEnabled = true; + ComboBox streamTimeoutComboBox1 = this.StreamTimeoutComboBox; + point1 = new Point(72, 80); + Point point80 = point1; + streamTimeoutComboBox1.Location = point80; + this.StreamTimeoutComboBox.Name = "StreamTimeoutComboBox"; + ComboBox streamTimeoutComboBox2 = this.StreamTimeoutComboBox; + size1 = new Size(121, 20); + Size size80 = size1; + streamTimeoutComboBox2.Size = size80; + this.StreamTimeoutComboBox.TabIndex = 3; + this.ConnectionTimeoutComboBox.FormattingEnabled = true; + ComboBox connectionTimeoutComboBox1 = this.ConnectionTimeoutComboBox; + point1 = new Point(72, 32); + Point point81 = point1; + connectionTimeoutComboBox1.Location = point81; + this.ConnectionTimeoutComboBox.Name = "ConnectionTimeoutComboBox"; + ComboBox connectionTimeoutComboBox2 = this.ConnectionTimeoutComboBox; + size1 = new Size(121, 20); + Size size81 = size1; + connectionTimeoutComboBox2.Size = size81; + this.ConnectionTimeoutComboBox.TabIndex = 1; + this.TabPage1.Controls.Add((Control) this.HideUnencDirCheckBox); + this.TabPage1.Controls.Add((Control) this.HideUnencFileCheckBox); + this.TabPage1.Controls.Add((Control) this.ComboBoxEscapeString); + this.TabPage1.Controls.Add((Control) this.Label19); + this.TabPage1.Controls.Add((Control) this.EncryptKeyTextBox); + this.TabPage1.Controls.Add((Control) this.EncryptionCheck); + this.TabPage1.Controls.Add((Control) this.Label9); + this.TabPage1.Controls.Add((Control) this.Label20); + this.TabPage1.Controls.Add((Control) this.Label18); + this.TabPage1.Controls.Add((Control) this.SplitSizeComboBox); + this.TabPage1.Controls.Add((Control) this.AutoSplitCheckBox); + TabPage tabPage1_1 = this.TabPage1; + point1 = new Point(4, 22); + Point point82 = point1; + tabPage1_1.Location = point82; + this.TabPage1.Name = "TabPage1"; + TabPage tabPage1_2 = this.TabPage1; + size1 = new Size(354, 321); + Size size82 = size1; + tabPage1_2.Size = size82; + this.TabPage1.TabIndex = 6; + this.TabPage1.Text = "Special"; + this.TabPage1.UseVisualStyleBackColor = true; + this.HideUnencDirCheckBox.AutoSize = true; + CheckBox unencDirCheckBox1 = this.HideUnencDirCheckBox; + point1 = new Point(96, 80); + Point point83 = point1; + unencDirCheckBox1.Location = point83; + this.HideUnencDirCheckBox.Name = "HideUnencDirCheckBox"; + CheckBox unencDirCheckBox2 = this.HideUnencDirCheckBox; + size1 = new Size(166, 16); + Size size83 = size1; + unencDirCheckBox2.Size = size83; + this.HideUnencDirCheckBox.TabIndex = 4; + this.HideUnencDirCheckBox.Text = "Hide Unencrypted Directory"; + this.HideUnencDirCheckBox.UseVisualStyleBackColor = true; + this.HideUnencFileCheckBox.AutoSize = true; + CheckBox unencFileCheckBox1 = this.HideUnencFileCheckBox; + point1 = new Point(96, 64); + Point point84 = point1; + unencFileCheckBox1.Location = point84; + this.HideUnencFileCheckBox.Name = "HideUnencFileCheckBox"; + CheckBox unencFileCheckBox2 = this.HideUnencFileCheckBox; + size1 = new Size(138, 16); + Size size84 = size1; + unencFileCheckBox2.Size = size84; + this.HideUnencFileCheckBox.TabIndex = 3; + this.HideUnencFileCheckBox.Text = "Hide Unencrypted File"; + this.HideUnencFileCheckBox.UseVisualStyleBackColor = true; + this.ComboBoxEscapeString.DropDownStyle = ComboBoxStyle.DropDownList; + this.ComboBoxEscapeString.FormattingEnabled = true; + this.ComboBoxEscapeString.Items.AddRange(new object[7] + { + (object) "^_", + (object) ":D", + (object) ";)", + (object) "T-T", + (object) "orz", + (object) "ノシ", + (object) "(´・ω・)" + }); + ComboBox comboBoxEscapeString1 = this.ComboBoxEscapeString; + point1 = new Point(96, 184); + Point point85 = point1; + comboBoxEscapeString1.Location = point85; + this.ComboBoxEscapeString.Name = "ComboBoxEscapeString"; + ComboBox comboBoxEscapeString2 = this.ComboBoxEscapeString; + size1 = new Size(121, 20); + Size size85 = size1; + comboBoxEscapeString2.Size = size85; + this.ComboBoxEscapeString.TabIndex = 10; + this.Label19.AutoSize = true; + Label label19_1 = this.Label19; + point1 = new Point(64, 40); + Point point86 = point1; + label19_1.Location = point86; + this.Label19.Name = "Label19"; + Label label19_2 = this.Label19; + size1 = new Size(24, 12); + Size size86 = size1; + label19_2.Size = size86; + this.Label19.TabIndex = 1; + this.Label19.Text = "Key"; + TextBox encryptKeyTextBox1 = this.EncryptKeyTextBox; + point1 = new Point(96, 40); + Point point87 = point1; + encryptKeyTextBox1.Location = point87; + this.EncryptKeyTextBox.Name = "EncryptKeyTextBox"; + TextBox encryptKeyTextBox2 = this.EncryptKeyTextBox; + size1 = new Size(120, 19); + Size size87 = size1; + encryptKeyTextBox2.Size = size87; + this.EncryptKeyTextBox.TabIndex = 2; + this.EncryptKeyTextBox.UseSystemPasswordChar = true; + this.EncryptionCheck.AutoSize = true; + CheckBox encryptionCheck1 = this.EncryptionCheck; + point1 = new Point(8, 16); + Point point88 = point1; + encryptionCheck1.Location = point88; + this.EncryptionCheck.Name = "EncryptionCheck"; + CheckBox encryptionCheck2 = this.EncryptionCheck; + size1 = new Size(78, 16); + Size size88 = size1; + encryptionCheck2.Size = size88; + this.EncryptionCheck.TabIndex = 0; + this.EncryptionCheck.Text = "Encryption"; + this.EncryptionCheck.UseVisualStyleBackColor = true; + this.Label9.AutoSize = true; + Label label9_1 = this.Label9; + point1 = new Point(224, 136); + Point point89 = point1; + label9_1.Location = point89; + this.Label9.Name = "Label9"; + Label label9_2 = this.Label9; + size1 = new Size(25, 12); + Size size89 = size1; + label9_2.Size = size89; + this.Label9.TabIndex = 8; + this.Label9.Text = "MiB"; + this.Label20.AutoSize = true; + Label label20_1 = this.Label20; + point1 = new Point(16, 184); + Point point90 = point1; + label20_1.Location = point90; + this.Label20.Name = "Label20"; + Label label20_2 = this.Label20; + size1 = new Size(76, 12); + Size size90 = size1; + label20_2.Size = size90; + this.Label20.TabIndex = 9; + this.Label20.Text = "Escape String"; + this.Label18.AutoSize = true; + Label label18_1 = this.Label18; + point1 = new Point(24, 136); + Point point91 = point1; + label18_1.Location = point91; + this.Label18.Name = "Label18"; + Label label18_2 = this.Label18; + size1 = new Size(67, 12); + Size size91 = size1; + label18_2.Size = size91; + this.Label18.TabIndex = 6; + this.Label18.Text = "greater than"; + this.SplitSizeComboBox.FormattingEnabled = true; + ComboBox splitSizeComboBox1 = this.SplitSizeComboBox; + point1 = new Point(96, 136); + Point point92 = point1; + splitSizeComboBox1.Location = point92; + this.SplitSizeComboBox.Name = "SplitSizeComboBox"; + ComboBox splitSizeComboBox2 = this.SplitSizeComboBox; + size1 = new Size(121, 20); + Size size92 = size1; + splitSizeComboBox2.Size = size92; + this.SplitSizeComboBox.TabIndex = 7; + this.AutoSplitCheckBox.AutoSize = true; + CheckBox autoSplitCheckBox1 = this.AutoSplitCheckBox; + point1 = new Point(8, 112); + Point point93 = point1; + autoSplitCheckBox1.Location = point93; + this.AutoSplitCheckBox.Name = "AutoSplitCheckBox"; + CheckBox autoSplitCheckBox2 = this.AutoSplitCheckBox; + size1 = new Size(154, 16); + Size size93 = size1; + autoSplitCheckBox2.Size = size93; + this.AutoSplitCheckBox.TabIndex = 5; + this.AutoSplitCheckBox.Text = "Auto Split/Combine Files"; + this.AutoSplitCheckBox.UseVisualStyleBackColor = true; + this.AcceptButton = (IButtonControl) this.OKButton; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(377, 393); + this.ClientSize = size1; + this.Controls.Add((Control) this.TabControl1); + this.Controls.Add((Control) this.TestButton); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.OKButton); + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(393, 431); + this.MinimumSize = size1; + this.Name = nameof (ConnectionSettingForm); + this.ShowInTaskbar = false; + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Connection Setting"; + this.TabControl1.ResumeLayout(false); + this.GeneralTabPage.ResumeLayout(false); + this.GeneralTabPage.PerformLayout(); + this.AuthTabPage.ResumeLayout(false); + this.AuthTabPage.PerformLayout(); + this.GroupBox1.ResumeLayout(false); + this.GroupBoxTLS.ResumeLayout(false); + this.GroupBoxTLS.PerformLayout(); + this.GroupBoxAuthMethods.ResumeLayout(false); + this.GroupBoxAuthMethods.PerformLayout(); + this.EncodingTab.ResumeLayout(false); + this.EncodingTab.PerformLayout(); + this.AdvancedTabPage.ResumeLayout(false); + this.AdvancedTabPage.PerformLayout(); + this.ProxyTabPage.ResumeLayout(false); + this.ProxyTabPage.PerformLayout(); + this.TimeoutTabPage.ResumeLayout(false); + this.TimeoutTabPage.PerformLayout(); + this.TabPage1.ResumeLayout(false); + this.TabPage1.PerformLayout(); + this.ResumeLayout(false); + } + + internal virtual TextBox SettingNameTextBox + { + get + { + return this._SettingNameTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBox_TextChanged); + if (this._SettingNameTextBox != null) + this._SettingNameTextBox.TextChanged -= eventHandler; + this._SettingNameTextBox = value; + if (this._SettingNameTextBox == null) + return; + this._SettingNameTextBox.TextChanged += eventHandler; + } + } + + internal virtual TextBox URITextBox + { + get + { + return this._URITextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBox_TextChanged); + if (this._URITextBox != null) + this._URITextBox.TextChanged -= eventHandler; + this._URITextBox = value; + if (this._URITextBox == null) + return; + this._URITextBox.TextChanged += eventHandler; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.OKButton_Click); + if (this._OKButton != null) + this._OKButton.Click -= eventHandler; + this._OKButton = value; + if (this._OKButton == null) + return; + this._OKButton.Click += eventHandler; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._m_CancelButton = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual TextBox UserNameTextBox + { + get + { + return this._UserNameTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UserNameTextBox = value; + } + } + + internal virtual TextBox PasswordTextBox + { + get + { + return this._PasswordTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._PasswordTextBox = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual CheckBox DontSaveCheckBox + { + get + { + return this._DontSaveCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._DontSaveCheckBox != null) + this._DontSaveCheckBox.CheckedChanged -= eventHandler; + this._DontSaveCheckBox = value; + if (this._DontSaveCheckBox == null) + return; + this._DontSaveCheckBox.CheckedChanged += eventHandler; + } + } + + internal virtual Button TestButton + { + get + { + return this._TestButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TestButton_Click); + if (this._TestButton != null) + this._TestButton.Click -= eventHandler; + this._TestButton = value; + if (this._TestButton == null) + return; + this._TestButton.Click += eventHandler; + } + } + + internal virtual TabControl TabControl1 + { + get + { + return this._TabControl1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TabControl1 = value; + } + } + + internal virtual TabPage GeneralTabPage + { + get + { + return this._GeneralTabPage; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GeneralTabPage = value; + } + } + + internal virtual TabPage AdvancedTabPage + { + get + { + return this._AdvancedTabPage; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._AdvancedTabPage = value; + } + } + + internal virtual CheckBox CheckBox1 + { + get + { + return this._CheckBox1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBox1 = value; + } + } + + internal virtual CheckBox CheckBox2 + { + get + { + return this._CheckBox2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBox2 = value; + } + } + + internal virtual CheckBox NotReqGzipCheckBox + { + get + { + return this._NotReqGzipCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NotReqGzipCheckBox = value; + } + } + + internal virtual CheckBox SendTranslateFCheckBox + { + get + { + return this._SendTranslateFCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SendTranslateFCheckBox = value; + } + } + + internal virtual CheckBox EmptyPUTCheckBox + { + get + { + return this._EmptyPUTCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._EmptyPUTCheckBox = value; + } + } + + internal virtual TabPage AuthTabPage + { + get + { + return this._AuthTabPage; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._AuthTabPage = value; + } + } + + internal virtual CheckBox PreAuthBasicCheckBox + { + get + { + return this._PreAuthBasicCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._PreAuthBasicCheckBox != null) + this._PreAuthBasicCheckBox.CheckedChanged -= eventHandler; + this._PreAuthBasicCheckBox = value; + if (this._PreAuthBasicCheckBox == null) + return; + this._PreAuthBasicCheckBox.CheckedChanged += eventHandler; + } + } + + internal virtual TabPage EncodingTab + { + get + { + return this._EncodingTab; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._EncodingTab = value; + } + } + + internal virtual Label Label6 + { + get + { + return this._Label6; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label6 = value; + } + } + + internal virtual ComboBox ResponseEncodingComboBox + { + get + { + return this._ResponseEncodingComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ResponseEncodingComboBox = value; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + internal virtual ComboBox RequestEncodingComboBox + { + get + { + return this._RequestEncodingComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._RequestEncodingComboBox = value; + } + } + + internal virtual CheckBox PreAuthWSSECheckBox + { + get + { + return this._PreAuthWSSECheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._PreAuthWSSECheckBox != null) + this._PreAuthWSSECheckBox.CheckedChanged -= eventHandler; + this._PreAuthWSSECheckBox = value; + if (this._PreAuthWSSECheckBox == null) + return; + this._PreAuthWSSECheckBox.CheckedChanged += eventHandler; + } + } + + internal virtual Label Label7 + { + get + { + return this._Label7; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label7 = value; + } + } + + internal virtual ComboBox CredentialEncodingComboBox + { + get + { + return this._CredentialEncodingComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CredentialEncodingComboBox = value; + } + } + + internal virtual TabPage ProxyTabPage + { + get + { + return this._ProxyTabPage; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ProxyTabPage = value; + } + } + + internal virtual CheckBox NotReqDeflateCheckBox + { + get + { + return this._NotReqDeflateCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NotReqDeflateCheckBox = value; + } + } + + internal virtual CheckBox UseDefaultCredentialCheckBox + { + get + { + return this._UseDefaultCredentialCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._UseDefaultCredentialCheckBox != null) + this._UseDefaultCredentialCheckBox.CheckedChanged -= eventHandler; + this._UseDefaultCredentialCheckBox = value; + if (this._UseDefaultCredentialCheckBox == null) + return; + this._UseDefaultCredentialCheckBox.CheckedChanged += eventHandler; + } + } + + internal virtual CheckBox NotExpect100CheckBox + { + get + { + return this._NotExpect100CheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NotExpect100CheckBox = value; + } + } + + internal virtual TabPage TimeoutTabPage + { + get + { + return this._TimeoutTabPage; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TimeoutTabPage = value; + } + } + + internal virtual ComboBox ConnectionTimeoutComboBox + { + get + { + return this._ConnectionTimeoutComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ConnectionTimeoutComboBox = value; + } + } + + internal virtual ComboBox StreamTimeoutComboBox + { + get + { + return this._StreamTimeoutComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._StreamTimeoutComboBox = value; + } + } + + internal virtual Label Label11 + { + get + { + return this._Label11; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label11 = value; + } + } + + internal virtual Label Label10 + { + get + { + return this._Label10; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label10 = value; + } + } + + internal virtual RadioButton NoProxyRadio + { + get + { + return this._NoProxyRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._NoProxyRadio != null) + this._NoProxyRadio.CheckedChanged -= eventHandler; + this._NoProxyRadio = value; + if (this._NoProxyRadio == null) + return; + this._NoProxyRadio.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton SpecifyProxyRadio + { + get + { + return this._SpecifyProxyRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._SpecifyProxyRadio != null) + this._SpecifyProxyRadio.CheckedChanged -= eventHandler; + this._SpecifyProxyRadio = value; + if (this._SpecifyProxyRadio == null) + return; + this._SpecifyProxyRadio.CheckedChanged += eventHandler; + } + } + + internal virtual RadioButton DefaultProxyRadio + { + get + { + return this._DefaultProxyRadio; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._DefaultProxyRadio != null) + this._DefaultProxyRadio.CheckedChanged -= eventHandler; + this._DefaultProxyRadio = value; + if (this._DefaultProxyRadio == null) + return; + this._DefaultProxyRadio.CheckedChanged += eventHandler; + } + } + + internal virtual CheckBox ProxyBypassLocalCheckBox + { + get + { + return this._ProxyBypassLocalCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ProxyBypassLocalCheckBox = value; + } + } + + internal virtual TextBox ProxyURITextBox + { + get + { + return this._ProxyURITextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ProxyURITextBox = value; + } + } + + internal virtual Label Label15 + { + get + { + return this._Label15; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label15 = value; + } + } + + internal virtual Label Label14 + { + get + { + return this._Label14; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label14 = value; + } + } + + internal virtual Label Label13 + { + get + { + return this._Label13; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label13 = value; + } + } + + internal virtual Label Label12 + { + get + { + return this._Label12; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label12 = value; + } + } + + internal virtual TextBox ProxyPasswordTextBox + { + get + { + return this._ProxyPasswordTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ProxyPasswordTextBox = value; + } + } + + internal virtual TextBox ProxyUsernameTextBox + { + get + { + return this._ProxyUsernameTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ProxyUsernameTextBox = value; + } + } + + internal virtual TextBox ProxyBypassListTextBox + { + get + { + return this._ProxyBypassListTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ProxyBypassListTextBox = value; + } + } + + internal virtual CheckBox ProxyUseDefaultCredential + { + get + { + return this._ProxyUseDefaultCredential; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._ProxyUseDefaultCredential != null) + this._ProxyUseDefaultCredential.CheckedChanged -= eventHandler; + this._ProxyUseDefaultCredential = value; + if (this._ProxyUseDefaultCredential == null) + return; + this._ProxyUseDefaultCredential.CheckedChanged += eventHandler; + } + } + + internal virtual CheckBox DontUpdatePropertyCheckBox + { + get + { + return this._DontUpdatePropertyCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DontUpdatePropertyCheckBox = value; + } + } + + internal virtual CheckBox FullUriDestCheckBox + { + get + { + return this._FullUriDestCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._FullUriDestCheckBox = value; + } + } + + internal virtual Label Label16 + { + get + { + return this._Label16; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label16 = value; + } + } + + internal virtual ComboBox UploadFilenameNormalizationComboBox + { + get + { + return this._UploadFilenameNormalizationComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UploadFilenameNormalizationComboBox = value; + } + } + + internal virtual ComboBox DownloadFilenameNormalizationComboBox + { + get + { + return this._DownloadFilenameNormalizationComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DownloadFilenameNormalizationComboBox = value; + } + } + + internal virtual Label Label17 + { + get + { + return this._Label17; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label17 = value; + } + } + + internal virtual CheckBox CheckBoxAuthWSSE + { + get + { + return this._CheckBoxAuthWSSE; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxAuthWSSE = value; + } + } + + internal virtual CheckBox CheckBoxAuthNegotiate + { + get + { + return this._CheckBoxAuthNegotiate; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxAuthNegotiate = value; + } + } + + internal virtual CheckBox CheckBoxAuthKerberos + { + get + { + return this._CheckBoxAuthKerberos; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxAuthKerberos = value; + } + } + + internal virtual CheckBox CheckBoxAuthNTLM + { + get + { + return this._CheckBoxAuthNTLM; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxAuthNTLM = value; + } + } + + internal virtual CheckBox CheckBoxAuthDigest + { + get + { + return this._CheckBoxAuthDigest; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxAuthDigest = value; + } + } + + internal virtual CheckBox CheckBoxAuthBasic + { + get + { + return this._CheckBoxAuthBasic; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxAuthBasic = value; + } + } + + internal virtual GroupBox GroupBoxAuthMethods + { + get + { + return this._GroupBoxAuthMethods; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBoxAuthMethods = value; + } + } + + internal virtual Label Label8 + { + get + { + return this._Label8; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label8 = value; + } + } + + internal virtual ComboBox UploadCompressionComboBox + { + get + { + return this._UploadCompressionComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UploadCompressionComboBox = value; + } + } + + internal virtual CheckBox NotVeryfyRange + { + get + { + return this._NotVeryfyRange; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._NotVeryfyRange = value; + } + } + + internal virtual CheckBox RedirectionCollectionOnly + { + get + { + return this._RedirectionCollectionOnly; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._RedirectionCollectionOnly = value; + } + } + + internal virtual TabPage TabPage1 + { + get + { + return this._TabPage1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TabPage1 = value; + } + } + + internal virtual Label Label9 + { + get + { + return this._Label9; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label9 = value; + } + } + + internal virtual Label Label18 + { + get + { + return this._Label18; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label18 = value; + } + } + + internal virtual ComboBox SplitSizeComboBox + { + get + { + return this._SplitSizeComboBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._SplitSizeComboBox = value; + } + } + + internal virtual CheckBox AutoSplitCheckBox + { + get + { + return this._AutoSplitCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._AutoSplitCheckBox != null) + this._AutoSplitCheckBox.CheckedChanged -= eventHandler; + this._AutoSplitCheckBox = value; + if (this._AutoSplitCheckBox == null) + return; + this._AutoSplitCheckBox.CheckedChanged += eventHandler; + } + } + + internal virtual Label Label19 + { + get + { + return this._Label19; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label19 = value; + } + } + + internal virtual TextBox EncryptKeyTextBox + { + get + { + return this._EncryptKeyTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._EncryptKeyTextBox = value; + } + } + + internal virtual CheckBox EncryptionCheck + { + get + { + return this._EncryptionCheck; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CheckedChanged); + if (this._EncryptionCheck != null) + this._EncryptionCheck.CheckedChanged -= eventHandler; + this._EncryptionCheck = value; + if (this._EncryptionCheck == null) + return; + this._EncryptionCheck.CheckedChanged += eventHandler; + } + } + + internal virtual CheckBox CheckBoxAuthPassport + { + get + { + return this._CheckBoxAuthPassport; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxAuthPassport = value; + } + } + + internal virtual Label Label20 + { + get + { + return this._Label20; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label20 = value; + } + } + + internal virtual ComboBox ComboBoxEscapeString + { + get + { + return this._ComboBoxEscapeString; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ComboBoxEscapeString = value; + } + } + + internal virtual GroupBox GroupBoxTLS + { + get + { + return this._GroupBoxTLS; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBoxTLS = value; + } + } + + internal virtual CheckBox CheckBoxTLS12 + { + get + { + return this._CheckBoxTLS12; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxTLS12 = value; + } + } + + internal virtual CheckBox CheckBoxTLS11 + { + get + { + return this._CheckBoxTLS11; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxTLS11 = value; + } + } + + internal virtual CheckBox CheckBoxTLS10 + { + get + { + return this._CheckBoxTLS10; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxTLS10 = value; + } + } + + internal virtual CheckBox CheckBoxSSL30 + { + get + { + return this._CheckBoxSSL30; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CheckBoxSSL30 = value; + } + } + + internal virtual CheckBox HideUnencDirCheckBox + { + get + { + return this._HideUnencDirCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._HideUnencDirCheckBox = value; + } + } + + internal virtual CheckBox HideUnencFileCheckBox + { + get + { + return this._HideUnencFileCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._HideUnencFileCheckBox = value; + } + } + + internal virtual Button SelectClientCertButton + { + get + { + return this._SelectClientCertButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SelectClientCertButton_Click); + if (this._SelectClientCertButton != null) + this._SelectClientCertButton.Click -= eventHandler; + this._SelectClientCertButton = value; + if (this._SelectClientCertButton == null) + return; + this._SelectClientCertButton.Click += eventHandler; + } + } + + internal virtual ListBox ClientCertificateListBox + { + get + { + return this._ClientCertificateListBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ClientCertificateListBox = value; + } + } + + internal virtual GroupBox GroupBox1 + { + get + { + return this._GroupBox1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBox1 = value; + } + } + + internal virtual CheckBox RequestWithoutLastSlash + { + get + { + return this._RequestWithoutLastSlash; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._RequestWithoutLastSlash = value; + } + } + + internal virtual CheckBox DisableUploadResumeCheckBox + { + get + { + return this._DisableUploadResumeCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DisableUploadResumeCheckBox = value; + } + } + + private void ConnectionSettingForm_Load(object sender, EventArgs e) + { + this.Icon = ConnectionSetting.GetDefaultFavicon(); + List stringList = new List(); + EncodingInfo[] encodings = Encoding.GetEncodings(); + int index = 0; + while (index < encodings.Length) + { + EncodingInfo encodingInfo = encodings[index]; + try + { + stringList.Add(encodingInfo.Name); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + checked { ++index; } + } + string[] array = new string[checked (stringList.Count - 1 + 1)]; + stringList.CopyTo(array); + this.RequestEncodingComboBox.Items.AddRange((object[]) array); + this.ResponseEncodingComboBox.Items.AddRange((object[]) array); + this.CredentialEncodingComboBox.Items.AddRange((object[]) array); + this.DownloadFilenameNormalizationComboBox.Items.AddRange((object[]) System.Enum.GetNames(typeof (UCSNormalization))); + this.UploadFilenameNormalizationComboBox.Items.AddRange((object[]) System.Enum.GetNames(typeof (UCSNormalization))); + this.UploadCompressionComboBox.Items.AddRange((object[]) new string[3] + { + "None", + "GZip", + "Deflate" + }); + string[] strArray = new string[11] + { + "1", + "2", + "5", + "10", + "20", + "30", + "60", + "120", + "300", + "600", + "1800" + }; + this.ConnectionTimeoutComboBox.Items.AddRange((object[]) strArray); + this.StreamTimeoutComboBox.Items.AddRange((object[]) strArray); + this.SplitSizeComboBox.Items.AddRange((object[]) new string[9] + { + "1", + "2", + "5", + "10", + "20", + "50", + "100", + "200", + "500" + }); + ConnectionSetting connectionSetting = (ConnectionSetting) this.Tag ?? new ConnectionSetting(); + this.SettingNameTextBox.Text = connectionSetting.Name; + this.URITextBox.Text = (object) connectionSetting.TargetUri != null ? connectionSetting.TargetUri.ToString() : "http://"; + this.UseDefaultCredentialCheckBox.Checked = connectionSetting.UseDefaultCredential; + this.DontSaveCheckBox.Checked = connectionSetting.DontSave; + if (!this.DontSaveCheckBox.Checked) + { + this.UserNameTextBox.Text = connectionSetting.PersistUserName; + this.PasswordTextBox.Text = connectionSetting.PersistPassword; + } + switch (connectionSetting.Proxy) + { + case ProxyType.Specify: + this.SpecifyProxyRadio.Checked = true; + this.ProxyURITextBox.Text = connectionSetting.ProxyUri.ToString(); + this.ProxyBypassListTextBox.Text = string.Join("; ", connectionSetting.ProxyByPassList); + this.ProxyBypassLocalCheckBox.Checked = connectionSetting.ProxyByPassLocal; + this.ProxyUseDefaultCredential.Checked = connectionSetting.ProxyUseDefaultCredential; + this.ProxyUsernameTextBox.Text = connectionSetting.ProxyUserName; + this.ProxyPasswordTextBox.Text = connectionSetting.ProxyPassword; + break; + case ProxyType.NoProxy: + this.NoProxyRadio.Checked = true; + break; + default: + this.DefaultProxyRadio.Checked = true; + break; + } + this.PreAuthBasicCheckBox.Checked = connectionSetting.UsePreAuthentication_Basic; + this.PreAuthWSSECheckBox.Checked = connectionSetting.UsePreAuthentication_WSSE; + this.certlist.AddRange((IEnumerable) connectionSetting.ClientCertificates.ToArray()); + this.UpdateClientcertListBox(); + if (connectionSetting.AuthModules.Length == 0) + { + this.CheckBoxAuthBasic.Checked = true; + this.CheckBoxAuthDigest.Checked = true; + this.CheckBoxAuthNTLM.Checked = true; + this.CheckBoxAuthKerberos.Checked = true; + this.CheckBoxAuthNegotiate.Checked = true; + this.CheckBoxAuthWSSE.Checked = true; + this.CheckBoxAuthPassport.Checked = true; + } + else + { + string lowerInvariant = string.Join(",", connectionSetting.AuthModules).ToLowerInvariant(); + this.CheckBoxAuthBasic.Checked = lowerInvariant.Contains("basic"); + this.CheckBoxAuthDigest.Checked = lowerInvariant.Contains("digest"); + this.CheckBoxAuthNTLM.Checked = lowerInvariant.Contains("ntlm"); + this.CheckBoxAuthKerberos.Checked = lowerInvariant.Contains("kerberos"); + this.CheckBoxAuthNegotiate.Checked = lowerInvariant.Contains("negotiate"); + this.CheckBoxAuthWSSE.Checked = lowerInvariant.Contains("wsse"); + this.CheckBoxAuthPassport.Checked = lowerInvariant.Contains("passport"); + } + this.CheckBoxSSL30.Checked = (connectionSetting.DisableTlsVersions & SslProtocols.Ssl3) != SslProtocols.None; + this.CheckBoxTLS10.Checked = (connectionSetting.DisableTlsVersions & SslProtocols.Tls) != SslProtocols.None; + this.CheckBoxTLS11.Checked = (connectionSetting.DisableTlsVersions & SslProtocols.Tls11) != SslProtocols.None; + this.CheckBoxTLS12.Checked = (connectionSetting.DisableTlsVersions & SslProtocols.Tls12) != SslProtocols.None; + this.RequestEncodingComboBox.Text = connectionSetting.URIRequestEncoding; + this.ResponseEncodingComboBox.Text = connectionSetting.URIResponseEncoding; + this.CredentialEncodingComboBox.Text = connectionSetting.CredentialEncoding; + this.DownloadFilenameNormalizationComboBox.SelectedItem = (object) connectionSetting.DownloadFilenameNormalization.ToString(); + this.UploadFilenameNormalizationComboBox.SelectedItem = (object) connectionSetting.UploadFilenameNormalization.ToString(); + this.NotReqGzipCheckBox.Checked = connectionSetting.DontRequestGzip; + this.NotReqDeflateCheckBox.Checked = connectionSetting.DontRequestDeflate; + this.SendTranslateFCheckBox.Checked = connectionSetting.RequestTranslatef; + this.NotExpect100CheckBox.Checked = connectionSetting.DontExpect100; + this.EmptyPUTCheckBox.Checked = connectionSetting.SendEmptyPUT; + this.DontUpdatePropertyCheckBox.Checked = connectionSetting.DontUpdateProperty; + this.FullUriDestCheckBox.Checked = connectionSetting.UseFullUriInDestinationHeader; + this.NotVeryfyRange.Checked = connectionSetting.DontVerifyContentRange; + this.RedirectionCollectionOnly.Checked = connectionSetting.RedirectionCollectionOnly; + this.UploadCompressionComboBox.Text = connectionSetting.UploadCompression; + this.RequestWithoutLastSlash.Checked = connectionSetting.RemoveLastSlashOnMKCOL; + this.DisableUploadResumeCheckBox.Checked = connectionSetting.DisableUploadResume; + ComboBox connectionTimeoutComboBox = this.ConnectionTimeoutComboBox; + double num = (double) connectionSetting.ConnectTimeout / 1000.0; + string str1 = num.ToString(); + connectionTimeoutComboBox.Text = str1; + ComboBox streamTimeoutComboBox = this.StreamTimeoutComboBox; + num = (double) connectionSetting.ReadWriteTimeout / 1000.0; + string str2 = num.ToString(); + streamTimeoutComboBox.Text = str2; + this.EncryptionCheck.Checked = connectionSetting.UseEncryption; + this.EncryptKeyTextBox.Text = connectionSetting.EncryptionKey; + this.AutoSplitCheckBox.Checked = connectionSetting.AutoSplit; + this.SplitSizeComboBox.Text = connectionSetting.SplitSizeMB.ToString(); + this.ComboBoxEscapeString.Text = connectionSetting.EscapeString; + this.HideUnencFileCheckBox.Checked = connectionSetting.HideUnencryptedFile; + this.HideUnencDirCheckBox.Checked = connectionSetting.HideUnencryptedDirectory; + this.UpdateEnabled(); + } + + private void TextBox_TextChanged(object sender, EventArgs e) + { + this.UpdateEnabled(); + } + + private void CheckedChanged(object sender, EventArgs e) + { + this.UpdateEnabled(); + } + + private void TestButton_Click(object sender, EventArgs e) + { + ConnectionSettingBase connectionSettingBase = (ConnectionSettingBase) this.MakeSetting(); + if (connectionSettingBase == null) + return; + int num = (int) new ConnectionTestForm() + { + TargetUri = this.URITextBox.Text, + Username = this.UserNameTextBox.Text, + Password = this.PasswordTextBox.Text, + Setting = ((ConnectionSetting) connectionSettingBase) + }.ShowDialog(); + } + + private void OKButton_Click(object sender, EventArgs e) + { + ConnectionSetting connectionSetting = this.MakeSetting(); + if (connectionSetting == null) + return; + this.Tag = (object) connectionSetting; + this.DialogResult = DialogResult.OK; + } + + private ConnectionSetting MakeSetting() + { + Uri result1 = (Uri) null; + if (!Uri.TryCreate(this.URITextBox.Text, UriKind.Absolute, out result1)) + { + int num = (int) MessageBox.Show("Enter valid URI."); + this.URITextBox.Focus(); + return (ConnectionSetting) null; + } + if (Operators.CompareString(result1.Scheme, Uri.UriSchemeHttp, false) != 0 && Operators.CompareString(result1.Scheme, Uri.UriSchemeHttps, false) != 0) + { + int num = (int) MessageBox.Show("Unsupported scheme"); + this.URITextBox.Focus(); + return (ConnectionSetting) null; + } + if (result1.UserInfo.Length > 0 || result1.Query.Length > 0 || result1.Fragment.Length > 0) + { + int num = (int) MessageBox.Show("Enter valid URI.\r\nuserinfo, query, or fragment are not supported on this scheme."); + this.URITextBox.Focus(); + return (ConnectionSetting) null; + } + if (result1.Host.Length == 0) + { + int num = (int) MessageBox.Show("Enter valid URI.\r\nhost are required on this scheme."); + this.URITextBox.Focus(); + return (ConnectionSetting) null; + } + int result2; + ConnectionSetting connectionSetting1; + if (!this.UseDefaultCredentialCheckBox.Checked) + { + if (!this.DontSaveCheckBox.Checked) + { + try + { + result2 = this.UserNameTextBox.Text.IndexOf("\\"); + NetworkCredential networkCredential = result2 < 0 ? new NetworkCredential(this.UserNameTextBox.Text, this.PasswordTextBox.Text) : new NetworkCredential(this.UserNameTextBox.Text.Substring(checked (result2 + 1)), this.PasswordTextBox.Text, this.UserNameTextBox.Text.Substring(0, result2)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Enter valid username and password."); + this.UserNameTextBox.Focus(); + connectionSetting1 = (ConnectionSetting) null; + ProjectData.ClearProjectError(); + goto label_78; + } + } + } + if (!int.TryParse(this.ConnectionTimeoutComboBox.Text, out result2)) + { + int num = (int) MessageBox.Show("Enter valid number."); + this.ConnectionTimeoutComboBox.Focus(); + return (ConnectionSetting) null; + } + if (!int.TryParse(this.StreamTimeoutComboBox.Text, out result2)) + { + int num = (int) MessageBox.Show("Enter valid number."); + this.StreamTimeoutComboBox.Focus(); + return (ConnectionSetting) null; + } + if (!int.TryParse(this.SplitSizeComboBox.Text, out result2)) + { + if (this.AutoSplitCheckBox.Checked) + { + int num = (int) MessageBox.Show("Enter valid number."); + this.SplitSizeComboBox.Focus(); + return (ConnectionSetting) null; + } + this.SplitSizeComboBox.SelectedIndex = 0; + } + ConnectionSetting connectionSetting2 = new ConnectionSetting(); + connectionSetting2.Name = this.SettingNameTextBox.Text; + connectionSetting2.TargetUri = result1; + connectionSetting2.UseDefaultCredential = this.UseDefaultCredentialCheckBox.Checked; + if (connectionSetting2.UseDefaultCredential) + connectionSetting2.DontSave = true; + else + connectionSetting2.DontSave = this.DontSaveCheckBox.Checked; + if (connectionSetting2.DontSave) + connectionSetting2.SetUserPass("", ""); + else + connectionSetting2.SetUserPass(this.UserNameTextBox.Text, this.PasswordTextBox.Text); + connectionSetting2.PersistUserPass(); + connectionSetting2.ClientCertificates.Clear(); + connectionSetting2.ClientCertificates.AddRange((IEnumerable) this.certlist.ToArray()); + connectionSetting2.UsePreAuthentication_Basic = this.PreAuthBasicCheckBox.Checked; + connectionSetting2.UsePreAuthentication_WSSE = this.PreAuthWSSECheckBox.Checked; + List stringList = new List(); + if (this.CheckBoxAuthBasic.Checked) + stringList.Add("Basic"); + if (this.CheckBoxAuthDigest.Checked) + stringList.Add("Digest"); + if (this.CheckBoxAuthNTLM.Checked) + stringList.Add("NTLM"); + if (this.CheckBoxAuthKerberos.Checked) + stringList.Add("Kerberos"); + if (this.CheckBoxAuthNegotiate.Checked) + stringList.Add("Negotiate"); + if (this.CheckBoxAuthWSSE.Checked) + stringList.Add("WSSE"); + if (this.CheckBoxAuthPassport.Checked) + stringList.Add("Passport"); + if (stringList.Count == 0) + connectionSetting2.AuthModules = new string[1] + { + "None" + }; + else + connectionSetting2.AuthModules = stringList.ToArray(); + connectionSetting2.DisableTlsVersions = SslProtocols.None; + if (this.CheckBoxSSL30.Checked) + connectionSetting2.DisableTlsVersions = connectionSetting2.DisableTlsVersions | SslProtocols.Ssl3; + if (this.CheckBoxTLS10.Checked) + connectionSetting2.DisableTlsVersions = connectionSetting2.DisableTlsVersions | SslProtocols.Tls; + if (this.CheckBoxTLS11.Checked) + connectionSetting2.DisableTlsVersions = connectionSetting2.DisableTlsVersions | SslProtocols.Tls11; + if (this.CheckBoxTLS12.Checked) + connectionSetting2.DisableTlsVersions = connectionSetting2.DisableTlsVersions | SslProtocols.Tls12; + try + { + Encoding.GetEncoding(this.RequestEncodingComboBox.Text); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Enter valid encoding."); + this.RequestEncodingComboBox.Focus(); + connectionSetting1 = (ConnectionSetting) null; + ProjectData.ClearProjectError(); + goto label_78; + } + try + { + Encoding.GetEncoding(this.ResponseEncodingComboBox.Text); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Enter valid encoding."); + this.ResponseEncodingComboBox.Focus(); + connectionSetting1 = (ConnectionSetting) null; + ProjectData.ClearProjectError(); + goto label_78; + } + try + { + Encoding.GetEncoding(this.CredentialEncodingComboBox.Text); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Enter valid encoding."); + this.CredentialEncodingComboBox.Focus(); + connectionSetting1 = (ConnectionSetting) null; + ProjectData.ClearProjectError(); + goto label_78; + } + connectionSetting2.URIRequestEncoding = this.RequestEncodingComboBox.Text; + connectionSetting2.URIResponseEncoding = this.ResponseEncodingComboBox.Text; + connectionSetting2.CredentialEncoding = this.CredentialEncodingComboBox.Text; + connectionSetting2.DownloadFilenameNormalization = (UCSNormalization) Conversions.ToInteger(System.Enum.Parse(typeof (UCSNormalization), this.DownloadFilenameNormalizationComboBox.SelectedItem.ToString())); + connectionSetting2.UploadFilenameNormalization = (UCSNormalization) Conversions.ToInteger(System.Enum.Parse(typeof (UCSNormalization), this.UploadFilenameNormalizationComboBox.SelectedItem.ToString())); + connectionSetting2.DontRequestGzip = this.NotReqGzipCheckBox.Checked; + connectionSetting2.DontRequestDeflate = this.NotReqDeflateCheckBox.Checked; + connectionSetting2.RequestTranslatef = this.SendTranslateFCheckBox.Checked; + connectionSetting2.DontExpect100 = this.NotExpect100CheckBox.Checked; + connectionSetting2.SendEmptyPUT = this.EmptyPUTCheckBox.Checked; + connectionSetting2.DontUpdateProperty = this.DontUpdatePropertyCheckBox.Checked; + connectionSetting2.UseFullUriInDestinationHeader = this.FullUriDestCheckBox.Checked; + connectionSetting2.DontVerifyContentRange = this.NotVeryfyRange.Checked; + connectionSetting2.RedirectionCollectionOnly = this.RedirectionCollectionOnly.Checked; + connectionSetting2.UploadCompression = this.UploadCompressionComboBox.Text.Trim(); + connectionSetting2.RemoveLastSlashOnMKCOL = this.RequestWithoutLastSlash.Checked; + connectionSetting2.DisableUploadResume = this.DisableUploadResumeCheckBox.Checked; + Uri result3 = (Uri) null; + string[] strArray = new string[0]; + if (this.SpecifyProxyRadio.Checked) + { + if (!Uri.TryCreate(this.ProxyURITextBox.Text, UriKind.Absolute, out result3)) + { + int num = (int) MessageBox.Show("Enter valid Proxy URI."); + this.ProxyURITextBox.Focus(); + return (ConnectionSetting) null; + } + if (Operators.CompareString(result3.Scheme, Uri.UriSchemeHttp, false) != 0 && Operators.CompareString(result3.Scheme, Uri.UriSchemeHttps, false) != 0) + { + int num = (int) MessageBox.Show("Enter valid Proxy URI.\r\nOnly http and https are supported."); + this.ProxyURITextBox.Focus(); + return (ConnectionSetting) null; + } + if (result3.UserInfo.Length <= 0 && result3.PathAndQuery.Length <= 1) + { + if (result3.Fragment.Length <= 0) + { + WebProxy webProxy; + try + { + webProxy = new WebProxy(result3); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Enter valid Proxy URI."); + this.ProxyURITextBox.Focus(); + connectionSetting1 = (ConnectionSetting) null; + ProjectData.ClearProjectError(); + goto label_78; + } + try + { + strArray = this.ProxyBypassListTextBox.Text.Split(new char[2] + { + ' ', + ',' + }, StringSplitOptions.RemoveEmptyEntries); + webProxy.BypassList = strArray; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Enter valid Proxy Bypass list."); + this.ProxyBypassListTextBox.Focus(); + connectionSetting1 = (ConnectionSetting) null; + ProjectData.ClearProjectError(); + goto label_78; + } + if (this.ProxyUseDefaultCredential.Checked) + { + try + { + result2 = this.ProxyUsernameTextBox.Text.IndexOf("\\"); + NetworkCredential networkCredential = result2 < 0 ? new NetworkCredential(this.ProxyUsernameTextBox.Text, this.ProxyPasswordTextBox.Text) : new NetworkCredential(this.ProxyUsernameTextBox.Text.Substring(checked (result2 + 1)), this.ProxyPasswordTextBox.Text, this.ProxyUsernameTextBox.Text.Substring(0, result2)); + webProxy.Credentials = (ICredentials) networkCredential; + goto label_72; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + int num = (int) MessageBox.Show("Enter valid Proxy username and password."); + this.ProxyBypassListTextBox.Focus(); + connectionSetting1 = (ConnectionSetting) null; + ProjectData.ClearProjectError(); + goto label_78; + } + } + else + goto label_72; + } + } + int num1 = (int) MessageBox.Show("Enter valid URI.\r\nuserinfo, path, query, or fragment are not supported."); + this.ProxyURITextBox.Focus(); + return (ConnectionSetting) null; + } +label_72: + if (this.DefaultProxyRadio.Checked) + connectionSetting2.Proxy = ProxyType.Default; + else if (this.SpecifyProxyRadio.Checked) + { + connectionSetting2.Proxy = ProxyType.Specify; + connectionSetting2.ProxyUri = result3; + connectionSetting2.ProxyByPassList = strArray; + connectionSetting2.ProxyByPassLocal = this.ProxyBypassLocalCheckBox.Checked; + connectionSetting2.ProxyUseDefaultCredential = this.ProxyUseDefaultCredential.Checked; + connectionSetting2.ProxyUserName = this.ProxyUsernameTextBox.Text; + connectionSetting2.ProxyPassword = this.ProxyPasswordTextBox.Text; + } + else + connectionSetting2.Proxy = ProxyType.NoProxy; + connectionSetting2.ConnectTimeout = checked (int.Parse(this.ConnectionTimeoutComboBox.Text) * 1000); + connectionSetting2.ReadWriteTimeout = checked (int.Parse(this.StreamTimeoutComboBox.Text) * 1000); + connectionSetting2.UseEncryption = this.EncryptionCheck.Checked; + connectionSetting2.EncryptionKey = this.EncryptKeyTextBox.Text; + connectionSetting2.AutoSplit = this.AutoSplitCheckBox.Checked; + connectionSetting2.SplitSizeMB = int.Parse(this.SplitSizeComboBox.Text); + connectionSetting2.EscapeString = this.ComboBoxEscapeString.Text; + connectionSetting2.HideUnencryptedFile = this.HideUnencFileCheckBox.Checked; + connectionSetting2.HideUnencryptedDirectory = this.HideUnencDirCheckBox.Checked; + return connectionSetting2; +label_78: + return connectionSetting1; + } + + public void UpdateEnabled() + { + if (this.UseDefaultCredentialCheckBox.Checked) + { + this.DontSaveCheckBox.Enabled = false; + this.UserNameTextBox.Enabled = false; + this.PasswordTextBox.Enabled = false; + this.PreAuthBasicCheckBox.Enabled = false; + this.PreAuthWSSECheckBox.Enabled = false; + this.GroupBoxAuthMethods.Enabled = true; + } + else + { + this.DontSaveCheckBox.Enabled = true; + if (this.DontSaveCheckBox.Checked) + { + this.UserNameTextBox.Enabled = false; + this.PasswordTextBox.Enabled = false; + } + else + { + this.UserNameTextBox.Enabled = true; + this.PasswordTextBox.Enabled = true; + } + this.PreAuthBasicCheckBox.Enabled = true; + this.PreAuthWSSECheckBox.Enabled = true; + if (this.PreAuthBasicCheckBox.Checked || this.PreAuthWSSECheckBox.Checked) + this.GroupBoxAuthMethods.Enabled = false; + else + this.GroupBoxAuthMethods.Enabled = true; + } + if (this.DefaultProxyRadio.Checked) + { + this.ProxyURITextBox.Enabled = false; + this.ProxyBypassLocalCheckBox.Enabled = false; + this.ProxyBypassListTextBox.Enabled = false; + this.ProxyUseDefaultCredential.Enabled = false; + this.ProxyUsernameTextBox.Enabled = false; + this.ProxyPasswordTextBox.Enabled = false; + } + else if (this.SpecifyProxyRadio.Checked) + { + this.ProxyURITextBox.Enabled = true; + this.ProxyBypassLocalCheckBox.Enabled = true; + this.ProxyBypassListTextBox.Enabled = true; + this.ProxyUseDefaultCredential.Enabled = true; + if (this.ProxyUseDefaultCredential.Checked) + { + this.ProxyUsernameTextBox.Enabled = false; + this.ProxyPasswordTextBox.Enabled = false; + } + else + { + this.ProxyUsernameTextBox.Enabled = true; + this.ProxyPasswordTextBox.Enabled = true; + } + } + else + { + this.ProxyURITextBox.Enabled = false; + this.ProxyBypassLocalCheckBox.Enabled = false; + this.ProxyBypassListTextBox.Enabled = false; + this.ProxyUseDefaultCredential.Enabled = false; + this.ProxyUsernameTextBox.Enabled = false; + this.ProxyPasswordTextBox.Enabled = false; + } + this.EncryptKeyTextBox.Enabled = this.EncryptionCheck.Checked; + this.SplitSizeComboBox.Enabled = this.AutoSplitCheckBox.Checked; + this.ComboBoxEscapeString.Enabled = this.EncryptionCheck.Checked || this.AutoSplitCheckBox.Checked; + this.HideUnencFileCheckBox.Enabled = this.EncryptionCheck.Checked; + this.HideUnencDirCheckBox.Enabled = this.EncryptionCheck.Checked; + Uri result = (Uri) null; + if (!Uri.TryCreate(this.URITextBox.Text, UriKind.Absolute, out result)) + { + this.OKButton.Enabled = false; + this.TestButton.Enabled = false; + } + else + { + if (this.SettingNameTextBox.Text.Length > 0) + this.OKButton.Enabled = true; + else + this.OKButton.Enabled = false; + this.TestButton.Enabled = true; + } + if ((object) result != null && Operators.CompareString(result.Scheme, Uri.UriSchemeHttps, false) == 0) + { + this.GroupBoxTLS.Enabled = true; + this.SelectClientCertButton.Enabled = true; + } + else + { + this.GroupBoxTLS.Enabled = false; + this.SelectClientCertButton.Enabled = false; + } + this.CheckBoxSSL30.Enabled = (FsBase.AvailableTlss() & SslProtocols.Ssl3) != SslProtocols.None; + this.CheckBoxTLS10.Enabled = (FsBase.AvailableTlss() & SslProtocols.Tls) != SslProtocols.None; + this.CheckBoxTLS11.Enabled = (FsBase.AvailableTlss() & SslProtocols.Tls11) != SslProtocols.None; + this.CheckBoxTLS12.Enabled = (FsBase.AvailableTlss() & SslProtocols.Tls12) != SslProtocols.None; + } + + private void UpdateClientcertListBox() + { + this.ClientCertificateListBox.BeginUpdate(); + try + { + this.ClientCertificateListBox.Items.Clear(); + X509Store x509Store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + x509Store.Open(OpenFlags.ReadOnly); + try + { + int num1 = 0; + int num2 = checked (this.certlist.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + int num3 = 0; + int num4 = checked (x509Store.Certificates.Count - 1); + int index2 = num3; + while (index2 <= num4) + { + if (Operators.CompareString(this.certlist[index1], x509Store.Certificates[index2].Thumbprint, false) == 0) + { + X509Certificate2 certificate = x509Store.Certificates[index2]; + this.ClientCertificateListBox.Items.Add((object) (certificate.Subject + " | " + certificate.NotAfter.ToString() + " | " + certificate.Thumbprint)); + break; + } + checked { ++index2; } + } + checked { ++index1; } + } + } + finally + { + x509Store.Close(); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + this.ClientCertificateListBox.EndUpdate(); + } + + private void SelectClientCertButton_Click(object sender, EventArgs e) + { + List stringList = new List(); + X509Store x509Store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + try + { + x509Store.Open(OpenFlags.OpenExistingOnly); + X509Certificate2Collection certificate2Collection = X509Certificate2UI.SelectFromCollection(x509Store.Certificates.Find(X509FindType.FindByTimeValid, (object) DateTime.Now, true), (string) null, (string) null, X509SelectionFlag.MultiSelection, this.Handle); + int num1 = 0; + int num2 = checked (certificate2Collection.Count - 1); + int index = num1; + while (index <= num2) + { + stringList.Add(certificate2Collection[index].Thumbprint); + checked { ++index; } + } + } + finally + { + x509Store.Close(); + } + this.certlist.Clear(); + this.certlist = stringList; + this.UpdateClientcertListBox(); + } + } +} diff --git a/Rei.Fs.Webdav/ConnectionSettingForm.resx b/Rei.Fs.Webdav/ConnectionSettingForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/Rei.Fs.Webdav/ConnectionSettingForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rei.Fs.Webdav/ConnectionTestForm.cs b/Rei.Fs.Webdav/ConnectionTestForm.cs new file mode 100644 index 0000000..618a9ff --- /dev/null +++ b/Rei.Fs.Webdav/ConnectionTestForm.cs @@ -0,0 +1,889 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.ConnectionTestForm +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Net; +using System.Net.Security; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace Rei.Fs.Webdav +{ + [DesignerGenerated] + public class ConnectionTestForm : Form + { + private IContainer components; + [AccessedThroughProperty("OPTIONSCheck")] + private CheckBox _OPTIONSCheck; + [AccessedThroughProperty("DAVClass1Check")] + private CheckBox _DAVClass1Check; + [AccessedThroughProperty("DAVClass2Check")] + private CheckBox _DAVClass2Check; + [AccessedThroughProperty("ResolveDNSCheck")] + private CheckBox _ResolveDNSCheck; + [AccessedThroughProperty("UriTextBox")] + private TextBox _UriTextBox; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("OKButton")] + private Button _OKButton; + [AccessedThroughProperty("ValidURICheck")] + private CheckBox _ValidURICheck; + [AccessedThroughProperty("Timer1")] + private System.Windows.Forms.Timer _Timer1; + [AccessedThroughProperty("HTTP11Check")] + private CheckBox _HTTP11Check; + [AccessedThroughProperty("PROPFINDCheck")] + private CheckBox _PROPFINDCheck; + [AccessedThroughProperty("OPTIONSAuthText")] + private TextBox _OPTIONSAuthText; + [AccessedThroughProperty("PROPFINDAuthText")] + private TextBox _PROPFINDAuthText; + [AccessedThroughProperty("DetailTextBox")] + private TextBox _DetailTextBox; + [AccessedThroughProperty("CertAvailCheckBox")] + private CheckBox _CertAvailCheckBox; + [AccessedThroughProperty("CertChainCheckBox")] + private CheckBox _CertChainCheckBox; + [AccessedThroughProperty("CertNameCheckBox")] + private CheckBox _CertNameCheckBox; + [AccessedThroughProperty("GroupBox1")] + private GroupBox _GroupBox1; + [AccessedThroughProperty("DAVClass3Check")] + private CheckBox _DAVClass3Check; + [AccessedThroughProperty("MethodsTextBox")] + private TextBox _MethodsTextBox; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("TextBoxSSLVersion")] + private TextBox _TextBoxSSLVersion; + [AccessedThroughProperty("Label3")] + private Label _Label3; + private string puser; + private string ppass; + private ConnectionSetting pSetting; + private const string GroupName = "Test"; + + public ConnectionTestForm() + { + this.Load += new EventHandler(this.ConnectionTestForm_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + this.OPTIONSCheck = new CheckBox(); + this.DAVClass1Check = new CheckBox(); + this.DAVClass2Check = new CheckBox(); + this.ResolveDNSCheck = new CheckBox(); + this.UriTextBox = new TextBox(); + this.Label1 = new Label(); + this.OKButton = new Button(); + this.ValidURICheck = new CheckBox(); + this.Timer1 = new System.Windows.Forms.Timer(this.components); + this.HTTP11Check = new CheckBox(); + this.PROPFINDCheck = new CheckBox(); + this.OPTIONSAuthText = new TextBox(); + this.PROPFINDAuthText = new TextBox(); + this.DetailTextBox = new TextBox(); + this.CertAvailCheckBox = new CheckBox(); + this.CertChainCheckBox = new CheckBox(); + this.CertNameCheckBox = new CheckBox(); + this.GroupBox1 = new GroupBox(); + this.Label3 = new Label(); + this.TextBoxSSLVersion = new TextBox(); + this.DAVClass3Check = new CheckBox(); + this.MethodsTextBox = new TextBox(); + this.Label2 = new Label(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + this.OPTIONSCheck.AutoCheck = false; + this.OPTIONSCheck.AutoSize = true; + CheckBox optionsCheck1 = this.OPTIONSCheck; + Point point1 = new Point(16, 104); + Point point2 = point1; + optionsCheck1.Location = point2; + this.OPTIONSCheck.Name = "OPTIONSCheck"; + CheckBox optionsCheck2 = this.OPTIONSCheck; + Size size1 = new Size(72, 16); + Size size2 = size1; + optionsCheck2.Size = size2; + this.OPTIONSCheck.TabIndex = 5; + this.OPTIONSCheck.Text = "OPTIONS"; + this.OPTIONSCheck.UseVisualStyleBackColor = true; + this.DAVClass1Check.AutoCheck = false; + this.DAVClass1Check.AutoSize = true; + CheckBox davClass1Check1 = this.DAVClass1Check; + point1 = new Point(32, 128); + Point point3 = point1; + davClass1Check1.Location = point3; + this.DAVClass1Check.Name = "DAVClass1Check"; + CheckBox davClass1Check2 = this.DAVClass1Check; + size1 = new Size(89, 16); + Size size3 = size1; + davClass1Check2.Size = size3; + this.DAVClass1Check.TabIndex = 7; + this.DAVClass1Check.Text = "DAV class 1"; + this.DAVClass1Check.UseVisualStyleBackColor = true; + this.DAVClass2Check.AutoCheck = false; + this.DAVClass2Check.AutoSize = true; + CheckBox davClass2Check1 = this.DAVClass2Check; + point1 = new Point(32, 152); + Point point4 = point1; + davClass2Check1.Location = point4; + this.DAVClass2Check.Name = "DAVClass2Check"; + CheckBox davClass2Check2 = this.DAVClass2Check; + size1 = new Size(89, 16); + Size size4 = size1; + davClass2Check2.Size = size4; + this.DAVClass2Check.TabIndex = 8; + this.DAVClass2Check.Text = "DAV class 2"; + this.DAVClass2Check.UseVisualStyleBackColor = true; + this.ResolveDNSCheck.AutoCheck = false; + this.ResolveDNSCheck.AutoSize = true; + CheckBox resolveDnsCheck1 = this.ResolveDNSCheck; + point1 = new Point(16, 56); + Point point5 = point1; + resolveDnsCheck1.Location = point5; + this.ResolveDNSCheck.Name = "ResolveDNSCheck"; + CheckBox resolveDnsCheck2 = this.ResolveDNSCheck; + size1 = new Size(92, 16); + Size size5 = size1; + resolveDnsCheck2.Size = size5; + this.ResolveDNSCheck.TabIndex = 3; + this.ResolveDNSCheck.Text = "Resolve DNS"; + this.ResolveDNSCheck.UseVisualStyleBackColor = true; + this.UriTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox uriTextBox1 = this.UriTextBox; + point1 = new Point(48, 8); + Point point6 = point1; + uriTextBox1.Location = point6; + this.UriTextBox.Name = "UriTextBox"; + this.UriTextBox.ReadOnly = true; + TextBox uriTextBox2 = this.UriTextBox; + size1 = new Size(336, 19); + Size size6 = size1; + uriTextBox2.Size = size6; + this.UriTextBox.TabIndex = 1; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(16, 8); + Point point7 = point1; + label1_1.Location = point7; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(24, 12); + Size size7 = size1; + label1_2.Size = size7; + this.Label1.TabIndex = 0; + this.Label1.Text = "URI"; + this.Label1.TextAlign = ContentAlignment.MiddleLeft; + this.OKButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.OKButton.DialogResult = DialogResult.Cancel; + Button okButton1 = this.OKButton; + point1 = new Point(312, 314); + Point point8 = point1; + okButton1.Location = point8; + this.OKButton.Name = "OKButton"; + Button okButton2 = this.OKButton; + size1 = new Size(72, 24); + Size size8 = size1; + okButton2.Size = size8; + this.OKButton.TabIndex = 16; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + this.ValidURICheck.AutoCheck = false; + this.ValidURICheck.AutoSize = true; + CheckBox validUriCheck1 = this.ValidURICheck; + point1 = new Point(16, 32); + Point point9 = point1; + validUriCheck1.Location = point9; + this.ValidURICheck.Name = "ValidURICheck"; + CheckBox validUriCheck2 = this.ValidURICheck; + size1 = new Size(73, 16); + Size size9 = size1; + validUriCheck2.Size = size9; + this.ValidURICheck.TabIndex = 2; + this.ValidURICheck.Text = "Valid URI"; + this.ValidURICheck.UseVisualStyleBackColor = true; + this.HTTP11Check.AutoCheck = false; + this.HTTP11Check.AutoSize = true; + CheckBox httP11Check1 = this.HTTP11Check; + point1 = new Point(16, 80); + Point point10 = point1; + httP11Check1.Location = point10; + this.HTTP11Check.Name = "HTTP11Check"; + CheckBox httP11Check2 = this.HTTP11Check; + size1 = new Size(73, 16); + Size size10 = size1; + httP11Check2.Size = size10; + this.HTTP11Check.TabIndex = 4; + this.HTTP11Check.Text = "HTTP/1.1"; + this.HTTP11Check.UseVisualStyleBackColor = true; + this.PROPFINDCheck.AutoCheck = false; + this.PROPFINDCheck.AutoSize = true; + CheckBox propfindCheck1 = this.PROPFINDCheck; + point1 = new Point(16, 200); + Point point11 = point1; + propfindCheck1.Location = point11; + this.PROPFINDCheck.Name = "PROPFINDCheck"; + CheckBox propfindCheck2 = this.PROPFINDCheck; + size1 = new Size(80, 16); + Size size11 = size1; + propfindCheck2.Size = size11; + this.PROPFINDCheck.TabIndex = 12; + this.PROPFINDCheck.Text = "PROPFIND"; + this.PROPFINDCheck.UseVisualStyleBackColor = true; + TextBox optionsAuthText1 = this.OPTIONSAuthText; + point1 = new Point(104, 104); + Point point12 = point1; + optionsAuthText1.Location = point12; + this.OPTIONSAuthText.Name = "OPTIONSAuthText"; + this.OPTIONSAuthText.ReadOnly = true; + TextBox optionsAuthText2 = this.OPTIONSAuthText; + size1 = new Size(104, 19); + Size size12 = size1; + optionsAuthText2.Size = size12; + this.OPTIONSAuthText.TabIndex = 6; + TextBox propfindAuthText1 = this.PROPFINDAuthText; + point1 = new Point(104, 200); + Point point13 = point1; + propfindAuthText1.Location = point13; + this.PROPFINDAuthText.Name = "PROPFINDAuthText"; + this.PROPFINDAuthText.ReadOnly = true; + TextBox propfindAuthText2 = this.PROPFINDAuthText; + size1 = new Size(104, 19); + Size size13 = size1; + propfindAuthText2.Size = size13; + this.PROPFINDAuthText.TabIndex = 13; + this.DetailTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox detailTextBox1 = this.DetailTextBox; + point1 = new Point(16, 232); + Point point14 = point1; + detailTextBox1.Location = point14; + this.DetailTextBox.Multiline = true; + this.DetailTextBox.Name = "DetailTextBox"; + this.DetailTextBox.ReadOnly = true; + TextBox detailTextBox2 = this.DetailTextBox; + size1 = new Size(368, 74); + Size size14 = size1; + detailTextBox2.Size = size14; + this.DetailTextBox.TabIndex = 15; + this.CertAvailCheckBox.AutoCheck = false; + this.CertAvailCheckBox.AutoSize = true; + CheckBox certAvailCheckBox1 = this.CertAvailCheckBox; + point1 = new Point(8, 72); + Point point15 = point1; + certAvailCheckBox1.Location = point15; + this.CertAvailCheckBox.Name = "CertAvailCheckBox"; + CheckBox certAvailCheckBox2 = this.CertAvailCheckBox; + size1 = new Size(139, 16); + Size size15 = size1; + certAvailCheckBox2.Size = size15; + this.CertAvailCheckBox.TabIndex = 2; + this.CertAvailCheckBox.Text = "Certificate Availabitily"; + this.CertAvailCheckBox.UseVisualStyleBackColor = true; + this.CertChainCheckBox.AutoCheck = false; + this.CertChainCheckBox.AutoSize = true; + CheckBox certChainCheckBox1 = this.CertChainCheckBox; + point1 = new Point(8, 24); + Point point16 = point1; + certChainCheckBox1.Location = point16; + this.CertChainCheckBox.Name = "CertChainCheckBox"; + CheckBox certChainCheckBox2 = this.CertChainCheckBox; + size1 = new Size(111, 16); + Size size16 = size1; + certChainCheckBox2.Size = size16; + this.CertChainCheckBox.TabIndex = 0; + this.CertChainCheckBox.Text = "Certificate Chain"; + this.CertChainCheckBox.UseVisualStyleBackColor = true; + this.CertNameCheckBox.AutoCheck = false; + this.CertNameCheckBox.AutoSize = true; + CheckBox certNameCheckBox1 = this.CertNameCheckBox; + point1 = new Point(8, 48); + Point point17 = point1; + certNameCheckBox1.Location = point17; + this.CertNameCheckBox.Name = "CertNameCheckBox"; + CheckBox certNameCheckBox2 = this.CertNameCheckBox; + size1 = new Size(111, 16); + Size size17 = size1; + certNameCheckBox2.Size = size17; + this.CertNameCheckBox.TabIndex = 1; + this.CertNameCheckBox.Text = "Certificate Name"; + this.CertNameCheckBox.UseVisualStyleBackColor = true; + this.GroupBox1.Controls.Add((Control) this.Label3); + this.GroupBox1.Controls.Add((Control) this.TextBoxSSLVersion); + this.GroupBox1.Controls.Add((Control) this.CertChainCheckBox); + this.GroupBox1.Controls.Add((Control) this.CertAvailCheckBox); + this.GroupBox1.Controls.Add((Control) this.CertNameCheckBox); + GroupBox groupBox1_1 = this.GroupBox1; + point1 = new Point(216, 32); + Point point18 = point1; + groupBox1_1.Location = point18; + this.GroupBox1.Name = "GroupBox1"; + GroupBox groupBox1_2 = this.GroupBox1; + size1 = new Size(168, 136); + Size size18 = size1; + groupBox1_2.Size = size18; + this.GroupBox1.TabIndex = 14; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Security"; + this.Label3.AutoSize = true; + Label label3_1 = this.Label3; + point1 = new Point(8, 96); + Point point19 = point1; + label3_1.Location = point19; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(68, 12); + Size size19 = size1; + label3_2.Size = size19; + this.Label3.TabIndex = 10; + this.Label3.Text = "SSL Version"; + this.Label3.TextAlign = ContentAlignment.MiddleLeft; + TextBox textBoxSslVersion1 = this.TextBoxSSLVersion; + point1 = new Point(8, 112); + Point point20 = point1; + textBoxSslVersion1.Location = point20; + this.TextBoxSSLVersion.Name = "TextBoxSSLVersion"; + this.TextBoxSSLVersion.ReadOnly = true; + TextBox textBoxSslVersion2 = this.TextBoxSSLVersion; + size1 = new Size(152, 19); + Size size20 = size1; + textBoxSslVersion2.Size = size20; + this.TextBoxSSLVersion.TabIndex = 3; + this.DAVClass3Check.AutoCheck = false; + this.DAVClass3Check.AutoSize = true; + CheckBox davClass3Check1 = this.DAVClass3Check; + point1 = new Point(32, 176); + Point point21 = point1; + davClass3Check1.Location = point21; + this.DAVClass3Check.Name = "DAVClass3Check"; + CheckBox davClass3Check2 = this.DAVClass3Check; + size1 = new Size(89, 16); + Size size21 = size1; + davClass3Check2.Size = size21; + this.DAVClass3Check.TabIndex = 9; + this.DAVClass3Check.Text = "DAV class 3"; + this.DAVClass3Check.UseVisualStyleBackColor = true; + this.MethodsTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox methodsTextBox1 = this.MethodsTextBox; + point1 = new Point(152, 176); + Point point22 = point1; + methodsTextBox1.Location = point22; + this.MethodsTextBox.Name = "MethodsTextBox"; + this.MethodsTextBox.ReadOnly = true; + TextBox methodsTextBox2 = this.MethodsTextBox; + size1 = new Size(232, 19); + Size size22 = size1; + methodsTextBox2.Size = size22; + this.MethodsTextBox.TabIndex = 11; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(152, 160); + Point point23 = point1; + label2_1.Location = point23; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(48, 12); + Size size23 = size1; + label2_2.Size = size23; + this.Label2.TabIndex = 10; + this.Label2.Text = "Methods"; + this.Label2.TextAlign = ContentAlignment.MiddleLeft; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + size1 = new Size(392, 346); + this.ClientSize = size1; + this.Controls.Add((Control) this.Label2); + this.Controls.Add((Control) this.MethodsTextBox); + this.Controls.Add((Control) this.DAVClass3Check); + this.Controls.Add((Control) this.GroupBox1); + this.Controls.Add((Control) this.DetailTextBox); + this.Controls.Add((Control) this.PROPFINDAuthText); + this.Controls.Add((Control) this.OPTIONSAuthText); + this.Controls.Add((Control) this.DAVClass2Check); + this.Controls.Add((Control) this.DAVClass1Check); + this.Controls.Add((Control) this.OPTIONSCheck); + this.Controls.Add((Control) this.PROPFINDCheck); + this.Controls.Add((Control) this.HTTP11Check); + this.Controls.Add((Control) this.ValidURICheck); + this.Controls.Add((Control) this.OKButton); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.UriTextBox); + this.Controls.Add((Control) this.ResolveDNSCheck); + this.MaximizeBox = false; + this.MinimizeBox = false; + size1 = new Size(408, 384); + this.MinimumSize = size1; + this.Name = nameof (ConnectionTestForm); + this.ShowInTaskbar = false; + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Connection Test"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual CheckBox OPTIONSCheck + { + get + { + return this._OPTIONSCheck; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OPTIONSCheck = value; + } + } + + internal virtual CheckBox DAVClass1Check + { + get + { + return this._DAVClass1Check; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DAVClass1Check = value; + } + } + + internal virtual CheckBox DAVClass2Check + { + get + { + return this._DAVClass2Check; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DAVClass2Check = value; + } + } + + internal virtual CheckBox ResolveDNSCheck + { + get + { + return this._ResolveDNSCheck; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ResolveDNSCheck = value; + } + } + + internal virtual TextBox UriTextBox + { + get + { + return this._UriTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UriTextBox = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual Button OKButton + { + get + { + return this._OKButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OKButton = value; + } + } + + internal virtual CheckBox ValidURICheck + { + get + { + return this._ValidURICheck; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ValidURICheck = value; + } + } + + internal virtual System.Windows.Forms.Timer Timer1 + { + get + { + return this._Timer1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.Timer1_Tick); + if (this._Timer1 != null) + this._Timer1.Tick -= eventHandler; + this._Timer1 = value; + if (this._Timer1 == null) + return; + this._Timer1.Tick += eventHandler; + } + } + + internal virtual CheckBox HTTP11Check + { + get + { + return this._HTTP11Check; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._HTTP11Check = value; + } + } + + internal virtual CheckBox PROPFINDCheck + { + get + { + return this._PROPFINDCheck; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._PROPFINDCheck = value; + } + } + + internal virtual TextBox OPTIONSAuthText + { + get + { + return this._OPTIONSAuthText; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._OPTIONSAuthText = value; + } + } + + internal virtual TextBox PROPFINDAuthText + { + get + { + return this._PROPFINDAuthText; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._PROPFINDAuthText = value; + } + } + + internal virtual TextBox DetailTextBox + { + get + { + return this._DetailTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DetailTextBox = value; + } + } + + internal virtual CheckBox CertAvailCheckBox + { + get + { + return this._CertAvailCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CertAvailCheckBox = value; + } + } + + internal virtual CheckBox CertChainCheckBox + { + get + { + return this._CertChainCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CertChainCheckBox = value; + } + } + + internal virtual CheckBox CertNameCheckBox + { + get + { + return this._CertNameCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._CertNameCheckBox = value; + } + } + + internal virtual GroupBox GroupBox1 + { + get + { + return this._GroupBox1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._GroupBox1 = value; + } + } + + internal virtual CheckBox DAVClass3Check + { + get + { + return this._DAVClass3Check; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._DAVClass3Check = value; + } + } + + internal virtual TextBox MethodsTextBox + { + get + { + return this._MethodsTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._MethodsTextBox = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual TextBox TextBoxSSLVersion + { + get + { + return this._TextBoxSSLVersion; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._TextBoxSSLVersion = value; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + public string TargetUri + { + get + { + return this.UriTextBox.Text; + } + set + { + this.UriTextBox.Text = value; + } + } + + public string Username + { + get + { + return this.puser; + } + set + { + this.puser = value; + } + } + + public string Password + { + get + { + return this.ppass; + } + set + { + this.ppass = value; + } + } + + public ConnectionSetting Setting + { + get + { + return this.pSetting; + } + set + { + this.pSetting = value; + } + } + + private void Check() + { + Uri result = (Uri) null; + if (!Uri.TryCreate(this.UriTextBox.Text, UriKind.Absolute, out result)) + return; + this.ValidURICheck.Checked = true; + if (Operators.CompareString(result.Scheme, "https", false) == 0) + { + this.CertChainCheckBox.Enabled = true; + this.CertNameCheckBox.Enabled = true; + this.CertAvailCheckBox.Enabled = true; + } + else + { + this.CertChainCheckBox.Enabled = false; + this.CertNameCheckBox.Enabled = false; + this.CertAvailCheckBox.Enabled = false; + } + IPAddress address = (IPAddress) null; + if (IPAddress.TryParse(result.Host, out address)) + { + this.ResolveDNSCheck.CheckState = CheckState.Indeterminate; + } + else + { + try + { + Dns.GetHostEntry(result.Host); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.DetailTextBox.Text = ex.Message; + ProjectData.ClearProjectError(); + return; + } + this.ResolveDNSCheck.Checked = true; + } + WebdavFs client = this.Setting.InnerGetClient(); + client.GroupName = "Test"; + this.Setting.CertErrorIgnores = SslPolicyErrors.RemoteCertificateNotAvailable | SslPolicyErrors.RemoteCertificateNameMismatch | SslPolicyErrors.RemoteCertificateChainErrors; + try + { + DavResourceOptions resourceOptions = client.GetResourceOptions(result); + if (resourceOptions.ProtocolVersion > new Version(1, 0)) + this.HTTP11Check.Checked = true; + this.OPTIONSCheck.Checked = true; + this.OPTIONSAuthText.Text = client.LastAuthType; + this.DAVClass1Check.Checked = resourceOptions.DAVSupported("1"); + this.DAVClass2Check.Checked = resourceOptions.DAVSupported("2"); + this.DAVClass3Check.Checked = resourceOptions.DAVSupported("3"); + this.MethodsTextBox.Text = resourceOptions.AllowedMethods; + this.TextBoxSSLVersion.Text = resourceOptions.SSLVersionString; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception exception = ex; + this.DetailTextBox.Text = exception.Message + "\r\n" + exception.StackTrace; + client.ResetConnection(); + ProjectData.ClearProjectError(); + return; + } + finally + { + if (Operators.CompareString(result.Scheme, "https", false) == 0) + { + this.CertChainCheckBox.Checked = (this.Setting.LastCertError & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.None; + this.CertNameCheckBox.Checked = (this.Setting.LastCertError & SslPolicyErrors.RemoteCertificateNameMismatch) == SslPolicyErrors.None; + this.CertAvailCheckBox.Checked = (this.Setting.LastCertError & SslPolicyErrors.RemoteCertificateNotAvailable) == SslPolicyErrors.None; + } + } + try + { + client.GetInfoAndEntries(result); + this.PROPFINDCheck.Checked = true; + this.PROPFINDAuthText.Text = client.LastAuthType; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception exception = ex; + this.DetailTextBox.Text = exception.Message + "\r\n" + exception.StackTrace; + client.ResetConnection(); + ProjectData.ClearProjectError(); + return; + } + client.ResetConnection(); + } + + private void Timer1_Tick(object sender, EventArgs e) + { + this.Timer1.Stop(); + Cursor.Current = Cursors.WaitCursor; + this.Check(); + Cursor.Current = Cursors.Default; + this.OKButton.Enabled = true; + } + + private void ConnectionTestForm_Load(object sender, EventArgs e) + { + this.Icon = ConnectionSetting.GetDefaultFavicon(); + this.Timer1.Start(); + this.OKButton.Enabled = false; + } + } +} diff --git a/Rei.Fs.Webdav/ConnectionTestForm.resx b/Rei.Fs.Webdav/ConnectionTestForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/Rei.Fs.Webdav/ConnectionTestForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rei.Fs.Webdav/DavResourceOptions.cs b/Rei.Fs.Webdav/DavResourceOptions.cs new file mode 100644 index 0000000..bf35d52 --- /dev/null +++ b/Rei.Fs.Webdav/DavResourceOptions.cs @@ -0,0 +1,188 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.DavResourceOptions +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Net; +using System.Reflection; +using System.Runtime.CompilerServices; + +namespace Rei.Fs.Webdav +{ + public class DavResourceOptions + { + private HttpWebResponse pResponse2; + private Uri pResUri; + private Version pVersion; + private string pAllowHeader; + private string pDAVHeader; + private string pSSLVersionString; + + internal DavResourceOptions(Uri responseuri, HttpWebResponse response) + { + this.pResUri = responseuri; + this.pVersion = response.ProtocolVersion; + this.pAllowHeader = response.Headers["Allow"]; + this.pDAVHeader = response.Headers["DAV"]; + this.pSSLVersionString = ""; + FieldInfo field1 = typeof (HttpWebResponse).GetField("m_ConnectStream", BindingFlags.Instance | BindingFlags.NonPublic); + if (field1 == null) + return; + object objectValue1 = RuntimeHelpers.GetObjectValue(field1.GetValue((object) response)); + FieldInfo field2 = objectValue1.GetType().GetField("m_Connection", BindingFlags.Instance | BindingFlags.NonPublic); + if (field2 == null) + return; + object objectValue2 = RuntimeHelpers.GetObjectValue(field2.GetValue(RuntimeHelpers.GetObjectValue(objectValue1))); + FieldInfo field3 = objectValue2.GetType().BaseType.GetField("m_NetworkStream", BindingFlags.Instance | BindingFlags.NonPublic); + if (field3 == null) + return; + object objectValue3 = RuntimeHelpers.GetObjectValue(field3.GetValue(RuntimeHelpers.GetObjectValue(objectValue2))); + FieldInfo field4 = objectValue3.GetType().GetField("m_Worker", BindingFlags.Instance | BindingFlags.NonPublic); + if (field4 == null) + return; + object objectValue4 = RuntimeHelpers.GetObjectValue(field4.GetValue(RuntimeHelpers.GetObjectValue(objectValue3))); + PropertyInfo property = objectValue4.GetType().GetProperty("SslProtocol", BindingFlags.Instance | BindingFlags.NonPublic); + if (property == null) + return; + this.pSSLVersionString = RuntimeHelpers.GetObjectValue(property.GetValue(RuntimeHelpers.GetObjectValue(objectValue4), (object[]) null)).ToString().ToUpperInvariant(); + } + + public Uri ResponseUri + { + get + { + return this.pResUri; + } + } + + public Version ProtocolVersion + { + get + { + return this.pVersion; + } + } + + public bool MethodAllowed(string method) + { + if (this.pAllowHeader == null) + return false; + string[] strArray1 = this.pAllowHeader.ToUpper().Split(','); + method = method.ToUpper(); + string[] strArray2 = strArray1; + int index = 0; + while (index < strArray2.Length) + { + if (Operators.CompareString(strArray2[index].Trim(), method, false) == 0) + return true; + checked { ++index; } + } + return false; + } + + public string AllowedMethods + { + get + { + if (this.pAllowHeader == null) + return ""; + return this.pAllowHeader; + } + } + + public bool DAVSupported(string version) + { + if (this.ProtocolVersion.CompareTo(HttpVersion.Version11) < 0 || this.pDAVHeader == null) + return false; + string[] strArray1 = this.pDAVHeader.ToUpper().Split(new char[1] + { + ',' + }, StringSplitOptions.RemoveEmptyEntries); + version = version.Trim().ToUpper(); + string[] strArray2 = strArray1; + int index = 0; + while (index < strArray2.Length) + { + if (Operators.CompareString(strArray2[index].Trim(), version, false) == 0) + return true; + checked { ++index; } + } + return false; + } + + public bool CanRead + { + get + { + return this.MethodAllowed("GET"); + } + } + + public bool CanWrite + { + get + { + return this.MethodAllowed("PUT"); + } + } + + public bool CanDelete + { + get + { + return this.MethodAllowed("DELETE"); + } + } + + public bool CanCreateCollection + { + get + { + return this.MethodAllowed("MKCOL"); + } + } + + public bool CanGetProperty + { + get + { + return this.MethodAllowed("PROPFIND"); + } + } + + public bool CanSetProperty + { + get + { + return this.MethodAllowed("PROPPATCH"); + } + } + + public bool CanMove + { + get + { + return this.MethodAllowed("MOVE"); + } + } + + public bool CanCopy + { + get + { + return this.MethodAllowed("COPY"); + } + } + + public string SSLVersionString + { + get + { + return this.pSSLVersionString; + } + } + } +} diff --git a/Rei.Fs.Webdav/My/MyApplication.cs b/Rei.Fs.Webdav/My/MyApplication.cs new file mode 100644 index 0000000..594764f --- /dev/null +++ b/Rei.Fs.Webdav/My/MyApplication.cs @@ -0,0 +1,18 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.My.MyApplication +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.ApplicationServices; +using System.CodeDom.Compiler; +using System.ComponentModel; + +namespace Rei.Fs.Webdav.My +{ + [GeneratedCode("MyTemplate", "8.0.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + internal class MyApplication : ApplicationBase + { + } +} diff --git a/Rei.Fs.Webdav/My/MyComputer.cs b/Rei.Fs.Webdav/My/MyComputer.cs new file mode 100644 index 0000000..42ae6f2 --- /dev/null +++ b/Rei.Fs.Webdav/My/MyComputer.cs @@ -0,0 +1,24 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.My.MyComputer +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.Devices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; + +namespace Rei.Fs.Webdav.My +{ + [EditorBrowsable(EditorBrowsableState.Never)] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal class MyComputer : Computer + { + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public MyComputer() + { + } + } +} diff --git a/Rei.Fs.Webdav/My/MyProject.cs b/Rei.Fs.Webdav/My/MyProject.cs new file mode 100644 index 0000000..28b2d0b --- /dev/null +++ b/Rei.Fs.Webdav/My/MyProject.cs @@ -0,0 +1,148 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.My.MyProject +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.ApplicationServices; +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.VisualBasic.MyServices.Internal; +using System; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Rei.Fs.Webdav.My +{ + [StandardModule] + [HideModuleName] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal sealed class MyProject + { + private static readonly MyProject.ThreadSafeObjectProvider m_ComputerObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_AppObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_UserObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_MyWebServicesObjectProvider = new MyProject.ThreadSafeObjectProvider(); + + [HelpKeyword("My.Computer")] + internal static MyComputer Computer + { + [DebuggerHidden] get + { + return MyProject.m_ComputerObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.Application")] + internal static MyApplication Application + { + [DebuggerHidden] get + { + return MyProject.m_AppObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.User")] + internal static User User + { + [DebuggerHidden] get + { + return MyProject.m_UserObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.WebServices")] + internal static MyProject.MyWebServices WebServices + { + [DebuggerHidden] get + { + return MyProject.m_MyWebServicesObjectProvider.GetInstance; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [MyGroupCollection("System.Web.Services.Protocols.SoapHttpClientProtocol", "Create__Instance__", "Dispose__Instance__", "")] + internal sealed class MyWebServices + { + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public override bool Equals(object o) + { + return base.Equals(RuntimeHelpers.GetObjectValue(o)); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public override int GetHashCode() + { + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + internal new Type GetType() + { + return typeof (MyProject.MyWebServices); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override string ToString() + { + return base.ToString(); + } + + [DebuggerHidden] + private static T Create__Instance__(T instance) where T : new() + { + if ((object) instance == null) + return Activator.CreateInstance(); + return instance; + } + + [DebuggerHidden] + private void Dispose__Instance__(ref T instance) + { + instance = default (T); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public MyWebServices() + { + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [ComVisible(false)] + internal sealed class ThreadSafeObjectProvider where T : new() + { + private readonly ContextValue m_Context; + + internal T GetInstance + { + [DebuggerHidden] get + { + T instance = this.m_Context.Value; + if ((object) instance == null) + { + instance = Activator.CreateInstance(); + this.m_Context.Value = instance; + } + return instance; + } + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public ThreadSafeObjectProvider() + { + this.m_Context = new ContextValue(); + } + } + } +} diff --git a/Rei.Fs.Webdav/My/MySettings.cs b/Rei.Fs.Webdav/My/MySettings.cs new file mode 100644 index 0000000..986bd68 --- /dev/null +++ b/Rei.Fs.Webdav/My/MySettings.cs @@ -0,0 +1,29 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.My.MySettings +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Configuration; +using System.Runtime.CompilerServices; + +namespace Rei.Fs.Webdav.My +{ + [CompilerGenerated] + [EditorBrowsable(EditorBrowsableState.Advanced)] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed class MySettings : ApplicationSettingsBase + { + private static MySettings defaultInstance = (MySettings) SettingsBase.Synchronized((SettingsBase) new MySettings()); + + public static MySettings Default + { + get + { + return MySettings.defaultInstance; + } + } + } +} diff --git a/Rei.Fs.Webdav/My/MySettingsProperty.cs b/Rei.Fs.Webdav/My/MySettingsProperty.cs new file mode 100644 index 0000000..dd71195 --- /dev/null +++ b/Rei.Fs.Webdav/My/MySettingsProperty.cs @@ -0,0 +1,30 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.My.MySettingsProperty +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace Rei.Fs.Webdav.My +{ + [HideModuleName] + [StandardModule] + [CompilerGenerated] + [DebuggerNonUserCode] + internal sealed class MySettingsProperty + { + [HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} diff --git a/Rei.Fs.Webdav/My/Resources/Resources.cs b/Rei.Fs.Webdav/My/Resources/Resources.cs new file mode 100644 index 0000000..f99ab77 --- /dev/null +++ b/Rei.Fs.Webdav/My/Resources/Resources.cs @@ -0,0 +1,61 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.My.Resources.Resources +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace Rei.Fs.Webdav.My.Resources +{ + [StandardModule] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [HideModuleName] + [CompilerGenerated] + [DebuggerNonUserCode] + internal sealed class Resources + { + private static ResourceManager resourceMan; + private static CultureInfo resourceCulture; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals((object) Rei.Fs.Webdav.My.Resources.Resources.resourceMan, (object) null)) + Rei.Fs.Webdav.My.Resources.Resources.resourceMan = new ResourceManager("Rei.Fs.Webdav.Resources", typeof (Rei.Fs.Webdav.My.Resources.Resources).Assembly); + return Rei.Fs.Webdav.My.Resources.Resources.resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get + { + return Rei.Fs.Webdav.My.Resources.Resources.resourceCulture; + } + set + { + Rei.Fs.Webdav.My.Resources.Resources.resourceCulture = value; + } + } + + internal static Icon WebDAVFolder + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(Rei.Fs.Webdav.My.Resources.Resources.ResourceManager.GetObject(nameof (WebDAVFolder), Rei.Fs.Webdav.My.Resources.Resources.resourceCulture)); + } + } + } +} diff --git a/Rei.Fs.Webdav/PassportAuthHelper.cs b/Rei.Fs.Webdav/PassportAuthHelper.cs new file mode 100644 index 0000000..593f59a --- /dev/null +++ b/Rei.Fs.Webdav/PassportAuthHelper.cs @@ -0,0 +1,143 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.PassportAuthHelper +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.IO; +using System.Net; + +namespace Rei.Fs.Webdav +{ + public class PassportAuthHelper + { + private static Uri _InitialRedirectorUri = new Uri("https://nexus.passport.com/rdr/pprdr.asp"); + private static Uri _LoginUri; + public string UserAgent; + public int ReadWriteTimeout; + public int ConnectTimeout; + public CookieContainer CookieContainer; + public IWebProxy Proxy; + public string GroupName; + + public static Uri InitialRedirectorUri + { + get + { + return PassportAuthHelper._InitialRedirectorUri; + } + } + + public static bool CheckPassportAuth(HttpWebResponse res) + { + return res.StatusCode == HttpStatusCode.Found && res.Headers[HttpResponseHeader.WwwAuthenticate] != null && res.Headers[HttpResponseHeader.WwwAuthenticate].Trim().StartsWith("Passport1.4 "); + } + + private HttpWebRequest CreateRequest(Uri uri) + { + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(uri); + httpWebRequest.UserAgent = this.UserAgent; + httpWebRequest.Proxy = this.Proxy; + httpWebRequest.ReadWriteTimeout = this.ReadWriteTimeout; + httpWebRequest.Timeout = this.ConnectTimeout; + httpWebRequest.CookieContainer = this.CookieContainer; + httpWebRequest.ConnectionGroupName = this.GroupName; + httpWebRequest.KeepAlive = false; + httpWebRequest.PreAuthenticate = false; + httpWebRequest.AllowAutoRedirect = false; + return httpWebRequest; + } + + public Uri GetPassportLoginUri() + { + if ((object) PassportAuthHelper._LoginUri != null) + return PassportAuthHelper._LoginUri; + try + { + HttpWebRequest request = this.CreateRequest(PassportAuthHelper._InitialRedirectorUri); + request.Method = "GET"; + using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) + { + string[] strArray = response.Headers["PassportURLs"].Split(','); + int num1 = 0; + int num2 = checked (strArray.Length - 1); + int index = num1; + while (index <= num2) + { + if (strArray[index].Contains("DALogin")) + { + PassportAuthHelper._LoginUri = new Uri("https://" + strArray[index].Substring(checked (strArray[index].IndexOf("=") + 1))); + return PassportAuthHelper._LoginUri; + } + checked { ++index; } + } + } + throw new UnauthorizedException("Cannot access Passport authentication system.", (Exception) null, false); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + throw new UnauthorizedException("Cannot access Passport authentication system.", ex, false); + } + } + + public string GetPassportToken(HttpWebResponse orgres, string user, string pass) + { + string str1 = orgres.Headers[HttpResponseHeader.WwwAuthenticate].Trim(); + int startIndex = str1.IndexOf(" "); + string str2 = str1.Substring(startIndex).Trim(); + string str3 = string.Format("Passport1.4 sign-in={0},pwd={1},OrgVerb={2},OrgUrl={3},{4}", (object) Uri.EscapeDataString(user), (object) Uri.EscapeDataString(pass), (object) orgres.Method, (object) orgres.ResponseUri.AbsoluteUri, (object) str2); + try + { + HttpWebRequest request = this.CreateRequest(this.GetPassportLoginUri()); + request.Method = "GET"; + request.Headers.Add(HttpRequestHeader.Authorization, str3); + using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) + { + string str4 = response.Headers["Authentication-Info"].Trim(); + string[] strArray = str4.Substring(checked (str4.IndexOf(' ') + 1)).Split(','); + int num1 = 0; + int num2 = checked (strArray.Length - 1); + int index = num1; + while (index <= num2) + { + if (strArray[index].Contains("from-PP")) + return "Passport1.4 " + strArray[index]; + checked { ++index; } + } + } + throw new UnauthorizedException("Passport login failure", (Exception) null, true); + } + catch (WebException ex) + { + ProjectData.SetProjectError((Exception) ex); + WebException webException = ex; + using (WebResponse response = webException.Response) + { + using (new StreamReader(response.GetResponseStream())) + ; + } + throw new UnauthorizedException("Passport login failure", (Exception) webException, true); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + throw new UnauthorizedException("Passport login failure", ex, true); + } + } + + public bool ResetConnection() + { + bool flag = true; + if ((object) PassportAuthHelper._LoginUri != null) + { + ServicePoint servicePoint = ServicePointManager.FindServicePoint(PassportAuthHelper._LoginUri); + flag &= servicePoint.CloseConnectionGroup(""); + } + ServicePoint servicePoint1 = ServicePointManager.FindServicePoint(PassportAuthHelper._InitialRedirectorUri); + return flag & servicePoint1.CloseConnectionGroup(""); + } + } +} diff --git a/Rei.Fs.Webdav/Rei.Fs.Webdav.csproj b/Rei.Fs.Webdav/Rei.Fs.Webdav.csproj new file mode 100644 index 0000000..dd4cdeb --- /dev/null +++ b/Rei.Fs.Webdav/Rei.Fs.Webdav.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {D0DC76C1-5AA0-466F-84D3-D6C4DEB083DE} + Library + Rei.Fs.Webdav + v3.5 + 1.13.2.18288 + 512 + Rei.Fs.Webdav + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + lib\Rei.Fs.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Rei.Fs.Webdav/Resources.resx b/Rei.Fs.Webdav/Resources.resx new file mode 100644 index 0000000..6b378d3 --- /dev/null +++ b/Rei.Fs.Webdav/Resources.resx @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA + IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTbVUAxV9CAMZgQwDHY0kAzmhMALhSLAC6VDIAvlg2AMJc + OgCrRRoApkIZAK5IHgC0TiYAqmhPAKQ+EACoQhUAqVMuANBqPgCbNQEAnTcGAKA7CwCiQxYAoTsAAJ44 + AACdNwAAp0IMALFLEwCIOxIAZDojAFhFOgBWT0sAp0EAAKU/AACjPQAAlUQSAGtCKACtRwAAqkQAAKlD + AACtSwoAn1YnALROAACzTQAAsUsAAK9JAACNQQYAzHEtALxWAAC7VQAAuVMAALZQAAC5Wg4AxF4AAMFb + AAC+WAAA1W8QAM9pAADMZgAAy2UAAMljAADGYAAAlk0IAKxfEwDZeBkAsGomAI9hNQDalVQAhmVDANlz + AADWcAAA1W8AANNtAADRawAA04AlAIFTIwCRfWgA4nwAAN54AADcdgAA23UAAN96AgDuiAwAolwIAKKG + ZAD/8eAA74kAAO2HAADrhQAA6YMAAOeBAADKcwAA54cOAOmLFQDnlCcA451BAOOeRAD/8d8A/pgAAPyW + AAD3kQAA840AANaAAADjjQAA/50IAKxuCwD/ohEA1IoaAP+rJADBgRwA/68rAMimcgDJggMA/7U4AP+7 + RADxqiIA/8ddANyWBgD/0W8A464rAMSTBgC0iQYAdGY7AIdoAAC7lQcA892IAJ+GAgCslQwA8OWXAMm8 + RwD/+cAA2NBtAGReAADz8rMAeXsAAI2QBQBkZTAA///fAHaDAACYqi4AWGQoAK7EVgBZcgAASF0JANHm + mgDv/NMAP14BAFeKAABblAUAZqAYAElmIwA4aAEARoUAAEiWBQBqrywAs9+MALvklgDM8bEANmQXADaR + AgAodwAAktV4ACpmFQBywlUAVLQ1AByCAAAbfgAAIZgFABdnCQANcQAADXwAAAtqAAB80nIAz/fLAApm + BQCY45QAA2YBAACOAAAAhwAAAIQAAACBAAAAfgAAAHoAAAB5AAAAdQAAAHMAAABvAAAAbAAAAGkAAITb + hAAsry8ABZ4KABKlGABby2QArfKzABOsJgA+vUsAGLEvABqzNAActTkAH7g9ACC5QQAiu0MAkOqjACO8 + RwBOzmsAJb5LACfATgB14ZAAKsNUAGbchgAux1sAL8hdAFPWegBY2H8AXtuDADHKYgA3zWgAOc5qAD7P + bQBB0XAAS9R2AIru/wCs7foAzfX9AFfV9QCA5v8AKsHrACq43gArueAAcNbwAJLd8QAZrNgAM67WAEe0 + 2AApqtUAB4CxABaNvAABcqQAAW+iAAJ1qADl5ucA////AKampgCZmZkAc3NzAHBwcABqamoAYmJiAF5e + XgBbW1sAWFhYAFJSUgBAQEAAJiYmAAAAAAD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////b7+/v7+/v2//////////////////////////////////////// + ////9vv7+/v78O7u7u7w8O/9+/v7+/v79v/////////////////////////////////+/v7+/v7+6OPk + 5eTk4+z+/v7+/v7++//////////////////////////////////09fX19fX16OHh4eHh4ez19fX19fX+ + +//////////////////////////////////08/Pz8/Pz6+be4uLe5u3z8/Pz8/P++/////////////// + ///////////////////08fHx8fHx6+ff39/f5+3x8fHx8fH++/////////////////////////////// + ///0YWFVYVVV6d/g4ODg3+1hYWFhYWH+9v/////////////////////////////////09PT09PT06vHy + 8vLy4O309PT09PT0////////////////////////////////////////////6+rq6unr6+r///////// + //////////////////////////////////////////////RV8fP1/vv///////////////////////// + //////////////////////////////RV8fP1/vv///////////////////////////////////////// + //////////////RV8fP1/vv///////////////////////////////////////////////////////RV + 8fP1/vz////////////////////////////////////////////////////3RA5DL0EpHSQf+ff///// + ////////////////////////////////////////VEE4LxISAQEFBQgbHB779/////////////////// + /////////////////////1RtQBIEAw4OAwMEBQEBAQ0cHvf///////////////////////////////// + ////b1wvCAcGEUQRBgYHBwkCBAEEFh35//////////////////////////////////9vUgYNDBAPFYhL + FRUPCgwGBwkEBQwd+f///////////////////////////////19dDA8TExkZGJaWLhgZExMVCg0HCQUM + Hfj/////////////////////////////X14aExkXIiEgJ56inj4gIRcZExQKDQgECx74//////////// + ////////////////XygZFyEnJSUsK5K8sJItJSYgIhgTFREODhz8//////////////////////////9f + ShghJiUrKjMyMYS6uquEMystJSAXGUtEDhEk9f////////////////////////9fKCAlLDMxMDY1U6C4 + uLm6UzEyKy0mIYh6RA4j+/////////////////////////9fJyUqMjc1PDo5jrW1tba3jj02MTMsJYyM + ekQpHvX///////////////////////8vLSoxNjw5SUdGpbOzs7Smhjk6PTcyPqKWjHpCJPX///////// + /////////////2A0KjA1OklGRU5Oh7GxsYZOUEZIaamoq66iloh6I/f//////////////////////2Aq + MDU6SEVPTWaZk6efeVlaTU5Qqre5uryonpaII/r//////////////////////2AxNjpIRU55n7+nh5mU + eFZWWHB+s7W3ubq8qJ6MU/v//////////////////////2A3O0lFTpTAwHyHwJViYmNkZVZZirO1t7m7 + sKKWU/r//////////////////////2A9OUZOfsDDw8XFmmxsbGpoY2VWWZOztaB7hI+eU/f///////// + /////////////2A7SFBwwMPFx8jKyo1ycnFsamJlV5+ypra5u7CiU/f///////////////////////9A + Rk55w8bJzM/R0dGNdHRybmpjZX6Ys7W3uryoP/////////////////////////9gRU15xsnP09ja29rN + fXZ0cmxoZIexsrS2ubuXQv////////////////////////9gT3C+yc/Y293V0tXd1YB2dHFqY5mxirOq + uLp7TP//////////////////////////a5XHztPb1dKQr9DSnYV9dHJsYmeTirKguKlp//////////// + ////////////////YMXJ0dnd0puFwsutiYKhg3JzeGVYh7K0t4ZU//////////////////////////// + /8zM09vW0MvCwq3LkZ3cwYGkw4dYTZi0oG3////////////////////////////////E08HX0MvCha3C + ha/d2M6aY1ZZTVuleP//////////////////////////////////i6PXocuAncKdgK/d2M6+dVZZTkVt + /////////////////////////////////////8HWva+cnJCc0Nfc1MzHf1dNUW3///////////////// + //////////////////////+NoaGvy8u90tXa0crGf1ldbf////////////////////////////////// + /////////42Nvb3S1cHYzsi+i23/////////////////////////////////////////////////vYO9 + rG53yMj///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAP// + /////wAA///wD///AAD/+AAAH/8AAP/wAAAf/wAA//AAAB//AAD/8AAAH/8AAP/wAAAf/wAA//AAAB// + AAD/8AAAP/8AAP//4B///wAA///wH///AAD///Af//8AAP//8B///wAA///wH///AAD//8AD//8AAP// + AAD//wAA//wAAH//AAD/+AAAP/8AAP/wAAAf/wAA/+AAAA//AAD/wAAAB/8AAP/AAAAH/wAA/4AAAAP/ + AAD/gAAAA/8AAP+AAAAB/wAA/4AAAAH/AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8A + AAAB/wAA/wAAAAH/AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAP/AAD/wAAAB/8AAP/AAAAH/wAA/+AAAA// + AAD/8AAAH/8AAP/4AAA//wAA//wAAH//AAD//gAA//8AAP//gAP//wAA///gH///AAD///////8AAP// + /////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNt + VwDFaFEAyGJGAMxmTAC+WjwAzmhKALVPKQC6VC8AuVMwALpUMQC+WDUAw107AK5XOQCvSSAAzWc9AKFm + TwChOwsApD4RAKZAEwCrRxwAnTcFAJhGHgCPQxwAeTsdAKA6AACdNwAAnVo0AF8/LgBbQjQAV0pDAKdB + AACkPgAAojwAALhUFQCBRB4AvXBBAKxGAACqRAAAqUMAAMhiIADVbygAakQrALROAACzTQAAsUsAAK9J + AACyTwYAhD4MAL1XAAC6VAAAuVMAALdRAACkSwAA2HIdAIhIEwCRURsAxV8AAMBaAAC+WAAAxmsXAM5o + AADNZwAAymQAAMljAACjYBwA2XMAANdxAADVbwAA0mwAANFrAADYdwsAxXQfANWSRwCPYjMAjoFzAON9 + AADgegAA3HYAANt1AADlgwkAgEoIAIFQFACEZkIAlXZRAP/x4ADxiwAA74kAAO2HAADoggAA5oAAAOuH + BACvlXMArZqBAP/x3wD1jwAA8owAAPqUAQDSfAEA/poGAPKbHQCLXBgA6KZIAMiVSgD/px0A/68rAOqs + TgDjr1sA6LlwAH5mPwDMhQMA/7Q1AP+7QwC/lEEA/8hfAPrShgCmcwAA4qAPALeAAQCBYRMA68dvAP/c + hgCXdgYA1bIyAPLagQB7ZwAAg3IAALafEADXx10AkIMAAGRgKACdlwsA//3NAH5+AQBdXwEAs7Y+AImT + AQCOlxYAgowDAGJmMQDZ4ZAAbYIAAHmSCABPXRAA4/CuAJ24PgBliwAAwuGQAEJuAADH5poAT4wBAGuk + HQB9tz0ARmYjAJ/QcQBapBsAN4AAADplGwAoZgAAPpcHAKDdhwDB8bAAJmYTAHTGWgCs5poAG3wAABtl + CABCqyQAMqMZAHXIYgC576wAIZoHAFS6QwAOfgAADocAAMX5wACY4pIAC2YGABWeDwB71HcABmgDAACR + AAAAjgAAAIoAAACFAAAAgwAAAIAAAAB9AAAAegAAAHYAAAB1AAAAcQAAAG4AAABtAAABaAEAuvS8AAyl + FwAmry4Ah9+MAEPATwCi7akAFK0oABewLQAbtDUAfuCOAB63OwBGyF8AH7g9ACG6QgCY7akAIrtEACO8 + RwCG6J0AJr9MACfATgApwlMAYNuDAHXikgAtxloALsddADPLYgBR1noAV9l/ADjNaAA9z20ARdJyAEvU + dgB53/cAteXxANHx+QAVrdkAKsHrACq53wAlqtUAMa3VAEi12QBHrtIABX6vABSNuwABcqQAAW+iAAJ2 + qQD///8ApqamAJmZmQBzc3MAcHBwAG1tbQBcXFwAW1tbAFhYWABTU1MATU1NAEBAQAAmJiYAAAAAAP// + ////////////////+v39/f36///////////////////////////2+vr6+vHv7+/x8P36+vr6+vb///// + /////////////v7+/v7+5ufo6Oft/v7+/v7++v/////////////////08/Pz8/Pp4+Pj4+7z8/Pz8/76 + //////////////////ReXl5VVerk5eXk7l5eXl5e/vb/////////////////9PT09PT06+Xy8uXu9PT0 + 9PT0///////////////////////////p6+vq6uz////////////////////////////////////0VfP+ + +v////////////////////////////////////RV8/78////////////////////////////////S0pB + JEkkMCoe+f//////////////////////////XUgpDwICBAEBBgsXHfj//////////////////////2c2 + DAoJUw0JCQsMAwEIGPv///////////////////9JKA4TERWCUhUREhQHCwMDGPv///////////////// + ayIVGhkhII+dUSAZGhUTBwUFGPr//////////////2o8GiAfJS4thrSmNSUnIBoVFBANHPr///////// + ////ahkfLiw0MjGGv8CeMystJiE3UxAW+/f//////////2pIJiwzOzk/dLu8vL19OjIrJVKLbRsq9/// + ////////ai8rMTk+RkSNuLi5pXo9QDs0j5mLUyP3//////////9sKzFARkNOTY21tpZMTkJ+vsDCopmL + OPn//////////2wxQEVCYoqflp+rV1hZdpy7vsDCopll+v//////////ajlGQnayxIOom2NhYWBugbi7 + vsGxnWX4//////////9qPkNiqMnKy8V7b2loY19YlrmllJ6md/X//////////2pGTo7JzdLV1seAcnBo + Y2CSt629wLF39f//////////akdNic3V2t/g4LN8cnBoYY62uLy/wkH1////////////Zm7L1dzh2MzY + 3pV5cmljiJKurb6UVP/////////////FxdDa4diTkNTDhJN4b3VgWbe6vXr1///////////////T09zd + 2dHDw9GE4s6Rp4NZdLmNXP///////////////6mpzt7ZyK/DoZDd29N/VlpPhXH///////////////// + /6ma3dmklaqkxuLb0JdXTFBJ//////////////////////+Vs8yw1Mze4NfPm1tkbP////////////// + //////////+MjKCa3qOY06yHeP//////////////////////////////c3Nzc3Nzc/////////////// + /////A///wAAP/4AAD/+AAA//gAAP/4AAH//+B////wf///8H///4Af//4AB//8AAP/+AAB//AAAP/gA + AB/4AAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/4AAAf+AAAH/wAAD/8AAB//gAA//+A + Af//wAf///Af/ygAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkkgAJlL + LgDMcE4AekApALljPgBXTkoAckw2AE5DPQC/RwAAn0MLALNNDgCbQg0AqWU1AKxLAADPbRQAy4RBAP/x + 4ACqYgAA2IcfAP/x3wC7dAAA/6giAMeCAAC+kjEA5tKcAHBfLACkkg0AYFkrAG1kAACilAQA1sxkAISA + SQBZVhIAub1HAMDHewBZjQAAXpQBAEZgHQBYkggAPHcAAKTQggCy3JYA2PLJAEKjHgAZfQAAA3gAAA1r + CgAAdwAAo+ymAIXcjQCV66QAmu6rACq/TgAWv0UAb+KQADHJXwDN9/8Au+XvANrr7wAVrdkAKMDqACvB + 6wAquN8Ar+TyANTu9QAlp9IAMq3VAE222AAVkL4ALqvVAECy2QBHrtIAS7fbAAV+rwAZj70AAXapAAFx + owABb6IAAnWoAP///wCZmZkAfn5+AHBwcABYWFgAVVVVAEBAQAAmJiYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFhYWFhY + VFZWVlRYWFhYWFhYU1RUTE1NT05WVFRUU1hYV1dXVzw+Pz1KV1dXV1RYWFEUFBFDOjlASxQUFFdTWFhR + UVFRRDtQQUVRUVFRWFhYWFhYWEJHSUZIWFhYWFhYWFhYWFhYURFXVFhYWFhYWFhYWFhYDVERV1VYWFhY + WFhYWFhYDQ0FAwQIVVhYWFhYWFhYEAsMIQoBAgZSWFhYWFhYWBAJEi4dDhoHUlhYWFhYWFgPFSclFygv + HFJYWFhYWFhYEyw2IhYkMCZSWFhYWFhYWCM1NzEfHi0gWFhYWFhYWFhYMjM0OBsYWFhYWFhYWFhYWFgr + KikZWFhYWFhYWPwf///AAf//gAH//4AB9FWAA/z/+D////w////4P///8B///+AP///gD/9L4A8kSeAP + Kh7gH///8D////h///8oAAAAMAAAAGAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAADAAAACPAAAApwAAAKcAAACnAAAApwAA + AKcAAACnAAAAjwAAADAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAI8AAACnAAAApwAAAKcAAACnAAAApwF2qf8BcaP/AXGj/wFx + pP8Cc6X/AnWn/wJ1qP8Bb6L/AAAAvwAAAKcAAACnAAAApwAAAKcAAACnAAAApwAAAI8AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/xWt + 2f8rwev/Krjf/yu54P8pud7/Krje/yjA6v8Ffq//JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/wAA + AKcAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmZmZ/3Nzc/9zc3P/c3Nz/3Nz + c/9zc3P/c3Nz/x2r1/9Sze3/WNX0/1zc+/9c2/v/W9b2/0/O8P8JgrP/c3Nz/3Nzc/9zc3P/c3Nz/3Nz + c/9zc3P/JiYm/wAAAKcAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmZmZ/6am + pv+mpqb/pqam/6ampv+mpqb/pqam/ySs1/9z1u7/hur//4Dm//9/5f//jfL//2zV8f8Ph7f/pqam/6am + pv+mpqb/pqam/6ampv+mpqb/JiYm/wAAAKcAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAmZmZ/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/yus1v+Y3e//qPD//6Ls//+i7f//r/n//4zc + 8v8Zjr3/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/JiYm/wAAAKcAAAAYAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAmZmZ///x3///8d////Hg///x3///8eD///Hg/zKt1f+75e//zff//8fz + ///H8///0////6/k8v8Zj73///Hf///x3///8d////Hf///x3///8d//JiYm/wAAAI8AAAAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/022 + 2P/a6+///////////////////////9Tu9f8VkL7/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/wAA + ABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAACWn0v9Astn/S7fb/0a12v80rtb/K6rV/y6r1f9HrtL/AAAAMAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZn///Hg/+bm5v+mpqb/c3Nz/yYmJv8AAACnAAAAGAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZn///Hg/+bm5v+mpqb/c3Nz/yYm + Jv8AAACnAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZmZn///Hg/+bm + 5v+mpqb/c3Nz/yYmJv8AAACnAAAAHwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAEAAA + ACWZmZn///Hg/+bm5v+mpqb/c3Nz/yYmJv8AAACvAAAATwAAACUAAAASAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA + ABYAAAA/Gw4AelYrAL6xfkz/2pVU/8h8Ov+0aCr/m1sr/2o3E/9BGgDTDwYAtAAAAKEAAAB3AAAAQAAA + ABgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAKAAAAM2A1AJefVQDd1W8Q/9FrJf/SbD3/0WtD/9RuVf/UblX/0GpI/9BqSv/DXTH/sUsT/3kt + AOszEgDKAAAApwAAAHoAAAA0AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AP++WAD/uVMA/5RRAf8qZhX/Q2Yh/1tmLf90Zjr/kGA4/2InANwAAACAAAAAEgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3znO1uVoO/7VP + AP+8VgD/xF4A/8xmAP/RawD/1nAA/9lzAP/ddwD/33kA/42BAP8AjQD/AI0A/wCLAP9/gQD/3ngA/9t1 + AP/XcQD/020A/6hrAP8McQD/GGsA/wtoAP8KZgX/LWYX/0dmI/9fZi//e2Y+/4o4AO4AAACVAAAAFQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD3033FtE4A/7xWAP/FXwD/zWcA/9NtAP/YcgD/3HYA/+F7AP/WgAD/SJAA/1mQAP8elAD/LJIA/7CI + AP/pgwD/54EA/+N9AP/feQD/23UA/w19AP8AeQD/AHMA/wBuAP8AaQD/EWYI/zFmGf9OZif/ZmYz/5NJ + C/cAAACkAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADxxHL/ulQA/8JcAP/MZgD/020A/9lzAP/eeAD/uoQC/zyVBv8Fngr/I5wK/4uV + CP9CnAz/X5kH/8aQAv/wigD/7ogA/+uFAP/KggD/mn8A/wCEAP8AfwD/AHkA/wBzAP8AbgD/AGgA/xxm + Dv85Zh3/VWYq/6JWDf8AAACnAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuwHD/v1kA/8pkAP/RawD/2HIA/995AP9Ykgf/F6AR/wuk + Fv+7lQf/lJ0N/x+oHv9pohP//pgA//6YAP/7lQD/95EA//KMAP/uiAD/6IIA/3KDAP8AhAD/AH4A/wB4 + AP8AcQD/AGwA/wNmAf8pZhX/R2Yj/6NZC/8AAACkAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD314z/xmAA/89pAP/WcAD/3ngA/6CK + B/8MpRj/EKkg/xStKP8XsC3/GLEw/2+uKv//qyP//60n//+pIP//oxP//50I//yWAP/0jgD/7ogA/+iC + AP9WhAD/AIMA/wB9AP8mcwD/hGAA/2dcAP9IXQn/NmYb/6JdCf8AAACVAAAAFQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD656PDy2UA/9Nt + AP/bdQD/x4ED/w6nHP8UrSj/GLEw/xy1OP8etzz/IrtD/yK7Q/+su0X//7xH//+6Qv//tTj//60n//+h + EP/9lwD/9I4A/+2HAP86iwD/AIcA/xt+AP8AegD/AHMA/wBtAP8DZwH/KGYU/5pZBvYAAAB/AAAAEgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD77Kuy1XkV/9ZwAP/eeAD/sIoJ/xWuKv8btDX/ILk//yS9SP8nwE//KsNT/yvEVv8qw1T/oslf///M + Zv//xlr//7tF//+vK///oRD//JYA//KMAP+iiAD/SIcA/wCFAP8AfgD/AHcA/wBvAP8AaQD/GGYM/6VS + AOwAAABYAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD78bVy455E/9p0AP/ifAD/tY8M/xu0Nf8hukL/J8BO/y3GWv8zy2T/Oc5q/z3P + bf86zmv/Ts5r/+bbhf//1Xj//8pj//+7Q///rSf//5wH//aQAP+GjwD/AI8A/wCIAP8AgAD/AHoA/wBy + AP8AbAD/OGgB/3I6AM0AAAA0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/97sg8s2B/9x2AP/JgwX/J7Aw/yC5Qf8nwE7/MMlg/z3P + bf9L1Hb/UtZ7/2nZgP9T13z/TdV4/1bTdf//5Jb//9V4///GWv//tTj//6IS//uVAP9NlgL/AJIA/3+C + AP8AhAD/DXsA/wB0AP8AbgD/iXAA/0UkAJcAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAP/yszD766py9eKdhfTdk4b014uG9NOBhvDLeHfbtWQ4AAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///AP//8AAP/4AAAf/wAA//AAAA// + AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAB//AAD//+AP//8AAP// + 8A///wAA///wD///AAD//+AH//8AAP//gAH//wAA//4AAH//AAD//AAAP/8AAP/4AAAf/wAA//AAAA// + AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/gAAAAf8AAP+AAAAB/wAA/wAAAAD/AAD/AAAAAP8AAP8A + AAAA/wAA/wAAAAD/AAD/AAAAAP8AAP8AAAAA/wAA/wAAAAD/AAD/AAAAAP8AAP8AAAAA/wAA/wAAAAD/ + AAD/AAAAAP8AAP8AAAAB/wAA/4AAAAH/AAD/gAAAA/8AAP/AAAAD/wAA/8AAAAf/AAD/4AAAD/8AAP/w + AAAf/wAA//gAAD//AAD//AAAf/8AAP//AAH//wAA///gD///AAD///////8AAP///////wAAKAAAACAA + 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 + Ff8AAACjAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwx3n/zWcA/9dxAP/SfAL/KKEX/xKr + Jf8XsC3/GrM0/yu1OP/VsjL//7Mz//+tKP//pBf//poF//WPAP/shgD/SIcA/wCDAP8aeQD/PmwA/y1j + AP8cZg7/gGEQ/wAAAIwAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvCdtLRawD/3HYA/3qT + D/8Vrir/HbY5/yK7RP8mv0z/J8BO/0PAT//Xx13//8VY//+7Q///qiL//poF//ONAP9niwD/AIkA/w5/ + AP8AdgD/AG4A/wtmBv96VwjxAAAAbgAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PG0odh3 + C//gegD/jpcW/x63PP8mv03/Lsdb/zjNaP89z23/Pc9t/3bTdP/y2oH//8xm//+7Q///qB3/+pQA/3iQ + AP8AjQD/AIQA/wB7AP8AcQD/AGkA/5VNAOAAAABFAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD/+sJA6KZI/8mCBv8btDb/Jb5L/zLKYf9G0nP/YdmA/37fjP9h3IX/Vdh9/8Tmmf//3Ib//8he//+w + Lv/+mgX/iZMB/2OKAP8OhwD/DX0A/wB0AP9GcAD/ZDYArgAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD556fQI6wp/yC5Qf8sxVn/RNFx/1/bhP/B4pL/4vKz/4bonf+58L////3N/8Lg + jv/mymP//7Q2/+KgD//yjAD/6YMA/wCLAP8AgAD/AHYA/5dyAPMAAABFAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//zECM2H7/I7xH/zPLY/9R1nr/dOKR/5Pspv+09Lb/vvW9/5zt + q////cz/S9R2/0nIXf+duD7/Qqsk/5uVCv/oggD/pnsA/wCCAP9rgwD/bT4AjAAAABMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//zI91yGL/Q8hg/1nZgP9245P/ou2p/8X5 + wP+7+L//wfGw/+PtqP9Q1nr/Lsdd/yO8Rv+2nxD/8YsA/+aAAP/bdQD/fn4B/6lvAL4AAAAcAAAAAAAA + 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 + + + \ No newline at end of file diff --git a/Rei.Fs.Webdav/WebdavFs.cs b/Rei.Fs.Webdav/WebdavFs.cs new file mode 100644 index 0000000..020ddc3 --- /dev/null +++ b/Rei.Fs.Webdav/WebdavFs.cs @@ -0,0 +1,2727 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.WebdavFs +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Net; +using System.Net.Security; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; +using System.Xml; + +namespace Rei.Fs.Webdav +{ + public class WebdavFs : FsBase + { + public const string NameSpace_DAV = "DAV:"; + public const string NameSpace_urnmicrosoft = "urn:schemas-microsoft-com:"; + public const string DAV_CreationDate = "DAV:creationdate"; + public const string DAV_DisplayName = "DAV:displayname"; + public const string DAV_GetContentLanguage = "DAV:getcontentlanguage"; + public const string DAV_GetContentLength = "DAV:getcontentlength"; + public const string DAV_GetContentType = "DAV:getcontenttype"; + public const string DAV_GetETag = "DAV:getetag"; + public const string DAV_GetLastModified = "DAV:getlastmodified"; + public const string DAV_ResourceType = "DAV:resourcetype"; + public const string Microsoft_Win32CreationTime = "urn:schemas-microsoft-com:Win32CreationTime"; + public const string Microsoft_Win32LastModifiedTime = "urn:schemas-microsoft-com:Win32LastModifiedTime"; + public const string Microsoft_Win32LastAccessTime = "urn:schemas-microsoft-com:Win32LastAccessTime"; + public const string Microsoft_Win32FileAttribute = "urn:schemas-microsoft-com:Win32FileAttributes"; + private static string pDefClientName; + private static FieldInfo WebHeader_InnerCollectionInfo; + private static FieldInfo s_ModuleBindingInfo; + private static FieldInfo m_StoreInfo; + private static FieldInfo challengeCacheinfo; + private static WebdavFs.WebDAVCredentialManager pCredentialPolicy; + public bool UseDefaultCredential; + public bool UsePreAuthentication_Basic; + public bool UsePreAuthentication_WSSE; + private string[] pAuthModules; + public X509Certificate2Collection ClientCertificates; + private bool UsePassportAuthentication; + public SslProtocols DisableTlsVersions; + public Encoding URIRequestEncoding; + public Encoding URIResponseEncoding; + public Encoding CredentialEncoding; + public bool DontRequestGzip; + public bool DontRequestDeflate; + public bool RequestTranslatef; + public bool DontExpect100; + public bool SendEmptyPUT; + public bool DontUpdateProperty; + public bool UseFullUriInDestinationHeader; + public string UploadCompression; + public int MaxRedirection; + public bool DontVerifyContentRange; + public bool RedirectionCollectionOnly; + public bool RemoveLastSlashOnMKCOL; + public bool DisableUploadResume; + public IWebProxy Proxy; + public int ReadWriteTimeout; + public int ConnectTimeout; + private PassportAuthHelper pPassportAuthHelper; + private string pLastAuthType; + private List pServicePointList; + private Uri pLastUri; + + static WebdavFs() + { + UriParserFixer.Register(); + AuthenticationManager.Register((IAuthenticationModule) new WsseClient()); + WebdavFs.pCredentialPolicy = new WebdavFs.WebDAVCredentialManager(); + AuthenticationManager.CredentialPolicy = (ICredentialPolicy) WebdavFs.pCredentialPolicy; + WebdavFs.WebHeader_InnerCollectionInfo = typeof (WebHeaderCollection).GetField("m_InnerCollection", BindingFlags.Instance | BindingFlags.NonPublic); + try + { + object obj = (object) null; + IEnumerator registeredModules = AuthenticationManager.RegisteredModules; + while (registeredModules.MoveNext()) + { + if (Operators.CompareString(((IAuthenticationModule) registeredModules.Current).AuthenticationType, "Digest", false) == 0) + { + obj = (object) (IAuthenticationModule) registeredModules.Current; + break; + } + } + if (obj == null) + throw new Exception("No digest authentication module"); + WebdavFs.s_ModuleBindingInfo = typeof (AuthenticationManager).GetField("s_ModuleBinding", BindingFlags.Static | BindingFlags.NonPublic); + WebdavFs.m_StoreInfo = WebdavFs.s_ModuleBindingInfo.FieldType.GetField("m_Store", BindingFlags.Instance | BindingFlags.NonPublic); + WebdavFs.challengeCacheinfo = obj.GetType().GetField("challengeCache", BindingFlags.Static | BindingFlags.NonPublic); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + WebdavFs.pDefClientName = ((AssemblyProductAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false)[0]).Product + "/" + executingAssembly.GetName().Version.ToString(3); + } + + internal static bool ShouldSendCredential(Uri challengeUri, WebRequest request, NetworkCredential credential, IAuthenticationModule authenticationModule) + { + string lower = authenticationModule.AuthenticationType.ToLower(); + ConnectionSetting connectionSetting = WebRequestCertificateValidationManager.GetConnectionSetting(request) as ConnectionSetting; + if (connectionSetting == null) + return false; + string[] authModules = connectionSetting.AuthModules; + if (authModules == null || authModules.Length == 0) + return true; + string[] strArray = authModules; + int index = 0; + while (index < strArray.Length) + { + if (Operators.CompareString(strArray[index].ToLower(), lower, false) == 0) + return true; + checked { ++index; } + } + return false; + } + + public WebdavFs(ConnectionSetting setting) + : base((ConnectionSettingBase) setting) + { + this.ClientName = WebdavFs.pDefClientName; + this.ReadWriteTimeout = 10000; + this.ConnectTimeout = 10000; + this.URIRequestEncoding = Encoding.GetEncoding("utf-8"); + this.URIResponseEncoding = Encoding.GetEncoding("utf-8"); + this.CredentialEncoding = Encoding.GetEncoding("utf-8"); + this.AuthModules = new string[0]; + this.ClientCertificates = new X509Certificate2Collection(); + this.UploadCompression = "None"; + this.MaxRedirection = 2; + this.pServicePointList = new List(); + } + + public string[] AuthModules + { + get + { + return this.pAuthModules; + } + set + { + if (value == null) + value = new string[0]; + this.pAuthModules = value; + int num1 = 0; + int num2 = checked (this.pAuthModules.Length - 1); + int index = num1; + while (index <= num2) + { + if (Operators.CompareString(this.pAuthModules[index].ToUpper(), "Passport".ToUpper(), false) == 0) + { + this.UsePassportAuthentication = true; + return; + } + checked { ++index; } + } + if (this.pAuthModules.Length == 0) + this.UsePassportAuthentication = true; + else + this.UsePassportAuthentication = false; + } + } + + public PassportAuthHelper PassportAuth + { + get + { + if (this.pPassportAuthHelper == null) + { + this.pPassportAuthHelper = new PassportAuthHelper(); + this.pPassportAuthHelper.UserAgent = this.ClientName; + this.pPassportAuthHelper.Proxy = this.Proxy; + this.pPassportAuthHelper.ReadWriteTimeout = this.ReadWriteTimeout; + this.pPassportAuthHelper.ConnectTimeout = this.ConnectTimeout; + this.pPassportAuthHelper.CookieContainer = this.ConnectionSetting.CookieContainer; + this.pPassportAuthHelper.GroupName = this.GroupName; + } + return this.pPassportAuthHelper; + } + } + + public string LastAuthType + { + get + { + return this.pLastAuthType; + } + } + + public override SecureType LastSecureType + { + get + { + if ((object) this.pLastUri != null && Operators.CompareString(this.pLastUri.Scheme, Uri.UriSchemeHttps, false) == 0) + return this.ConnectionSetting.LastCertError == SslPolicyErrors.None ? SecureType.Secure : SecureType.Warning; + return Operators.CompareString(this.LastAuthType.ToLowerInvariant(), "basic", false) == 0 ? SecureType.Warning : SecureType.None; + } + } + + public override FsAbility Ability + { + get + { + return this.DisableUploadResume ? FsAbility.AdvancedFs | FsAbility.Times | FsAbility.Lock | FsAbility.MoveOver | FsAbility.CopyOver | FsAbility.PartialRead | FsAbility.Property : FsAbility.All; + } + } + + public override void ResetConnection() + { + bool flag1 = true; + List.Enumerator enumerator; + try + { + enumerator = this.pServicePointList.GetEnumerator(); + while (enumerator.MoveNext()) + { + ServicePoint current = enumerator.Current; + try + { + flag1 &= current.CloseConnectionGroup(this.GroupName); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + } + finally + { + enumerator.Dispose(); + } + this.pServicePointList.Clear(); + try + { + if (this.pPassportAuthHelper != null) + { + bool flag2 = flag1 & this.pPassportAuthHelper.ResetConnection(); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + base.ResetConnection(); + } + + public Uri HeadResource(Uri target) + { + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(target); + Uri uri = UriUtil.UriEncodeConvert(target, (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri); + request.Method = "HEAD"; + request.ContentLength = 0L; + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri = new Uri(uri, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (!WebdavFs.CheckStatus(response)) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + return UriUtil.UriEncodeConvert(response.ResponseUri, this.URIResponseEncoding, (Encoding) null); + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(target, (Exception) simpleWebException); + throw; + } + } + } + } + + public DavResourceOptions GetResourceOptions(Uri target) + { + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(target); + Uri uri = UriUtil.UriEncodeConvert(target, (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri); + request.Method = "OPTIONS"; + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri = new Uri(uri, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (!WebdavFs.CheckStatus(response)) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + return new DavResourceOptions(UriUtil.UriEncodeConvert(response.ResponseUri, this.URIResponseEncoding, (Encoding) null), response); + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(target, (Exception) simpleWebException); + throw; + } + } + } + } + + public override ResourceInfo GetInfo(Uri targeturi) + { + WebdavFs.CheckUri(targeturi); + return this.InnerGetInfo(targeturi, WebdavFs.DepthType.Depth_0)[0]; + } + + public override ResourceInfo GetInfo(ResourceId id) + { + return this.InnerGetInfo(id.Uri, WebdavFs.DepthType.Depth_0)[0]; + } + + public override ResourceInfo GetInfo(ResourceId parentid, string name) + { + return this.InnerGetInfo(UriUtil.CombineName(parentid.Uri, name), WebdavFs.DepthType.Depth_0)[0]; + } + + public override ResourceInfo[] GetEntries(ResourceId id) + { + List info = this.InnerGetInfo(id.Uri, WebdavFs.DepthType.Depth_1); + if (info.Count >= 1) + info.RemoveAt(0); + return info.ToArray(); + } + + public override ResourceInfo[] GetInfoAndEntries(ResourceId id) + { + return this.InnerGetInfo(id.Uri, WebdavFs.DepthType.Depth_1).ToArray(); + } + + public override ResourceInfo[] GetInfoAndEntries(Uri targeturi) + { + WebdavFs.CheckUri(targeturi); + return this.InnerGetInfo(targeturi, WebdavFs.DepthType.Depth_1).ToArray(); + } + + public override ResourceInfo[] GetParentInfoAndEntries(ResourceId childid) + { + return this.InnerGetInfo(UriUtil.GetParent(childid.Uri), WebdavFs.DepthType.Depth_1).ToArray(); + } + + private List InnerGetInfo(Uri target, WebdavFs.DepthType depth) + { + int num = 0; + string str1 = (string) null; + Uri uri = UriUtil.UriEncodeConvert(target, (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri); + request.Method = "PROPFIND"; + string str2 = string.Empty; + if (!this.DontRequestDeflate) + str2 = "deflate"; + if (!this.DontRequestGzip) + { + if (str2.Length > 0) + str2 += ", "; + str2 += "gzip"; + } + if (str2.Length > 0) + request.Headers.Add(HttpRequestHeader.AcceptEncoding, str2); + switch (depth) + { + case WebdavFs.DepthType.Depth_infinity: + request.Headers.Add("Depth", "infinity"); + break; + case WebdavFs.DepthType.Depth_0: + request.Headers.Add("Depth", "0"); + break; + case WebdavFs.DepthType.Depth_1: + request.Headers.Add("Depth", "1"); + break; + } + request.ContentLength = 0L; + if (str1 != null) + request.Headers.Add(HttpRequestHeader.Authorization, str1); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str1 = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri = new Uri(uri, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (response.StatusCode != (HttpStatusCode) 207) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + List propfindResponse = this.ParsePROPFINDResponse(this.GetResponseBody(response), response.ResponseUri); + if (this.RedirectionCollectionOnly && !propfindResponse[0].IsCollection) + propfindResponse[0].Id = new ResourceId(target, (FsBase) this); + return propfindResponse; + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(target, (Exception) simpleWebException); + throw; + } + } + } + } + + public override ReturnedInfo CreateCollection(ResourceId parendid, string name) + { + Uri uri1 = UriUtil.AddLastSlash(UriUtil.CombineName(parendid.Uri, name)); + int num = 0; + string str = (string) null; + Uri uri2 = !this.RemoveLastSlashOnMKCOL ? UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding) : UriUtil.UriEncodeConvert(UriUtil.RemoveLastSlash(uri1), (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri2); + request.Method = "MKCOL"; + request.ContentLength = 0L; + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri2 = new Uri(uri2, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (!WebdavFs.CheckStatus(response)) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + break; + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri2.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri2 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + throw; + } + } + } + return (ReturnedInfo) new ResourceId(uri1, (FsBase) this); + } + + public override void Delete(ResourceId id) + { + Uri uri1 = id.Uri; + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(uri1); + Uri uri2 = UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri2); + request.Method = "DELETE"; + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri2 = new Uri(uri2, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (WebdavFs.CheckStatus(response)) + break; + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri2.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri2 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + throw; + } + } + } + } + + public override ReturnedInfo Move(ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + if (newname == null) + newname = UriUtil.GetLastName(id.Uri); + Uri baseuri = (object) newparentid != null ? newparentid.Uri : UriUtil.GetParent(id.Uri); + Uri uri1 = id.Uri; + Uri target1 = UriUtil.CombineName(baseuri, newname); + Uri uri2 = !UriUtil.EndWithSlash(uri1) ? UriUtil.RemoveLastSlash(target1) : UriUtil.AddLastSlash(target1); + int num = 0; + string str = (string) null; + if (UriUtil.UriEquals(uri1, uri2, this.IsCaseSensitiveFs)) + throw new DestinationAlreadyExistsException(uri2); + Uri uri3 = UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding); + Uri target2 = UriUtil.UriEncodeConvert(uri2, (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri3); + request.Method = "MOVE"; + if (this.UseFullUriInDestinationHeader) + request.Headers.Add("Destination", target2.AbsoluteUri); + else if (Operators.CompareString(UriUtil.GetAuthority(uri3), UriUtil.GetAuthority(target2), false) != 0) + request.Headers.Add("Destination", target2.AbsoluteUri); + else + request.Headers.Add("Destination", target2.AbsolutePath); + if (overwrite) + request.Headers.Add("Overwrite", "T"); + else + request.Headers.Add("Overwrite", "F"); + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri3 = new Uri(uri3, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (!WebdavFs.CheckStatus(response)) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + break; + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri3.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri3 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + if (simpleWebException.StatusCode == 412) + throw new DestinationAlreadyExistsException(uri2, (Exception) simpleWebException); + throw; + } + } + } + return (ReturnedInfo) new ResourceId(uri2, (FsBase) this); + } + + public override ReturnedInfo Copy(ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + if (newname == null) + newname = UriUtil.GetLastName(id.Uri); + Uri baseuri = (object) newparentid != null ? newparentid.Uri : UriUtil.GetParent(id.Uri); + Uri uri1 = id.Uri; + Uri target1 = UriUtil.CombineName(baseuri, newname); + Uri uri2 = !UriUtil.EndWithSlash(uri1) ? UriUtil.RemoveLastSlash(target1) : UriUtil.AddLastSlash(target1); + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(uri1); + WebdavFs.CheckUri(uri2); + if (UriUtil.UriEquals(uri1, uri2, this.IsCaseSensitiveFs)) + throw new DestinationAlreadyExistsException(uri2); + Uri uri3 = UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding); + Uri target2 = UriUtil.UriEncodeConvert(uri2, (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri3); + request.Method = "COPY"; + if (this.UseFullUriInDestinationHeader) + request.Headers.Add("Destination", target2.AbsoluteUri); + else if (Operators.CompareString(UriUtil.GetAuthority(uri3), UriUtil.GetAuthority(target2), false) != 0) + request.Headers.Add("Destination", target2.AbsoluteUri); + else + request.Headers.Add("Destination", target2.AbsolutePath); + if (overwrite) + request.Headers.Add("Overwrite", "T"); + else + request.Headers.Add("Overwrite", "F"); + request.Headers.Add("Depth", "infinity"); + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri3 = new Uri(uri3, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (!WebdavFs.CheckStatus(response)) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + break; + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri3.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri3 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + if (simpleWebException.StatusCode == 412) + throw new DestinationAlreadyExistsException(uri2, (Exception) simpleWebException); + throw; + } + } + } + return (ReturnedInfo) new ResourceId(uri2, (FsBase) this); + } + + public override ReturnedInfo SetResourceInfo(ResourceInfo info, ResourceInfo original) + { + if (this.DontUpdateProperty) + return (ReturnedInfo) info; + int num = 0; + string str = (string) null; + Uri uri1 = info.Id.Uri; + WebdavFs.CheckUri(uri1); + Uri uri2 = UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding); + string proppatchRequest = WebdavFs.CreatePROPPATCHRequest(info, original); + if (proppatchRequest == null) + return (ReturnedInfo) info; + byte[] bytes = Encoding.UTF8.GetBytes(proppatchRequest); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri2); + request.Method = "PROPPATCH"; + request.ContentType = "text/xml; charset=\"utf-8\""; + request.ContentLength = (long) bytes.Length; + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (Stream requestStream = this.GetRequestStream(request)) + requestStream.Write(bytes, 0, bytes.Length); + using (HttpWebResponse response = this.GetResponse(request, false)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri2 = new Uri(uri2, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (response.StatusCode != (HttpStatusCode) 207) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (!WebdavFs.CheckPROPPATCHResponse(this.GetResponseBody(response))) + throw new SimpleWebException("Cannot PROPPATCH", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + break; + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri2.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri2 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + throw; + } + } + } + return (ReturnedInfo) info; + } + + public override ReturnedInfo SetTimes(ResourceId id, DateTime lastmodifiedtime, DateTime creationtime, DateTime lastaccesstime) + { + if (DateTime.Compare(lastmodifiedtime, DateTime.MinValue) == 0 && DateTime.Compare(creationtime, DateTime.MinValue) == 0 && DateTime.Compare(lastaccesstime, DateTime.MinValue) == 0) + throw new InvalidOperationException(); + Uri uri1 = id.Uri; + if (this.DontUpdateProperty) + return (ReturnedInfo) id; + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(uri1); + Uri uri2 = UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append(""); + stringBuilder.Append(""); + stringBuilder.Append(""); + if (DateTime.Compare(creationtime, DateTime.MinValue) != 0) + { + stringBuilder.Append(""); + stringBuilder.Append(creationtime.ToUniversalTime().ToString("r")); + stringBuilder.Append(""); + } + if (DateTime.Compare(lastaccesstime, DateTime.MinValue) != 0) + { + stringBuilder.Append(""); + stringBuilder.Append(lastaccesstime.ToUniversalTime().ToString("r")); + stringBuilder.Append(""); + } + if (DateTime.Compare(lastmodifiedtime, DateTime.MinValue) != 0) + { + stringBuilder.Append(""); + stringBuilder.Append(lastmodifiedtime.ToUniversalTime().ToString("r")); + stringBuilder.Append(""); + } + stringBuilder.Append(""); + stringBuilder.Append(""); + byte[] bytes = Encoding.UTF8.GetBytes(stringBuilder.ToString()); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri2); + request.Method = "PROPPATCH"; + request.ContentType = "text/xml; charset=\"utf-8\""; + request.ContentLength = (long) bytes.Length; + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (Stream requestStream = this.GetRequestStream(request)) + requestStream.Write(bytes, 0, bytes.Length); + using (HttpWebResponse response = this.GetResponse(request, false)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + else if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri2 = new Uri(uri2, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (response.StatusCode != (HttpStatusCode) 207) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (!WebdavFs.CheckPROPPATCHResponse(this.GetResponseBody(response))) + throw new SimpleWebException("Cannot PROPPATCH", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + break; + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri2.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri2 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + throw; + } + } + } + return (ReturnedInfo) id; + } + + public override Stream OpenRead(Uri targeturi) + { + Uri target = targeturi; + long start = 0; + long length = -1; + return this.InnerOpenRead(target, ref start, ref length); + } + + public override Stream OpenRead(ResourceId id, ref long start, ref long length) + { + if (start < 0L) + throw new ArgumentOutOfRangeException(nameof (start)); + WebdavFs.CheckUri(id.Uri); + return this.InnerOpenRead(id.Uri, ref start, ref length); + } + + private Stream InnerOpenRead(Uri target, ref long start, ref long length) + { + WebdavFs.CheckUri(target); + HttpWebResponse httpWebResponse = (HttpWebResponse) null; + int num = 0; + string str1 = (string) null; + if (start < 0L && length < 0L) + throw new ArgumentOutOfRangeException(nameof (start)); + if (length == 0L) + throw new ArgumentOutOfRangeException(nameof (length)); + Uri uri = UriUtil.UriEncodeConvert(target, (Encoding) null, this.URIRequestEncoding); + WebdavFs.ExtWebHeaderCollection headerCollection; + while (true) + { + HttpWebRequest request = this.CreateRequest(uri); + request.Method = "GET"; + request.Accept = "*/*"; + if (this.RequestTranslatef) + request.Headers.Add("Translate", "f"); + headerCollection = new WebdavFs.ExtWebHeaderCollection(); + if (start == 0L) + { + if (length >= 0L) + headerCollection.Add("Range", "bytes=0-" + checked (start + length - 1L).ToString()); + } + else if (start < 0L) + headerCollection.Add("Range", "bytes=-" + length.ToString()); + else if (length < 0L) + headerCollection.Add("Range", "bytes=" + start.ToString() + "-"); + else + headerCollection.Add("Range", "bytes=" + start.ToString() + "-" + checked (start + length - 1L).ToString()); + if (headerCollection.Count > 0) + { + NameValueCollection nameValueCollection = (NameValueCollection) WebdavFs.WebHeader_InnerCollectionInfo.GetValue((object) request.Headers); + try + { + foreach (object obj in (WebHeaderCollection) headerCollection) + { + string name = Conversions.ToString(obj); + nameValueCollection.Add(name, headerCollection[name]); + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + } + else + { + string str2 = string.Empty; + if (!this.DontRequestDeflate) + str2 = "deflate"; + if (!this.DontRequestGzip) + { + if (str2.Length > 0) + str2 += ", "; + str2 += "gzip"; + } + if (str2.Length > 0) + request.Headers.Add(HttpRequestHeader.AcceptEncoding, str2); + } + if (str1 != null) + request.Headers.Add(HttpRequestHeader.Authorization, str1); + try + { + httpWebResponse = this.GetResponse(request, true); + checked { ++num; } + if (num > this.MaxRedirection) + { + httpWebResponse.Close(); + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) httpWebResponse); + } + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(httpWebResponse)) + str1 = this.PassportAuth.GetPassportToken(httpWebResponse, this.UserName, this.Password); + else if (httpWebResponse.StatusCode >= HttpStatusCode.MultipleChoices) + { + if (httpWebResponse.StatusCode < HttpStatusCode.BadRequest) + { + httpWebResponse.Close(); + uri = new Uri(uri, httpWebResponse.Headers[HttpResponseHeader.Location]); + } + else + break; + } + else + break; + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (httpWebResponse != null) + httpWebResponse.Close(); + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(target, (Exception) simpleWebException); + if (simpleWebException.StatusCode == 416) + throw new InvalidRangeException((Exception) simpleWebException); + throw; + } + } + } + if (!WebdavFs.CheckStatus(httpWebResponse)) + { + SimpleWebException simpleWebException = new SimpleWebException("Unassumed " + httpWebResponse.Method + " response\r\nStatus: " + Conversions.ToString((int) httpWebResponse.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) httpWebResponse); + httpWebResponse.Close(); + throw simpleWebException; + } + try + { + if (this.DontVerifyContentRange) + { + if (httpWebResponse.StatusCode != HttpStatusCode.PartialContent) + { + start = 0L; + length = httpWebResponse.ContentLength; + } + } + else if (httpWebResponse.Headers[HttpResponseHeader.ContentRange] == null) + { + if (httpWebResponse.StatusCode == HttpStatusCode.PartialContent) + throw new InvalidServerResponseException("\"206 Partial Content\" MUST contain Content-Range Header."); + start = 0L; + length = httpWebResponse.ContentLength; + } + else + { + if (headerCollection.Count == 0) + throw new InvalidServerResponseException("Unexpected Content-Range Header"); + FsBase.ParseContentRange(httpWebResponse.Headers[HttpResponseHeader.ContentRange], ref start, ref length, true); + } + } + catch (InvalidServerResponseException ex) + { + ProjectData.SetProjectError((Exception) ex); + InvalidServerResponseException responseException = ex; + httpWebResponse.Close(); + throw new InvalidRangeException((Exception) responseException); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + httpWebResponse.Close(); + throw; + } + Stream stream = (Stream) null; + try + { + stream = httpWebResponse.GetResponseStream(); + if (httpWebResponse.Headers[HttpResponseHeader.ContentEncoding] != null) + { + string lower = httpWebResponse.Headers[HttpResponseHeader.ContentEncoding].ToLower(); + if (Operators.CompareString(lower, "gzip", false) == 0 || Operators.CompareString(lower, "x-gzip", false) == 0) + { + stream = (Stream) new GZipStream(stream, CompressionMode.Decompress); + length = -1L; + } + else + { + if (Operators.CompareString(lower, "deflate", false) != 0) + throw new InvalidServerResponseException("invalid content encoding"); + stream = (Stream) new ZlibStream(stream, CompressionMode.Decompress, false, true); + length = -1L; + } + } + return (Stream) new PartialStream(stream, length); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + if (stream != null) + stream.Close(); + throw; + } + } + + public override Stream OpenWrite(ResourceId parentid, string name, long length) + { + return this.InnerOpenWrite(UriUtil.CombineName(parentid.Uri, name), (string) null, length); + } + + public override Stream OpenWriteOver(ResourceId id, long length) + { + return this.InnerOpenWrite(id.Uri, (string) null, length); + } + + public override Stream OpenWriteResume(ResourceId id, ref long start, ref long length) + { + Uri uri = id.Uri; + if (start < 0L) + throw new ArgumentOutOfRangeException(nameof (start)); + if (length < 0L) + throw new ArgumentOutOfRangeException(nameof (length)); + string contentrange; + if (length < 0L) + contentrange = "bytes " + start.ToString() + "-/*"; + else + contentrange = "bytes " + start.ToString() + "-" + checked (start + length - 1L).ToString() + "/*"; + return this.InnerOpenWrite(uri, contentrange, length); + } + + private Stream InnerOpenWrite(Uri target, string contentrange, long length) + { + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(target); + Uri uri = UriUtil.UriEncodeConvert(target, (Encoding) null, this.URIRequestEncoding); + HttpWebRequest request1; + Stream stream; + while (true) + { + try + { + string lowerInvariant = this.LastAuthType.ToLowerInvariant(); + if (Operators.CompareString(lowerInvariant, "negotiate", false) == 0 || Operators.CompareString(lowerInvariant, "ntlm", false) == 0 || Operators.CompareString(lowerInvariant, "kerberos", false) == 0) + { + HttpWebRequest request2 = this.CreateRequest(uri); + request2.Method = "PUT"; + request2.Headers.Add(HttpRequestHeader.Allow, "PUT"); + request2.ContentLength = 0L; + request2.AllowWriteStreamBuffering = true; + request2.PreAuthenticate = false; + if (str != null) + request2.Headers.Add(HttpRequestHeader.Authorization, str); + using (HttpWebResponse response = this.GetResponse(request2, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (response.StatusCode >= HttpStatusCode.MultipleChoices) + { + if (response.StatusCode < HttpStatusCode.BadRequest) + { + uri = new Uri(uri, response.Headers[HttpResponseHeader.Location]); + continue; + } + } + } + this.SendEmptyPUT = true; + request1 = this.CreateRequest(uri); + request1.PreAuthenticate = false; + request1.UnsafeAuthenticatedConnectionSharing = true; + request1.Credentials = (ICredentials) null; + } + else if (this.SendEmptyPUT) + { + HttpWebRequest request2 = this.CreateRequest(uri); + request2.Method = "PUT"; + request2.Headers.Add(HttpRequestHeader.Allow, "PUT"); + request2.ContentLength = 0L; + request2.AllowWriteStreamBuffering = true; + request2.PreAuthenticate = true; + if (str != null) + request2.Headers.Add(HttpRequestHeader.Authorization, str); + using (HttpWebResponse response = this.GetResponse(request2, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (this.UsePassportAuthentication && PassportAuthHelper.CheckPassportAuth(response)) + { + str = this.PassportAuth.GetPassportToken(response, this.UserName, this.Password); + continue; + } + if (response.StatusCode >= HttpStatusCode.MultipleChoices) + { + if (response.StatusCode < HttpStatusCode.BadRequest) + { + uri = new Uri(uri, response.Headers[HttpResponseHeader.Location]); + continue; + } + } + } + this.SendEmptyPUT = true; + request1 = this.CreateRequest(uri); + request1.PreAuthenticate = true; + } + else + { + request1 = this.CreateRequest(uri); + request1.PreAuthenticate = true; + } + request1.Method = "PUT"; + request1.AllowWriteStreamBuffering = false; + if (Operators.CompareString(this.UploadCompression.ToLower(), "gzip", false) == 0) + { + request1.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip"); + request1.SendChunked = true; + } + else if (Operators.CompareString(this.UploadCompression.ToLower(), "deflate", false) == 0) + { + request1.Headers.Add(HttpRequestHeader.ContentEncoding, "deflate"); + request1.SendChunked = true; + } + else if (length >= 0L) + request1.ContentLength = length; + else + request1.SendChunked = true; + request1.ContentType = "application/octet-stream"; + if (contentrange != null) + request1.Headers.Add(HttpRequestHeader.ContentRange, contentrange); + stream = this.GetRequestStream(request1); + break; + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(target, (Exception) simpleWebException); + if (simpleWebException.StatusCode == 416) + throw new InvalidRangeException((Exception) simpleWebException); + throw; + } + } + } + if (Operators.CompareString(this.UploadCompression.ToLower(), "gzip", false) == 0) + stream = (Stream) new GZipStream(stream, CompressionMode.Compress, false); + else if (Operators.CompareString(this.UploadCompression.ToLower(), "deflate", false) == 0) + stream = (Stream) new ZlibStream(stream, CompressionMode.Compress); + CloseNotifyStream closeNotifyStream; + try + { + closeNotifyStream = new CloseNotifyStream(stream); + closeNotifyStream.ClosingEvent += new EventHandler(this.WriteStream_Closing); + closeNotifyStream.ClosedEvent += new EventHandler(this.WriteStream_Closed); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + if (stream != null) + stream.Close(); + throw; + } + closeNotifyStream.Tag = (object) new object[3] + { + (object) request1, + (object) target, + (object) new ResourceId(target, (FsBase) this) + }; + return (Stream) closeNotifyStream; + } + + public override ReturnedInfo CloseWrite(Stream st) + { + st.Close(); + return (ReturnedInfo) ((object[]) ((CloseNotifyStream) st).Tag)[2]; + } + + public override string GetLock(ResourceId id, string owner, int timeoutseconds, FsBase.LockScope scope) + { + Uri uri1 = id.Uri; + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(uri1); + Uri uri2 = UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding); + StringBuilder sb = new StringBuilder(200); + StringWriter stringWriter = new StringWriter(sb); + stringWriter.Write(""); + stringWriter.Write(""); + stringWriter.Write(""); + if (scope == FsBase.LockScope.Exclusive) + stringWriter.Write(""); + else if (scope == FsBase.LockScope.Shared) + stringWriter.Write(""); + stringWriter.Write(""); + stringWriter.Write(""); + stringWriter.Write(""); + stringWriter.Write(""); + stringWriter.Write(""); + stringWriter.Write(owner); + stringWriter.Write(""); + stringWriter.Write(""); + stringWriter.Close(); + byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString()); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri2); + request.Method = "LOCK"; + request.ContentType = "text/xml; charset=\"utf-8\""; + request.ContentLength = (long) bytes.Length; + if (timeoutseconds > 0) + request.Headers.Add("Timeout", "Second-" + timeoutseconds.ToString()); + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (Stream requestStream = this.GetRequestStream(request)) + requestStream.Write(bytes, 0, bytes.Length); + using (HttpWebResponse response = this.GetResponse(request, false)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri2 = new Uri(uri2, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (!WebdavFs.CheckStatus(response)) + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + string header = response.Headers["Lock-Token"]; + if (header != null || header.Length == 0) + throw new SimpleWebException("Invalid Lock Token", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + return header; + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri2.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri2 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + throw; + } + } + } + } + + public override void ReleaseLock(ResourceId id, string locktoken) + { + Uri uri1 = id.Uri; + int num = 0; + string str = (string) null; + WebdavFs.CheckUri(uri1); + Uri uri2 = UriUtil.UriEncodeConvert(uri1, (Encoding) null, this.URIRequestEncoding); + while (true) + { + HttpWebRequest request = this.CreateRequest(uri2); + request.Method = "UNLOCK"; + request.Headers.Add("Lock-Token", locktoken); + if (str != null) + request.Headers.Add(HttpRequestHeader.Authorization, str); + try + { + using (HttpWebResponse response = this.GetResponse(request, true)) + { + checked { ++num; } + if (num > this.MaxRedirection) + throw new SimpleWebException("Too many redirection", (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + if (response.StatusCode >= HttpStatusCode.MultipleChoices && response.StatusCode < HttpStatusCode.BadRequest) + { + uri2 = new Uri(uri2, response.Headers[HttpResponseHeader.Location]); + } + else + { + if (WebdavFs.CheckStatus(response)) + break; + throw new SimpleWebException("Unassumed " + response.Method + " response\r\nStatus: " + Conversions.ToString((int) response.StatusCode), (Exception) null, WebExceptionStatus.ProtocolError, (WebResponse) response); + } + } + } + catch (SimpleWebException ex) + { + ProjectData.SetProjectError((Exception) ex); + SimpleWebException simpleWebException = ex; + if (simpleWebException.Status == WebExceptionStatus.KeepAliveFailure) + ProjectData.ClearProjectError(); + else if (simpleWebException.Status == WebExceptionStatus.TrustFailure) + { + if (this.ConnectionSetting.LastCertError != SslPolicyErrors.None) + throw new RemoteCertificateErrorException((Exception) simpleWebException, this.ConnectionSetting.LastCertError); + throw; + } + else if (simpleWebException.StatusCode == 401) + { + if (Operators.CompareString(simpleWebException.ResponseUri.AbsolutePath, uri2.AbsolutePath, false) == 0) + throw new UnauthorizedException((Exception) simpleWebException, !this.UseDefaultCredential); + uri2 = simpleWebException.ResponseUri; + ProjectData.ClearProjectError(); + } + else + { + if (simpleWebException.StatusCode == 404) + throw new RemoteResourceNotFoundException(uri1, (Exception) simpleWebException); + throw; + } + } + } + } + + private HttpWebRequest CreateRequest(Uri target) + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType) (~this.DisableTlsVersions & FsBase.AvailableTlss()); + ServicePoint servicePoint = ServicePointManager.FindServicePoint(target, this.Proxy); + if (!this.pServicePointList.Contains(servicePoint)) + { + this.pServicePointList.Add(servicePoint); + servicePoint.ConnectionLimit = 1; + servicePoint.Expect100Continue = !this.DontExpect100; + } + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(target); + if (this.UseDefaultCredential) + { + httpWebRequest.UseDefaultCredentials = true; + } + else + { + httpWebRequest.UseDefaultCredentials = false; + string userName = string.Empty; + string password = string.Empty; + string domain = string.Empty; + if (this.UserName.Length > 0) + { + userName = this.UserName; + password = this.Password; + int length = userName.IndexOf('\\'); + if (length > 0) + { + domain = userName.Substring(0, length); + userName = userName.Substring(checked (length + 1)); + } + } + if (this.UsePreAuthentication_Basic) + { + string s = userName + ":" + password; + if (this.CredentialEncoding == null) + httpWebRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(s))); + else + httpWebRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(this.CredentialEncoding.GetBytes(s))); + } + else if (this.UsePreAuthentication_WSSE) + { + httpWebRequest.Headers.Add("Authorization", "WSSE profile=\"UsernameToken\""); + httpWebRequest.Headers.Add("X-WSSE", WsseClient.GetAuthString(new NetworkCredential(userName, password), this.CredentialEncoding)); + } + else + httpWebRequest.Credentials = domain.Length <= 0 ? (ICredentials) new NetworkCredential(userName, password) : (ICredentials) new NetworkCredential(userName, password, domain); + } + httpWebRequest.ConnectionGroupName = this.GroupName; + httpWebRequest.UserAgent = this.ClientName; + httpWebRequest.KeepAlive = true; + httpWebRequest.PreAuthenticate = true; + httpWebRequest.UnsafeAuthenticatedConnectionSharing = true; + if (this.ClientCertificates.Count > 0) + httpWebRequest.ClientCertificates = (X509CertificateCollection) this.ClientCertificates; + httpWebRequest.Proxy = this.Proxy; + httpWebRequest.ReadWriteTimeout = this.ReadWriteTimeout; + httpWebRequest.Timeout = this.ConnectTimeout; + httpWebRequest.CookieContainer = this.ConnectionSetting.CookieContainer; + httpWebRequest.AllowAutoRedirect = false; + this.pLastUri = httpWebRequest.RequestUri; + this.ConnectionSetting.LastCertError = SslPolicyErrors.None; + WebRequestCertificateValidationManager.Register((WebRequest) httpWebRequest, this.ConnectionSetting); + return httpWebRequest; + } + + private HttpWebResponse GetResponse(HttpWebRequest request, bool notreqstream) + { + string str = ""; + if (notreqstream) + { + string message = str + "\r\n> " + request.Method + " " + request.RequestUri.PathAndQuery + " HTTP/" + request.ProtocolVersion.ToString(); + try + { + foreach (object key in request.Headers.Keys) + { + string index = Conversions.ToString(key); + if (Operators.CompareString(index.ToLower(), "authorization", false) == 0 && request.Headers[index].ToLower().StartsWith("basic")) + message = message + "\r\n> " + index + ": Basic *****"; + else + message = message + "\r\n> " + index + ": " + request.Headers[index]; + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + this.OnLogMessage(message); + } + HttpWebResponse httpWebResponse1 = (HttpWebResponse) null; + try + { + IAsyncResult response = request.BeginGetResponse((AsyncCallback) null, (object) null); + if (!response.AsyncWaitHandle.WaitOne(this.ConnectTimeout, false)) + { + try + { + request.Abort(); + httpWebResponse1 = (HttpWebResponse) request.EndGetResponse(response); + } + catch (WebException ex) + { + ProjectData.SetProjectError((Exception) ex); + throw new WebException("Timeout", (Exception) null, WebExceptionStatus.Timeout, ex.Response); + } + throw new WebException("Timeout", (Exception) null, WebExceptionStatus.Timeout, (WebResponse) httpWebResponse1); + } + httpWebResponse1 = (HttpWebResponse) request.EndGetResponse(response); + WebdavFs.FixDigestAuthDomain(request); + } + catch (WebException ex1) + { + ProjectData.SetProjectError((Exception) ex1); + WebException ex2 = ex1; + using (WebResponse response = ex2.Response) + { + this.CheckAuthType(request); + string message = "AuthorizationMethod = " + this.LastAuthType + "\r\n" + ex2.ToString() + "\r\n"; + HttpWebResponse httpWebResponse2 = response as HttpWebResponse; + if (httpWebResponse2 != null) + { + WebdavFs.FixDigestAuthDomain(request); + message = message + " " + request.Method + " " + request.RequestUri.PathAndQuery + " HTTP/" + request.ProtocolVersion.ToString(); + try + { + foreach (object key in request.Headers.Keys) + { + string index = Conversions.ToString(key); + if (Operators.CompareString(index.ToLower(), "authorization", false) == 0 && request.Headers[index].ToLower().StartsWith("basic")) + message1 = message1 + "\r\n> " + index + ": Basic *****"; + else + message1 = message1 + "\r\n> " + index + ": " + request.Headers[index]; + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + this.OnLogMessage(message1); + Stream requestStream1; + try + { + IAsyncResult requestStream2 = request.BeginGetRequestStream((AsyncCallback) null, (object) null); + if (!requestStream2.AsyncWaitHandle.WaitOne(this.ConnectTimeout, false)) + { + try + { + request.Abort(); + request.EndGetRequestStream(requestStream2); + } + catch (WebException ex) + { + ProjectData.SetProjectError((Exception) ex); + throw new WebException("Timeout", (Exception) null, WebExceptionStatus.Timeout, ex.Response); + } + throw new WebException("Timeout", (Exception) null, WebExceptionStatus.Timeout, (WebResponse) null); + } + requestStream1 = request.EndGetRequestStream(requestStream2); + WebdavFs.FixDigestAuthDomain(request); + } + catch (WebException ex1) + { + ProjectData.SetProjectError((Exception) ex1); + WebException ex2 = ex1; + using (WebResponse response = ex2.Response) + { + this.CheckAuthType(request); + string message2 = "AuthorizationMethod = " + this.LastAuthType + "\r\n"; + HttpWebResponse httpWebResponse = response as HttpWebResponse; + if (httpWebResponse != null) + { + WebdavFs.FixDigestAuthDomain(request); + message2 = message2 + "= 0 && checked (num1 + 7) < target.Length) + { + string str4 = target.Substring(checked (num1 + 7)).Trim(); + if (Operators.CompareString(Conversions.ToString(str4[0]), "=", false) == 0) + { + string str5 = str4.Substring(1).Trim(); + if (Operators.CompareString(Conversions.ToString(str5[0]), "\"", false) == 0) + { + int num2 = str5.IndexOf("\"", 1); + if (num2 < 0) + num2 = str5.Length; + str3 = str5.Substring(1, checked (num2 - 1)); + } + else + str3 = str5; + } + } + Encoding encoding; + if (Operators.CompareString(str3, "", false) != 0) + { + try + { + encoding = Encoding.GetEncoding(str3); + goto label_19; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + string name = "ISO-8859-1"; + if (Operators.CompareString(Left, "xml", false) == 0) + name = "UTF-8"; + encoding = Encoding.GetEncoding(name); +label_19: + return this.GetResponseBody(res, encoding); + } + + private string GetResponseBody(HttpWebResponse res, Encoding encoding) + { + byte[] responseBodyInBytes = this.GetResponseBodyInBytes(res); + encoding.GetString(responseBodyInBytes); + string str = encoding.CodePage != 65001 || responseBodyInBytes.Length <= 3 || ((int) responseBodyInBytes[0] != 239 || (int) responseBodyInBytes[1] != 187) || (int) responseBodyInBytes[2] != 191 ? encoding.GetString(responseBodyInBytes) : encoding.GetString(responseBodyInBytes, 3, checked (responseBodyInBytes.Length - 3)); + this.OnLogMessage("< [MESSAGEBODY LENGTH:" + str.Length.ToString() + "]"); + return str; + } + + private byte[] GetResponseBodyInBytes(HttpWebResponse res) + { + Stream stream = res.GetResponseStream(); + List numArrayList = new List(); + List intList = new List(); + int num1; + try + { + if (res.Headers[HttpResponseHeader.ContentEncoding] != null) + { + string lower = res.Headers[HttpResponseHeader.ContentEncoding].ToLower(); + if (Operators.CompareString(lower, "gzip", false) == 0 || Operators.CompareString(lower, "x-gzip", false) == 0) + stream = (Stream) new GZipStream(stream, CompressionMode.Decompress); + else if (Operators.CompareString(lower, "deflate", false) == 0) + stream = (Stream) new ZlibStream(stream, CompressionMode.Decompress, false, true); + } + while (true) + { + byte[] buffer = new byte[4096]; + int num2 = stream.Read(buffer, 0, buffer.Length); + if (num2 != 0) + { + intList.Add(num2); + numArrayList.Add(buffer); + checked { num1 += num2; } + } + else + break; + } + } + finally + { + stream.Close(); + res.Close(); + } + byte[] numArray = new byte[checked (num1 - 1 + 1)]; + int destinationIndex = 0; + int num3 = 0; + int num4 = checked (numArrayList.Count - 1); + int index = num3; + while (index <= num4) + { + Array.Copy((Array) numArrayList[index], 0, (Array) numArray, destinationIndex, intList[index]); + checked { destinationIndex += intList[index]; } + checked { ++index; } + } + return numArray; + } + + private static void CheckUri(Uri target) + { + if (!target.IsAbsoluteUri) + throw new CannotProcessRequest(target, "Target URI is not absolute."); + if (target.Fragment.Length > 0) + throw new CannotProcessRequest(target, "Target URI cannot contain fragment."); + if (target.UserInfo.Length > 0) + throw new CannotProcessRequest(target, "Target URI cannot contain userinfo."); + if (Operators.CompareString(target.Scheme, Uri.UriSchemeHttp, false) != 0 && Operators.CompareString(target.Scheme, Uri.UriSchemeHttps, false) != 0) + throw new CannotProcessRequest(target, "Scheme of target Uri is not supported."); + } + + private static bool CheckStatus(HttpWebResponse response) + { + return response.StatusCode >= HttpStatusCode.OK && response.StatusCode < HttpStatusCode.MultipleChoices && response.StatusCode != (HttpStatusCode) 207; + } + + private static bool IsStatusOK(int statuscode) + { + return statuscode >= 200 && statuscode < 300; + } + + private void CheckAuthType(HttpWebRequest req) + { + if (req.Headers[HttpRequestHeader.Authorization] == null) + { + this.pLastAuthType = ""; + } + else + { + string header = req.Headers[HttpRequestHeader.Authorization]; + int length = header.IndexOf(' '); + if (length < 0) + this.pLastAuthType = ""; + else + this.pLastAuthType = header.Substring(0, length); + } + } + + private List ParsePROPFINDResponse(string message, Uri responseuri) + { + List resourceInfoList = new List(); + XmlDocument xmlDocument = new XmlDocument(); + try + { + xmlDocument.LoadXml(message); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception innerException = ex; + throw new InvalidServerResponseException("Cannot Parse PROPFIND Response. Xml Error.", message, innerException); + } + XmlElement xmlElement = xmlDocument["multistatus", "DAV:"]; + if (xmlElement == null) + throw new InvalidServerResponseException("Cannot Parse PROPFIND Response. No multistatus element.", message); + try + { + foreach (XmlNode childNode in xmlElement.ChildNodes) + { + if (Operators.CompareString(childNode.LocalName, "response", false) == 0 && Operators.CompareString(childNode.NamespaceURI, "DAV:", false) == 0) + { + Uri result1 = (Uri) null; + XmlNode xmlNode1 = (XmlNode) childNode["location", "DAV:"]; + if (xmlNode1 != null) + { + string innerText = xmlNode1["href", "DAV:"].InnerText; + if (!Uri.TryCreate(innerText, UriKind.Absolute, out result1) && !Uri.TryCreate(responseuri, innerText, out result1)) + ; + } + if (childNode["propstat", "DAV:"] != null) + { + ResourceInfo resourceInfo = new ResourceInfo(); + try + { + foreach (XmlNode xmlNode2 in childNode) + { + if (Operators.CompareString(xmlNode2.NamespaceURI, "DAV:", false) == 0) + { + if (Operators.CompareString(xmlNode2.LocalName, "href", false) == 0) + { + Uri result2 = (Uri) null; + if (!Uri.TryCreate(xmlNode2.InnerText, UriKind.Absolute, out result2) && !Uri.TryCreate(responseuri, xmlNode2.InnerText, out result2)) + throw new InvalidServerResponseException("Cannot Parse PROPFIND Response. Cannot create URI from href element.", message); + result2 = UriUtil.UriEncodeConvert(result2, this.URIResponseEncoding, (Encoding) null); + if (Operators.CompareString(result2.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped), responseuri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped), false) != 0) + result2 = new UriBuilder(result2) + { + Scheme = responseuri.Scheme, + Host = responseuri.Host, + Port = responseuri.Port + }.Uri; + resourceInfo.Id = new ResourceId(result2, (FsBase) this); + } + else if (Operators.CompareString(xmlNode2.LocalName, "propstat", false) == 0) + { + bool haserror; + string statedescription; + string str; + if (xmlNode2["status", "DAV:"] == null) + { + haserror = true; + statedescription = "No Status-Line"; + str = "No Status-Line"; + XmlNode xmlNode3 = (XmlNode) xmlNode2["error", "DAV:"]; + if (xmlNode3 != null) + statedescription = statedescription + "\r\n" + xmlNode3.InnerText; + XmlNode xmlNode4 = (XmlNode) xmlNode2["responsedescription", "DAV:"]; + if (xmlNode4 != null) + statedescription = statedescription + "\r\n" + xmlNode4.InnerText; + } + else + { + WebdavFs.Statusline statusline = new WebdavFs.Statusline(xmlNode2["status", "DAV:"].InnerText); + haserror = !statusline.IsStatusOK; + statedescription = statusline.StatusCode.ToString() + " " + statusline.StatusDescription; + str = statusline.ToString(); + XmlNode xmlNode3 = (XmlNode) xmlNode2["error", "DAV:"]; + if (xmlNode3 != null) + statedescription = statedescription + "\r\n" + xmlNode3.InnerText; + XmlNode xmlNode4 = (XmlNode) xmlNode2["responsedescription", "DAV:"]; + if (xmlNode4 != null) + statedescription = statedescription + "\r\n" + xmlNode4.InnerText; + } + resourceInfo.HasError = resourceInfo.HasError || haserror; + resourceInfo.StatusDescription = resourceInfo.StatusDescription != null ? WebdavFs.Statusline.StatusHTTP11MultiStatus.ToString() : str; + try + { + foreach (XmlNode xmlNode3 in xmlNode2) + { + if (Operators.CompareString(xmlNode3.LocalName, "prop", false) == 0) + { + if (Operators.CompareString(xmlNode3.NamespaceURI, "DAV:", false) == 0) + { + try + { + foreach (XmlNode xmlNode4 in xmlNode3) + { + string name = xmlNode4.LocalName; + if (xmlNode4.NamespaceURI != null) + name = xmlNode4.NamespaceURI + name; + resourceInfo.Properties.Add(name, xmlNode4.InnerXml, statedescription, haserror); + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + } + } + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + } + } + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + if ((object) resourceInfo.Id != null) + { + resourceInfo.IsCollection = resourceInfo.Id.IsCollection; + resourceInfoList.Add(resourceInfo); + } + } + else + { + bool flag; + string str1; + string str2; + if (childNode["status", "DAV:"] == null) + { + flag = true; + string str3 = "No Status-Line"; + str1 = "No Status-Line"; + XmlNode xmlNode2 = (XmlNode) childNode["error", "DAV:"]; + if (xmlNode2 != null) + str3 = str3 + "\r\n" + xmlNode2.InnerText; + XmlNode xmlNode3 = (XmlNode) childNode["responsedescription", "DAV:"]; + if (xmlNode3 != null) + str2 = str3 + "\r\n" + xmlNode3.InnerText; + } + else + { + WebdavFs.Statusline statusline = new WebdavFs.Statusline(childNode["status", "DAV:"].InnerText); + flag = !statusline.IsStatusOK; + string str3 = statusline.StatusCode.ToString() + " " + statusline.StatusDescription; + str1 = statusline.ToString(); + XmlNode xmlNode2 = (XmlNode) childNode["error", "DAV:"]; + if (xmlNode2 != null) + str3 = str3 + "\r\n" + xmlNode2.InnerText; + XmlNode xmlNode3 = (XmlNode) childNode["responsedescription", "DAV:"]; + if (xmlNode3 != null) + str2 = str3 + "\r\n" + xmlNode3.InnerText; + } + try + { + foreach (XmlNode xmlNode2 in childNode) + { + if (Operators.CompareString(xmlNode2.LocalName, "href", false) == 0 && Operators.CompareString(xmlNode2.NamespaceURI, "DAV:", false) == 0) + { + ResourceInfo resourceInfo = new ResourceInfo(); + Uri result2 = (Uri) null; + if (!Uri.TryCreate(xmlNode2.InnerText, UriKind.Absolute, out result2) && !Uri.TryCreate(responseuri, xmlNode2.InnerText, out result2)) + throw new InvalidServerResponseException("Cannot Parse PROPFIND Response. Cannot create URI from href element.", message); + result2 = UriUtil.UriEncodeConvert(result2, this.URIResponseEncoding, (Encoding) null); + if (Operators.CompareString(result2.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped), responseuri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped), false) != 0) + result2 = new UriBuilder(result2) + { + Scheme = responseuri.Scheme, + Host = responseuri.Host, + Port = responseuri.Port + }.Uri; + resourceInfo.Id = new ResourceId(result2, (FsBase) this); + resourceInfo.HasError = resourceInfo.HasError || flag; + resourceInfo.StatusDescription = str1; + resourceInfoList.Add(resourceInfo); + } + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + } + } + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + if (resourceInfoList.Count == 0) + throw new InvalidServerResponseException("Cannot Parse PROPFIND Response. No response element.", message); + int num1 = 1; + int num2 = checked (resourceInfoList.Count - 1); + int index1 = num1; + while (index1 <= num2) + { + if (resourceInfoList[index1].Id.Uri.Segments.Length < resourceInfoList[0].Id.Uri.Segments.Length) + { + ResourceInfo resourceInfo = resourceInfoList[0]; + resourceInfoList[0] = resourceInfoList[index1]; + resourceInfoList[index1] = resourceInfo; + } + checked { ++index1; } + } + List.Enumerator enumerator1; + try + { + enumerator1 = resourceInfoList.GetEnumerator(); + while (enumerator1.MoveNext()) + { + ResourceInfo current = enumerator1.Current; + int index2 = current.Properties.IndexOf("DAV:getcontentlength"); + long result1; + current.Size = index2 < 0 || current.Properties[index2].HasError || !long.TryParse(current.Properties[index2].Value, out result1) ? -1L : result1; + int index3 = current.Properties.IndexOf("urn:schemas-microsoft-com:Win32LastModifiedTime"); + DateTime result2; + if (index3 >= 0 && !current.Properties[index3].HasError && DateTime.TryParse(current.Properties[index3].Value, out result2)) + { + current.LastModifiedTime = result2; + } + else + { + int index4 = current.Properties.IndexOf("DAV:getlastmodified"); + if (index4 >= 0 && !current.Properties[index4].HasError && DateTime.TryParse(current.Properties[index4].Value, out result2)) + current.LastModifiedTime = result2; + } + int index5 = current.Properties.IndexOf("urn:schemas-microsoft-com:Win32CreationTime"); + if (index5 >= 0 && !current.Properties[index5].HasError && DateTime.TryParse(current.Properties[index5].Value, out result2)) + { + current.CreationTime = result2; + } + else + { + int index4 = current.Properties.IndexOf("DAV:creationdate"); + if (index4 >= 0 && !current.Properties[index4].HasError && DateTime.TryParse(current.Properties[index4].Value, out result2)) + current.CreationTime = result2; + } + int index6 = current.Properties.IndexOf("urn:schemas-microsoft-com:Win32LastAccessTime"); + if (index6 >= 0 && !current.Properties[index6].HasError && DateTime.TryParse(current.Properties[index6].Value, out result2)) + current.LastAccessTime = result2; + XmlReaderSettings settings = new XmlReaderSettings(); + XmlParserContext inputContext = (XmlParserContext) null; + settings.ConformanceLevel = ConformanceLevel.Fragment; + int index7 = current.Properties.IndexOf("DAV:resourcetype"); + if (index7 >= 0 && !current.Properties[index7].HasError) + { + if (current.Properties[index7].Value.Length > 0) + { + try + { + bool flag = false; + using (XmlReader xmlReader = XmlReader.Create((TextReader) new StringReader(current.Properties[index7].Value), settings, inputContext)) + { + while (xmlReader.Read()) + { + if (xmlReader.NodeType == XmlNodeType.Element && Operators.CompareString(xmlReader.LocalName, "collection", false) == 0 && Operators.CompareString(xmlReader.NamespaceURI, "DAV:", false) == 0) + flag = true; + } + } + current.IsCollection = flag; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + current.Types.Sort(); + } + } + if (current.IsCollection) + { + if (!UriUtil.EndWithSlash(current.Id.Uri)) + current.Id = new ResourceId(UriUtil.AddLastSlash(current.Id.Uri), (FsBase) this); + } + else if (UriUtil.EndWithSlash(current.Id.Uri)) + current.Id = new ResourceId(UriUtil.RemoveLastSlash(current.Id.Uri), (FsBase) this); + current.CanCopy = true; + current.CanDelete = true; + current.CanMove = true; + current.CanRename = true; + current.CanSetInfo = true; + } + } + finally + { + enumerator1.Dispose(); + } + return resourceInfoList; + } + + private static bool CheckPROPPATCHResponse(string message) + { + XmlDocument xmlDocument = new XmlDocument(); + try + { + xmlDocument.LoadXml(message); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception innerException = ex; + throw new InvalidServerResponseException("Cannot Parse PROPFIND Response. Xml Error.", message, innerException); + } + XmlElement xmlElement = xmlDocument["multistatus", "DAV:"]; + if (xmlElement == null) + throw new InvalidServerResponseException("Cannot Parse PROPFIND Response. No multistatus element.", message); + try + { + foreach (XmlNode childNode in xmlElement.ChildNodes) + { + if (Operators.CompareString(childNode.LocalName, "response", false) == 0 && Operators.CompareString(childNode.NamespaceURI, "DAV:", false) == 0) + { + if (childNode["propstat", "DAV:"] != null) + { + try + { + foreach (XmlNode xmlNode in childNode) + { + if (Operators.CompareString(xmlNode.LocalName, "propstat", false) == 0 && Operators.CompareString(xmlNode.NamespaceURI, "DAV:", false) == 0 && xmlNode["status", "DAV:"] != null) + { + string innerText = xmlNode["status", "DAV:"].InnerText; + int result; + if (innerText.Length < 12 || !int.TryParse(innerText.Substring(9, 3), out result) || result < 200 | result >= 300) + return false; + } + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + } + else if (childNode["status", "DAV:"] != null) + { + string str = ""; + string innerText = childNode["status", "DAV:"].InnerText; + int result; + if (innerText.Length < 12 || !int.TryParse(innerText.Substring(9, 3), out result) || result < 200 | result >= 300) + return false; + str = childNode["status", "DAV:"].InnerText; + } + } + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + return true; + } + + private static string CreatePROPPATCHRequest(ResourceInfo newinfo, ResourceInfo originalinfo) + { + StringBuilder stringBuilder = new StringBuilder(); + bool flag = false; + stringBuilder.Append(""); + stringBuilder.Append("\r\n"); + List.Enumerator enumerator1; + try + { + enumerator1 = newinfo.Properties.GetEnumerator(); + while (enumerator1.MoveNext()) + { + ResourceInfo.ResourceProperty current = enumerator1.Current; + int index = originalinfo.Properties.IndexOf(current.Name); + if (index < 0 || Operators.CompareString(originalinfo.Properties[index].Value, current.Value, false) != 0) + { + int num = current.Name.LastIndexOf(":"); + string str1; + string str2; + if (num < 0) + { + str1 = current.Name; + str2 = ""; + } + else + { + str1 = "P:" + current.Name.Substring(checked (num + 1)); + str2 = " xmlns:P=\"" + current.Name.Substring(0, checked (num + 1)) + "\""; + } + stringBuilder.Append("\r\n"); + stringBuilder.Append("<" + str1 + str2 + ">"); + stringBuilder.Append(current.Value); + stringBuilder.Append(""); + stringBuilder.Append("\r\n"); + flag = true; + } + } + } + finally + { + enumerator1.Dispose(); + } + List.Enumerator enumerator2; + try + { + enumerator2 = originalinfo.Properties.GetEnumerator(); + while (enumerator2.MoveNext()) + { + ResourceInfo.ResourceProperty current = enumerator2.Current; + if (newinfo.Properties.IndexOf(current.Name) < 0) + { + int num = current.Name.LastIndexOf(":"); + string str1; + string str2; + if (num < 0) + { + str1 = current.Name; + str2 = ""; + } + else + { + str1 = "P:" + current.Name.Substring(checked (num + 1)); + str2 = " xmlns:P=\"" + current.Name.Substring(0, checked (num + 1)) + "\""; + } + stringBuilder.Append("\r\n"); + stringBuilder.Append("<" + str1 + str2 + ">"); + stringBuilder.Append(current.Value); + stringBuilder.Append(""); + stringBuilder.Append("\r\n"); + flag = true; + } + } + } + finally + { + enumerator2.Dispose(); + } + stringBuilder.Append(""); + if (!flag) + return (string) null; + return stringBuilder.ToString(); + } + + private static int IndexOfWithQuote(string target, string value, StringComparison comparisontype) + { + int startIndex = 0; + int length = target.Length; + do + { + int num1 = target.IndexOf("\""); + if (num1 < 0) + num1 = length; + int num2 = target.Substring(startIndex, checked (num1 - startIndex)).IndexOf(value, comparisontype); + if (num2 >= 0) + return num2; + if (checked (num1 + 1) >= length) + return -1; + startIndex = target.IndexOf("\"", checked (num1 + 1)); + } + while (startIndex >= 0 && checked (startIndex + 1) < length); + return -1; + } + + private static void FixDigestAuthDomain(HttpWebRequest request) + { + string[] challenges = WebRequestCertificateValidationManager.GetChallenges((WebRequest) request); + List strArrayList = new List(); + string[] strArray1 = challenges; + int index1 = 0; + while (index1 < strArray1.Length) + { + string[] values = new WebHeaderCollection() + { + { + HttpResponseHeader.WwwAuthenticate, + strArray1[index1] + } + }.GetValues(0); + int index2 = 0; + while (index2 < values.Length) + { + string str1 = values[index2]; + if (str1.Length > 7 && Operators.CompareString(str1.Substring(0, 7).ToLowerInvariant(), "digest ", false) == 0) + { + int startIndex1 = 7; + while (startIndex1 < str1.Length) + { + while (startIndex1 < str1.Length && (int) str1[startIndex1] == 32) + checked { ++startIndex1; } + int index3 = checked (startIndex1 + 1); + while (index3 < str1.Length && (int) str1[index3] != 61) + checked { ++index3; } + string Left = str1.Substring(startIndex1, checked (index3 - startIndex1)).Trim(); + int startIndex2 = checked (index3 + 1); + while (startIndex2 < str1.Length && (int) str1[startIndex2] == 32) + checked { ++startIndex2; } + string str2; + if ((int) str1[startIndex2] == 34) + { + int startIndex3 = checked (startIndex2 + 1); + int num = str1.IndexOf('"', startIndex3); + if (num < 0) + num = str1.Length; + str2 = str1.Substring(startIndex3, checked (num - startIndex3)); + startIndex1 = checked (num + 1); + } + else + { + int index4 = checked (startIndex2 + 1); + while (index4 < str1.Length && (int) str1[index4] != 32) + checked { ++index4; } + str2 = str1.Substring(startIndex2, checked (index4 - startIndex2)); + startIndex1 = checked (index4 + 1); + } + if (Operators.CompareString(Left, "domain", false) == 0) + { + string[] strArray2 = str2.Split(new char[1] + { + ' ' + }, StringSplitOptions.RemoveEmptyEntries); + int num1 = 0; + int num2 = checked (strArray2.Length - 1); + int index4 = num1; + while (index4 <= num2) + { + Uri result = (Uri) null; + if (Uri.TryCreate(request.RequestUri, strArray2[index4], out result)) + strArrayList.Add(new string[2] + { + result.AbsoluteUri, + strArray2[index4] + }); + checked { ++index4; } + } + break; + } + } + } + checked { ++index2; } + } + checked { ++index1; } + } + if (strArrayList.Count <= 0) + return; + object objectValue1 = RuntimeHelpers.GetObjectValue(WebdavFs.s_ModuleBindingInfo.GetValue((object) null)); + object objectValue2 = RuntimeHelpers.GetObjectValue(WebdavFs.challengeCacheinfo.GetValue((object) null)); + Hashtable hashtable1 = (Hashtable) WebdavFs.m_StoreInfo.GetValue(RuntimeHelpers.GetObjectValue(objectValue1)); + Hashtable hashtable2 = (Hashtable) WebdavFs.m_StoreInfo.GetValue(RuntimeHelpers.GetObjectValue(objectValue2)); + int num3 = 0; + int num4 = checked (strArrayList.Count - 1); + int index5 = num3; + while (index5 <= num4) + { + object Expression = objectValue1; + ObjectFlowControl.CheckForSyncLockOnValueType(Expression); + Monitor.Enter(Expression); + try + { + lock (hashtable1) + { + hashtable1[(object) strArrayList[index5][0]] = RuntimeHelpers.GetObjectValue(hashtable1[(object) strArrayList[index5][1]]); + hashtable1.Remove((object) strArrayList[index5][1]); + } + } + finally + { + Monitor.Exit(Expression); + } + lock (hashtable2) + { + hashtable2[(object) strArrayList[index5][0]] = RuntimeHelpers.GetObjectValue(hashtable2[(object) strArrayList[index5][1]]); + hashtable2.Remove((object) strArrayList[index5][1]); + } + checked { ++index5; } + } + } + + internal class WebDAVCredentialManager : ICredentialPolicy + { + public bool ShouldSendCredential(Uri challengeUri, WebRequest request, NetworkCredential credential, IAuthenticationModule authenticationModule) + { + return WebdavFs.ShouldSendCredential(challengeUri, request, credential, authenticationModule); + } + } + + private class ExtWebHeaderCollection : WebHeaderCollection + { + public override void Add(string name, string value) + { + this.AddWithoutValidate(name, value); + } + + public override void GetObjectData(SerializationInfo serializationInfo, StreamingContext streamingContext) + { + serializationInfo.AddValue("Count", this.Count); + int num1 = 0; + int num2 = checked (this.Count - 1); + int index = num1; + while (index <= num2) + { + serializationInfo.AddValue(index.ToString((IFormatProvider) NumberFormatInfo.InvariantInfo), (object) this.GetKey(index)); + serializationInfo.AddValue(checked (index + this.Count).ToString((IFormatProvider) NumberFormatInfo.InvariantInfo), (object) this.Get(index)); + checked { ++index; } + } + } + } + + private class Statusline + { + public static WebdavFs.Statusline StatusHTTP11OK = new WebdavFs.Statusline("HTTP/1.1 200 OK"); + public static WebdavFs.Statusline StatusHTTP11MultiStatus = new WebdavFs.Statusline("HTTP/1.1 207 Multi-Status"); + private const string HTTPStatuslineHeader = "HTTP/"; + private int _statuscode; + private Version _version; + private string _description; + + public Statusline(string line) + { + line = line.Trim(); + if (Operators.CompareString(line.Substring(0, 5), "HTTP/", false) != 0) + throw new ArgumentException(); + this._version = new Version(line.Substring(5, 3)); + this._statuscode = int.Parse(line.Substring(9, 3)); + if (line.Length < 14) + this._description = ""; + else + this._description = line.Substring(13).Trim(); + } + + public Statusline(HttpWebResponse response) + { + this._version = (Version) response.ProtocolVersion.Clone(); + this._statuscode = (int) response.StatusCode; + this._description = response.StatusDescription; + } + + public Version ProtocolVersion + { + get + { + return this._version; + } + } + + public int StatusCode + { + get + { + return this._statuscode; + } + } + + public string StatusDescription + { + get + { + return this._description; + } + } + + public bool IsStatusOK + { + get + { + return this._statuscode >= 200 && this._statuscode < 300; + } + } + + public override string ToString() + { + return string.Join(" ", new string[3] + { + "HTTP/" + this._version.ToString(), + this._statuscode.ToString(), + this._description + }); + } + } + + private enum DepthType + { + Depth_infinity = -1, + Depth_0 = 0, + Depth_1 = 1, + } + } +} diff --git a/Rei.Fs.Webdav/WsseClient.cs b/Rei.Fs.Webdav/WsseClient.cs new file mode 100644 index 0000000..ea0d31f --- /dev/null +++ b/Rei.Fs.Webdav/WsseClient.cs @@ -0,0 +1,144 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Webdav.WsseClient +// Assembly: Rei.Fs.Webdav, Version=1.13.2.18288, Culture=neutral, PublicKeyToken=null +// MVID: D30DD1E3-8520-48B5-AAE5-C87970350A82 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.Webdav.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Globalization; +using System.Net; +using System.Security.Cryptography; +using System.Text; + +namespace Rei.Fs.Webdav +{ + public class WsseClient : IAuthenticationModule + { + private static RNGCryptoServiceProvider Rnd = new RNGCryptoServiceProvider(); + internal const string AuthType = "WSSE"; + internal const string Signature = "WSSE"; + internal const int NonceLength = 16; + private static byte[] AsciiHex; + + public Authorization Authenticate(string challenge, WebRequest request, ICredentials credentials) + { + if (!WsseClient.ContainsSignatureInChallenge(challenge, "WSSE")) + return (Authorization) null; + return this.InnerAuthenticate(request, credentials); + } + + public string AuthenticationType + { + get + { + return "WSSE"; + } + } + + public bool CanPreAuthenticate + { + get + { + return true; + } + } + + public Authorization PreAuthenticate(WebRequest request, ICredentials credentials) + { + return this.InnerAuthenticate(request, credentials); + } + + private Authorization InnerAuthenticate(WebRequest request, ICredentials credentials) + { + Authorization authorization; + try + { + if (credentials == null) + { + authorization = (Authorization) null; + } + else + { + NetworkCredential credential = credentials.GetCredential(request.RequestUri, "WSSE"); + if (credential == null) + { + authorization = (Authorization) null; + } + else + { + ICredentialPolicy credentialPolicy = AuthenticationManager.CredentialPolicy; + if (credentialPolicy != null && !credentialPolicy.ShouldSendCredential(request.RequestUri, request, credential, (IAuthenticationModule) this)) + { + authorization = (Authorization) null; + } + else + { + request.Headers.Add("X-WSSE", WsseClient.GetAuthString(credential, Encoding.UTF8)); + authorization = new Authorization("WSSE profile=\"UsernameToken\"", true); + } + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + authorization = (Authorization) null; + ProjectData.ClearProjectError(); + } + return authorization; + } + + public static string GetAuthString(NetworkCredential credential, Encoding encoding) + { + byte[] nonce = WsseClient.CreateNonce(); + string str = DateTime.Now.ToUniversalTime().ToString(DateTimeFormatInfo.InvariantInfo.SortableDateTimePattern) + "Z"; + byte[] buffer = new byte[checked (nonce.Length + encoding.GetByteCount(str + credential.Password) - 1 + 1)]; + nonce.CopyTo((Array) buffer, 0); + encoding.GetBytes(str + credential.Password).CopyTo((Array) buffer, nonce.Length); + string base64String = Convert.ToBase64String(SHA1.Create().ComputeHash(buffer)); + return string.Join("", new string[13] + { + "UsernameToken ", + "Username=\"", + credential.UserName, + "\", ", + "PasswordDigest=\"", + base64String, + "\", ", + "Nonce=\"", + Convert.ToBase64String(nonce), + "\", ", + "Created=\"", + str, + "\"" + }); + } + + private static byte[] CreateNonce() + { + byte[] data = new byte[16]; + WsseClient.Rnd.GetBytes(data); + return data; + } + + private static bool ContainsSignatureInChallenge(string challenge, string signature) + { + int num1; + for (int startIndex = 0; startIndex < challenge.Length; startIndex = checked (num1 + 1)) + { + int num2 = challenge.IndexOf("\"", startIndex); + if (num2 < 0) + num2 = challenge.Length; + if (challenge.Substring(startIndex, checked (num2 - startIndex)).Contains(signature)) + return true; + if (checked (num2 + 1) >= challenge.Length) + return false; + num1 = challenge.IndexOf("\"", checked (num2 + 1)); + if (num1 < 0) + return false; + } + return false; + } + } +} diff --git a/Rei.Fs.Webdav/lib/Rei.Fs.dll b/Rei.Fs.Webdav/lib/Rei.Fs.dll new file mode 100644 index 0000000..7105c41 Binary files /dev/null and b/Rei.Fs.Webdav/lib/Rei.Fs.dll differ diff --git a/Rei.Fs/Adler32.cs b/Rei.Fs/Adler32.cs new file mode 100644 index 0000000..89b75c1 --- /dev/null +++ b/Rei.Fs/Adler32.cs @@ -0,0 +1,53 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.Adler32 +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +namespace Rei.Fs +{ + public class Adler32 + { + private int m_s1; + private int m_s2; + private const int modulo = 65521; + + public byte[] Value + { + get + { + return new byte[4] + { + checked ((byte) (this.m_s2 >> 8)), + checked ((byte) (this.m_s2 & (int) byte.MaxValue)), + checked ((byte) (this.m_s1 >> 8)), + checked ((byte) (this.m_s1 & (int) byte.MaxValue)) + }; + } + } + + public Adler32() + { + this.m_s1 = 1; + this.m_s2 = 0; + } + + public void Calc(byte[] buf) + { + this.Calc(buf, 0, buf.Length); + } + + public void Calc(byte[] buf, int index, int length) + { + int num1 = index; + int num2 = checked (index + length - 1); + int index1 = num1; + while (index1 <= num2) + { + this.m_s1 = checked (this.m_s1 + (int) buf[index1]) % 65521; + this.m_s2 = checked (this.m_s2 + this.m_s1) % 65521; + checked { ++index1; } + } + } + } +} diff --git a/Rei.Fs/AssemblyInfo.cs b/Rei.Fs/AssemblyInfo.cs new file mode 100644 index 0000000..ad2faf9 --- /dev/null +++ b/Rei.Fs/AssemblyInfo.cs @@ -0,0 +1,12 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTrademark("")] +[assembly: AssemblyProduct("Rei.Fs")] +[assembly: AssemblyCompany("Rei Software")] +[assembly: Guid("9f77af8b-75c4-4d33-96e1-421149462634")] +[assembly: AssemblyCopyright("Copyright (C) Rei HOBARA 2007-2016")] +[assembly: ComVisible(false)] +[assembly: AssemblyDescription("Fs Support Library")] +[assembly: AssemblyTitle("Rei.Fs")] +[assembly: AssemblyVersion("1.13.2.8796")] diff --git a/Rei.Fs/AuthDialog.cs b/Rei.Fs/AuthDialog.cs new file mode 100644 index 0000000..7d1492e --- /dev/null +++ b/Rei.Fs/AuthDialog.cs @@ -0,0 +1,398 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.AuthDialog +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace Rei.Fs +{ + [DesignerGenerated] + public class AuthDialog : Form + { + private IContainer components; + [AccessedThroughProperty("RememberCheckBox")] + private CheckBox _RememberCheckBox; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("PasswordTextBox")] + private TextBox _PasswordTextBox; + [AccessedThroughProperty("UserNameTextBox")] + private TextBox _UserNameTextBox; + [AccessedThroughProperty("m_CancelButton")] + private Button _m_CancelButton; + [AccessedThroughProperty("ButtonOK")] + private Button _ButtonOK; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("UriTextBox")] + private TextBox _UriTextBox; + + public AuthDialog() + { + this.Load += new EventHandler(this.AuthDialog_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.RememberCheckBox = new CheckBox(); + this.Label5 = new Label(); + this.Label4 = new Label(); + this.PasswordTextBox = new TextBox(); + this.UserNameTextBox = new TextBox(); + this.m_CancelButton = new Button(); + this.ButtonOK = new Button(); + this.Label1 = new Label(); + this.UriTextBox = new TextBox(); + this.SuspendLayout(); + this.RememberCheckBox.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.RememberCheckBox.AutoSize = true; + CheckBox rememberCheckBox1 = this.RememberCheckBox; + Point point1 = new Point(8, 136); + Point point2 = point1; + rememberCheckBox1.Location = point2; + this.RememberCheckBox.Name = "RememberCheckBox"; + CheckBox rememberCheckBox2 = this.RememberCheckBox; + Size size1 = new Size(214, 16); + Size size2 = size1; + rememberCheckBox2.Size = size2; + this.RememberCheckBox.TabIndex = 8; + this.RememberCheckBox.Text = "Remember User Name and Password"; + this.RememberCheckBox.UseVisualStyleBackColor = true; + this.Label5.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + point1 = new Point(8, 88); + Point point3 = point1; + label5_1.Location = point3; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + size1 = new Size(54, 12); + Size size3 = size1; + label5_2.Size = size3; + this.Label5.TabIndex = 4; + this.Label5.Text = "Password"; + this.Label4.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(8, 48); + Point point4 = point1; + label4_1.Location = point4; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(62, 12); + Size size4 = size1; + label4_2.Size = size4; + this.Label4.TabIndex = 2; + this.Label4.Text = "User Name"; + this.PasswordTextBox.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox passwordTextBox1 = this.PasswordTextBox; + point1 = new Point(8, 104); + Point point5 = point1; + passwordTextBox1.Location = point5; + this.PasswordTextBox.Name = "PasswordTextBox"; + TextBox passwordTextBox2 = this.PasswordTextBox; + size1 = new Size(272, 19); + Size size5 = size1; + passwordTextBox2.Size = size5; + this.PasswordTextBox.TabIndex = 5; + this.PasswordTextBox.UseSystemPasswordChar = true; + this.UserNameTextBox.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox userNameTextBox1 = this.UserNameTextBox; + point1 = new Point(8, 64); + Point point6 = point1; + userNameTextBox1.Location = point6; + this.UserNameTextBox.Name = "UserNameTextBox"; + TextBox userNameTextBox2 = this.UserNameTextBox; + size1 = new Size(272, 19); + Size size6 = size1; + userNameTextBox2.Size = size6; + this.UserNameTextBox.TabIndex = 3; + this.m_CancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.m_CancelButton.DialogResult = DialogResult.Cancel; + Button mCancelButton1 = this.m_CancelButton; + point1 = new Point(208, 160); + Point point7 = point1; + mCancelButton1.Location = point7; + this.m_CancelButton.Name = "m_CancelButton"; + Button mCancelButton2 = this.m_CancelButton; + size1 = new Size(72, 24); + Size size7 = size1; + mCancelButton2.Size = size7; + this.m_CancelButton.TabIndex = 10; + this.m_CancelButton.Text = "Cancel"; + this.m_CancelButton.UseVisualStyleBackColor = true; + this.ButtonOK.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button buttonOk1 = this.ButtonOK; + point1 = new Point(128, 160); + Point point8 = point1; + buttonOk1.Location = point8; + this.ButtonOK.Name = "ButtonOK"; + Button buttonOk2 = this.ButtonOK; + size1 = new Size(72, 24); + Size size8 = size1; + buttonOk2.Size = size8; + this.ButtonOK.TabIndex = 9; + this.ButtonOK.Text = "OK"; + this.ButtonOK.UseVisualStyleBackColor = true; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 8); + Point point9 = point1; + label1_1.Location = point9; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(90, 12); + Size size9 = size1; + label1_2.Size = size9; + this.Label1.TabIndex = 0; + this.Label1.Text = "Authorization for"; + this.UriTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + TextBox uriTextBox1 = this.UriTextBox; + point1 = new Point(8, 24); + Point point10 = point1; + uriTextBox1.Location = point10; + this.UriTextBox.Multiline = true; + this.UriTextBox.Name = "UriTextBox"; + this.UriTextBox.ReadOnly = true; + TextBox uriTextBox2 = this.UriTextBox; + size1 = new Size(272, 19); + Size size10 = size1; + uriTextBox2.Size = size10; + this.UriTextBox.TabIndex = 1; + this.UriTextBox.TabStop = false; + this.AcceptButton = (IButtonControl) this.ButtonOK; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.m_CancelButton; + size1 = new Size(288, 192); + this.ClientSize = size1; + this.Controls.Add((Control) this.UriTextBox); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.m_CancelButton); + this.Controls.Add((Control) this.ButtonOK); + this.Controls.Add((Control) this.RememberCheckBox); + this.Controls.Add((Control) this.Label5); + this.Controls.Add((Control) this.Label4); + this.Controls.Add((Control) this.PasswordTextBox); + this.Controls.Add((Control) this.UserNameTextBox); + size1 = new Size(304, 229); + this.MinimumSize = size1; + this.Name = nameof (AuthDialog); + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "Authorization"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual CheckBox RememberCheckBox + { + get + { + return this._RememberCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._RememberCheckBox = value; + } + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual TextBox PasswordTextBox + { + get + { + return this._PasswordTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._PasswordTextBox = value; + } + } + + internal virtual TextBox UserNameTextBox + { + get + { + return this._UserNameTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UserNameTextBox = value; + } + } + + internal virtual Button m_CancelButton + { + get + { + return this._m_CancelButton; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._m_CancelButton = value; + } + } + + internal virtual Button ButtonOK + { + get + { + return this._ButtonOK; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonOK_Click); + if (this._ButtonOK != null) + this._ButtonOK.Click -= eventHandler; + this._ButtonOK = value; + if (this._ButtonOK == null) + return; + this._ButtonOK.Click += eventHandler; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual TextBox UriTextBox + { + get + { + return this._UriTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UriTextBox = value; + } + } + + public string Target + { + get + { + return this.UriTextBox.Text; + } + set + { + this.UriTextBox.Text = value; + } + } + + public string UserName + { + get + { + return this.UserNameTextBox.Text; + } + set + { + this.UserNameTextBox.Text = value; + } + } + + public string Password + { + get + { + return this.PasswordTextBox.Text; + } + set + { + this.PasswordTextBox.Text = value; + } + } + + public bool ShowRememberCheckBox + { + get + { + return this.RememberCheckBox.Visible; + } + set + { + this.RememberCheckBox.Visible = value; + } + } + + public bool Remember + { + get + { + return this.RememberCheckBox.Checked; + } + set + { + this.RememberCheckBox.Checked = value; + } + } + + private void ButtonOK_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + private void AuthDialog_Load(object sender, EventArgs e) + { + this.Icon = Rei.Fs.My.Resources.Resources.security; + } + } +} diff --git a/Rei.Fs/AuthDialog.resx b/Rei.Fs/AuthDialog.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/Rei.Fs/AuthDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rei.Fs/AutoSplitFs.cs b/Rei.Fs/AutoSplitFs.cs new file mode 100644 index 0000000..9bd2509 --- /dev/null +++ b/Rei.Fs/AutoSplitFs.cs @@ -0,0 +1,1070 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.AutoSplitFs +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; + +namespace Rei.Fs +{ + public class AutoSplitFs : FsBase + { + private FsBase basefs; + private string EscapeString; + public long SplitSize; + + public AutoSplitFs(FsBase @base, long size, string escape) + : base(@base.ConnectionSetting) + { + if (size <= 0L) + throw new ArgumentOutOfRangeException(nameof (size)); + this.basefs = @base; + this.SplitSize = size; + this.EscapeString = escape; + this.basefs.LogMessage += new EventHandler(this.InnerOnLogMessage); + } + + private void InnerOnLogMessage(object sender, LogMessageEventArgs e) + { + this.OnLogMessage(e.Message); + } + + public override SecureType LastSecureType + { + get + { + return this.basefs.LastSecureType; + } + } + + public override string ClientName + { + get + { + return this.basefs.ClientName; + } + set + { + this.basefs.ClientName = value; + } + } + + public override string GroupName + { + get + { + return this.basefs.GroupName; + } + set + { + this.basefs.GroupName = value; + } + } + + public override string UserName + { + get + { + return this.basefs.UserName; + } + } + + public override string Password + { + get + { + return this.basefs.Password; + } + } + + public override FsAbility Ability + { + get + { + return (this.basefs.Ability | FsAbility.PartialRead | FsAbility.PartialWrite) & ~FsAbility.Lock; + } + } + + public override void ResetConnection() + { + this.basefs.ResetConnection(); + base.ResetConnection(); + } + + public override ResourceInfo GetInfo(Uri targeturi) + { + ResourceInfo info = this.basefs.GetInfo(targeturi); + if (info.IsCollection) + { + info.Id = (ResourceId) new AutoSplitFs.SplitId(info.Id, this); + return info; + } + AutoSplitFs.SplitId splitId = new AutoSplitFs.SplitId(info.Id, this); + ResourceInfo[] parentInfoAndEntries = this.GetParentInfoAndEntries((ResourceId) splitId); + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index = num1; + while (index <= num2) + { + if ((ResourceId) splitId == parentInfoAndEntries[index].Id) + return parentInfoAndEntries[index]; + checked { ++index; } + } + throw new RemoteResourceNotFoundException(targeturi); + } + + public override ResourceInfo GetInfo(ResourceId id) + { + AutoSplitFs.SplitId splitId = (AutoSplitFs.SplitId) id; + if (splitId.IsCollection) + { + ResourceInfo info = this.basefs.GetInfo(splitId.BaseId); + if (info.IsCollection) + { + info.Id = (ResourceId) new AutoSplitFs.SplitId(info.Id, this); + return info; + } + } + ResourceInfo[] parentInfoAndEntries = this.GetParentInfoAndEntries((ResourceId) splitId); + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index = num1; + while (index <= num2) + { + if ((ResourceId) splitId == parentInfoAndEntries[index].Id) + return parentInfoAndEntries[index]; + checked { ++index; } + } + throw new RemoteResourceNotFoundException(splitId.Uri); + } + + public override ResourceInfo GetInfo(ResourceId parentid, string name) + { + AutoSplitFs.SplitId splitId = (AutoSplitFs.SplitId) parentid; + ResourceInfo[] infoAndEntries = this.GetInfoAndEntries((ResourceId) splitId); + Uri uri = UriUtil.CombineName(splitId.Uri, name); + Uri u1 = UriUtil.AddLastSlash(uri); + int num1 = 1; + int num2 = checked (infoAndEntries.Length - 1); + int index = num1; + while (index <= num2) + { + if (UriUtil.UriEquals(uri, infoAndEntries[index].Id.Uri, this.basefs.IsCaseSensitiveFs) || UriUtil.UriEquals(u1, infoAndEntries[index].Id.Uri, this.basefs.IsCaseSensitiveFs)) + return infoAndEntries[index]; + checked { ++index; } + } + throw new RemoteResourceNotFoundException(uri); + } + + public override ResourceInfo[] GetEntries(ResourceId id) + { + return this.InnerCombineList(this.basefs.GetEntries(((AutoSplitFs.SplitId) id).BaseId)); + } + + public override ResourceInfo[] GetInfoAndEntries(Uri targeturi) + { + ResourceInfo[] infoAndEntries = this.basefs.GetInfoAndEntries(targeturi); + if (infoAndEntries[0].IsCollection) + return this.InnerCombineList(infoAndEntries); + ResourceId id = infoAndEntries[0].Id; + ResourceInfo[] resourceInfoArray = this.InnerCombineList(this.basefs.GetParentInfoAndEntries(id)); + int num1 = 1; + int num2 = checked (resourceInfoArray.Length - 1); + int index = num1; + while (index <= num2) + { + if (id == resourceInfoArray[index].Id) + return new ResourceInfo[1] + { + resourceInfoArray[index] + }; + checked { ++index; } + } + throw new RemoteResourceNotFoundException(targeturi); + } + + public override ResourceInfo[] GetInfoAndEntries(ResourceId id) + { + AutoSplitFs.SplitId splitId = (AutoSplitFs.SplitId) id; + if (splitId.IsCollection) + return this.InnerCombineList(this.basefs.GetInfoAndEntries(splitId.BaseId)); + return new ResourceInfo[1] + { + this.GetInfo((ResourceId) splitId) + }; + } + + public override ResourceInfo[] GetParentInfoAndEntries(ResourceId childid) + { + return this.InnerCombineList(this.basefs.GetParentInfoAndEntries(((AutoSplitFs.SplitId) childid).BaseId)); + } + + private ResourceInfo[] InnerCombineList(ResourceInfo[] ris) + { + List resourceInfoList = new List(); + List intList1 = new List(); + List intList2 = new List(); + int num1 = 0; + int num2 = checked (ris.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (ris[index1].IsCollection) + { + ris[index1].Id = (ResourceId) new AutoSplitFs.SplitId(ris[index1].Id, this); + resourceInfoList.Add(ris[index1]); + } + else + { + string lastName1 = UriUtil.GetLastName(ris[index1].Id.Uri); + int num3 = lastName1.LastIndexOf(this.EscapeString); + int result; + if (num3 >= 0 && checked (num3 + this.EscapeString.Length) < lastName1.Length && (int.TryParse(lastName1.Substring(checked (num3 + this.EscapeString.Length)), out result) && result >= 1)) + { + intList1.Add(index1); + } + else + { + ResourceInfo ri = ris[index1]; + string lastName2 = UriUtil.GetLastName(ri.Id.Uri); + ri.Id = (ResourceId) new AutoSplitFs.SplitId(ri.Id, this); + result = 1; +label_6: + string Right = lastName2 + this.EscapeString + result.ToString(); + int num4 = 0; + int num5 = checked (ris.Length - 1); + int index2 = num4; + while (index2 <= num5) + { + if (!ris[index2].IsCollection && Operators.CompareString(UriUtil.GetLastName(ris[index2].Id.Uri), Right, false) == 0) + { + if (ris[index2].HasError) + ri.HasError = true; + if (ri.Size >= 0L) + { + if (ris[index2].Size < 0L) + { + ri.Size = -1L; + } + else + { + ResourceInfo resourceInfo = ri; + resourceInfo.Size = checked (resourceInfo.Size + ris[index2].Size); + } + } + intList2.Add(index2); + checked { ++result; } + goto label_6; + } + else + checked { ++index2; } + } + if (result > 1) + ri.IsSplitted = true; + resourceInfoList.Add(ri); + } + } + checked { ++index1; } + } + int num6 = 0; + int num7 = checked (intList2.Count - 1); + int index3 = num6; + while (index3 <= num7) + { + int index2 = intList1.IndexOf(intList2[index3]); + if (index2 >= 0) + intList1.RemoveAt(index2); + checked { ++index3; } + } + int num8 = 0; + int num9 = checked (intList1.Count - 1); + int index4 = num8; + while (index4 <= num9) + { + ResourceInfo ri = ris[intList1[index4]]; + ri.Id = (ResourceId) new AutoSplitFs.SplitId(ri.Id, this); + ri.IsMinor = true; + resourceInfoList.Add(ri); + checked { ++index4; } + } + ris = resourceInfoList.ToArray(); + return ris; + } + + public override ReturnedInfo CreateCollection(ResourceId parentid, string name) + { + ReturnedInfo collection = this.basefs.CreateCollection(((AutoSplitFs.SplitId) parentid).BaseId, name); + ResourceInfo resourceInfo1 = collection as ResourceInfo; + if (resourceInfo1 == null) + return (ReturnedInfo) new AutoSplitFs.SplitId(collection as ResourceId, this); + ResourceId resourceId = (ResourceId) new AutoSplitFs.SplitId(resourceInfo1.Id, this); + ResourceInfo resourceInfo2 = (ResourceInfo) resourceInfo1.Clone(); + resourceInfo1.Id = resourceId; + return (ReturnedInfo) resourceInfo1; + } + + public override void Delete(ResourceId id) + { + AutoSplitFs.SplitId splitId = (AutoSplitFs.SplitId) id; + ResourceInfo resourceInfo = (ResourceInfo) null; + ResourceInfo[] parentInfoAndEntries = this.basefs.GetParentInfoAndEntries(splitId.BaseId); + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (parentInfoAndEntries[index1].Id == splitId.BaseId) + { + resourceInfo = parentInfoAndEntries[index1]; + break; + } + checked { ++index1; } + } + if (resourceInfo == null) + throw new RemoteResourceNotFoundException(splitId.Uri); + this.basefs.Delete(resourceInfo.Id); + if (resourceInfo.IsCollection) + return; + try + { + int num3 = 1; + string name = splitId.Name; +label_9: + Uri u2 = UriUtil.CombineName(splitId.Parent, name + this.EscapeString + num3.ToString()); + int num4 = 1; + int num5 = checked (parentInfoAndEntries.Length - 1); + int index2 = num4; + while (index2 <= num5) + { + if (!parentInfoAndEntries[index2].IsCollection && UriUtil.UriEquals(parentInfoAndEntries[index2].Id.Uri, u2, this.basefs.IsCaseSensitiveFs)) + { + this.basefs.Delete(parentInfoAndEntries[index2].Id); + checked { ++num3; } + goto label_9; + } + else + checked { ++index2; } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception innerexception = ex; + throw new InconsistencyDetectedException(splitId.Uri, "Exception occurred in undivisable operation.", innerexception); + } + } + + public override ReturnedInfo Move(ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + AutoSplitFs.SplitId splitId1 = (AutoSplitFs.SplitId) id; + AutoSplitFs.SplitId splitId2 = (AutoSplitFs.SplitId) newparentid; + ResourceId newparentid1 = (object) newparentid != null ? splitId2.BaseId : (ResourceId) null; + ResourceInfo resourceInfo = (ResourceInfo) null; + ResourceInfo[] parentInfoAndEntries = this.basefs.GetParentInfoAndEntries(splitId1.BaseId); + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (parentInfoAndEntries[index1].Id == splitId1.BaseId) + { + resourceInfo = parentInfoAndEntries[index1]; + break; + } + checked { ++index1; } + } + if (resourceInfo == null) + throw new RemoteResourceNotFoundException(splitId1.Uri); + ReturnedInfo returnedInfo = this.basefs.Move(resourceInfo.Id, newparentid1, newname, overwrite); + AutoSplitFs.SplitId splitId3 = !(returnedInfo is ResourceInfo) ? new AutoSplitFs.SplitId((ResourceId) returnedInfo, this) : new AutoSplitFs.SplitId(((ResourceInfo) returnedInfo).Id, this); + if (!resourceInfo.IsCollection) + { + try + { + int num3 = 1; + string name = splitId1.Name; +label_9: + Uri u2 = UriUtil.CombineName(splitId1.Parent, name + this.EscapeString + num3.ToString()); + int num4 = 1; + int num5 = checked (parentInfoAndEntries.Length - 1); + int index2 = num4; + while (index2 <= num5) + { + if (!parentInfoAndEntries[index2].IsCollection && UriUtil.UriEquals(parentInfoAndEntries[index2].Id.Uri, u2, this.basefs.IsCaseSensitiveFs)) + { + string newname1 = newname != null ? newname + this.EscapeString + num3.ToString() : (string) null; + this.basefs.Move(parentInfoAndEntries[index2].Id, newparentid1, newname1, overwrite); + checked { ++num3; } + goto label_9; + } + else + checked { ++index2; } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception innerexception = ex; + throw new InconsistencyDetectedException(splitId1.Uri, "Exception occurred in undivisable operation.", innerexception); + } + } + return (ReturnedInfo) splitId3; + } + + public override ReturnedInfo Copy(ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + AutoSplitFs.SplitId splitId1 = (AutoSplitFs.SplitId) id; + AutoSplitFs.SplitId splitId2 = (AutoSplitFs.SplitId) newparentid; + ResourceId newparentid1 = (object) newparentid != null ? splitId2.BaseId : (ResourceId) null; + ResourceInfo resourceInfo = (ResourceInfo) null; + ResourceInfo[] parentInfoAndEntries = this.basefs.GetParentInfoAndEntries(splitId1.BaseId); + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (parentInfoAndEntries[index1].Id == splitId1.BaseId) + { + resourceInfo = parentInfoAndEntries[index1]; + break; + } + checked { ++index1; } + } + if (resourceInfo == null) + throw new RemoteResourceNotFoundException(splitId1.Uri); + ReturnedInfo returnedInfo = this.basefs.Copy(resourceInfo.Id, newparentid1, newname, overwrite); + AutoSplitFs.SplitId splitId3 = !(returnedInfo is ResourceInfo) ? new AutoSplitFs.SplitId((ResourceId) returnedInfo, this) : new AutoSplitFs.SplitId(((ResourceInfo) returnedInfo).Id, this); + if (!resourceInfo.IsCollection) + { + try + { + int num3 = 1; + string name = splitId1.Name; +label_9: + Uri u2 = UriUtil.CombineName(splitId1.Parent, name + this.EscapeString + num3.ToString()); + int num4 = 1; + int num5 = checked (parentInfoAndEntries.Length - 1); + int index2 = num4; + while (index2 <= num5) + { + if (!parentInfoAndEntries[index2].IsCollection && UriUtil.UriEquals(parentInfoAndEntries[index2].Id.Uri, u2, this.basefs.IsCaseSensitiveFs)) + { + string newname1 = newname != null ? newname + this.EscapeString + num3.ToString() : (string) null; + this.basefs.Copy(parentInfoAndEntries[index2].Id, newparentid1, newname1, overwrite); + checked { ++num3; } + goto label_9; + } + else + checked { ++index2; } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception innerexception = ex; + throw new InconsistencyDetectedException(splitId1.Uri, "Exception occurred in undivisable operation.", innerexception); + } + } + return (ReturnedInfo) splitId3; + } + + public override ReturnedInfo SetTimes(ResourceId id, DateTime lastmodifiedtime, DateTime creationtime, DateTime lastaccesstime) + { + return this.basefs.SetTimes(((AutoSplitFs.SplitId) id).BaseId, lastmodifiedtime, creationtime, lastaccesstime); + } + + public override ReturnedInfo SetResourceInfo(ResourceInfo info, ResourceInfo original) + { + ResourceInfo resourceInfo = (ResourceInfo) original.Clone(); + resourceInfo.Id = ((AutoSplitFs.SplitId) resourceInfo.Id).BaseId; + return this.basefs.SetResourceInfo(info, original); + } + + public override Stream OpenRead(ResourceId id, ref long start, ref long length) + { + AutoSplitFs.SplitId id1 = (AutoSplitFs.SplitId) id; + if (start < 0L) + throw new ArgumentOutOfRangeException(nameof (start)); + if (length == 0L) + throw new ArgumentOutOfRangeException(nameof (length)); + return (Stream) new AutoSplitFs.CombinedReadStream(this, id1, ref start, ref length); + } + + public override Stream OpenWrite(ResourceId parentid, string name, long length) + { + AutoSplitFs.SplitId parentid1 = (AutoSplitFs.SplitId) parentid; + int num = name.IndexOf(this.EscapeString); + int result; + if (num >= 0 && checked (num + this.EscapeString.Length) < name.Length && (int.TryParse(name.Substring(checked (num + this.EscapeString.Length)), out result) && result >= 1)) + throw new ArgumentException("Invalid name"); + return (Stream) new AutoSplitFs.CombinedWriteStream(this, parentid1, name, length, this.SplitSize); + } + + public override Stream OpenWriteOver(ResourceId id, long length) + { + AutoSplitFs.SplitId splitId = (AutoSplitFs.SplitId) id; + int num = splitId.Name.IndexOf(this.EscapeString); + int result; + if (num >= 0 && checked (num + this.EscapeString.Length) < splitId.Name.Length && (int.TryParse(splitId.Name.Substring(checked (num + this.EscapeString.Length)), out result) && result >= 1)) + throw new ArgumentException("Invalid name"); + AutoSplitFs.SplitId id1 = splitId; + long start = 0; + long splitSize = this.SplitSize; + return (Stream) new AutoSplitFs.CombinedWriteStream(this, id1, ref start, ref length, splitSize); + } + + public override Stream OpenWriteResume(ResourceId id, ref long start, ref long length) + { + AutoSplitFs.SplitId id1 = (AutoSplitFs.SplitId) id; + if (start < 0L) + throw new ArgumentOutOfRangeException(nameof (start)); + return (Stream) new AutoSplitFs.CombinedWriteStream(this, id1, ref start, ref length, this.SplitSize); + } + + public override ReturnedInfo CloseWrite(Stream st) + { + st.Close(); + return (ReturnedInfo) ((AutoSplitFs.CombinedWriteStream) st).Id; + } + + public override string GetLock(ResourceId id, string owner, int timeoutseconds, FsBase.LockScope scope) + { + throw new NotImplementedException(); + } + + public override void ReleaseLock(ResourceId id, string locktoken) + { + throw new NotImplementedException(); + } + + private class CombinedReadStream : Stream + { + private AutoSplitFs pFs; + private AutoSplitFs.SplitId pId; + private int pSplitIndex; + private long pLength; + private long pPosition; + private Stream pCurrentStream; + + public CombinedReadStream(AutoSplitFs fs, AutoSplitFs.SplitId id, ref long start, ref long length) + { + this.pFs = fs; + this.pSplitIndex = 0; + long num1 = 0; + this.pId = id; + ResourceId id1 = this.pId.BaseId; + if (start > 0L) + { + ResourceInfo resourceInfo = (ResourceInfo) null; + ResourceInfo[] parentInfoAndEntries = this.pFs.basefs.GetParentInfoAndEntries(this.pId.BaseId); + int num2 = 1; + int num3 = checked (parentInfoAndEntries.Length - 1); + int index1 = num2; + while (index1 <= num3) + { + if (parentInfoAndEntries[index1].Id == this.pId.BaseId) + { + resourceInfo = parentInfoAndEntries[index1]; + break; + } + checked { ++index1; } + } + if (resourceInfo == null) + throw new RemoteResourceNotFoundException(this.pId.Uri); + if (resourceInfo.Size >= 0L && start >= resourceInfo.Size) + { + this.pSplitIndex = checked (this.pSplitIndex + 1); + checked { num1 += resourceInfo.Size; } + string name = this.pId.Name; +label_10: + Uri u2 = UriUtil.CombineName(this.pId.Parent, name + this.pFs.EscapeString + this.pSplitIndex.ToString()); + int num4 = 1; + int num5 = checked (parentInfoAndEntries.Length - 1); + int index2 = num4; + while (index2 <= num5) + { + if (!parentInfoAndEntries[index2].IsCollection && UriUtil.UriEquals(parentInfoAndEntries[index2].Id.Uri, u2, this.pFs.basefs.IsCaseSensitiveFs)) + { + if (parentInfoAndEntries[index2].Size >= 0L && start >= checked (num1 + parentInfoAndEntries[index2].Size)) + { + this.pSplitIndex = checked (this.pSplitIndex + 1); + checked { num1 += parentInfoAndEntries[index2].Size; } + goto label_10; + } + else + { + id1 = parentInfoAndEntries[index2].Id; + goto label_18; + } + } + else + checked { ++index2; } + } + throw new InvalidRangeException(); + } + } +label_18: + long start1 = 0; + if ((this.pFs.basefs.Ability & FsAbility.PartialRead) != FsAbility.None) + start1 = checked (start - num1); + long length1 = -1; + this.pCurrentStream = this.pFs.basefs.OpenRead(id1, ref start1, ref length1); + if (length >= 0L) + length = checked (length + start - num1 - start1); + start = checked (start1 + num1); + if (length >= 0L) + { + if (length1 > length) + length = length1; + if (length1 < 0L) + length = -1L; + if (length1 >= 0L && length > length1) + length = -1L; + } + this.pPosition = 0L; + this.pLength = length; + } + + public override bool CanRead + { + get + { + return true; + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override bool CanWrite + { + get + { + return false; + } + } + + public override long Length + { + get + { + return this.pLength; + } + } + + public override long Position + { + get + { + return this.pPosition; + } + set + { + throw new NotSupportedException(); + } + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + if (this.pCurrentStream == null) + return; + this.pCurrentStream.Flush(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + if (this.pCurrentStream == null) + throw new ObjectDisposedException(this.GetType().FullName); + if (this.pLength >= 0L && checked (this.pPosition + (long) count) > this.pLength) + count = checked ((int) (this.pLength - this.pPosition)); + if (count < 0) + throw new ArgumentOutOfRangeException(nameof (count)); + if (count == 0) + return 0; + int num1; + int num2; + while (true) + { + num1 = this.pCurrentStream.Read(buffer, offset, count); + if (num1 <= 0) + { + this.pCurrentStream.Close(); + this.pSplitIndex = checked (this.pSplitIndex + 1); + Uri targeturi = UriUtil.CombineName(this.pId.Parent, this.pId.Name + this.pFs.EscapeString + this.pSplitIndex.ToString()); + try + { + this.pCurrentStream = this.pFs.basefs.OpenRead(targeturi); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + RemoteResourceNotFoundException notFoundException = ex; + if (this.pLength >= 0L) + throw new InvalidRangeException((Exception) notFoundException); + num2 = 0; + ProjectData.ClearProjectError(); + goto label_16; + } + } + else + break; + } + this.pPosition = checked (this.pPosition + (long) num1); + return num1; +label_16: + return num2; + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.pCurrentStream == null) + return; + this.pCurrentStream.Close(); + this.pCurrentStream = (Stream) null; + } + finally + { + base.Dispose(disposing); + } + } + } + + private class CombinedWriteStream : Stream + { + private AutoSplitFs pFs; + public AutoSplitFs.SplitId pId; + private string pName; + private ResourceId pParentId; + private int pSplitIndex; + private long pSplitSize; + private long pLength; + private long pPosition; + private long pCurrentLength; + private long pCurrentPosition; + private Stream pCurrentStream; + + public CombinedWriteStream(AutoSplitFs fs, AutoSplitFs.SplitId parentid, string name, long length, long splitsize) + { + this.pFs = fs; + this.pParentId = parentid.BaseId; + this.pName = name; + this.pSplitSize = splitsize; + this.pSplitIndex = 0; + this.pId = (AutoSplitFs.SplitId) null; + this.pPosition = 0L; + this.pLength = length; + this.DeleteFollowingFiles(this.pFs.basefs.GetEntries(this.pParentId), 0); + this.pCurrentLength = this.pLength >= 0L ? (checked (this.pLength - this.pPosition) > this.pSplitSize ? this.pSplitSize : checked (this.pLength - this.pPosition)) : -1L; + this.pCurrentStream = this.pFs.basefs.OpenWrite(this.pParentId, this.pName, this.pCurrentLength); + this.pCurrentPosition = 0L; + } + + public CombinedWriteStream(AutoSplitFs fs, AutoSplitFs.SplitId id, ref long start, ref long length, long splitsize) + { + this.pFs = fs; + this.pName = UriUtil.GetLastName(id.BaseId.Uri); + this.pSplitSize = splitsize; + ResourceInfo[] parentInfoAndEntries = this.pFs.basefs.GetParentInfoAndEntries(id.BaseId); + this.pParentId = parentInfoAndEntries[0].Id; + ResourceInfo resourceInfo = (ResourceInfo) null; + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if (parentInfoAndEntries[index1].Id == id.BaseId) + { + resourceInfo = parentInfoAndEntries[index1]; + break; + } + checked { ++index1; } + } + if (resourceInfo == null) + throw new RemoteResourceNotFoundException(id.Uri); + long num3 = 0; + this.pSplitIndex = 0; + if (resourceInfo.Size >= 0L && start >= checked (resourceInfo.Size + num3)) + { + if (resourceInfo.Size != 0L) + { + checked { num3 += resourceInfo.Size; } + this.pId = new AutoSplitFs.SplitId(resourceInfo.Id, this.pFs); + this.pSplitIndex = 1; + } + int num4 = 1; +label_11: + Uri u2 = UriUtil.CombineName(this.pParentId.Uri, this.pName + this.pFs.EscapeString + num4.ToString()); + int num5 = 1; + int num6 = checked (parentInfoAndEntries.Length - 1); + int index2 = num5; + while (index2 <= num6) + { + if (!parentInfoAndEntries[index2].IsCollection && UriUtil.UriEquals(parentInfoAndEntries[index2].Id.Uri, u2, fs.IsCaseSensitiveFs)) + { + if (parentInfoAndEntries[index2].Size != 0L) + { + if (this.pId == null) + this.pId = new AutoSplitFs.SplitId(resourceInfo.Id, this.pFs); + if (parentInfoAndEntries[index2].Size < 0L || start < checked (parentInfoAndEntries[index2].Size + num3)) + { + this.pSplitIndex = num4; + break; + } + checked { num3 += parentInfoAndEntries[index2].Size; } + this.pSplitIndex = checked (num4 + 1); + } + checked { ++num4; } + goto label_11; + } + else + checked { ++index2; } + } + } + if (length >= 0L) + length = checked (length + start - num3); + start = num3; + this.pPosition = 0L; + this.pLength = length; + this.DeleteFollowingFiles(parentInfoAndEntries, 1); + this.pCurrentLength = this.pLength >= 0L ? (checked (this.pLength - this.pPosition) > this.pSplitSize ? this.pSplitSize : checked (length - this.pPosition)) : -1L; + this.pCurrentStream = this.pSplitIndex != 0 ? this.pFs.basefs.OpenWrite(this.pParentId, this.pName + this.pFs.EscapeString + this.pSplitIndex.ToString(), this.pCurrentLength) : this.pFs.basefs.OpenWrite(this.pParentId, this.pName, this.pCurrentLength); + this.pCurrentPosition = 0L; + } + + public override bool CanRead + { + get + { + return false; + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override bool CanWrite + { + get + { + return true; + } + } + + public override long Length + { + get + { + return this.pLength; + } + } + + public override long Position + { + get + { + return this.pPosition; + } + set + { + throw new NotSupportedException(); + } + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + if (this.pCurrentStream == null) + return; + this.pCurrentStream.Flush(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + if (this.pCurrentStream == null) + throw new ObjectDisposedException(this.GetType().FullName); + if (count < 0) + throw new ArgumentOutOfRangeException(nameof (count)); + if (offset < 0) + throw new ArgumentOutOfRangeException(nameof (offset)); + if (this.pLength >= 0L && checked (this.pPosition + (long) count) > this.pLength) + throw new ArgumentException("stream overflow", nameof (count)); + while (count != 0) + { + if (this.pCurrentPosition == this.pCurrentLength || this.pCurrentLength < 0L && this.pCurrentPosition == this.pSplitSize) + { + Stream pCurrentStream = this.pCurrentStream; + this.pCurrentStream = (Stream) null; + pCurrentStream.Close(); + ReturnedInfo returnedInfo = this.pFs.basefs.CloseWrite(pCurrentStream); + ResourceId baseid = !(returnedInfo is ResourceInfo) ? (ResourceId) returnedInfo : ((ResourceInfo) returnedInfo).Id; + if (this.pId == null) + this.pId = new AutoSplitFs.SplitId(baseid, this.pFs); + this.pSplitIndex = checked (this.pSplitIndex + 1); + this.pCurrentLength = this.pLength >= 0L ? (checked (this.pLength - this.pPosition) > this.pSplitSize ? this.pSplitSize : checked (this.pLength - this.pPosition)) : -1L; + this.pCurrentStream = this.pFs.basefs.OpenWrite(this.pParentId, this.pName + this.pFs.EscapeString + this.pSplitIndex.ToString(), this.pCurrentLength); + this.pCurrentPosition = 0L; + } + int count1 = count; + if (this.pCurrentLength < 0L) + { + if ((long) count1 > checked (this.pSplitSize - this.pCurrentPosition)) + count1 = checked ((int) (this.pSplitSize - this.pCurrentPosition)); + } + else if ((long) count1 > checked (this.pCurrentLength - this.pCurrentPosition)) + count1 = checked ((int) (this.pCurrentLength - this.pCurrentPosition)); + this.pCurrentStream.Write(buffer, offset, count1); + checked { count -= count1; } + checked { offset += count1; } + this.pCurrentPosition = checked (this.pCurrentPosition + (long) count1); + this.pPosition = checked (this.pPosition + (long) count1); + } + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.pCurrentStream == null) + return; + Stream pCurrentStream = this.pCurrentStream; + this.pCurrentStream = (Stream) null; + pCurrentStream.Close(); + ReturnedInfo returnedInfo = this.pFs.basefs.CloseWrite(pCurrentStream); + ResourceId baseid = !(returnedInfo is ResourceInfo) ? (ResourceId) returnedInfo : ((ResourceInfo) returnedInfo).Id; + if (this.pId != null) + return; + this.pId = new AutoSplitFs.SplitId(baseid, this.pFs); + } + finally + { + base.Dispose(disposing); + } + } + + public ResourceId Id + { + get + { + return (ResourceId) this.pId; + } + } + + private void DeleteFollowingFiles(ResourceInfo[] ris, int startindex) + { + string str = this.pName + this.pFs.EscapeString; + int num1 = startindex; + int num2 = checked (ris.Length - 1); + int index = num1; + while (index <= num2) + { + if (!ris[index].IsCollection) + { + string lastName = UriUtil.GetLastName(ris[index].Id.Uri); + int result; + if (lastName.StartsWith(str) && int.TryParse(lastName.Substring(str.Length), NumberStyles.None, (IFormatProvider) null, out result)) + { + if (result > this.pSplitIndex) + { + try + { + this.pFs.basefs.Delete(ris[index].Id); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + } + } + } + checked { ++index; } + } + } + } + + [Serializable] + public class SplitId : ResourceId + { + private ResourceId pBaseId; + private List pInnerIdList; + + public SplitId(ResourceId baseid, AutoSplitFs fs) + : base(baseid.Uri, (FsBase) fs) + { + this.pInnerIdList = new List(); + this.pBaseId = baseid; + this.pInnerIdList.Add(baseid); + } + + public ResourceId BaseId + { + get + { + return this.pBaseId; + } + } + + public string Name + { + get + { + return UriUtil.GetLastName(this.pBaseId.Uri); + } + } + + public Uri Parent + { + get + { + return UriUtil.GetParent(this.pBaseId.Uri); + } + } + } + } +} diff --git a/Rei.Fs/CannotProcessRequest.cs b/Rei.Fs/CannotProcessRequest.cs new file mode 100644 index 0000000..408d8bb --- /dev/null +++ b/Rei.Fs/CannotProcessRequest.cs @@ -0,0 +1,41 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.CannotProcessRequest +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class CannotProcessRequest : Exception + { + private Uri _target; + + public CannotProcessRequest(Uri uri, string message) + : base(message) + { + this._target = uri; + } + + public CannotProcessRequest(Uri uri, Exception innerexception) + : base("Cannot Process Request", innerexception) + { + this._target = uri; + } + + public CannotProcessRequest(Uri uri, string message, Exception innerexception) + : base(message, innerexception) + { + this._target = uri; + } + + public Uri TargetUri + { + get + { + return this._target; + } + } + } +} diff --git a/Rei.Fs/ChunkedStream.cs b/Rei.Fs/ChunkedStream.cs new file mode 100644 index 0000000..82f0101 --- /dev/null +++ b/Rei.Fs/ChunkedStream.cs @@ -0,0 +1,165 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ChunkedStream +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; +using System.IO; + +namespace Rei.Fs +{ + public class ChunkedStream : Stream + { + private Stream pBaseStream; + public object Tag; + private long pChunkSize; + private long pCurrentPosition; + private long pChunkPosition; + private long pTotalLength; + private bool pDisposed; + + public event EventHandler ChunkFinishedEvent; + + public ChunkedStream(Stream basestream, long chunksize, long totallength) + { + this.pDisposed = false; + this.pBaseStream = basestream; + this.pChunkSize = chunksize; + this.pCurrentPosition = 0L; + this.pChunkPosition = 0L; + this.pTotalLength = totallength; + } + + public void SetStream(Stream basestream) + { + this.pBaseStream = basestream; + this.pChunkPosition = 0L; + } + + public Stream BaseStream + { + get + { + return this.pBaseStream; + } + } + + public long ChunkSize + { + get + { + return this.pChunkSize; + } + } + + public override bool CanRead + { + get + { + return false; + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override bool CanWrite + { + get + { + return this.BaseStream.CanWrite; + } + } + + public override long Length + { + get + { + return this.pTotalLength; + } + } + + public override long Position + { + get + { + return this.pCurrentPosition; + } + set + { + throw new NotSupportedException(); + } + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + if (this.pBaseStream == null) + return; + this.pBaseStream.Flush(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + if (this.pBaseStream == null) + throw new ObjectDisposedException(this.GetType().FullName); + if (count < 0) + throw new ArgumentOutOfRangeException(nameof (count)); + if (offset < 0) + throw new ArgumentOutOfRangeException(nameof (offset)); + int count1 = count; + if (checked ((long) count1 + this.pChunkPosition) > this.pChunkSize) + count1 = checked ((int) (this.pChunkSize - this.pChunkPosition)); + if (count1 > 0) + { + this.pBaseStream.Write(buffer, offset, count1); + checked { count -= count1; } + checked { offset += count1; } + this.pChunkPosition = checked (this.pChunkPosition + (long) count1); + this.pCurrentPosition = checked (this.pCurrentPosition + (long) count1); + } + if (count <= 0) + return; + this.pBaseStream.Close(); + EventHandler finishedEventEvent = this.ChunkFinishedEventEvent; + if (finishedEventEvent != null) + finishedEventEvent((object) this, EventArgs.Empty); + this.Write(buffer, offset, count); + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.pDisposed) + return; + this.pDisposed = true; + this.pBaseStream.Close(); + } + finally + { + base.Dispose(disposing); + } + } + } +} diff --git a/Rei.Fs/CloseNotifyStream.cs b/Rei.Fs/CloseNotifyStream.cs new file mode 100644 index 0000000..484ca46 --- /dev/null +++ b/Rei.Fs/CloseNotifyStream.cs @@ -0,0 +1,198 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.CloseNotifyStream +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; +using System.IO; +using System.Runtime.CompilerServices; + +namespace Rei.Fs +{ + public class CloseNotifyStream : Stream + { + private Stream pBaseStream; + private long pTotalWrite; + public object Tag; + private bool pDisposed; + + public event EventHandler ClosedEvent; + + public event EventHandler ClosingEvent; + + public CloseNotifyStream(Stream basestream) + { + this.pDisposed = false; + this.pBaseStream = basestream; + this.pTotalWrite = 0L; + } + + public Stream BaseStream + { + get + { + return this.pBaseStream; + } + } + + public long TotalWrite + { + get + { + return this.pTotalWrite; + } + } + + public override bool CanRead + { + get + { + return this.pBaseStream.CanRead; + } + } + + public override bool CanSeek + { + get + { + return this.pBaseStream.CanSeek; + } + } + + public override bool CanWrite + { + get + { + return this.pBaseStream.CanWrite; + } + } + + public override bool CanTimeout + { + get + { + return this.pBaseStream.CanTimeout; + } + } + + public override long Length + { + get + { + return this.pBaseStream.Length; + } + } + + public override long Position + { + get + { + return this.pBaseStream.Position; + } + set + { + this.pBaseStream.Position = value; + } + } + + public override int ReadTimeout + { + get + { + return this.pBaseStream.ReadTimeout; + } + set + { + this.pBaseStream.ReadTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return this.pBaseStream.WriteTimeout; + } + set + { + this.pBaseStream.WriteTimeout = value; + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + return this.pBaseStream.Read(buffer, offset, count); + } + + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + return base.BeginRead(buffer, offset, count, callback, RuntimeHelpers.GetObjectValue(state)); + } + + public override int EndRead(IAsyncResult asyncResult) + { + return base.EndRead(asyncResult); + } + + public override long Seek(long offset, SeekOrigin origin) + { + return this.pBaseStream.Seek(offset, origin); + } + + public override void SetLength(long value) + { + this.pBaseStream.SetLength(value); + } + + public override void Write(byte[] buffer, int offset, int count) + { + this.pTotalWrite = checked (this.pTotalWrite + (long) count); + this.pBaseStream.Write(buffer, offset, count); + } + + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + this.pTotalWrite = checked (this.pTotalWrite + (long) count); + return base.BeginWrite(buffer, offset, count, callback, RuntimeHelpers.GetObjectValue(state)); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + base.EndWrite(asyncResult); + } + + public override void Flush() + { + this.pBaseStream.Flush(); + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.pDisposed) + return; + this.pDisposed = true; + try + { + EventHandler closingEventEvent = this.ClosingEventEvent; + if (closingEventEvent != null) + closingEventEvent((object) this, EventArgs.Empty); + } + finally + { + this.pBaseStream.Close(); + } + EventHandler closedEventEvent = this.ClosedEventEvent; + if (closedEventEvent == null) + return; + closedEventEvent((object) this, EventArgs.Empty); + } + finally + { + base.Dispose(disposing); + } + } + } +} diff --git a/Rei.Fs/ConnectionSettingBase.cs b/Rei.Fs/ConnectionSettingBase.cs new file mode 100644 index 0000000..0dc3681 --- /dev/null +++ b/Rei.Fs/ConnectionSettingBase.cs @@ -0,0 +1,635 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ConnectionSettingBase +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Net; +using System.Net.Security; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using System.Xml.Serialization; + +namespace Rei.Fs +{ + [Serializable] + public abstract class ConnectionSettingBase + { + private string pName; + private Uri pTargetUri; + private string pPersistUserName; + private string pPersistPassword; + private bool pDontSave; + public string FaviconName; + public UCSNormalization DownloadFilenameNormalization; + public UCSNormalization UploadFilenameNormalization; + public ProxyType Proxy; + private Uri pProxyUri; + private string[] pProxyByPassList; + public bool ProxyByPassLocal; + public bool ProxyUseDefaultCredential; + private string pProxyUsername; + private string pProxyPassword; + public int ReadWriteTimeout; + public int ConnectTimeout; + public bool UseEncryption; + private string pEncryptionKey; + public bool AutoSplit; + public int SplitSizeMB; + public string EscapeString; + public bool HideUnencryptedFile; + public bool HideUnencryptedDirectory; + private object pSyncObject; + private bool pNeedPersist; + private string pUserName; + private string pPassword; + private CookieContainer pCookieContainer; + private SslPolicyErrors pCertErrorIgnores; + private SslPolicyErrors pLastCertError; + + protected ConnectionSettingBase() + { + this.Name = string.Empty; + this.TargetUri = (Uri) null; + this.pPersistUserName = string.Empty; + this.pPersistPassword = string.Empty; + this.pDontSave = false; + this.DownloadFilenameNormalization = UCSNormalization.NFC; + this.UploadFilenameNormalization = UCSNormalization.None; + this.Proxy = ProxyType.Default; + this.ProxyUri = (Uri) null; + this.ProxyByPassList = new string[0]; + this.ProxyByPassLocal = false; + this.ProxyUseDefaultCredential = false; + this.pProxyUsername = string.Empty; + this.pProxyPassword = string.Empty; + this.ReadWriteTimeout = 10000; + this.ConnectTimeout = 10000; + this.UseEncryption = false; + this.pEncryptionKey = ""; + this.AutoSplit = false; + this.SplitSizeMB = 50; + this.EscapeString = "^_"; + this.HideUnencryptedDirectory = false; + this.HideUnencryptedFile = false; + this.pSyncObject = RuntimeHelpers.GetObjectValue(new object()); + this.pUserName = this.pPersistUserName; + this.pPassword = this.pPersistPassword; + this.pCookieContainer = new CookieContainer(); + } + + public abstract SecureType SecureType { get; } + + public static Icon GetDefaultFavicon() + { + return Rei.Fs.My.Resources.Resources.NetFolder; + } + + public string Name + { + get + { + return this.pName; + } + set + { + this.pName = value; + } + } + + [XmlIgnore] + public Uri TargetUri + { + get + { + return this.pTargetUri; + } + set + { + this.pTargetUri = value; + } + } + + [XmlElement("TargetUri")] + public string TargetUri_ForSerialization + { + get + { + return this.TargetUri.ToString(); + } + set + { + if (value == null || value.Length == 0) + this.pTargetUri = (Uri) null; + else + this.pTargetUri = new Uri(value); + } + } + + [XmlIgnore] + public string UserName + { + get + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return this.pUserName; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + [XmlIgnore] + public string PersistUserName + { + get + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return this.pPersistUserName; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + [XmlElement("UserName")] + [EditorBrowsable(EditorBrowsableState.Never)] + public string UserName_ForSerialization + { + get + { + if (this.DontSave) + return string.Empty; + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return this.pPersistUserName; + } + finally + { + Monitor.Exit(syncObject); + } + } + set + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + this.pPersistUserName = value; + this.pUserName = this.pPersistUserName; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + [XmlIgnore] + public string Password + { + get + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return this.pPassword; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + [XmlIgnore] + public string PersistPassword + { + get + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return this.pPersistPassword; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [XmlElement("Password")] + public string Password_ForSerialization + { + get + { + if (this.DontSave) + return string.Empty; + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return Convert.ToBase64String(Encoding.Unicode.GetBytes(this.pPersistPassword)); + } + finally + { + Monitor.Exit(syncObject); + } + } + set + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + try + { + this.pPersistPassword = Encoding.Unicode.GetString(Convert.FromBase64String(value)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pPersistPassword = string.Empty; + ProjectData.ClearProjectError(); + } + this.pPassword = this.pPersistPassword; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + public bool DontSave + { + get + { + return this.pDontSave; + } + set + { + this.pDontSave = value; + } + } + + [XmlIgnore] + public Uri ProxyUri + { + get + { + return this.pProxyUri; + } + set + { + this.pProxyUri = value; + } + } + + [Browsable(false)] + [XmlElement("ProxyUri")] + public string ProxyUri_ForSerialization + { + get + { + if ((object) this.pProxyUri == null) + return string.Empty; + return this.pProxyUri.ToString(); + } + set + { + if (value == null || value.Length == 0) + this.pProxyUri = (Uri) null; + else + this.pProxyUri = new Uri(value); + } + } + + public string ProxyUserName + { + get + { + if (this.DontSave) + return string.Empty; + return this.pProxyUsername; + } + set + { + if (value == null) + value = string.Empty; + this.pProxyUsername = value; + } + } + + [XmlIgnore] + public string ProxyPassword + { + get + { + if (this.DontSave) + return string.Empty; + return this.pProxyPassword; + } + set + { + if (value == null) + value = string.Empty; + this.pProxyPassword = value; + } + } + + [Browsable(false)] + [XmlElement("ProxyPassword")] + public string ProxyPassword_ForSerialization + { + get + { + if (this.DontSave) + return string.Empty; + return Convert.ToBase64String(Encoding.Unicode.GetBytes(this.pProxyPassword)); + } + set + { + try + { + this.pProxyPassword = Encoding.Unicode.GetString(Convert.FromBase64String(value)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pProxyPassword = string.Empty; + ProjectData.ClearProjectError(); + } + } + } + + [XmlIgnore] + public string[] ProxyByPassList + { + get + { + return this.pProxyByPassList; + } + set + { + if (value == null) + value = new string[0]; + this.pProxyByPassList = value; + } + } + + [Browsable(false)] + [XmlElement("ProxyByPassList")] + public string ProxyByPassList_ForSerialization + { + get + { + return string.Join(",", this.pProxyByPassList); + } + set + { + this.pProxyByPassList = value.Split(new char[2] + { + ' ', + ',' + }, StringSplitOptions.RemoveEmptyEntries); + } + } + + [XmlIgnore] + public string EncryptionKey + { + get + { + return this.pEncryptionKey; + } + set + { + if (value == null) + value = string.Empty; + this.pEncryptionKey = value; + } + } + + [XmlElement("EncryptionKey")] + public string EncryptionKey_ForSerialization + { + get + { + return Convert.ToBase64String(Encoding.Unicode.GetBytes(this.pEncryptionKey)); + } + set + { + try + { + this.pEncryptionKey = Encoding.Unicode.GetString(Convert.FromBase64String(value)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pEncryptionKey = string.Empty; + ProjectData.ClearProjectError(); + } + } + } + + [XmlIgnore] + public SslPolicyErrors CertErrorIgnores + { + get + { + return this.pCertErrorIgnores; + } + set + { + this.pCertErrorIgnores = value; + } + } + + [XmlIgnore] + public SslPolicyErrors LastCertError + { + get + { + return this.pLastCertError; + } + set + { + this.pLastCertError = value; + } + } + + [XmlIgnore] + public bool NeedPersist + { + get + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return this.pNeedPersist; + } + finally + { + Monitor.Exit(syncObject); + } + } + set + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + this.pNeedPersist = value; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + protected object SyncObject + { + get + { + return this.pSyncObject; + } + } + + [XmlIgnore] + public CookieContainer CookieContainer + { + get + { + object syncObject = this.SyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncObject); + Monitor.Enter(syncObject); + try + { + return this.pCookieContainer; + } + finally + { + Monitor.Exit(syncObject); + } + } + } + + public void SetUserPass(string username, string password) + { + object pSyncObject = this.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + if (username != null) + this.pUserName = username; + if (password == null) + return; + this.pPassword = password; + } + finally + { + Monitor.Exit(pSyncObject); + } + } + + public void PersistUserPass() + { + object pSyncObject = this.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + if (this.DontSave) + { + this.pPersistUserName = ""; + this.pPersistPassword = ""; + } + else + { + this.pPersistUserName = this.UserName; + this.pPersistPassword = this.Password; + } + this.NeedPersist = false; + } + finally + { + Monitor.Exit(pSyncObject); + } + } + + public FsBase GetClient() + { + FsBase @base = this.GetBaseClient(); + if (this.UseEncryption) + @base = (FsBase) new EncryptFs(@base, this.EncryptionKey, this.EscapeString, this.HideUnencryptedFile, this.HideUnencryptedDirectory); + if (this.AutoSplit) + @base = (FsBase) new AutoSplitFs(@base, checked ((long) this.SplitSizeMB * 1024L * 1024L), this.EscapeString); + return @base; + } + + public abstract FsBase GetBaseClient(); + + public abstract Form GetSettingForm(); + + public abstract bool DoAuthorization(Uri target, bool PersistSelectable); + + public virtual void Reset() + { + object pSyncObject = this.pSyncObject; + ObjectFlowControl.CheckForSyncLockOnValueType(pSyncObject); + Monitor.Enter(pSyncObject); + try + { + this.pUserName = this.pPersistUserName; + this.pPassword = this.pPersistPassword; + this.pCookieContainer = new CookieContainer(); + this.pNeedPersist = false; + } + finally + { + Monitor.Exit(pSyncObject); + } + } + + public virtual FsSpecificContextMenuItem[] GetExtensionMethod(ResourceInfo[] ris) + { + return (FsSpecificContextMenuItem[]) null; + } + } +} diff --git a/Rei.Fs/DestinationAlreadyExistsException.cs b/Rei.Fs/DestinationAlreadyExistsException.cs new file mode 100644 index 0000000..cdb7ac9 --- /dev/null +++ b/Rei.Fs/DestinationAlreadyExistsException.cs @@ -0,0 +1,39 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.DestinationAlreadyExistsException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class DestinationAlreadyExistsException : Exception + { + private Uri _target; + + public DestinationAlreadyExistsException(Uri destination, string message, Exception innerexception) + : base(message, innerexception) + { + this._target = destination; + } + + public DestinationAlreadyExistsException(Uri destination, Exception innerexception) + : this(destination, "Destination Resource Already Exists", innerexception) + { + } + + public DestinationAlreadyExistsException(Uri destination) + : this(destination, "Destination Resource Already Exists", (Exception) null) + { + } + + public Uri DestinationUri + { + get + { + return this._target; + } + } + } +} diff --git a/Rei.Fs/EncryptFs.cs b/Rei.Fs/EncryptFs.cs new file mode 100644 index 0000000..79c45da --- /dev/null +++ b/Rei.Fs/EncryptFs.cs @@ -0,0 +1,1069 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.EncryptFs +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Security.Cryptography; +using System.Text; + +namespace Rei.Fs +{ + public class EncryptFs : FsBase + { + private static string pVersionName = "1"; + private static byte[] pSalt; + private static string pName; + private FsBase basefs; + private string EscapeString; + private string EncryptKey; + private bool HideUnencryptedFile; + private bool HideUnencryptedDirectory; + private Rijndael crypto_none; + private Rijndael crypto_zero; + private const string FormatName = "CarotDAV Encryption 1.0 "; + + static EncryptFs() + { + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + EncryptFs.pName = ((AssemblyProductAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false)[0]).Product + executingAssembly.GetName().Version.ToString(3); + } + + public EncryptFs(FsBase @base, string key, string escape, bool hidefile, bool hidedir) + : base(@base.ConnectionSetting) + { + this.basefs = @base; + this.EncryptKey = key; + this.EscapeString = escape; + this.HideUnencryptedFile = hidefile; + this.HideUnencryptedDirectory = hidedir; + this.crypto_none = Rijndael.Create(); + this.crypto_none.Mode = CipherMode.CBC; + this.crypto_none.Padding = PaddingMode.None; + this.crypto_none.BlockSize = 128; + this.crypto_none.KeySize = 256; + this.crypto_zero = Rijndael.Create(); + this.crypto_zero.Mode = CipherMode.CBC; + this.crypto_zero.Padding = PaddingMode.Zeros; + this.crypto_zero.BlockSize = 128; + this.crypto_zero.KeySize = 256; + Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(this.EncryptKey, Encoding.UTF8.GetBytes("CarotDAV Encryption 1.0 "), 1024); + this.crypto_none.Key = rfc2898DeriveBytes.GetBytes(checked ((int) Math.Round(unchecked ((double) this.crypto_none.KeySize / 8.0)))); + this.crypto_none.IV = rfc2898DeriveBytes.GetBytes(checked ((int) Math.Round(unchecked ((double) this.crypto_none.BlockSize / 8.0)))); + this.crypto_zero.Key = this.crypto_none.Key; + this.crypto_zero.IV = this.crypto_none.IV; + this.basefs.LogMessage += new EventHandler(this.InnerOnLogMessage); + } + + private void InnerOnLogMessage(object sender, LogMessageEventArgs e) + { + this.OnLogMessage(e.Message); + } + + public override SecureType LastSecureType + { + get + { + return this.basefs.LastSecureType; + } + } + + public override string ClientName + { + get + { + return this.basefs.ClientName; + } + set + { + this.basefs.ClientName = value; + } + } + + public override string GroupName + { + get + { + return this.basefs.GroupName; + } + set + { + this.basefs.GroupName = value; + } + } + + public override string UserName + { + get + { + return this.basefs.UserName; + } + } + + public override string Password + { + get + { + return this.basefs.Password; + } + } + + public override FsAbility Ability + { + get + { + return this.basefs.Ability & ~(FsAbility.PartialRead | FsAbility.PartialWrite); + } + } + + public override void ResetConnection() + { + this.basefs.ResetConnection(); + base.ResetConnection(); + } + + public override ResourceInfo GetInfo(Uri targeturi) + { + string[] segments1 = this.BaseUri.Segments; + string[] segments2 = targeturi.Segments; + List resourceInfoList = new List(); + Uri uri1 = new Uri(this.BaseUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped) + "/"); + Uri uri2 = uri1; + bool encrypted = false; + int index1 = 1; + while (index1 < segments1.Length && index1 < segments2.Length && UriUtil.IsSameSegmentString(segments1[index1], segments2[index1])) + { + uri2 = UriUtil.CombineSegment(uri2, segments2[index1]); + uri1 = UriUtil.CombineSegment(uri1, segments2[index1]); + encrypted = false; + checked { ++index1; } + } + int index2 = index1; + while (index1 < segments2.Length) + { + string name = Uri.UnescapeDataString(segments2[index1]).Replace("/", ""); + uri2 = UriUtil.CombineName(uri2, this.EncryptName(name)); + encrypted = true; + checked { ++index1; } + } + try + { + ResourceInfo info = this.basefs.GetInfo(uri2); + this.CreateInfo2(targeturi, info, encrypted); + return info; + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + throw; + } + if (this.HideUnencryptedDirectory) + throw new RemoteResourceNotFoundException(targeturi); + ResourceInfo[] infoAndEntries = this.basefs.GetInfoAndEntries(uri1); + this.CreateInfo2(uri1, infoAndEntries[0], false); + int num1 = 1; + int num2 = checked (infoAndEntries.Length - 1); + int index3 = num1; + while (index3 <= num2) + { + if (this.CreateInfo(infoAndEntries[0].Id.Uri, infoAndEntries[index3])) + resourceInfoList.Add(infoAndEntries[index3]); + checked { ++index3; } + } +label_16: + string Right = Uri.UnescapeDataString(segments2[index2]); + int num3 = 0; + int num4 = checked (resourceInfoList.Count - 1); + int index4 = num3; + while (index4 <= num4) + { + string lastName = UriUtil.GetLastName(resourceInfoList[index4].Id.Uri); + if (Operators.CompareString(lastName, Right, false) == 0 || Operators.CompareString(lastName + "/", Right, false) == 0 || Operators.CompareString(lastName, Right + "/", false) == 0) + { + checked { ++index2; } + ResourceInfo resourceInfo = resourceInfoList[index4]; + if (index2 == segments2.Length) + return resourceInfo; + if (!resourceInfo.IsCollection) + throw new RemoteResourceNotFoundException(targeturi); + resourceInfoList.Clear(); + resourceInfoList.AddRange((IEnumerable) this.GetEntries(resourceInfo.Id)); + Uri.UnescapeDataString(segments2[index2]); + goto label_16; + } + else + checked { ++index4; } + } + throw new RemoteResourceNotFoundException(targeturi); + } + + public override ResourceInfo GetInfo(ResourceId id) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + ResourceInfo info = this.basefs.GetInfo(encryptId.BaseId); + if (this.CreateInfo(UriUtil.GetParent(encryptId.Uri), info)) + return info; + throw new RemoteResourceNotFoundException(id.Uri); + } + + public override ResourceInfo GetInfo(ResourceId parentid, string name) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) parentid; + string name1 = this.EncryptName(name); + try + { + ResourceInfo info = this.basefs.GetInfo(encryptId.BaseId, name1); + if (this.CreateInfo(encryptId.Uri, info)) + return info; + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + throw; + } + ResourceInfo info1 = this.basefs.GetInfo(encryptId.BaseId, name); + this.CreateInfo2(UriUtil.CombineName(encryptId.Uri, name), info1, false); + return info1; + } + + public override ResourceInfo GetParentInfo(ResourceId id) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + ResourceInfo parentInfo = this.basefs.GetParentInfo(encryptId.BaseId); + if (this.CreateInfo(UriUtil.GetParent(UriUtil.GetParent(encryptId.Uri)), parentInfo)) + return parentInfo; + throw new RemoteResourceNotFoundException(id.Uri); + } + + public override ResourceInfo[] GetEntries(ResourceId id) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + ResourceInfo[] entries = this.basefs.GetEntries(encryptId.BaseId); + List resourceInfoList = new List(); + int num1 = 0; + int num2 = checked (entries.Length - 1); + int index = num1; + while (index <= num2) + { + if (this.CreateInfo(encryptId.Uri, entries[index])) + resourceInfoList.Add(entries[index]); + checked { ++index; } + } + return resourceInfoList.ToArray(); + } + + public override ResourceInfo[] GetInfoAndEntries(Uri targeturi) + { + string[] segments1 = this.BaseUri.Segments; + string[] segments2 = targeturi.Segments; + List resourceInfoList = new List(); + Uri uri1 = new Uri(this.BaseUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped) + "/"); + Uri uri2 = uri1; + bool encrypted = false; + int index1 = 1; + while (index1 < segments1.Length && index1 < segments2.Length && UriUtil.IsSameSegmentString(segments1[index1], segments2[index1])) + { + uri2 = UriUtil.CombineSegment(uri2, segments2[index1]); + uri1 = UriUtil.CombineSegment(uri1, segments2[index1]); + encrypted = false; + checked { ++index1; } + } + int index2 = index1; + while (index1 < segments2.Length) + { + string name = Uri.UnescapeDataString(segments2[index1]).Replace("/", ""); + uri2 = UriUtil.CombineName(uri2, this.EncryptName(name)); + encrypted = true; + checked { ++index1; } + } + try + { + ResourceInfo[] infoAndEntries = this.basefs.GetInfoAndEntries(uri2); + this.CreateInfo2(targeturi, infoAndEntries[0], encrypted); + resourceInfoList.Add(infoAndEntries[0]); + int num1 = 1; + int num2 = checked (infoAndEntries.Length - 1); + int index3 = num1; + while (index3 <= num2) + { + if (this.CreateInfo(infoAndEntries[0].Id.Uri, infoAndEntries[index3])) + resourceInfoList.Add(infoAndEntries[index3]); + checked { ++index3; } + } + return resourceInfoList.ToArray(); + } + catch (RemoteResourceNotFoundException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + if (this.HideUnencryptedDirectory) + throw new RemoteResourceNotFoundException(targeturi); + ResourceInfo[] infoAndEntries1 = this.basefs.GetInfoAndEntries(uri1); + this.CreateInfo2(uri1, infoAndEntries1[0], false); + int num3 = 1; + int num4 = checked (infoAndEntries1.Length - 1); + int index4 = num3; + while (index4 <= num4) + { + if (this.CreateInfo(infoAndEntries1[0].Id.Uri, infoAndEntries1[index4])) + resourceInfoList.Add(infoAndEntries1[index4]); + checked { ++index4; } + } +label_20: + string Right = Uri.UnescapeDataString(segments2[index2]); + int num5 = 0; + int num6 = checked (resourceInfoList.Count - 1); + int index5 = num5; + while (index5 <= num6) + { + string lastName = UriUtil.GetLastName(resourceInfoList[index5].Id.Uri); + if (Operators.CompareString(lastName, Right, false) == 0 || Operators.CompareString(lastName + "/", Right, false) == 0 || Operators.CompareString(lastName, Right + "/", false) == 0) + { + checked { ++index2; } + ResourceInfo resourceInfo = resourceInfoList[index5]; + if (index2 != segments2.Length) + { + if (!resourceInfo.IsCollection) + throw new RemoteResourceNotFoundException(targeturi); + resourceInfoList.Clear(); + resourceInfoList.AddRange((IEnumerable) this.GetEntries(resourceInfo.Id)); + Uri.UnescapeDataString(segments2[index2]); + goto label_20; + } + else + { + if (resourceInfo.IsCollection) + { + resourceInfoList.Clear(); + resourceInfoList.Add(resourceInfo); + resourceInfoList.AddRange((IEnumerable) this.GetEntries(resourceInfo.Id)); + return resourceInfoList.ToArray(); + } + return new ResourceInfo[1]{ resourceInfo }; + } + } + else + checked { ++index5; } + } + throw new RemoteResourceNotFoundException(targeturi); + } + + public override ResourceInfo[] GetInfoAndEntries(ResourceId id) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + ResourceInfo[] infoAndEntries = this.basefs.GetInfoAndEntries(encryptId.BaseId); + if (!this.CreateInfo(UriUtil.GetParent(encryptId.Uri), infoAndEntries[0])) + throw new RemoteResourceNotFoundException(encryptId.Uri); + List resourceInfoList = new List(); + resourceInfoList.Add(infoAndEntries[0]); + int num1 = 1; + int num2 = checked (infoAndEntries.Length - 1); + int index = num1; + while (index <= num2) + { + if (this.CreateInfo(infoAndEntries[0].Id.Uri, infoAndEntries[index])) + resourceInfoList.Add(infoAndEntries[index]); + checked { ++index; } + } + return resourceInfoList.ToArray(); + } + + public override ResourceInfo[] GetParentInfoAndEntries(ResourceId childid) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) childid; + ResourceInfo[] parentInfoAndEntries = this.basefs.GetParentInfoAndEntries(encryptId.BaseId); + Uri parent = UriUtil.GetParent(encryptId.Uri); + if (!this.CreateInfo(UriUtil.GetParent(parent), parentInfoAndEntries[0])) + throw new RemoteResourceNotFoundException(parent); + List resourceInfoList = new List(); + resourceInfoList.Add(parentInfoAndEntries[0]); + int num1 = 1; + int num2 = checked (parentInfoAndEntries.Length - 1); + int index = num1; + while (index <= num2) + { + if (this.CreateInfo(parentInfoAndEntries[0].Id.Uri, parentInfoAndEntries[index])) + resourceInfoList.Add(parentInfoAndEntries[index]); + checked { ++index; } + } + return resourceInfoList.ToArray(); + } + + public override ReturnedInfo CreateCollection(ResourceId parentid, string name) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) parentid; + string name1 = this.EncryptName(name); + ReturnedInfo collection = this.basefs.CreateCollection(encryptId.BaseId, name1); + ResourceId baseid = !(collection is ResourceInfo) ? (ResourceId) collection : ((ResourceInfo) collection).Id; + return (ReturnedInfo) new EncryptFs.EncryptId(UriUtil.AddLastSlash(UriUtil.CombineName(encryptId.Uri, name)), baseid, true, this); + } + + public override void Delete(ResourceId id) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + if (!encryptId.Encrypted && (!encryptId.IsCollection || this.HideUnencryptedDirectory) && (encryptId.IsCollection || this.HideUnencryptedFile)) + throw new Exception(); + this.basefs.Delete(encryptId.BaseId); + } + + public override ReturnedInfo Move(ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + ReturnedInfo returnedInfo; + Uri target; + if (newname == null) + { + ResourceId baseId = ((EncryptFs.EncryptId) newparentid).BaseId; + returnedInfo = this.basefs.Move(encryptId.BaseId, baseId, (string) null, overwrite); + target = UriUtil.CombineName(newparentid.Uri, UriUtil.GetLastName(encryptId.Uri)); + } + else if ((object) newparentid == null) + { + string newname1 = !encryptId.Encrypted ? newname : this.EncryptName(newname); + returnedInfo = this.basefs.Move(encryptId.BaseId, (ResourceId) null, newname1, overwrite); + target = UriUtil.CombineName(UriUtil.GetParent(encryptId.Uri), newname); + } + else + { + ResourceId baseId = ((EncryptFs.EncryptId) newparentid).BaseId; + string newname1 = !encryptId.Encrypted ? newname : this.EncryptName(newname); + returnedInfo = this.basefs.Move(encryptId.BaseId, baseId, newname1, overwrite); + target = UriUtil.CombineName(newparentid.Uri, newname); + } + ResourceId baseid = !(returnedInfo is ResourceInfo) ? (ResourceId) returnedInfo : ((ResourceInfo) returnedInfo).Id; + if (encryptId.IsCollection) + target = UriUtil.AddLastSlash(target); + return (ReturnedInfo) new EncryptFs.EncryptId(target, baseid, encryptId.Encrypted, this); + } + + public override ReturnedInfo Copy(ResourceId id, ResourceId newparentid, string newname, bool overwrite) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + ReturnedInfo returnedInfo; + Uri target; + if (newname == null) + { + ResourceId baseId = ((EncryptFs.EncryptId) newparentid).BaseId; + returnedInfo = this.basefs.Copy(encryptId.BaseId, baseId, (string) null, overwrite); + target = UriUtil.CombineName(newparentid.Uri, UriUtil.GetLastName(encryptId.Uri)); + } + else if ((object) newparentid == null) + { + string newname1 = !encryptId.Encrypted ? newname : this.EncryptName(newname); + returnedInfo = this.basefs.Copy(encryptId.BaseId, (ResourceId) null, newname1, overwrite); + target = UriUtil.CombineName(UriUtil.GetParent(encryptId.Uri), newname); + } + else + { + ResourceId baseId = ((EncryptFs.EncryptId) newparentid).BaseId; + string newname1 = !encryptId.Encrypted ? newname : this.EncryptName(newname); + returnedInfo = this.basefs.Copy(encryptId.BaseId, baseId, newname1, overwrite); + target = UriUtil.CombineName(newparentid.Uri, newname); + } + ResourceId baseid = !(returnedInfo is ResourceInfo) ? (ResourceId) returnedInfo : ((ResourceInfo) returnedInfo).Id; + if (encryptId.IsCollection) + target = UriUtil.AddLastSlash(target); + return (ReturnedInfo) new EncryptFs.EncryptId(target, baseid, encryptId.Encrypted, this); + } + + public override ReturnedInfo SetResourceInfo(ResourceInfo info, ResourceInfo original) + { + EncryptFs.EncryptId id = (EncryptFs.EncryptId) info.Id; + ResourceInfo info1 = (ResourceInfo) info.Clone(); + ResourceInfo original1 = (ResourceInfo) original.Clone(); + info1.Id = ((EncryptFs.EncryptId) info.Id).BaseId; + original1.Id = info1.Id; + if (id.Encrypted || id.IsCollection && !this.HideUnencryptedDirectory || !id.IsCollection && !this.HideUnencryptedFile) + return this.basefs.SetResourceInfo(info1, original1); + throw new Exception(); + } + + public override ReturnedInfo SetTimes(ResourceId id, DateTime lastmodifiedtime, DateTime creationtime, DateTime lastaccesstime) + { + EncryptFs.EncryptId encryptId = id as EncryptFs.EncryptId; + if (encryptId.Encrypted || encryptId.IsCollection && !this.HideUnencryptedDirectory || !encryptId.IsCollection && !this.HideUnencryptedFile) + return this.basefs.SetTimes(encryptId.BaseId, lastmodifiedtime, creationtime, lastaccesstime); + throw new Exception(); + } + + public override Stream OpenRead(ResourceId id, ref long start, ref long length) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + if (start < 0L) + throw new ArgumentOutOfRangeException(nameof (start)); + if (length == 0L) + throw new ArgumentOutOfRangeException(nameof (length)); + if (encryptId.Encrypted) + { + FsBase basefs = this.basefs; + ResourceId baseId = encryptId.BaseId; + long start1 = 0; + long length1 = -1; + Stream basestream = basefs.OpenRead(baseId, ref start1, ref length1); + start = 0L; + length = -1L; + return (Stream) new EncryptFs.CarotCryptStream(this, (ResourceId) encryptId, basestream, this.crypto_none.CreateDecryptor(), length); + } + if (encryptId.IsCollection && !this.HideUnencryptedDirectory || !encryptId.IsCollection && !this.HideUnencryptedFile) + return this.basefs.OpenRead(encryptId.BaseId, ref start, ref length); + throw new Exception(); + } + + public override Stream OpenWrite(ResourceId parentid, string name, long length) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) parentid; + string name1 = this.EncryptName(name); + Stream basestream = length < 0L ? this.basefs.OpenWrite(encryptId.BaseId, name1, -1L) : this.basefs.OpenWrite(encryptId.BaseId, name1, checked (length + 144L)); + return (Stream) new EncryptFs.CarotCryptStream(this, UriUtil.CombineName(encryptId.Uri, name), basestream, this.crypto_zero.CreateEncryptor(), length); + } + + public override Stream OpenWriteOver(ResourceId id, long length) + { + EncryptFs.EncryptId encryptId = (EncryptFs.EncryptId) id; + Stream basestream = length < 0L ? this.basefs.OpenWriteOver(encryptId.BaseId, -1L) : this.basefs.OpenWriteOver(encryptId.BaseId, checked (length + 144L)); + return (Stream) new EncryptFs.CarotCryptStream(this, encryptId.Uri, basestream, this.crypto_zero.CreateEncryptor(), length); + } + + public override Stream OpenWriteResume(ResourceId id, ref long start, ref long length) + { + throw new NotSupportedException(); + } + + public override ReturnedInfo CloseWrite(Stream st) + { + st.Close(); + return ((EncryptFs.CarotCryptStream) st).ReturnedInfo; + } + + public override string GetLock(ResourceId id, string owner, int timeoutseconds, FsBase.LockScope scope) + { + return this.basefs.GetLock(((EncryptFs.EncryptId) id).BaseId, owner, timeoutseconds, scope); + } + + public override void ReleaseLock(ResourceId id, string locktoken) + { + this.basefs.ReleaseLock(id, locktoken); + } + + private string EncryptName(string name) + { + byte[] numArray; + using (ICryptoTransform encryptor = this.crypto_none.CreateEncryptor()) + { + byte[] bytes = Encoding.UTF8.GetBytes(name); + byte[] inputBuffer = new byte[16]; + if (bytes.Length <= 16) + { + numArray = new byte[16]; + Array.Copy((Array) bytes, (Array) inputBuffer, bytes.Length); + encryptor.TransformBlock(inputBuffer, 0, 16, numArray, 0); + } + else + { + numArray = new byte[checked (bytes.Length - 1 + 1)]; + int num1 = 0; + int num2 = checked (bytes.Length - 1 - 32); + int num3 = num1; + while (num3 <= num2) + { + encryptor.TransformBlock(bytes, num3, 16, numArray, num3); + checked { num3 += 16; } + } + encryptor.TransformBlock(bytes, num3, 16, numArray, num3); + Array.Copy((Array) numArray, num3, (Array) numArray, checked (num3 + 16), checked (bytes.Length - num3 + 16)); + Array.Copy((Array) bytes, checked (num3 + 16), (Array) inputBuffer, 0, checked (bytes.Length - num3 + 16)); + encryptor.TransformBlock(inputBuffer, 0, 16, numArray, num3); + } + } + return this.EscapeString + Convert.ToBase64String(numArray).Replace('/', '-').Replace('+', '_').Replace("=", ""); + } + + private bool TryDecryptName(string name, ref string decrypted) + { + if (!name.StartsWith(this.EscapeString)) + return false; + name = name.Substring(this.EscapeString.Length).Replace("-", "/").Replace('_', '+').Replace(" ", ""); + if (name.Length % 4 != 0) + name += new string('=', checked (4 - unchecked (name.Length % 4))); + byte[] inputBuffer; + bool flag; + try + { + inputBuffer = Convert.FromBase64String(name); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + flag = false; + ProjectData.ClearProjectError(); + goto label_22; + } + byte[] numArray1 = new byte[checked (inputBuffer.Length - 1 + 1)]; + using (ICryptoTransform decryptor1 = this.crypto_none.CreateDecryptor()) + { + byte[] numArray2 = new byte[16]; + byte[] outputBuffer = new byte[16]; + if (inputBuffer.Length <= 16) + { + numArray1 = new byte[16]; + Array.Copy((Array) inputBuffer, (Array) numArray2, inputBuffer.Length); + decryptor1.TransformBlock(numArray2, 0, 16, numArray1, 0); + } + else + { + int num1 = 0; + int num2 = checked (inputBuffer.Length - 1 - 32); + int num3 = num1; + while (num3 <= num2) + { + decryptor1.TransformBlock(inputBuffer, num3, 16, numArray1, num3); + checked { num3 += 16; } + } + Array.Copy((Array) inputBuffer, checked (num3 + 16), (Array) numArray2, 0, checked (inputBuffer.Length - num3 + 16)); + using (ICryptoTransform decryptor2 = this.crypto_none.CreateDecryptor(this.crypto_none.Key, numArray2)) + decryptor2.TransformBlock(inputBuffer, num3, 16, outputBuffer, 0); + Array.Copy((Array) outputBuffer, checked (inputBuffer.Length - num3 + 16), (Array) numArray2, checked (inputBuffer.Length - num3 + 16), checked (num3 + 32 - inputBuffer.Length)); + decryptor1.TransformBlock(numArray2, 0, 16, numArray1, num3); + Array.Copy((Array) outputBuffer, 0, (Array) numArray1, checked (num3 + 16), checked (inputBuffer.Length - num3 + 16)); + } + } + decrypted = Encoding.UTF8.GetString(numArray1).Replace("\0", ""); + return true; +label_22: + return flag; + } + + private bool CreateInfo(Uri parenturi, ResourceInfo ri) + { + string decrypted = (string) null; + if (this.TryDecryptName(UriUtil.GetLastName(ri.Id.Uri), ref decrypted)) + { + Uri target = UriUtil.CombineName(parenturi, decrypted); + if (ri.IsCollection) + target = UriUtil.AddLastSlash(target); + else if (ri.Size < 144L) + { + ri.Size = 0L; + ri.StatusDescription = "Invalid Encrypted File (too small)"; + ri.HasError = true; + } + else + ri.Size = checked (ri.Size - 144L); + ri.IsEncrypted = true; + ri.Id = (ResourceId) new EncryptFs.EncryptId(target, ri.Id, true, this); + return true; + } + if (!ri.IsCollection && this.HideUnencryptedFile) + return false; + if (ri.IsCollection && this.HideUnencryptedDirectory) + { + Uri uri = UriUtil.CombineName(parenturi, UriUtil.GetLastName(ri.Id.Uri)); + if (uri.Segments.Length > this.BaseUri.Segments.Length) + return false; + int num1 = 1; + int num2 = checked (uri.Segments.Length - 1); + int index = num1; + while (index <= num2) + { + if (!UriUtil.IsSameSegmentString(this.BaseUri.Segments[index], uri.Segments[index])) + return false; + checked { ++index; } + } + } + Uri target1 = UriUtil.CombineName(parenturi, UriUtil.GetLastName(ri.Id.Uri)); + if (ri.IsCollection) + target1 = UriUtil.AddLastSlash(target1); + ri.IsEncrypted = false; + ri.Id = (ResourceId) new EncryptFs.EncryptId(target1, ri.Id, false, this); + return true; + } + + protected void CreateInfo2(Uri target, ResourceInfo ri, bool encrypted) + { + if (ri.IsCollection) + { + target = UriUtil.AddLastSlash(target); + } + else + { + target = UriUtil.RemoveLastSlash(target); + if (encrypted) + { + if (ri.Size < 144L) + { + ri.Size = 0L; + ri.StatusDescription = "Invalid Encrypted File (too small)"; + ri.HasError = true; + } + else + ri.Size = checked (ri.Size - 144L); + } + } + ri.IsEncrypted = encrypted; + ri.Id = (ResourceId) new EncryptFs.EncryptId(target, ri.Id, encrypted, this); + } + + private class CarotCryptStream : Stream + { + private EncryptFs pFs; + private ReturnedInfo pReturnedInfo; + private Uri pUri; + private Stream pStream; + private ICryptoTransform pTransform; + private CryptoStreamMode pMode; + private SHA256Managed pSha; + private long pLength; + private long pPosition; + private byte[] pReadBuf; + private byte[] pDecryptBuf; + + public CarotCryptStream(EncryptFs fs, Uri uri, Stream basestream, ICryptoTransform transformer, long length) + { + this.pFs = fs; + this.pUri = uri; + this.pTransform = transformer; + this.pMode = CryptoStreamMode.Write; + this.pSha = new SHA256Managed(); + this.pLength = length; + this.pPosition = 0L; + byte[] buffer = new byte[64]; + Encoding.UTF8.GetBytes("CarotDAV Encryption 1.0 ").CopyTo((Array) buffer, 0); + basestream.Write(buffer, 0, buffer.Length); + CloseNotifyStream closeNotifyStream = new CloseNotifyStream(basestream); + closeNotifyStream.ClosingEvent += new EventHandler(this.Stream_Closing); + closeNotifyStream.ClosedEvent += new EventHandler(this.Stream_Closed); + this.pStream = (Stream) new CryptoStream((Stream) closeNotifyStream, this.pTransform, this.pMode); + } + + public CarotCryptStream(EncryptFs fs, ResourceId id, Stream basestream, ICryptoTransform transformer, long length) + { + this.pFs = fs; + this.pReturnedInfo = (ReturnedInfo) id; + this.pTransform = transformer; + this.pMode = CryptoStreamMode.Read; + this.pSha = new SHA256Managed(); + this.pLength = length; + this.pPosition = 0L; + this.pStream = basestream; + byte[] numArray = new byte[144]; + int offset = 0; + while (offset < numArray.Length) + { + int num = this.pStream.Read(numArray, offset, checked (numArray.Length - offset)); + if (num == 0) + throw new InconsistencyDetectedException(this.pUri, "Encrypted file broken"); + checked { offset += num; } + } + if (Operators.CompareString(Encoding.UTF8.GetString(numArray, 0, 24), "CarotDAV Encryption 1.0 ", false) != 0) + throw new InconsistencyDetectedException(this.pUri, "Encrypted file broken"); + this.pReadBuf = new byte[80]; + Array.Copy((Array) numArray, 64, (Array) this.pReadBuf, 0, this.pReadBuf.Length); + this.pDecryptBuf = new byte[0]; + } + + public ReturnedInfo ReturnedInfo + { + get + { + return this.pReturnedInfo; + } + } + + public override bool CanRead + { + get + { + return this.pMode == CryptoStreamMode.Read; + } + } + + public override bool CanWrite + { + get + { + return this.pMode == CryptoStreamMode.Write; + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override void Flush() + { + this.pStream.Flush(); + } + + public override long Length + { + get + { + return this.pLength; + } + } + + public override long Position + { + get + { + return this.pPosition; + } + set + { + throw new NotImplementedException(); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + if (this.pMode != CryptoStreamMode.Read) + throw new InvalidOperationException(); + if (this.pStream == null) + throw new ObjectDisposedException(this.GetType().FullName); + if (this.pLength >= 0L && checked (this.pPosition + (long) count) > this.pLength) + count = checked ((int) (this.pLength - this.pPosition)); + if (count < 0) + throw new ArgumentOutOfRangeException(nameof (count)); + if (count == 0) + return 0; + int num1 = 0; +label_11: + int num2 = count; + if (num2 > this.pDecryptBuf.Length) + num2 = this.pDecryptBuf.Length; + Array.Copy((Array) this.pDecryptBuf, 0, (Array) buffer, offset, num2); + checked { count -= num2; } + checked { offset += num2; } + checked { num1 += num2; } + this.pPosition = checked (this.pPosition + (long) num2); + byte[] numArray1 = new byte[checked (this.pDecryptBuf.Length - num2 - 1 + 1)]; + Array.Copy((Array) this.pDecryptBuf, num2, (Array) numArray1, 0, checked (this.pDecryptBuf.Length - num2)); + this.pDecryptBuf = numArray1; + if (count == 0) + return num1; + int num3 = checked (count + 15) & -16; + byte[] numArray2 = new byte[checked (num3 - 1 + 1)]; + int num4 = 0; + while (num4 < numArray2.Length) + { + int num5 = this.pStream.Read(numArray2, num4, checked (numArray2.Length - num4)); + if (num5 == 0) + { + byte[] inputBuffer = new byte[checked (this.pReadBuf.Length + num4 - 1 + 1)]; + Array.Copy((Array) this.pReadBuf, 0, (Array) inputBuffer, 0, this.pReadBuf.Length); + Array.Copy((Array) numArray2, 0, (Array) inputBuffer, this.pReadBuf.Length, num4); + byte[] numArray3 = new byte[64]; + Array.Copy((Array) inputBuffer, checked (inputBuffer.Length - numArray3.Length), (Array) numArray3, 0, numArray3.Length); + byte[] numArray4 = this.pTransform.TransformFinalBlock(inputBuffer, 0, checked (num4 + 15) & -16); + this.pDecryptBuf = new byte[checked (num4 - 1 + 1)]; + Array.Copy((Array) numArray4, 0, (Array) this.pDecryptBuf, 0, this.pDecryptBuf.Length); + this.pSha.TransformFinalBlock(this.pDecryptBuf, 0, this.pDecryptBuf.Length); + string s = ""; + int num6 = 0; + int num7 = checked (this.pSha.Hash.Length - 1); + int index1 = num6; + while (index1 <= num7) + { + s += this.pSha.Hash[index1].ToString("X2"); + checked { ++index1; } + } + byte[] bytes = Encoding.UTF8.GetBytes(s); + if (bytes.Length != numArray3.Length) + throw new IOException("File hash doesn't match."); + int num8 = 0; + int num9 = checked (bytes.Length - 1); + int index2 = num8; + while (index2 <= num9) + { + if ((int) bytes[index2] != (int) numArray3[index2]) + throw new IOException("File hash doesn't match."); + checked { ++index2; } + } + if (this.pLength < 0L) + this.pLength = checked (this.pPosition + (long) num4); + else if (this.pLength > checked (this.pPosition + (long) num4)) + throw new InvalidRangeException(); + if (count > num4) + { + count = num4; + goto label_11; + } + else + goto label_11; + } + else + checked { num4 += num5; } + } + byte[] numArray5 = new byte[checked (num3 - 1 + 1)]; + if (num3 < this.pReadBuf.Length) + { + numArray5 = new byte[checked (num3 - 1 + 1)]; + this.pTransform.TransformBlock(this.pReadBuf, 0, num3, numArray5, 0); + Array.Copy((Array) this.pReadBuf, num3, (Array) this.pReadBuf, 0, checked (this.pReadBuf.Length - num3)); + Array.Copy((Array) numArray2, 0, (Array) this.pReadBuf, checked (this.pReadBuf.Length - num3), num3); + } + else + { + this.pTransform.TransformBlock(this.pReadBuf, 0, this.pReadBuf.Length, numArray5, 0); + this.pTransform.TransformBlock(numArray2, 0, checked (numArray2.Length - this.pReadBuf.Length), numArray5, this.pReadBuf.Length); + Array.Copy((Array) numArray2, checked (numArray2.Length - this.pReadBuf.Length), (Array) this.pReadBuf, 0, this.pReadBuf.Length); + } + this.pSha.TransformBlock(numArray5, 0, numArray2.Length, (byte[]) null, 0); + Array.Copy((Array) numArray5, 0, (Array) buffer, offset, count); + this.pPosition = checked (this.pPosition + (long) count); + int num10 = checked (num1 + count); + this.pDecryptBuf = new byte[checked (num3 - count - 1 + 1)]; + Array.Copy((Array) numArray5, count, (Array) this.pDecryptBuf, 0, this.pDecryptBuf.Length); + return num10; + } + + public override void Write(byte[] buffer, int offset, int count) + { + if (this.pStream == null) + throw new ObjectDisposedException(this.GetType().FullName); + if (this.pMode != CryptoStreamMode.Write) + throw new InvalidOperationException(); + if (this.pLength >= 0L && checked (this.pPosition + (long) count) > this.pLength) + throw new InvalidRangeException(); + if (count == 0) + return; + this.pSha.TransformBlock(buffer, offset, count, (byte[]) null, 0); + this.pStream.Write(buffer, offset, count); + this.pPosition = checked (this.pPosition + (long) count); + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing) + return; + switch (this.pMode) + { + case CryptoStreamMode.Read: + if (this.pStream == null) + break; + this.pStream.Close(); + this.pStream = (Stream) null; + break; + case CryptoStreamMode.Write: + if (this.pStream == null) + break; + this.pStream.Close(); + this.pStream = (Stream) null; + break; + default: + throw new Exception(); + } + } + finally + { + base.Dispose(disposing); + } + } + + private void Stream_Closing(object sender, EventArgs e) + { + if (this.pMode != CryptoStreamMode.Write) + throw new InvalidOperationException(); + CloseNotifyStream closeNotifyStream = (CloseNotifyStream) sender; + int num1 = checked ((int) unchecked (this.pPosition % (long) this.pTransform.OutputBlockSize)); + if (num1 == 0) + num1 = 16; + byte[] buffer = new byte[checked (num1 - 1 + 1)]; + closeNotifyStream.Write(buffer, 0, buffer.Length); + this.pSha.TransformFinalBlock(new byte[0], 0, 0); + string s = ""; + int num2 = 0; + int num3 = checked (this.pSha.Hash.Length - 1); + int index = num2; + while (index <= num3) + { + s += this.pSha.Hash[index].ToString("X2"); + checked { ++index; } + } + byte[] bytes = Encoding.UTF8.GetBytes(s); + if (bytes.Length != 64) + throw new IOException(); + closeNotifyStream.Write(bytes, 0, bytes.Length); + } + + private void Stream_Closed(object sender, EventArgs e) + { + if (this.pMode != CryptoStreamMode.Write) + throw new InvalidOperationException(); + ReturnedInfo returnedInfo = this.pFs.basefs.CloseWrite(((CloseNotifyStream) sender).BaseStream); + ResourceInfo ri = returnedInfo as ResourceInfo; + if (ri != null) + { + this.pFs.CreateInfo2(this.pUri, ri, true); + this.pReturnedInfo = (ReturnedInfo) ri; + } + else + this.pReturnedInfo = (ReturnedInfo) new EncryptFs.EncryptId(this.pUri, returnedInfo as ResourceId, true, this.pFs); + if (this.pLength >= 0L && this.pPosition != this.pLength) + throw new InvalidRangeException(); + } + } + + [Serializable] + public class EncryptId : ResourceId + { + private ResourceId pBaseId; + private bool pEncrypted; + + public EncryptId(Uri target, ResourceId baseid, bool encrypted, EncryptFs fs) + : base(target, (FsBase) fs) + { + this.pBaseId = baseid; + this.pEncrypted = encrypted; + } + + public ResourceId BaseId + { + get + { + return this.pBaseId; + } + } + + public bool Encrypted + { + get + { + return this.pEncrypted; + } + } + } + } +} diff --git a/Rei.Fs/FooteredWriteStream.cs b/Rei.Fs/FooteredWriteStream.cs new file mode 100644 index 0000000..ed1a0ca --- /dev/null +++ b/Rei.Fs/FooteredWriteStream.cs @@ -0,0 +1,231 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.FooteredWriteStream +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.IO; + +namespace Rei.Fs +{ + public class FooteredWriteStream : Stream + { + private Stream pBaseStream; + private byte[] pfooter; + private bool pHasError; + private bool pDisposed; + + public FooteredWriteStream(Stream basestream, byte[] footer) + { + this.pHasError = false; + this.pDisposed = false; + this.pBaseStream = basestream; + this.pfooter = footer; + } + + public override bool CanRead + { + get + { + return this.pBaseStream.CanRead; + } + } + + public override bool CanSeek + { + get + { + return this.pBaseStream.CanSeek; + } + } + + public override bool CanWrite + { + get + { + return this.pBaseStream.CanWrite; + } + } + + public override bool CanTimeout + { + get + { + return this.pBaseStream.CanTimeout; + } + } + + public override long Length + { + get + { + return this.pBaseStream.Length; + } + } + + public override long Position + { + get + { + return this.pBaseStream.Position; + } + set + { + try + { + this.pBaseStream.Position = value; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + } + + public override int ReadTimeout + { + get + { + return this.pBaseStream.ReadTimeout; + } + set + { + this.pBaseStream.ReadTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return this.pBaseStream.WriteTimeout; + } + set + { + this.pBaseStream.WriteTimeout = value; + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + try + { + return this.pBaseStream.Read(buffer, offset, count); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + try + { + return this.pBaseStream.Seek(offset, origin); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override void SetLength(long value) + { + try + { + this.pBaseStream.SetLength(value); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override void Write(byte[] buffer, int offset, int count) + { + try + { + this.pBaseStream.Write(buffer, offset, count); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override void Flush() + { + try + { + this.pBaseStream.Flush(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.pDisposed) + return; + this.pDisposed = true; + if (this.pHasError) + { + try + { + this.pBaseStream.Close(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + else + { + try + { + this.pBaseStream.Write(this.pfooter, 0, this.pfooter.Length); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + try + { + this.pBaseStream.Close(); + } + catch (Exception ex2) + { + ProjectData.SetProjectError(ex2); + ProjectData.ClearProjectError(); + } + throw; + } + this.pBaseStream.Close(); + } + } + finally + { + base.Dispose(disposing); + } + } + } +} diff --git a/Rei.Fs/FsAbility.cs b/Rei.Fs/FsAbility.cs new file mode 100644 index 0000000..ba9ef89 --- /dev/null +++ b/Rei.Fs/FsAbility.cs @@ -0,0 +1,44 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.FsAbility +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + [Flags] + public enum FsAbility + { + None = 0, + Listing = 1, + Read = 2, + Write = 4, + Delete = 8, + CreateCollection = 16, + Copy = 32, + Move = 64, + Rename = 128, + Lock = 256, + OverWriteFile = 512, + MoveOver = 1024, + CopyOver = 2048, + LastModifiedTime = 4096, + CreationTime = 8192, + LastAccessTime = 16384, + PartialRead = 65536, + PartialWrite = 131072, + Property = 1048576, + IgnoreCase = 16777216, + IgnoreSameName = 33554432, + ForceOverwrite = 67108864, + ReadOnly = Read | Listing, + ReadWrite = ReadOnly | Write, + BaseFs = ReadWrite | CreateCollection | Delete, + AdvancedFs = BaseFs | OverWriteFile | Rename | Move | Copy, + Times = LastAccessTime | CreationTime | LastModifiedTime, + AllWithoutLock = Times | AdvancedFs | Property | PartialWrite | PartialRead | CopyOver | MoveOver, + All = AllWithoutLock | Lock, + } +} diff --git a/Rei.Fs/FsBase.cs b/Rei.Fs/FsBase.cs new file mode 100644 index 0000000..8ca8223 --- /dev/null +++ b/Rei.Fs/FsBase.cs @@ -0,0 +1,323 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.FsBase +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Reflection; +using System.Text; + +namespace Rei.Fs +{ + [Serializable] + public abstract class FsBase + { + private static SslProtocols pAvailableTlss = SslProtocols.None; + private static string p_DefClientName; + private const string boundarystring = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private string p_ClientName; + private string p_GroupName; + private ConnectionSettingBase p_ConnectionSetting; + private Uri p_BaseUri; + + static FsBase() + { + UriParserFixer.Register(); + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + FsBase.p_DefClientName = ((AssemblyProductAttribute) executingAssembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false)[0]).Product + executingAssembly.GetName().Version.ToString(3); + } + + public static string CreateBoundary(int seed) + { + Random random = new Random(seed); + StringBuilder stringBuilder = new StringBuilder(70); + stringBuilder.Length = 0; + stringBuilder.Append("----"); + while (stringBuilder.Length < 70) + stringBuilder.Append("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[random.Next("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".Length)]); + return stringBuilder.ToString(); + } + + public static long ParseContentRange(string range, ref long start, ref long length, bool throwonsmall = true) + { + long result1 = 0; + string str1 = range.Trim().ToLowerInvariant(); + string Left1 = ""; + long result2 = -1; + int length1 = str1.IndexOf(" "); + if (length1 >= 0) + { + Left1 = str1.Substring(0, length1); + if (length1 >= str1.Length) + throw new InvalidServerResponseException("Invalid Content-Range header(0)."); + str1 = str1.Substring(checked (length1 + 1)).Trim(); + } + if (Operators.CompareString(Left1, "", false) != 0 && Operators.CompareString(Left1, "bytes", false) != 0 && Operators.CompareString(Left1, "byte", false) != 0) + throw new InvalidServerResponseException("Invalid Content-Range header(1)."); + int length2 = str1.IndexOf("/"); + if (length2 < 0 || length2 >= str1.Length) + throw new InvalidServerResponseException("Invalid Content-Range header(2)."); + string Left2 = str1.Substring(0, length2).Trim(); + string str2 = str1.Substring(checked (length2 + 1)).Trim(); + long result3; + if (Operators.CompareString(str2, "*", false) == 0) + result3 = -1L; + else if (!long.TryParse(str2, out result3) || result3 < 0L) + throw new InvalidServerResponseException("Invalid Content-Range header. Invalid instance-length."); + if (Operators.CompareString(Left2, "*", false) == 0) + throw new InvalidServerResponseException("Invalid Content-Range header. \"206 Partial Content\" must specify content range."); + int length3 = Left2.IndexOf("-"); + if (length3 < 0 || length3 >= Left2.Length) + throw new InvalidServerResponseException("Invalid Content-Range header. Invalid byte-range-resp-spec."); + if (!long.TryParse(Left2.Substring(0, length3), out result1) || result1 < 0L) + throw new InvalidServerResponseException("Invalid Content-Range header. Invalid first-byte-pos."); + if (!long.TryParse(Left2.Substring(checked (length3 + 1)), out result2) || result2 < 0L) + throw new InvalidServerResponseException("Invalid Content-Range header. Invalid last-byte-pos."); + if (result2 < result1) + throw new InvalidServerResponseException("Invalid Content-Range header. Inconsistent range."); + if (result3 >= 0L && result2 > result3) + throw new InvalidServerResponseException("Invalid Content-Range header. Inconsistent range."); + if (result1 > start) + throw new InvalidServerResponseException("Invalid Content-Range header. Content-Range header unmatch to Request."); + if (length < 0L) + { + if (result3 >= 0L && result2 != checked (result3 - 1L)) + throw new InvalidServerResponseException("Invalid Content-Range header. Inconsistent range."); + } + else if (throwonsmall && checked (start + length - 1L) > result2) + throw new InvalidRangeException("not enough length"); + start = result1; + length = checked (result2 - result1 + 1L); + return result3; + } + + public static SslProtocols AvailableTlss() + { + if (FsBase.pAvailableTlss == SslProtocols.None) + { + SslProtocols sslProtocols = SslProtocols.None; + Array values = System.Enum.GetValues(typeof (System.Security.Authentication.SslProtocols)); + int num1 = 0; + int num2 = checked (values.Length - 1); + int index = num1; + while (index <= num2) + { + sslProtocols |= (SslProtocols) Conversions.ToInteger(values.GetValue(index)); + checked { ++index; } + } + FsBase.pAvailableTlss = sslProtocols & (SslProtocols.Default | SslProtocols.Tls11 | SslProtocols.Tls12); + } + return FsBase.pAvailableTlss; + } + + protected FsBase(ConnectionSettingBase connectionsetting) + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType) FsBase.AvailableTlss(); + this.p_ConnectionSetting = connectionsetting; + this.p_GroupName = ""; + this.p_ClientName = FsBase.p_DefClientName; + this.p_BaseUri = connectionsetting.TargetUri; + } + + public virtual string UserName + { + get + { + return this.p_ConnectionSetting.UserName; + } + } + + public virtual string Password + { + get + { + return this.p_ConnectionSetting.Password; + } + } + + public virtual string ClientName + { + get + { + return this.p_ClientName; + } + set + { + this.p_ClientName = value; + } + } + + public virtual string GroupName + { + get + { + return this.p_GroupName; + } + set + { + this.p_GroupName = value; + } + } + + public virtual SecureType LastSecureType + { + get + { + return SecureType.None; + } + } + + public ConnectionSettingBase ConnectionSetting + { + get + { + return this.p_ConnectionSetting; + } + } + + protected Uri BaseUri + { + get + { + return this.p_BaseUri; + } + } + + public event EventHandler LogMessage; + + public void OnLogMessage(string message) + { + EventHandler logMessageEvent = this.LogMessageEvent; + if (logMessageEvent == null) + return; + logMessageEvent((object) this, new LogMessageEventArgs(message)); + } + + public abstract FsAbility Ability { get; } + + public bool IsCaseSensitiveFs + { + get + { + return (this.Ability & FsAbility.IgnoreCase) == FsAbility.None; + } + } + + public virtual void ResetConnection() + { + } + + public abstract ResourceInfo GetInfo(Uri targeturi); + + public abstract ResourceInfo[] GetEntries(ResourceId id); + + public virtual ResourceInfo GetInfo(ResourceId id) + { + return this.GetInfo(id.Uri); + } + + public virtual ResourceInfo GetInfo(ResourceId parentid, string name) + { + ResourceInfo[] entries = this.GetEntries(parentid); + int num1 = 0; + int num2 = checked (entries.Length - 1); + int index = num1; + while (index <= num2) + { + if (Operators.CompareString(UriUtil.GetLastName(entries[index].Id.Uri), name, false) == 0) + return entries[index]; + checked { ++index; } + } + throw new RemoteResourceNotFoundException(UriUtil.CombineName(parentid.Uri, name)); + } + + public virtual ResourceInfo GetParentInfo(ResourceId id) + { + return this.GetInfo(UriUtil.GetParent(id.Uri)); + } + + public virtual ResourceInfo[] GetInfoAndEntries(Uri targeturi) + { + List resourceInfoList = new List(); + ResourceInfo info = this.GetInfo(targeturi); + resourceInfoList.Add(info); + if (info.IsCollection) + { + ResourceInfo[] entries = this.GetEntries(info.Id); + resourceInfoList.AddRange((IEnumerable) entries); + } + return resourceInfoList.ToArray(); + } + + public virtual ResourceInfo[] GetInfoAndEntries(ResourceId id) + { + List resourceInfoList = new List(); + ResourceInfo info = this.GetInfo(id); + resourceInfoList.Add(info); + if (info.IsCollection) + { + ResourceInfo[] entries = this.GetEntries(info.Id); + resourceInfoList.AddRange((IEnumerable) entries); + } + return resourceInfoList.ToArray(); + } + + public virtual ResourceInfo[] GetParentInfoAndEntries(ResourceId childid) + { + List resourceInfoList = new List(); + ResourceInfo parentInfo = this.GetParentInfo(childid); + resourceInfoList.Add(parentInfo); + if (parentInfo.IsCollection) + { + ResourceInfo[] entries = this.GetEntries(parentInfo.Id); + resourceInfoList.AddRange((IEnumerable) entries); + } + return resourceInfoList.ToArray(); + } + + public abstract ReturnedInfo CreateCollection(ResourceId parentid, string name); + + public abstract void Delete(ResourceId id); + + public abstract ReturnedInfo Move(ResourceId id, ResourceId newparentid, string newname, bool overwrite); + + public abstract ReturnedInfo Copy(ResourceId id, ResourceId newparentid, string newname, bool overwrite); + + public abstract ReturnedInfo SetTimes(ResourceId id, DateTime lastmodifiedtime, DateTime creationtime, DateTime lastaccesstime); + + public abstract ReturnedInfo SetResourceInfo(ResourceInfo info, ResourceInfo original); + + public virtual Stream OpenRead(Uri targeturi) + { + ResourceId id = this.GetInfo(targeturi).Id; + long start = 0; + long length = -1; + return this.OpenRead(id, ref start, ref length); + } + + public abstract Stream OpenRead(ResourceId id, ref long start, ref long length); + + public abstract Stream OpenWrite(ResourceId parentid, string name, long length); + + public abstract Stream OpenWriteOver(ResourceId id, long length); + + public abstract Stream OpenWriteResume(ResourceId id, ref long start, ref long length); + + public abstract ReturnedInfo CloseWrite(Stream st); + + public abstract string GetLock(ResourceId id, string owner, int timeoutseconds, FsBase.LockScope scope); + + public abstract void ReleaseLock(ResourceId id, string locktoken); + + public enum LockScope + { + Exclusive, + Shared, + } + } +} diff --git a/Rei.Fs/FsSpecificContextMenuItem.cs b/Rei.Fs/FsSpecificContextMenuItem.cs new file mode 100644 index 0000000..eb34ac0 --- /dev/null +++ b/Rei.Fs/FsSpecificContextMenuItem.cs @@ -0,0 +1,49 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.FsSpecificContextMenuItem +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System.Drawing; +using System.Runtime.CompilerServices; + +namespace Rei.Fs +{ + public class FsSpecificContextMenuItem + { + public string Title; + public Image Image; + public System.EventHandler EventHandler; + public bool UseWaitCursor; + public object Tag; + + public FsSpecificContextMenuItem(string title, bool usewaitcursor, System.EventHandler eventhandler) + : this(title, (Image) null, usewaitcursor, eventhandler, (object) null) + { + } + + public FsSpecificContextMenuItem(string title, bool usewaitcursor, System.EventHandler eventhandler, object tag) + : this(title, (Image) null, usewaitcursor, eventhandler, RuntimeHelpers.GetObjectValue(tag)) + { + } + + public FsSpecificContextMenuItem(string title, Image image, bool usewaitcursor, System.EventHandler eventhandler) + : this(title, image, usewaitcursor, eventhandler, (object) null) + { + } + + public FsSpecificContextMenuItem(string title, Image image, bool usewaitcursor, System.EventHandler eventhandler, object tag) + { + this.Title = title; + this.Image = image; + this.UseWaitCursor = usewaitcursor; + this.EventHandler = eventhandler; + this.Tag = RuntimeHelpers.GetObjectValue(tag); + } + + public void Invoke(object sender, FsBase pfs, ResourceInfo[] ris) + { + this.EventHandler(RuntimeHelpers.GetObjectValue(sender), new ResourceInfoEventArgs(pfs, ris, RuntimeHelpers.GetObjectValue(this.Tag))); + } + } +} diff --git a/Rei.Fs/HostRootedUriParser.cs b/Rei.Fs/HostRootedUriParser.cs new file mode 100644 index 0000000..e9d2119 --- /dev/null +++ b/Rei.Fs/HostRootedUriParser.cs @@ -0,0 +1,51 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.HostRootedUriParser +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Reflection; +using System.Security.Permissions; + +namespace Rei.Fs +{ + public class HostRootedUriParser : GenericUriParser + { + private static readonly GenericUriParserOptions ParserOptions = GenericUriParserOptions.DontUnescapePathDotsAndSlashes | GenericUriParserOptions.Idn | GenericUriParserOptions.IriParsing; + private const int MustHaveAuthority = 1; + private const int OptionalAuthority = 2; + + public static void Register(string scheme, int defaultport) + { + if (UriParser.IsKnownScheme(scheme)) + return; + UriParser.Register((UriParser) new HostRootedUriParser(), scheme, defaultport); + } + + public HostRootedUriParser() + : base(HostRootedUriParser.ParserOptions) + { + ReflectionPermission reflectionPermission = new ReflectionPermission(ReflectionPermissionFlag.AllFlags); + SecurityPermission securityPermission = new SecurityPermission(SecurityPermissionFlag.AllFlags); + reflectionPermission.Demand(); + securityPermission.Demand(); + FieldInfo field = typeof (UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); + int num = Conversions.ToInteger(field.GetValue((object) this)) & -3 | 1; + field.SetValue((object) this, (object) num); + } + + protected override void InitializeAndValidate(Uri uri, ref UriFormatException parsingError) + { + base.InitializeAndValidate(uri, out parsingError); + if (parsingError == null && Operators.CompareString(uri.Host, "", false) == 0) + parsingError = new UriFormatException("should contain host"); + if (parsingError == null && !uri.AbsolutePath.StartsWith("/")) + parsingError = new UriFormatException("should be absolute path"); + if (parsingError != null || uri.Port > 0) + return; + parsingError = new UriFormatException("should not contain port"); + } + } +} diff --git a/Rei.Fs/IO/FileInfo.cs b/Rei.Fs/IO/FileInfo.cs new file mode 100644 index 0000000..4764730 --- /dev/null +++ b/Rei.Fs/IO/FileInfo.cs @@ -0,0 +1,111 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.IO.FileInfo +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; +using System.IO; + +namespace Rei.Fs.IO +{ + public class FileInfo + { + private FileAttributes pFileAttributes; + private DateTime pCreationTime; + private DateTime pLastAccessTime; + private DateTime pLastWriteTime; + private ulong pFileSize; + private string pFileName; + private string pFullPath; + private string pAltFileName; + + internal FileInfo(string path, Win32Native.WIN32_FIND_DATA d) + { + this.pFileAttributes = d.dwFileAttributes; + this.pCreationTime = DateTime.FromFileTime((long) d.ftCreationTime.dwHighDateTime << 32 | (long) d.ftCreationTime.dwLowDateTime & (long) uint.MaxValue); + this.pLastAccessTime = DateTime.FromFileTime((long) d.ftLastAccessTime.dwHighDateTime << 32 | (long) d.ftLastAccessTime.dwLowDateTime & (long) uint.MaxValue); + this.pLastWriteTime = DateTime.FromFileTime((long) d.ftLastWriteTime.dwHighDateTime << 32 | (long) d.ftLastWriteTime.dwLowDateTime & (long) uint.MaxValue); + this.pFileSize = checked ((ulong) d.nFileSizeHigh << 32 + (ulong) d.nFileSizeLow); + this.pFileName = d.cFileName; + this.pAltFileName = d.cAlternateFileName; + this.pFullPath = path; + } + + internal FileInfo(string path, Win32Native.WIN32_FILE_ATTRIBUTE_DATA d) + { + this.pFileAttributes = d.dwFileAttributes; + this.pCreationTime = DateTime.FromFileTime((long) d.ftCreationTime.dwHighDateTime << 32 | (long) d.ftCreationTime.dwLowDateTime & (long) uint.MaxValue); + this.pLastAccessTime = DateTime.FromFileTime((long) d.ftLastAccessTime.dwHighDateTime << 32 | (long) d.ftLastAccessTime.dwLowDateTime & (long) uint.MaxValue); + this.pLastWriteTime = DateTime.FromFileTime((long) d.ftLastWriteTime.dwHighDateTime << 32 | (long) d.ftLastWriteTime.dwLowDateTime & (long) uint.MaxValue); + this.pFileSize = checked ((ulong) d.nFileSizeHigh << 32 + (ulong) d.nFileSizeLow); + this.pFileName = FileSystem.GetFilename(path); + this.pAltFileName = (string) null; + this.pFullPath = path; + } + + public bool IsDirectory + { + get + { + return (this.FileAttributes & FileAttributes.Directory) != (FileAttributes) 0; + } + } + + public FileAttributes FileAttributes + { + get + { + return this.pFileAttributes; + } + } + + public DateTime CreationTime + { + get + { + return this.pCreationTime; + } + } + + public DateTime LastAccessTime + { + get + { + return this.pLastAccessTime; + } + } + + public DateTime LastWriteTime + { + get + { + return this.pLastWriteTime; + } + } + + public ulong FileSize + { + get + { + return this.pFileSize; + } + } + + public string FileName + { + get + { + return this.pFileName; + } + } + + public string FullPath + { + get + { + return this.pFullPath; + } + } + } +} diff --git a/Rei.Fs/IO/FileSystem.cs b/Rei.Fs/IO/FileSystem.cs new file mode 100644 index 0000000..8e1a586 --- /dev/null +++ b/Rei.Fs/IO/FileSystem.cs @@ -0,0 +1,482 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.IO.FileSystem +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.Win32.SafeHandles; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace Rei.Fs.IO +{ + [StandardModule] + public sealed class FileSystem + { + private static DateTime win32timeorigin = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + public static string CombinePath(string path1, string path2) + { + if (path1.EndsWith("\\")) + { + if (path2.StartsWith("\\")) + return path1 + path2.Substring(1); + return path1 + path2; + } + if (path2.StartsWith("\\")) + return path1 + path2; + return path1 + "\\" + path2; + } + + public static string GetFilename(string path) + { + while (path.EndsWith("\\")) + path = path.Substring(0, checked (path.Length - 1)); + int num = path.LastIndexOf("\\"); + if (num < 0) + return path; + return path.Substring(checked (num + 1)); + } + + public static string GetDirectoryName(string path) + { + while (path.EndsWith("\\")) + path = path.Substring(0, checked (path.Length - 1)); + int length = path.LastIndexOf("\\"); + if (length < 0) + return path; + return path.Substring(0, length); + } + + public static string NormalizePath(string path) + { + if (path.StartsWith("\\\\?\\")) + return path; + string str1 = path; + if (str1.Length >= 248) + ; + string str2 = str1.Replace("/", "\\"); + if (str2.StartsWith("\\\\")) + path = "\\\\?\\UNC\\" + str2.Substring(1); + else if (path.Length > 3 && Operators.CompareString(Conversions.ToString(path[1]), ":", false) == 0 && Operators.CompareString(Conversions.ToString(path[2]), "\\", false) == 0) + path = "\\\\?\\" + str2.Replace("/", "\\"); + else if (Operators.CompareString(Conversions.ToString(path[0]), "\\", false) == 0) + path = "\\\\?\\" + str2.Replace("/", "\\"); + return path; + } + + public static System.Runtime.InteropServices.ComTypes.FILETIME ToFileTime(DateTime time) + { + byte[] bytes = BitConverter.GetBytes(DateTime.Compare(time, FileSystem.win32timeorigin) >= 0 ? time.ToFileTime() : 0L); + System.Runtime.InteropServices.ComTypes.FILETIME filetime; + filetime.dwHighDateTime = BitConverter.ToInt32(bytes, 4); + filetime.dwLowDateTime = BitConverter.ToInt32(bytes, 0); + return filetime; + } + + private static void RaiseError(string path) + { + FileSystem.RaiseError(path, Marshal.GetLastWin32Error()); + } + + private static void RaiseError(string path, int code) + { + switch (code) + { + case 2: + throw new FileNotFoundException(); + case 3: + throw new DirectoryNotFoundException(); + case 5: + throw new UnauthorizedAccessException(); + case 15: + throw new DriveNotFoundException(); + default: + throw new IOException(new Win32Exception(code).Message); + } + } + + public static FileInfo GetFileInfo(string path) + { + FileInfo info = (FileInfo) null; + if (!FileSystem.TryGetFileInfo(path, ref info)) + FileSystem.RaiseError(path); + return info; + } + + public static bool TryGetFileInfo(string path, ref FileInfo info) + { + string path1 = FileSystem.NormalizePath(path); + Win32Native.WIN32_FILE_ATTRIBUTE_DATA fileData; + if (!Win32Native.GetFileAttributesEx(FileSystem.NormalizePath(path), Win32Native.GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, ref fileData)) + { + switch (Marshal.GetLastWin32Error()) + { + case 2: + case 3: + case 50: + case 67: + return false; + default: + throw new ArgumentOutOfRangeException("TryGetFileInfo error path:" + path + " error:" + Conversions.ToString(Marshal.GetLastWin32Error())); + } + } + else + { + info = new FileInfo(path1, fileData); + return true; + } + } + + public static bool FileOrDirectoryExists(string path, ref bool isdirectory) + { + Win32Native.ErrorModeType uMode = Win32Native.SetErrorMode(Win32Native.ErrorModeType.SEM_FAILCRITICALERRORS); + Win32Native.WIN32_FILE_ATTRIBUTE_DATA fileData; + bool fileAttributesEx; + try + { + fileAttributesEx = Win32Native.GetFileAttributesEx(FileSystem.NormalizePath(path), Win32Native.GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, ref fileData); + } + finally + { + int num = (int) Win32Native.SetErrorMode(uMode); + } + if (!fileAttributesEx) + { + int lastWin32Error = Marshal.GetLastWin32Error(); + switch (lastWin32Error) + { + case 2: + case 3: + break; + default: + throw new ArgumentOutOfRangeException(path + " " + lastWin32Error.ToString()); + } + } + else + isdirectory = (fileData.dwFileAttributes & FileAttributes.Directory) != (FileAttributes) 0; + return fileAttributesEx; + } + + public static bool FileExists(string path) + { + Win32Native.ErrorModeType uMode = Win32Native.SetErrorMode(Win32Native.ErrorModeType.SEM_FAILCRITICALERRORS); + Win32Native.WIN32_FILE_ATTRIBUTE_DATA fileData; + bool fileAttributesEx; + try + { + fileAttributesEx = Win32Native.GetFileAttributesEx(FileSystem.NormalizePath(path), Win32Native.GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, ref fileData); + } + finally + { + int num = (int) Win32Native.SetErrorMode(uMode); + } + if (!fileAttributesEx) + { + switch (Marshal.GetLastWin32Error()) + { + case 2: + case 3: + break; + default: + throw new ArgumentOutOfRangeException(path); + } + } + return fileAttributesEx && (fileData.dwFileAttributes & FileAttributes.Directory) == (FileAttributes) 0; + } + + public static bool DirectoryExists(string path) + { + Win32Native.ErrorModeType uMode = Win32Native.SetErrorMode(Win32Native.ErrorModeType.SEM_FAILCRITICALERRORS); + Win32Native.WIN32_FILE_ATTRIBUTE_DATA fileData; + bool fileAttributesEx; + try + { + fileAttributesEx = Win32Native.GetFileAttributesEx(FileSystem.NormalizePath(path), Win32Native.GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, ref fileData); + } + finally + { + int num = (int) Win32Native.SetErrorMode(uMode); + } + if (!fileAttributesEx) + { + switch (Marshal.GetLastWin32Error()) + { + case 2: + case 3: + break; + default: + throw new ArgumentOutOfRangeException(path); + } + } + return fileAttributesEx && (fileData.dwFileAttributes & FileAttributes.Directory) != (FileAttributes) 0; + } + + public static string[] GetNetworkShare(string host) + { + List stringList = new List(); + int entriesread = 0; + int totalentries = 0; + int resume_handle = 0; + int num1 = Marshal.SizeOf(typeof (Win32Native.SHARE_INFO_0)); + IntPtr zero = IntPtr.Zero; + int hresult = Win32Native.NetShareEnum(new StringBuilder(host), 0, ref zero, uint.MaxValue, ref entriesread, ref totalentries, ref resume_handle); + if (hresult != 0) + throw new IOException("unknown error", hresult); + try + { + IntPtr ptr = zero; + int num2 = 0; + int num3 = checked (entriesread - 1); + int num4 = num2; + while (num4 <= num3) + { + object structure = Marshal.PtrToStructure(ptr, typeof (Win32Native.SHARE_INFO_0)); + Win32Native.SHARE_INFO_0 shareInfo0_1; + Win32Native.SHARE_INFO_0 shareInfo0_2 = structure != null ? (Win32Native.SHARE_INFO_0) structure : shareInfo0_1; + stringList.Add(shareInfo0_2.shi0_netname); + ptr = new IntPtr(checked (ptr.ToInt32() + num1)); + checked { ++num4; } + } + } + finally + { + Win32Native.NetApiBufferFree(zero); + } + return stringList.ToArray(); + } + + public static SafeFileHandle CreateFile(string path, FileAccess access, FileShare share, FileMode mode) + { + return FileSystem.CreateFile(path, access, share, mode, 128U); + } + + public static SafeFileHandle CreateFile(string path, FileAccess access, FileShare share, FileMode mode, uint dwFlagsAndAttributes) + { + SafeFileHandle file; + if (mode == FileMode.Append) + { + file = Win32Native.CreateFile(FileSystem.NormalizePath(path), checked ((uint) access), checked ((uint) share), IntPtr.Zero, 4U, dwFlagsAndAttributes | 268435456U, IntPtr.Zero); + if (!file.IsInvalid) + { + int num = (int) Win32Native.SetFilePointer(file, 0, IntPtr.Zero, Win32Native.MoveMethodType.FILE_END); + } + } + else + { + uint dwDesiredAccess; + if (access == FileAccess.Read) + dwDesiredAccess = 2147483648U; + else if (access == FileAccess.Write) + dwDesiredAccess = 1073741824U; + else if (access == FileAccess.ReadWrite) + dwDesiredAccess = 268435456U; + file = Win32Native.CreateFile(FileSystem.NormalizePath(path), dwDesiredAccess, checked ((uint) share), IntPtr.Zero, checked ((uint) mode), dwFlagsAndAttributes, IntPtr.Zero); + } + if (file.IsInvalid) + FileSystem.RaiseError(path); + return file; + } + + public static Stream OpenRead(string path) + { + return (Stream) new FileStream(FileSystem.CreateFile(path, FileAccess.Read, FileShare.Read, FileMode.Open), FileAccess.Read); + } + + public static void SetFileTime(string path, DateTime creationtime, DateTime accesstime, DateTime writetime) + { + if (DateTime.Compare(creationtime, DateTime.MinValue) == 0 && DateTime.Compare(accesstime, DateTime.MinValue) == 0 && DateTime.Compare(writetime, DateTime.MinValue) == 0) + return; + while (path.EndsWith("\\")) + path = path.Substring(0, checked (path.Length - 1)); + using (SafeFileHandle file = Win32Native.CreateFile(FileSystem.NormalizePath(path), 256U, 0U, IntPtr.Zero, 3U, 33554432U, IntPtr.Zero)) + { + if (file.IsInvalid) + FileSystem.RaiseError(path); + System.Runtime.InteropServices.ComTypes.FILETIME lpCreationTime = new System.Runtime.InteropServices.ComTypes.FILETIME(); + System.Runtime.InteropServices.ComTypes.FILETIME lpLastAccessTime = new System.Runtime.InteropServices.ComTypes.FILETIME(); + System.Runtime.InteropServices.ComTypes.FILETIME lpLastWriteTime = new System.Runtime.InteropServices.ComTypes.FILETIME(); + if (DateTime.Compare(creationtime, DateTime.MinValue) > 0) + lpCreationTime = FileSystem.ToFileTime(creationtime); + if (DateTime.Compare(accesstime, DateTime.MinValue) > 0) + lpLastAccessTime = FileSystem.ToFileTime(accesstime); + if (DateTime.Compare(writetime, DateTime.MinValue) > 0) + lpLastWriteTime = FileSystem.ToFileTime(writetime); + if (Win32Native.SetFileTime(file, ref lpCreationTime, ref lpLastAccessTime, ref lpLastWriteTime)) + return; + FileSystem.RaiseError(path); + } + } + + public static FileInfo[] ListDirectoryEntries(string directorypath) + { + if (string.IsNullOrEmpty(directorypath)) + throw new ArgumentNullException(); + directorypath = directorypath.EndsWith("\\") || directorypath.EndsWith("/") ? FileSystem.CombinePath(directorypath, "*") : FileSystem.CombinePath(directorypath, "\\*"); + return FileSystem.FindFiles(directorypath); + } + + public static FileInfo[] FindFiles(string path) + { + List fileInfoList = new List(); + Win32Native.WIN32_FIND_DATA lpFindFileData = new Win32Native.WIN32_FIND_DATA(); + int length = path.LastIndexOf("\\"); + int num = path.LastIndexOf("/"); + if (num > length) + length = num; + string path1 = length >= 0 ? path.Substring(0, length) : Environment.CurrentDirectory; + using (SafeFindHandle firstFile = Win32Native.FindFirstFile(FileSystem.NormalizePath(path), out lpFindFileData)) + { + if (firstFile.IsInvalid) + FileSystem.RaiseError(path); + do + { + if (Operators.CompareString(lpFindFileData.cFileName, ".", false) != 0 && Operators.CompareString(lpFindFileData.cFileName, "..", false) != 0) + fileInfoList.Add(new FileInfo(FileSystem.CombinePath(path1, lpFindFileData.cFileName), lpFindFileData)); + } + while (Win32Native.FindNextFile(firstFile, out lpFindFileData)); + int lastWin32Error = Marshal.GetLastWin32Error(); + if (lastWin32Error != 18) + FileSystem.RaiseError(path, lastWin32Error); + } + return fileInfoList.ToArray(); + } + + public static void CreateDirectory(string path) + { + if (Win32Native.CreateDirectory(FileSystem.NormalizePath(path), IntPtr.Zero)) + return; + FileSystem.RaiseError(path); + } + + public static void DeleteFile(string path, bool recursive) + { + string str1 = FileSystem.NormalizePath(path); + bool isdirectory; + if (!FileSystem.FileOrDirectoryExists(str1, ref isdirectory)) + throw new FileNotFoundException(); + if (!isdirectory) + { + if (Win32Native.DeleteFile(str1)) + return; + FileSystem.RaiseError(str1); + } + else if (!recursive) + { + if (Win32Native.RemoveDirectory(str1)) + return; + FileSystem.RaiseError(str1); + } + else + { + List stringList = new List(); + stringList.Add(str1); + while (stringList.Count > 0) + { + string str2 = stringList[checked (stringList.Count - 1)]; + FileInfo[] fileInfoArray = FileSystem.ListDirectoryEntries(str2); + if (fileInfoArray.Length == 0) + { + if (!Win32Native.RemoveDirectory(str2)) + FileSystem.RaiseError(str2); + stringList.RemoveAt(checked (stringList.Count - 1)); + } + else + { + int num1 = 0; + int num2 = checked (fileInfoArray.Length - 1); + int index = num1; + while (index <= num2) + { + if (fileInfoArray[index].IsDirectory) + stringList.Add(FileSystem.NormalizePath(FileSystem.CombinePath(str2, fileInfoArray[index].FileName))); + else if (!Win32Native.DeleteFile(FileSystem.NormalizePath(FileSystem.CombinePath(str2, fileInfoArray[index].FileName)))) + FileSystem.RaiseError(str2); + checked { ++index; } + } + } + } + } + } + + public static void MoveFile(string path1, string path2, bool overwrite) + { + if (!overwrite ? Win32Native.MoveFileEx(FileSystem.NormalizePath(path1), FileSystem.NormalizePath(path2), Win32Native.MoveFileFlagType.MOVEFILE_COPY_ALLOWED) : Win32Native.MoveFileEx(FileSystem.NormalizePath(path1), FileSystem.NormalizePath(path2), Win32Native.MoveFileFlagType.MOVEFILE_REPLACE_EXISTING | Win32Native.MoveFileFlagType.MOVEFILE_COPY_ALLOWED)) + return; + int lastWin32Error = Marshal.GetLastWin32Error(); + FileSystem.RaiseError(path1, lastWin32Error); + } + + public static void CopyFile(string path1, string path2, bool overwrite) + { + string str1 = FileSystem.NormalizePath(path1); + string str2 = FileSystem.NormalizePath(path2); + bool isdirectory1; + if (!FileSystem.FileOrDirectoryExists(str1, ref isdirectory1)) + throw new FileNotFoundException(); + bool isdirectory2; + if (!overwrite && FileSystem.FileOrDirectoryExists(str2, ref isdirectory2)) + FileSystem.RaiseError(str2, 183); + if (!isdirectory1) + { + if (Win32Native.CopyFile(str1, str2, !overwrite)) + return; + FileSystem.RaiseError(str1); + } + else + { + List strArrayList = new List(); + strArrayList.Add(new string[3]{ str1, str2, "d" }); + int index1 = 0; + while (index1 < strArrayList.Count) + { + string[] strArray = strArrayList[index1]; + if (Operators.CompareString(strArray[2], "d", false) == 0) + { + FileInfo[] fileInfoArray = FileSystem.ListDirectoryEntries(strArray[0]); + int num1 = 0; + int num2 = checked (fileInfoArray.Length - 1); + int index2 = num1; + while (index2 <= num2) + { + if (fileInfoArray[index2].IsDirectory) + strArrayList.Add(new string[3] + { + FileSystem.NormalizePath(FileSystem.CombinePath(strArray[0], fileInfoArray[index2].FileName)), + FileSystem.NormalizePath(FileSystem.CombinePath(strArray[1], fileInfoArray[index2].FileName)), + "d" + }); + else + strArrayList.Add(new string[3] + { + FileSystem.NormalizePath(FileSystem.CombinePath(strArray[0], fileInfoArray[index2].FileName)), + FileSystem.NormalizePath(FileSystem.CombinePath(strArray[1], fileInfoArray[index2].FileName)), + "f" + }); + checked { ++index2; } + } + } + checked { ++index1; } + } + int index3 = 0; + while (index3 < strArrayList.Count) + { + string[] strArray = strArrayList[index3]; + if (Operators.CompareString(strArray[2], "d", false) == 0) + { + if (!Win32Native.CreateDirectory(strArray[1], IntPtr.Zero)) + FileSystem.RaiseError(strArray[1]); + } + else if (!Win32Native.CopyFile(strArray[0], strArray[1], !overwrite)) + FileSystem.RaiseError(strArray[0]); + checked { ++index3; } + } + } + } + } +} diff --git a/Rei.Fs/IO/SafeFindHandle.cs b/Rei.Fs/IO/SafeFindHandle.cs new file mode 100644 index 0000000..9b898ba --- /dev/null +++ b/Rei.Fs/IO/SafeFindHandle.cs @@ -0,0 +1,23 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.IO.SafeFindHandle +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.Win32.SafeHandles; + +namespace Rei.Fs.IO +{ + public class SafeFindHandle : SafeHandleMinusOneIsInvalid + { + private SafeFindHandle() + : base(true) + { + } + + protected override bool ReleaseHandle() + { + return Win32Native.FindClose(this.handle); + } + } +} diff --git a/Rei.Fs/IO/Win32Native.cs b/Rei.Fs/IO/Win32Native.cs new file mode 100644 index 0000000..bbcedbc --- /dev/null +++ b/Rei.Fs/IO/Win32Native.cs @@ -0,0 +1,182 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.IO.Win32Native +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.Win32.SafeHandles; +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace Rei.Fs.IO +{ + [StandardModule] + public sealed class Win32Native + { + public const int MAX_PATH = 260; + public const string LongFilePrefix = "\\\\?\\"; + public const string LongFileUncPrefix = "\\\\?\\UNC\\"; + public const uint MAX_PREFERRED_LENGTH = 4294967295; + + [DllImport("kernel32.dll")] + public static extern Win32Native.ErrorModeType SetErrorMode(Win32Native.ErrorModeType uMode); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool GetFileAttributesEx(string lpFileName, Win32Native.GET_FILEEX_INFO_LEVELS fInfoLevelId, ref Win32Native.WIN32_FILE_ATTRIBUTE_DATA fileData); + + [DllImport("Netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern int NetShareEnum(StringBuilder ServerName, int level, ref IntPtr bufPtr, uint prefmaxlen, ref int entriesread, ref int totalentries, ref int resume_handle); + + [DllImport("Netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern int NetApiBufferFree(IntPtr buf); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern uint SetFilePointer(SafeFileHandle hFile, int lDistanceToMove, IntPtr lpDistanceToMoveHigh, Win32Native.MoveMethodType dwMoveMethod); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool SetFileTime(SafeFileHandle hFile, [In] ref System.Runtime.InteropServices.ComTypes.FILETIME lpCreationTime, [In] ref System.Runtime.InteropServices.ComTypes.FILETIME lpLastAccessTime, [In] ref System.Runtime.InteropServices.ComTypes.FILETIME lpLastWriteTime); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern SafeFindHandle FindFirstFile(string lpFileName, out Win32Native.WIN32_FIND_DATA lpFindFileData); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool FindNextFile(SafeFindHandle hFindFile, out Win32Native.WIN32_FIND_DATA lpFindFileData); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool FindClose(IntPtr hFindFile); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool CreateDirectory(string lpPathName, IntPtr lpSecurityAttributes); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool DeleteFile(string lpFileName); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool RemoveDirectory(string lpPathName); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, Win32Native.MoveFileFlagType dwFlags); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists); + + public struct WIN32_FILE_ATTRIBUTE_DATA + { + public FileAttributes dwFileAttributes; + public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime; + public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime; + public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct WIN32_FIND_DATA + { + public FileAttributes dwFileAttributes; + public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime; + public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime; + public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + public uint dwReserved0; + public uint dwReserved1; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string cFileName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + public string cAlternateFileName; + } + + public enum GET_FILEEX_INFO_LEVELS + { + GetFileExInfoStandard, + GetFileExMaxInfoLevel, + } + + [Flags] + public enum ErrorModeType : uint + { + System_DefalutDEFAULT = 0, + SEM_FAILCRITICALERRORS = 1, + SEM_NOALIGNMENTFAULTEXCEPT = 4, + SEM_NOGPFAULTERRORBOX = 2, + SEM_NOOPENFILEERRORBOX = 32768, + } + + public enum CreateDispositionType : uint + { + CREATE_NEW = 1, + CREATE_ALWAYS = 2, + OPEN_EXISTING = 3, + OPEN_ALWAYS = 4, + TRUNCATE_EXISTING = 5, + } + + [Flags] + public enum FileAttributeType : uint + { + FILE_ATTRIBUTE_READONLY = 1, + FILE_ATTRIBUTE_HIDDEN = 2, + FILE_ATTRIBUTE_SYSTEM = 4, + FILE_ATTRIBUTE_DIRECTORY = 16, + FILE_ATTRIBUTE_ARCHIVE = 32, + FILE_ATTRIBUTE_DEVICE = 64, + FILE_ATTRIBUTE_NORMAL = 128, + FILE_ATTRIBUTE_TEMPORARY = 256, + FILE_ATTRIBUTE_SPARSE_FILE = 512, + FILE_ATTRIBUTE_REPARSE_POINT = 1024, + FILE_ATTRIBUTE_COMPRESSED = 2048, + FILE_ATTRIBUTE_OFFLINE = 4096, + FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192, + FILE_ATTRIBUTE_ENCRYPTED = 16384, + FILE_ATTRIBUTE_VIRTUAL = 65536, + } + + public enum MoveMethodType : uint + { + FILE_BEGIN, + FILE_CURRENT, + FILE_END, + } + + [Flags] + public enum GenericAccessType : uint + { + GENERIC_READ = 2147483648, + GENERIC_WRITE = 1073741824, + GENERIC_EXECUTE = 536870912, + GENERIC_ALL = 268435456, + } + + [Flags] + public enum FileShareType : uint + { + FILE_SHARE_READ = 1, + FILE_SHARE_WRITE = 2, + FILE_SHARE_DELETE = 4, + } + + [Flags] + public enum MoveFileFlagType : uint + { + MOVEFILE_REPLACE_EXISTING = 1, + MOVEFILE_COPY_ALLOWED = 2, + MOVEFILE_DELAY_UNTIL_REBOOT = 4, + MOVEFILE_WRITE_THROUGH = 8, + MOVEFILE_CREATE_HARDLINK = 16, + MOVEFILE_FAIL_IF_NOT_TRACKABLE = 32, + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct SHARE_INFO_0 + { + public string shi0_netname; + } + } +} diff --git a/Rei.Fs/InconsistencyDetectedException.cs b/Rei.Fs/InconsistencyDetectedException.cs new file mode 100644 index 0000000..f842f2e --- /dev/null +++ b/Rei.Fs/InconsistencyDetectedException.cs @@ -0,0 +1,41 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.InconsistencyDetectedException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class InconsistencyDetectedException : Exception + { + private Uri _target; + + public InconsistencyDetectedException(Uri uri, string message) + : base(message) + { + this._target = uri; + } + + public InconsistencyDetectedException(Uri uri, Exception innerexception) + : base("Inconsistency detected. Remote resource was changed during atomic operation.", innerexception) + { + this._target = uri; + } + + public InconsistencyDetectedException(Uri uri, string message, Exception innerexception) + : base(message, innerexception) + { + this._target = uri; + } + + public Uri TargetUri + { + get + { + return this._target; + } + } + } +} diff --git a/Rei.Fs/InvalidRangeException.cs b/Rei.Fs/InvalidRangeException.cs new file mode 100644 index 0000000..52eb566 --- /dev/null +++ b/Rei.Fs/InvalidRangeException.cs @@ -0,0 +1,33 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.InvalidRangeException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class InvalidRangeException : Exception + { + public InvalidRangeException(string message, Exception innerexception) + : base(message, innerexception) + { + } + + public InvalidRangeException(Exception innerexception) + : this("Invalid Range", innerexception) + { + } + + public InvalidRangeException(string message) + : this(message, (Exception) null) + { + } + + public InvalidRangeException() + : this("Invalid Range", (Exception) null) + { + } + } +} diff --git a/Rei.Fs/InvalidServerResponseException.cs b/Rei.Fs/InvalidServerResponseException.cs new file mode 100644 index 0000000..177a6cf --- /dev/null +++ b/Rei.Fs/InvalidServerResponseException.cs @@ -0,0 +1,58 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.InvalidServerResponseException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class InvalidServerResponseException : ApplicationException + { + private string pBody; + + public InvalidServerResponseException() + : this("Invalid server response", string.Empty, (Exception) null) + { + } + + public InvalidServerResponseException(string message) + : this(message, string.Empty, (Exception) null) + { + } + + public InvalidServerResponseException(string message, Exception innerException) + : this(message, (string) null, innerException) + { + } + + public InvalidServerResponseException(string message, string body) + : this(message, body, (Exception) null) + { + } + + public InvalidServerResponseException(string message, string body, Exception innerException) + : base(message, innerException) + { + if (body == null) + body = string.Empty; + this.pBody = body; + } + + public override string ToString() + { + if (this.pBody.Length == 0) + return base.ToString(); + return base.ToString() + "\r\nHttp Message Body:" + this.Body; + } + + public string Body + { + get + { + return this.pBody; + } + } + } +} diff --git a/Rei.Fs/JsonObject.cs b/Rei.Fs/JsonObject.cs new file mode 100644 index 0000000..3de502b --- /dev/null +++ b/Rei.Fs/JsonObject.cs @@ -0,0 +1,507 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.JsonObject +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace Rei.Fs +{ + public class JsonObject + { + private const string JSONIgnoreChars = " \t\r\n\0"; + private JsonObject.JsonType pType; + private string pString; + private long pInteger; + private double pDouble; + private bool pBoolean; + private Dictionary pHash; + private List pArray; + + public static JsonObject ReadJson(string str) + { + JsonObject jsonObject = (JsonObject) null; + JsonObject.InnerReadJson(0, str, ref jsonObject); + return jsonObject; + } + + private static string GetSubStrArround(string str, int index) + { + if (string.IsNullOrEmpty(str)) + return ""; + checked { index -= 30; } + if (index < 0) + index = 0; + int length = 60; + if (str.Length < checked (index + length)) + length = checked (str.Length - index); + return str.Substring(index, length); + } + + private static int InnerReadJson(int index, string str, ref JsonObject value) + { + try + { + while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] == 123) + { + Dictionary hash = new Dictionary(); + JsonObject jsonObject = (JsonObject) null; + checked { ++index; } + while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] == 125) + { + value = new JsonObject(hash); + return checked (index + 1); + } + while (true) + { + string key = (string) null; + index = JsonObject.InnreReadJSON_String(index, str, ref key); + while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] == 58) + { + checked { ++index; } + index = JsonObject.InnerReadJson(index, str, ref jsonObject); + hash.Add(key, jsonObject); + while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] == 44) + checked { ++index; } + else + goto label_19; + } + else + break; + } + throw new Exception(); +label_19: + if ((int) str[index] != 125) + throw new Exception(); + checked { ++index; } + value = new JsonObject(hash); + return index; + } + if ((int) str[index] == 91) + { + List array = new List(); + JsonObject jsonObject = (JsonObject) null; + checked { ++index; } + while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] == 93) + { + value = new JsonObject(array); + return checked (index + 1); + } + while (true) + { + index = JsonObject.InnerReadJson(index, str, ref jsonObject); + array.Add(jsonObject); + while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] == 44) + checked { ++index; } + else + break; + } + if ((int) str[index] != 93) + throw new Exception(); + checked { ++index; } + value = new JsonObject(array); + return index; + } + if ((int) str[index] == 34) + { + string str1 = (string) null; + index = JsonObject.InnreReadJSON_String(index, str, ref str1); + value = new JsonObject(str1); + return index; + } + if (checked (str.Length - index) > 4 && Operators.CompareString(str.Substring(index, 4).ToLowerInvariant(), "true", false) == 0) + { + value = new JsonObject(true); + return checked (index + 4); + } + if (checked (str.Length - index) > 5 && Operators.CompareString(str.Substring(index, 5).ToLowerInvariant(), "false", false) == 0) + { + value = new JsonObject(false); + return checked (index + 5); + } + if (checked (str.Length - index) > 4 && Operators.CompareString(str.Substring(index, 4).ToLowerInvariant(), "null", false) == 0) + { + value = new JsonObject(); + return checked (index + 4); + } + int startIndex = index; + while ("+-0123456789".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] == 101 || (int) str[index] == 69 || (int) str[index] == 46) + { + while ("+-0123456789.eE".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + double result; + if (double.TryParse(str.Substring(startIndex, checked (index - startIndex)), NumberStyles.Any, (IFormatProvider) CultureInfo.InvariantCulture, out result)) + { + value = new JsonObject(result); + return index; + } + } + else + { + long result; + if (long.TryParse(str.Substring(startIndex, checked (index - startIndex)), out result)) + { + value = new JsonObject(result); + return index; + } + } + throw new Exception(); + } + catch (Exception ex) when ( + { + // ISSUE: unable to correctly present filter + ProjectData.SetProjectError(ex); + if (!(ex is InvalidServerResponseException)) + { + SuccessfulFiltering; + } + else + throw; + } + ) + { + throw new InvalidServerResponseException("Cannot parse server response. index:" + index.ToString() + " arround: \"" + JsonObject.GetSubStrArround(str, index) + "\""); + } + } + + private static int InnreReadJSON_String(int index, string str, ref string value) + { + try + { + while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) + checked { ++index; } + if ((int) str[index] != 34) + throw new Exception(); + checked { ++index; } + StringBuilder stringBuilder = new StringBuilder(); + while (true) + { + while ((int) str[index] != 92) + { + if ((int) str[index] != 34) + { + stringBuilder.Append(str[index]); + checked { ++index; } + } + else + { + value = stringBuilder.ToString(); + return checked (index + 1); + } + } + checked { ++index; } + if ((int) str[index] == 98) + stringBuilder.Append("\b"); + else if ((int) str[index] == 102) + stringBuilder.Append("\f"); + else if ((int) str[index] == 110) + stringBuilder.Append("\n"); + else if ((int) str[index] == 114) + stringBuilder.Append("\r"); + else if ((int) str[index] == 116) + stringBuilder.Append("\t"); + else if ((int) str[index] == 117) + { + stringBuilder.Append(Convert.ToChar(Convert.ToUInt32(str.Substring(checked (index + 1), 4), 16))); + checked { index += 4; } + } + else + stringBuilder.Append(str[index]); + checked { ++index; } + } + } + catch (Exception ex) when ( + { + // ISSUE: unable to correctly present filter + ProjectData.SetProjectError(ex); + if (!(ex is InvalidServerResponseException)) + { + SuccessfulFiltering; + } + else + throw; + } + ) + { + throw new InvalidServerResponseException("Cannot parse server response. index:" + index.ToString() + " arround: \"" + JsonObject.GetSubStrArround(str, index) + "\""); + } + } + + public static string EscapeString(string str) + { + StringBuilder stringBuilder = new StringBuilder(checked (str.Length * 2)); + stringBuilder.Append("\""); + int num1 = 0; + int num2 = checked (str.Length - 1); + int index = num1; + while (index <= num2) + { + char ch = str[index]; + if (Operators.CompareString(Conversions.ToString(ch), "\b", false) == 0) + stringBuilder.Append("\\b"); + else if (Operators.CompareString(Conversions.ToString(ch), "\f", false) == 0) + stringBuilder.Append("\\f"); + else if (Operators.CompareString(Conversions.ToString(ch), "\n", false) == 0) + stringBuilder.Append("\\n"); + else if (Operators.CompareString(Conversions.ToString(ch), "\r", false) == 0) + stringBuilder.Append("\\r"); + else if (Operators.CompareString(Conversions.ToString(ch), "\t", false) == 0) + stringBuilder.Append("\\t"); + else if (Convert.ToInt32(ch) < 32) + stringBuilder.Append("\\u" + Convert.ToInt32(ch).ToString("X4")); + else if (Operators.CompareString(Conversions.ToString(ch), "\"", false) == 0) + { + stringBuilder.Append("\\u0022"); + } + else + { + if ((int) ch == 34 || (int) ch == 92) + stringBuilder.Append("\\"); + stringBuilder.Append(ch); + } + checked { ++index; } + } + stringBuilder.Append("\""); + return stringBuilder.ToString(); + } + + public static string EscapeStringAscii(string str) + { + StringBuilder stringBuilder = new StringBuilder(checked (str.Length * 2)); + stringBuilder.Append("\""); + int num1 = 0; + int num2 = checked (str.Length - 1); + int index = num1; + while (index <= num2) + { + char ch = str[index]; + if (Operators.CompareString(Conversions.ToString(ch), "\b", false) == 0) + stringBuilder.Append("\\b"); + else if (Operators.CompareString(Conversions.ToString(ch), "\f", false) == 0) + stringBuilder.Append("\\f"); + else if (Operators.CompareString(Conversions.ToString(ch), "\n", false) == 0) + stringBuilder.Append("\\n"); + else if (Operators.CompareString(Conversions.ToString(ch), "\r", false) == 0) + stringBuilder.Append("\\r"); + else if (Operators.CompareString(Conversions.ToString(ch), "\t", false) == 0) + stringBuilder.Append("\\t"); + else if (Convert.ToInt32(ch) < 32 || Convert.ToInt32(ch) >= (int) sbyte.MaxValue) + stringBuilder.Append("\\u" + Convert.ToInt32(ch).ToString("X4")); + else if (Operators.CompareString(Conversions.ToString(ch), "\"", false) == 0) + { + stringBuilder.Append("\\u0022"); + } + else + { + if ((int) ch == 34 || (int) ch == 92) + stringBuilder.Append("\\"); + stringBuilder.Append(ch); + } + checked { ++index; } + } + stringBuilder.Append("\""); + return stringBuilder.ToString(); + } + + public JsonObject() + { + this.pType = JsonObject.JsonType.Nothing; + } + + public JsonObject(string str) + { + this.pType = JsonObject.JsonType.String; + this.pString = str; + } + + public JsonObject(long number) + { + this.pType = JsonObject.JsonType.Integer; + this.pInteger = number; + } + + public JsonObject(double number) + { + this.pType = JsonObject.JsonType.Double; + this.pDouble = number; + } + + public JsonObject(bool @bool) + { + this.pType = JsonObject.JsonType.Boolean; + this.pBoolean = @bool; + } + + public JsonObject(Dictionary hash) + { + this.pType = JsonObject.JsonType.Hash; + this.pHash = hash; + } + + public JsonObject(List array) + { + this.pType = JsonObject.JsonType.Array; + this.pArray = array; + } + + public JsonObject.JsonType Type + { + get + { + return this.pType; + } + } + + public string String + { + get + { + return this.pString; + } + } + + public long Integer + { + get + { + return this.pInteger; + } + } + + public double Double + { + get + { + return this.pDouble; + } + } + + public bool Boolean + { + get + { + return this.pBoolean; + } + } + + public Dictionary Hash + { + get + { + return this.pHash; + } + } + + public List Array + { + get + { + return this.pArray; + } + } + + public bool IsNothing + { + get + { + return this.Type == JsonObject.JsonType.Nothing; + } + } + + public JsonObject this[string name] + { + get + { + if (this.Type != JsonObject.JsonType.Hash) + return new JsonObject(); + if (!this.Hash.ContainsKey(name)) + return new JsonObject(); + return this.Hash[name]; + } + set + { + if (this.Type != JsonObject.JsonType.Hash) + throw new InvalidOperationException(); + this.Hash.Add(name, value); + } + } + + public JsonObject this[int index] + { + get + { + if (this.Type != JsonObject.JsonType.Array) + return new JsonObject(); + if (index < 0) + throw new ArgumentOutOfRangeException(); + if (index >= this.Array.Count) + return new JsonObject(); + return this.Array[index]; + } + set + { + if (this.Type != JsonObject.JsonType.Array) + throw new InvalidOperationException(); + if (index < 0) + throw new ArgumentOutOfRangeException(); + if (index > this.Array.Count) + throw new ArgumentOutOfRangeException(); + if (index == this.Array.Count) + this.Array.Add(value); + else + this.Array[index] = value; + } + } + + public DateTime GetAsDateTime() + { + if (this.Type == JsonObject.JsonType.Nothing) + return DateTime.MinValue; + return DateTime.Parse(this.String, (IFormatProvider) CultureInfo.InvariantCulture); + } + + public long IntegerWithDefault(long @default) + { + if (this.Type == JsonObject.JsonType.Integer) + return this.Integer; + return @default; + } + + public string StringWithDefault(string @default) + { + if (this.Type == JsonObject.JsonType.String) + return this.String; + return @default; + } + + public enum JsonType + { + String, + Integer, + Double, + Boolean, + Nothing, + Hash, + Array, + } + } +} diff --git a/Rei.Fs/LinkListForm.cs b/Rei.Fs/LinkListForm.cs new file mode 100644 index 0000000..90b53cf --- /dev/null +++ b/Rei.Fs/LinkListForm.cs @@ -0,0 +1,522 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.LinkListForm +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using Rei.Fs.My; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace Rei.Fs +{ + [DesignerGenerated] + public class LinkListForm : Form + { + private IContainer components; + [AccessedThroughProperty("ButtonClose")] + private Button _ButtonClose; + [AccessedThroughProperty("ListView1")] + private ListView _ListView1; + [AccessedThroughProperty("ColumnHeader1")] + private ColumnHeader _ColumnHeader1; + [AccessedThroughProperty("ColumnHeader2")] + private ColumnHeader _ColumnHeader2; + [AccessedThroughProperty("ColumnHeader3")] + private ColumnHeader _ColumnHeader3; + [AccessedThroughProperty("ButtonCopy")] + private Button _ButtonCopy; + [AccessedThroughProperty("ContextMenuStrip1")] + private ContextMenuStrip _ContextMenuStrip1; + [AccessedThroughProperty("SelectAllToolStripMenuItem")] + private ToolStripMenuItem _SelectAllToolStripMenuItem; + [AccessedThroughProperty("CopyToolStripMenuItem")] + private ToolStripMenuItem _CopyToolStripMenuItem; + [AccessedThroughProperty("CopyAllToolStripMenuItem")] + private ToolStripMenuItem _CopyAllToolStripMenuItem; + [AccessedThroughProperty("ToolStripSeparator1")] + private ToolStripSeparator _ToolStripSeparator1; + private const int MinColWidth = 32; + public string[] Data; + private bool columchangingflag; + + public LinkListForm() + { + this.Load += new EventHandler(this.SharedLinkForm_Load); + this.columchangingflag = false; + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.components = (IContainer) new System.ComponentModel.Container(); + this.ButtonClose = new Button(); + this.ListView1 = new ListView(); + this.ColumnHeader1 = new ColumnHeader(); + this.ColumnHeader2 = new ColumnHeader(); + this.ColumnHeader3 = new ColumnHeader(); + this.ContextMenuStrip1 = new ContextMenuStrip(this.components); + this.CopyToolStripMenuItem = new ToolStripMenuItem(); + this.CopyAllToolStripMenuItem = new ToolStripMenuItem(); + this.ToolStripSeparator1 = new ToolStripSeparator(); + this.SelectAllToolStripMenuItem = new ToolStripMenuItem(); + this.ButtonCopy = new Button(); + this.ContextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + this.ButtonClose.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button buttonClose1 = this.ButtonClose; + Point point1 = new Point(152, 152); + Point point2 = point1; + buttonClose1.Location = point2; + this.ButtonClose.Name = "ButtonClose"; + Button buttonClose2 = this.ButtonClose; + Size size1 = new Size(72, 24); + Size size2 = size1; + buttonClose2.Size = size2; + this.ButtonClose.TabIndex = 2; + this.ButtonClose.Text = "Close"; + this.ButtonClose.UseVisualStyleBackColor = true; + this.ListView1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.ListView1.Columns.AddRange(new ColumnHeader[3] + { + this.ColumnHeader1, + this.ColumnHeader2, + this.ColumnHeader3 + }); + this.ListView1.ContextMenuStrip = this.ContextMenuStrip1; + this.ListView1.FullRowSelect = true; + this.ListView1.GridLines = true; + this.ListView1.HideSelection = false; + ListView listView1_1 = this.ListView1; + point1 = new Point(8, 8); + Point point3 = point1; + listView1_1.Location = point3; + this.ListView1.Name = "ListView1"; + ListView listView1_2 = this.ListView1; + size1 = new Size(216, 136); + Size size3 = size1; + listView1_2.Size = size3; + this.ListView1.TabIndex = 0; + this.ListView1.UseCompatibleStateImageBehavior = false; + this.ListView1.View = View.Details; + this.ColumnHeader1.Text = "Path"; + this.ColumnHeader2.Text = "State"; + this.ColumnHeader3.Text = "SharedLink"; + this.ContextMenuStrip1.Items.AddRange(new ToolStripItem[4] + { + (ToolStripItem) this.CopyToolStripMenuItem, + (ToolStripItem) this.CopyAllToolStripMenuItem, + (ToolStripItem) this.ToolStripSeparator1, + (ToolStripItem) this.SelectAllToolStripMenuItem + }); + this.ContextMenuStrip1.Name = "ContextMenuStrip1"; + ContextMenuStrip contextMenuStrip1 = this.ContextMenuStrip1; + size1 = new Size(167, 76); + Size size4 = size1; + contextMenuStrip1.Size = size4; + this.CopyToolStripMenuItem.Name = "CopyToolStripMenuItem"; + this.CopyToolStripMenuItem.ShortcutKeys = Keys.C | Keys.Control; + ToolStripMenuItem toolStripMenuItem1 = this.CopyToolStripMenuItem; + size1 = new Size(166, 22); + Size size5 = size1; + toolStripMenuItem1.Size = size5; + this.CopyToolStripMenuItem.Text = "Copy Link"; + this.CopyAllToolStripMenuItem.Name = "CopyAllToolStripMenuItem"; + ToolStripMenuItem toolStripMenuItem2 = this.CopyAllToolStripMenuItem; + size1 = new Size(166, 22); + Size size6 = size1; + toolStripMenuItem2.Size = size6; + this.CopyAllToolStripMenuItem.Text = "Copy All"; + this.ToolStripSeparator1.Name = "ToolStripSeparator1"; + ToolStripSeparator toolStripSeparator1 = this.ToolStripSeparator1; + size1 = new Size(163, 6); + Size size7 = size1; + toolStripSeparator1.Size = size7; + this.SelectAllToolStripMenuItem.Name = "SelectAllToolStripMenuItem"; + this.SelectAllToolStripMenuItem.ShortcutKeys = Keys.A | Keys.Control; + ToolStripMenuItem toolStripMenuItem3 = this.SelectAllToolStripMenuItem; + size1 = new Size(166, 22); + Size size8 = size1; + toolStripMenuItem3.Size = size8; + this.SelectAllToolStripMenuItem.Text = "Select All"; + this.ButtonCopy.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button buttonCopy1 = this.ButtonCopy; + point1 = new Point(72, 152); + Point point4 = point1; + buttonCopy1.Location = point4; + this.ButtonCopy.Name = "ButtonCopy"; + Button buttonCopy2 = this.ButtonCopy; + size1 = new Size(72, 24); + Size size9 = size1; + buttonCopy2.Size = size9; + this.ButtonCopy.TabIndex = 1; + this.ButtonCopy.Text = "Copy"; + this.ButtonCopy.UseVisualStyleBackColor = true; + this.AcceptButton = (IButtonControl) this.ButtonClose; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + size1 = new Size(233, 185); + this.ClientSize = size1; + this.Controls.Add((Control) this.ListView1); + this.Controls.Add((Control) this.ButtonCopy); + this.Controls.Add((Control) this.ButtonClose); + size1 = new Size(249, 223); + this.MinimumSize = size1; + this.Name = "SharedLinkForm"; + this.Text = "SharedLink Form"; + this.ContextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + } + + internal virtual Button ButtonClose + { + get + { + return this._ButtonClose; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonClose_Click); + if (this._ButtonClose != null) + this._ButtonClose.Click -= eventHandler; + this._ButtonClose = value; + if (this._ButtonClose == null) + return; + this._ButtonClose.Click += eventHandler; + } + } + + internal virtual ListView ListView1 + { + get + { + return this._ListView1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler1 = new EventHandler(this.ListView1_ClientSizeChanged); + EventHandler eventHandler2 = new EventHandler(this.ListView1_SelectedIndexChanged); + ColumnWidthChangedEventHandler changedEventHandler = new ColumnWidthChangedEventHandler(this.ListView1_ColumnWidthChanged); + if (this._ListView1 != null) + { + this._ListView1.ClientSizeChanged -= eventHandler1; + this._ListView1.SelectedIndexChanged -= eventHandler2; + this._ListView1.ColumnWidthChanged -= changedEventHandler; + } + this._ListView1 = value; + if (this._ListView1 == null) + return; + this._ListView1.ClientSizeChanged += eventHandler1; + this._ListView1.SelectedIndexChanged += eventHandler2; + this._ListView1.ColumnWidthChanged += changedEventHandler; + } + } + + internal virtual ColumnHeader ColumnHeader1 + { + get + { + return this._ColumnHeader1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ColumnHeader1 = value; + } + } + + internal virtual ColumnHeader ColumnHeader2 + { + get + { + return this._ColumnHeader2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ColumnHeader2 = value; + } + } + + internal virtual ColumnHeader ColumnHeader3 + { + get + { + return this._ColumnHeader3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ColumnHeader3 = value; + } + } + + internal virtual Button ButtonCopy + { + get + { + return this._ButtonCopy; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonCopy_Click); + if (this._ButtonCopy != null) + this._ButtonCopy.Click -= eventHandler; + this._ButtonCopy = value; + if (this._ButtonCopy == null) + return; + this._ButtonCopy.Click += eventHandler; + } + } + + internal virtual ContextMenuStrip ContextMenuStrip1 + { + get + { + return this._ContextMenuStrip1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ContextMenuStrip1 = value; + } + } + + internal virtual ToolStripMenuItem SelectAllToolStripMenuItem + { + get + { + return this._SelectAllToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.SelectAllToolStripMenuItem_Click); + if (this._SelectAllToolStripMenuItem != null) + this._SelectAllToolStripMenuItem.Click -= eventHandler; + this._SelectAllToolStripMenuItem = value; + if (this._SelectAllToolStripMenuItem == null) + return; + this._SelectAllToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem CopyToolStripMenuItem + { + get + { + return this._CopyToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonCopy_Click); + if (this._CopyToolStripMenuItem != null) + this._CopyToolStripMenuItem.Click -= eventHandler; + this._CopyToolStripMenuItem = value; + if (this._CopyToolStripMenuItem == null) + return; + this._CopyToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripMenuItem CopyAllToolStripMenuItem + { + get + { + return this._CopyAllToolStripMenuItem; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.CopyAllToolStripMenuItem_Click); + if (this._CopyAllToolStripMenuItem != null) + this._CopyAllToolStripMenuItem.Click -= eventHandler; + this._CopyAllToolStripMenuItem = value; + if (this._CopyAllToolStripMenuItem == null) + return; + this._CopyAllToolStripMenuItem.Click += eventHandler; + } + } + + internal virtual ToolStripSeparator ToolStripSeparator1 + { + get + { + return this._ToolStripSeparator1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ToolStripSeparator1 = value; + } + } + + private void SharedLinkForm_Load(object sender, EventArgs e) + { + this.ListView1.BeginUpdate(); + int num1 = 0; + int num2 = checked (this.Data.Length - 1); + int index = num1; + while (index <= num2) + { + ListViewItem listViewItem = new ListViewItem(this.Data[index].Split(new string[1] + { + "\t" + }, 3, StringSplitOptions.None)); + if (Operators.CompareString(listViewItem.SubItems[1].Text, "error", false) == 0) + listViewItem.SubItems[1].ForeColor = Color.Red; + listViewItem.Selected = true; + this.ListView1.Items.Add(listViewItem); + checked { ++index; } + } + this.ListView1.EndUpdate(); + } + + private void ButtonClose_Click(object sender, EventArgs e) + { + this.Close(); + this.Dispose(); + } + + private void ButtonCopy_Click(object sender, EventArgs e) + { + List stringList = new List(); + int num1 = 0; + int num2 = checked (this.ListView1.Items.Count - 1); + int index = num1; + while (index <= num2) + { + if (this.ListView1.Items[index].Selected) + stringList.Add(this.ListView1.Items[index].SubItems[2].Text); + checked { ++index; } + } + string text = string.Join("\r\n", stringList.ToArray()); + if (string.IsNullOrEmpty(text)) + return; + MyProject.Computer.Clipboard.SetText(text, TextDataFormat.Text); + } + + private void CopyAllToolStripMenuItem_Click(object sender, EventArgs e) + { + List stringList = new List(); + int num1 = 0; + int num2 = checked (this.ListView1.Items.Count - 1); + int index = num1; + while (index <= num2) + { + if (this.ListView1.Items[index].Selected) + stringList.Add(this.Data[index]); + checked { ++index; } + } + string text = string.Join("\r\n", stringList.ToArray()); + if (string.IsNullOrEmpty(text)) + return; + MyProject.Computer.Clipboard.SetText(text, TextDataFormat.Text); + } + + private void SelectAllToolStripMenuItem_Click(object sender, EventArgs e) + { + this.ListView1.BeginUpdate(); + int num1 = 0; + int num2 = checked (this.ListView1.Items.Count - 1); + int index = num1; + while (index <= num2) + { + this.ListView1.Items[index].Selected = true; + checked { ++index; } + } + this.ListView1.EndUpdate(); + } + + private void ListView1_ClientSizeChanged(object sender, EventArgs e) + { + if (this.columchangingflag) + return; + this.columchangingflag = true; + int num1 = this.ListView1.Columns[0].Width; + if (num1 < 32) + num1 = 32; + int num2 = this.ListView1.Columns[1].Width; + if (num2 < 32) + num2 = 32; + int num3 = checked (this.ListView1.ClientSize.Width - num1 - num2); + if (num3 < 32) + { + num3 = 32; + Size clientSize = this.ListView1.ClientSize; + num2 = checked (clientSize.Width - num1 - num3); + if (num2 < 32) + { + num2 = 32; + clientSize = this.ListView1.ClientSize; + num1 = checked (clientSize.Width - num2 - num3); + if (num1 < 32) + num1 = 32; + } + } + this.ListView1.BeginUpdate(); + this.ListView1.Columns[0].Width = num1; + this.ListView1.Columns[1].Width = num2; + this.ListView1.Columns[2].Width = num3; + this.ListView1.EndUpdate(); + this.columchangingflag = false; + } + + private void ListView1_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) + { + if (this.columchangingflag) + return; + this.columchangingflag = true; + int num1 = this.ListView1.Columns[0].Width; + if (num1 < 32) + num1 = 32; + int num2 = this.ListView1.Columns[1].Width; + if (num2 < 32) + num2 = 32; + int num3 = checked (this.ListView1.ClientSize.Width - num1 - num2); + if (num3 < 32) + { + num3 = 32; + Size clientSize = this.ListView1.ClientSize; + num2 = checked (clientSize.Width - num1 - num3); + if (num2 < 32) + { + num2 = 32; + clientSize = this.ListView1.ClientSize; + num1 = checked (clientSize.Width - num2 - num3); + if (num1 < 32) + num1 = 32; + } + } + this.ListView1.BeginUpdate(); + this.ListView1.Columns[0].Width = num1; + this.ListView1.Columns[1].Width = num2; + this.ListView1.Columns[2].Width = num3; + this.ListView1.EndUpdate(); + this.columchangingflag = false; + } + + private void ListView1_SelectedIndexChanged(object sender, EventArgs e) + { + if (this.ListView1.SelectedItems.Count == 0) + this.ButtonCopy.Enabled = false; + else + this.ButtonCopy.Enabled = true; + } + } +} diff --git a/Rei.Fs/LinkListForm.resx b/Rei.Fs/LinkListForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/Rei.Fs/LinkListForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rei.Fs/LogMessageEventArgs.cs b/Rei.Fs/LogMessageEventArgs.cs new file mode 100644 index 0000000..edd9b41 --- /dev/null +++ b/Rei.Fs/LogMessageEventArgs.cs @@ -0,0 +1,33 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.LogMessageEventArgs +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class LogMessageEventArgs : EventArgs + { + private string pMessage; + + public LogMessageEventArgs(string message) + { + this.pMessage = message; + } + + public LogMessageEventArgs(string[] messages) + { + this.pMessage = string.Join(" ", messages); + } + + public string Message + { + get + { + return this.pMessage; + } + } + } +} diff --git a/Rei.Fs/My/MyApplication.cs b/Rei.Fs/My/MyApplication.cs new file mode 100644 index 0000000..c23ba97 --- /dev/null +++ b/Rei.Fs/My/MyApplication.cs @@ -0,0 +1,18 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.My.MyApplication +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.ApplicationServices; +using System.CodeDom.Compiler; +using System.ComponentModel; + +namespace Rei.Fs.My +{ + [EditorBrowsable(EditorBrowsableState.Never)] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal class MyApplication : ApplicationBase + { + } +} diff --git a/Rei.Fs/My/MyComputer.cs b/Rei.Fs/My/MyComputer.cs new file mode 100644 index 0000000..62ad8d5 --- /dev/null +++ b/Rei.Fs/My/MyComputer.cs @@ -0,0 +1,24 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.My.MyComputer +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.Devices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; + +namespace Rei.Fs.My +{ + [GeneratedCode("MyTemplate", "8.0.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + internal class MyComputer : Computer + { + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public MyComputer() + { + } + } +} diff --git a/Rei.Fs/My/MyProject.cs b/Rei.Fs/My/MyProject.cs new file mode 100644 index 0000000..2b09206 --- /dev/null +++ b/Rei.Fs/My/MyProject.cs @@ -0,0 +1,148 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.My.MyProject +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.ApplicationServices; +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.VisualBasic.MyServices.Internal; +using System; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Rei.Fs.My +{ + [HideModuleName] + [StandardModule] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal sealed class MyProject + { + private static readonly MyProject.ThreadSafeObjectProvider m_ComputerObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_AppObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_UserObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_MyWebServicesObjectProvider = new MyProject.ThreadSafeObjectProvider(); + + [HelpKeyword("My.Computer")] + internal static MyComputer Computer + { + [DebuggerHidden] get + { + return MyProject.m_ComputerObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.Application")] + internal static MyApplication Application + { + [DebuggerHidden] get + { + return MyProject.m_AppObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.User")] + internal static User User + { + [DebuggerHidden] get + { + return MyProject.m_UserObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.WebServices")] + internal static MyProject.MyWebServices WebServices + { + [DebuggerHidden] get + { + return MyProject.m_MyWebServicesObjectProvider.GetInstance; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [MyGroupCollection("System.Web.Services.Protocols.SoapHttpClientProtocol", "Create__Instance__", "Dispose__Instance__", "")] + internal sealed class MyWebServices + { + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object o) + { + return base.Equals(RuntimeHelpers.GetObjectValue(o)); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + return base.GetHashCode(); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + internal new Type GetType() + { + return typeof (MyProject.MyWebServices); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public override string ToString() + { + return base.ToString(); + } + + [DebuggerHidden] + private static T Create__Instance__(T instance) where T : new() + { + if ((object) instance == null) + return Activator.CreateInstance(); + return instance; + } + + [DebuggerHidden] + private void Dispose__Instance__(ref T instance) + { + instance = default (T); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public MyWebServices() + { + } + } + + [ComVisible(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + internal sealed class ThreadSafeObjectProvider where T : new() + { + private readonly ContextValue m_Context; + + internal T GetInstance + { + [DebuggerHidden] get + { + T instance = this.m_Context.Value; + if ((object) instance == null) + { + instance = Activator.CreateInstance(); + this.m_Context.Value = instance; + } + return instance; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public ThreadSafeObjectProvider() + { + this.m_Context = new ContextValue(); + } + } + } +} diff --git a/Rei.Fs/My/MySettings.cs b/Rei.Fs/My/MySettings.cs new file mode 100644 index 0000000..e9cd76d --- /dev/null +++ b/Rei.Fs/My/MySettings.cs @@ -0,0 +1,29 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.My.MySettings +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Configuration; +using System.Runtime.CompilerServices; + +namespace Rei.Fs.My +{ + [CompilerGenerated] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal sealed class MySettings : ApplicationSettingsBase + { + private static MySettings defaultInstance = (MySettings) SettingsBase.Synchronized((SettingsBase) new MySettings()); + + public static MySettings Default + { + get + { + return MySettings.defaultInstance; + } + } + } +} diff --git a/Rei.Fs/My/MySettingsProperty.cs b/Rei.Fs/My/MySettingsProperty.cs new file mode 100644 index 0000000..d678ddf --- /dev/null +++ b/Rei.Fs/My/MySettingsProperty.cs @@ -0,0 +1,30 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.My.MySettingsProperty +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace Rei.Fs.My +{ + [StandardModule] + [CompilerGenerated] + [HideModuleName] + [DebuggerNonUserCode] + internal sealed class MySettingsProperty + { + [HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} diff --git a/Rei.Fs/My/Resources/Resources.cs b/Rei.Fs/My/Resources/Resources.cs new file mode 100644 index 0000000..0cbcf0b --- /dev/null +++ b/Rei.Fs/My/Resources/Resources.cs @@ -0,0 +1,69 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.My.Resources.Resources +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace Rei.Fs.My.Resources +{ + [CompilerGenerated] + [StandardModule] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [HideModuleName] + [DebuggerNonUserCode] + internal sealed class Resources + { + private static ResourceManager resourceMan; + private static CultureInfo resourceCulture; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals((object) Rei.Fs.My.Resources.Resources.resourceMan, (object) null)) + Rei.Fs.My.Resources.Resources.resourceMan = new ResourceManager("Rei.Fs.Resources", typeof (Rei.Fs.My.Resources.Resources).Assembly); + return Rei.Fs.My.Resources.Resources.resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get + { + return Rei.Fs.My.Resources.Resources.resourceCulture; + } + set + { + Rei.Fs.My.Resources.Resources.resourceCulture = value; + } + } + + internal static Icon NetFolder + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(Rei.Fs.My.Resources.Resources.ResourceManager.GetObject(nameof (NetFolder), Rei.Fs.My.Resources.Resources.resourceCulture)); + } + } + + internal static Icon security + { + get + { + return (Icon) RuntimeHelpers.GetObjectValue(Rei.Fs.My.Resources.Resources.ResourceManager.GetObject(nameof (security), Rei.Fs.My.Resources.Resources.resourceCulture)); + } + } + } +} diff --git a/Rei.Fs/MyAsyncResult.cs b/Rei.Fs/MyAsyncResult.cs new file mode 100644 index 0000000..c2ee25f --- /dev/null +++ b/Rei.Fs/MyAsyncResult.cs @@ -0,0 +1,198 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.MyAsyncResult +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Rei.Fs +{ + public class MyAsyncResult : IAsyncResult + { + private AsyncCallback _callback; + private object _asyncstate; + private bool _iscompleted; + private bool _isended; + private bool _completesync; + private ManualResetEvent _waithandle; + private object _returnvalue; + private object _syncobject; + private IAsyncResult _baseasyncresult; + private object _tag; + private Exception _ex; + + public MyAsyncResult(AsyncCallback callback, object asyncstate) + { + this._callback = callback; + this._asyncstate = RuntimeHelpers.GetObjectValue(asyncstate); + this._iscompleted = false; + this._isended = false; + this._completesync = true; + this._waithandle = (ManualResetEvent) null; + this._returnvalue = (object) null; + this._syncobject = RuntimeHelpers.GetObjectValue(new object()); + } + + public bool IsCompleted + { + get + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + return this._iscompleted; + } + finally + { + Monitor.Exit(syncobject); + } + } + } + + public object AsyncState + { + get + { + return this._asyncstate; + } + } + + public bool CompletedSynchronously + { + get + { + return this._completesync; + } + } + + public WaitHandle AsyncWaitHandle + { + get + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._waithandle == null) + this._waithandle = new ManualResetEvent(this._iscompleted); + } + finally + { + Monitor.Exit(syncobject); + } + return (WaitHandle) this._waithandle; + } + } + + internal object ReturnValue + { + get + { + return this._returnvalue; + } + set + { + this._returnvalue = RuntimeHelpers.GetObjectValue(value); + } + } + + internal IAsyncResult BaseAsyncResult + { + get + { + return this._baseasyncresult; + } + set + { + this._baseasyncresult = value; + } + } + + internal object Tag + { + get + { + return this._tag; + } + set + { + this._tag = RuntimeHelpers.GetObjectValue(value); + } + } + + internal void SetCompleteAsync() + { + this._completesync = false; + } + + internal void AsyncComplete() + { + this.AsyncComplete((Exception) null); + } + + internal void AsyncComplete(Exception ex) + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._iscompleted) + throw new InvalidOperationException(); + this._iscompleted = true; + this._ex = ex; + if (this._waithandle != null) + this._waithandle.Set(); + } + finally + { + Monitor.Exit(syncobject); + } + if (this._callback == null) + return; + this._callback((IAsyncResult) this); + } + + internal void AsyncEnd() + { + object syncobject1 = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject1); + Monitor.Enter(syncobject1); + bool iscompleted; + try + { + if (this._isended) + throw new InvalidOperationException(); + this._isended = true; + iscompleted = this._iscompleted; + } + finally + { + Monitor.Exit(syncobject1); + } + if (!iscompleted) + this.AsyncWaitHandle.WaitOne(); + object syncobject2 = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject2); + Monitor.Enter(syncobject2); + try + { + if (this._waithandle != null) + this._waithandle.Close(); + } + finally + { + Monitor.Exit(syncobject2); + } + if (this._ex != null) + throw this._ex; + } + } +} diff --git a/Rei.Fs/NoHostRootedUriParser.cs b/Rei.Fs/NoHostRootedUriParser.cs new file mode 100644 index 0000000..915e734 --- /dev/null +++ b/Rei.Fs/NoHostRootedUriParser.cs @@ -0,0 +1,51 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.NoHostRootedUriParser +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Reflection; +using System.Security.Permissions; + +namespace Rei.Fs +{ + public class NoHostRootedUriParser : GenericUriParser + { + private static readonly GenericUriParserOptions ParserOptions = GenericUriParserOptions.DontUnescapePathDotsAndSlashes | GenericUriParserOptions.Idn | GenericUriParserOptions.IriParsing; + private const int MustHaveAuthority = 1; + private const int OptionalAuthority = 2; + + public static void Register(string scheme, int defaultport) + { + if (UriParser.IsKnownScheme(scheme)) + return; + UriParser.Register((UriParser) new NoHostRootedUriParser(), scheme, defaultport); + } + + public NoHostRootedUriParser() + : base(NoHostRootedUriParser.ParserOptions) + { + ReflectionPermission reflectionPermission = new ReflectionPermission(ReflectionPermissionFlag.AllFlags); + SecurityPermission securityPermission = new SecurityPermission(SecurityPermissionFlag.AllFlags); + reflectionPermission.Demand(); + securityPermission.Demand(); + FieldInfo field = typeof (UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); + int num = Conversions.ToInteger(field.GetValue((object) this)) & -2 | 2; + field.SetValue((object) this, (object) num); + } + + protected override void InitializeAndValidate(Uri uri, ref UriFormatException parsingError) + { + base.InitializeAndValidate(uri, out parsingError); + if (parsingError == null && Operators.CompareString(uri.Host, "", false) != 0) + parsingError = new UriFormatException("should not contain host"); + if (parsingError == null && !uri.AbsolutePath.StartsWith("/")) + parsingError = new UriFormatException("should be absolute path"); + if (parsingError != null || uri.Port > 0) + return; + parsingError = new UriFormatException("should not contain port"); + } + } +} diff --git a/Rei.Fs/OAuth2Dialog.cs b/Rei.Fs/OAuth2Dialog.cs new file mode 100644 index 0000000..032c954 --- /dev/null +++ b/Rei.Fs/OAuth2Dialog.cs @@ -0,0 +1,504 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.OAuth2Dialog +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Runtime.CompilerServices; +using System.Windows.Forms; + +namespace Rei.Fs +{ + [DesignerGenerated] + public class OAuth2Dialog : Form + { + private IContainer components; + [AccessedThroughProperty("TextBoxAuthCode")] + private TextBox _TextBoxAuthCode; + [AccessedThroughProperty("ButtonOK")] + private Button _ButtonOK; + [AccessedThroughProperty("ButtonCancel")] + private Button _ButtonCancel; + [AccessedThroughProperty("LinkLabel1")] + private LinkLabel _LinkLabel1; + [AccessedThroughProperty("Label3")] + private Label _Label3; + [AccessedThroughProperty("Label4")] + private Label _Label4; + [AccessedThroughProperty("Label5")] + private Label _Label5; + [AccessedThroughProperty("Label2")] + private Label _Label2; + [AccessedThroughProperty("UriTextBox")] + private TextBox _UriTextBox; + [AccessedThroughProperty("Label1")] + private Label _Label1; + [AccessedThroughProperty("RememberCheckBox")] + private CheckBox _RememberCheckBox; + [AccessedThroughProperty("Label6")] + private Label _Label6; + + public OAuth2Dialog() + { + this.Load += new EventHandler(this.OAuth2Dialog_Load); + this.InitializeComponent(); + } + + [DebuggerNonUserCode] + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.components == null) + return; + this.components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + [DebuggerStepThrough] + private void InitializeComponent() + { + this.TextBoxAuthCode = new TextBox(); + this.ButtonOK = new Button(); + this.ButtonCancel = new Button(); + this.LinkLabel1 = new LinkLabel(); + this.Label3 = new Label(); + this.Label4 = new Label(); + this.Label5 = new Label(); + this.Label2 = new Label(); + this.UriTextBox = new TextBox(); + this.Label1 = new Label(); + this.RememberCheckBox = new CheckBox(); + this.Label6 = new Label(); + this.SuspendLayout(); + this.TextBoxAuthCode.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox textBoxAuthCode1 = this.TextBoxAuthCode; + Point point1 = new Point(80, 128); + Point point2 = point1; + textBoxAuthCode1.Location = point2; + this.TextBoxAuthCode.Name = "TextBoxAuthCode"; + TextBox textBoxAuthCode2 = this.TextBoxAuthCode; + Size size1 = new Size(200, 19); + Size size2 = size1; + textBoxAuthCode2.Size = size2; + this.TextBoxAuthCode.TabIndex = 7; + this.ButtonOK.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + Button buttonOk1 = this.ButtonOK; + point1 = new Point(128, 192); + Point point3 = point1; + buttonOk1.Location = point3; + this.ButtonOK.Name = "ButtonOK"; + Button buttonOk2 = this.ButtonOK; + size1 = new Size(72, 24); + Size size3 = size1; + buttonOk2.Size = size3; + this.ButtonOK.TabIndex = 10; + this.ButtonOK.Text = "OK"; + this.ButtonOK.UseVisualStyleBackColor = true; + this.ButtonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + this.ButtonCancel.DialogResult = DialogResult.Cancel; + Button buttonCancel1 = this.ButtonCancel; + point1 = new Point(208, 192); + Point point4 = point1; + buttonCancel1.Location = point4; + this.ButtonCancel.Name = "ButtonCancel"; + Button buttonCancel2 = this.ButtonCancel; + size1 = new Size(72, 24); + Size size4 = size1; + buttonCancel2.Size = size4; + this.ButtonCancel.TabIndex = 11; + this.ButtonCancel.Text = "Cancel"; + this.ButtonCancel.UseVisualStyleBackColor = true; + this.LinkLabel1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + LinkLabel linkLabel1_1 = this.LinkLabel1; + point1 = new Point(40, 64); + Point point5 = point1; + linkLabel1_1.Location = point5; + this.LinkLabel1.Name = "LinkLabel1"; + LinkLabel linkLabel1_2 = this.LinkLabel1; + size1 = new Size(239, 16); + Size size5 = size1; + linkLabel1_2.Size = size5; + this.LinkLabel1.TabIndex = 3; + this.LinkLabel1.TabStop = true; + this.LinkLabel1.Text = "LinkLabel1"; + this.LinkLabel1.TextAlign = ContentAlignment.MiddleLeft; + this.Label3.AutoSize = true; + Label label3_1 = this.Label3; + point1 = new Point(8, 48); + Point point6 = point1; + label3_1.Location = point6; + this.Label3.Name = "Label3"; + Label label3_2 = this.Label3; + size1 = new Size(126, 12); + Size size6 = size1; + label3_2.Size = size6; + this.Label3.TabIndex = 2; + this.Label3.Text = "Step1: Open Link Below"; + this.Label4.AutoSize = true; + Label label4_1 = this.Label4; + point1 = new Point(8, 88); + Point point7 = point1; + label4_1.Location = point7; + this.Label4.Name = "Label4"; + Label label4_2 = this.Label4; + size1 = new Size(203, 12); + Size size7 = size1; + label4_2.Size = size7; + this.Label4.TabIndex = 4; + this.Label4.Text = "Step2: Authorize CarotDAV on the site"; + this.Label5.AutoSize = true; + Label label5_1 = this.Label5; + point1 = new Point(8, 104); + Point point8 = point1; + label5_1.Location = point8; + this.Label5.Name = "Label5"; + Label label5_2 = this.Label5; + size1 = new Size(166, 12); + Size size8 = size1; + label5_2.Size = size8; + this.Label5.TabIndex = 5; + this.Label5.Text = "Step3: Input Authorization Code"; + this.Label2.AutoSize = true; + Label label2_1 = this.Label2; + point1 = new Point(40, 128); + Point point9 = point1; + label2_1.Location = point9; + this.Label2.Name = "Label2"; + Label label2_2 = this.Label2; + size1 = new Size(31, 12); + Size size9 = size1; + label2_2.Size = size9; + this.Label2.TabIndex = 6; + this.Label2.Text = "Code"; + this.UriTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + TextBox uriTextBox1 = this.UriTextBox; + point1 = new Point(8, 24); + Point point10 = point1; + uriTextBox1.Location = point10; + this.UriTextBox.Multiline = true; + this.UriTextBox.Name = "UriTextBox"; + this.UriTextBox.ReadOnly = true; + TextBox uriTextBox2 = this.UriTextBox; + size1 = new Size(272, 19); + Size size10 = size1; + uriTextBox2.Size = size10; + this.UriTextBox.TabIndex = 1; + this.UriTextBox.TabStop = false; + this.Label1.AutoSize = true; + Label label1_1 = this.Label1; + point1 = new Point(8, 8); + Point point11 = point1; + label1_1.Location = point11; + this.Label1.Name = "Label1"; + Label label1_2 = this.Label1; + size1 = new Size(90, 12); + Size size11 = size1; + label1_2.Size = size11; + this.Label1.TabIndex = 0; + this.Label1.Text = "Authorization for"; + this.RememberCheckBox.AutoSize = true; + CheckBox rememberCheckBox1 = this.RememberCheckBox; + point1 = new Point(8, 176); + Point point12 = point1; + rememberCheckBox1.Location = point12; + CheckBox rememberCheckBox2 = this.RememberCheckBox; + size1 = new Size(214, 16); + Size size12 = size1; + rememberCheckBox2.MinimumSize = size12; + this.RememberCheckBox.Name = "RememberCheckBox"; + CheckBox rememberCheckBox3 = this.RememberCheckBox; + size1 = new Size(214, 16); + Size size13 = size1; + rememberCheckBox3.Size = size13; + this.RememberCheckBox.TabIndex = 9; + this.RememberCheckBox.Text = "Remember Authorization Info"; + this.RememberCheckBox.UseVisualStyleBackColor = true; + this.Label6.AutoSize = true; + Label label6_1 = this.Label6; + point1 = new Point(8, 152); + Point point13 = point1; + label6_1.Location = point13; + this.Label6.Name = "Label6"; + Label label6_2 = this.Label6; + size1 = new Size(97, 12); + Size size14 = size1; + label6_2.Size = size14; + this.Label6.TabIndex = 8; + this.Label6.Text = "Step4: Click \"OK\""; + this.AcceptButton = (IButtonControl) this.ButtonOK; + this.AutoScaleDimensions = new SizeF(6f, 12f); + this.AutoScaleMode = AutoScaleMode.Font; + this.CancelButton = (IButtonControl) this.ButtonCancel; + size1 = new Size(288, 224); + this.ClientSize = size1; + this.Controls.Add((Control) this.Label6); + this.Controls.Add((Control) this.RememberCheckBox); + this.Controls.Add((Control) this.UriTextBox); + this.Controls.Add((Control) this.Label1); + this.Controls.Add((Control) this.LinkLabel1); + this.Controls.Add((Control) this.ButtonCancel); + this.Controls.Add((Control) this.ButtonOK); + this.Controls.Add((Control) this.Label2); + this.Controls.Add((Control) this.Label5); + this.Controls.Add((Control) this.Label4); + this.Controls.Add((Control) this.Label3); + this.Controls.Add((Control) this.TextBoxAuthCode); + size1 = new Size(304, 262); + this.MinimumSize = size1; + this.Name = nameof (OAuth2Dialog); + this.Text = "OAuth Authorization Dialog"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + internal virtual TextBox TextBoxAuthCode + { + get + { + return this._TextBoxAuthCode; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.TextBox1_TextChanged); + if (this._TextBoxAuthCode != null) + this._TextBoxAuthCode.TextChanged -= eventHandler; + this._TextBoxAuthCode = value; + if (this._TextBoxAuthCode == null) + return; + this._TextBoxAuthCode.TextChanged += eventHandler; + } + } + + internal virtual Button ButtonOK + { + get + { + return this._ButtonOK; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + EventHandler eventHandler = new EventHandler(this.ButtonOK_Click); + if (this._ButtonOK != null) + this._ButtonOK.Click -= eventHandler; + this._ButtonOK = value; + if (this._ButtonOK == null) + return; + this._ButtonOK.Click += eventHandler; + } + } + + internal virtual Button ButtonCancel + { + get + { + return this._ButtonCancel; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._ButtonCancel = value; + } + } + + internal virtual LinkLabel LinkLabel1 + { + get + { + return this._LinkLabel1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + LinkLabelLinkClickedEventHandler clickedEventHandler = new LinkLabelLinkClickedEventHandler(this.LinkLabel1_LinkClicked); + if (this._LinkLabel1 != null) + this._LinkLabel1.LinkClicked -= clickedEventHandler; + this._LinkLabel1 = value; + if (this._LinkLabel1 == null) + return; + this._LinkLabel1.LinkClicked += clickedEventHandler; + } + } + + internal virtual Label Label3 + { + get + { + return this._Label3; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label3 = value; + } + } + + internal virtual Label Label4 + { + get + { + return this._Label4; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label4 = value; + } + } + + internal virtual Label Label5 + { + get + { + return this._Label5; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label5 = value; + } + } + + internal virtual Label Label2 + { + get + { + return this._Label2; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label2 = value; + } + } + + internal virtual TextBox UriTextBox + { + get + { + return this._UriTextBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._UriTextBox = value; + } + } + + internal virtual Label Label1 + { + get + { + return this._Label1; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label1 = value; + } + } + + internal virtual CheckBox RememberCheckBox + { + get + { + return this._RememberCheckBox; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._RememberCheckBox = value; + } + } + + internal virtual Label Label6 + { + get + { + return this._Label6; + } + [MethodImpl(MethodImplOptions.Synchronized)] set + { + this._Label6 = value; + } + } + + public string Target + { + get + { + return this.UriTextBox.Text; + } + set + { + this.UriTextBox.Text = value; + } + } + + public string AuthorizationEndpoint + { + get + { + return this.LinkLabel1.Text; + } + set + { + this.LinkLabel1.Text = value; + } + } + + public bool ShowRememberCheckBox + { + get + { + return this.RememberCheckBox.Visible; + } + set + { + this.RememberCheckBox.Visible = value; + } + } + + public bool Remember + { + get + { + return this.RememberCheckBox.Checked; + } + set + { + this.RememberCheckBox.Checked = value; + } + } + + public string Code + { + get + { + return this.TextBoxAuthCode.Text; + } + } + + private void ButtonOK_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + private void LinkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(this.LinkLabel1.Text); + } + + private void TextBox1_TextChanged(object sender, EventArgs e) + { + if (this.TextBoxAuthCode.Text.Length < 0) + return; + this.ButtonOK.Enabled = true; + } + + private void OAuth2Dialog_Load(object sender, EventArgs e) + { + this.Icon = Rei.Fs.My.Resources.Resources.security; + } + } +} diff --git a/Rei.Fs/OAuth2Dialog.resx b/Rei.Fs/OAuth2Dialog.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/Rei.Fs/OAuth2Dialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rei.Fs/PartialStream.cs b/Rei.Fs/PartialStream.cs new file mode 100644 index 0000000..3a4a1d8 --- /dev/null +++ b/Rei.Fs/PartialStream.cs @@ -0,0 +1,330 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.PartialStream +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.IO; +using System.Runtime.CompilerServices; + +namespace Rei.Fs +{ + public class PartialStream : Stream + { + private Stream pBaseStream; + private long pLength; + private long pInnerPos; + private long pStart; + private int pLastCount; + public object Tag; + private object pSyncObject; + private bool pHasError; + private bool pDisposed; + + public PartialStream(Stream basestream, long length) + { + this.pHasError = false; + this.pDisposed = false; + this.pBaseStream = basestream; + this.pLength = length; + this.pInnerPos = 0L; + if (!this.pBaseStream.CanSeek) + return; + this.pStart = this.pBaseStream.Position; + } + + public Stream BaseStream + { + get + { + return this.pBaseStream; + } + } + + public override bool CanRead + { + get + { + return this.pBaseStream.CanRead; + } + } + + public override bool CanSeek + { + get + { + return this.pBaseStream.CanSeek; + } + } + + public override bool CanWrite + { + get + { + return this.pBaseStream.CanWrite; + } + } + + public override bool CanTimeout + { + get + { + return this.pBaseStream.CanTimeout; + } + } + + public override long Length + { + get + { + if (this.pLength < 0L) + throw new NotSupportedException(); + return this.pLength; + } + } + + public override int ReadTimeout + { + get + { + return this.pBaseStream.ReadTimeout; + } + set + { + this.pBaseStream.ReadTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return this.pBaseStream.WriteTimeout; + } + set + { + this.pBaseStream.WriteTimeout = value; + } + } + + public override long Position + { + get + { + return this.pInnerPos; + } + set + { + this.Seek(value, SeekOrigin.Begin); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + try + { + switch (origin) + { + case SeekOrigin.Current: + checked { offset += this.Position; } + break; + case SeekOrigin.End: + if (this.pLength < 0L) + throw new NotSupportedException(); + offset = checked (this.pLength - offset); + break; + } + if (offset < 0L || this.pLength >= 0L && offset > this.pLength) + throw new ArgumentOutOfRangeException(); + this.pBaseStream.Seek(checked (this.pStart + offset), SeekOrigin.Begin); + this.pInnerPos = offset; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + long num; + return num; + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + try + { + if (this.pInnerPos < 0L) + this.Position = 0L; + if (this.pLength >= 0L && checked (this.pInnerPos + (long) count) > this.pLength) + count = checked ((int) (this.pLength - this.pInnerPos)); + int num = this.pBaseStream.Read(buffer, offset, count); + this.pInnerPos = checked (this.pInnerPos + (long) num); + if (num == 0 && count > 0 && (this.pLength >= 0L && this.pInnerPos < this.pLength)) + throw new IOException("Invalid Stream Length"); + return num; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + try + { + if (this.pInnerPos < 0L) + this.Position = 0L; + if (this.pLength >= 0L && checked (this.pInnerPos + (long) count) > this.pLength) + count = checked ((int) (this.pLength - this.pInnerPos)); + this.pLastCount = count; + return this.pBaseStream.BeginRead(buffer, offset, count, callback, RuntimeHelpers.GetObjectValue(state)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override int EndRead(IAsyncResult asyncResult) + { + try + { + int num = this.pBaseStream.EndRead(asyncResult); + this.pInnerPos = checked (this.pInnerPos + (long) num); + if (num == 0 && this.pLastCount > 0 && (this.pLength >= 0L && this.pInnerPos < this.pLength)) + throw new IOException("Invalid Stream Length"); + return num; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override void Write(byte[] buffer, int offset, int count) + { + try + { + if (this.pInnerPos < 0L) + this.Position = 0L; + if (this.pLength >= 0L && checked (this.pInnerPos + (long) count) > this.pLength) + throw new InvalidRangeException(); + this.pBaseStream.Write(buffer, offset, count); + this.pInnerPos = checked (this.pInnerPos + (long) count); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + try + { + if (this.pInnerPos < 0L) + this.Position = 0L; + if (this.pLength >= 0L && checked (this.pInnerPos + (long) count) > this.pLength) + throw new ArgumentException(); + this.pLastCount = count; + return this.pBaseStream.BeginWrite(buffer, offset, count, callback, RuntimeHelpers.GetObjectValue(state)); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override void EndWrite(IAsyncResult asyncResult) + { + try + { + this.pBaseStream.EndWrite(asyncResult); + this.pInnerPos = checked (this.pInnerPos + (long) this.pLastCount); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + public override void Flush() + { + try + { + this.pBaseStream.Flush(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + this.pHasError = true; + throw; + } + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.pDisposed) + return; + this.pDisposed = true; + if (this.pHasError) + { + try + { + this.pBaseStream.Close(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + else + { + if (this.pLength >= 0L && this.pInnerPos != this.pLength) + { + string message = "Length:" + this.pLength.ToString() + " Position:" + this.pInnerPos.ToString(); + try + { + this.pBaseStream.Close(); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + Exception innerexception = ex; + throw new InvalidRangeException(message, innerexception); + } + throw new InvalidRangeException(message); + } + this.pBaseStream.Close(); + } + } + finally + { + base.Dispose(disposing); + } + } + } +} diff --git a/Rei.Fs/ProxyType.cs b/Rei.Fs/ProxyType.cs new file mode 100644 index 0000000..0d12626 --- /dev/null +++ b/Rei.Fs/ProxyType.cs @@ -0,0 +1,15 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ProxyType +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +namespace Rei.Fs +{ + public enum ProxyType + { + Default, + Specify, + NoProxy, + } +} diff --git a/Rei.Fs/Rei.Fs.csproj b/Rei.Fs/Rei.Fs.csproj new file mode 100644 index 0000000..ecb2f04 --- /dev/null +++ b/Rei.Fs/Rei.Fs.csproj @@ -0,0 +1,102 @@ + + + + + Debug + AnyCPU + {BD378147-118C-4141-A046-BFD575EF1B05} + Library + Rei.Fs + v3.5 + 1.13.2.8796 + 512 + Rei.Fs + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Rei.Fs/RemoteCertificateErrorException.cs b/Rei.Fs/RemoteCertificateErrorException.cs new file mode 100644 index 0000000..06090e1 --- /dev/null +++ b/Rei.Fs/RemoteCertificateErrorException.cs @@ -0,0 +1,30 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.RemoteCertificateErrorException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; +using System.Net.Security; + +namespace Rei.Fs +{ + public class RemoteCertificateErrorException : Exception + { + private SslPolicyErrors pErrors; + + public RemoteCertificateErrorException(Exception ex, SslPolicyErrors errors) + : base(ex.Message, ex) + { + this.pErrors = errors; + } + + public SslPolicyErrors Errors + { + get + { + return this.pErrors; + } + } + } +} diff --git a/Rei.Fs/RemoteResourceNotFoundException.cs b/Rei.Fs/RemoteResourceNotFoundException.cs new file mode 100644 index 0000000..324f47a --- /dev/null +++ b/Rei.Fs/RemoteResourceNotFoundException.cs @@ -0,0 +1,39 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.RemoteResourceNotFoundException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class RemoteResourceNotFoundException : Exception + { + private Uri _target; + + public RemoteResourceNotFoundException(Uri uri, string message, Exception innerexception) + : base(message, innerexception) + { + this._target = uri; + } + + public RemoteResourceNotFoundException(Uri uri, Exception innerexception) + : this(uri, "Remote Resource Not Found", innerexception) + { + } + + public RemoteResourceNotFoundException(Uri uri) + : this(uri, "Remote Resource Not Found", (Exception) null) + { + } + + public Uri TargetUri + { + get + { + return this._target; + } + } + } +} diff --git a/Rei.Fs/ResourceId.cs b/Rei.Fs/ResourceId.cs new file mode 100644 index 0000000..c9bfdc9 --- /dev/null +++ b/Rei.Fs/ResourceId.cs @@ -0,0 +1,89 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ResourceId +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; +using System.ComponentModel; +using System.Diagnostics; + +namespace Rei.Fs +{ + [DebuggerDisplay("{DebuggerString}")] + [Serializable] + public class ResourceId : ReturnedInfo + { + private Uri pUri; + private string pTag; + private bool pIsCaseSensitive; + + public ResourceId(Uri target, FsBase fs) + : this(target, "", fs) + { + } + + public ResourceId(Uri target, string tag, FsBase fs) + { + this.pUri = target; + this.pTag = tag; + this.pIsCaseSensitive = fs.IsCaseSensitiveFs; + } + + public Uri Uri + { + get + { + return this.pUri; + } + } + + public string Tag + { + get + { + return this.pTag; + } + } + + public bool IsCollection + { + get + { + return UriUtil.EndWithSlash(this.pUri); + } + } + + public override string ToString() + { + return this.pUri.ToString(); + } + + public override bool Equals(object obj) + { + ResourceId resourceId = obj as ResourceId; + if ((object) resourceId == null) + return false; + return UriUtil.UriEquals(this.Uri, resourceId.Uri, this.pIsCaseSensitive); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public string DebuggerString + { + get + { + return this.ToString(); + } + } + + public static bool operator ==(ResourceId id1, ResourceId id2) + { + return UriUtil.UriEquals(id1.Uri, id2.Uri, id1.pIsCaseSensitive); + } + + public static bool operator !=(ResourceId id1, ResourceId id2) + { + return !UriUtil.UriEquals(id1.Uri, id2.Uri, id1.pIsCaseSensitive); + } + } +} diff --git a/Rei.Fs/ResourceInfo.cs b/Rei.Fs/ResourceInfo.cs new file mode 100644 index 0000000..f2df9c3 --- /dev/null +++ b/Rei.Fs/ResourceInfo.cs @@ -0,0 +1,165 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ResourceInfo +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Rei.Fs +{ + [DebuggerDisplay("{DebuggerString}")] + [Serializable] + public class ResourceInfo : ReturnedInfo, ICloneable + { + public ResourceId Id; + public long Size; + public DateTime LastModifiedTime; + public bool IsCollection; + public DateTime CreationTime; + public DateTime LastAccessTime; + public string StatusDescription; + public bool HasError; + public bool CanRename; + public bool CanMove; + public bool CanCopy; + public bool CanDelete; + public bool CanSetInfo; + public bool IsEncrypted; + public bool IsSplitted; + public bool IsMinor; + private List pTypes; + private ResourceInfo.PropertyCollection pProperties; + + public ResourceInfo() + : this((ResourceId) null, false, 0L, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue) + { + } + + public ResourceInfo(ResourceId id, bool iscollection, long size, DateTime lastmodified) + : this(id, iscollection, size, lastmodified, DateTime.MinValue, DateTime.MinValue) + { + } + + public ResourceInfo(ResourceId id, bool iscollection, long size, DateTime lastmodified, DateTime creation, DateTime lastaccess) + { + this.Id = id; + this.IsCollection = iscollection; + this.Size = size; + this.LastModifiedTime = lastmodified; + this.CreationTime = creation; + this.LastAccessTime = lastaccess; + this.pProperties = new ResourceInfo.PropertyCollection(); + this.pTypes = new List(); + this.HasError = false; + } + + public ResourceInfo.PropertyCollection Properties + { + get + { + return this.pProperties; + } + } + + public List Types + { + get + { + return this.pTypes; + } + } + + public object Clone() + { + ResourceInfo resourceInfo = (ResourceInfo) this.MemberwiseClone(); + resourceInfo.pProperties = new ResourceInfo.PropertyCollection(); + resourceInfo.pProperties.AddRange((IEnumerable) this.pProperties); + resourceInfo.pTypes = new List(); + resourceInfo.pTypes.AddRange((IEnumerable) this.pTypes); + return (object) resourceInfo; + } + + public string DebuggerString + { + get + { + return this.ToString(); + } + } + + public override string ToString() + { + string str1 = ""; + string str2 = (object) this.Id != null ? str1 + this.Id.ToString() : str1 + "NoId"; + return (!this.IsCollection ? str2 + " " : str2 + " ") + this.Size.ToString(); + } + + [Serializable] + public class PropertyCollection : List + { + public ResourceInfo.ResourceProperty this[string name] + { + get + { + int index = this.IndexOf(name); + if (index >= 0) + return this[index]; + throw new ArgumentOutOfRangeException(); + } + } + + public int IndexOf(string name) + { + int num1 = 0; + int num2 = checked (this.Count - 1); + int index = num1; + while (index <= num2) + { + if (Operators.CompareString(this[index].Name, name, false) == 0) + return index; + checked { ++index; } + } + return -1; + } + + public void Add(string name, string value, string statedescription, bool haserror) + { + this.Add(new ResourceInfo.ResourceProperty(name, value, statedescription, haserror)); + } + + public void Remove(string name) + { + int index = this.IndexOf(name); + if (index < 0) + throw new ArgumentException(); + this.RemoveAt(index); + } + + public bool Contains(string name) + { + return this.IndexOf(name) >= 0; + } + } + + [Serializable] + public class ResourceProperty + { + public string Name; + public string Value; + public string StateDescription; + public bool HasError; + + public ResourceProperty(string name, string value, string statedescription, bool haserror) + { + this.Name = name; + this.Value = value; + this.StateDescription = statedescription; + this.HasError = haserror; + } + } + } +} diff --git a/Rei.Fs/ResourceInfoEventArgs.cs b/Rei.Fs/ResourceInfoEventArgs.cs new file mode 100644 index 0000000..005ddbd --- /dev/null +++ b/Rei.Fs/ResourceInfoEventArgs.cs @@ -0,0 +1,49 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ResourceInfoEventArgs +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; +using System.Runtime.CompilerServices; + +namespace Rei.Fs +{ + public class ResourceInfoEventArgs : EventArgs + { + private FsBase pfs; + private ResourceInfo[] ris; + private object pTag; + + public ResourceInfo[] ResourceInfos + { + get + { + return this.ris; + } + } + + public FsBase Fs + { + get + { + return this.pfs; + } + } + + public object Tag + { + get + { + return this.pTag; + } + } + + public ResourceInfoEventArgs(FsBase fs, ResourceInfo[] ris, object tag) + { + this.pfs = fs; + this.ris = ris; + this.pTag = RuntimeHelpers.GetObjectValue(tag); + } + } +} diff --git a/Rei.Fs/Resources.resx b/Rei.Fs/Resources.resx new file mode 100644 index 0000000..04d5a3f --- /dev/null +++ b/Rei.Fs/Resources.resx @@ -0,0 +1,1003 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA + IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA + AACACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8ATEtLAF5dXQDKyckAz8TBAMSekQD++vgAzpuAALeM + dQDbs5oAc3BuAMiliwDtx6gAyK2WAPbo3QD47OIA9MGUAOi7lAD11LYA/9/DAPXfywD/9ewA+vPtAP/M + mQD7yJgA/8+eAP/SpAD/06cA/9WqAP/WrgDzz6wA/9u2AP/mzQD75tEA//LlAPjw6AD/+PEA//z5AP/K + kQD3zqAA+9WtAP/kxwD/6tMA/+7cAP/DfAD/1KAA//HgAP/69AD/2aYA8NGnAP/jvQD/3KsA/60rAP+7 + RgD/4rAA6dKoALSnkACmnIoA/8pjAP/otQD/7bsA//LPAN/XtQD/9MAAvbmnAP/7xwD//NsA///QAP// + 4gBlZWQAvsCtAAAAAACWo50AnrWzAJz//wC01dUA8///AJX7/wC0+v4AkPb/AMv7/wCN8/8A7fz+AIju + /wCL5/cA4Pn9AIbq/wCC5/8Alej9AKXt/wCf3OsAh7S+ACrB6wB+4/8AD5zKABip1wA1uOMAUrrcAGzL + 6gBx1PIAOGZ1AHDG4gBsvNUAgM/nANLt9QASirYAKKvYADCYuwAmdpIAPK7UAGTR+gB22/8AktbtAFlk + aABQxPAAuuDvAAJzpQCJ2f0A/f39APn5+QD19fUA8vLyAObm5gDh4eEAwsLCAKampgCZmZkAc3NzAHBw + cAAmJiYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABISEhISEhISEhISEhISEhISEiBgYGBgYGBgUhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhIgYGBgYGBgXV1dXV1dXV1gYGBgYGBgYGBSEhISEhISEhISEhI + SEhISEhISEhISEiCgoKCgoKCgmBdXWtda111goKCgoKCgoICgUhISEhISEhISEhISEhISEhISEhISH+A + gICAgICAgGBzb29vb3NqgICAgICAgICCgUhISEhISEhISEhISEhISEhISEhISH9+fn5+fn5+fmtkV15e + UmRqfn5+fn5+fn6CgUhISEhISEhISEhISEhISEhISEhISH97e3t7e3t7e2tbWlpaT3Zqe3t7e3t7e3uC + gUhISEhISEhISEhISEhISEhISEhISH8vLy8vLy8vL2t0UVFRUXRqIy8vLy8vLy+CSEhISEhISEhISEhI + SEhISEhISEhISEh/f39/f39/f2JpAQEBAWlqf39/f39/f39ISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISGtuYm5ua2tuSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEh/L3t+ + gIKBSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISIGBgUhISEhISEh/L3t+gIKBSEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhIbmxtZUaBgUhISEh/L3t+gIKBSEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhIbmhba2BqbWVygYF/L3t+gIKBSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIbm4B + cG9vc2Fgam1/L3t+gIKBSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIbmtWWnBwcHBwcHNha2pq + gIICgYFISEhISEhISEhISEhISEhISEhISEhISEhISEhIbnNbaXBwcHBwcHBwcHBvc2Ffam1lRoFISEhI + SEhISEhISEhISEhISEhISEhISEhIbnBiTXBwcHBwcHBwcHBwcHBeb3NhYGptZXJISEhISEhISEhISEhI + SEhISEhISEhIbnZfU1peXl5eXl5eXl5eXl5eXl5eXnBvYV9ySEhISEhISEhISEhISEhISEhISEhIbnZr + dFFYWFhYWFhYWFhYWFhYWFhYWFhYXmFlgUhISEhISEhISEhISEhISEhISEhIbnBhYlNUVFRUVFRUVFRU + VFRUVFRUVFRUXnBqA0hISEhISEhISEhISEhISEhISEhIbnZhawFaVFRUVFRUVFRUVFRUVG9eUlRUWFVh + ZYFISEhISEhISEhISEhISEhISEhIbnZza3RRUlJSUlJSUlJSUlJScHFkVFJSV1dOaoFISEhISEhISEhI + SEhISEhISEhIbnZzc2ZNTk5OTk5OTk5OTk5YcSgEXlBOVFdPa2WBSEhISEhISEhISEhISEhISEhIbnZv + c2sBS05OTk5OTk5OTldxKBoYTFhOVFlPVW2BSEhISEhISEhISEhISEhISEhubnZvb2FpUUtLS0tLS0tL + UFU4LjEuKFtQUllRUWBySEhISEhISEhISEhISEhISEhubnZvb3NoU0tLS0tLS0tOVTguNDQ0LjJVUllR + UWhtgUhISEhISEhISEhISEhISEhubnZvb29raXdWUVFPT0tSPy43Nzc3Ny4/V1pRUVFfA0hISEhISEhI + SEhISEhISEhucVlwcHBva2JodFYBAVN6Mzw3MTw8PDwaTFlWVlZjZYFISEhISEhISEhISEhISEhucXZw + cHBwcHBvc2FgYmZxAT43GDc9PT08GnxWVlZRakZISEhISEhISEhISEhISEhucVleWF5YWFhYXl5vXAZc + ZwEqNxg8QEA9PBp6U1NTYmWBSEhISEhISEhISEhISEhuW1lXV1dXV1dXV3BcCBogSmIBASMvRUNEQjcp + eE1NaWqBSEhISEhISEhISEhISEhuaVpSUFJSUlJQXmgMGiAeHkFuZ2JoW3R5AQEjJgEBAW6BSEhISEhI + SEhISEhISEhuVktOTk5OTk5XcQwZIDMaHR0aIBgFR1xnYmJnaHRpAXRsSEhISEhISEhISEhISEhuVk5L + TktLS1BVORkgFBggGiAbGx4aIBgUISEUR0ltbGxISEhISEhISEhISEhISEhuVk9OS0tOTlkOER4UHR4a + IBggGh4bGyAYKiEhIBkJC0hISEhISEhISEhISEhISEhucVZOS05LTkERHishGCAbHCAYFBgUGh4UKysr + KxwSOkhISEhISEhISEhISEhISEhIa1ZPTktLRxIbLCwsFBgUGiAdGyAaFBgULCwsLBUMCEhISEhISEhI + SEhISEhISEhIbmhTUVFMEhwsLy8vLyAaKhgUGyAgGxQYKy8vLAgISEhISEhISEhISEhISEhISEhISGtu + aHR9DSMjIyMjIyMcHBQaKhoUHB4gHiMsCjlISEhISEhISEhISEhISEhISEhISEhIbm5uQRUWFhYWFhYj + GiAgGyoYIRoqIxcNOUhISEhISEhISEhISEhISEhISEhISEhISEhISA0PJSUlJSUlLxoUHR4UGiEjJRM5 + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEgNFjAwMDAwMCsYKxoUHi8wFQxISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhIDSYmJiYmJiYUGisYFiYQDEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISBMBAQEBAQEBIB4lASQKSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISBUiAQEB + ASQBJiEBBw1ISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgTIwEBDzUTAQEBH0hISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIKSUWOzU2IgEUSEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISB4YLS0tJxRISEhISEhISEhISEhISEhISEhISEj//8A///8AAP/A + AAA//wAA/4AAAB//AAD/AAAAH/8AAP8AAAAf/wAA/wAAAB//AAD/AAAAP/8AAP+AAAB//wAA//+Af/// + AAD//8B///8AAP8fwH///wAA/gPAf///AAD+AAB///8AAP4AAH///wAA/gAAH///AAD+AAAD//8AAP4A + AAB//wAA/gAAAD//AAD+AAAAH/8AAP4AAAAf/wAA/gAAAA//AAD+AAAAD/8AAP4AAAAH/wAA/gAAAAf/ + AAD8AAAAB/8AAPwAAAAD/wAA/AAAAAP/AAD8AAAAAf8AAPwAAAAB/wAA/AAAAAD/AAD8AAAAAP8AAPwA + AAAA/wAA/AAAAAD/AAD8AAAAAf8AAPwAAAAD/wAA/AAAAAP/AAD+AAAAA/8AAP4AAAAH/wAA/wAAAA// + AAD/wAAAH/8AAP/8AAA//wAA//4AAH//AAD//wAA//8AAP//gAH//wAA//+AA///AAD//8AH//8AAP// + 4A///wAA///wH///AAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wBMS0sAXl1dAMrJyQDPxMEAxJ6RAP76+ADOm4AAt4x1ANuzmgBzcG4AyKWLAO3HqADIrZYA9ujdAPjs + 4gD0wZQA6LuUAPXUtgD/38MA9d/LAP/17AD68+0A/8yZAPvImAD/z54A/9KkAP/TpwD/1aoA/9auAPPP + rAD/27YA/+bNAPvm0QD/8uUA+PDoAP/48QD//PkA/8qRAPfOoAD71a0A/+THAP/q0wD/7twA/8N8AP/U + oAD/8eAA//r0AP/ZpgDw0acA/+O9AP/cqwD/rSsA/7tGAP/isADp0qgAtKeQAKacigD/ymMA/+i1AP/t + uwD/8s8A39e1AP/0wAC9uacA//vHAP/82wD//9AA///iAGVlZAC+wK0AAAAAAJajnQCetbMAnP//ALTV + 1QDz//8Alfv/ALT6/gCQ9v8Ay/v/AI3z/wDt/P4AiO7/AIvn9wDg+f0Ahur/AILn/wCV6P0Ape3/AJ/c + 6wCHtL4AKsHrAH7j/wAPnMoAGKnXADW44wBSutwAbMvqAHHU8gA4ZnUAcMbiAGy81QCAz+cA0u31ABKK + tgAoq9gAMJi7ACZ2kgA8rtQAZNH6AHbb/wCS1u0AWWRoAFDE8AC64O8AAnOlAInZ/QD9/f0A+fn5APX1 + 9QDy8vIA5ubmAOHh4QDCwsIApqamAJmZmQBzc3MAcHBwACYmJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhI + SEhISEhISEhISIGBgYGBgUhISEhISEhISEhISEhISEhISEhISIGBgYF1dXV1dXVGRoGBgYFISEhISEhI + SEhISEhISEiCgoKCgmBdXWtddYKCgoKCAoFISEhISEhISEhISEhIf35+fn5+a2RXXmRqfn5+fn6CgUhI + SEhISEhISEhISEh/Ly8vLy9rdFFRdGojLy8vL4JISEhISEhISEhISEhISEh/f39/f2JpAQFpan9/f39/ + SEhISEhISEhISEhISEhISEhISEhIa25ibmtuSEhISEhISEhISEhISEhISEhISEiAgICASEhIfy9+goFI + SEhISEhISEhISEhISEhISEhIa1thbG1lcoF/L36CRkhISEhISEhISEhISEhISEhISEhrW1pwcHNha21t + foIDgIBISEhISEhISEhISEhISEhISGtiVnBwcHBwcG9za2xtZXKBgEhISEhISEhISEhISEhIa2JpV15e + Xl5eXl5eXnBvYWxlgEhISEhISEhISEhISEhrYnFaWFhYWFhYWFhYWFhYXmxySEhISEhISEhISEhISGtv + YlZUVFRUVFRUVFdwVFRYZGWASEhISEhISEhISEhIa2RhU05QUFBQUFBSdkxYUFdOYgNISEhISEhISEhI + SEhrZHNbT0tOTk5OTl44GExQUlpkZX9ISEhISEhISEhISGtwb2JWTk5LS0tSBC4xGFtSWlFsA0hISEhI + SEhISEhIa3BvYmlTVlFRSz8xNzc3KFtPUWhlgEhISEhISEhISEhrdnBwYmJiYnRWJT0aPD08OFFWUWID + SEhISEhISEhISGtUWFhYWFhkXEFcFjMcQEA3IFNTaAJ/SEhISEhISEhIa1JSUlJSV1wSHD9ncXRTMCUh + FgFTYoBISEhISEhISEhrS0tLS1BoEiAeGhscEkdcTGhbW3Rif0hISEhISEhISGtLTktOWxIdHhobHBob + HBoUIR4KgDpISEhISEhISEhIa1FLS1sKHisbHRsbHhocHisrIikJf0hISEhISEhISEhraVFPCh4vLywa + IBscHhscKi8sDn9ISEhISEhISEhISEhra2tHIyMjIywaHhwbHBwUIwo6SEhISEhISEhISEhISEhISEgT + FiUWFiEcGyAaFBYKf0hISEhISEhISEhISEhISEhISEgVMDAwMBQeGhQlE39ISEhISEhISEhISEhISEhI + SEhISCIjAQEBASAgJiI6SEhISEhISEhISEhISEhISEhISEhISBUWATAuJiUjE0hISEhISEhISEhISEhI + SEhISEhISEhISColLTUzFhNISEhISEhISEhISEhISEhISEhISEhISEhISCAoKCcTSEhISEhISEhISEhI + SEj/8D///gAB//wAAP/4AAD/+AAB//wAA///4H//+HB///AAf//wAB//8AAD//AAAf/wAAH/8AAA//AA + AP/wAAB/8AAAf/AAAD/wAAA/8AAAH/AAAB/wAAAf8AAAP/AAAD/wAAB/+AAA//+AAf//wAP//8AH///g + D///8B////g//ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AExL + SwBeXV0AysnJAM/EwQDEnpEA/vr4AM6bgAC3jHUA27OaAHNwbgDIpYsA7ceoAMitlgD26N0A+OziAPTB + lADou5QA9dS2AP/fwwD138sA//XsAPrz7QD/zJkA+8iYAP/PngD/0qQA/9OnAP/VqgD/1q4A88+sAP/b + tgD/5s0A++bRAP/y5QD48OgA//jxAP/8+QD/ypEA986gAPvVrQD/5McA/+rTAP/u3AD/w3wA/9SgAP/x + 4AD/+vQA/9mmAPDRpwD/470A/9yrAP+tKwD/u0YA/+KwAOnSqAC0p5AAppyKAP/KYwD/6LUA/+27AP/y + zwDf17UA//TAAL25pwD/+8cA//zbAP//0AD//+IAZWVkAL7ArQAAAAAAlqOdAJ61swCc//8AtNXVAPP/ + /wCV+/8AtPr+AJD2/wDL+/8AjfP/AO38/gCI7v8Ai+f3AOD5/QCG6v8Aguf/AJXo/QCl7f8An9zrAIe0 + vgAqwesAfuP/AA+cygAYqdcANbjjAFK63ABsy+oAcdTyADhmdQBwxuIAbLzVAIDP5wDS7fUAEoq2ACir + 2AAwmLsAJnaSADyu1ABk0foAdtv/AJLW7QBZZGgAUMTwALrg7wACc6UAidn9AP39/QD5+fkA9fX1APLy + 8gDm5uYA4eHhAMLCwgCmpqYAmZmZAHNzcwBwcHAAJiYmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhISICA + gICASEhISEhISEhIgIB1dXV1gICASEhISEhIgoKCa3NzaoKCgkhISEhISH5+fmcBAWp+fn5ISEhISEhI + SEhuZmJqSEhISEhISEhIgICAgH6AgkhISEhISEhISGtra2tra2uAgIBISEhISEhrUVFeXl5wa2trgEhI + SEhIa2t0VFRUVFRUS2uASEhISGtrcU9OTk5LS1prgEhISEhrY2tWT09LS0taS2uASEhIa1pea2trVlFR + T1FrgEhISGtPUlBSUmtra2tra4BISEhrT0tLT1FPS0tmgEhISEhISGtRUVFmZmZmZkhISEhISEhIa2tr + SEhISEhISEhISPB/SEjAH2FsgB9ygYAffoLw/0hIgP9ISIAfSEiAD0hIgAdISIAHWnCAA2FrgAN+goAD + gEiAD0hIwB9ISOP/SEgoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAEcAAAB3AAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAdwAAAEcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAA7AAAAdwAA + AI8AAACPAAAAjwAAAI8AAACPAAAAjwF2qf8BcaP/AXGj/wFxpP8Cc6X/AnWn/wJ1qP8Bb6L/AAAAswAA + AJsAAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAAB3AAAAOwAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACMmJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/xWt2f8rwev/Krjf/yu54P8pud7/Krje/yjA + 6v8Ffq//JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8AAACzAAAAdwAAACMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJmZmf9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/x2r1/9Sze3/WNX0/1zc + +/9c2/v/W9b2/0/O8P8JgrP/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/8mJib/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmf+mpqb/pqam/6ampv+mpqb/pqam/6ampv+mpqb/pqam/ySs + 1/9z1u7/hur//4Dm//9/5f//jfL//2zV8f8Ph7f/pqam/6ampv+mpqb/pqam/6ampv+mpqb/pqam/6am + pv8mJib/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmf/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm + 5v/m5ub/5ubm/yus1v+Y3e//qPD//6Ls//+i7f//r/n//4zc8v8Zjr3/5ubm/+bm5v/m5ub/5ubm/+bm + 5v/m5ub/5ubm/+bm5v8mJib/AAAAdwAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmf//8d////Hf///x + 4P//8d////Hg///x4P//8eD///Hg/zKt1f+75e//zff//8fz///H8///0////6/k8v8Zj73///Hf///x + 3///8d////Hf///x3///8d////Hf///x3/8mJib/AAAAOwAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/0222P/a6+///////////////////////9Tu + 9f8VkL7/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf8AAAAjAAAACwAAAAAAAAAAAAAAAAAA + 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 + //8Nn9L/7/n8/6bs//994///feP//33j//994///feP//33j//994///feP//33j//994///feP//33j + //994///feP//33j//994///feP//3Xe/P9e0fL/P77m/wiXxfsADhOoAAAAVwAAABMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAULnc/4jY//8gqdz/r9/v/9D2//+C6P//guj//4Lo//+C6P//guj//4Lo//+C6P//guj//4Lo + //+C6P//guj//4Lo//+C6P//guj//4Lo//+C6P//guj//4Lo//+C6P//f+X//zu75v8ARl7RAAAAfgAA + ACwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAULnc/3/T+/83tej/YL/f//D9//+H7f//h+3//4ft//+H7f//h+3//4ft + //+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//h+3//4ft//+H7f//fuT//3bf + /P8Airj3AAAAnQAAAE8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAULnc/4DT+/9Cu+7/Jara//////+f8v//ivD//4rw + //+K8P//ivD//4rw//+K8P//ivD//4rw//+K8P//ivD//4rw//+K8P//h+3//2zS//9+5P//ivD//4rw + //+K8P//gef//4Xm//8+v9//AD1RyQAAAHUAAAAlAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABULnc/4XV+/9HvfD/KK3g/6/f + 7//O+v//jvT//470//+O9P//jvT//470//+O9P//jvT//470//+O9P//jvT//470//+O9P//dtz//5HR + 5v9v1f//ivD//470//+O9P//hOr//4rm//+Y8vn/AHuk7gAAAJUAAABEAAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEULnc/4vY + /f9SwvX/SL3w/3DG4v/y/v//k/n//5P5//+T+f//k/n//5P5//+T+f//k/n//5P5//+T+f//k/n//5P5 + //+A5v//jdbs//bNn//K0L//euD//5P5//+T+f//iO7//4zm//+z////LbPZ/wAnNLwAAABrAAAAHwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAYoIZULnc/47Z/f9axvn/Wsb5/zGu2///////o/z//5b8//+W/P//lvz//5b8//+W/P//lvz//5b8 + //+W/P//lvz//4Tq//+S2+z/982f///Qnf//zJn/q9fZ/4Tq//+W/P//ivD//5Hm//+7////jOby/wBq + juUAAACPAAAAPQAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAhrNJULnc/4fW/v9hyv3/Ycr9/ze05//P7PX/xv///5n///+Z////mf///5n/ + //+Z////mf///5n///+Z////kPX//4jj+f/n0az//9Og///XpP//1KH/986f/5jg7P+Q9f//jPL//5bm + ///G////xv///xmm0v8AHCWzAAAAYQAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhrNJULnc/4zZ//9mzP//Zsz//1PC9f+AzOb/8v///6f/ + //+i////ov///6L///+i////ov///6L///+W+f//j+z5/+nSrP//06D//92q///dqv//3ar//9Wi//DR + p/+R7fn/jO///5nm///M////zP///4DZ7P8AWXbcAAAAhQAAADEAAAAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhbFKULnc/5Db//9pz///ac///2nP + //8kqtn/z+z1//r////k////1f///8X///+7////rv///6b9//+O9f//4taz///Uof//4q///+Kv///i + r///4q///+Kv///ToP/b2Ln/huz//5zm///S////0v///9L///8NmMX7AAAAoQAAAFUAAAATAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfadOj9by/5jg + //9w1v//cNb//3DW//9by/X/LK/c/1C53P+AzOb/v+by/9/y+f///////////+r+///q9/L//+G+///p + tv//5LH//9mm///ptv//6bb//+m2///ntP//0Z7/vdfM/6Lm///d////3f///93///9vzOb/AEZe0QAA + AH0AAAArAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAibZ9lNfy/4vh//943v//eN7//3je//943v//eN7//3je//9j0vX/TMXs/z295v8cqNn/Tbnf/3DG + 4v+P0un////////y0v//5LH//8yZ///hrv//7rv//+67///uu///6LX//86b/9Xo4f/l////5f///+X/ + ///X+fz/AIq49wAAAJsAAABMAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAjLqMl9jy/5Ln//+A5v//gOb//4Dm//+A5v//gOb//4Dm//+A5v//gOb//37k + //9q0P//hbHL/8Wfh/+PuLT/YL/f////////5sb//+Wy///Mmf//6rf///K////yv///8r///+e0//7P + n//t+fL/6////+v////r////Wb/f/wAyQsQAAABzAAAAIwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjLqMm9ry/5js//+F6///hev//4Xr//+F6///hev//4Xr + //+F6///hOr//3Ta//+LuMz/06CD///NnP//27b/n7uw/2C/3//////////////y5v//8uL///zi///7 + 2///+tT///jJ///ir//91qz/9fz5//T////0////xuz1/wB7pO4AAACSAAAAPgAAAAkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi7mNyuz8/6H0//+P9f//j/X//4/1 + //+P9f//j/X//4/1//+P9f//f+X//4TO5v/Kooz//82c///cuv//1q7//9au/6+8qf9AqMT/YLfP/1C5 + 3P+AzOb/n9ns/7/m8v/v+fz/////////////8ub///z5/////////////////0Cz2f8AHymhAAAASwAA + ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiLaQ3fT//576 + //+U+v//lPr//5T6//+U+v//lPr//5T6//+F6///idPm/8ifiP/7yJf//9u3///dvP//z5///9Sq///V + q///z5///9m0///Mmf/P0L3/v8Gp/4C3vP9wusv/ULLO/2C82P9gv9//gMzm/6/f7//P7PX//////6/f + 7/8AcJavAAAAMQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAk8TH4fX//5n///+Z////mf///5n///+Z////mf///5L4//+J5vf/vaeW//vIl///3Lr//9+////O + nP//3Ln//86c///Zsv//0aP//9Kl///Wrf//zpz//9y5///Mmf//37///+bM///mzP//3r//v7+q/5aj + nf8pconoAHOZ1ACGs8cAY4RKAAAADAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAlsjD5/f//639//+Z////mf///5n///+Z////lvz//5Pv9//Cq5j/9cKU///W + rf//377//9at///Wrf//z6D//9u3///Mmf//3bv//86c///Ysf//0aP//9Gj///atP//zpz//+TI///n + z///58///9q3//zJmf+zh2/yFRANlwAAAEAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlshildbs/9r7//+Z////mf///5n///+Z////lfv//7y4 + qP/zwJP//9iw///r1v//5cv//8yZ///du///0qT//9So///atP//zp3//9+////Mmf//37///86d///Y + sP//37///+vW///r1v//69b//+vW///WrP/quZL/hGRSrwAAACgAAAAFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZ/O4eT1/P+w/v//mf///5n/ + //+Z////vcOy/+26kP//0qb//+3b///t2///7dv//+HD///Mmf//4cL//86d///atf//1ar//9Kl///d + u///zp3//+HD///Mmf//4cL//+3b///t2///7dv//+3b//fdx/+3jnbeAAAANQAAAAoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJbIYnzL + 5v/t/f//yv7//8r+//+618r/7bqQ///Tp///7dz///Dh///w4f//8OH///Dh///atf//zp3//+LG///M + mf//4MH//9Gi///Zs///2rX//9Km///gwv//zJn//+nS///w4f//8OH//evb/8GWfOguIxxKAAAADQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABKfz+CAzOb/gMzm/7/m8v+xxMX/6sev///x5P//8eT///Hk///x5P//8eT///Hk///x + 5P//06f//9On///fv///zp7//+PI///Onv//37///9On///YsP//2rX//9iw///x5P/97N7/2a+U+Eg3 + LWAAAAASAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk8QycMbi/3DG4v9wxuL/qZ2KvPPaxv//9ev///Xr///1 + 6///9ev///Xr///16///8ub//8+e///buP//27j//9Gj///jx///zJn//+bM///Pnv//48f///Lm///1 + 6//rx67/W0Y4dgAAABkAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN2r + iLL66t3///fw///38P//9/D///fw///38P//9/D//+/g///Pn///4sT//9Sq///Xrv//37///8+e///n + z///8uX///fw/+/Pt/+JalSdAAAAIgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAANenhBHjtJLS/vXs///58///+fP///nz///58///+fP///nz///p0v//zJn//+jR///P + n///4MD//9iw///x4v//+fP/9t/M/6yGab4AAAAoAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhsIgy7cSi8P/8+P///Pj///z4///8+P///Pj///z4///8 + +P//4cP//8+f///q1P//zJn///bs///8+P/77+T/t49vzAAAADEAAAAIAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6LaMQvXVuv////////////// + /////////////////////////9mz///WrP//+fL///////zy6v/YrYnnNysiRQAAAAwAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOm4 + jnP649D///////////////////////zw5P////////z5///mzP///////vv4/+3Go/c3KyJFAAAADAAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6rZ/3PO+f81s+f/7/n8/5f4 + //+Q9///kPf//5D3//+Q9///kPf//5D3//+O9f//gNz5/7bPzP+B5///kPf//4bs//+Z8v//Wb/g/wAA + AJ4AAABNAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqtn/c876/1DA + 9P+f2ez/vv7//5f9//+X/f//l/3//5f9//+X/f//l/3//4Dl///lzqz//86b/7PW0v+O9P//i/H//6by + //912ez/ADJCxAAAAHQAAAAmAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeq + 2f940v//Zsz//3DJ7P/f////mf///5n///+Z////mf///5n///+M8v//z9W////Uof//2KX//86b/6vh + 4P+J7///r/L//8j///8biavuAAAAmwAAAFAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAJ6rZ/3/X//9t0///Rb7s/8/s9f/x////2f///9D////G////nvr//9Tav///26j//+Kw///i + sP//4a//+NCh/5vj7P+58v//1f///3jS6f8AMULIAAAAfwAAACkAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAnqtn/iOD//3bc//923P//S8Ts/2XL7P+A0uz/iNHp/7/m8v/f8vn///fu///q + u///z5z//+m3///suf//57T/5tKv/8zy+f/h////0/n8/1m/4P8AAACeAAAATQAAAA4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACeq2f+R6v//g+j//4Po//+D6P//g+j//4Po//9y2P//grLK/7u7 + o/+Py9n///Xs///lvv//1qf///K////yv///5LH/+ty5/+7////u////d8zm/wAaIr0AAAB3AAAAIwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6rZ/4zy//+M8v//jPL//4zy//+M8v//g+n//467 + zP/uu5H//9Sq/8/Ir/9wv9b/j9Lp/7/m8v/v+fz////y////7///7NL///Xs///////v+fz/Wb/g/wAA + AG0AAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqtn/mf///5n///+Z////mf///5D1 + //+Zxc7/6baO///ZtP//1q3//8+e///Ro///0qX/38ei/7/CrP+Purn/r9TZ/4/K2f+f0uD/n9ns/7/m + 8v9WstHtAAAANQAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeq2f+e////mf///5n/ + //+X/f//meLn/+a8lv//1ar//9ew///QoP//0aP//9Km///QoP//06b//9Km///QoP//4cT//+fP///X + sf/aqoX7NE1UvgAxQmMAAAATAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAic/n4cb9 + //+Z////mf///6Hq6P/ftZP//9iw///p0v//0qT//9as///SpP//0qT//9as///Onf//1Kj//9as///p + 0v//69b//+nS//zTq/+QbFu2AAAAKAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAnptFi1vL5/8z///+08/D/4LeU///Xr///8OD///Dg///u3P//zp3//9q0///Tpv//06b//9ev///R + ov//06b//+PF///w4P/869r/uJeB1QAAADMAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABwxuL/cMbi/3DG4v++vbH///Pm///z5v//8+b///Pm///s2P//zp3//9at///T + p///0aP//9Oo///Tp///4MH///Pm/8+sk+cyJx9GAAAADAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANalhCHvz7fw//bu///27v//9u7///bu///n + z///1Kj//9Gk///Zs///0aP//9+////27v/dv6fwLCIbUAAAABAAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyshzL34c7///r1///6 + 9f//+vX///r1///gwf//2LD//8+f///gwf//9+//+Na2/19KOnMAAAAUAAAAAgAAAAAAAAAAAAAAAAAA + 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 + + + + + AAABAAwAMDAQAAAAAABoBgAAxgAAACAgEAAAAAAA6AIAAC4HAAAYGBAAAAAAAOgBAAAWCgAAEBAQAAAA + AAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ + AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm + AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAAAAAAA//8AAP// + /wDd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d + 3d3d3d3d3d3d3d3d3d3d3d3d3d3QAAAAAADd3d3d3d3d3d3d3d3d3d3d3d0DMzMzMzMADd3d3d3d3d3d + 3d3d3d3d3dA7ODg4ODgzMADd3d3d3d3d3d3d3d3d3QO/g4ODg4ODgzMADd3d3d3d3d3d3d3d0Dv7ODg4 + ODg4ODgzMA3d3d3d3d3d3d3d07+/g4ODg4ODg4ODgzDd3d3d3d3d3d3d0/v7ODg4ODg4ODg4ODMN3d3d + 3d3d3d3d07+/g4ODg4ODg4ODg4Mw3d3d3d3d3d3d0/v7ODg4ODg4NwA4ODgzDd3d3d3d3d3d07+/g4OD + g4ODhwCDg4ODDd3d3d3d3d3d0/v7ODg4ODg4NwA4ODgzDd3d3d3d3d3d07+/g4ODg4ODhwCDg4ODDd3d + 3d3d3d3d0/v7ODg4ODg4MAA4ODgzDd3d3d3d3d3d07+/g4ODg4ODgAADg4ODDd3d3d3d3d3d0/v7ODg4 + ODg4MAAIODgzDd3d3d3d3d3d07+/g4ODg4ODhwADg4ODDd3d3d3d3d3d0/v7ODg4ODg4NwB4ODgzDd3d + 3d3d3d3d07+/g4ODg4ODhwCDg4ODDd3d3d3d3d3d0/v7ODg4ODg4ODg4ODgzDd3d3d3d3d3d078zAAAA + B3Nzg4ODg4ODDd3d3d3d3d3d0/MAi4uLcAAINzg4ODgzDd3d3d3d3d3d0zC4cAB3uLhwAIODg4ODDd3d + 3d3d3d3d0wuLMzMHi4uLhwAIODgzDd3d3d3d3d3d07i4OLMHuLi4uLiwg4ODDd3d3d3d3d3d3TuLO4MH + i4uLi4uLADgzDd3d3d3d3d3d3dO4OLMHuLi4uLi4uAODDd3d3d3d3d3d3d07O4MHi4uLi4cAO4AzDd3d + 3d3d3d3d3d3TOLMHuLi4uHAzA7gDDd3d3d3d3d3d3d3dO4MHi4uLi3A7MIuADd3d3d3d3d3d3d3dOLMD + Mzu4uHA4MLizDd3d3d3d3d3d3d3dO4MN3dMzi3A7MIuA3d3d3d3d3d3d3d3dOLMN3d3dMzA4MLg93d3d + 3d3d3d3d3d3dO4MN3d3d3dA7MDPd3d3d3d3d3d3d3d3dOLgw3d3d3dA4MN3d3d3d3d3d3d3d3d3d04uA + 3d3d3dA7MN3d3d3d3d3d3d3d3d3d07izDd3d3QO4MN3d3d3d3d3d3d3d3d3d0zuLMN3d3QuLMN3d3d3d + 3d3d3d3d3d3d3TO4swAAALi4MN3d3d3d3d3d3d3d3d3d3dOLi4uLi4uDDd3d3d3d3d3d3d3d3d3d3d0z + uLi4uLgw3d3d3d3d3d3d3d3d3d3d3d3dMzuLi4MN3d3d3d3d3d3d3d3d3d3d3d3d3TMzMz3d3d3d3d3d + 3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d + 3d3d3d3d3d3d3d3d3d3///////8AAP///////wAA////////AAD/+AD///8AAP/wAB///wAA/+AAA/// + AAD/wAAAf/8AAP+AAAAf/wAA/4AAAA//AAD/gAAAB/8AAP+AAAAD/wAA/4AAAAH/AAD/gAAAAf8AAP+A + AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/ + AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/wAAAAf8AAP/g + AAAB/wAA//AAAAH/AAD/+AAAAf8AAP/8AAAB/wAA//wAAAH/AAD//B4AA/8AAP/8H8AH/wAA//wf+A// + AAD//A/4P/8AAP/+D/g//wAA//4H8D//AAD//gPwP/8AAP//AAA//wAA//+AAH//AAD//8AA//8AAP// + 8AH//wAA///8B///AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ + AAAA//8A/wAAAAAAAAD//wAA////AN3d3dAAAAAA3d3d3d3d3d3d3d0DMzMzMwAh3d3d3d3d3d3QPzg4 + ODgzMwDd3d3d3d3dA/uDg4ODg4MzAN3d3d3d3T+/ODg4ODg4ODMN3d3d3d07+4ODg4ODg4ODMN3d3d3d + P784ODg4OAA4ODMN3d3d3Tv7g4ODg4MAg4ODDd3d3d0/vzg4ODg4ADg4OA3d3d3dO/uDg4ODgACDg4MN + 3d3d3T+/ODg4ODAACDg4Dd3d3d07+4ODg4OAAAODgw3d3d3dP784ODg4OAB4ODgN3d3d3Tv7g4ODg4MA + g4ODDd3d3d0/vwAACDg4dzg4OA3d3d3dOwC4uHAAh4ODg4MN3d3d3TC4cAeLhwAIeDg4Dd3d3d07iwdw + uLi4cAeDgw3d3d3d07g4sHuLi4uACDgN3d3d3d07O4C4uLi4t7CDDd3d3d3d0ziwi4uLhwB7CA3d3d3d + 3d07gLi4uLA4CLAN3d3d3d3dOLAzO4uAuAuDDd3d3d3d3TuA3dMzMDsIMN3d3d3d3d04sN3d3dC4Aw3d + 3d3d3d3dO4Dd3d3QOw3d3d3d3d3d3dO4Dd3d0LgN3d3d3d3d3d3Ti4Dd3QiLDd3d3d3d3d3d3Ti4AACI + uA3d3d3d3d3d3d3Ti4uLi4Dd3d3d3d3d3d3d3TO4uLMN3d3d3d3d3d3d3d3dMzM93d3d3d3d/gD///wA + D//4AAP/8AAA//AAAH/wAAA/8AAAH/AAAB/wAAAf8AAAH/AAAB/wAAAf8AAAH/AAAB/wAAAf8AAAH/AA + AB/wAAAf+AAAH/wAAB/+AAAf/wAAH/8AAB//DgA//w/gf/8P4f//h+H//4PB///AAf//4AP///AH///8 + H/8oAAAAGAAAADAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AN3d0AAAAN3d3d3d3d3d + AzMzMwAN3d3d3d3QOzg4ODMwAN3d3d3Tv4ODg4ODMw3d3d3T+zg4ODh4ODDd3d3Tv4ODg4MHg4Dd3d3T + +zg4ODcHODDd3d3Tv4ODg4AAg4Dd3d3T+zg4ODAAODDd3d3Tv4ODg4cHg4Dd3d3T+wAAODcHODDd3d3T + s4uHAIODg4Dd3d3TOHB4twA4ODDd3d3TizsLi4sAA4Dd3d3dODgIuLi4sDDd3d3d0zsLi4twewDd3d3d + 3TgDOLgICLDd3d3d3TsN0zMLC4Hd3d3d3TgN3d0IA13d3d3d3TsN3d0LDd3d3d3d3dOw3d0IDd3d3d3d + 3d07AACLDd3d3d3d3d3TuLiz3d3d3d3d3d3dMzM93d3d3fgP/7jwAf+L4AA/COAAH93gAA874AAPuOAA + D7DgAA/d4AAP0+AAD4vgAA974AAP3eAAD93gAA+48AAPCPgAD938AA/d/GAPO/x8Hwv8fH/d/jx/3f8A + f9P/gP8I/8H/3SgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA + AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAAAAAAAP//AAD///8A3dAAAN3d + 3d3dO3ODAA3d3d0/ODg3MN3d3Ttzg4CDDd3dPzg4ADgw3d07c4MAA4Dd3T84ODAIMN3dOwAAh4OA3d0w + d7gAODDd3Tswe4sAgN3d0zC4uHcA3d3dMDOLA4Dd3d0w3TMDPd3d3TAN3QPd3d3d0wAAA93d3d3dMzM9 + 3d3g/93dwB+zi8APg4PAB93dwAM4cMADADjAA93dwAOLO8ADiwDAA93d4AM4OPADuLjzB93d8c/TO/gP + i3D8H93dKAAAADAAAABgAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAJn/ + /wAAmcwAnP//AKP//wCm//8As///ALv//wC8//8Axf//AI/4/ACW/P8AjubpAJ39/wCs/P8Avvz+AMr+ + /wDR/v8A5f7/AIby+QCN9vwAk/n/AJ/6/wDZ/f8AfOz1AIPv+QCP9v8Akvj/ALb5/gDx/f4Ac+XyAH3m + 8gCI7PYAjvT/AOv8/gBu4fIAi/D/AIzy/wCG5vIAlfH/AI3m8gCu9f4A4/v+AGDZ7ABq3vIAiO7/AHC3 + xACY5vIApvH+AKPm8gDL9fwA1PX7AOD6/gDn+v0AQ8biAE3M5gCD6f8Ahev/AIbs/wCc7/8Aw/P8AOr6 + /QDs+/4AOb/fAFXP6wBl2PIAguf/AHnU6ACI6P8AdrG/AKPt/gDd9fsA5/f7AO77/gAmstkAMLncAD3A + 4gBQyewATsTlAF/R8gBk1fQAcNz5AHfg/AB02vUAfuP/AH/k/wCA5f8AYazBAHLD2AB6zOMAEKPSABCT + vgAThqwAF6HKABml0QAaqdYAHazWAB6k0AAirtkAIabSAB2QtgAlp84AK7LeADa43wA8tdwARcHpAFq8 + 3ABs2PkAWKzHAHje/wBrxeIAeuD/AHvh/wBVmK4AO11oAIfR6ACZ2OsAS2VtALXk8gDB6fUA0e/4AAOb + zgADms0AA5bIAASbzgAGnM8AB53QAAid0AAJntEACp7RAAuf0gAKkMEADZ/SAA2bywAMibcAD6HUAA+g + 0wAQodQAEqLVABCVwwATo9YAFKPWABObygAVpNcAF6XYABel1wAYpdgAG6faABun2QAans4AFoiuAB2o + 2wAdqdkAHqjbAB6q2QAfp9cAHJbDABmCpQAiqt0AIpS7ACeeyQAfdZIAMKzWACWEpAAkcIoANZa6ACp2 + kAA7pMcASsPtAEa64QA1gpwATLjcAFC95QBYy/IAN3CEAG3U+QB12/8Adtr/AHfd/wA4ZXQAfN7/AI/S + 6QCs6f8Aa46aAICmswBJXGMAY2ZnACWs3wAoreAALK/iAC2w4gAwseQAMbLkADOz5gAzs+UANbPmADW1 + 5gA6tukAOrLjAD646wBCteEAUMLyAFrA6ABiz/kAa9T8AGzT+wBv1f8Acdf/AHLY/wBpeoEAEX2rABd1 + ngBCuu0ASL3wAEu+8QBNv/IAT8H0AE/B8wBTw/YAVcT2AFXD9gBXxfgARJK2AGPN/ABly/oAac//AGrQ + /wBt0/8AW3yLAKfg+QBSW18AQ6jZAD2XxABKt+sAQaHPADyOtgA6iK0AOIClAF3H+gBfyfwAYsr9AGTL + /gBmzP8ARn+cAFN+lAAdbpoAJnWgADF0mABEl8MAUKraACBkjQB3d3cAcHBwAGxsbAACAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv7+/v7+/gICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICc6yYn6iosHe8/v4CAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgKnpEnn3dvbxr6PXqO1vP7+AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AqF+ah+45OTk5OTk4cvGloijd7z+AgICAgICAgICAgICAgICAgICAgICAgICAgICnoSMahS40NDQ0NDQ + 0NDQ0NCqaF2md/4CAgICAgICAgICAgICAgICAgICAgICAgJnj5SUahlI0tLS0tLS0tLS0tLS0s6qitW7 + /gICAgICAgICAgICAgICAgICAgICAgKBm5ubahJIsrKysrKysrLS0NKysrKysq9co+j+AgICAgICAgIC + AgICAgICAgICAgKCvb29aQk9b29vb29vb2+y4uLQsm9vb29va110/gICAgICAgICAgICAgICAgICAgKE + v7+/aRApcnJycnJycnJvzOnrz3JycnJycm2Ttf4CAgICAgICAgICAgICAgICAgKGw8PDaQYpWFhYWFhY + WFhXzOzpsVhYWFhYWFhRBP4CAgICAgICAgICAgICAgICAgKKx8fHaQ8jOjo6Ojo6Ojo6zOrsVTo6Ojo6 + OjpSBP4CAgICAgICAgICAgICAgICAgKL1tbJyj5IOzs7Ozs7OzxF4O3qVTs7Ozs7OztDBP4CAgICAgIC + AgICAgICAgICAgKM19fXqz4yLy8vLy8vLyNZ7+7tbCcvLy8vLy9DBP4CAgICAgICAgICAgICAgICAgKP + 2traqzQrJycnJycnJxcw9e/u7QwnJycnJycuBP4CAgICAgICAgICAgICAgICAgKR3NzcqzUrHBwcHBwc + HB0O9vXv7iIcHBwcHBwuBP4CAgICAgICAgICAgICAgICAgKS8PDwrjUeFxcXFxcXFxcdR/b1biMXFxcX + FxclBP4CAgICAgICAgICAgICAgICAgKU8/PzrkkeDQ0NDQ0NDQ0dR+b2RRcNDQ0NDQ0gBP4CAgICAgIC + AgICAgICAgICAgKW9PT0rjYRAwMDAwMDAwMXR9PmRQMDAwMDAwMgBP4CAgICAgICAgICAgICAgICAgKW + 5eXlrjcRBQUFBQUFBQUXWrnTWwUFBQUFBQUgBP4CAgICAgICAgICAgICAgICAgKa0tLSzEASBwcHBwcH + BwcYRrPltgcHBwcHBwchBP4CAgICAgICAgICAgICAgICAgKctLS0zB8kS0tAJCwZExIKCAgQPQgICAgI + CAgoBP4CAgICAgICAgICAgICAgICAgJkWFhTq3h2W3V4eEtLQCQ/NxkTCwoKCgoKCgoqBP4CAgICAgIC + AgICAgICAgICAgJkO0JhUKf6+srYwKDKbHV5S0BAPywTEgsLCwsxBP4CAgICAgICAgICAgICAgICAgJk + aUEM7tXU1Pf7897Z18CZna11ektLQDYTExMxBP4CAgICAgICAgICAgICAgICAgIEQQMD+Xx+fn3v4/Tw + 29jJxMCTg2V1ektLFBkzBP4CAgICAgICAgICAgICAgICAgIEOAMDWn6Kin7gsuX0897Z1sXCvZeNe2w1 + Hx94BP4CAgICAgICAgICAgICAgICAgICY0wVA4CZmX8mOnHS4/Tw29jI+Pz394gEcEp4BP4CAgICAgIC + AgICAgICAgICAgICAgJjY4O+voINHDxXsuX089zq1X6Ee9WQe2W3BP4CAgICAgICAgICAgICAgICAgIC + AgICAobDwYQDAxcmRHHS4/T71JGZlYielIQEBP4CAgICAgICAgICAgICAgICAgICAgICAonJx4otDAMN + IzxWsuX0oqS/voWkoJaBuQICAgICAgICAgICAgICAgICAgICAgICAozX14ylBAQEGhcmRHHRxqTFw4zH + xKCNAgICAgICAgICAgICAgICAgICAgICAgICApHd3JH/AgICBARMTqpRaKTJyY7ZwYcCAgICAgICAgIC + AgICAgICAgICAgICAgICApTx8ZS8AgICAgICBAQEl6TX1wSNqQICAgICAgICAgICAgICAgICAgICAgIC + AgICAmX09L+1AgICAgICAgICAqTf314CAgICAgICAgICAgICAgICAgICAgICAgICAgICAmXN0KqjAgIC + AgICAgICAqTy8V4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVrcW+Q6AICAgICAgICAqT09F4C + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgJcOjpPowICAgICAgICAqTS0ZgCAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgJcQicnZLUCAgICAgIColRWUqUCAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICYAwNFmd0AgICAgK6aC88QqwCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAk0DAwxi + puj//eaQGxcdZgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJBAwMDLUxdX0EVAwMaZgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICTQwDAwMDAwMDAwxnAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAmAtAwMDAwMDIGACAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgJgYEE5QjliogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AmJiYmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgL///////8AAP///////wAA//wP////AAD/+AD///8AAP/wAA///wAA/+AAAf// + AAD/wAAAf/8AAP+AAAAf/wAA/4AAAAf/AAD/gAAAA/8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+A + AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/ + AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP/A + AAAB/wAA//AAAAH/AAD//AAAAf8AAP/8AAAD/wAA//wAAAf/AAD//BwAD/8AAP/8H4Af/wAA//wf+H// + AAD//B/4f/8AAP/8D/h//wAA//4P+H//AAD//gfwf/8AAP//A+B//wAA//+AAP//AAD//8AA//8AAP// + 4AH//wAA///wA///AAD///gH//8AAP///g///wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAmf//AACZzACc//8Ao///AKb//wCz//8Au///ALz/ + /wDF//8Aj/j8AJb8/wCO5ukAnf3/AKz8/wC+/P4Ayv7/ANH+/wDl/v8AhvL5AI32/ACT+f8An/r/ANn9 + /wB87PUAg+/5AI/2/wCS+P8Atvn+APH9/gBz5fIAfebyAIjs9gCO9P8A6/z+AG7h8gCL8P8AjPL/AIbm + 8gCV8f8AjebyAK71/gDj+/4AYNnsAGre8gCI7v8AcLfEAJjm8gCm8f4Ao+byAMv1/ADU9fsA4Pr+AOf6 + /QBDxuIATczmAIPp/wCF6/8Ahuz/AJzv/wDD8/wA6vr9AOz7/gA5v98AVc/rAGXY8gCC5/8AedToAIjo + /wB2sb8Ao+3+AN31+wDn9/sA7vv+ACay2QAwudwAPcDiAFDJ7ABOxOUAX9HyAGTV9ABw3PkAd+D8AHTa + 9QB+4/8Af+T/AIDl/wBhrMEAcsPYAHrM4wAQo9IAEJO+ABOGrAAXocoAGaXRABqp1gAdrNYAHqTQACKu + 2QAhptIAHZC2ACWnzgArst4ANrjfADy13ABFwekAWrzcAGzY+QBYrMcAeN7/AGvF4gB64P8Ae+H/AFWY + rgA7XWgAh9HoAJnY6wBLZW0AteTyAMHp9QDR7/gAA5vOAAOazQADlsgABJvOAAaczwAHndAACJ3QAAme + 0QAKntEAC5/SAAqQwQANn9IADZvLAAyJtwAPodQAD6DTABCh1AASotUAEJXDABOj1gAUo9YAE5vKABWk + 1wAXpdgAF6XXABil2AAbp9oAG6fZABqezgAWiK4AHajbAB2p2QAeqNsAHqrZAB+n1wAclsMAGYKlACKq + 3QAilLsAJ57JAB91kgAwrNYAJYSkACRwigA1lroAKnaQADukxwBKw+0ARrrhADWCnABMuNwAUL3lAFjL + 8gA3cIQAbdT5AHXb/wB22v8Ad93/ADhldAB83v8Aj9LpAKzp/wBrjpoAgKazAElcYwBjZmcAJazfACit + 4AAsr+IALbDiADCx5AAxsuQAM7PmADOz5QA1s+YANbXmADq26QA6suMAPrjrAEK14QBQwvIAWsDoAGLP + +QBr1PwAbNP7AG/V/wBx1/8Actj/AGl6gQARfasAF3WeAEK67QBIvfAAS77xAE2/8gBPwfQAT8HzAFPD + 9gBVxPYAVcP2AFfF+ABEkrYAY838AGXL+gBpz/8AatD/AG3T/wBbfIsAp+D5AFJbXwBDqNkAPZfEAEq3 + 6wBBoc8API62ADqIrQA4gKUAXcf6AF/J/ABiyv0AZMv+AGbM/wBGf5wAU36UAB1umgAmdaAAMXSYAESX + wwBQqtoAIGSNAHd3dwBwcHAAbGxsAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgIC/v7+/v7+AgICAgICAgICAgICAgICAgICAgICAgIChzBuoaelqLW8/v4CAgICAgICAgICAgICAgIC + AgICAoeHcLjk5OTh2Maho3e8/gICAgICAgICAgICAgICAgJqhIxwuNDQ0NDQ0NDOa6Kw6P0CAgICAgIC + AgICAgICAmqZm3BIsrKysrLS5dGyss2kpuj/AgICAgICAgICAgICar6+cClvb29vb7Ku39Fvb2+vZuj+ + AgICAgICAgICAgJqxMRwKVdYWFhYVvvpU1dYWFhRBP4CAgICAgICAgICAmrHx3AYOjs7Ozty+uxVOjs7 + O1IE/gICAgICAgICAgICatfYcB4vLy8vJjDup3AmLy8vQwT+AgICAgICAgICAgJq3NxwHiMjIyMcW/Xu + bh0jIyMuBP4CAgICAgICAgICAmrw8HALFxcXFxcdc/VwDBcXFyUE/gICAgICAgICAgICavT0cDQDAwMD + Axe59kUDAwMDIAT+AgICAgICAgICAgJq5eRbEwMDAwMDIzC5dQMDAwMgBP4CAgICAgICAgICAmqysls3 + ExISEgkIPUYpEBAQECgE/gICAgICAgICAgICalhRbFu3dnhJJD82ExIRCgoKKgT+AgICAgICAgICAgJq + TlD59/f72sfKzLd5QDcZExIxBP4CAgICAgICAgICAmotItUEBO7j8NvWxJtMcHofFDME/gICAgICAgIC + AgICAmIVOJSPQm/l897YyPj31Ol6SgT+AgICAgICAgICAgICAmJiv5kgJ1bS4/Dq1IaFmIG3BAICAgIC + AgICAgICAgICAmLHvi0DHTtv5cyQvouhmYS5AgICAgICAgICAgICAgICYtnHn6k4LSFW0r7EltbAogIC + AgICAgICAgICAgICAgJi8dd3AgICpOlqlNm+vqkCAgICAgICAgICAgICAgICAmLL8aYCAgICAgKt8L/+ + AgICAgICAgICAgICAgICAgICYmtxougCAgICAq3jxf4CAgICAgICAgICAgICAgICAgICYi9Dpv8CAgIC + rXHH/gICAgICAgICAgICAgICAgICAgJiQg1BdP8CArpQO0H+AgICAgICAgICAgICAgICAgICAgJiGgM5 + 1bWwogwNpwICAgICAgICAgICAgICAgICAgICAgJiLgMMbGwDAzm6AgICAgICAgICAgICAgICAgICAgIC + AgJiYhoDAxVqRwICAgICAgICAgICAgICAgICAgICAgICAgICYmJiYgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgL//////4H///4AP//8AAf/+AAB//gAAH/4AAA/+AAAP/gA + AD/4AAA/+AAAP/gAAD/4AAA/+AAAP/gAAD/4AAA/+AAAP/gAAD/8AAA//gAAf/8AAH//AAD//w4B//8P + w///B8P//4PD//+Bg///wAf//+AH///wD////D///////ygAAAAYAAAAMAAAAAEACAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAACZ//8AAJnMAJz//wCj//8Apv//ALP//wC7//8AvP//AMX/ + /wCP+PwAlvz/AI7m6QCd/f8ArPz/AL78/gDK/v8A0f7/AOX+/wCG8vkAjfb8AJP5/wCf+v8A2f3/AHzs + 9QCD7/kAj/b/AJL4/wC2+f4A8f3+AHPl8gB95vIAiOz2AI70/wDr/P4AbuHyAIvw/wCM8v8AhubyAJXx + /wCN5vIArvX+AOP7/gBg2ewAat7yAIju/wBwt8QAmObyAKbx/gCj5vIAy/X8ANT1+wDg+v4A5/r9AEPG + 4gBNzOYAg+n/AIXr/wCG7P8AnO//AMPz/ADq+v0A7Pv+ADm/3wBVz+sAZdjyAILn/wB51OgAiOj/AHax + vwCj7f4A3fX7AOf3+wDu+/4AJrLZADC53AA9wOIAUMnsAE7E5QBf0fIAZNX0AHDc+QB34PwAdNr1AH7j + /wB/5P8AgOX/AGGswQByw9gAeszjABCj0gAQk74AE4asABehygAZpdEAGqnWAB2s1gAepNAAIq7ZACGm + 0gAdkLYAJafOACuy3gA2uN8APLXcAEXB6QBavNwAbNj5AFisxwB43v8Aa8XiAHrg/wB74f8AVZiuADtd + aACH0egAmdjrAEtlbQC15PIAwen1ANHv+AADm84AA5rNAAOWyAAEm84ABpzPAAed0AAIndAACZ7RAAqe + 0QALn9IACpDBAA2f0gANm8sADIm3AA+h1AAPoNMAEKHUABKi1QAQlcMAE6PWABSj1gATm8oAFaTXABel + 2AAXpdcAGKXYABun2gAbp9kAGp7OABaIrgAdqNsAHanZAB6o2wAeqtkAH6fXAByWwwAZgqUAIqrdACKU + uwAnnskAH3WSADCs1gAlhKQAJHCKADWWugAqdpAAO6THAErD7QBGuuEANYKcAEy43ABQveUAWMvyADdw + hABt1PkAddv/AHba/wB33f8AOGV0AHze/wCP0ukArOn/AGuOmgCAprMASVxjAGNmZwAlrN8AKK3gACyv + 4gAtsOIAMLHkADGy5AAzs+YAM7PlADWz5gA1teYAOrbpADqy4wA+uOsAQrXhAFDC8gBawOgAYs/5AGvU + /ABs0/sAb9X/AHHX/wBy2P8AaXqBABF9qwAXdZ4AQrrtAEi98ABLvvEATb/yAE/B9ABPwfMAU8P2AFXE + 9gBVw/YAV8X4AESStgBjzfwAZcv6AGnP/wBq0P8AbdP/AFt8iwCn4PkAUltfAEOo2QA9l8QASrfrAEGh + zwA8jrYAOoitADiApQBdx/oAX8n8AGLK/QBky/4AZsz/AEZ/nABTfpQAHW6aACZ1oAAxdJgARJfDAFCq + 2gAgZI0Ad3d3AHBwcABsbGwAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv7+/v7+AgICAgIC + AgICAgICAgICAgICc0enpaiwd//9AgICAgICAgICAgICAgLgfiTk5OTLyaKjd7wCAgICAgICAgICAmqJ + jBPQ0NDQ0NDja2Z0vAICAgICAgICAmqbmwhxcXFx0q7PcXFrpf0CAgICAgICAmq+vgVEREREcuqxRERE + BP4CAgICAgICAmrIxT4vLy8vbu1wLy8vBP4CAgICAgICAmrW1jQcHBwdMO9uHRwcBP4CAgICAgICAmrZ + 2UkDAwMDHPZwAwMDBP4CAgICAgICAmrLyz8GBg8GJrlFBgYGBP4CAgICAgICAmpRUR8kSzY2Eys9CAgI + BP4CAgICAgICAmpNotXVpFFwdnk/LBkSBP4CAgICAgICAmpMDo2DreTe1r+pMHpLBP4CAgICAgICAgJi + TkyWLkSy8srViIhbBP4CAgICAgICAgICAmq/QhYmcuKXvpCbjQICAgICAgICAgICAq3JrAJOTk9M1paW + AgICAgICAgICAgICAmzfsAICAgJq358CAgICAgICAgICAgICAmxUp7wCAgLpzqwCAgICAgICAgICAgIC + AgJiJay8/f1qWKwCAgICAgICAgICAgICAgJiLS2nbKUaLbkCAgICAgICAgICAgICAgICYmIDIAMaqQIC + AgICAgICAgICAgICAgICAgJiYmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC////Av4P + /xX8Af9C+AB/3vAAH/fwAA9K8AAPAvAADwLwAA8C8AAPYvAADyDwAA/j8AAPhvAAD7f4AA8C/gAfAv4g + PwL+PH8C/hx/Lf8Af2//AH++/4D/hP/h/wL///8CKAAAABAAAAAgAAAAAQAIAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8AAAAAAJn//wAAmcwAnP//AKP//wCm//8As///ALv//wC8//8Axf//AI/4 + /ACW/P8AjubpAJ39/wCs/P8Avvz+AMr+/wDR/v8A5f7/AIby+QCN9vwAk/n/AJ/6/wDZ/f8AfOz1AIPv + +QCP9v8Akvj/ALb5/gDx/f4Ac+XyAH3m8gCI7PYAjvT/AOv8/gBu4fIAi/D/AIzy/wCG5vIAlfH/AI3m + 8gCu9f4A4/v+AGDZ7ABq3vIAiO7/AHC3xACY5vIApvH+AKPm8gDL9fwA1PX7AOD6/gDn+v0AQ8biAE3M + 5gCD6f8Ahev/AIbs/wCc7/8Aw/P8AOr6/QDs+/4AOb/fAFXP6wBl2PIAguf/AHnU6ACI6P8AdrG/AKPt + /gDd9fsA5/f7AO77/gAmstkAMLncAD3A4gBQyewATsTlAF/R8gBk1fQAcNz5AHfg/AB02vUAfuP/AH/k + /wCA5f8AYazBAHLD2AB6zOMAEKPSABCTvgAThqwAF6HKABml0QAaqdYAHazWAB6k0AAirtkAIabSAB2Q + tgAlp84AK7LeADa43wA8tdwARcHpAFq83ABs2PkAWKzHAHje/wBrxeIAeuD/AHvh/wBVmK4AO11oAIfR + 6ACZ2OsAS2VtALXk8gDB6fUA0e/4AAObzgADms0AA5bIAASbzgAGnM8AB53QAAid0AAJntEACp7RAAuf + 0gAKkMEADZ/SAA2bywAMibcAD6HUAA+g0wAQodQAEqLVABCVwwATo9YAFKPWABObygAVpNcAF6XYABel + 1wAYpdgAG6faABun2QAans4AFoiuAB2o2wAdqdkAHqjbAB6q2QAfp9cAHJbDABmCpQAiqt0AIpS7ACee + yQAfdZIAMKzWACWEpAAkcIoANZa6ACp2kAA7pMcASsPtAEa64QA1gpwATLjcAFC95QBYy/IAN3CEAG3U + +QB12/8Adtr/AHfd/wA4ZXQAfN7/AI/S6QCs6f8Aa46aAICmswBJXGMAY2ZnACWs3wAoreAALK/iAC2w + 4gAwseQAMbLkADOz5gAzs+UANbPmADW15gA6tukAOrLjAD646wBCteEAUMLyAFrA6ABiz/kAa9T8AGzT + +wBv1f8Acdf/AHLY/wBpeoEAEX2rABd1ngBCuu0ASL3wAEu+8QBNv/IAT8H0AE/B8wBTw/YAVcT2AFXD + 9gBXxfgARJK2AGPN/ABly/oAac//AGrQ/wBt0/8AW3yLAKfg+QBSW18AQ6jZAD2XxABKt+sAQaHPADyO + tgA6iK0AOIClAF3H+gBfyfwAYsr9AGTL/gBmzP8ARn+cAFN+lAAdbpoAJnWgADF0mABEl8MAUKraACBk + jQB3d3cAcHBwAGxsbAACAgICAgICAgICAgICAgICAgICAgL9/f39AgICAgICAgICAgKKjIyMtej+AgIC + AgICAgJqij7S0oyM7ugCAgICAgICar0HclavbYmr/gICAgICAmrDKy8v4EUvBP4CAgICAgJqyz4XF25w + DQT+AgICAgICatE2CBBbKAUE/gICAgICAmquR7fnehk0ff4CAgICAgICYuDui4zWdgT+AgICAgICAgJi + jLGx7vV8AgICAgICAgICYrwCAmykcwICAgICAgICAmK8AgJsc2ICAgICAgICAgJiLry8QnMCAgICAgIC + AgICAmItGi1iAgICAgICAgICAgICYmJiAgICAgIC//8E/vh/AgLwHwIC4A9RH+AHNjbgBz0I4AcE/uAH + AgLgBwIC8Aei1fgPUXD5jz8s+Y8E/vgfAgL8HwIC/j8OjSgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAAEAAAABkAAAAfAAAAHwAAABkAAAAWAAAAEQAAAAkAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAlAAAATAAAAGQAAABwAAAAbgAAAGQAAABcAAAAUgAA + AEEAAAAxAAAAJAAAABkAAAAOAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAAC0AZYaqAGGBywB9p+kAdJvmAFt61wBc + e9QASWLIACk3sgAAAJgAAACLAAAAeQAAAGQAAABNAAAANwAAACcAAAAZAAAACgAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAANAB5ocowrNb/3/L5/6fg + +f9VxPX/T8Hy/0/B8v81teb/KK7f/xSj1v8Ae6TuAGKD3gA+U8QADxSkAAAAkAAAAHwAAABiAAAARAAA + ACsAAAAXAAAACQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAJTFDAISw3QSb + zv8+tNr/8P///67o//9q0P//atD//2rQ//9q0P//atD//2rQ//9jzfz/UMLy/zW15v8bp9n/AIKu8wBi + g94AKDW5AAAAlwAAAH8AAABfAAAAPQAAAB8AAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3 + SS0Ai7rkDJ/S/xOi1f89tdv/5P///6rq//9v1f//b9X//2/V//9v1f//b9X//2/V//9v1f//b9X//2/V + //9v1f//b9X//0zC7/8qsN//B4689wBZd9sAHCWyAAAAjwAAAGoAAAA/AAAAHAAAAAcAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAKVxtcUo9b/GKXY/xil2P87tdz/2P///6bs//9y2P//ctj//3LY//9y2P//ctj//3LY + //9y2P//ctj//3LY//9y2P//ctj//3LY//9y2P//a9T8/0jB7P8OodL/AGqO5QAbJLYAAACPAAAAZAAA + ADMAAAAQAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAid0P8eqNv/Hqjb/x6o2/86tt3/zP///6Ht//912///ddv//3Xb + //912///ddv//3Xb//912///ddv//3PZ//9u1P//ctj//3Xb//912///ddv//3Xb//912///WMvy/w+i + 0v8AYYLhAA4TrAAAAH4AAABGAAAAFwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAme0f8lrN//Jazf/yWs3/84t97/u////5zv + //943v//eN7//3je//943v//eN7//3je//943v//eN7//3Ta//9ly/r/Zcv6/27U//902v//eN7//3je + //943v//eN7//3je//9EwOn/CI+89wAmM8AAAACOAAAATAAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuf0v8sr+L/LK/i/yyv + 4v83uN7/rv///5fw//974f//e+H//3vh//974f//e+H//3vh//974f//e+H//3je//9cv+v/QqfX/0q3 + 6/9s0/v/e+H//3vh//974f//e+H//3vh//974f//bNj5/xen1v8AO0/OAAAAfwAAACcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2f + 0v8zs+b/M7Pm/zOz5v81ud//o////5Py//+A5f//gOX//4Dl//+A5f//gOX//4Dl//+A5f//gOX//3/k + //9cv+v/QaDO/0Op2v9t1Pn/gOX//4Dl//+A5f//gOX//4Dl//+A5f//gOX//2DS8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAA+g0/86tun/Orbp/zq26f83ueD/nf3//470//+D6f//g+n//4Pp//+D6f//g+n//4Pp + //+D6f//g+n//4Pp//9cv+v/P5jE/0Gh0P902vX/g+n//4Pp//+D6f//g+n//4Pp//+D6f//g+n//2LV + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABCh1P9Buez/Qbns/0G57P9Bt+D/wPP8/6Lv/f+F6///hev//4Xr + //+F6///hev//4Xr//+F6///huz//3jY7v9Dk7f/PI62/z+YxP902vX/hev//4Xr//+F6///hev//4Xr + //+F6///hev//2TX8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKi1f9IvfD/SL3w/0i98P9DueH/xfP8/6bx + /v+I7v//iO7//4ju//+I7v//iO7//4ju//+I7v//jfP//2Gswf84gKP/Ooit/zyOtv9Yttb/jfP//4ju + //+I7v//iO7//4ju//+I7v//iO7//2bZ8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSj1v9PwfT/T8H0/0/B + 9P9GuuL/y/X8/6z0/v+M8v//jPL//4zy//+M8v//jPL//4zy//+M8v//k/n//3C3xP9Gf5z/OICj/zqI + rf88jrb/kvb6/4zy//+M8v//jPL//4zy//+M8v//jPL//2nc8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWk + 1/9Tw/b/U8P2/1PD9v9Ju+P/0fb8/6/2/v+P9v//j/b//4/2//+P9v//j/b//4/2//+P9v//kfj//47m + 6f9UfpP/Rn+c/ziAo/86iK3/iOz2/4/2//+P9v//j/b//4/2//+P9v//j/b//2vf8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABel2P9dx/r/Xcf6/13H+v9NvOT/1ff8/7T4/v+T+f//k/n//5P5//+T+f//k/n//5P5 + //+T+f//k/n//5H4//9zsb7/VH6T/0Z/nP9YrMf/jvT//5P5//+T+f//k/n//5P5//+T+f//k/n//27h + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABml2P9ky/7/ZMv+/2TL/v9QveX/2vf8/7f6/v+W/P//lvz//5b8 + //+W/P//lvz//5b8//+W/P//lvz//5L4//94tMH/XnyL/1F+lf940ub/k/n//5b8//+W/P//lvz//5b8 + //+W/P//lvz//3Hj8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqm2f9mzP//Zsz//2bM//9SvuX/3/j9/7z8 + /v+Z////mf///5n///+Z////mf///5n///+Z////mf///5P5//94r73/aXqB/158i/960eT/mf///5n/ + //+Z////mf///5n///+Z////mf///3Pm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABun2f9t0///bdP//23T + //9VwOX/5vr9/8D8/v+c////nP///5z///+c////nP///5z///+c////nP///5P3//93w9z/cY+b/2l6 + gf96zOH/nP///5z///+c////nP///5z///+c////nP///3Xm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2p + 2f9z2f//c9n//3PZ//9YweX/7Pv+/8j9/v+m////pv///6b///+m////pv///6b///+m////pv///5/6 + //+I6P//dtr//27U//983v//pv///6b///+m////pv///6b///+m////pv///33m8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAB6q2f933f//d93//3fd//9aw+X/8fz+/+v8/v/u+/7/7vv+/+z7/v/q+/7/4vv+/9r7 + /v/Q/P7/yf3+/73+//+z////s////6n5//+b7///s////7P///+z////s////7P///+z////s////4bm + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACCs2f+A5f//gOX//3Dc+f9Gut//uOTy/5nY6/96y+X/iNHo/7Tj + 8v+z4/L/7vv+/+77/v/t+/7/6/v+/+n6/f/n+v3/2fv+/9D9/v/D/v//vP///7z///+8////vP///7z/ + //+8////vP///43m8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKu2f+G7P//U8zs/xqp1v9OxOX/NZa//0OY + wf9ElsT/RLLk/0u+8f8usOP/Iqrd/0C13/9Zvt//htDo/8Hp9f/u+/7/7fv+/+z7/v/q+v3/4/v9/9P9 + /v/J/v//xv///8b////G////xv///5Tm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOv2f80ud//Ob/f/4/4 + /P89haf/F3Ke/xF9q/8Rfav/IHGd/1Gq2v9ky/7/VcP2/02/8v9HvO//LbDi/x2o2v8fp9f/TLjc/4bQ + 6P/Q7/j/7vv+/+77/v/s+/7/4Pz+/9L////P////z////5vm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ + zP85v9//mf///5n///8xdJj/AprN/wWbzv8Em87/A5bI/zV9p/9pz///Zsz//17I+/9PwPP/S77x/z64 + 6/8zs+X/LbDi/xek1/8KntH/H6bT/4jR6P/S7/j/7/v+/+77/v/l/f7/2v///6Pm8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACXyrFDxuL/mf///5n///9sw9P/BZvO/w+g0/8PoNP/BJvO/0SRtf923P//bdP//2fN + //9ky/7/VcP2/02/8v9Fu+7/NbTm/zGy5P8lrN7/G53P/xKUxf8Dm87/XL/f/9bx+P/z/f7/8fz+/7Dl + 8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlsiSJrPZ/4by+f+Z////B53Q/x2o2/8dqNv/BpzP/4vx + //+D6P//euD//3LY//9pz///Zsz//17I+/9PwPP/S77x/zqy4/8mdaD/IGSN/xpumv8dbJb/Dom5/wCZ + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACW + yJIwudz/j/n8/5n///+Z////mf///5n///+Z////mf///5n///+Z////j/n8/x6nzvgAQVdwAAAAGAAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAlMVTCp/O8GDZ7P+Z////mf///5n///+Z////mf///5n///9z5vL/E6LN9gBr + j4kAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJDAEQCVx4MKn87wOb/f/03M5v9W0un/Tczm/x2s + 1v8Ai7rSAGGBTAAAAA0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8zl/3/M + 5f9/zOX/f8zl/wBNZkAAAAAOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP/w + A////wAA/+AAH///AAD/gAAD//8AAP8AAAB//wAA/wAAAB//AAD/AAAAB/8AAP8AAAAD/wAA/wAAAAH/ + AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8A + AAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/ + AAD/AAAAAf8AAP8AAAAB/wAA/wAAAAH/AAD/AAAAAf8AAP+AAAAB/wAA/8AAAAH/AAD/8AAAAf8AAP/4 + AAAB/wAA//gAAAP/AAD/+AAAA/8AAP/4DgAH/wAA//gH4D//AAD/+AfgP/8AAP/4A+A//wAA//gBwD// + AAD//AAAP/8AAP/8AAA//wAA//4AAD//AAD//wAAf/8AAP//gAB//wAA///AAP//AAD//+AB//8AAP// + /Af//wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA0AAAAeAAAAJgAAACUAAAAiAAAAHwAA + ABYAAAAMAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAQQAAAGwAAAB9AAAAegAA + AHYAAABuAAAAXgAAAEcAAAAzAAAAJQAAABkAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHQBAVXNapr/iT6zO9RuJ + s+0bibPsDnuh5wBbetcANEa8AAAAmwAAAI4AAAB8AAAAYgAAAEQAAAAqAAAAFQAAAAcAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAZIaTBZbH+G/J + 5f+y6P//a9H//2vR//9r0f//ZM38/0rA7/82tub/HJK78wBig94AKDW5AAAAlwAAAH4AAABaAAAANAAA + ABYAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHmieQyf + 0v8TotX/b8nl/6rq//9w1v//cNb//3DW//9w1v//cNb//3DW//9w1v//adL8/0fA7P8emsb3AFBq1gAO + E6kAAACFAAAAWQAAACoAAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABAs9n/Hajb/x2o2/9vyeX/oO3//3Xb//912///ddv//3Xb//912///c9n//23T//9x1///ddv//3Xb + //9m0/n/LqzV+wBQatcAAACgAAAAdQAAADoAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAECz2f8oreD/KK3g/2/J5f+Y7///ed///3nf//953///ed///3nf//923P//VLvs/1nD + 9f9y2P7/ed///3nf//953///W87y/xCMtPMADhK0AAAAdgAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQLPZ/zOz5v8zs+b/b8nl/5Hy//+A5f//gOX//4Dl//+A5f//gOX//37k + //9Pr9r/Q6ve/3DY+v+A5f//gOX//4Dl//+A5f//YNLy/wCZzP8AAACPAAAALwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAs9n/Orbp/zq26f9vyeX/nff+/4Xq//+F6v//her//4Xq + //+F6v//fuL5/0Wcw/9Ansv/dNr1/4Xq//+F6v//her//4Xq//9j1vL/AJnM/wAAAI8AAAAvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f9JvfD/Sb3w/2/J5f+18v3/ie///4nv + //+J7///ie///4vx//9lu9D/Ooes/z2Su/9oyOL/ivD//4nv//+J7///ie///2fa8v8Amcz/AAAAjwAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQLPZ/1TD9v9Uw/b/b8nl/7z1 + /f+O9P//jvT//470//+O9P//j/X//37O1/9AgJ//Ooit/1Suzf+R9///jvT//470//+O9P//at3y/wCZ + zP8AAACPAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAs9n/W8f6/1vH + +v9vyeX/xPf9/5P5//+T+f//k/n//5P5//+T+f//kvj//2GTpf9AgJ//aMPb/5L4//+T+f//k/n//5P5 + //9u4fL/AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz + 2f9mzP//Zsz//2/J5f/L+v7/mf///5n///+Z////mf///5n///+U+f//bZak/1h9kP991+b/mf///5n/ + //+Z////mf///3Pm8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQLPZ/23T//9t0///c8rl/9P7/v+Z////mf///5n///+Z////mf///5D2//9yr8b/aIyc/4Lb + 6f+Z////mf///5n///+Z////c+by/wCZzP8AAACPAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABAs9n/dtz//3bc//94yuX/5vz+/879/v/M/f7/yv3+/8r9/v+7/v//sf///5ry + //+I5v//lO7//63///+t////rf///63///+C5vL/AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f+A5f//YNLy/1y/3/+Dx+D/jNTv/5fX6/+14/L/3/X7/+z7 + /v/p+/3/4Pv9/9P8/v/K/f7/v////73///+9////vf///47m8v8Amcz/AAAAjwAAAC8AAAAAAAAAAAAA + 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 + //964P//euD//3rg//964P//c9n//1C26P9s0/z/euD//3rg//9Fwen/CG+R5QAAAIYAAAArAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f8qruH/Kq7h/5v///+C6P//guj//4Lo//+C6P//fuT//0Cd + yv9w1fb/guj//4Lo//+C6P//AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz + 2f82tOf/NrTn/8Pz+/+I7v//iO7//4ju//+I7v//UqPA/zuMs/9lxeH/iO7//4ju//+I7v//AJnM/wAA + AI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f9Buu3/Qbrt/871+/+P9f//j/X//4/1 + //+Q9v//dL7K/zyBov9SqMb/kff//4/1//+P9f//AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAECz2f9Nv/L/Tb/y/9z4/f+Z////mf///5n///+Z////kPX//1h9kP9xyuH/mf///5n/ + //+Z////AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f9RxPL/UcTy/+n6 + /v+g////oP///6D///+g////i+7//2yYqf960en/oP///6D///+g////AJnM/wAAAI8AAAAvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz2f9e0PL/XtDy//b9///q/f7/7fv+/978/v/e/P7/0P3//7P0 + //+a7P//s////7P///+z////AJnM/wAAAI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECz + 2f8yuN//KqXM/xdynv8Teab/OKfY/2TG7P9vyer/mtru/8Dp9f/s+/7/4vz+/9T+///M////AJnM/wAA + AI8AAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUxkIms9n/g+Hp/xOWxP8KntH/SrXc/2vS + /v9Vw/b/Qrrs/y2w4v8yocz/c7bR/9bw+P/v/f//AJnM/wAAAIwAAAAuAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAlshiM7rc8Cax2v8dqNr/bN7y/4Lo//902v//Ysv8/0au3/8Xcp7/DIi4/xKG + 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 + + + \ No newline at end of file diff --git a/Rei.Fs/ReturnedInfo.cs b/Rei.Fs/ReturnedInfo.cs new file mode 100644 index 0000000..dd85378 --- /dev/null +++ b/Rei.Fs/ReturnedInfo.cs @@ -0,0 +1,15 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ReturnedInfo +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + [Serializable] + public abstract class ReturnedInfo + { + } +} diff --git a/Rei.Fs/SecureType.cs b/Rei.Fs/SecureType.cs new file mode 100644 index 0000000..5b987bc --- /dev/null +++ b/Rei.Fs/SecureType.cs @@ -0,0 +1,15 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.SecureType +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +namespace Rei.Fs +{ + public enum SecureType + { + None, + Secure, + Warning, + } +} diff --git a/Rei.Fs/SettingSupport.cs b/Rei.Fs/SettingSupport.cs new file mode 100644 index 0000000..84585db --- /dev/null +++ b/Rei.Fs/SettingSupport.cs @@ -0,0 +1,20 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.SettingSupport +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +namespace Rei.Fs +{ + public class SettingSupport + { + public static bool IsSameType(object Object1, object Object2) + { + if (Object1 == null) + return Object2 == null; + if (Object2 == null) + return false; + return Object1.GetType() == Object2.GetType(); + } + } +} diff --git a/Rei.Fs/SimpleWebException.cs b/Rei.Fs/SimpleWebException.cs new file mode 100644 index 0000000..dc3695c --- /dev/null +++ b/Rei.Fs/SimpleWebException.cs @@ -0,0 +1,68 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.SimpleWebException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; +using System.Net; + +namespace Rei.Fs +{ + public class SimpleWebException : Exception + { + public int StatusCode; + public WebExceptionStatus Status; + public Uri ResponseUri; + public string ResponseBody; + + public SimpleWebException(WebException ex) + : this(ex.Message, ex.InnerException, ex.Status, ex.Response) + { + } + + public SimpleWebException(WebException ex, string responsebody) + : this(ex.Message, ex.InnerException, ex.Status, ex.Response, responsebody) + { + } + + public SimpleWebException(WebExceptionStatus status) + : this(status.ToString(), (Exception) null, status, (WebResponse) null) + { + } + + public SimpleWebException(string message, WebExceptionStatus status) + : this(message, (Exception) null, status, (WebResponse) null) + { + } + + public SimpleWebException(string message, Exception innerexception, WebExceptionStatus status) + : this(message, innerexception, status, (WebResponse) null) + { + } + + public SimpleWebException(string message, Exception innerexception, WebExceptionStatus status, WebResponse response) + : this(message, innerexception, status, response, (string) null) + { + } + + public SimpleWebException(string message, Exception innerexception, WebExceptionStatus status, WebResponse response, string responsebody) + : base(message, innerexception) + { + this.Status = status; + HttpWebResponse httpWebResponse = response as HttpWebResponse; + if (httpWebResponse != null) + { + this.StatusCode = (int) httpWebResponse.StatusCode; + this.ResponseUri = httpWebResponse.ResponseUri; + } + FtpWebResponse ftpWebResponse = response as FtpWebResponse; + if (ftpWebResponse != null) + { + this.StatusCode = (int) ftpWebResponse.StatusCode; + this.ResponseUri = ftpWebResponse.ResponseUri; + } + this.ResponseBody = responsebody; + } + } +} diff --git a/Rei.Fs/SslProtocols.cs b/Rei.Fs/SslProtocols.cs new file mode 100644 index 0000000..eae15a3 --- /dev/null +++ b/Rei.Fs/SslProtocols.cs @@ -0,0 +1,22 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.SslProtocols +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + [Flags] + public enum SslProtocols + { + None = 0, + Ssl2 = 12, + Ssl3 = 48, + Tls = 192, + Tls11 = 768, + Tls12 = 3072, + Default = Tls | Ssl3, + } +} diff --git a/Rei.Fs/UCSNormalization.cs b/Rei.Fs/UCSNormalization.cs new file mode 100644 index 0000000..bd42413 --- /dev/null +++ b/Rei.Fs/UCSNormalization.cs @@ -0,0 +1,17 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.UCSNormalization +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +namespace Rei.Fs +{ + public enum UCSNormalization + { + None = 0, + NFC = 1, + NFD = 2, + NFKC = 5, + NFKD = 6, + } +} diff --git a/Rei.Fs/UnauthorizedException.cs b/Rei.Fs/UnauthorizedException.cs new file mode 100644 index 0000000..5ca69c3 --- /dev/null +++ b/Rei.Fs/UnauthorizedException.cs @@ -0,0 +1,39 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.UnauthorizedException +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System; + +namespace Rei.Fs +{ + public class UnauthorizedException : Exception + { + private bool p_canretry; + + public bool CanRetry + { + get + { + return this.p_canretry; + } + } + + public UnauthorizedException(string message, Exception innerexception, bool canretry) + : base(message, innerexception) + { + this.p_canretry = canretry; + } + + public UnauthorizedException(Exception innerexception, bool canretry) + : this("Unauthorized", innerexception, canretry) + { + } + + public UnauthorizedException(Exception innerexception) + : this("Unauthorized", innerexception, true) + { + } + } +} diff --git a/Rei.Fs/UriParserFixer.cs b/Rei.Fs/UriParserFixer.cs new file mode 100644 index 0000000..9e40510 --- /dev/null +++ b/Rei.Fs/UriParserFixer.cs @@ -0,0 +1,115 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.UriParserFixer +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Security.Permissions; +using System.Threading; + +namespace Rei.Fs +{ + public class UriParserFixer + { + private static object @lock = RuntimeHelpers.GetObjectValue(new object()); + private static bool m_registered; + private const int ConvertPathSlashes = 4194304; + private const int UnEscapeDotsAndSlashes = 33554432; + + public static void Register() + { + try + { + object Expression = UriParserFixer.@lock; + ObjectFlowControl.CheckForSyncLockOnValueType(Expression); + Monitor.Enter(Expression); + try + { + if (UriParserFixer.m_registered) + return; + ReflectionPermission reflectionPermission = new ReflectionPermission(ReflectionPermissionFlag.AllFlags); + SecurityPermission securityPermission = new SecurityPermission(SecurityPermissionFlag.AllFlags); + reflectionPermission.Demand(); + securityPermission.Demand(); + FieldInfo field1 = typeof (UriParser).GetField("HttpUri", BindingFlags.Static | BindingFlags.NonPublic); + FieldInfo field2 = typeof (UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); + UriParser uriParser1 = (UriParser) field1.GetValue((object) null); + int num1 = Conversions.ToInteger(field2.GetValue((object) uriParser1)) & -4194305 & -33554433; + field2.SetValue((object) uriParser1, (object) num1); + FieldInfo field3 = typeof (UriParser).GetField("HttpsUri", BindingFlags.Static | BindingFlags.NonPublic); + FieldInfo field4 = typeof (UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); + UriParser uriParser2 = (UriParser) field3.GetValue((object) null); + int num2 = Conversions.ToInteger(field4.GetValue((object) uriParser2)) & -4194305 & -33554433; + field4.SetValue((object) uriParser2, (object) num2); + UriParserFixer.m_registered = true; + } + finally + { + Monitor.Exit(Expression); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + public static void UnRegister() + { + try + { + object Expression = UriParserFixer.@lock; + ObjectFlowControl.CheckForSyncLockOnValueType(Expression); + Monitor.Enter(Expression); + try + { + if (!UriParserFixer.m_registered) + return; + FieldInfo field1 = typeof (UriParser).GetField("HttpUri", BindingFlags.Static | BindingFlags.NonPublic); + FieldInfo field2 = typeof (UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); + UriParser uriParser1 = (UriParser) field1.GetValue((object) null); + int num1 = Conversions.ToInteger(field2.GetValue((object) uriParser1)) | 4194304 | 33554432; + field2.SetValue((object) uriParser1, (object) num1); + FieldInfo field3 = typeof (UriParser).GetField("HttpsUri", BindingFlags.Static | BindingFlags.NonPublic); + FieldInfo field4 = typeof (UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); + UriParser uriParser2 = (UriParser) field3.GetValue((object) null); + int num2 = Conversions.ToInteger(field4.GetValue((object) uriParser2)) | 4194304 | 33554432; + field4.SetValue((object) uriParser2, (object) num2); + UriParserFixer.m_registered = false; + } + finally + { + Monitor.Exit(Expression); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + } + + public static bool IsRegister + { + get + { + object Expression = UriParserFixer.@lock; + ObjectFlowControl.CheckForSyncLockOnValueType(Expression); + Monitor.Enter(Expression); + try + { + return UriParserFixer.m_registered; + } + finally + { + Monitor.Exit(Expression); + } + } + } + } +} diff --git a/Rei.Fs/UriUtil.cs b/Rei.Fs/UriUtil.cs new file mode 100644 index 0000000..8f8b831 --- /dev/null +++ b/Rei.Fs/UriUtil.cs @@ -0,0 +1,451 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.UriUtil +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace Rei.Fs +{ + public class UriUtil + { + private const string unescapestringforsegment = "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"; + private const string unescapestringforquery = "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~/?"; + private const string FormUrlEncodeReserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.!*'(),\","; + private const string OAuthUnreserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"; + + public static Uri AddLastSlash(Uri target) + { + string leftPart = target.GetLeftPart(UriPartial.Path); + if (leftPart.EndsWith("/")) + return target; + return new Uri(leftPart + "/" + target.Query + target.Fragment); + } + + public static Uri RemoveLastSlash(Uri target) + { + if (target.Segments.Length == 1) + return target; + string leftPart = target.GetLeftPart(UriPartial.Path); + if (!leftPart.EndsWith("/")) + return target; + return new Uri(leftPart.Substring(0, checked (leftPart.Length - 1)) + target.Query + target.Fragment); + } + + public static bool EndWithSlash(Uri target) + { + return target.GetLeftPart(UriPartial.Path).EndsWith("/"); + } + + public static Uri GetParent(Uri target) + { + string str = target.AbsolutePath; + int index = checked (str.Length - 1); + while (index >= 0 && Operators.CompareString(Conversions.ToString(str[index]), "/", false) == 0) + checked { --index; } + while (index >= 0 && Operators.CompareString(Conversions.ToString(str[index]), "/", false) != 0) + checked { --index; } + while (index >= 0 && Operators.CompareString(Conversions.ToString(str[index]), "/", false) == 0) + checked { --index; } + int num = checked (index + 1); + if (num == 0) + { + str = "/"; + num = 0; + } + if (Operators.CompareString(target.Authority, "", false) == 0) + return new Uri(target.Scheme + ":" + str.Substring(0, checked (num + 1))); + return new Uri(target.Scheme + "://" + target.Authority + str.Substring(0, checked (num + 1))); + } + + public static Uri GetRoot(Uri target) + { + if (Operators.CompareString(target.Authority, "", false) == 0) + return new Uri(target.Scheme + ":/"); + return new Uri(target.Scheme + "://" + target.Authority + "/"); + } + + public static string GetLastSegment(Uri target) + { + string absolutePath = target.AbsolutePath; + int length = absolutePath.Length; + int num = length; + while (num == length) + { + checked { --length; } + if (length < 0) + { + num = -1; + break; + } + num = absolutePath.LastIndexOf('/', length); + if (num < 0) + { + num = -1; + break; + } + } + return absolutePath.Substring(checked (num + 1), checked (length - num)); + } + + public static string GetLastName(Uri target) + { + string stringToUnescape = UriUtil.GetLastSegment(target); + try + { + stringToUnescape = Uri.UnescapeDataString(stringToUnescape); + } + catch (UriFormatException ex) + { + ProjectData.SetProjectError((Exception) ex); + ProjectData.ClearProjectError(); + } + return stringToUnescape; + } + + public static string GetAuthority(Uri target) + { + return target.GetComponents(UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.UriEscaped) + "/"; + } + + public static Uri CombineSegment(Uri baseuri, string segment) + { + if (baseuri.AbsoluteUri.EndsWith("/")) + return new Uri(baseuri.AbsoluteUri + segment); + return new Uri(baseuri.AbsoluteUri + "/" + segment); + } + + public static Uri CombineName(Uri baseuri, string name) + { + return UriUtil.CombineSegment(baseuri, Uri.EscapeDataString(name)); + } + + public static bool UriEquals(Uri u1, Uri u2, bool casesensitive) + { + if ((object) u1 == null) + return (object) u2 == null; + if ((object) u2 == null) + return false; + if (casesensitive) + return Uri.Compare(UriUtil.RemoveLastSlash(u1), UriUtil.RemoveLastSlash(u2), UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.InvariantCulture) == 0; + return Uri.Compare(UriUtil.RemoveLastSlash(u1), UriUtil.RemoveLastSlash(u2), UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.InvariantCultureIgnoreCase) == 0; + } + + private static string UriEncodeConvertHelper(string str, Encoding sourceencoding, Encoding destinationencoding, bool queryorfragment) + { + if (str.Contains("%u") || str.Contains("%U")) + throw new ArgumentException("cannot use %u encoding uri"); + List byteList = new List(); + int index1; + while (index1 < str.Length) + { + if ((int) str[index1] != 37) + { + byteList.Add(Convert.ToByte(str[index1])); + checked { ++index1; } + } + else + { + byteList.Add(Convert.ToByte(str.Substring(checked (index1 + 1), 2), 16)); + checked { index1 += 3; } + } + } + byte[] numArray = new byte[checked (byteList.Count - 1 + 1)]; + byteList.CopyTo(numArray); + str = sourceencoding.GetString(numArray); + StringBuilder stringBuilder = new StringBuilder(checked (str.Length * 3)); + string str1 = !queryorfragment ? "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~" : "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~/?"; + int num1 = 0; + int num2 = checked (str.Length - 1); + int index2 = num1; + while (index2 <= num2) + { + if (str1.Contains(Conversions.ToString(str[index2]))) + { + stringBuilder.Append(str[index2]); + } + else + { + byte[] bytes = destinationencoding.GetBytes(Conversions.ToString(str[index2])); + int index3 = 0; + while (index3 < bytes.Length) + { + byte num3 = bytes[index3]; + char ch = Convert.ToChar(num3); + if (str1.Contains(Conversions.ToString(ch))) + { + stringBuilder.Append(ch); + } + else + { + stringBuilder.Append("%"); + stringBuilder.Append(num3.ToString("X2")); + } + checked { ++index3; } + } + } + checked { ++index2; } + } + str = stringBuilder.ToString(); + return str; + } + + public static Uri UriEncodeConvert(Uri target, Encoding sourceencoding, Encoding destinationencoding) + { + if (sourceencoding == null) + sourceencoding = Encoding.UTF8; + if (destinationencoding == null) + destinationencoding = Encoding.UTF8; + if (sourceencoding == destinationencoding) + return target; + string components = target.GetComponents(UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.UriEscaped); + string[] strArray = target.GetComponents(UriComponents.Path, UriFormat.UriEscaped).Split(new char[1] + { + '/' + }, StringSplitOptions.None); + int num1 = 0; + int num2 = checked (strArray.Length - 1); + int index = num1; + while (index <= num2) + { + strArray[index] = UriUtil.UriEncodeConvertHelper(strArray[index], sourceencoding, destinationencoding, false); + checked { ++index; } + } + string str1 = target.GetComponents(UriComponents.Query, UriFormat.UriEscaped); + if (str1.Length > 0) + str1 = UriUtil.UriEncodeConvertHelper(str1, sourceencoding, destinationencoding, true); + string str2 = target.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); + if (str2.Length > 0) + str2 = UriUtil.UriEncodeConvertHelper(str2, sourceencoding, destinationencoding, true); + string uriString = components + "/" + string.Join("/", strArray); + if (str1.Length > 0) + uriString = uriString + "?" + str1; + if (str2.Length > 0) + uriString = uriString + "#" + str2; + return new Uri(uriString); + } + + public static bool IsChild(Uri baseuri, Uri target) + { + if (checked (baseuri.Segments.Length + 1) != target.Segments.Length) + return false; + return UriUtil.IsDescendant(baseuri, target); + } + + public static bool IsDescendant(Uri baseuri, Uri target) + { + if (checked (baseuri.Segments.Length + 1) > target.Segments.Length || Operators.CompareString(baseuri.Scheme, target.Scheme, false) != 0 || (Operators.CompareString(baseuri.Host, target.Host, false) != 0 || baseuri.Port != target.Port) || Operators.CompareString(baseuri.UserInfo, target.UserInfo, false) != 0) + return false; + int num1 = 0; + int num2 = checked (baseuri.Segments.Length - 1); + int index = num1; + while (index <= num2) + { + if (!UriUtil.IsSameSegmentString(baseuri.Segments[index], target.Segments[index])) + return false; + checked { ++index; } + } + return true; + } + + public static bool IsSameSegmentString(string seg1, string seg2) + { + while (seg1.EndsWith("/")) + seg1 = seg1.Substring(0, checked (seg1.Length - 1)); + while (seg2.EndsWith("/")) + seg2 = seg2.Substring(0, checked (seg2.Length - 1)); + return Operators.CompareString(Uri.UnescapeDataString(seg1), Uri.UnescapeDataString(seg2), false) == 0; + } + + public static bool IsRoot(Uri u) + { + return u.Segments.Length < 2; + } + + public static string FormUrlEncode(string str) + { + StringBuilder stringBuilder = new StringBuilder(); + int num1 = 0; + int num2 = checked (str.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if ((int) str[index1] == 32) + stringBuilder.Append("+"); + else if ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.!*'(),\",".Contains(Conversions.ToString(str[index1]))) + { + stringBuilder.Append(str[index1]); + } + else + { + byte[] bytes = Encoding.UTF8.GetBytes(Conversions.ToString(str[index1])); + int index2 = 0; + while (index2 < bytes.Length) + { + byte num3 = bytes[index2]; + stringBuilder.Append("%"); + stringBuilder.Append(num3.ToString("X2")); + checked { ++index2; } + } + } + checked { ++index1; } + } + return stringBuilder.ToString(); + } + + public static string OAuthEncode(string str) + { + StringBuilder stringBuilder = new StringBuilder(); + int num1 = 0; + int num2 = checked (str.Length - 1); + int index1 = num1; + while (index1 <= num2) + { + if ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~".Contains(Conversions.ToString(str[index1]))) + { + stringBuilder.Append(str[index1]); + } + else + { + byte[] bytes = Encoding.UTF8.GetBytes(Conversions.ToString(str[index1])); + int index2 = 0; + while (index2 < bytes.Length) + { + byte num3 = bytes[index2]; + stringBuilder.Append("%"); + stringBuilder.Append(num3.ToString("X2")); + checked { ++index2; } + } + } + checked { ++index1; } + } + return stringBuilder.ToString(); + } + + public static string OAuthDecode(string str) + { + List byteList = new List(); + int index = 0; + while (index < str.Length) + { + byte result; + if (Operators.CompareString(Conversions.ToString(str[index]), "%", false) == 0 && index < checked (str.Length - 3) && byte.TryParse(str.Substring(checked (index + 1), 2), NumberStyles.HexNumber, (IFormatProvider) null, out result)) + { + byteList.Add(result); + checked { index += 3; } + } + else + { + byteList.AddRange((IEnumerable) Encoding.UTF8.GetBytes(Conversions.ToString(str[index]))); + checked { ++index; } + } + } + return Encoding.UTF8.GetString(byteList.ToArray()); + } + + public static Uri CreateNextCopyName(Uri target) + { + int result = 2; + string lastSegment = UriUtil.GetLastSegment(target); + string str = UriUtil.RemoveExtension(lastSegment); + if (str.EndsWith(")")) + { + int length = str.LastIndexOf("("); + if (int.TryParse(str.Substring(checked (length + 1), checked (str.Length - length - 2)), out result)) + { + str = str.Substring(0, length).TrimEnd(); + checked { ++result; } + } + } + return new Uri(UriUtil.GetParent(target).AbsoluteUri + str + " (" + result.ToString() + ")" + UriUtil.GetExtension(lastSegment)); + } + + public static string CreateNextCopyName(string name) + { + int result = 1; + string str = UriUtil.RemoveExtension(name); + if (str.EndsWith(")")) + { + int num = str.LastIndexOf("("); + if (int.TryParse(str.Substring(checked (num + 1), checked (str.Length - num - 2)), out result)) + str = str.Substring(0, checked (num - 1)); + } + int num1 = checked (result + 1); + return str + " (" + num1.ToString() + ")" + UriUtil.GetExtension(name); + } + + public static string CreateFormUrlencodedString(Dictionary values) + { + List stringList = new List(); + Dictionary.KeyCollection.Enumerator enumerator; + try + { + enumerator = values.Keys.GetEnumerator(); + while (enumerator.MoveNext()) + { + string current = enumerator.Current; + stringList.Add(Uri.EscapeDataString(current).Replace("%20", "+") + "=" + Uri.EscapeDataString(values[current]).Replace("%20", "+")); + } + } + finally + { + enumerator.Dispose(); + } + return string.Join("&", stringList.ToArray()); + } + + public static Uri CreateUriFromSchemeAndPath(string scheme, string path) + { + string[] strArray = path.Split(new char[1]{ '/' }, StringSplitOptions.RemoveEmptyEntries); + string str = ""; + if (strArray.Length == 0) + { + str = "/"; + } + else + { + int num1 = 0; + int num2 = checked (strArray.Length - 1); + int index = num1; + while (index <= num2) + { + str = str + "/" + Uri.EscapeDataString(strArray[index]); + checked { ++index; } + } + } + return new Uri(scheme + ":" + str); + } + + private static string GetFilename(string path) + { + while (path.EndsWith("\\")) + path = path.Substring(0, checked (path.Length - 1)); + int num = path.LastIndexOf("\\"); + if (num < 0) + return path; + return path.Substring(checked (num + 1)); + } + + private static string RemoveExtension(string filename) + { + int length = filename.LastIndexOf("."); + if (length < 0) + return filename; + return filename.Substring(0, length); + } + + private static string GetExtension(string path) + { + string filename = UriUtil.GetFilename(path); + int num = filename.LastIndexOf("."); + if (num < 0 || checked (num + 1) >= filename.Length) + return ""; + return filename.Substring(checked (num + 1)); + } + } +} diff --git a/Rei.Fs/WebRequestCertificateValidationManager.cs b/Rei.Fs/WebRequestCertificateValidationManager.cs new file mode 100644 index 0000000..f707ee5 --- /dev/null +++ b/Rei.Fs/WebRequestCertificateValidationManager.cs @@ -0,0 +1,136 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.WebRequestCertificateValidationManager +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; + +namespace Rei.Fs +{ + public sealed class WebRequestCertificateValidationManager + { + private static Dictionary p_ReqToClient = new Dictionary(); + + static WebRequestCertificateValidationManager() + { + ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(WebRequestCertificateValidationManager.InnerCertificateValidationCallback); + IEnumerator registeredModules = AuthenticationManager.RegisteredModules; + List authenticationModuleList = new List(); + while (registeredModules.MoveNext()) + authenticationModuleList.Add((IAuthenticationModule) registeredModules.Current); + AuthenticationManager.Register((IAuthenticationModule) new WebRequestCertificateValidationManager.FookAuthClient()); + List.Enumerator enumerator; + try + { + enumerator = authenticationModuleList.GetEnumerator(); + while (enumerator.MoveNext()) + AuthenticationManager.Register(enumerator.Current); + } + finally + { + enumerator.Dispose(); + } + } + + private static bool InnerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + if (sslPolicyErrors == SslPolicyErrors.None) + return true; + int certErrorIgnores; + lock (WebRequestCertificateValidationManager.p_ReqToClient) + { + WebRequest key = sender as WebRequest; + if (!WebRequestCertificateValidationManager.p_ReqToClient.ContainsKey(key)) + return false; + ConnectionSettingBase connectionSetting = WebRequestCertificateValidationManager.p_ReqToClient[key].ConnectionSetting; + certErrorIgnores = (int) connectionSetting.CertErrorIgnores; + connectionSetting.LastCertError = sslPolicyErrors; + } + return (sslPolicyErrors & (SslPolicyErrors) ~certErrorIgnores) == SslPolicyErrors.None; + } + + public static void Register(WebRequest req, ConnectionSettingBase setting) + { + lock (WebRequestCertificateValidationManager.p_ReqToClient) + WebRequestCertificateValidationManager.p_ReqToClient.Add(req, new WebRequestCertificateValidationManager.RequestStore(setting)); + } + + public static void UnRegister(WebRequest req) + { + lock (WebRequestCertificateValidationManager.p_ReqToClient) + WebRequestCertificateValidationManager.p_ReqToClient.Remove(req); + } + + public static string[] GetChallenges(WebRequest req) + { + lock (WebRequestCertificateValidationManager.p_ReqToClient) + { + if (!WebRequestCertificateValidationManager.p_ReqToClient.ContainsKey(req)) + return new string[0]; + return WebRequestCertificateValidationManager.p_ReqToClient[req].ChallengeList.ToArray(); + } + } + + public static ConnectionSettingBase GetConnectionSetting(WebRequest req) + { + lock (WebRequestCertificateValidationManager.p_ReqToClient) + { + if (!WebRequestCertificateValidationManager.p_ReqToClient.ContainsKey(req)) + return (ConnectionSettingBase) null; + return WebRequestCertificateValidationManager.p_ReqToClient[req].ConnectionSetting; + } + } + + private class FookAuthClient : IAuthenticationModule + { + public Authorization Authenticate(string challenge, WebRequest request, ICredentials credentials) + { + lock (WebRequestCertificateValidationManager.p_ReqToClient) + { + if (WebRequestCertificateValidationManager.p_ReqToClient.ContainsKey(request)) + WebRequestCertificateValidationManager.p_ReqToClient[request].ChallengeList.Add(challenge); + } + return (Authorization) null; + } + + public string AuthenticationType + { + get + { + return ":fook"; + } + } + + public bool CanPreAuthenticate + { + get + { + return false; + } + } + + public Authorization PreAuthenticate(WebRequest request, ICredentials credentials) + { + return (Authorization) null; + } + } + + private class RequestStore + { + public ConnectionSettingBase ConnectionSetting; + public List ChallengeList; + public SslPolicyErrors LastCertError; + + public RequestStore(ConnectionSettingBase c) + { + this.ChallengeList = new List(); + this.ConnectionSetting = c; + } + } + } +} diff --git a/Rei.Fs/ZlibStream.cs b/Rei.Fs/ZlibStream.cs new file mode 100644 index 0000000..5a70e37 --- /dev/null +++ b/Rei.Fs/ZlibStream.cs @@ -0,0 +1,258 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Fs.ZlibStream +// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null +// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.IO; +using System.IO.Compression; +using System.Reflection; +using System.Runtime.CompilerServices; + +namespace Rei.Fs +{ + public class ZlibStream : Stream + { + private static FieldInfo finfo1 = typeof (DeflateStream).GetField("inflater", BindingFlags.Instance | BindingFlags.NonPublic); + private static FieldInfo finfo2 = ZlibStream.finfo1.FieldType.GetField("input", BindingFlags.Instance | BindingFlags.NonPublic); + private static MethodInfo minfo1 = ZlibStream.finfo2.FieldType.GetMethod("SkipToByteBoundary", BindingFlags.Instance | BindingFlags.Public); + private static MethodInfo minfo2 = ZlibStream.finfo2.FieldType.GetMethod("CopyTo", BindingFlags.Instance | BindingFlags.Public); + private static MethodInfo minfo3 = ZlibStream.finfo2.FieldType.GetMethod("SetInput", BindingFlags.Instance | BindingFlags.Public); + private static PropertyInfo pinfo1 = ZlibStream.finfo2.FieldType.GetProperty("AvailableBytes", BindingFlags.Instance | BindingFlags.Public); + private Stream m_stream; + private DeflateStream m_deflatestream; + private CompressionMode m_mode; + private bool m_leaveopen; + private Adler32 m_adler; + private bool m_rawdeflate; + + public ZlibStream(Stream stream, CompressionMode mode) + : this(stream, mode, false) + { + } + + public ZlibStream(Stream stream, CompressionMode mode, bool leaveOpen) + : this(stream, mode, leaveOpen, false) + { + } + + public ZlibStream(Stream stream, CompressionMode mode, bool leaveOpen, bool canconvertrawdeflate) + { + if (stream == null) + throw new ArgumentNullException(); + this.m_stream = stream; + this.m_deflatestream = (DeflateStream) null; + this.m_mode = mode; + this.m_leaveopen = leaveOpen; + this.m_rawdeflate = canconvertrawdeflate; + this.m_adler = (Adler32) null; + } + + public override bool CanRead + { + get + { + if (this.m_stream == null) + return false; + if (this.m_deflatestream != null) + return this.m_deflatestream.CanRead; + return this.m_mode == CompressionMode.Decompress && this.m_stream.CanRead; + } + } + + public override bool CanWrite + { + get + { + if (this.m_stream == null) + return false; + if (this.m_deflatestream != null) + return this.m_deflatestream.CanWrite; + return this.m_mode == CompressionMode.Compress && this.m_stream.CanWrite; + } + } + + public override void Flush() + { + if (this.m_stream == null) + throw new ObjectDisposedException((string) null); + if (this.m_deflatestream == null) + this.m_stream.Flush(); + else + this.m_deflatestream.Flush(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + if (this.m_stream == null) + throw new ObjectDisposedException((string) null); + if (this.m_mode == CompressionMode.Compress) + throw new InvalidOperationException(); + if (this.m_deflatestream == null) + { + byte[] numArray = new byte[2]; + int num1 = this.m_stream.ReadByte(); + if (num1 < 0) + throw new InvalidDataException(); + numArray[0] = checked ((byte) num1); + int num2 = this.m_stream.ReadByte(); + if (num2 < 0) + throw new InvalidDataException(); + numArray[1] = checked ((byte) num2); + byte num3 = numArray[0]; + if (((int) num3 & 15) == 8 && (int) (byte) ((uint) num3 >> 4) <= 7) + { + byte num4 = numArray[1]; + int num5 = (int) num4 & 31; + bool flag = ((int) num4 & 32) != 0; + int num6 = (int) (byte) ((uint) num4 >> 7); + if (!flag && checked ((int) num3 * 256 + (int) num4) % 31 == 0) + { + this.m_adler = new Adler32(); + this.m_deflatestream = new DeflateStream(this.m_stream, this.m_mode, true); + goto label_15; + } + } + if (!this.m_rawdeflate) + throw new NotSupportedException(); + this.m_adler = (Adler32) null; + this.m_deflatestream = new DeflateStream(this.m_stream, this.m_mode, true); + object objectValue1 = RuntimeHelpers.GetObjectValue(ZlibStream.finfo1.GetValue((object) this.m_deflatestream)); + object objectValue2 = RuntimeHelpers.GetObjectValue(ZlibStream.finfo2.GetValue(RuntimeHelpers.GetObjectValue(objectValue1))); + ZlibStream.minfo3.Invoke(RuntimeHelpers.GetObjectValue(objectValue2), new object[3] + { + (object) numArray, + (object) 0, + (object) 2 + }); + } +label_15: + int length = this.m_deflatestream.Read(buffer, offset, count); + if (this.m_adler != null) + { + if (length != 0) + { + this.m_adler.Calc(buffer, offset, length); + } + else + { + byte[] numArray = this.m_adler.Value; + object objectValue1 = RuntimeHelpers.GetObjectValue(ZlibStream.finfo1.GetValue((object) this.m_deflatestream)); + object objectValue2 = RuntimeHelpers.GetObjectValue(ZlibStream.finfo2.GetValue(RuntimeHelpers.GetObjectValue(objectValue1))); + ZlibStream.minfo1.Invoke(RuntimeHelpers.GetObjectValue(objectValue2), (object[]) null); + byte[] buffer1 = new byte[checked (Conversions.ToInteger(ZlibStream.pinfo1.GetValue(RuntimeHelpers.GetObjectValue(objectValue2), (object[]) null)) - 1 + 1)]; + int integer = Conversions.ToInteger(ZlibStream.minfo2.Invoke(RuntimeHelpers.GetObjectValue(objectValue2), new object[3] + { + (object) buffer1, + (object) 0, + (object) buffer1.Length + })); + while (integer < 4) + { + int num = this.m_stream.Read(buffer1, integer, checked (4 - integer)); + if (num == 0) + throw new InvalidDataException(); + checked { integer += num; } + } + if ((int) buffer1[0] != (int) numArray[0]) + throw new InvalidDataException(); + if ((int) buffer1[1] != (int) numArray[1]) + throw new InvalidDataException(); + if ((int) buffer1[2] != (int) numArray[2]) + throw new InvalidDataException(); + if ((int) buffer1[3] != (int) numArray[3]) + throw new InvalidDataException(); + this.m_adler = (Adler32) null; + } + } + return length; + } + + public override void Write(byte[] buffer, int offset, int count) + { + if (this.m_stream == null) + throw new ObjectDisposedException((string) null); + if (this.m_mode == CompressionMode.Decompress) + throw new InvalidOperationException(); + if (this.m_deflatestream == null) + { + this.m_stream.WriteByte((byte) 120); + this.m_stream.WriteByte((byte) 156); + this.m_adler = new Adler32(); + this.m_deflatestream = new DeflateStream(this.m_stream, this.m_mode, true); + } + this.m_deflatestream.Write(buffer, offset, count); + this.m_adler.Calc(buffer, offset, count); + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override long Length + { + get + { + throw new NotImplementedException(); + } + } + + public override long Position + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + protected override void Dispose(bool disposing) + { + try + { + if (!disposing || this.m_stream == null) + return; + if (this.m_deflatestream != null) + { + this.m_deflatestream.Dispose(); + this.m_deflatestream = (DeflateStream) null; + if (this.m_mode == CompressionMode.Compress) + { + byte[] numArray = this.m_adler.Value; + this.m_stream.WriteByte(numArray[0]); + this.m_stream.WriteByte(numArray[1]); + this.m_stream.WriteByte(numArray[2]); + this.m_stream.WriteByte(numArray[3]); + this.m_adler = (Adler32) null; + } + } + if (!this.m_leaveopen) + this.m_stream.Dispose(); + this.m_stream = (Stream) null; + } + finally + { + base.Dispose(disposing); + } + } + } +} diff --git a/Rei.Net.HttpServer/AssemblyInfo.cs b/Rei.Net.HttpServer/AssemblyInfo.cs new file mode 100644 index 0000000..5280cdd --- /dev/null +++ b/Rei.Net.HttpServer/AssemblyInfo.cs @@ -0,0 +1,12 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyCopyright("Copyright (C) Rei HOBARA 2015-2016")] +[assembly: AssemblyCompany("Rei Software")] +[assembly: AssemblyDescription("HttpServer Support Library")] +[assembly: ComVisible(false)] +[assembly: AssemblyProduct("Rei.Net.HttpServer")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyTitle("Rei.Net.HttpServer")] +[assembly: Guid("ae9e344a-bb01-4d81-97ed-f2c3bdacf0f7")] +[assembly: AssemblyVersion("1.13.2.9297")] diff --git a/Rei.Net.HttpServer/LineReadableSocketStream.cs b/Rei.Net.HttpServer/LineReadableSocketStream.cs new file mode 100644 index 0000000..c43281c --- /dev/null +++ b/Rei.Net.HttpServer/LineReadableSocketStream.cs @@ -0,0 +1,424 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.LineReadableSocketStream +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Diagnostics; +using System.IO; +using System.Net.Sockets; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; + +namespace Rei.Net.HttpServer +{ + public class LineReadableSocketStream : Stream + { + private Socket _soc; + private long _readbytes; + private long _writebytes; + private bool _shutdownreceive; + private bool _shutdownsend; + private int _receive_bufcount; + private byte[] _receive_buf; + private int _readtimeout; + private int _writetimeout; + private bool disposedValue; + + public LineReadableSocketStream(Socket basesocket) + { + this._shutdownreceive = false; + this._shutdownsend = false; + this._readtimeout = 10000; + this._writetimeout = 10000; + this.disposedValue = false; + if (basesocket == null) + throw new ArgumentNullException(); + this._soc = basesocket; + this._receive_buf = new byte[65536]; + } + + public void Shutdown(SocketShutdown how) + { + if (this._soc == null) + throw new ObjectDisposedException(this.ToString()); + this._soc.Shutdown(how); + if (how == SocketShutdown.Both) + { + this._shutdownreceive = true; + this._shutdownsend = true; + } + else if (how == SocketShutdown.Receive) + { + this._shutdownreceive = true; + } + else + { + if (how != SocketShutdown.Send) + return; + this._shutdownsend = true; + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override void Flush() + { + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + public override long Length + { + get + { + throw new NotImplementedException(); + } + } + + public override long Position + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public long ReadBytes + { + get + { + return this._readbytes; + } + } + + public override bool CanRead + { + get + { + return !this._shutdownreceive; + } + } + + public override int ReadTimeout + { + get + { + return this._readtimeout; + } + set + { + this._readtimeout = value; + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + IAsyncResult asyncresult = this.BeginRead(buffer, offset, count, (AsyncCallback) null, (object) null); + if (!asyncresult.AsyncWaitHandle.WaitOne(this.ReadTimeout, false)) + throw new IOException(); + return this.EndRead(asyncresult); + } + + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object asyncstate) + { + if (this._soc == null) + throw new ObjectDisposedException(this.ToString()); + if (count < 0) + throw new ArgumentOutOfRangeException(); + int num = this._receive_bufcount; + if (num > count) + num = count; + Array.Copy((Array) this._receive_buf, 0, (Array) buffer, offset, num); + this._receive_bufcount = checked (this._receive_bufcount - num); + Array.Copy((Array) this._receive_buf, num, (Array) this._receive_buf, 0, this._receive_bufcount); + MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(asyncstate)); + myAsyncResult.ReturnValue = (object) num; + if (count == num) + myAsyncResult.Complete((Exception) null); + else + this._soc.BeginReceive(buffer, checked (offset + num), checked (count - num), SocketFlags.None, new AsyncCallback(this.OnReceive), (object) myAsyncResult); + return (IAsyncResult) myAsyncResult; + } + + private void OnReceive(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + int num; + try + { + num = this._soc.EndReceive(asyncresult); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + Interlocked.Add(ref this._readbytes, (long) num); + asyncState.ReturnValue = (object) checked ((int) asyncState.ReturnValue + num); + asyncState.Complete(); + } + + public override int EndRead(IAsyncResult asyncresult) + { + MyAsyncResult myAsyncResult = asyncresult as MyAsyncResult; + myAsyncResult.AsyncEnd(); + return (int) myAsyncResult.ReturnValue; + } + + public string ReadLine() + { + IAsyncResult asyncresult = this.BeginReadLine((AsyncCallback) null, (object) null); + if (!asyncresult.AsyncWaitHandle.WaitOne(this.ReadTimeout, false)) + throw new IOException(); + return this.EndReadLine(asyncresult); + } + + public IAsyncResult BeginReadLine(AsyncCallback callback, object asyncstate) + { + if (this._soc == null) + throw new ObjectDisposedException(this.ToString()); + MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(asyncstate)); + int num1 = 0; + int num2 = checked (this._receive_bufcount - 1); + int index = num1; + while (index <= num2) + { + if ((int) this._receive_buf[index] == 10) + { + byte[] numArray = index <= 0 || (int) this._receive_buf[checked (index - 1)] != 13 ? new byte[checked (index - 1 + 1)] : new byte[checked (index - 2 + 1)]; + Array.Copy((Array) this._receive_buf, 0, (Array) numArray, 0, numArray.Length); + this._receive_bufcount = checked (this._receive_bufcount - index + 1); + Array.Copy((Array) this._receive_buf, checked (index + 1), (Array) this._receive_buf, 0, this._receive_bufcount); + myAsyncResult.ReturnValue = (object) numArray; + myAsyncResult.Complete(); + return (IAsyncResult) myAsyncResult; + } + checked { ++index; } + } + if (checked (this._receive_buf.Length - this._receive_bufcount) < 1024) + this._receive_buf = (byte[]) Utils.CopyArray((Array) this._receive_buf, (Array) new byte[checked (this._receive_buf.Length * 2 - 1 + 1)]); + this._soc.BeginReceive(this._receive_buf, this._receive_bufcount, checked (this._receive_buf.Length - this._receive_bufcount), SocketFlags.None, new AsyncCallback(this.OnReceiveToBuffer), (object) myAsyncResult); + return (IAsyncResult) myAsyncResult; + } + + private void OnReceiveToBuffer(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + int num1; + try + { + num1 = this._soc.EndReceive(asyncresult); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + if (num1 == 0) + { + asyncState.ReturnValue = (object) null; + asyncState.Complete(); + } + else + { + Interlocked.Add(ref this._readbytes, (long) num1); + this._receive_bufcount = checked (this._receive_bufcount + num1); + int num2 = 0; + int num3 = checked (this._receive_bufcount - 1); + int index = num2; + while (index <= num3) + { + if ((int) this._receive_buf[index] == 10) + { + byte[] numArray = index <= 0 || (int) this._receive_buf[checked (index - 1)] != 13 ? new byte[checked (index - 1 + 1)] : new byte[checked (index - 2 + 1)]; + Array.Copy((Array) this._receive_buf, 0, (Array) numArray, 0, numArray.Length); + this._receive_bufcount = checked (this._receive_bufcount - index + 1); + Array.Copy((Array) this._receive_buf, checked (index + 1), (Array) this._receive_buf, 0, this._receive_bufcount); + asyncState.ReturnValue = (object) numArray; + asyncState.Complete(); + return; + } + checked { ++index; } + } + if (checked (this._receive_buf.Length - this._receive_bufcount) < 1024) + this._receive_buf = (byte[]) Utils.CopyArray((Array) this._receive_buf, (Array) new byte[checked (this._receive_buf.Length * 2 - 1 + 1)]); + this._soc.BeginReceive(this._receive_buf, this._receive_bufcount, checked (this._receive_buf.Length - this._receive_bufcount), SocketFlags.None, new AsyncCallback(this.OnReceiveToBuffer), (object) asyncState); + } + } + + public string EndReadLine(IAsyncResult asyncresult) + { + MyAsyncResult myAsyncResult = (MyAsyncResult) asyncresult; + myAsyncResult.AsyncEnd(); + if (myAsyncResult.ReturnValue == null) + return (string) null; + return Encoding.UTF8.GetString((byte[]) myAsyncResult.ReturnValue); + } + + public long WriteBytes + { + get + { + return this._writebytes; + } + } + + public override bool CanWrite + { + get + { + return !this._shutdownsend; + } + } + + public override int WriteTimeout + { + get + { + return this._writetimeout; + } + set + { + this._writetimeout = value; + } + } + + public override void Write(byte[] buffer, int offset, int count) + { + IAsyncResult asyncResult = this.BeginWrite(buffer, offset, count, (AsyncCallback) null, (object) null); + if (!asyncResult.AsyncWaitHandle.WaitOne(this.WriteTimeout, false)) + throw new IOException(); + this.EndWrite(asyncResult); + } + + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + if (this._soc == null) + throw new ObjectDisposedException(this.ToString()); + MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(state)); + LineReadableSocketStream.StreamReadWriteParameter readWriteParameter = new LineReadableSocketStream.StreamReadWriteParameter(); + if (count < 0) + throw new ArgumentOutOfRangeException(); + if (count == 0) + { + myAsyncResult.ReturnValue = (object) 0; + myAsyncResult.Complete(); + } + else + { + IAsyncResult asyncResult; + try + { + readWriteParameter.buffer = buffer; + readWriteParameter.offset = offset; + readWriteParameter.count = count; + myAsyncResult.Tag = (object) readWriteParameter; + this._soc.BeginSend(readWriteParameter.buffer, readWriteParameter.offset, readWriteParameter.count, SocketFlags.None, new AsyncCallback(this.OnSend), (object) myAsyncResult); + goto label_8; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + myAsyncResult.Complete(ex2); + asyncResult = (IAsyncResult) myAsyncResult; + ProjectData.ClearProjectError(); + } + return asyncResult; + } +label_8: + return (IAsyncResult) myAsyncResult; + } + + private void OnSend(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + LineReadableSocketStream.StreamReadWriteParameter tag = (LineReadableSocketStream.StreamReadWriteParameter) asyncState.Tag; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + int num = this._soc.EndSend(asyncresult); + Interlocked.Add(ref this._writebytes, (long) num); + LineReadableSocketStream.StreamReadWriteParameter readWriteParameter1 = tag; + readWriteParameter1.count = checked (readWriteParameter1.count - num); + LineReadableSocketStream.StreamReadWriteParameter readWriteParameter2 = tag; + readWriteParameter2.offset = checked (readWriteParameter2.offset + num); + if (tag.count > 0) + { + this._soc.BeginSend(tag.buffer, tag.offset, tag.count, SocketFlags.None, new AsyncCallback(this.OnSend), (object) asyncState); + return; + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + ((MyAsyncResult) asyncResult).AsyncEnd(); + } + + protected override void Dispose(bool disposing) + { + if (!this.disposedValue && disposing && this._soc != null) + { + this._soc.Close(); + this._soc = (Socket) null; + } + this.disposedValue = true; + base.Dispose(disposing); + } + + private class StreamReadWriteParameter + { + public byte[] buffer; + public int offset; + public int count; + + [DebuggerNonUserCode] + public StreamReadWriteParameter() + { + } + } + } +} diff --git a/Rei.Net.HttpServer/My/MyApplication.cs b/Rei.Net.HttpServer/My/MyApplication.cs new file mode 100644 index 0000000..4acb09b --- /dev/null +++ b/Rei.Net.HttpServer/My/MyApplication.cs @@ -0,0 +1,23 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.My.MyApplication +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.ApplicationServices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; + +namespace Rei.Net.HttpServer.My +{ + [EditorBrowsable(EditorBrowsableState.Never)] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal class MyApplication : ApplicationBase + { + [DebuggerNonUserCode] + public MyApplication() + { + } + } +} diff --git a/Rei.Net.HttpServer/My/MyComputer.cs b/Rei.Net.HttpServer/My/MyComputer.cs new file mode 100644 index 0000000..0017a72 --- /dev/null +++ b/Rei.Net.HttpServer/My/MyComputer.cs @@ -0,0 +1,24 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.My.MyComputer +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.Devices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; + +namespace Rei.Net.HttpServer.My +{ + [GeneratedCode("MyTemplate", "8.0.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + internal class MyComputer : Computer + { + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public MyComputer() + { + } + } +} diff --git a/Rei.Net.HttpServer/My/MyProject.cs b/Rei.Net.HttpServer/My/MyProject.cs new file mode 100644 index 0000000..ab4d63d --- /dev/null +++ b/Rei.Net.HttpServer/My/MyProject.cs @@ -0,0 +1,153 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.My.MyProject +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.ApplicationServices; +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.VisualBasic.MyServices.Internal; +using System; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Rei.Net.HttpServer.My +{ + [HideModuleName] + [StandardModule] + [GeneratedCode("MyTemplate", "8.0.0.0")] + internal sealed class MyProject + { + private static readonly MyProject.ThreadSafeObjectProvider m_ComputerObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_AppObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_UserObjectProvider = new MyProject.ThreadSafeObjectProvider(); + private static readonly MyProject.ThreadSafeObjectProvider m_MyWebServicesObjectProvider = new MyProject.ThreadSafeObjectProvider(); + + [DebuggerNonUserCode] + static MyProject() + { + } + + [HelpKeyword("My.Computer")] + internal static MyComputer Computer + { + [DebuggerHidden] get + { + return MyProject.m_ComputerObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.Application")] + internal static MyApplication Application + { + [DebuggerHidden] get + { + return MyProject.m_AppObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.User")] + internal static User User + { + [DebuggerHidden] get + { + return MyProject.m_UserObjectProvider.GetInstance; + } + } + + [HelpKeyword("My.WebServices")] + internal static MyProject.MyWebServices WebServices + { + [DebuggerHidden] get + { + return MyProject.m_MyWebServicesObjectProvider.GetInstance; + } + } + + [MyGroupCollection("System.Web.Services.Protocols.SoapHttpClientProtocol", "Create__Instance__", "Dispose__Instance__", "")] + [EditorBrowsable(EditorBrowsableState.Never)] + internal sealed class MyWebServices + { + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object o) + { + return base.Equals(RuntimeHelpers.GetObjectValue(o)); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public override int GetHashCode() + { + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + internal new Type GetType() + { + return typeof (MyProject.MyWebServices); + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public override string ToString() + { + return base.ToString(); + } + + [DebuggerHidden] + private static T Create__Instance__(T instance) where T : new() + { + if ((object) instance == null) + return Activator.CreateInstance(); + return instance; + } + + [DebuggerHidden] + private void Dispose__Instance__(ref T instance) + { + instance = default (T); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerHidden] + public MyWebServices() + { + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [ComVisible(false)] + internal sealed class ThreadSafeObjectProvider where T : new() + { + private readonly ContextValue m_Context; + + internal T GetInstance + { + [DebuggerHidden] get + { + T instance = this.m_Context.Value; + if ((object) instance == null) + { + instance = Activator.CreateInstance(); + this.m_Context.Value = instance; + } + return instance; + } + } + + [DebuggerHidden] + [EditorBrowsable(EditorBrowsableState.Never)] + public ThreadSafeObjectProvider() + { + this.m_Context = new ContextValue(); + } + } + } +} diff --git a/Rei.Net.HttpServer/My/MySettings.cs b/Rei.Net.HttpServer/My/MySettings.cs new file mode 100644 index 0000000..c0ce9f2 --- /dev/null +++ b/Rei.Net.HttpServer/My/MySettings.cs @@ -0,0 +1,35 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.My.MySettings +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Configuration; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace Rei.Net.HttpServer.My +{ + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + [CompilerGenerated] + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal sealed class MySettings : ApplicationSettingsBase + { + private static MySettings defaultInstance = (MySettings) SettingsBase.Synchronized((SettingsBase) new MySettings()); + + [DebuggerNonUserCode] + public MySettings() + { + } + + public static MySettings Default + { + get + { + return MySettings.defaultInstance; + } + } + } +} diff --git a/Rei.Net.HttpServer/My/MySettingsProperty.cs b/Rei.Net.HttpServer/My/MySettingsProperty.cs new file mode 100644 index 0000000..f84bcf0 --- /dev/null +++ b/Rei.Net.HttpServer/My/MySettingsProperty.cs @@ -0,0 +1,30 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.My.MySettingsProperty +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace Rei.Net.HttpServer.My +{ + [DebuggerNonUserCode] + [StandardModule] + [CompilerGenerated] + [HideModuleName] + internal sealed class MySettingsProperty + { + [HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} diff --git a/Rei.Net.HttpServer/My/Resources/Resources.cs b/Rei.Net.HttpServer/My/Resources/Resources.cs new file mode 100644 index 0000000..e73a535 --- /dev/null +++ b/Rei.Net.HttpServer/My/Resources/Resources.cs @@ -0,0 +1,52 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.My.Resources.Resources +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace Rei.Net.HttpServer.My.Resources +{ + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [HideModuleName] + [CompilerGenerated] + [DebuggerNonUserCode] + [StandardModule] + internal sealed class Resources + { + private static ResourceManager resourceMan; + private static CultureInfo resourceCulture; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals((object) Rei.Net.HttpServer.My.Resources.Resources.resourceMan, (object) null)) + Rei.Net.HttpServer.My.Resources.Resources.resourceMan = new ResourceManager("Rei.Net.HttpServer.Resources", typeof (Rei.Net.HttpServer.My.Resources.Resources).Assembly); + return Rei.Net.HttpServer.My.Resources.Resources.resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get + { + return Rei.Net.HttpServer.My.Resources.Resources.resourceCulture; + } + set + { + Rei.Net.HttpServer.My.Resources.Resources.resourceCulture = value; + } + } + } +} diff --git a/Rei.Net.HttpServer/MyAsyncResult.cs b/Rei.Net.HttpServer/MyAsyncResult.cs new file mode 100644 index 0000000..a86a2b4 --- /dev/null +++ b/Rei.Net.HttpServer/MyAsyncResult.cs @@ -0,0 +1,189 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyAsyncResult +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Rei.Net.HttpServer +{ + public class MyAsyncResult : IAsyncResult + { + private AsyncCallback _callback; + private object _asyncstate; + private bool _iscompleted; + private bool _isended; + private bool _async; + private ManualResetEvent _waithandle; + private object _returnvalue; + private object _syncobject; + private IAsyncResult _baseasyncresult; + private object _tag; + private Exception _ex; + + public MyAsyncResult(AsyncCallback callback, object asyncstate) + { + this._callback = callback; + this._asyncstate = RuntimeHelpers.GetObjectValue(asyncstate); + this._isended = false; + this._iscompleted = false; + this._async = false; + this._waithandle = (ManualResetEvent) null; + this._returnvalue = (object) null; + this._syncobject = RuntimeHelpers.GetObjectValue(new object()); + } + + public bool IsCompleted + { + get + { + return this._iscompleted; + } + } + + public object AsyncState + { + get + { + return this._asyncstate; + } + } + + public bool CompletedSynchronously + { + get + { + return this.IsCompleted && !this._async; + } + } + + public WaitHandle AsyncWaitHandle + { + get + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._waithandle == null) + this._waithandle = new ManualResetEvent(this._iscompleted); + } + finally + { + Monitor.Exit(syncobject); + } + return (WaitHandle) this._waithandle; + } + } + + internal object ReturnValue + { + get + { + return this._returnvalue; + } + set + { + this._returnvalue = RuntimeHelpers.GetObjectValue(value); + } + } + + internal IAsyncResult BaseAsyncResult + { + get + { + return this._baseasyncresult; + } + set + { + this._baseasyncresult = value; + } + } + + internal object Tag + { + get + { + return this._tag; + } + set + { + this._tag = RuntimeHelpers.GetObjectValue(value); + } + } + + internal void SetAsync() + { + this._async = true; + } + + internal void Complete(Exception ex) + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._iscompleted) + throw new InvalidOperationException(); + this._iscompleted = true; + this._ex = ex; + if (this._waithandle != null) + this._waithandle.Set(); + } + finally + { + Monitor.Exit(syncobject); + } + Exception ex1 = this._ex; + if (this._callback == null) + return; + this._callback((IAsyncResult) this); + } + + internal void Complete() + { + this.Complete((Exception) null); + } + + internal void AsyncEnd() + { + object syncobject1 = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject1); + Monitor.Enter(syncobject1); + bool iscompleted; + try + { + if (this._isended) + throw new InvalidOperationException(); + this._isended = true; + iscompleted = this._iscompleted; + } + finally + { + Monitor.Exit(syncobject1); + } + if (!iscompleted) + this.AsyncWaitHandle.WaitOne(); + object syncobject2 = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject2); + Monitor.Enter(syncobject2); + try + { + if (this._waithandle != null) + this._waithandle.Close(); + } + finally + { + Monitor.Exit(syncobject2); + } + if (this._ex != null) + throw new Exception("error", this._ex); + } + } +} diff --git a/Rei.Net.HttpServer/MyEndPoint.cs b/Rei.Net.HttpServer/MyEndPoint.cs new file mode 100644 index 0000000..8d336e4 --- /dev/null +++ b/Rei.Net.HttpServer/MyEndPoint.cs @@ -0,0 +1,145 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyEndPoint +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Xml.Serialization; + +namespace Rei.Net.HttpServer +{ + [DebuggerDisplay("{ToString()}")] + public class MyEndPoint + { + [XmlIgnore] + public IPEndPoint IPEndPoint; + + public MyEndPoint() + : this(IPAddress.Loopback, 0) + { + } + + public MyEndPoint(IPAddress address, int port) + { + this.IPEndPoint = new IPEndPoint(address, port); + } + + public MyEndPoint(string str) + { + this.IPEndPoint = MyEndPoint.Parse(str).IPEndPoint; + } + + public MyEndPoint(IPEndPoint ep) + { + this.IPEndPoint = ep; + } + + public override bool Equals(object obj) + { + return this.IPEndPoint.Equals((object) (obj as MyEndPoint).IPEndPoint); + } + + public override int GetHashCode() + { + return this.IPEndPoint.GetHashCode(); + } + + [Browsable(false)] + [System.Xml.Serialization.XmlText] + public string XmlText + { + get + { + return this.ToString(); + } + set + { + this.IPEndPoint = MyEndPoint.Parse(value).IPEndPoint; + } + } + + public bool IsLoopback + { + get + { + return IPAddress.IsLoopback(this.IPEndPoint.Address); + } + } + + public string Host + { + get + { + return this.IPEndPoint.Address.ToString(); + } + } + + public int Port + { + get + { + return this.IPEndPoint.Port; + } + } + + public override string ToString() + { + string str = this.IPEndPoint.Address.ToString(); + if (this.IPEndPoint.Address.AddressFamily == AddressFamily.InterNetworkV6) + str = "[" + str + "]"; + if (this.IPEndPoint.Port < 0) + return str; + return str + ":" + this.IPEndPoint.Port.ToString(); + } + + public static MyEndPoint Parse(string s) + { + MyEndPoint result = (MyEndPoint) null; + if (MyEndPoint.TryParse(s, ref result)) + return result; + throw new ArgumentException(); + } + + public static bool TryParse(string s, ref MyEndPoint result) + { + if (string.IsNullOrEmpty(s)) + return false; + s = s.Trim(); + if (s.Length < 2) + return false; + int startIndex1; + int startIndex2; + int startIndex3; + if ((int) s[0] == 91) + { + startIndex1 = 1; + startIndex2 = s.LastIndexOf("]"); + if (startIndex2 < 0) + return false; + int num = s.IndexOf(":", startIndex2); + if (num < 0 || num >= checked (s.Length - 1)) + return false; + startIndex3 = checked (num + 1); + } + else + { + startIndex1 = 0; + startIndex2 = s.IndexOf(":"); + if (startIndex2 < 0 || startIndex2 >= checked (s.Length - 1)) + return false; + startIndex3 = checked (startIndex2 + 1); + } + IPAddress address = (IPAddress) null; + int result1; + if (!IPAddress.TryParse(s.Substring(startIndex1, checked (startIndex2 - startIndex1)), out address) || !int.TryParse(s.Substring(startIndex3, checked (s.Length - startIndex3)), out result1) || (result1 < 0 || result1 > (int) ushort.MaxValue)) + return false; + result = new MyEndPoint(address, result1); + return true; + } + } +} diff --git a/Rei.Net.HttpServer/MyHttpListener.cs b/Rei.Net.HttpServer/MyHttpListener.cs new file mode 100644 index 0000000..549740b --- /dev/null +++ b/Rei.Net.HttpServer/MyHttpListener.cs @@ -0,0 +1,227 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyHttpListener +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Rei.Net.HttpServer +{ + [DebuggerDisplay("{toString}")] + public class MyHttpListener : IDisposable + { + private TcpListener m_listener; + private IPEndPoint m_endpoint; + private object m_syncobject; + private string m_servername; + private bool disposedValue; + + public MyHttpListener() + { + this.disposedValue = false; + this.m_servername = nameof (ServerName); + this.m_syncobject = RuntimeHelpers.GetObjectValue(new object()); + this.m_endpoint = new IPEndPoint(IPAddress.Loopback, 0); + } + + public void Start() + { + object syncobject = this.m_syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this.m_listener != null) + throw new ApplicationException(); + this.m_listener = new TcpListener(this.m_endpoint); + this.m_listener.Start(100); + } + finally + { + Monitor.Exit(syncobject); + } + } + + public void Stop() + { + object syncobject = this.m_syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this.m_listener != null) + this.m_listener.Stop(); + this.m_listener = (TcpListener) null; + } + finally + { + Monitor.Exit(syncobject); + } + } + + public void Close() + { + this.Dispose(); + } + + protected virtual void Dispose(bool disposing) + { + if (!this.disposedValue && disposing) + { + object syncobject = this.m_syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this.m_listener != null) + this.m_listener.Stop(); + this.m_listener = (TcpListener) null; + } + finally + { + Monitor.Exit(syncobject); + } + } + this.disposedValue = true; + } + + void IDisposable.Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + public IPEndPoint EndPoint + { + get + { + return this.m_endpoint; + } + set + { + if (value == null) + throw new ArgumentNullException(); + this.m_endpoint = value; + } + } + + public bool IsListening + { + get + { + object syncobject = this.m_syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + return this.m_listener != null; + } + finally + { + Monitor.Exit(syncobject); + } + } + } + + public bool IsPending + { + get + { + object syncobject = this.m_syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + return this.m_listener != null && this.m_listener.Pending(); + } + finally + { + Monitor.Exit(syncobject); + } + } + } + + public string ServerName + { + get + { + return this.m_servername; + } + set + { + if (value == null) + throw new ArgumentNullException(); + this.m_servername = value; + } + } + + public MyHttpServerConnection GetConnection() + { + return this.EndGetConnection(this.BeginGetConnection((AsyncCallback) null, (object) null)); + } + + public IAsyncResult BeginGetConnection(AsyncCallback callback, object asyncstate) + { + MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(asyncstate)); + object syncobject = this.m_syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this.m_listener == null) + throw new InvalidOperationException(); + myAsyncResult.Tag = (object) this.m_listener; + this.m_listener.BeginAcceptSocket(new AsyncCallback(this.OnGetConnection), (object) myAsyncResult); + } + finally + { + Monitor.Exit(syncobject); + } + return (IAsyncResult) myAsyncResult; + } + + private void OnGetConnection(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + TcpListener tag = (TcpListener) asyncState.Tag; + try + { + Socket basesocket = tag.EndAcceptSocket(asyncresult); + basesocket.SendTimeout = 1000; + basesocket.ReceiveTimeout = 1000; + MyHttpServerConnection serverConnection = new MyHttpServerConnection(basesocket); + asyncState.ReturnValue = (object) serverConnection; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + public MyHttpServerConnection EndGetConnection(IAsyncResult ar) + { + MyAsyncResult myAsyncResult = (MyAsyncResult) ar; + myAsyncResult.AsyncEnd(); + return (MyHttpServerConnection) myAsyncResult.ReturnValue; + } + + public override string ToString() + { + return this.m_servername + " endpoint:" + this.m_endpoint.ToString(); + } + } +} diff --git a/Rei.Net.HttpServer/MyHttpServerBadRequestException.cs b/Rei.Net.HttpServer/MyHttpServerBadRequestException.cs new file mode 100644 index 0000000..7044c88 --- /dev/null +++ b/Rei.Net.HttpServer/MyHttpServerBadRequestException.cs @@ -0,0 +1,29 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyHttpServerBadRequestException +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using System; + +namespace Rei.Net.HttpServer +{ + public class MyHttpServerBadRequestException : Exception + { + private MyHttpServerRequest _req; + + internal MyHttpServerBadRequestException(MyHttpServerRequest req) + { + this._req = req; + this._req._badrequest = true; + } + + public MyHttpServerRequest Request + { + get + { + return this._req; + } + } + } +} diff --git a/Rei.Net.HttpServer/MyHttpServerConnection.cs b/Rei.Net.HttpServer/MyHttpServerConnection.cs new file mode 100644 index 0000000..50908cf --- /dev/null +++ b/Rei.Net.HttpServer/MyHttpServerConnection.cs @@ -0,0 +1,1664 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyHttpServerConnection +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; + +namespace Rei.Net.HttpServer +{ + [DebuggerDisplay("{toString}")] + public class MyHttpServerConnection : IDisposable + { + private static string[] HeaderOrder = new string[46] + { + "Cache-Control", + "Connection", + "Date", + "Pragma", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Via", + "Warning", + "Accept-Charset", + "Accept-Encoding", + "Accept-Language", + "Authorization", + "Expect", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", + "Max-Forwards", + "Proxy-Authorization", + "Range", + "Referer", + "TE", + "User-Agent", + "Accept-Ranges", + "Age", + "ETag", + "Location", + "Proxy-Authenticate", + "Retry-After", + "Server", + "Vary", + "WWW-Authenticate", + "Allow", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-MD5", + "Content-Range", + "Content-Type", + "Expires", + "Last-Modified" + }; + private object _Tag; + private object _syncobject; + private LineReadableSocketStream _st; + private bool _needclose; + private bool _isconnected; + private MyEndPoint _remoteep; + private int _requesttimeout; + private int _responsetimeout; + private MyHttpServerConnection.StreamStateType _req_state; + private bool _req_closed; + private string _req_method; + private MyHttpServerConnection.BodyLengthType _req_bodylengthtype; + private long _req_contentlength; + private string _req_currentheader; + private long _req_currentposition; + private int _req_currentchunksize; + private bool _req_expect100continue; + private MyHttpServerConnection.StreamStateType _res_state; + private bool _res_closed; + private MyHttpServerConnection.BodyLengthType _res_bodylengthtype; + private long _res_contentlength; + private bool _res_sentexpect100continue; + private long _res_currentposition; + private string _res_headers; + private bool disposedValue; + + public MyHttpServerConnection(Socket basesocket) + { + this.disposedValue = false; + this._syncobject = RuntimeHelpers.GetObjectValue(new object()); + this._remoteep = new MyEndPoint((IPEndPoint) basesocket.RemoteEndPoint); + this._st = new LineReadableSocketStream(basesocket); + this._needclose = false; + this._isconnected = true; + this._requesttimeout = 300000; + this._responsetimeout = 300000; + this._req_state = MyHttpServerConnection.StreamStateType.Initial; + this._req_closed = false; + this._res_state = MyHttpServerConnection.StreamStateType.Initial; + this._res_closed = false; + } + + public LineReadableSocketStream BaseStream + { + get + { + return this._st; + } + set + { + this._st = value; + } + } + + public int ReadTimeout + { + get + { + return this._st.ReadTimeout; + } + set + { + this._st.ReadTimeout = value; + } + } + + public int WriteTimeout + { + get + { + return this._st.WriteTimeout; + } + set + { + this._st.WriteTimeout = value; + } + } + + public int RequestTimeout + { + get + { + return this._requesttimeout; + } + set + { + this._requesttimeout = value; + } + } + + public int ResponseTimeout + { + get + { + return this._responsetimeout; + } + set + { + this._responsetimeout = value; + } + } + + public bool IsConnected + { + get + { + return this._isconnected; + } + } + + public MyEndPoint RemoteEp + { + get + { + return this._remoteep; + } + } + + public object Tag + { + get + { + return this._Tag; + } + set + { + this._Tag = RuntimeHelpers.GetObjectValue(value); + } + } + + protected virtual void Dispose(bool disposing) + { + if (!this.disposedValue && disposing && this._st != null) + { + this._st.Close(); + this._st = (LineReadableSocketStream) null; + } + this.disposedValue = true; + } + + public void Close() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + public MyHttpServerRequest ReceiveRequest() + { + return this.ReceiveRequest(this.RequestTimeout); + } + + public MyHttpServerRequest ReceiveRequest(int timeout) + { + IAsyncResult request = this.BeginReceiveRequest((AsyncCallback) null, (object) null); + if (!request.CompletedSynchronously && !request.AsyncWaitHandle.WaitOne(timeout, false)) + throw new IOException("Timeout"); + return this.EndReceiveRequest(request); + } + + public IAsyncResult BeginReceiveRequest(AsyncCallback callback, object asyncstate) + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._req_state != MyHttpServerConnection.StreamStateType.Initial) + throw new InvalidOperationException(); + this._req_state = MyHttpServerConnection.StreamStateType.Changing; + } + finally + { + Monitor.Exit(syncobject); + } + MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(asyncstate)); + this._st.BeginReadLine(new AsyncCallback(this.OnRead_RequestLine), (object) myAsyncResult); + return (IAsyncResult) myAsyncResult; + } + + private void OnRead_RequestLine(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerRequest req = new MyHttpServerRequest(); + asyncState.ReturnValue = (object) req; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + req._requestline = this._st.EndReadLine(asyncresult); + if (req._requestline == null) + asyncState.Complete(); + else if (Operators.CompareString(req._requestline, "", false) == 0) + { + this._st.BeginReadLine(new AsyncCallback(this.OnRead_RequestLine), (object) asyncState); + } + else + { + string[] strArray = req._requestline.Split(new char[1] + { + ' ' + }, 3, StringSplitOptions.RemoveEmptyEntries); + if (strArray.Length < 2) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException(req); + } + if (strArray[2].Length != 8) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException(req); + } + if (string.Compare(strArray[2].Substring(0, 5), "HTTP/", StringComparison.InvariantCultureIgnoreCase) != 0) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException(req); + } + float.Parse(strArray[2].Substring(5, 3)); + req._method = strArray[0]; + req._rawuri = strArray[1]; + req._version = strArray[2]; + this._req_method = req._method; + this._req_currentheader = (string) null; + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Header), RuntimeHelpers.GetObjectValue(asyncresult.AsyncState)); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + } + } + + private void OnRead_Header(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerRequest returnValue = (MyHttpServerRequest) asyncState.ReturnValue; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + string Left = this._st.EndReadLine(asyncresult); + if (Left == null) + throw new MyHttpServerConnectionClosedException("Client Closed"); + if (this._req_currentheader == null) + { + this._req_currentheader = Left; + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Header), RuntimeHelpers.GetObjectValue(asyncresult.AsyncState)); + return; + } + if (Left.Length > 0 && (Operators.CompareString(Conversions.ToString(Left[0]), " ", false) == 0 || Operators.CompareString(Conversions.ToString(Left[0]), "\t", false) == 0)) + { + this._req_currentheader = this._req_currentheader + Left; + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Header), RuntimeHelpers.GetObjectValue(asyncresult.AsyncState)); + return; + } + int length = this._req_currentheader.IndexOf(":"); + if (length < 0) + { + returnValue._requestheaders.Add(this._req_currentheader, ""); + } + else + { + string name = this._req_currentheader.Substring(0, length).Trim(); + string str = this._req_currentheader.Substring(checked (length + 1)).Trim(); + returnValue._requestheaders.Add(name, str); + } + if (Operators.CompareString(Left, "", false) != 0) + { + this._req_currentheader = Left; + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Header), RuntimeHelpers.GetObjectValue(asyncresult.AsyncState)); + return; + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + public MyHttpServerRequest EndReceiveRequest(IAsyncResult asyncresult) + { + MyAsyncResult myAsyncResult = (MyAsyncResult) asyncresult; + myAsyncResult.AsyncEnd(); + MyHttpServerRequest returnValue = (MyHttpServerRequest) myAsyncResult.ReturnValue; + if (returnValue._requestline == null) + return (MyHttpServerRequest) null; + string requestheader1 = returnValue._requestheaders["Content-Length"]; + if (requestheader1 != null) + { + if (!long.TryParse(requestheader1, out returnValue._contentlength)) + returnValue._contentlength = 0L; + } + else + returnValue._contentlength = 0L; + this._req_contentlength = returnValue._contentlength; + string requestheader2 = returnValue._requestheaders["Transfer-Encoding"]; + bool flag; + if (requestheader2 != null) + { + if (string.Compare(requestheader2.Trim(), "chunked", StringComparison.InvariantCultureIgnoreCase) != 0) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException(returnValue); + } + flag = true; + } + else + flag = false; + string[] values1 = returnValue._requestheaders.GetValues("Connection"); + if (values1 != null) + { + int num1 = 0; + int num2 = checked (values1.Length - 1); + int index = num1; + while (index <= num2) + { + if (string.Compare(values1[index], "Close", StringComparison.InvariantCultureIgnoreCase) == 0) + this._needclose = true; + checked { ++index; } + } + } + string[] values2 = returnValue._requestheaders.GetValues("Expect"); + returnValue._expect100continue = false; + if (values2 != null) + { + int num1 = 0; + int num2 = checked (values2.Length - 1); + int index = num1; + while (index <= num2) + { + if (string.Compare(values2[index], "100-continue", StringComparison.InvariantCultureIgnoreCase) == 0) + returnValue._expect100continue = true; + checked { ++index; } + } + } + this._req_expect100continue = returnValue._expect100continue; + this._res_sentexpect100continue = false; + returnValue._host = returnValue._requestheaders["Host"]; + if (returnValue._host == null) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException(returnValue); + } + if (Operators.CompareString(returnValue._rawuri, "*", false) != 0 && !returnValue._rawuri.StartsWith("http://")) + { + if (returnValue._rawuri.StartsWith("/")) + { + if (!Uri.TryCreate("http://" + returnValue._host + returnValue._rawuri, UriKind.Absolute, out returnValue._requesturi)) + throw new MyHttpServerBadRequestException(returnValue); + } + else + { + if (Operators.CompareString(returnValue.Method.ToUpperInvariant(), "CONNECT", false) != 0) + throw new MyHttpServerBadRequestException(returnValue); + if (!Uri.TryCreate("http://" + returnValue._rawuri, UriKind.Absolute, out returnValue._requesturi)) + throw new MyHttpServerBadRequestException(returnValue); + if (returnValue._requesturi.Segments.Length != 1) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException(returnValue); + } + } + } + if (flag) + this._req_bodylengthtype = MyHttpServerConnection.BodyLengthType.Chunk; + else if (returnValue._contentlength >= 0L) + { + this._req_bodylengthtype = MyHttpServerConnection.BodyLengthType.ContentLength; + } + else + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException(returnValue); + } + returnValue._reqstream = (Stream) new MyHttpServerConnection.RequestStream(this); + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this._req_state = MyHttpServerConnection.StreamStateType.HeaderFinished; + if (returnValue._contentlength == 0L) + this._req_state = MyHttpServerConnection.StreamStateType.BodyFinished; + } + finally + { + Monitor.Exit(syncobject); + } + return returnValue; + } + + private long RequestStreamLength() + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._req_state < MyHttpServerConnection.StreamStateType.HeaderFinished) + throw new InvalidOperationException(); + } + finally + { + Monitor.Exit(syncobject); + } + return this._req_contentlength; + } + + private long RequestStreamPosition() + { + return this._req_currentposition; + } + + private IAsyncResult RequestStreamBeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + if (count < 0) + throw new ArgumentOutOfRangeException(); + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + bool flag; + try + { + flag = this._req_state == MyHttpServerConnection.StreamStateType.BodyFinished; + if (!flag) + { + if (this._req_state != MyHttpServerConnection.StreamStateType.HeaderFinished) + throw new InvalidOperationException(); + this._req_state = MyHttpServerConnection.StreamStateType.Changing; + } + if (this._req_expect100continue) + { + if (!this._res_sentexpect100continue) + { + if (!flag) + { + if (this._res_state != MyHttpServerConnection.StreamStateType.Initial) + throw new InvalidOperationException(); + this._res_state = MyHttpServerConnection.StreamStateType.Changing; + } + } + } + } + finally + { + Monitor.Exit(syncobject); + } + MyAsyncResult mar = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(state)); + if (flag) + { + mar.ReturnValue = (object) 0; + mar.Complete(); + return (IAsyncResult) mar; + } + mar.Tag = (object) new MyHttpServerConnection.StreamReadWriteParameter() + { + buffer = buffer, + offset = offset, + count = count + }; + if (this._req_expect100continue && !this._res_sentexpect100continue) + { + byte[] bytes = Encoding.UTF8.GetBytes("HTTP/1.1 100 Continue\r\n\r\n"); + this._st.BeginWrite(bytes, 0, bytes.Length, new AsyncCallback(this.OnRead_SendExpect100Continue), (object) mar); + } + else + this.InnerRequestStreamBeginRead2(mar); + return (IAsyncResult) mar; + } + + private void OnRead_SendExpect100Continue(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerConnection.StreamReadWriteParameter tag = (MyHttpServerConnection.StreamReadWriteParameter) asyncState.Tag; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + this._st.EndWrite(asyncresult); + this._res_sentexpect100continue = true; + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this._res_state = MyHttpServerConnection.StreamStateType.Initial; + } + finally + { + Monitor.Exit(syncobject); + } + this.InnerRequestStreamBeginRead2(asyncState); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + } + } + + private void InnerRequestStreamBeginRead2(MyAsyncResult mar) + { + MyHttpServerConnection.StreamReadWriteParameter tag = (MyHttpServerConnection.StreamReadWriteParameter) mar.Tag; + switch (this._req_bodylengthtype) + { + case MyHttpServerConnection.BodyLengthType.Chunk: + if (this._req_currentchunksize == 0) + { + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Body_ChunkSize), (object) mar); + break; + } + int count1 = tag.count; + if (count1 > this._req_currentchunksize) + count1 = this._req_currentchunksize; + this._st.BeginRead(tag.buffer, tag.offset, count1, new AsyncCallback(this.OnRead_Body_ChunkData), (object) mar); + break; + case MyHttpServerConnection.BodyLengthType.ContentLength: + int count2 = tag.count; + if (checked (this._req_currentposition + (long) count2) > this._req_contentlength) + count2 = checked ((int) (this._req_contentlength - this._req_currentposition)); + this._st.BeginRead(tag.buffer, tag.offset, count2, new AsyncCallback(this.OnRead_Body_ContentLength), (object) mar); + break; + default: + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException((MyHttpServerRequest) null); + } + } + + private void OnRead_Body_ContentLength(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + int num = this._st.EndRead(asyncresult); + if (num == 0) + throw new MyHttpServerConnectionClosedException("Client Closed"); + this._req_currentposition = checked (this._req_currentposition + (long) num); + asyncState.ReturnValue = (object) num; + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + private void OnRead_Body_ChunkSize(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerConnection.StreamReadWriteParameter tag = (MyHttpServerConnection.StreamReadWriteParameter) asyncState.Tag; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + string str = this._st.EndReadLine(asyncresult); + if (str == null) + throw new MyHttpServerConnectionClosedException("Client Closed"); + int length = str.IndexOf(";"); + if (length >= 0) + str = str.Substring(0, length); + if (!int.TryParse(str.Trim(), NumberStyles.AllowHexSpecifier, (IFormatProvider) null, out this._req_currentchunksize)) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException((MyHttpServerRequest) null); + } + if (this._req_currentchunksize == 0) + { + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Body_ChunkTrailer), (object) asyncState); + } + else + { + int count = tag.count; + if (count > this._req_currentchunksize) + count = this._req_currentchunksize; + this._st.BeginRead(tag.buffer, tag.offset, count, new AsyncCallback(this.OnRead_Body_ChunkData), (object) asyncState); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + } + } + + private void OnRead_Body_ChunkData(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + int num = this._st.EndRead(asyncresult); + if (num == 0) + { + this.RequestStreamClose(); + throw new MyHttpServerBadRequestException((MyHttpServerRequest) null); + } + this._req_currentchunksize = checked (this._req_currentchunksize - num); + this._req_currentposition = checked (this._req_currentposition + (long) num); + asyncState.ReturnValue = (object) num; + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Body_ChunkDataEnd), (object) asyncState); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + } + } + + private void OnRead_Body_ChunkDataEnd(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + this._st.EndReadLine((IAsyncResult) asyncState); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + private void OnRead_Body_ChunkTrailer(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + if (this._st.EndReadLine((IAsyncResult) asyncState).Length == 0) + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this._req_state = MyHttpServerConnection.StreamStateType.BodyFinished; + } + finally + { + Monitor.Exit(syncobject); + } + asyncState.ReturnValue = (object) 0; + asyncState.Complete(); + } + else + this._st.BeginReadLine(new AsyncCallback(this.OnRead_Body_ChunkTrailer), (object) asyncState); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + private int RequestStreamEndRead(IAsyncResult asyncResult) + { + MyAsyncResult myAsyncResult = (MyAsyncResult) asyncResult; + myAsyncResult.AsyncEnd(); + int returnValue = (int) myAsyncResult.ReturnValue; + if (returnValue == 0 && this._req_state != MyHttpServerConnection.StreamStateType.BodyFinished) + throw new MyHttpServerBadRequestException((MyHttpServerRequest) null); + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this._req_state = MyHttpServerConnection.StreamStateType.HeaderFinished; + if (this._req_currentposition >= this._req_contentlength) + this._req_state = MyHttpServerConnection.StreamStateType.BodyFinished; + } + finally + { + Monitor.Exit(syncobject); + } + return returnValue; + } + + public Stream SendResponse(MyHttpServerResponse response) + { + return this.SendResponse(response, this.ResponseTimeout); + } + + public Stream SendResponse(MyHttpServerResponse response, int timeout) + { + IAsyncResult asyncresult = this.BeginSendResponse(response, (AsyncCallback) null, (object) null); + if (!asyncresult.CompletedSynchronously && !asyncresult.AsyncWaitHandle.WaitOne(timeout, false)) + throw new IOException("Timeout"); + return this.EndSendResponse(asyncresult); + } + + public IAsyncResult BeginSendResponse(MyHttpServerResponse response, AsyncCallback callback, object asyncstate) + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._res_state != MyHttpServerConnection.StreamStateType.Initial) + throw new InvalidOperationException(); + this._res_state = MyHttpServerConnection.StreamStateType.Changing; + } + finally + { + Monitor.Exit(syncobject); + } + MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(asyncstate)); + NameValueCollection nameValueCollection = new NameValueCollection(response._responseheaders); + if (Operators.CompareString(this._req_method, "HEAD", false) == 0) + { + this._res_bodylengthtype = MyHttpServerConnection.BodyLengthType.NoBody; + this._res_contentlength = response._contentlength; + } + else if (response._statuscode == 204 || response._statuscode == 304) + { + this._res_bodylengthtype = MyHttpServerConnection.BodyLengthType.ContentLength; + this._res_contentlength = 0L; + } + else if (response._sendchunked) + { + this._res_bodylengthtype = MyHttpServerConnection.BodyLengthType.Chunk; + this._res_contentlength = -1L; + } + else + { + if (response._contentlength < 0L) + throw new Exception(); + this._res_bodylengthtype = MyHttpServerConnection.BodyLengthType.ContentLength; + this._res_contentlength = response._contentlength; + } + if (string.IsNullOrEmpty(response._statusdesc)) + { + switch (response.StatusCode) + { + case 200: + response._statusdesc = "OK"; + break; + case 201: + response._statusdesc = "Created"; + break; + case 202: + response._statusdesc = "Accepted"; + break; + case 203: + response._statusdesc = "Non-Authoritative Information"; + break; + case 204: + response._statusdesc = "No Content"; + break; + case 205: + response._statusdesc = "Reset Content"; + break; + case 206: + response._statusdesc = "Partial Content"; + break; + case 207: + response._statusdesc = "Multi-Status"; + break; + case 300: + response._statusdesc = "Multiple Choices"; + break; + case 301: + response._statusdesc = "Moved Permanently"; + break; + case 302: + response._statusdesc = "Found"; + break; + case 303: + response._statusdesc = "See Other"; + break; + case 304: + response._statusdesc = "Not Modified"; + break; + case 305: + response._statusdesc = "Use Proxy"; + break; + case 306: + response._statusdesc = "(Unused)"; + break; + case 307: + response._statusdesc = "Temporary Redirect"; + break; + case 400: + response._statusdesc = "Bad Request"; + break; + case 401: + response._statusdesc = "Unauthorized"; + break; + case 402: + response._statusdesc = "Payment Required"; + break; + case 403: + response._statusdesc = "Forbidden"; + break; + case 404: + response._statusdesc = "Not Found"; + break; + case 405: + response._statusdesc = "Method Not Allowed"; + break; + case 406: + response._statusdesc = "Not Acceptable"; + break; + case 407: + response._statusdesc = "Proxy Authentication Required"; + break; + case 408: + response._statusdesc = "Request Timeout"; + break; + case 409: + response._statusdesc = "Conflict"; + break; + case 410: + response._statusdesc = "Gone"; + break; + case 411: + response._statusdesc = "Length Required"; + break; + case 412: + response._statusdesc = "Precondition Failed"; + break; + case 413: + response._statusdesc = "Request Entity Too Large"; + break; + case 414: + response._statusdesc = "Request-URI Too Long"; + break; + case 415: + response._statusdesc = "Unsupported Media Type"; + break; + case 416: + response._statusdesc = "Requested Range Not Satisfiable"; + break; + case 417: + response._statusdesc = "Expectation Failed"; + break; + case 422: + response._statusdesc = "Unprocessable Entity"; + break; + case 423: + response._statusdesc = "Locked"; + break; + case 424: + response._statusdesc = "Failed Dependency"; + break; + case 500: + response._statusdesc = "Internal Server Error"; + break; + case 501: + response._statusdesc = "Not Implemented"; + break; + case 502: + response._statusdesc = "Bad Gateway"; + break; + case 503: + response._statusdesc = "Service Unavailable"; + break; + case 504: + response._statusdesc = "Gateway Timeout"; + break; + case 505: + response._statusdesc = "HTTP Version Not Supported"; + break; + case 506: + response._statusdesc = "Variant Also Negotiates"; + break; + case 507: + response._statusdesc = "Insufficient Storage"; + break; + default: + response._statusdesc = ""; + break; + } + } + string str1 = string.Join(" ", new string[3] + { + "HTTP/1.1", + response._statuscode.ToString(), + response._statusdesc + }); + if (this._needclose) + nameValueCollection.Add("Connection", "Close"); + string[] values1 = nameValueCollection.GetValues("Connection"); + if (values1 != null) + { + int num1 = 0; + int num2 = checked (values1.Length - 1); + int index = num1; + while (index <= num2) + { + if (string.Compare(values1[index], "Close", StringComparison.InvariantCultureIgnoreCase) == 0) + this._needclose = true; + checked { ++index; } + } + } + if (nameValueCollection["Transfer-Encoding"] != null && Operators.CompareString(nameValueCollection["Transfer-Encoding"], "chunked", false) != 0) + throw new NotImplementedException(); + if (response._sendchunked) + nameValueCollection["Transfer-Encoding"] = "chunked"; + if (nameValueCollection["Date"] == null) + nameValueCollection.Add("Date", DateTime.Now.ToUniversalTime().ToString("r")); + if (this._res_bodylengthtype == MyHttpServerConnection.BodyLengthType.Chunk) + nameValueCollection.Remove("Content-Length"); + else + nameValueCollection["Content-Length"] = this._res_contentlength.ToString(); + List stringList = new List(); + stringList.Add(str1); + string[] headerOrder = MyHttpServerConnection.HeaderOrder; + int index1 = 0; + while (index1 < headerOrder.Length) + { + string name = headerOrder[index1]; + string str2 = nameValueCollection.Get(name); + if (str2 != null) + { + stringList.Add(name + ": " + str2.Trim()); + nameValueCollection.Remove(name); + } + checked { ++index1; } + } + try + { + foreach (object key in nameValueCollection.Keys) + { + string str2 = Conversions.ToString(key); + string str3 = nameValueCollection.Get(str2); + if (string.Compare(str2, "Set-Cookie", StringComparison.InvariantCultureIgnoreCase) == 0) + { + string[] values2 = nameValueCollection.GetValues(str2); + int index2 = 0; + while (index2 < values2.Length) + { + string str4 = values2[index2]; + stringList.Add(str2 + ": " + str4.Trim()); + checked { ++index2; } + } + } + else + stringList.Add(str2 + ": " + str3.Trim()); + } + } + finally + { + IEnumerator enumerator; + if (enumerator is IDisposable) + (enumerator as IDisposable).Dispose(); + } + stringList.Add(""); + stringList.Add(""); + this._res_headers = string.Join("\r\n", stringList.ToArray()); + byte[] bytes = Encoding.UTF8.GetBytes(this._res_headers); + this._st.BeginWrite(bytes, 0, bytes.Length, new AsyncCallback(this.OnSend_Header), (object) myAsyncResult); + return (IAsyncResult) myAsyncResult; + } + + private void OnSend_Header(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + this._st.EndWrite(asyncresult); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + public Stream EndSendResponse(IAsyncResult asyncresult) + { + MyAsyncResult myAsyncResult = (MyAsyncResult) asyncresult; + myAsyncResult.AsyncEnd(); + myAsyncResult.ReturnValue = (object) new MyHttpServerConnection.ResponseStream(this); + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this._res_state = MyHttpServerConnection.StreamStateType.HeaderFinished; + if (this._res_bodylengthtype != MyHttpServerConnection.BodyLengthType.NoBody) + { + if (this._res_bodylengthtype == MyHttpServerConnection.BodyLengthType.ContentLength) + { + if (this._res_contentlength != 0L) + goto label_6; + } + else + goto label_6; + } + this._res_state = MyHttpServerConnection.StreamStateType.BodyFinished; + } + finally + { + Monitor.Exit(syncobject); + } +label_6: + return (Stream) myAsyncResult.ReturnValue; + } + + private long ResponseStreamLength() + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._res_state < MyHttpServerConnection.StreamStateType.HeaderFinished) + throw new InvalidOperationException(); + } + finally + { + Monitor.Exit(syncobject); + } + return this._res_contentlength; + } + + private long ResponseStreamPosition() + { + return this._res_currentposition; + } + + private IAsyncResult ResponseStreamBeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + if (count < 0) + throw new ArgumentOutOfRangeException(); + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._res_state == MyHttpServerConnection.StreamStateType.BodyFinished) + throw new InvalidOperationException("message body is finished"); + if (this._res_state != MyHttpServerConnection.StreamStateType.HeaderFinished) + throw new InvalidOperationException(); + this._res_state = MyHttpServerConnection.StreamStateType.Changing; + } + finally + { + Monitor.Exit(syncobject); + } + MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(state)); + MyHttpServerConnection.StreamReadWriteParameter readWriteParameter = new MyHttpServerConnection.StreamReadWriteParameter(); + readWriteParameter.buffer = buffer; + readWriteParameter.offset = offset; + readWriteParameter.count = count; + myAsyncResult.Tag = (object) readWriteParameter; + switch (this._res_bodylengthtype) + { + case MyHttpServerConnection.BodyLengthType.NoBody: + myAsyncResult.Complete(); + return (IAsyncResult) myAsyncResult; + case MyHttpServerConnection.BodyLengthType.Chunk: + if (readWriteParameter.count == 0) + { + myAsyncResult.Complete(); + return (IAsyncResult) myAsyncResult; + } + byte[] bytes = Encoding.UTF8.GetBytes(readWriteParameter.count.ToString("x") + "\r\n"); + this._st.BeginWrite(bytes, 0, bytes.Length, new AsyncCallback(this.OnSend_Body_Chunk_Size), (object) myAsyncResult); + break; + case MyHttpServerConnection.BodyLengthType.ContentLength: + if (checked ((long) readWriteParameter.count + this._res_currentposition) > this._res_contentlength) + throw new IOException("Content length is not match"); + this._st.BeginWrite(readWriteParameter.buffer, readWriteParameter.offset, readWriteParameter.count, new AsyncCallback(this.OnSend_Body_ContentLength), (object) myAsyncResult); + break; + default: + throw new Exception(); + } + return (IAsyncResult) myAsyncResult; + } + + private void OnSend_Body_Chunk_Size(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerConnection.StreamReadWriteParameter tag = (MyHttpServerConnection.StreamReadWriteParameter) asyncState.Tag; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + this._st.EndWrite(asyncresult); + this._st.BeginWrite(tag.buffer, tag.offset, tag.count, new AsyncCallback(this.OnSend_Body_Chunk_Data), (object) asyncState); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + } + } + + private void OnSend_Body_Chunk_Data(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerConnection.StreamReadWriteParameter tag = (MyHttpServerConnection.StreamReadWriteParameter) asyncState.Tag; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + this._st.EndWrite(asyncresult); + this._res_currentposition = checked (this._res_currentposition + (long) tag.count); + byte[] buffer = new byte[2]{ (byte) 13, (byte) 10 }; + this._st.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(this.OnSend_Body_Chunk_Data_End), (object) asyncState); + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + } + } + + private void OnSend_Body_Chunk_Data_End(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerConnection.StreamReadWriteParameter tag = (MyHttpServerConnection.StreamReadWriteParameter) asyncState.Tag; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + this._st.EndWrite(asyncresult); + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this._res_state = MyHttpServerConnection.StreamStateType.HeaderFinished; + } + finally + { + Monitor.Exit(syncobject); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + private void OnSend_Body_ContentLength(IAsyncResult asyncresult) + { + MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState; + MyHttpServerConnection.StreamReadWriteParameter tag = (MyHttpServerConnection.StreamReadWriteParameter) asyncState.Tag; + if (!asyncresult.CompletedSynchronously) + asyncState.SetAsync(); + try + { + this._st.EndWrite(asyncresult); + this._res_currentposition = checked (this._res_currentposition + (long) tag.count); + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._res_currentposition == this._res_contentlength) + this._res_state = MyHttpServerConnection.StreamStateType.BodyFinished; + else if (this._res_currentposition > this._res_contentlength) + asyncState.Complete(new Exception()); + else + this._res_state = MyHttpServerConnection.StreamStateType.HeaderFinished; + } + finally + { + Monitor.Exit(syncobject); + } + } + catch (Exception ex1) + { + ProjectData.SetProjectError(ex1); + Exception ex2 = ex1; + asyncState.Complete(ex2); + ProjectData.ClearProjectError(); + return; + } + asyncState.Complete(); + } + + private void ResponseStreamEndWrite(IAsyncResult asyncResult) + { + ((MyAsyncResult) asyncResult).AsyncEnd(); + } + + internal void RequestStreamClose() + { + this._req_closed = true; + if (!this._res_closed) + return; + this.CloseSeries(); + } + + private void ResponseStreamClose() + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + if (this._res_state == MyHttpServerConnection.StreamStateType.HeaderFinished && this._res_bodylengthtype == MyHttpServerConnection.BodyLengthType.Chunk) + { + this._res_state = MyHttpServerConnection.StreamStateType.Changing; + byte[] bytes = Encoding.UTF8.GetBytes("0\r\n\r\n"); + this._st.EndWrite(this._st.BeginWrite(bytes, 0, bytes.Length, (AsyncCallback) null, (object) null)); + this._res_state = MyHttpServerConnection.StreamStateType.BodyFinished; + } + else if (this._res_bodylengthtype == MyHttpServerConnection.BodyLengthType.ContentLength) + { + if (this._res_state != MyHttpServerConnection.StreamStateType.BodyFinished) + throw new Exception(); + } + } + finally + { + Monitor.Exit(syncobject); + } + this._res_closed = true; + if (!this._req_closed) + return; + this.CloseSeries(); + } + + private void CloseSeries() + { + if (!this._res_closed || !this._req_closed) + return; + this._needclose = this._needclose | this._req_state != MyHttpServerConnection.StreamStateType.BodyFinished; + this._needclose = this._needclose | this._res_state != MyHttpServerConnection.StreamStateType.BodyFinished; + if (this._needclose) + { + this._st.Close(); + this._st = (LineReadableSocketStream) null; + this._isconnected = false; + } + else + { + object syncobject = this._syncobject; + ObjectFlowControl.CheckForSyncLockOnValueType(syncobject); + Monitor.Enter(syncobject); + try + { + this._res_currentposition = 0L; + this._req_currentposition = 0L; + this._req_currentchunksize = 0; + this._req_closed = false; + this._res_closed = false; + this._req_state = MyHttpServerConnection.StreamStateType.Initial; + this._res_state = MyHttpServerConnection.StreamStateType.Initial; + } + finally + { + Monitor.Exit(syncobject); + } + } + } + + public override string ToString() + { + string str = base.ToString(); + if (!this.IsConnected) + return str + "\r\nDicsonnected"; + return str + "\r\n" + this._remoteep.ToString() + "\r\n" + this._req_state.ToString(); + } + + private enum BodyLengthType + { + Unknown, + NoBody, + Chunk, + ContentLength, + Connection, + } + + private enum StreamStateType + { + Changing, + Initial, + HeaderFinished, + BodyFinished, + } + + private class StreamReadWriteParameter + { + public byte[] buffer; + public int offset; + public int count; + + [DebuggerNonUserCode] + public StreamReadWriteParameter() + { + } + } + + private class RequestStream : Stream + { + private MyHttpServerConnection _owner; + + public RequestStream(MyHttpServerConnection owner) + { + this._owner = owner; + } + + public override void Close() + { + if (this._owner != null) + this._owner.RequestStreamClose(); + this._owner = (MyHttpServerConnection) null; + base.Close(); + } + + public override bool CanRead + { + get + { + return true; + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override bool CanWrite + { + get + { + return false; + } + } + + public override void Flush() + { + throw new NotImplementedException(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + + public override long Length + { + get + { + if (this._owner == null) + throw new ObjectDisposedException(this.ToString()); + return this._owner.RequestStreamLength(); + } + } + + public override long Position + { + get + { + if (this._owner == null) + throw new ObjectDisposedException(this.ToString()); + return this._owner.RequestStreamPosition(); + } + set + { + throw new NotImplementedException(); + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + IAsyncResult asyncResult = this._owner.RequestStreamBeginRead(buffer, offset, count, (AsyncCallback) null, (object) null); + if (!asyncResult.CompletedSynchronously && !asyncResult.AsyncWaitHandle.WaitOne(this._owner.ReadTimeout, false)) + throw new IOException("Timeout"); + return this._owner.RequestStreamEndRead(asyncResult); + } + + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + return this._owner.RequestStreamBeginRead(buffer, offset, count, callback, RuntimeHelpers.GetObjectValue(state)); + } + + public override int EndRead(IAsyncResult asyncResult) + { + return this._owner.RequestStreamEndRead(asyncResult); + } + + public override int ReadTimeout + { + get + { + return this._owner.ReadTimeout; + } + set + { + this._owner.ReadTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return this._owner.WriteTimeout; + } + set + { + this._owner.WriteTimeout = value; + } + } + } + + private class ResponseStream : Stream + { + private MyHttpServerConnection _owner; + + public ResponseStream(MyHttpServerConnection owner) + { + this._owner = owner; + } + + public override void Close() + { + if (this._owner != null) + this._owner.ResponseStreamClose(); + this._owner = (MyHttpServerConnection) null; + base.Close(); + } + + public override bool CanRead + { + get + { + return false; + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override bool CanWrite + { + get + { + return true; + } + } + + public override void Flush() + { + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + public override long Length + { + get + { + if (this._owner == null) + throw new ObjectDisposedException(this.ToString()); + return this._owner.ResponseStreamLength(); + } + } + + public override long Position + { + get + { + if (this._owner == null) + throw new ObjectDisposedException(this.ToString()); + return this._owner.ResponseStreamPosition(); + } + set + { + throw new NotImplementedException(); + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + IAsyncResult asyncResult = this._owner.ResponseStreamBeginWrite(buffer, offset, count, (AsyncCallback) null, (object) null); + if (!asyncResult.CompletedSynchronously && !asyncResult.AsyncWaitHandle.WaitOne(this._owner.WriteTimeout, false)) + throw new IOException("Timeout"); + this._owner.ResponseStreamEndWrite(asyncResult); + } + + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + return this._owner.ResponseStreamBeginWrite(buffer, offset, count, callback, RuntimeHelpers.GetObjectValue(state)); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + this._owner.ResponseStreamEndWrite(asyncResult); + } + + public override int ReadTimeout + { + get + { + return this._owner.ReadTimeout; + } + set + { + this._owner.ReadTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return this._owner.WriteTimeout; + } + set + { + this._owner.WriteTimeout = value; + } + } + } + } +} diff --git a/Rei.Net.HttpServer/MyHttpServerConnectionClosedException.cs b/Rei.Net.HttpServer/MyHttpServerConnectionClosedException.cs new file mode 100644 index 0000000..1dd45f6 --- /dev/null +++ b/Rei.Net.HttpServer/MyHttpServerConnectionClosedException.cs @@ -0,0 +1,23 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyHttpServerConnectionClosedException +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using System; + +namespace Rei.Net.HttpServer +{ + public class MyHttpServerConnectionClosedException : Exception + { + internal MyHttpServerConnectionClosedException(string message) + : base(message) + { + } + + public MyHttpServerConnectionClosedException(string message, Exception innerexception) + : base(message, innerexception) + { + } + } +} diff --git a/Rei.Net.HttpServer/MyHttpServerRequest.cs b/Rei.Net.HttpServer/MyHttpServerRequest.cs new file mode 100644 index 0000000..d457db0 --- /dev/null +++ b/Rei.Net.HttpServer/MyHttpServerRequest.cs @@ -0,0 +1,155 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyHttpServerRequest +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using System; +using System.Collections.Specialized; +using System.Diagnostics; +using System.IO; + +namespace Rei.Net.HttpServer +{ + [DebuggerDisplay("{toString}")] + public class MyHttpServerRequest : IDisposable + { + internal bool _isvalidrequest; + internal string _requestline; + internal string _method; + internal string _version; + internal Uri _requesturi; + internal string _rawuri; + internal NameValueCollection _requestheaders; + internal long _contentlength; + internal Stream _reqstream; + internal string _host; + internal bool _badrequest; + internal bool _expect100continue; + private bool disposedValue; + + internal MyHttpServerRequest() + { + this.disposedValue = false; + this._requestheaders = new NameValueCollection(); + } + + public Uri RequestUri + { + get + { + return this._requesturi; + } + set + { + this._requesturi = value; + } + } + + public string Host + { + get + { + return this._host; + } + } + + public string RawUri + { + get + { + return this._rawuri; + } + } + + public string Method + { + get + { + return this._method; + } + } + + public string Version + { + get + { + return this._version; + } + } + + public string RequestLine + { + get + { + return this._requestline; + } + } + + public NameValueCollection Headers + { + get + { + return this._requestheaders; + } + } + + public long ContentLength + { + get + { + return this._contentlength; + } + } + + public string ContentType + { + get + { + return this._requestheaders.Get("Content-Type"); + } + } + + public string UserAgent + { + get + { + return this._requestheaders.Get("User-Agent"); + } + } + + public bool Expect100Continue + { + get + { + return this._expect100continue; + } + } + + public Stream InputStream + { + get + { + return this._reqstream; + } + } + + protected virtual void Dispose(bool disposing) + { + if (!this.disposedValue && disposing) + this._reqstream.Close(); + this.disposedValue = true; + } + + public void Close() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + public override string ToString() + { + return this._requestline + " " + this._host; + } + } +} diff --git a/Rei.Net.HttpServer/MyHttpServerResponse.cs b/Rei.Net.HttpServer/MyHttpServerResponse.cs new file mode 100644 index 0000000..b4475d4 --- /dev/null +++ b/Rei.Net.HttpServer/MyHttpServerResponse.cs @@ -0,0 +1,88 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.MyHttpServerResponse +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.CompilerServices; +using System.Collections.Specialized; +using System.Diagnostics; + +namespace Rei.Net.HttpServer +{ + [DebuggerDisplay("{toString}")] + public class MyHttpServerResponse + { + internal int _statuscode; + internal string _statusdesc; + internal NameValueCollection _responseheaders; + internal long _contentlength; + internal bool _sendchunked; + + public MyHttpServerResponse() + { + this._responseheaders = new NameValueCollection(); + } + + public int StatusCode + { + get + { + return this._statuscode; + } + set + { + this._statuscode = value; + } + } + + public string StatusDescription + { + get + { + return this._statusdesc; + } + set + { + this._statusdesc = value; + } + } + + public long ContentLength + { + get + { + return this._contentlength; + } + set + { + this._contentlength = value; + } + } + + public bool SendChunked + { + get + { + return this._sendchunked; + } + set + { + this._sendchunked = value; + } + } + + public NameValueCollection Headers + { + get + { + return this._responseheaders; + } + } + + public override string ToString() + { + return Conversions.ToString(this._statuscode) + " " + this._statusdesc + " " + Conversions.ToString(this._contentlength); + } + } +} diff --git a/Rei.Net.HttpServer/Rei.Net.HttpServer.csproj b/Rei.Net.HttpServer/Rei.Net.HttpServer.csproj new file mode 100644 index 0000000..2ec864b --- /dev/null +++ b/Rei.Net.HttpServer/Rei.Net.HttpServer.csproj @@ -0,0 +1,62 @@ + + + + + Debug + AnyCPU + {5FF0F1E1-621A-478E-BA41-831A85C694EE} + Library + Rei.Net.HttpServer + v3.5 + 1.13.2.9297 + 512 + Rei.Net.HttpServer + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Rei.Net.HttpServer/Resources.resx b/Rei.Net.HttpServer/Resources.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/Rei.Net.HttpServer/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rei.Net.HttpServer/UPnPManager.cs b/Rei.Net.HttpServer/UPnPManager.cs new file mode 100644 index 0000000..dbbd83b --- /dev/null +++ b/Rei.Net.HttpServer/UPnPManager.cs @@ -0,0 +1,403 @@ +// Decompiled with JetBrains decompiler +// Type: Rei.Net.HttpServer.UPnPManager +// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null +// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28 +// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll + +using Microsoft.VisualBasic.CompilerServices; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Text; + +namespace Rei.Net.HttpServer +{ + public class UPnPManager : IDisposable + { + private static string servicetype_1 = "urn:schemas-upnp-org:service:WANIPConnection:1"; + private static string servicetype_2 = "urn:schemas-upnp-org:service:WANPPPConnection:1"; + private List mappinglist; + private bool disposedValue; + + private static Uri GetDeviceDocumentUri(IPAddress gatewayip) + { + IPEndPoint ipEndPoint = new IPEndPoint(gatewayip, 1900); + EndPoint remoteEP = (EndPoint) new IPEndPoint(IPAddress.Any, 0); + byte[] bytes = Encoding.UTF8.GetBytes("M-SEARCH * HTTP/1.1\r\nHost: " + gatewayip.ToString() + ":1900\r\nSt: upnp:rootdevice\r\nMan: \"ssdp:discover\"\r\nMx: 3\r\n\r\n\r\n"); + string str1; + using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) + { + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); + socket.SendTo(bytes, 0, bytes.Length, SocketFlags.None, (EndPoint) ipEndPoint); + byte[] numArray = new byte[1025]; + int from = socket.ReceiveFrom(numArray, 0, numArray.Length, SocketFlags.None, ref remoteEP); + str1 = Encoding.UTF8.GetString(numArray, 0, from); + } + if (string.IsNullOrEmpty(str1)) + return (Uri) null; + string[] strArray = str1.Split(new char[2] + { + '\r', + '\n' + }, StringSplitOptions.RemoveEmptyEntries); + int index = 0; + while (index < strArray.Length) + { + string str2 = strArray[index]; + if (str2.StartsWith("Location:", StringComparison.InvariantCultureIgnoreCase)) + { + string uriString = str2.Substring(9).Trim(); + Uri result = (Uri) null; + if (Uri.TryCreate(uriString, UriKind.Absolute, out result)) + return result; + return (Uri) null; + } + checked { ++index; } + } + return (Uri) null; + } + + private static string GetDeviceDocument(Uri u) + { + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(u); + httpWebRequest.Method = "GET"; + httpWebRequest.KeepAlive = false; + httpWebRequest.Proxy = (IWebProxy) null; + httpWebRequest.Timeout = 3000; + string str = (string) null; + try + { + using (HttpWebResponse response = (HttpWebResponse) httpWebRequest.GetResponse()) + { + using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) + str = streamReader.ReadToEnd(); + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + return str; + } + + private static Uri FindControlUri(Uri baseuri, string document, string servicename) + { + int startIndex1 = document.IndexOf(servicename); + if (startIndex1 < 0) + return (Uri) null; + int startIndex2 = document.IndexOf("", startIndex1); + int num = document.IndexOf("", startIndex2); + return new Uri(baseuri, document.Substring(checked (startIndex2 + 12), checked (num - startIndex2 - 12))); + } + + private static bool AddPortMapping(Uri controluri, string servicename, int externalport, IPAddress internalip, int internalport) + { + string s = " " + externalport.ToString() + " TCP " + internalport.ToString() + " " + internalip.ToString() + " 1 0 "; + Encoding.UTF8.GetBytes(s); + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(controluri); + httpWebRequest.Method = "POST"; + httpWebRequest.KeepAlive = false; + httpWebRequest.Proxy = (IWebProxy) null; + httpWebRequest.Timeout = 3000; + httpWebRequest.AllowWriteStreamBuffering = true; + httpWebRequest.SendChunked = false; + httpWebRequest.Headers.Add("Soapaction", servicename + "#AddPortMapping"); + httpWebRequest.ContentType = "text/xml;charset=\\\"utf-8\\\""; + string str = (string) null; + try + { + using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) + streamWriter.Write(s); + using (HttpWebResponse response = (HttpWebResponse) httpWebRequest.GetResponse()) + { + using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) + str = streamReader.ReadToEnd(); + if (response.StatusCode >= HttpStatusCode.OK) + { + if (response.StatusCode < HttpStatusCode.MultipleChoices) + goto label_18; + } + return false; + } +label_18: + return true; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + return false; + } + + private static bool DeletePortMapping(Uri controluri, string servicename, int externalport) + { + string s = " " + externalport.ToString() + " TCP "; + Encoding.UTF8.GetBytes(s); + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(controluri); + httpWebRequest.Method = "POST"; + httpWebRequest.KeepAlive = false; + httpWebRequest.Proxy = (IWebProxy) null; + httpWebRequest.Timeout = 3000; + httpWebRequest.AllowWriteStreamBuffering = true; + httpWebRequest.SendChunked = false; + httpWebRequest.Headers.Add("Soapaction", servicename + "#DeletePortMapping"); + httpWebRequest.ContentType = "text/xml;charset=\\\"utf-8\\\""; + string str = (string) null; + try + { + using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) + streamWriter.Write(s); + using (HttpWebResponse response = (HttpWebResponse) httpWebRequest.GetResponse()) + { + using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) + str = streamReader.ReadToEnd(); + if (response.StatusCode >= HttpStatusCode.OK) + { + if (response.StatusCode < HttpStatusCode.MultipleChoices) + goto label_18; + } + return false; + } +label_18: + return true; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + return false; + } + + private static IPAddress GetExternalIPAddress(Uri controluri, string servicename) + { + string s = " "; + Encoding.UTF8.GetBytes(s); + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(controluri); + httpWebRequest.Method = "POST"; + httpWebRequest.KeepAlive = false; + httpWebRequest.Proxy = (IWebProxy) null; + httpWebRequest.Timeout = 3000; + httpWebRequest.AllowWriteStreamBuffering = true; + httpWebRequest.SendChunked = false; + httpWebRequest.Headers.Add("Soapaction", servicename + "#GetExternalIPAddress"); + httpWebRequest.ContentType = "text/xml;charset=\\\"utf-8\\\""; + string str = (string) null; + try + { + using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) + streamWriter.Write(s); + using (HttpWebResponse response = (HttpWebResponse) httpWebRequest.GetResponse()) + { + using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) + str = streamReader.ReadToEnd(); + if (response.StatusCode >= HttpStatusCode.OK) + { + if (response.StatusCode < HttpStatusCode.MultipleChoices) + goto label_18; + } + return (IPAddress) null; + } +label_18: + int startIndex = str.IndexOf(""); + int num = str.IndexOf("", startIndex); + IPAddress address = (IPAddress) null; + if (IPAddress.TryParse(str.Substring(checked (startIndex + 22), checked (num - startIndex - 22)), out address)) + return address; + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + return (IPAddress) null; + } + + public UPnPManager() + { + this.mappinglist = new List(); + this.disposedValue = false; + } + + public IPEndPoint[] GetExternalEndpoints() + { + List ipEndPointList = new List(); + List.Enumerator enumerator; + try + { + enumerator = this.mappinglist.GetEnumerator(); + while (enumerator.MoveNext()) + { + UPnPManager.portmappingentry current = enumerator.Current; + ipEndPointList.Add(new IPEndPoint(current.externalip, current.externalport)); + } + } + finally + { + enumerator.Dispose(); + } + return ipEndPointList.ToArray(); + } + + public void AddPortMapping(bool all, int internalport) + { + Random random = new Random(); + List ipAddressList = new List(); + NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + int index = 0; + while (index < networkInterfaces.Length) + { + NetworkInterface networkInterface = networkInterfaces[index]; + try + { + if (networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback) + { + if (networkInterface.NetworkInterfaceType != NetworkInterfaceType.Tunnel) + { + if (networkInterface.OperationalStatus == OperationalStatus.Up) + { + IPInterfaceProperties ipProperties = networkInterface.GetIPProperties(); + IPAddress internalip = (IPAddress) null; + IEnumerator enumerator1; + try + { + enumerator1 = ipProperties.UnicastAddresses.GetEnumerator(); + while (enumerator1.MoveNext()) + { + UnicastIPAddressInformation current = enumerator1.Current; + if (current.Address.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(current.Address)) + { + internalip = current.Address; + break; + } + } + } + finally + { + if (enumerator1 != null) + enumerator1.Dispose(); + } + IEnumerator enumerator2; + if (internalip != null) + { + try + { + enumerator2 = ipProperties.GatewayAddresses.GetEnumerator(); + while (enumerator2.MoveNext()) + { + GatewayIPAddressInformation current = enumerator2.Current; + if (!object.Equals((object) current.Address, (object) IPAddress.None) && !object.Equals((object) current.Address, (object) IPAddress.Any) && (!object.Equals((object) current.Address, (object) IPAddress.Broadcast) && !object.Equals((object) current.Address, (object) IPAddress.Loopback))) + { + UPnPManager.portmappingentry portmappingentry = new UPnPManager.portmappingentry(); + Uri deviceDocumentUri = UPnPManager.GetDeviceDocumentUri(current.Address); + string deviceDocument = UPnPManager.GetDeviceDocument(deviceDocumentUri); + portmappingentry.servicename = UPnPManager.servicetype_1; + portmappingentry.controluri = UPnPManager.FindControlUri(deviceDocumentUri, deviceDocument, portmappingentry.servicename); + if ((object) portmappingentry.controluri == null) + { + portmappingentry.servicename = UPnPManager.servicetype_2; + portmappingentry.controluri = UPnPManager.FindControlUri(deviceDocumentUri, deviceDocument, portmappingentry.servicename); + } + if ((object) portmappingentry.controluri != null) + { + portmappingentry.externalip = UPnPManager.GetExternalIPAddress(portmappingentry.controluri, portmappingentry.servicename); + if (portmappingentry.externalip != null) + { + portmappingentry.externalport = internalport; + int num = 0; + do + { + try + { + if (UPnPManager.AddPortMapping(portmappingentry.controluri, portmappingentry.servicename, portmappingentry.externalport, internalip, internalport)) + { + this.mappinglist.Add(portmappingentry); + if (!all) + return; + break; + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + portmappingentry.externalport = random.Next(30000, 60000); + checked { ++num; } + } + while (num <= 10); + } + } + } + } + } + finally + { + if (enumerator2 != null) + enumerator2.Dispose(); + } + } + } + } + } + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + checked { ++index; } + } + } + + public void DeletePortMapping() + { + while (this.mappinglist.Count > 0) + { + UPnPManager.portmappingentry portmappingentry = this.mappinglist[checked (this.mappinglist.Count - 1)]; + try + { + UPnPManager.DeletePortMapping(portmappingentry.controluri, portmappingentry.servicename, portmappingentry.externalport); + } + catch (Exception ex) + { + ProjectData.SetProjectError(ex); + ProjectData.ClearProjectError(); + } + this.mappinglist.RemoveAt(checked (this.mappinglist.Count - 1)); + } + } + + protected virtual void Dispose(bool disposing) + { + if (!this.disposedValue && disposing) + this.DeletePortMapping(); + this.disposedValue = true; + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + private class portmappingentry + { + public string servicename; + public Uri controluri; + public IPAddress externalip; + public int externalport; + + [DebuggerNonUserCode] + public portmappingentry() + { + } + } + } +}