[Pkg-cli-apps-commits] [SCM] keepass2 branch, upstream, updated. upstream/2.19-2-g6c6de0e
Julian Taylor
jtaylor.debian at googlemail.com
Sat Oct 6 12:44:14 UTC 2012
The following commit has been merged in the upstream branch:
commit d9fe452bfb8e18fb8844160cfc8dfe3b18149ae9
Author: Julian Taylor <jtaylor.debian at googlemail.com>
Date: Sat Sep 15 16:28:24 2012 +0200
Imported Upstream version 2.20
diff --git a/Build/KeePassLibSD_Distrib/KeePassLibSD.dll b/Build/KeePassLibSD_Distrib/KeePassLibSD.dll
index e122702..b4eb0bd 100644
Binary files a/Build/KeePassLibSD_Distrib/KeePassLibSD.dll and b/Build/KeePassLibSD_Distrib/KeePassLibSD.dll differ
diff --git a/Build/KeePassLib_Distrib/KeePassLib.dll b/Build/KeePassLib_Distrib/KeePassLib.dll
index ad1ae13..0b8797d 100644
Binary files a/Build/KeePassLib_Distrib/KeePassLib.dll and b/Build/KeePassLib_Distrib/KeePassLib.dll differ
diff --git a/Build/KeePassLib_Distrib/KeePassLib.xml b/Build/KeePassLib_Distrib/KeePassLib.xml
index ead4795..2aef260 100644
--- a/Build/KeePassLib_Distrib/KeePassLib.xml
+++ b/Build/KeePassLib_Distrib/KeePassLib.xml
@@ -36,57 +36,40 @@
Custom icon. <c>PwCustomIcon</c> objects are immutable.
</summary>
</member>
- <member name="T:KeePassLib.Serialization.Kdb4File">
+ <member name="T:KeePassLib.Serialization.KdbxFile">
<summary>
- Serialization to KeePass KDB files.
+ Serialization to KeePass KDBX files.
</summary>
<summary>
Serialization to KeePass KDBX files.
</summary>
<summary>
- Serialization to KeePass KDB files.
+ Serialization to KeePass KDBX files.
+ </summary>
+ <summary>
+ Serialization to KeePass KDBX files.
</summary>
</member>
- <member name="F:KeePassLib.Serialization.Kdb4File.FileSignature1">
+ <member name="F:KeePassLib.Serialization.KdbxFile.FileSignature1">
<summary>
File identifier, first 32-bit value.
</summary>
</member>
- <member name="F:KeePassLib.Serialization.Kdb4File.FileSignature2">
+ <member name="F:KeePassLib.Serialization.KdbxFile.FileSignature2">
<summary>
File identifier, second 32-bit value.
</summary>
</member>
- <member name="F:KeePassLib.Serialization.Kdb4File.FileVersion32">
+ <member name="F:KeePassLib.Serialization.KdbxFile.FileVersion32">
<summary>
- File version of files saved by the current <c>Kdb4File</c> class.
+ File version of files saved by the current <c>KdbxFile</c> class.
KeePass 2.07 has version 1.01, 2.08 has 1.02, 2.09 has 2.00,
- 2.10 has 2.02, 2.11 has 2.04, 2.15 has 3.00.
+ 2.10 has 2.02, 2.11 has 2.04, 2.15 has 3.00, 2.20 has 3.01.
The first 2 bytes are critical (i.e. loading will fail, if the
file version is too high), the last 2 bytes are informational.
</summary>
</member>
- <member name="M:KeePassLib.Serialization.Kdb4File.Save(System.IO.Stream,KeePassLib.PwGroup,KeePassLib.Serialization.Kdb4Format,KeePassLib.Interfaces.IStatusLogger)">
- <summary>
- Save the contents of the current <c>PwDatabase</c> to a KDBX file.
- </summary>
- <param name="sSaveTo">Stream to write the KDBX file into.</param>
- <param name="pgDataSource">Group containing all groups and
- entries to write. If <c>null</c>, the complete database will
- be written.</param>
- <param name="format">Format of the file to create.</param>
- <param name="slLogger">Logger that recieves status information.</param>
- </member>
- <member name="M:KeePassLib.Serialization.Kdb4File.WriteEntries(System.IO.Stream,KeePassLib.PwEntry[])">
- <summary>
- Write entries to a stream.
- </summary>
- <param name="msOutput">Output stream to which the entries will be written.</param>
- <param name="vEntries">Entries to serialize.</param>
- <returns>Returns <c>true</c>, if the entries were written successfully
- to the stream.</returns>
- </member>
- <member name="M:KeePassLib.Serialization.Kdb4File.Load(System.String,KeePassLib.Serialization.Kdb4Format,KeePassLib.Interfaces.IStatusLogger)">
+ <member name="M:KeePassLib.Serialization.KdbxFile.Load(System.String,KeePassLib.Serialization.KdbxFormat,KeePassLib.Interfaces.IStatusLogger)">
<summary>
Load a KDB file from a file.
</summary>
@@ -94,35 +77,55 @@
<param name="kdbFormat">Format specifier.</param>
<param name="slLogger">Status logger (optional).</param>
</member>
- <member name="M:KeePassLib.Serialization.Kdb4File.Load(System.IO.Stream,KeePassLib.Serialization.Kdb4Format,KeePassLib.Interfaces.IStatusLogger)">
+ <member name="M:KeePassLib.Serialization.KdbxFile.Load(System.IO.Stream,KeePassLib.Serialization.KdbxFormat,KeePassLib.Interfaces.IStatusLogger)">
<summary>
Load a KDB file from a stream.
</summary>
<param name="sSource">Stream to read the data from. Must contain
- a KDB4 stream.</param>
+ a KDBX stream.</param>
<param name="kdbFormat">Format specifier.</param>
<param name="slLogger">Status logger (optional).</param>
</member>
- <member name="M:KeePassLib.Serialization.Kdb4File.ReadEntries(System.IO.Stream)">
+ <member name="M:KeePassLib.Serialization.KdbxFile.ReadEntries(System.IO.Stream)">
<summary>
Read entries from a stream.
</summary>
<param name="msData">Input stream to read the entries from.</param>
<returns>Extracted entries.</returns>
</member>
- <member name="M:KeePassLib.Serialization.Kdb4File.#ctor(KeePassLib.PwDatabase)">
+ <member name="M:KeePassLib.Serialization.KdbxFile.Save(System.IO.Stream,KeePassLib.PwGroup,KeePassLib.Serialization.KdbxFormat,KeePassLib.Interfaces.IStatusLogger)">
+ <summary>
+ Save the contents of the current <c>PwDatabase</c> to a KDBX file.
+ </summary>
+ <param name="sSaveTo">Stream to write the KDBX file into.</param>
+ <param name="pgDataSource">Group containing all groups and
+ entries to write. If <c>null</c>, the complete database will
+ be written.</param>
+ <param name="format">Format of the file to create.</param>
+ <param name="slLogger">Logger that recieves status information.</param>
+ </member>
+ <member name="M:KeePassLib.Serialization.KdbxFile.WriteEntries(System.IO.Stream,KeePassLib.PwEntry[])">
+ <summary>
+ Write entries to a stream.
+ </summary>
+ <param name="msOutput">Output stream to which the entries will be written.</param>
+ <param name="vEntries">Entries to serialize.</param>
+ <returns>Returns <c>true</c>, if the entries were written successfully
+ to the stream.</returns>
+ </member>
+ <member name="M:KeePassLib.Serialization.KdbxFile.#ctor(KeePassLib.PwDatabase)">
<summary>
Default constructor.
</summary>
<param name="pwDataStore">The <c>PwDatabase</c> instance that the
class will load file data into or use to create a KDBX file.</param>
</member>
- <member name="M:KeePassLib.Serialization.Kdb4File.DetermineLanguageId">
+ <member name="M:KeePassLib.Serialization.KdbxFile.DetermineLanguageId">
<summary>
Call this once to determine the current localization settings.
</summary>
</member>
- <member name="P:KeePassLib.Serialization.Kdb4File.DetachBinaries">
+ <member name="P:KeePassLib.Serialization.KdbxFile.DetachBinaries">
<summary>
Detach binaries when opening a file. If this isn't <c>null</c>,
all binaries are saved to the specified path and are removed
@@ -250,6 +253,22 @@
The fully qualified name of the form.
</summary>
</member>
+ <member name="T:KeePassLib.Serialization.KdbxFormat">
+ <summary>
+ The <c>KdbxFile</c> class supports saving the data to various
+ formats.
+ </summary>
+ </member>
+ <member name="F:KeePassLib.Serialization.KdbxFormat.Default">
+ <summary>
+ The default, encrypted file format.
+ </summary>
+ </member>
+ <member name="F:KeePassLib.Serialization.KdbxFormat.PlainXml">
+ <summary>
+ Use this flag when exporting data to a plain-text XML file.
+ </summary>
+ </member>
<member name="P:KeePassLib.Keys.KeyProvider.Name">
<summary>
Name of your key provider (should be unique).
@@ -696,7 +715,7 @@
<member name="P:KeePassLib.Resources.KLRes.FileSaveCorruptionWarning">
<summary>
Look up a localized string similar to
- 'The target file might be in a corrupted state. Please try saving again, and if that fails, save the database to a different location.'.
+ 'The target file might be corrupted. Please try saving again. If that fails, save the database to a different location.'.
</summary>
</member>
<member name="P:KeePassLib.Resources.KLRes.FileSaveFailed">
@@ -983,6 +1002,13 @@
<param name="uValue">64-bit input word.</param>
<returns>Eight bytes representing the 64-bit value.</returns>
</member>
+ <member name="P:KeePassLib.Serialization.BinaryReaderEx.CopyDataTo">
+ <summary>
+ If this property is set to a non-null stream, all data that
+ is read from the input stream is automatically written to
+ the copy stream (before returning the read data).
+ </summary>
+ </member>
<member name="T:KeePassLib.PwGroup">
<summary>
A group containing several password entries.
@@ -2389,22 +2415,6 @@
This doesn't remove environment variables (wrapped in '%').
</summary>
</member>
- <member name="T:KeePassLib.Serialization.Kdb4Format">
- <summary>
- The <c>Kdb4File</c> class supports saving the data to various
- formats.
- </summary>
- </member>
- <member name="F:KeePassLib.Serialization.Kdb4Format.Default">
- <summary>
- The default, encrypted file format.
- </summary>
- </member>
- <member name="F:KeePassLib.Serialization.Kdb4Format.PlainXml">
- <summary>
- Use this flag when exporting data to a plain-text XML file.
- </summary>
- </member>
<member name="T:KeePassLib.PwDatabase">
<summary>
The core password manager class. It contains a number of groups, which
diff --git a/Build/PrepMonoDev.sh b/Build/PrepMonoDev.sh
index 8401e59..bdb6be2 100644
--- a/Build/PrepMonoDev.sh
+++ b/Build/PrepMonoDev.sh
@@ -2,7 +2,8 @@ cp -f ../Ext/Icons/Finals2/plockb.ico ../KeePass/KeePass.ico
cp -f ../Ext/Icons/Finals2/plockb.ico ../KeePass/Resources/Images/KeePass.ico
sed 's!<SignAssembly>true</SignAssembly>!<SignAssembly>false</SignAssembly>!g' ../KeePass/KeePass.csproj > ../KeePass/KeePass.csproj.new
-mv -f ../KeePass/KeePass.csproj.new ../KeePass/KeePass.csproj
+cat ../KeePass/KeePass.csproj.new | grep -v 'sgen\.exe' > ../KeePass/KeePass.csproj
+rm -f ../KeePass/KeePass.csproj.new
sed 's!<SignAssembly>true</SignAssembly>!<SignAssembly>false</SignAssembly>!g' ../KeePassLib/KeePassLib.csproj > ../KeePassLib/KeePassLib.csproj.new
mv -f ../KeePassLib/KeePassLib.csproj.new ../KeePassLib/KeePassLib.csproj
diff --git a/Docs/Chm/KeePassContents.hhc b/Docs/Chm/KeePassContents.hhc
index 58d0c56..20f0445 100644
--- a/Docs/Chm/KeePassContents.hhc
+++ b/Docs/Chm/KeePassContents.hhc
@@ -174,7 +174,7 @@
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
- <param name="Name" value="Customize">
+ <param name="Name" value="Customization">
<param name="Local" value="help\v2_dev\customize.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
diff --git a/Docs/Chm/help/base/autotype.html b/Docs/Chm/help/base/autotype.html
index 26fba39..f1b0714 100644
--- a/Docs/Chm/help/base/autotype.html
+++ b/Docs/Chm/help/base/autotype.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -400,7 +396,7 @@ simple wildcards:</p>
-In KeePass ≥ 2.06, wildcards may also appear in the middle of patterns.
+Wildcards may also appear in the middle of patterns.
For example, <code>*Windows*Explorer*</code> would match
<code>Windows Explorer</code>.<br />
<br />
@@ -452,7 +448,7 @@ Example</h2>
<p>Now let's have a look at a real-world example: logging into a website. In this example,
will we use the global auto-type hot key to fill out the login webpage.
-First open the <a href="http://keepass.info/help/kb/kb090406_testform.html"
+First open the <a href="http://keepass.info/help/kb/testform.html"
target="_blank">test page</a>, and afterwards create a new entry
in KeePass with title <i>Test Form</i> and a user name and password
of your choice.</p>
diff --git a/Docs/Chm/help/base/autourl.html b/Docs/Chm/help/base/autourl.html
index 2fa0079..6acf69b 100644
--- a/Docs/Chm/help/base/autourl.html
+++ b/Docs/Chm/help/base/autourl.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/cmdline.html b/Docs/Chm/help/base/cmdline.html
index 00b30cf..1c16d89 100644
--- a/Docs/Chm/help/base/cmdline.html
+++ b/Docs/Chm/help/base/cmdline.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -58,12 +54,19 @@ The database file location is passed as argument. Only one database file is allo
If the path contains a space, it must be enclosed in quotes (").</p>
<p><b>Password.</b>
-Passwords are passed using the <code>-pw:</code> option. In order to
+Passwords can be passed using the <code>-pw:</code> option. In order to
pass 'abc' as password, you would add the following argument to the command line:
<code>-pw:abc</code>. Note that there must be no space between the ':' and the
password. If your password contains a space, you must enclose it in quotes. For
example: <code>-pw:"my secret password"</code>.</p>
+<p>Using the <code>-pw:</code> option is not recommended, because of
+security reasons (the operating system allows reading the command line
+options of other applications).</p>
+
+<p>When passing the <code>-pw-stdin</code> option, KeePass ≥ 1.24 and ≥ 2.20
+read the password from the StdIn stream.</p>
+
<p><b>Key file.</b>
For supplying the key file location, the <code>-keyfile:</code> switch
exists. The same rules as above apply, just that you specify the key file location:
@@ -88,7 +91,8 @@ sets the focus to the password edit window.</p>
for you and displays the login prompt. In contrast, the <code>keyfile</code> switch
doesn't prompt you for the (maybe missing) password.</p>
-<p>The <code>-minimize</code> command line argument makes KeePass start up minimized.</p>
+<p><b>Other.</b>
+The <code>-minimize</code> command line argument makes KeePass start up minimized.</p>
<p>The <code>-auto-type</code> command line argument makes all previous KeePass
instances perform a global auto-type.</p>
@@ -202,8 +206,8 @@ in <i>'Tools' - 'Options...' - 'Advanced'</i>.</p>
it does not show a main window) and will immediately terminate after sending close
requests to the other instances.</p>
-<p>KeePass ≥ 1.17 and ≥ 2.10 support the <code>--lock-all</code> and
-<code>--unlock-all</code> command line options to lock/unlock the workspaces
+<p>The <code>--lock-all</code> and
+<code>--unlock-all</code> command line options lock/unlock the workspaces
of all other KeePass instances.</p>
</body></html>
diff --git a/Docs/Chm/help/base/configuration.html b/Docs/Chm/help/base/configuration.html
index 346a73c..ea5c702 100644
--- a/Docs/Chm/help/base/configuration.html
+++ b/Docs/Chm/help/base/configuration.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -65,22 +61,22 @@ Configuration files are stored in XML format.<br /><br />
<tr>
<td>Global</td>
<td>Application Directory</td>
-<td>C:\Program Files\KeePass Password Safe\KeePass.config.xml</td>
+<td>C:\Program Files\KeePass Password Safe 2\KeePass.config.xml</td>
</tr>
<tr>
<td>Global (Virtualized)</td>
<td>Windows Vista/7/8 Virtual Store</td>
-<td>C:\Users\<i>User Name</i>\AppData\Local\VirtualStore\Program Files\KeePass Password Safe\KeePass.config.xml</td>
+<td>C:\Users\<i>User Name</i>\AppData\Local\VirtualStore\Program Files\KeePass Password Safe 2\KeePass.config.xml</td>
</tr>
<tr>
<td>Local</td>
<td>User Application Data</td>
-<td>C:\Documents and Settings\<i>User Name</i>\Application Data\KeePass\KeePass.config.xml</td>
+<td>C:\Users\<i>User Name</i>\AppData\Roaming\KeePass\KeePass.config.xml</td>
</tr>
<tr>
<td>Enforced</td>
<td>Application Directory</td>
-<td>C:\Program Files\KeePass Password Safe\KeePass.config.enforced.xml</td>
+<td>C:\Program Files\KeePass Password Safe 2\KeePass.config.enforced.xml</td>
</tr>
</table>
@@ -143,6 +139,47 @@ stored).</p>
<p>Configuration items that are not present in the enforced configuration file are
loaded normally from global/local configuration files.</p>
+<table border="0px" width="100%" cellpadding="0px" cellspacing="0px">
+<tr><td align="left" valign="top">
+<b>Example (2.x).</b>
+The following <code>KeePass.config.enforced.xml</code> file enforces the
+values/states of the settings 'Clipboard auto-clear time (seconds)',
+'Lock workspace when minimizing main window' and
+'Lock workspace when locking the computer or switching the user'.
+All other settings can be configured by the user.
+
+<pre><?xml version="1.0" encoding="utf-8"?>
+<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <Security>
+ <WorkspaceLocking>
+ <LockOnWindowMinimize>true</LockOnWindowMinimize>
+ <LockOnSessionSwitch>true</LockOnSessionSwitch>
+ </WorkspaceLocking>
+ <ClipboardClearAfterSeconds>20</ClipboardClearAfterSeconds>
+ </Security>
+</Configuration></pre></td>
+<td width="210px" align="right" valign="top">
+<a href="../images/options_enf_big.png"><img
+src="../images/options_enf.png" align="right" border="0px" alt="Enforced Options" /></a>
+</td></tr></table>
+
+<p><b>UI disabled.</b>
+KeePass 2.x disables most user interface items that are enforced.
+This can be seen in the screenshot for the example above:
+the enforced settings are drawn using
+gray text and clicking on them has no effect.</p>
+
+<p><b>Security.</b>
+Users must not have write access to the enforced configuration file
+(otherwise they could modify it, e.g. using a text editor).</p>
+
+<p>Furthermore, this method only is effective as long as your users run the KeePass
+installation on the network drive. If they copy KeePass to their hard drives and
+run it from there, the options you set are not enforced (the local KeePass
+installation doesn't know anything of the enforced configuration file on the network drive
+in this case).</p>
+
<!-- Configuration items that are not present in the enforced configuration file are
set to their default values. -->
@@ -155,7 +192,7 @@ the enforced configuration file would look like the following:
<pre><?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MainWindow>
<EntryListColumns>
<b><Column /></b>
@@ -177,13 +214,7 @@ has the same tag name as the following sibling nodes ("Column"),
and therefore is required.
-<p>This method of course only is effective as long as your users run the KeePass
-installation on the network drive. If they copy KeePass to their hard drives and
-run it from there, the options you set are not enforced (the local KeePass
-installation doesn't know anything of the enforced configuration file on the network drive
-in this case).</p>
-
-<br />
+<br /><br />
<a name="tech"></a>
<h2 class="sectiontitle">
diff --git a/Docs/Chm/help/base/credits.html b/Docs/Chm/help/base/credits.html
index e7c20f4..bbc6b7e 100644
--- a/Docs/Chm/help/base/credits.html
+++ b/Docs/Chm/help/base/credits.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/credits_icons_license.html b/Docs/Chm/help/base/credits_icons_license.html
index b51d2ae..813d455 100644
--- a/Docs/Chm/help/base/credits_icons_license.html
+++ b/Docs/Chm/help/base/credits_icons_license.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/disclaimer.html b/Docs/Chm/help/base/disclaimer.html
index 42bc029..9b4fb2e 100644
--- a/Docs/Chm/help/base/disclaimer.html
+++ b/Docs/Chm/help/base/disclaimer.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/faq.html b/Docs/Chm/help/base/faq.html
index 97064c7..bb3b84f 100644
--- a/Docs/Chm/help/base/faq.html
+++ b/Docs/Chm/help/base/faq.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -36,6 +32,7 @@
+
<table class="sectionsummary"><tr><td width="68px">
<img src="../images/b64x64_help.png" width="64px" height="64px"
class="singleimg" align="left" alt="Help" />
@@ -103,6 +100,13 @@ are always greatly appreciated.</p>
+
+You might be interested in this page:
+<a href="../v2_dev/customize.html">Customization (2.x)</a>.
+
+
+
+
<br />
<a name="kpserver"></a>
@@ -156,7 +160,7 @@ application (of course respect the Open Source terms).</p>
<p>But what can and probably will be done later is a local intranet KeePass server (for
companies for example).
Employees could log in to the company's password server and use it. But a centralized Internet
-server -- no chance.</p>
+server no chance.</p>
</body></html>
diff --git a/Docs/Chm/help/base/faq_tech.html b/Docs/Chm/help/base/faq_tech.html
index a840fb8..7344eea 100644
--- a/Docs/Chm/help/base/faq_tech.html
+++ b/Docs/Chm/help/base/faq_tech.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/fieldrefs.html b/Docs/Chm/help/base/fieldrefs.html
index 700c361..8809e3c 100644
--- a/Docs/Chm/help/base/fieldrefs.html
+++ b/Docs/Chm/help/base/fieldrefs.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/firststeps.html b/Docs/Chm/help/base/firststeps.html
index 053f7e3..dff607c 100644
--- a/Docs/Chm/help/base/firststeps.html
+++ b/Docs/Chm/help/base/firststeps.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/importexport.html b/Docs/Chm/help/base/importexport.html
index bb16f6a..aac79c0 100644
--- a/Docs/Chm/help/base/importexport.html
+++ b/Docs/Chm/help/base/importexport.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/index.html b/Docs/Chm/help/base/index.html
index 0d75efd..4d05096 100644
--- a/Docs/Chm/help/base/index.html
+++ b/Docs/Chm/help/base/index.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -94,7 +90,7 @@ Windows, Internet, My Website, etc.).
You can drag&drop passwords into other windows. The powerful auto-type
feature will type user names and passwords for you into other windows.
The program can export the database to various formats.
-It can also import data from various other formats (more than 20 different
+It can also import data from various other formats (more than 35 different
formats of other password managers, a generic CSV importer, ...).</p>
<p>Of course, you can also print the password list or current view.
diff --git a/Docs/Chm/help/base/integration.html b/Docs/Chm/help/base/integration.html
index f7972d1..e5f5789 100644
--- a/Docs/Chm/help/base/integration.html
+++ b/Docs/Chm/help/base/integration.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/keys.html b/Docs/Chm/help/base/keys.html
index 80d98e1..aff3f80 100644
--- a/Docs/Chm/help/base/keys.html
+++ b/Docs/Chm/help/base/keys.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -116,7 +112,8 @@ between backing up the key file and the database, see the
<a href="http://abp-keepass.sourceforge.net/FAQ.html" target="_blank">ABP FAQ</a>.</li>
</ul>
-<p>The point of a key file is that you <i>have</i> something to
+<p><b>Location.</b>
+The point of a key file is that you <i>have</i> something to
authenticate with (in contrast to master passwords, where you
<i>know</i> something), for example a file on a USB stick.
The key file content (i.e. the key data contained within the key file)
@@ -124,14 +121,14 @@ needs to be kept secret.
The point is <i>not</i> to keep the location of the key file
secret selecting a file out of thousands existing on your hard disk
basically doesn't increase
-security at all (it's very easy for malware/attackers to find out the
-correct file, for example by observing the last access times of files).
+security at all, because it's very easy for malware/attackers to find out the
+correct file (for example by observing the last access times of files,
+the recently used files list of Windows, malware scanner logs, etc.).
Trying to keep the key file location secret is security by obscurity,
i.e. not really effective.</p>
-
-
-<p>KeePass can generate key files for you, however you can also use any other,
+<p><b>File Type and Existing Files.</b>
+KeePass can generate key files for you, however you can also use any other,
already existing file (like JPG image, DOC document, etc.).</p>
diff --git a/Docs/Chm/help/base/license_lgpl.html b/Docs/Chm/help/base/license_lgpl.html
index cd54dfa..d8d3abb 100644
--- a/Docs/Chm/help/base/license_lgpl.html
+++ b/Docs/Chm/help/base/license_lgpl.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/multiuser.html b/Docs/Chm/help/base/multiuser.html
index 9c0fd6d..b56135b 100644
--- a/Docs/Chm/help/base/multiuser.html
+++ b/Docs/Chm/help/base/multiuser.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/placeholders.html b/Docs/Chm/help/base/placeholders.html
index 9b409e1..dc4004c 100644
--- a/Docs/Chm/help/base/placeholders.html
+++ b/Docs/Chm/help/base/placeholders.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -76,12 +72,12 @@ class="singleimg" alt="Placeholder" /> Entry Field Placeholders</h2>
<br />
<table class="tablebox75">
-<tr><th width="50%">Field</th><th width="50%">Placeholder</th></tr>
-<tr><td width="50%">Title</td><td width="50%">{TITLE}</td></tr>
-<tr><td width="50%">User Name</td><td width="50%">{USERNAME}</td></tr>
-<tr><td width="50%">URL</td><td width="50%">{URL}</td></tr>
-<tr><td width="50%">Password</td><td width="50%">{PASSWORD}</td></tr>
-<tr><td width="50%">Notes</td><td width="50%">{NOTES}</td></tr>
+<tr><th width="50%">Placeholder</th><th width="50%">Field</th></tr>
+<tr><td width="50%">{TITLE}</td><td width="50%">Title</td></tr>
+<tr><td width="50%">{USERNAME}</td><td width="50%">User name</td></tr>
+<tr><td width="50%">{URL}</td><td width="50%">URL</td></tr>
+<tr><td width="50%">{PASSWORD}</td><td width="50%">Password</td></tr>
+<tr><td width="50%">{NOTES}</td><td width="50%">Notes</td></tr>
</table>
<br />
@@ -99,7 +95,12 @@ you can use the placeholder <code>{S:eMail}</code>.
<table class="tablebox75">
<tr><th width="50%">Placeholder</th><th width="50%">Is Replaced By</th></tr>
-<tr><td width="50%">{URL:RMVSCM}</td><td width="50%">Entry URL without scheme specifier.</td></tr>
+<tr><td width="50%">{URL:RMVSCM}</td><td width="50%">Entry URL without scheme name.</td></tr>
+<tr><td width="50%">{URL:SCM}</td><td width="50%">Scheme name of the entry URL.</td></tr>
+<tr><td width="50%">{URL:HOST}</td><td width="50%">Host component of the entry URL.</td></tr>
+<tr><td width="50%">{URL:PORT}</td><td width="50%">Port number of the entry URL.</td></tr>
+<tr><td width="50%">{URL:PATH}</td><td width="50%">Path component of the entry URL.</td></tr>
+<tr><td width="50%">{URL:QUERY}</td><td width="50%">Query information of the entry URL.</td></tr>
</table>
@@ -152,7 +153,15 @@ on Unix-like systems), if installed.</td></tr>
<tr><td width="50%">{ENV_DIRSEP}</td><td width="50%">Directory separator ('\' on Windows, '/' on Unix).</td></tr>
<tr><td width="50%">{ENV_PROGRAMFILES_X86}</td><td width="50%">This is
<code>%ProgramFiles(x86)%</code>, if it exists, otherwise <code>%ProgramFiles%</code>.</td></tr>
-<tr><td width="50%">{DT_SIMPLE}</td><td width="50%">Current local date/time as a simple, sortable string.</td></tr>
+</table>
+
+
+<br />
+
+<table class="tablebox75">
+<tr><th width="50%">Placeholder</th><th width="50%">Is Replaced By</th></tr>
+<tr><td width="50%">{DT_SIMPLE}</td><td width="50%">Current local date/time as a simple, sortable string.
+For example, for 2012-07-25 17:05:34 the value is 20120725170534.</td></tr>
<tr><td width="50%">{DT_YEAR}</td><td width="50%">Year component of the current local date/time.</td></tr>
<tr><td width="50%">{DT_MONTH}</td><td width="50%">Month component of the current local date/time.</td></tr>
<tr><td width="50%">{DT_DAY}</td><td width="50%">Day component of the current local date/time.</td></tr>
@@ -168,7 +177,6 @@ on Unix-like systems), if installed.</td></tr>
<tr><td width="50%">{DT_UTC_SECOND}</td><td width="50%">Seconds component of the current UTC date/time.</td></tr>
</table>
-
<br /><br />
<a name="envvars"></a>
diff --git a/Docs/Chm/help/base/pwgenerator.html b/Docs/Chm/help/base/pwgenerator.html
index a5ebca8..dd3223e 100644
--- a/Docs/Chm/help/base/pwgenerator.html
+++ b/Docs/Chm/help/base/pwgenerator.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/repair.html b/Docs/Chm/help/base/repair.html
index 75c5846..ecf1d9a 100644
--- a/Docs/Chm/help/base/repair.html
+++ b/Docs/Chm/help/base/repair.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/secedits.html b/Docs/Chm/help/base/secedits.html
index cfa5592..d1a97d5 100644
--- a/Docs/Chm/help/base/secedits.html
+++ b/Docs/Chm/help/base/secedits.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/security.html b/Docs/Chm/help/base/security.html
index 39b1b68..2fdc700 100644
--- a/Docs/Chm/help/base/security.html
+++ b/Docs/Chm/help/base/security.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -271,7 +267,7 @@ Master Key on Secure Desktop (Protection against Keyloggers)</h2>
<p><i>Note: KeePass was one of the first (maybe even the first) password
manager that allows entering the master key on a secure desktop!</i></p>
-<p>KeePass ≥ 2.15 has an option (in 'Tools' -> 'Options' -> tab 'Security')
+<p>KeePass 2.x has an option (in 'Tools' -> 'Options' -> tab 'Security')
to show the master key dialog on a secure desktop
(supported on Windows ≥ 2000), similar to Windows'
User Account Control (UAC). Almost no keylogger works on a secure desktop.</p>
diff --git a/Docs/Chm/help/base/tans.html b/Docs/Chm/help/base/tans.html
index 128ee48..65bcbb3 100644
--- a/Docs/Chm/help/base/tans.html
+++ b/Docs/Chm/help/base/tans.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/base/usingpws.html b/Docs/Chm/help/base/usingpws.html
index 404a0a5..d12e42d 100644
--- a/Docs/Chm/help/base/usingpws.html
+++ b/Docs/Chm/help/base/usingpws.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/images/options_enf.png b/Docs/Chm/help/images/options_enf.png
new file mode 100644
index 0000000..f33c474
Binary files /dev/null and b/Docs/Chm/help/images/options_enf.png differ
diff --git a/Docs/Chm/help/images/options_enf_big.png b/Docs/Chm/help/images/options_enf_big.png
new file mode 100644
index 0000000..9180865
Binary files /dev/null and b/Docs/Chm/help/images/options_enf_big.png differ
diff --git a/Docs/Chm/help/v2/autotype_obfuscation.html b/Docs/Chm/help/v2/autotype_obfuscation.html
index a23c77c..4aea58b 100644
--- a/Docs/Chm/help/v2/autotype_obfuscation.html
+++ b/Docs/Chm/help/v2/autotype_obfuscation.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/dbsettings.html b/Docs/Chm/help/v2/dbsettings.html
index 6b93201..9fce21b 100644
--- a/Docs/Chm/help/v2/dbsettings.html
+++ b/Docs/Chm/help/v2/dbsettings.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/entry.html b/Docs/Chm/help/v2/entry.html
index 9835ecd..ca38e15 100644
--- a/Docs/Chm/help/v2/entry.html
+++ b/Docs/Chm/help/v2/entry.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/guioptions.html b/Docs/Chm/help/v2/guioptions.html
index 60794ac..b141bb8 100644
--- a/Docs/Chm/help/v2/guioptions.html
+++ b/Docs/Chm/help/v2/guioptions.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/ioconnect.html b/Docs/Chm/help/v2/ioconnect.html
index 3c66a9d..8f9f7de 100644
--- a/Docs/Chm/help/v2/ioconnect.html
+++ b/Docs/Chm/help/v2/ioconnect.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/license.html b/Docs/Chm/help/v2/license.html
index a4f1685..ee8e041 100644
--- a/Docs/Chm/help/v2/license.html
+++ b/Docs/Chm/help/v2/license.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/plugins.html b/Docs/Chm/help/v2/plugins.html
index ba1f751..3737731 100644
--- a/Docs/Chm/help/v2/plugins.html
+++ b/Docs/Chm/help/v2/plugins.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/policy.html b/Docs/Chm/help/v2/policy.html
index a7f9f34..5a58781 100644
--- a/Docs/Chm/help/v2/policy.html
+++ b/Docs/Chm/help/v2/policy.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/setup.html b/Docs/Chm/help/v2/setup.html
index 8be268d..26f7399 100644
--- a/Docs/Chm/help/v2/setup.html
+++ b/Docs/Chm/help/v2/setup.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -236,6 +232,11 @@ or shell script file with this command line (use an absolute path to
<code>KeePass.exe</code>, if the shortcut / shell script file is in a
different location).</p>
+<p><b>Clipboard:</b><br />
+On some systems, Mono's clipboard routines don't work properly.
+In this case, install the <code>xsel</code> package. If <code>xsel</code>
+is installed, KeePass ≥ 2.20 uses this utility for clipboard operations.</p>
+
<p><b>Global Auto-Type:</b><br />
In order to use <a href="../base/autotype.html#autoglobal">global auto-type</a>,
you need to create an appropriate system-wide hot key. This only needs to be done
diff --git a/Docs/Chm/help/v2/sync.html b/Docs/Chm/help/v2/sync.html
index 02df7c3..d6d05a8 100644
--- a/Docs/Chm/help/v2/sync.html
+++ b/Docs/Chm/help/v2/sync.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/translation.html b/Docs/Chm/help/v2/translation.html
index 2e780a1..a1f58ed 100644
--- a/Docs/Chm/help/v2/translation.html
+++ b/Docs/Chm/help/v2/translation.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2/triggers.html b/Docs/Chm/help/v2/triggers.html
index 5278a81..aedae43 100644
--- a/Docs/Chm/help/v2/triggers.html
+++ b/Docs/Chm/help/v2/triggers.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -333,7 +329,7 @@ Remove a custom button from the toolbar in the main window.
<h2 class="sectiontitle">
<img src="../images/b16x16_make_kdevelop.png" class="singleimg" alt="Triggers" /> Examples</h2>
-<p>See the <a href="http://keepass.info/help/kb/kb091127_trigger_examples.html"
+<p>See the <a href="http://keepass.info/help/kb/trigger_examples.html"
target="_blank">Trigger Examples</a> page.</p>
</body></html>
diff --git a/Docs/Chm/help/v2/version.html b/Docs/Chm/help/v2/version.html
index 11ed683..b19a294 100644
--- a/Docs/Chm/help/v2/version.html
+++ b/Docs/Chm/help/v2/version.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2_dev/customize.html b/Docs/Chm/help/v2_dev/customize.html
index f63147e..841679e 100644
--- a/Docs/Chm/help/v2_dev/customize.html
+++ b/Docs/Chm/help/v2_dev/customize.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -26,7 +22,7 @@
<meta name="DC.Language" content="en" />
<meta name="DC.Rights" content="Copyright (c) 2003-2012 Dominik Reichl" />
- <title>Customize - KeePass</title>
+ <title>Customization (2.x) - KeePass</title>
<base target="_self" />
<link rel="stylesheet" type="text/css" href="../../default.css" />
@@ -38,8 +34,8 @@
<table class="sectionsummary"><tr><td width="68px">
<img src="../images/b64x64_package_system.png" class="singleimg" align="left" alt="Help" />
-</td><td valign="middle"><h1>Customize</h1><br />
-KeePass features various options for network administrators to
+</td><td valign="middle"><h1>Customization (2.x)</h1><br />
+KeePass 2.x features various options for network administrators to
customize the program's appearance and behavior.
</td></tr></table>
diff --git a/Docs/Chm/help/v2_dev/plg_index.html b/Docs/Chm/help/v2_dev/plg_index.html
index e5a590f..1c87e66 100644
--- a/Docs/Chm/help/v2_dev/plg_index.html
+++ b/Docs/Chm/help/v2_dev/plg_index.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
@@ -127,7 +123,7 @@ already, which must be followed by all plugins:</p>
<li>The namespace must be named like the DLL file without extension. Our DLL
file is named <code>SamplePlugin.dll</code>, therefore the namespace must
be called <code>SamplePlugin</code>.</li>
-<li>The main plugin class (which KeePass will instanciate when it loads your
+<li>The main plugin class (which KeePass will instantiate when it loads your
plugin) must be called exactly the same as the namespace plus "Ext".
In this case: "SamplePlugin" + "Ext" = "SamplePluginExt".</li>
<li>The main plugin class must be derived from the <code>KeePass.Plugins.Plugin</code>
diff --git a/Docs/Chm/help/v2_dev/scr_index.html b/Docs/Chm/help/v2_dev/scr_index.html
index d24e840..0ccebf0 100644
--- a/Docs/Chm/help/v2_dev/scr_index.html
+++ b/Docs/Chm/help/v2_dev/scr_index.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2_dev/scr_kps_index.html b/Docs/Chm/help/v2_dev/scr_kps_index.html
index d859b6e..234d34a 100644
--- a/Docs/Chm/help/v2_dev/scr_kps_index.html
+++ b/Docs/Chm/help/v2_dev/scr_kps_index.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/help/v2_dev/scr_sc_index.html b/Docs/Chm/help/v2_dev/scr_sc_index.html
index dced094..4bdb3fc 100644
--- a/Docs/Chm/help/v2_dev/scr_sc_index.html
+++ b/Docs/Chm/help/v2_dev/scr_sc_index.html
@@ -10,10 +10,6 @@
<meta name="robots" content="index" />
- <meta http-equiv="expires" content="0" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
-
<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
<meta name="DC.Creator" content="Dominik Reichl" />
<meta name="DC.Subject" content="Open-Source Password Safe" />
diff --git a/Docs/Chm/screenshots/keepass_2x/gencsvimp.png b/Docs/Chm/screenshots/keepass_2x/gencsvimp.png
index b427c17..dea4c9e 100644
Binary files a/Docs/Chm/screenshots/keepass_2x/gencsvimp.png and b/Docs/Chm/screenshots/keepass_2x/gencsvimp.png differ
diff --git a/Docs/History.txt b/Docs/History.txt
index 8c46690..56e5a9d 100644
--- a/Docs/History.txt
+++ b/Docs/History.txt
@@ -1,3 +1,70 @@
+2012-09-08: 2.20
+- Header data in KDBX files is now authenticated (to prevent
+ silent data corruption attacks; thanks to P. Gasti and K. B.
+ Rasmussen)
+- Added management of working directories (a separate working
+ directory is remembered for each file dialog context; working
+ directories are remembered relatively to KeePass.exe; the
+ management can be deactivated by turning off the new option
+ 'Remember working directories')
+- Added option to cancel auto-type when the target window title
+ changes
+- Added quick search box in the toolbar of the internal text
+ editor
+- Files can now be attached to entries by using drag&drop from
+ Windows Explorer to the attachments list in the entry editing
+ dialog
+- Added '-pw-stdin' command line option to make KeePass read
+ the master password from the StdIn stream
+- Added placeholders to get parts of the entry URL: {URL:SCM},
+ {URL:HOST}, {URL:PORT}, {URL:PATH} and {URL:QUERY}
+- Added a 'Details' button in the plugin load failure message
+ box (when clicked, detailed error information for developers
+ is shown)
+- Added warning icon left of the Windows user account option
+ description in the master key creation dialog
+- Added support for more image file formats (e.g. when
+ importing custom client icons)
+- Added support for importing DesktopKnox 3.2 XML files
+- The generic CSV importer now guesses whether the option to
+ ignore the first row should be enabled or not (the user of
+ course can still specify it manually, too)
+- Added support for exporting to KeePass 1.x CSV files
+- Added support for moving the PLGX cache to a different remote
+ drive
+- The Spr engine is now extensible, i.e. plugins can provide
+ additional transformations/placeholders
+- On Unix-like systems, KeePass now uses the 'xsel' utility for
+ clipboard operations, if 'xsel' is installed (in order to
+ work around Mono clipboard bugs)
+- Added Mono workaround to set the WM_CLASS property
+- Added workaround for Mono splitter bug
+- The 'PrepMonoDev.sh' script now removes the serialization
+ assembly generating post build event
+- TrlUtil: added support for importing PO files
+
+- Improved FTP file existence checking
+- High DPI UI improvements
+- The database is not marked as modified anymore when using in-
+ place label editing to fake-edit a group's name (i.e. when
+ the final new name is the same as the previous one)
+- Password is not auto-repeated anymore when trying to unhide
+ it fails due to the policy 'Unhide Passwords' being disabled
+- Improved menu accelerator and shortcut keys
+- Changed IO connection name display format
+- Improved browser detection on Mac OS X
+- Task dialog thread safety improvements
+- Added UI check during import for KPScript
+- Upgraded and improved installer (now uses Unicode, LZMA2
+ compression, ...)
+- Various UI improvements
+- Various code optimizations
+- Minor other improvements
+
+- On Windows systems, new line sequences in text to be shown in
+ a standard multiline text box are now converted to Windows
+ format
+
2012-05-01: 2.19
- New generic CSV importer (now supports multi-line fields, '\'
as escape character, field & record separators and the text
diff --git a/Ext/KeePass.exe.config b/Ext/KeePass.exe.config
index 9635f44..5f6aca9 100644
--- a/Ext/KeePass.exe.config
+++ b/Ext/KeePass.exe.config
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" />
@@ -9,10 +10,11 @@
<assemblyIdentity name="KeePass"
publicKeyToken="fed2ed7716aecf5c"
culture="neutral" />
- <bindingRedirect oldVersion="2.0.9.0-2.19.0.0"
- newVersion="2.19.0.18206" />
+ <bindingRedirect oldVersion="2.0.9.0-2.20.0.0"
+ newVersion="2.20.0.18622" />
</dependentAssembly>
</assemblyBinding>
<enforceFIPSPolicy enabled="false" />
+ <loadFromRemoteSources enabled="true" />
</runtime>
</configuration>
diff --git a/Ext/KeePass.iss b/Ext/KeePass.iss
index a2c3407..63fc529 100644
--- a/Ext/KeePass.iss
+++ b/Ext/KeePass.iss
@@ -8,10 +8,10 @@
#define MyAppNameEx "KeePass Password Safe 2"
#define MyAppPublisher "Dominik Reichl"
-#define KeeVersionStr "2.19"
-#define KeeVersionStrWithMinor "2.19"
-#define KeeVersionStrWithMinorPath "2.19"
-#define KeeVersionWin "2.19.0.0"
+#define KeeVersionStr "2.20"
+#define KeeVersionStrWithMinor "2.20"
+#define KeeVersionStrWithMinorPath "2.20"
+#define KeeVersionWin "2.20.0.0"
#define MyAppURL "http://keepass.info/"
#define MyAppExeName "KeePass.exe"
@@ -29,14 +29,14 @@ AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
AppCopyright=Copyright (c) {#KeeDevPeriod} {#MyAppPublisher}
-MinVersion=4.1,5.0
+MinVersion=5.0
DefaultDirName={pf}\{#MyAppNameEx}
DefaultGroupName={#MyAppNameEx}
AllowNoIcons=yes
LicenseFile=..\Docs\License_Install.txt
OutputDir=..\Build\KeePass_Distrib
OutputBaseFilename={#MyAppNameShort}-{#KeeVersionStrWithMinorPath}-Setup
-Compression=lzma/ultra
+Compression=lzma2/ultra
SolidCompression=yes
InternalCompressLevel=ultra
UninstallDisplayIcon={app}\{#MyAppExeName}
@@ -68,7 +68,7 @@ Name: norwegian; MessagesFile: compiler:Languages\Norwegian.isl
Name: polish; MessagesFile: compiler:Languages\Polish.isl
Name: portuguese; MessagesFile: compiler:Languages\Portuguese.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl
-Name: slovak; MessagesFile: compiler:Languages\Slovak.isl
+; Name: slovak; MessagesFile: compiler:Languages\Slovak.isl
Name: slovenian; MessagesFile: compiler:Languages\Slovenian.isl
Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
@@ -82,7 +82,7 @@ Name: Core; Description: Core KeePass Application Files; Flags: fixed; Types: fu
Name: UserDoc; Description: Help Manual; Types: full custom
Name: KeePassLibC; Description: Native Support Library (KeePass 1.x); Types: full custom
; Name: NativeLib; Description: Native Crypto Library (Fast Key Transformations); Types: full custom
-Name: XSL; Description: XSL Stylesheets for KDB4 XML Files; Types: full custom
+Name: XSL; Description: XSL Stylesheets for KDBX XML Files; Types: full custom
Name: NGen; Description: Optimize KeePass Performance; Types: full custom; ExtraDiskSpaceRequired: 1048576
Name: PreLoad; Description: Optimize KeePass On-Demand Start-Up Performance; Types: full custom; ExtraDiskSpaceRequired: 2048
; Name: FileAssoc; Description: {cm:AssocFileExtension,{#MyAppNameShort},.kdbx}; Types: full custom
@@ -99,11 +99,11 @@ Source: ..\Build\KeePass_Distrib\KeePassLibC32.dll; DestDir: {app}; Components:
Source: ..\Build\KeePass_Distrib\KeePassLibC64.dll; DestDir: {app}; Components: KeePassLibC
; Source: ..\Build\KeePass_Distrib\KeePassNtv32.dll; DestDir: {app}; Components: NativeLib
; Source: ..\Build\KeePass_Distrib\KeePassNtv64.dll; DestDir: {app}; Components: NativeLib
-Source: ..\Build\KeePass_Distrib\XSL\KDB4_DetailsFull.xsl; DestDir: {app}\XSL; Components: XSL
-Source: ..\Build\KeePass_Distrib\XSL\KDB4_DetailsLite.xsl; DestDir: {app}\XSL; Components: XSL
-Source: ..\Build\KeePass_Distrib\XSL\KDB4_PasswordsOnly.xsl; DestDir: {app}\XSL; Components: XSL
-Source: ..\Build\KeePass_Distrib\XSL\KDB4_Styles.css; DestDir: {app}\XSL; Components: XSL
-Source: ..\Build\KeePass_Distrib\XSL\KDB4_Tabular.xsl; DestDir: {app}\XSL; Components: XSL
+Source: ..\Build\KeePass_Distrib\XSL\KDBX_DetailsFull.xsl; DestDir: {app}\XSL; Components: XSL
+Source: ..\Build\KeePass_Distrib\XSL\KDBX_DetailsLite.xsl; DestDir: {app}\XSL; Components: XSL
+Source: ..\Build\KeePass_Distrib\XSL\KDBX_PasswordsOnly.xsl; DestDir: {app}\XSL; Components: XSL
+Source: ..\Build\KeePass_Distrib\XSL\KDBX_Styles.css; DestDir: {app}\XSL; Components: XSL
+Source: ..\Build\KeePass_Distrib\XSL\KDBX_Tabular.xsl; DestDir: {app}\XSL; Components: XSL
Source: ..\Build\KeePass_Distrib\XSL\TableHeader.gif; DestDir: {app}\XSL; Components: XSL
[Registry]
diff --git a/Ext/KeePassMsi/KeePassMsi.vdproj b/Ext/KeePassMsi/KeePassMsi.vdproj
index 9f4db7d..54e1cdb 100644
--- a/Ext/KeePassMsi/KeePassMsi.vdproj
+++ b/Ext/KeePassMsi/KeePassMsi.vdproj
@@ -1,4 +1,4 @@
-"DeployProject"
+"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
@@ -240,8 +240,8 @@
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0B55F2ABEF9A41A9ABAD006DCEA05841"
{
- "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDB4_DetailsLite.xsl"
- "TargetName" = "8:KDB4_DetailsLite.xsl"
+ "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_DetailsLite.xsl"
+ "TargetName" = "8:KDBX_DetailsLite.xsl"
"Tag" = "8:"
"Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE"
"Condition" = "8:"
@@ -360,8 +360,8 @@
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_81BBF30CE4CC438194FC340A84A065C1"
{
- "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDB4_Styles.css"
- "TargetName" = "8:KDB4_Styles.css"
+ "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_Styles.css"
+ "TargetName" = "8:KDBX_Styles.css"
"Tag" = "8:"
"Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE"
"Condition" = "8:"
@@ -382,7 +382,7 @@
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:KeePass, Version=2.19.0.18206, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+ "AssemblyAsmDisplayName" = "8:KeePass, Version=2.20.0.18622, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_838987B3C51D42C3C7B9BDA1339A5500"
@@ -413,7 +413,7 @@
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.19.0.18206, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+ "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.20.0.18622, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_8C05ADB649434D7892E36709EBDED4CC"
@@ -442,8 +442,8 @@
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_990FF777EF5740B3B48CB2D0A3D147A3"
{
- "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDB4_DetailsFull.xsl"
- "TargetName" = "8:KDB4_DetailsFull.xsl"
+ "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_DetailsFull.xsl"
+ "TargetName" = "8:KDBX_DetailsFull.xsl"
"Tag" = "8:"
"Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE"
"Condition" = "8:"
@@ -502,8 +502,8 @@
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_ABF4952D5353474AA85E1471C19D822F"
{
- "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDB4_PasswordsOnly.xsl"
- "TargetName" = "8:KDB4_PasswordsOnly.xsl"
+ "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_PasswordsOnly.xsl"
+ "TargetName" = "8:KDBX_PasswordsOnly.xsl"
"Tag" = "8:"
"Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE"
"Condition" = "8:"
@@ -564,7 +564,7 @@
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:KeePass, Version=2.19.0.18206, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+ "AssemblyAsmDisplayName" = "8:KeePass, Version=2.20.0.18622, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_C4F8814F844C43EE8C9F5B662182B11A"
@@ -593,8 +593,8 @@
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F99D264600A54E439A43BDD0AD42280C"
{
- "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDB4_Tabular.xsl"
- "TargetName" = "8:KDB4_Tabular.xsl"
+ "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_Tabular.xsl"
+ "TargetName" = "8:KDBX_Tabular.xsl"
"Tag" = "8:"
"Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE"
"Condition" = "8:"
@@ -712,14 +712,14 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:KeePass"
- "ProductCode" = "8:{E75AF9CE-09D4-46F2-BF44-9E7D2B4763D9}"
- "PackageCode" = "8:{3707808B-0F74-4AD0-B136-D80EB2DE377C}"
+ "ProductCode" = "8:{F6B49374-09A3-4B84-BA45-1CA2CD1C793F}"
+ "PackageCode" = "8:{72EA3387-C9B6-433D-B670-E84AEC1CF35C}"
"UpgradeCode" = "8:{F2F19898-4F86-4940-9BFA-426574CE03E1}"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:TRUE"
- "ProductVersion" = "8:2.19.0"
+ "ProductVersion" = "8:2.20.0"
"Manufacturer" = "8:Dominik Reichl"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:http://keepass.info/"
diff --git a/Ext/XSL/KDB4_DetailsFull.xsl b/Ext/XSL/KDBX_DetailsFull.xsl
similarity index 94%
rename from Ext/XSL/KDB4_DetailsFull.xsl
rename to Ext/XSL/KDBX_DetailsFull.xsl
index 115be08..fa7bdc6 100644
--- a/Ext/XSL/KDB4_DetailsFull.xsl
+++ b/Ext/XSL/KDBX_DetailsFull.xsl
@@ -9,7 +9,7 @@
<html>
<head>
<xsl:apply-templates select="Meta" />
-<link rel="stylesheet" type="text/css" href="KDB4_Styles.css" />
+<link rel="stylesheet" type="text/css" href="KDBX_Styles.css" />
</head>
<body>
<xsl:apply-templates select="Root" />
diff --git a/Ext/XSL/KDB4_DetailsLite.xsl b/Ext/XSL/KDBX_DetailsLite.xsl
similarity index 93%
rename from Ext/XSL/KDB4_DetailsLite.xsl
rename to Ext/XSL/KDBX_DetailsLite.xsl
index ad58527..7405cc3 100644
--- a/Ext/XSL/KDB4_DetailsLite.xsl
+++ b/Ext/XSL/KDBX_DetailsLite.xsl
@@ -9,7 +9,7 @@
<html>
<head>
<xsl:apply-templates select="Meta" />
-<link rel="stylesheet" type="text/css" href="KDB4_Styles.css" />
+<link rel="stylesheet" type="text/css" href="KDBX_Styles.css" />
</head>
<body>
<xsl:apply-templates select="Root" />
diff --git a/Ext/XSL/KDB4_PasswordsOnly.xsl b/Ext/XSL/KDBX_PasswordsOnly.xsl
similarity index 100%
rename from Ext/XSL/KDB4_PasswordsOnly.xsl
rename to Ext/XSL/KDBX_PasswordsOnly.xsl
diff --git a/Ext/XSL/KDB4_Styles.css b/Ext/XSL/KDBX_Styles.css
similarity index 100%
rename from Ext/XSL/KDB4_Styles.css
rename to Ext/XSL/KDBX_Styles.css
diff --git a/Ext/XSL/KDB4_Tabular.xsl b/Ext/XSL/KDBX_Tabular.xsl
similarity index 94%
rename from Ext/XSL/KDB4_Tabular.xsl
rename to Ext/XSL/KDBX_Tabular.xsl
index 372a1dc..8651a4d 100644
--- a/Ext/XSL/KDB4_Tabular.xsl
+++ b/Ext/XSL/KDBX_Tabular.xsl
@@ -9,7 +9,7 @@
<html>
<head>
<xsl:apply-templates select="Meta" />
-<link rel="stylesheet" type="text/css" href="KDB4_Styles.css" />
+<link rel="stylesheet" type="text/css" href="KDBX_Styles.css" />
</head>
<body>
<xsl:apply-templates select="Root" />
diff --git a/KeePass/App/AppDefs.cs b/KeePass/App/AppDefs.cs
index 2cbabbf..ee2b336 100644
--- a/KeePass/App/AppDefs.cs
+++ b/KeePass/App/AppDefs.cs
@@ -37,9 +37,9 @@ namespace KeePass.App
public static readonly Color ColorEditError = Color.FromArgb(255, 192, 192);
public const string XslFilesDir = "XSL";
- public const string XslFileHtmlLite = "KDB4_DetailsLite.xsl";
- public const string XslFileHtmlFull = "KDB4_DetailsFull.xsl";
- public const string XslFileHtmlTabular = "KDB4_Tabular.xsl";
+ public const string XslFileHtmlLite = "KDBX_DetailsLite.xsl";
+ public const string XslFileHtmlFull = "KDBX_DetailsFull.xsl";
+ public const string XslFileHtmlTabular = "KDBX_Tabular.xsl";
public const string ShInstUtil = "ShInstUtil.exe";
@@ -111,6 +111,7 @@ namespace KeePass.App
public const string UserAccount = "useraccount";
public const string PasswordEncrypted = "pw-enc";
+ public const string PasswordStdIn = "pw-stdin";
public const string PreSelect = "preselect";
@@ -190,6 +191,19 @@ namespace KeePass.App
public static readonly Color LightYellow = Color.FromArgb(255, 255, 153);
}
+ public static class FileDialogContext
+ {
+ // Values must not contain '@'
+
+ public const string Database = "Database";
+ public const string Sync = "Sync";
+ public const string KeyFile = "KeyFile";
+ public const string Import = "Import";
+ public const string Export = "Export";
+ public const string Attachments = "Attachments";
+ public const string Xsl = "Xsl";
+ }
+
public const string DefaultTrlAuthor = "Dominik Reichl";
public const string DefaultTrlContact = @"http://www.dominik-reichl.de/";
diff --git a/KeePass/App/Configuration/AceApplication.cs b/KeePass/App/Configuration/AceApplication.cs
index 0a672cc..3b9f341 100644
--- a/KeePass/App/Configuration/AceApplication.cs
+++ b/KeePass/App/Configuration/AceApplication.cs
@@ -22,6 +22,7 @@ using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.ComponentModel;
+using System.Diagnostics;
using KeePass.Ecas;
@@ -98,6 +99,33 @@ namespace KeePass.App.Configuration
}
}
+ private bool m_bRememberWorkDirs = true;
+ [DefaultValue(true)]
+ public bool RememberWorkingDirectories
+ {
+ get { return m_bRememberWorkDirs; }
+ set { m_bRememberWorkDirs = value; }
+ }
+
+ private Dictionary<string, string> m_dictWorkingDirs =
+ new Dictionary<string, string>();
+
+ /// <summary>
+ /// For serialization only; use the <c>*WorkingDirectory</c>
+ /// methods instead.
+ /// </summary>
+ [XmlArray("WorkingDirectories")]
+ [XmlArrayItem("Item")]
+ public string[] WorkingDirectoriesSerialized
+ {
+ get { return SerializeWorkingDirectories(); }
+ set
+ {
+ if(value == null) throw new ArgumentNullException("value");
+ DeserializeWorkingDirectories(value);
+ }
+ }
+
private AceStartUp m_su = null;
public AceStartUp Start
{
@@ -185,6 +213,62 @@ namespace KeePass.App.Configuration
m_strPluginCachePath = value;
}
}
+
+ public string GetWorkingDirectory(string strContext)
+ {
+ // strContext may be null
+
+ if(!m_bRememberWorkDirs) return null;
+
+ string str;
+ m_dictWorkingDirs.TryGetValue(strContext ?? string.Empty, out str);
+ return str;
+ }
+
+ public void SetWorkingDirectory(string strContext, string strDir)
+ {
+ // Both parameters may be null
+
+ // if(!m_bRememberWorkDirs) return;
+
+ if(string.IsNullOrEmpty(strContext)) return;
+ m_dictWorkingDirs[strContext] = (strDir ?? string.Empty);
+ }
+
+ internal List<string> GetWorkingDirectoryContexts()
+ {
+ if(!m_bRememberWorkDirs) return new List<string>();
+
+ return new List<string>(m_dictWorkingDirs.Keys);
+ }
+
+ private string[] SerializeWorkingDirectories()
+ {
+ if(!m_bRememberWorkDirs) return new string[0];
+
+ List<string> l = new List<string>();
+ foreach(KeyValuePair<string, string> kvp in m_dictWorkingDirs)
+ l.Add(kvp.Key + @"@" + kvp.Value);
+ return l.ToArray();
+ }
+
+ private void DeserializeWorkingDirectories(string[] v)
+ {
+ // Do not check m_bRememberWorkDirs, because it might not
+ // have been deserialized yet
+
+ m_dictWorkingDirs.Clear();
+
+ foreach(string str in v)
+ {
+ if(str == null) { Debug.Assert(false); continue; }
+
+ int iSep = str.IndexOf('@');
+ if(iSep <= 0) { Debug.Assert(false); continue; }
+
+ m_dictWorkingDirs[str.Substring(0, iSep)] = str.Substring(iSep + 1);
+ }
+ }
}
public sealed class AceStartUp
diff --git a/KeePass/App/Configuration/AceIntegration.cs b/KeePass/App/Configuration/AceIntegration.cs
index 83f1134..637840e 100644
--- a/KeePass/App/Configuration/AceIntegration.cs
+++ b/KeePass/App/Configuration/AceIntegration.cs
@@ -172,6 +172,14 @@ namespace KeePass.App.Configuration
set { m_bCancelOnWindowChange = value; }
}
+ private bool m_bCancelOnTitleChange = false;
+ [DefaultValue(false)]
+ public bool AutoTypeCancelOnTitleChange
+ {
+ get { return m_bCancelOnTitleChange; }
+ set { m_bCancelOnTitleChange = value; }
+ }
+
private ProxyServerType m_pstProxyType = ProxyServerType.System;
public ProxyServerType ProxyType
{
diff --git a/KeePass/App/Configuration/AppConfigEx.cs b/KeePass/App/Configuration/AppConfigEx.cs
index cd49ef7..59d7c58 100644
--- a/KeePass/App/Configuration/AppConfigEx.cs
+++ b/KeePass/App/Configuration/AppConfigEx.cs
@@ -259,13 +259,15 @@ namespace KeePass.App.Configuration
foreach(IOConnectionInfo iocMru in m_aceApp.MostRecentlyUsed.Items)
ChangePathRelAbs(iocMru, bMakeAbsolute);
+ List<string> lWDKeys = m_aceApp.GetWorkingDirectoryContexts();
+ foreach(string strWDKey in lWDKeys)
+ m_aceApp.SetWorkingDirectory(strWDKey, ChangePathRelAbsStr(
+ m_aceApp.GetWorkingDirectory(strWDKey), bMakeAbsolute));
+
foreach(AceKeyAssoc kfp in m_def.KeySources)
{
- if(kfp.DatabasePath.Length > 0)
- kfp.DatabasePath = ChangePathRelAbsStr(kfp.DatabasePath, bMakeAbsolute);
-
- if(kfp.KeyFilePath.Length > 0)
- kfp.KeyFilePath = ChangePathRelAbsStr(kfp.KeyFilePath, bMakeAbsolute);
+ kfp.DatabasePath = ChangePathRelAbsStr(kfp.DatabasePath, bMakeAbsolute);
+ kfp.KeyFilePath = ChangePathRelAbsStr(kfp.KeyFilePath, bMakeAbsolute);
}
}
@@ -291,6 +293,7 @@ namespace KeePass.App.Configuration
private static string ChangePathRelAbsStr(string strPath, bool bMakeAbsolute)
{
if(strPath == null) { Debug.Assert(false); return string.Empty; }
+ if(strPath.Length == 0) return strPath;
IOConnectionInfo ioc = IOConnectionInfo.FromPath(strPath);
ChangePathRelAbs(ioc, bMakeAbsolute);
diff --git a/KeePass/DataExchange/FileFormatPool.cs b/KeePass/DataExchange/FileFormatPool.cs
index 83ebfb5..e083529 100644
--- a/KeePass/DataExchange/FileFormatPool.cs
+++ b/KeePass/DataExchange/FileFormatPool.cs
@@ -98,7 +98,7 @@ namespace KeePass.DataExchange
Debug.Assert(m_vFormats == null);
m_vFormats = new List<FileFormatProvider>();
- // m_vFormats.Add(new KeePassCsv1x());
+ m_vFormats.Add(new KeePassCsv1x());
m_vFormats.Add(new KeePassKdb1x());
m_vFormats.Add(new KeePassKdb2x());
m_vFormats.Add(new KeePassKdb2xRepair());
@@ -112,6 +112,7 @@ namespace KeePass.DataExchange
m_vFormats.Add(new AnyPwCsv144());
m_vFormats.Add(new CodeWalletTxt605());
m_vFormats.Add(new DataVaultCsv47());
+ m_vFormats.Add(new DesktopKnox32());
m_vFormats.Add(new FlexWalletXml17());
m_vFormats.Add(new HandySafeTxt512());
m_vFormats.Add(new HandySafeProXml12());
diff --git a/KeePass/DataExchange/Formats/AmpXml250.cs b/KeePass/DataExchange/Formats/AmpXml250.cs
index 73d73ef..9502ff7 100644
--- a/KeePass/DataExchange/Formats/AmpXml250.cs
+++ b/KeePass/DataExchange/Formats/AmpXml250.cs
@@ -22,8 +22,8 @@ using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
-using System.Diagnostics;
using System.Drawing;
+using System.Diagnostics;
using KeePass.Resources;
using KeePass.Util;
diff --git a/KeePass/DataExchange/Formats/DesktopKnox32.cs b/KeePass/DataExchange/Formats/DesktopKnox32.cs
new file mode 100644
index 0000000..475fcec
--- /dev/null
+++ b/KeePass/DataExchange/Formats/DesktopKnox32.cs
@@ -0,0 +1,117 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Drawing;
+using System.Xml;
+using System.Diagnostics;
+
+using KeePass.Resources;
+using KeePass.Util;
+
+using KeePassLib;
+using KeePassLib.Interfaces;
+using KeePassLib.Security;
+using KeePassLib.Utility;
+
+namespace KeePass.DataExchange.Formats
+{
+ // 3.2+
+ internal sealed class DesktopKnox32 : FileFormatProvider
+ {
+ private const string ElemRoot = "SafeCatalog";
+
+ private const string ElemEntry = "SafeElement";
+
+ private const string ElemCategory = "Category";
+ private const string ElemTitle = "Title";
+ private const string ElemNotes = "Content";
+
+ public override bool SupportsImport { get { return true; } }
+ public override bool SupportsExport { get { return false; } }
+
+ public override string FormatName { get { return "DesktopKnox XML"; } }
+ public override string DefaultExtension { get { return "xml"; } }
+ public override string ApplicationGroup { get { return KPRes.PasswordManagers; } }
+
+ public override Image SmallIcon
+ {
+ get { return KeePass.Properties.Resources.B16x16_Imp_DesktopKnox; }
+ }
+
+ public override void Import(PwDatabase pwStorage, Stream sInput,
+ IStatusLogger slLogger)
+ {
+ StreamReader sr = new StreamReader(sInput, StrUtil.Utf8);
+ string strDoc = sr.ReadToEnd();
+ sr.Close();
+
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml(strDoc);
+
+ XmlElement xmlRoot = doc.DocumentElement;
+ Debug.Assert(xmlRoot.Name == ElemRoot);
+
+ Dictionary<string, PwGroup> dictGroups = new Dictionary<string, PwGroup>();
+ dictGroups[string.Empty] = pwStorage.RootGroup;
+
+ foreach(XmlNode xmlChild in xmlRoot.ChildNodes)
+ {
+ if(xmlChild.Name == ElemEntry)
+ ImportEntry(xmlChild, pwStorage, dictGroups);
+ else { Debug.Assert(false); }
+ }
+ }
+
+ private static void ImportEntry(XmlNode xmlNode, PwDatabase pwStorage,
+ Dictionary<string, PwGroup> dGroups)
+ {
+ PwEntry pe = new PwEntry(true, true);
+ string strGroup = string.Empty;
+
+ foreach(XmlNode xmlChild in xmlNode)
+ {
+ string strInner = XmlUtil.SafeInnerText(xmlChild);
+
+ if(xmlChild.Name == ElemCategory)
+ strGroup = strInner;
+ else if(xmlChild.Name == ElemTitle)
+ pe.Strings.Set(PwDefs.TitleField, new ProtectedString(
+ pwStorage.MemoryProtection.ProtectTitle, strInner));
+ else if(xmlChild.Name == ElemNotes)
+ pe.Strings.Set(PwDefs.NotesField, new ProtectedString(
+ pwStorage.MemoryProtection.ProtectNotes, strInner));
+ }
+
+ PwGroup pg;
+ dGroups.TryGetValue(strGroup, out pg);
+ if(pg == null)
+ {
+ pg = new PwGroup(true, true);
+ pg.Name = strGroup;
+ dGroups[string.Empty].AddGroup(pg, true);
+ dGroups[strGroup] = pg;
+ }
+ pg.AddEntry(pe, true);
+ }
+ }
+}
diff --git a/Ext/DeprecatedSources/KeePassCsv1x_120221.cs b/KeePass/DataExchange/Formats/KeePassCsv1x.cs
similarity index 88%
copy from Ext/DeprecatedSources/KeePassCsv1x_120221.cs
copy to KeePass/DataExchange/Formats/KeePassCsv1x.cs
index 1cbde91..ae71efd 100644
--- a/Ext/DeprecatedSources/KeePassCsv1x_120221.cs
+++ b/KeePass/DataExchange/Formats/KeePassCsv1x.cs
@@ -1,4 +1,4 @@
-/*
+/*
KeePass Password Safe - The Open-Source Password Manager
Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
@@ -34,21 +34,21 @@ namespace KeePass.DataExchange.Formats
{
internal sealed class KeePassCsv1x : FileFormatProvider
{
- public override bool SupportsImport { get { return true; } }
+ public override bool SupportsImport { get { return false; } }
public override bool SupportsExport { get { return true; } }
public override string FormatName { get { return "KeePass CSV (1.x)"; } }
public override string DefaultExtension { get { return "csv"; } }
public override string ApplicationGroup { get { return PwDefs.ShortProductName; } }
- public override bool ImportAppendsToRootGroupOnly { get { return true; } }
+ // public override bool ImportAppendsToRootGroupOnly { get { return true; } }
public override Image SmallIcon
{
get { return KeePass.Properties.Resources.B16x16_KeePass; }
}
- public override void Import(PwDatabase pwStorage, Stream sInput,
+ /* public override void Import(PwDatabase pwStorage, Stream sInput,
IStatusLogger slLogger)
{
StreamReader sr = new StreamReader(sInput, Encoding.UTF8);
@@ -133,7 +133,7 @@ namespace KeePass.DataExchange.Formats
}
return sb.ToString();
- }
+ } */
public override bool Export(PwExportInfo pwExportInfo, Stream sOutput,
IStatusLogger slLogger)
@@ -141,7 +141,7 @@ namespace KeePass.DataExchange.Formats
PwGroup pg = (pwExportInfo.DataGroup ?? ((pwExportInfo.ContextDatabase !=
null) ? pwExportInfo.ContextDatabase.RootGroup : null));
- StreamWriter sw = new StreamWriter(sOutput, new UTF8Encoding(false));
+ StreamWriter sw = new StreamWriter(sOutput, StrUtil.Utf8);
sw.Write("\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Comments\"\r\n");
EntryHandler eh = delegate(PwEntry pe)
@@ -175,13 +175,15 @@ namespace KeePass.DataExchange.Formats
string strAppend)
{
string str = strText;
+ if(!string.IsNullOrEmpty(str))
+ {
+ str = str.Replace("\\", "\\\\");
+ str = str.Replace("\"", "\\\"");
- str = str.Replace("\\", "\\\\");
- str = str.Replace("\"", "\\\"");
-
- sw.Write(str);
+ sw.Write(str);
+ }
- if((strAppend != null) && (strAppend.Length > 0)) sw.Write(strAppend);
+ if(!string.IsNullOrEmpty(strAppend)) sw.Write(strAppend);
}
}
}
diff --git a/KeePass/DataExchange/Formats/KeePassKdb1x.cs b/KeePass/DataExchange/Formats/KeePassKdb1x.cs
index de1f642..dfaa8e2 100644
--- a/KeePass/DataExchange/Formats/KeePassKdb1x.cs
+++ b/KeePass/DataExchange/Formats/KeePassKdb1x.cs
@@ -60,10 +60,10 @@ namespace KeePass.DataExchange.Formats
}
Exception exLib;
- if(!Kdb3File.IsLibraryInstalled(out exLib))
+ if(!KdbFile.IsLibraryInstalled(out exLib))
{
MessageService.ShowWarning(KPRes.KeePassLibCNotFound,
- KPRes.Kdb3KeePassLibC, exLib);
+ KPRes.KdbKeePassLibC, exLib);
return false;
}
@@ -85,8 +85,8 @@ namespace KeePass.DataExchange.Formats
br.Close();
File.WriteAllBytes(strTempFile, pb);
- Kdb3File kdb3 = new Kdb3File(pwStorage, slLogger);
- kdb3.Load(strTempFile);
+ KdbFile kdb = new KdbFile(pwStorage, slLogger);
+ kdb.Load(strTempFile);
Program.TempFilesPool.Delete(strTempFile);
}
@@ -100,7 +100,7 @@ namespace KeePass.DataExchange.Formats
try
{
- Kdb3File kdb = new Kdb3File(pd, slLogger);
+ KdbFile kdb = new KdbFile(pd, slLogger);
kdb.Save(strTempFile, pwExportInfo.DataGroup);
byte[] pbKdb = File.ReadAllBytes(strTempFile);
diff --git a/KeePass/DataExchange/Formats/KeePassKdb2x.cs b/KeePass/DataExchange/Formats/KeePassKdb2x.cs
index cc944f2..6a99a35 100644
--- a/KeePass/DataExchange/Formats/KeePassKdb2x.cs
+++ b/KeePass/DataExchange/Formats/KeePassKdb2x.cs
@@ -52,15 +52,15 @@ namespace KeePass.DataExchange.Formats
public override void Import(PwDatabase pwStorage, Stream sInput,
IStatusLogger slLogger)
{
- Kdb4File kdb4 = new Kdb4File(pwStorage);
- kdb4.Load(sInput, Kdb4Format.Default, slLogger);
+ KdbxFile kdbx = new KdbxFile(pwStorage);
+ kdbx.Load(sInput, KdbxFormat.Default, slLogger);
}
public override bool Export(PwExportInfo pwExportInfo, Stream sOutput,
IStatusLogger slLogger)
{
- Kdb4File kdb4 = new Kdb4File(pwExportInfo.ContextDatabase);
- kdb4.Save(sOutput, pwExportInfo.DataGroup, Kdb4Format.Default, slLogger);
+ KdbxFile kdbx = new KdbxFile(pwExportInfo.ContextDatabase);
+ kdbx.Save(sOutput, pwExportInfo.DataGroup, KdbxFormat.Default, slLogger);
return true;
}
}
diff --git a/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs b/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs
index b5380bd..27796e4 100644
--- a/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs
+++ b/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs
@@ -55,12 +55,12 @@ namespace KeePass.DataExchange.Formats
public override void Import(PwDatabase pwStorage, Stream sInput,
IStatusLogger slLogger)
{
- Kdb4File kdb4 = new Kdb4File(pwStorage);
+ KdbxFile kdbx = new KdbxFile(pwStorage);
// CappedByteStream s = new CappedByteStream(sInput, 64);
- kdb4.RepairMode = true;
+ kdbx.RepairMode = true;
- try { kdb4.Load(sInput, Kdb4Format.Default, slLogger); }
+ try { kdbx.Load(sInput, KdbxFormat.Default, slLogger); }
catch(Exception) { }
}
diff --git a/KeePass/DataExchange/Formats/KeePassXml2x.cs b/KeePass/DataExchange/Formats/KeePassXml2x.cs
index 9311afb..fe2f9b9 100644
--- a/KeePass/DataExchange/Formats/KeePassXml2x.cs
+++ b/KeePass/DataExchange/Formats/KeePassXml2x.cs
@@ -51,8 +51,8 @@ namespace KeePass.DataExchange.Formats
public override void Import(PwDatabase pwStorage, Stream sInput,
IStatusLogger slLogger)
{
- Kdb4File kdb4 = new Kdb4File(pwStorage);
- kdb4.Load(sInput, Kdb4Format.PlainXml, slLogger);
+ KdbxFile kdbx = new KdbxFile(pwStorage);
+ kdbx.Load(sInput, KdbxFormat.PlainXml, slLogger);
}
public override bool Export(PwExportInfo pwExportInfo, Stream sOutput,
@@ -67,8 +67,8 @@ namespace KeePass.DataExchange.Formats
pd.DeletedObjects.Clear();
}
- Kdb4File kdb = new Kdb4File(pd);
- kdb.Save(sOutput, pwExportInfo.DataGroup, Kdb4Format.PlainXml, slLogger);
+ KdbxFile kdb = new KdbxFile(pd);
+ kdb.Save(sOutput, pwExportInfo.DataGroup, KdbxFormat.PlainXml, slLogger);
// Restore deleted objects list
if(vDel != null) pd.DeletedObjects.Add(vDel);
diff --git a/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs b/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs
index e3bba93..c26969b 100644
--- a/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs
+++ b/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs
@@ -71,7 +71,7 @@ namespace KeePass.DataExchange.Formats
{
if(jObject.Items.ContainsKey(m_strGroup))
{
- JsonArray jArray = jObject.Items[m_strGroup].Value as JsonArray;
+ JsonArray jArray = (jObject.Items[m_strGroup].Value as JsonArray);
if(jArray == null) { Debug.Assert(false); return; }
PwGroup pgNew;
@@ -88,7 +88,7 @@ namespace KeePass.DataExchange.Formats
foreach(JsonValue jValue in jArray.Values)
{
- JsonObject objSub = jValue.Value as JsonObject;
+ JsonObject objSub = (jValue.Value as JsonObject);
if(objSub != null) AddObject(pgNew, objSub, pwContext, true);
else { Debug.Assert(false); }
}
diff --git a/KeePass/DataExchange/Formats/XslTransform2x.cs b/KeePass/DataExchange/Formats/XslTransform2x.cs
index 90133b5..8bd34b2 100644
--- a/KeePass/DataExchange/Formats/XslTransform2x.cs
+++ b/KeePass/DataExchange/Formats/XslTransform2x.cs
@@ -27,6 +27,7 @@ using System.Windows.Forms;
using System.Diagnostics;
using System.Drawing;
+using KeePass.App;
using KeePass.Resources;
using KeePass.UI;
@@ -54,8 +55,8 @@ namespace KeePass.DataExchange.Formats
IStatusLogger slLogger)
{
string strFilter = UIUtil.CreateFileTypeFilter("xsl", KPRes.XslFileType, true);
- OpenFileDialog dlgXsl = UIUtil.CreateOpenFileDialog(KPRes.XslSelectFile,
- strFilter, 1, "xsl", false, false);
+ OpenFileDialogEx dlgXsl = UIUtil.CreateOpenFileDialog(KPRes.XslSelectFile,
+ strFilter, 1, "xsl", false, AppDefs.FileDialogContext.Xsl);
if(dlgXsl.ShowDialog() != DialogResult.OK) return false;
@@ -72,8 +73,8 @@ namespace KeePass.DataExchange.Formats
MemoryStream msDataXml = new MemoryStream();
PwDatabase pd = (pwExportInfo.ContextDatabase ?? new PwDatabase());
- Kdb4File kdb = new Kdb4File(pd);
- kdb.Save(msDataXml, pwExportInfo.DataGroup, Kdb4Format.PlainXml, slLogger);
+ KdbxFile kdb = new KdbxFile(pd);
+ kdb.Save(msDataXml, pwExportInfo.DataGroup, KdbxFormat.PlainXml, slLogger);
byte[] pbData = msDataXml.ToArray();
msDataXml.Close();
diff --git a/KeePass/DataExchange/ImportUtil.cs b/KeePass/DataExchange/ImportUtil.cs
index 61e5128..6a13777 100644
--- a/KeePass/DataExchange/ImportUtil.cs
+++ b/KeePass/DataExchange/ImportUtil.cs
@@ -90,8 +90,9 @@ namespace KeePass.DataExchange
List<IOConnectionInfo> vConnections = new List<IOConnectionInfo>();
if(bOpenFromUrl == false)
{
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.Synchronize,
- UIUtil.CreateFileTypeFilter(null, null, true), 1, null, true, true);
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog(KPRes.Synchronize,
+ UIUtil.CreateFileTypeFilter(null, null, true), 1, null, true,
+ AppDefs.FileDialogContext.Sync);
if(ofd.ShowDialog() != DialogResult.OK) return null;
@@ -278,8 +279,9 @@ namespace KeePass.DataExchange
}
else { } // No assert (sync on save)
- Program.MainForm.FileMruList.AddItem(ioc.GetDisplayName(),
- ioc.CloneDeep(), true);
+ if(Program.MainForm != null) // Null for KPScript
+ Program.MainForm.FileMruList.AddItem(
+ ioc.GetDisplayName(), ioc.CloneDeep(), true);
}
catch(Exception exSync)
{
diff --git a/KeePass/DataExchange/Kdb3File.cs b/KeePass/DataExchange/KdbFile.cs
similarity index 88%
rename from KeePass/DataExchange/Kdb3File.cs
rename to KeePass/DataExchange/KdbFile.cs
index d3e41f2..8043053 100644
--- a/KeePass/DataExchange/Kdb3File.cs
+++ b/KeePass/DataExchange/KdbFile.cs
@@ -39,12 +39,12 @@ namespace KeePass.DataExchange
/// <summary>
/// Serialization to KeePass KDB files.
/// </summary>
- public sealed class Kdb3File
+ public sealed class KdbFile
{
private PwDatabase m_pwDatabase = null;
private IStatusLogger m_slLogger = null;
- private const string Kdb3Prefix = "KDB3: ";
+ private const string KdbPrefix = "KDB: ";
private const string AutoTypePrefix = "Auto-Type";
private const string AutoTypeWindowPrefix = "Auto-Type-Window";
@@ -61,7 +61,7 @@ namespace KeePass.DataExchange
{
try
{
- Kdb3Manager mgr = new Kdb3Manager();
+ KdbManager mgr = new KdbManager();
mgr.Unload();
}
catch(Exception exMgr)
@@ -81,7 +81,7 @@ namespace KeePass.DataExchange
/// will load file data into or use to create a KDB file. Must not be <c>null</c>.</param>
/// <exception cref="System.ArgumentNullException">Thrown if the database
/// reference is <c>null</c>.</exception>
- public Kdb3File(PwDatabase pwDataStore, IStatusLogger slLogger)
+ public KdbFile(PwDatabase pwDataStore, IStatusLogger slLogger)
{
Debug.Assert(pwDataStore != null);
if(pwDataStore == null) throw new ArgumentNullException("pwDataStore");
@@ -90,9 +90,9 @@ namespace KeePass.DataExchange
m_slLogger = slLogger;
}
- private static Kdb3ErrorCode SetDatabaseKey(Kdb3Manager mgr, CompositeKey pwKey)
+ private static KdbErrorCode SetDatabaseKey(KdbManager mgr, CompositeKey pwKey)
{
- Kdb3ErrorCode e;
+ KdbErrorCode e;
bool bPassword = pwKey.ContainsType(typeof(KcpPassword));
bool bKeyFile = pwKey.ContainsType(typeof(KcpKeyFile));
@@ -123,14 +123,14 @@ namespace KeePass.DataExchange
Debug.Assert(strFilePath != null);
if(strFilePath == null) throw new ArgumentNullException("strFilePath");
- Kdb3Manager mgr = new Kdb3Manager();
- Kdb3ErrorCode e;
+ KdbManager mgr = new KdbManager();
+ KdbErrorCode e;
- e = Kdb3File.SetDatabaseKey(mgr, m_pwDatabase.MasterKey);
- if(e != Kdb3ErrorCode.Success) throw new Exception(KLRes.InvalidCompositeKey);
+ e = KdbFile.SetDatabaseKey(mgr, m_pwDatabase.MasterKey);
+ if(e != KdbErrorCode.Success) throw new Exception(KLRes.InvalidCompositeKey);
e = mgr.OpenDatabase(strFilePath, IntPtr.Zero);
- if(e != Kdb3ErrorCode.Success)
+ if(e != KdbErrorCode.Success)
{
mgr.Unload();
throw new Exception(KLRes.FileLoadFailed);
@@ -146,7 +146,7 @@ namespace KeePass.DataExchange
mgr.Unload();
}
- private Dictionary<UInt32, PwGroup> ReadGroups(Kdb3Manager mgr)
+ private Dictionary<UInt32, PwGroup> ReadGroups(KdbManager mgr)
{
uint uGroupCount = mgr.GroupCount;
Dictionary<UInt32, PwGroup> dictGroups = new Dictionary<uint, PwGroup>();
@@ -154,11 +154,11 @@ namespace KeePass.DataExchange
Stack<PwGroup> vGroupStack = new Stack<PwGroup>();
vGroupStack.Push(m_pwDatabase.RootGroup);
- DateTime dtNeverExpire = Kdb3Manager.GetNeverExpireTime();
+ DateTime dtNeverExpire = KdbManager.GetNeverExpireTime();
for(uint uGroup = 0; uGroup < uGroupCount; ++uGroup)
{
- Kdb3Group g = mgr.GetGroup(uGroup);
+ KdbGroup g = mgr.GetGroup(uGroup);
PwGroup pg = new PwGroup(true, false);
@@ -172,7 +172,7 @@ namespace KeePass.DataExchange
pg.Expires = (pg.ExpiryTime != dtNeverExpire);
- pg.IsExpanded = ((g.Flags & (uint)Kdb3GroupFlags.Expanded) != 0);
+ pg.IsExpanded = ((g.Flags & (uint)KdbGroupFlags.Expanded) != 0);
while(g.Level < (vGroupStack.Count - 1))
vGroupStack.Pop();
@@ -188,14 +188,14 @@ namespace KeePass.DataExchange
return dictGroups;
}
- private void ReadEntries(Kdb3Manager mgr, Dictionary<UInt32, PwGroup> dictGroups)
+ private void ReadEntries(KdbManager mgr, Dictionary<UInt32, PwGroup> dictGroups)
{
- DateTime dtNeverExpire = Kdb3Manager.GetNeverExpireTime();
+ DateTime dtNeverExpire = KdbManager.GetNeverExpireTime();
uint uEntryCount = mgr.EntryCount;
for(uint uEntry = 0; uEntry < uEntryCount; ++uEntry)
{
- Kdb3Entry e = mgr.GetEntry(uEntry);
+ KdbEntry e = mgr.GetEntry(uEntry);
PwGroup pgContainer;
if(!dictGroups.TryGetValue(e.GroupId, out pgContainer))
@@ -235,7 +235,7 @@ namespace KeePass.DataExchange
if((e.BinaryDataLength > 0) && (e.BinaryData != IntPtr.Zero))
{
- byte[] pbData = Kdb3Manager.ReadBinary(e.BinaryData, e.BinaryDataLength);
+ byte[] pbData = KdbManager.ReadBinary(e.BinaryData, e.BinaryDataLength);
Debug.Assert(pbData.Length == e.BinaryDataLength);
string strDesc = e.BinaryDescription;
@@ -261,10 +261,10 @@ namespace KeePass.DataExchange
Debug.Assert(strSaveToFile != null);
if(strSaveToFile == null) throw new ArgumentNullException("strSaveToFile");
- Kdb3Manager mgr = new Kdb3Manager();
+ KdbManager mgr = new KdbManager();
- Kdb3ErrorCode e = Kdb3File.SetDatabaseKey(mgr, m_pwDatabase.MasterKey);
- if(e != Kdb3ErrorCode.Success)
+ KdbErrorCode e = KdbFile.SetDatabaseKey(mgr, m_pwDatabase.MasterKey);
+ if(e != KdbErrorCode.Success)
{
Debug.Assert(false);
throw new Exception(KLRes.InvalidCompositeKey);
@@ -273,9 +273,9 @@ namespace KeePass.DataExchange
if(m_slLogger != null)
{
if(m_pwDatabase.Name.Length != 0)
- m_slLogger.SetText(Kdb3Prefix + KPRes.FormatNoDatabaseName, LogStatusType.Warning);
+ m_slLogger.SetText(KdbPrefix + KPRes.FormatNoDatabaseName, LogStatusType.Warning);
if(m_pwDatabase.Description.Length != 0)
- m_slLogger.SetText(Kdb3Prefix + KPRes.FormatNoDatabaseDesc, LogStatusType.Warning);
+ m_slLogger.SetText(KdbPrefix + KPRes.FormatNoDatabaseDesc, LogStatusType.Warning);
}
// Set properties
@@ -290,18 +290,18 @@ namespace KeePass.DataExchange
WriteEntries(mgr, dictGroups, pgRoot);
e = mgr.SaveDatabase(strSaveToFile);
- if(e != Kdb3ErrorCode.Success) throw new Exception(KLRes.FileSaveFailed);
+ if(e != KdbErrorCode.Success) throw new Exception(KLRes.FileSaveFailed);
mgr.Unload();
}
- private static Dictionary<PwGroup, UInt32> WriteGroups(Kdb3Manager mgr,
+ private static Dictionary<PwGroup, UInt32> WriteGroups(KdbManager mgr,
PwGroup pgRoot)
{
Dictionary<PwGroup, UInt32> dictGroups = new Dictionary<PwGroup, uint>();
uint uGroupIndex = 1;
- DateTime dtNeverExpire = Kdb3Manager.GetNeverExpireTime();
+ DateTime dtNeverExpire = KdbManager.GetNeverExpireTime();
GroupHandler gh = delegate(PwGroup pg)
{
@@ -320,11 +320,11 @@ namespace KeePass.DataExchange
private static void WriteGroup(PwGroup pg, PwGroup pgRoot, ref uint uGroupIndex,
Dictionary<PwGroup, UInt32> dictGroups, DateTime dtNeverExpire,
- Kdb3Manager mgr, bool bForceLevel0)
+ KdbManager mgr, bool bForceLevel0)
{
if(pg == pgRoot) return;
- Kdb3Group grp = new Kdb3Group();
+ KdbGroup grp = new KdbGroup();
grp.GroupId = uGroupIndex;
dictGroups[pg] = grp.GroupId;
@@ -341,7 +341,7 @@ namespace KeePass.DataExchange
grp.Level = (bForceLevel0 ? (ushort)0 : (ushort)(pg.GetLevel() - 1));
- if(pg.IsExpanded) grp.Flags |= (uint)Kdb3GroupFlags.Expanded;
+ if(pg.IsExpanded) grp.Flags |= (uint)KdbGroupFlags.Expanded;
if(!mgr.AddGroup(ref grp))
{
@@ -354,7 +354,7 @@ namespace KeePass.DataExchange
private static void EnsureParentGroupsExported(PwGroup pgRoot, ref uint uGroupIndex,
Dictionary<PwGroup, UInt32> dictGroups, DateTime dtNeverExpires,
- Kdb3Manager mgr)
+ KdbManager mgr)
{
bool bHasAtLeastOneGroup = (dictGroups.Count > 0);
uint uLocalIndex = uGroupIndex; // Local copy, can't use ref in delegate
@@ -376,18 +376,18 @@ namespace KeePass.DataExchange
uGroupIndex = uLocalIndex;
}
- private void WriteEntries(Kdb3Manager mgr, Dictionary<PwGroup, uint> dictGroups,
+ private void WriteEntries(KdbManager mgr, Dictionary<PwGroup, uint> dictGroups,
PwGroup pgRoot)
{
bool bWarnedOnce = false;
uint uGroupCount, uEntryCount, uEntriesSaved = 0;
pgRoot.GetCounts(true, out uGroupCount, out uEntryCount);
- DateTime dtNeverExpire = Kdb3Manager.GetNeverExpireTime();
+ DateTime dtNeverExpire = KdbManager.GetNeverExpireTime();
EntryHandler eh = delegate(PwEntry pe)
{
- Kdb3Entry e = new Kdb3Entry();
+ KdbEntry e = new KdbEntry();
e.Uuid.Set(pe.Uuid.UuidBytes);
@@ -398,7 +398,7 @@ namespace KeePass.DataExchange
e.GroupId = 1;
if((m_slLogger != null) && !bWarnedOnce)
{
- m_slLogger.SetText(Kdb3Prefix +
+ m_slLogger.SetText(KdbPrefix +
KPRes.FormatNoRootEntries, LogStatusType.Warning);
bWarnedOnce = true;
}
@@ -452,7 +452,7 @@ namespace KeePass.DataExchange
}
if((pe.Binaries.UCount > 1) && (m_slLogger != null))
- m_slLogger.SetText(Kdb3Prefix + KPRes.FormatOnlyOneAttachment + "\r\n\r\n" +
+ m_slLogger.SetText(KdbPrefix + KPRes.FormatOnlyOneAttachment + "\r\n\r\n" +
KPRes.Entry + ":\r\n" + KPRes.Title + ": " + e.Title + "\r\n" +
KPRes.UserName + ": " + e.UserName, LogStatusType.Warning);
}
diff --git a/KeePass/DataExchange/Kdb3Manager.cs b/KeePass/DataExchange/KdbManager.cs
similarity index 80%
rename from KeePass/DataExchange/Kdb3Manager.cs
rename to KeePass/DataExchange/KdbManager.cs
index 408ea0c..266d293 100644
--- a/KeePass/DataExchange/Kdb3Manager.cs
+++ b/KeePass/DataExchange/KdbManager.cs
@@ -18,11 +18,11 @@
*/
#if PocketPC || Smartphone || WindowsCE
-#undef KDB3_ANSI
+#undef KDB_ANSI
#else
-// If compiling for the ANSI version of KeePassLibC, define KDB3_ANSI.
-// If compiling for the Unicode version of KeePassLibC, do not define KDB3_ANSI.
-#define KDB3_ANSI
+// If compiling for the ANSI version of KeePassLibC, define KDB_ANSI.
+// If compiling for the Unicode version of KeePassLibC, do not define KDB_ANSI.
+#define KDB_ANSI
#endif
using System;
@@ -41,7 +41,7 @@ namespace KeePass.DataExchange
#else
[StructLayout(LayoutKind.Sequential, Pack = 1)]
#endif
- public struct Kdb3Group
+ public struct KdbGroup
{
/// <summary>
/// The GroupID of the group.
@@ -58,7 +58,7 @@ namespace KeePass.DataExchange
/// <summary>
/// The Name of the group.
/// </summary>
-#if KDB3_ANSI
+#if KDB_ANSI
[MarshalAs(UnmanagedType.LPStr)]
public string Name;
#else
@@ -69,22 +69,22 @@ namespace KeePass.DataExchange
/// <summary>
/// The creation time of the group.
/// </summary>
- public Kdb3Time CreationTime;
+ public KdbTime CreationTime;
/// <summary>
/// The last modification time of the group.
/// </summary>
- public Kdb3Time LastModificationTime;
+ public KdbTime LastModificationTime;
/// <summary>
/// The last access time of the group.
/// </summary>
- public Kdb3Time LastAccessTime;
+ public KdbTime LastAccessTime;
/// <summary>
/// The expiry time of the group.
/// </summary>
- public Kdb3Time ExpirationTime;
+ public KdbTime ExpirationTime;
/// <summary>
/// Indentation level of the group.
@@ -101,7 +101,7 @@ namespace KeePass.DataExchange
#endif
/// <summary>
- /// Flags of the group (see <c>Kdb3GroupFlags</c>).
+ /// Flags of the group (see <c>KdbGroupFlags</c>).
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public UInt32 Flags;
@@ -111,7 +111,7 @@ namespace KeePass.DataExchange
/// Password group flags.
/// </summary>
[Flags]
- public enum Kdb3GroupFlags
+ public enum KdbGroupFlags
{
/// <summary>
/// No special flags.
@@ -132,12 +132,12 @@ namespace KeePass.DataExchange
#else
[StructLayout(LayoutKind.Sequential, Pack = 1)]
#endif
- public struct Kdb3Entry
+ public struct KdbEntry
{
/// <summary>
/// The UUID of the entry.
/// </summary>
- public Kdb3Uuid Uuid;
+ public KdbUuid Uuid;
/// <summary>
/// The group ID of the enty.
@@ -151,7 +151,7 @@ namespace KeePass.DataExchange
[MarshalAs(UnmanagedType.U4)]
public UInt32 ImageId;
-#if KDB3_ANSI
+#if KDB_ANSI
/// <summary>
/// The title of the entry.
/// </summary>
@@ -228,27 +228,27 @@ namespace KeePass.DataExchange
/// <summary>
/// The creation time of the entry.
/// </summary>
- public Kdb3Time CreationTime;
+ public KdbTime CreationTime;
/// <summary>
/// The last modification time of the entry.
/// </summary>
- public Kdb3Time LastModificationTime;
+ public KdbTime LastModificationTime;
/// <summary>
/// The last access time of the entry.
/// </summary>
- public Kdb3Time LastAccessTime;
+ public KdbTime LastAccessTime;
/// <summary>
/// The expiration time of the entry.
/// </summary>
- public Kdb3Time ExpirationTime;
+ public KdbTime ExpirationTime;
/// <summary>
/// The description of the binary attachment.
/// </summary>
-#if KDB3_ANSI
+#if KDB_ANSI
[MarshalAs(UnmanagedType.LPStr)]
public string BinaryDescription;
#else
@@ -276,7 +276,7 @@ namespace KeePass.DataExchange
#else
[StructLayout(LayoutKind.Sequential, Pack = 1)]
#endif
- public struct Kdb3Uuid
+ public struct KdbUuid
{
#pragma warning disable 1591 // Missing XML comments warning
public Byte V0; public Byte V1; public Byte V2; public Byte V3;
@@ -322,7 +322,7 @@ namespace KeePass.DataExchange
#else
[StructLayout(LayoutKind.Sequential, Pack = 1)]
#endif
- public struct Kdb3Time
+ public struct KdbTime
{
#pragma warning disable 1591 // Missing XML comments warning
[MarshalAs(UnmanagedType.U2)]
@@ -348,7 +348,7 @@ namespace KeePass.DataExchange
#endif
/// <summary>
- /// Construct a <c>Kdb3Time</c> with initial values.
+ /// Construct a <c>KdbTime</c> with initial values.
/// </summary>
/// <param name="uYear">Year.</param>
/// <param name="uMonth">Month.</param>
@@ -356,7 +356,7 @@ namespace KeePass.DataExchange
/// <param name="uHour">Hour.</param>
/// <param name="uMinute">Minute.</param>
/// <param name="uSecond">Second.</param>
- public Kdb3Time(UInt16 uYear, Byte uMonth, Byte uDay, Byte uHour,
+ public KdbTime(UInt16 uYear, Byte uMonth, Byte uDay, Byte uHour,
Byte uMinute, Byte uSecond)
{
this.Year = uYear;
@@ -372,7 +372,7 @@ namespace KeePass.DataExchange
}
/// <summary>
- /// Convert the current <c>Kdb3Time</c> object to a <c>DateTime</c> object.
+ /// Convert the current <c>KdbTime</c> object to a <c>DateTime</c> object.
/// </summary>
/// <returns></returns>
public DateTime ToDateTime()
@@ -385,7 +385,7 @@ namespace KeePass.DataExchange
}
/// <summary>
- /// Copy data from a <c>DateTime object</c> to the current <c>Kdb3Time</c> object.
+ /// Copy data from a <c>DateTime object</c> to the current <c>KdbTime</c> object.
/// </summary>
/// <param name="dt">Data source.</param>
public void Set(DateTime dt)
@@ -399,16 +399,16 @@ namespace KeePass.DataExchange
}
/// <summary>
- /// A Kdb3Time element that is used to indicate the never expire time.
+ /// A KdbTime element that is used to indicate the never expire time.
/// </summary>
- public static readonly Kdb3Time NeverExpireTime =
- new Kdb3Time(2999, 12, 28, 23, 59, 59);
+ public static readonly KdbTime NeverExpireTime =
+ new KdbTime(2999, 12, 28, 23, 59, 59);
}
/// <summary>
/// Error codes for various functions (<c>OpenDatabase</c>, etc.).
/// </summary>
- public enum Kdb3ErrorCode
+ public enum KdbErrorCode
{
/// <summary>
/// Unknown error occurred.
@@ -492,10 +492,10 @@ namespace KeePass.DataExchange
}
/// <summary>
- /// Manager class for KDB3 files. It can load/save databases, add/change/delete
+ /// Manager class for KDB files. It can load/save databases, add/change/delete
/// groups and entries, check for KeePassLibC library existence and version, etc.
/// </summary>
- public sealed class Kdb3Manager
+ public sealed class KdbManager
{
private const string DllFile32 = "KeePassLibC32.dll";
private const string DllFile64 = "KeePassLibC64.dll";
@@ -503,7 +503,7 @@ namespace KeePass.DataExchange
private static readonly bool m_bX64 =
(Marshal.SizeOf(typeof(IntPtr)) == 8);
-#if KDB3_ANSI
+#if KDB_ANSI
private const CharSet DllCharSet = CharSet.Ansi;
#else
private const CharSet DllCharSet = CharSet.Unicode;
@@ -539,7 +539,7 @@ namespace KeePass.DataExchange
/// </summary>
public static string KeePassVersionString
{
-#if KDB3_ANSI
+#if KDB_ANSI
get
{
if(m_bX64) return Marshal.PtrToStringAnsi(GetKeePassVersionString64());
@@ -641,9 +641,9 @@ namespace KeePass.DataExchange
[DllImport(DllFile64, EntryPoint = "NewDatabase")]
private static extern void NewDatabase64(IntPtr pMgr);
/// <summary>
- /// Construct a new Kdb3 manager instance.
+ /// Construct a new KDB manager instance.
/// </summary>
- public Kdb3Manager()
+ public KdbManager()
{
if(m_bX64 == false) // Only check 32-bit structures
{
@@ -655,45 +655,45 @@ namespace KeePass.DataExchange
// Static structure layout assertions
int nExpectedSize = (bAligned ? 52 : 46);
- Kdb3Group g = new Kdb3Group();
+ KdbGroup g = new KdbGroup();
Debug.Assert(Marshal.SizeOf(g) == nExpectedSize);
if(Marshal.SizeOf(g) != nExpectedSize)
- throw new FormatException("SizeOf(Kdb3Group) invalid!");
+ throw new FormatException("SizeOf(KdbGroup) invalid!");
nExpectedSize = (bAligned ? 92 : 88);
- Kdb3Entry e = new Kdb3Entry();
+ KdbEntry e = new KdbEntry();
Debug.Assert(Marshal.SizeOf(e) == nExpectedSize);
if(Marshal.SizeOf(e) != nExpectedSize)
- throw new FormatException("SizeOf(Kdb3Entry) invalid!");
+ throw new FormatException("SizeOf(KdbEntry) invalid!");
- Kdb3Uuid u = new Kdb3Uuid();
+ KdbUuid u = new KdbUuid();
Debug.Assert(Marshal.SizeOf(u) == 16);
if(Marshal.SizeOf(u) != 16)
- throw new FormatException("SizeOf(Kdb3Uuid) invalid!");
+ throw new FormatException("SizeOf(KdbUuid) invalid!");
nExpectedSize = (bAligned ? 8 : 7);
- Kdb3Time t = new Kdb3Time();
+ KdbTime t = new KdbTime();
Debug.Assert(Marshal.SizeOf(t) == nExpectedSize);
if(Marshal.SizeOf(t) != nExpectedSize)
- throw new FormatException("SizeOf(Kdb3Time) invalid!");
+ throw new FormatException("SizeOf(KdbTime) invalid!");
}
- if(m_bX64) Kdb3Manager.InitManager64(out m_pManager, m_bFirstInstance);
- else Kdb3Manager.InitManager32(out m_pManager, m_bFirstInstance);
+ if(m_bX64) KdbManager.InitManager64(out m_pManager, m_bFirstInstance);
+ else KdbManager.InitManager32(out m_pManager, m_bFirstInstance);
m_bFirstInstance = false;
if(m_pManager == IntPtr.Zero)
throw new InvalidOperationException("Failed to initialize manager! DLL installed?");
- if(m_bX64) Kdb3Manager.NewDatabase64(m_pManager);
- else Kdb3Manager.NewDatabase32(m_pManager);
+ if(m_bX64) KdbManager.NewDatabase64(m_pManager);
+ else KdbManager.NewDatabase32(m_pManager);
}
/// <summary>
- /// Destructor for Kdb3Manager instance.
+ /// Destructor for KdbManager instance.
/// </summary>
- ~Kdb3Manager()
+ ~KdbManager()
{
this.Unload();
}
@@ -711,8 +711,8 @@ namespace KeePass.DataExchange
{
if(m_pManager != IntPtr.Zero)
{
- if(m_bX64) Kdb3Manager.DeleteManager64(m_pManager);
- else Kdb3Manager.DeleteManager32(m_pManager);
+ if(m_bX64) KdbManager.DeleteManager64(m_pManager);
+ else KdbManager.DeleteManager32(m_pManager);
m_pManager = IntPtr.Zero;
}
@@ -741,18 +741,18 @@ namespace KeePass.DataExchange
/// source code).</param>
/// <param name="bOverwrite">Indicates if the target file should be overwritten when
/// creating a new key file.</param>
- /// <returns>Error code (see <c>Kdb3ErrorCode</c>).</returns>
- public Kdb3ErrorCode SetMasterKey(string strMasterKey, bool bDiskDrive,
+ /// <returns>Error code (see <c>KdbErrorCode</c>).</returns>
+ public KdbErrorCode SetMasterKey(string strMasterKey, bool bDiskDrive,
string strSecondKey, IntPtr pARI, bool bOverwrite)
{
Debug.Assert(strMasterKey != null);
if(strMasterKey == null) throw new ArgumentNullException("strMasterKey");
if(m_bX64)
- return (Kdb3ErrorCode)Kdb3Manager.SetMasterKey64(m_pManager,
+ return (KdbErrorCode)KdbManager.SetMasterKey64(m_pManager,
strMasterKey, bDiskDrive, strSecondKey, pARI, bOverwrite);
else
- return (Kdb3ErrorCode)Kdb3Manager.SetMasterKey32(m_pManager,
+ return (KdbErrorCode)KdbManager.SetMasterKey32(m_pManager,
strMasterKey, bDiskDrive, strSecondKey, pARI, bOverwrite);
}
@@ -772,8 +772,8 @@ namespace KeePass.DataExchange
Debug.Assert(strGroupName != null);
if(strGroupName == null) throw new ArgumentNullException("strGroupName");
- if(m_bX64) return Kdb3Manager.GetNumberOfItemsInGroup64(m_pManager, strGroupName);
- else return Kdb3Manager.GetNumberOfItemsInGroup32(m_pManager, strGroupName);
+ if(m_bX64) return KdbManager.GetNumberOfItemsInGroup64(m_pManager, strGroupName);
+ else return KdbManager.GetNumberOfItemsInGroup32(m_pManager, strGroupName);
}
[DllImport(DllFile32, EntryPoint = "GetNumberOfItemsInGroupN")]
@@ -791,8 +791,8 @@ namespace KeePass.DataExchange
if((uGroupId == 0) || (uGroupId == UInt32.MaxValue))
throw new ArgumentException("Invalid group ID!");
- if(m_bX64) return Kdb3Manager.GetNumberOfItemsInGroupN64(m_pManager, uGroupId);
- else return Kdb3Manager.GetNumberOfItemsInGroupN32(m_pManager, uGroupId);
+ if(m_bX64) return KdbManager.GetNumberOfItemsInGroupN64(m_pManager, uGroupId);
+ else return KdbManager.GetNumberOfItemsInGroupN32(m_pManager, uGroupId);
}
[DllImport(DllFile32, EntryPoint = "LockEntryPassword")]
@@ -815,23 +815,23 @@ namespace KeePass.DataExchange
/// an <c>ArgumentOutOfRangeException</c> is thrown.</param>
/// <returns>The requested entry. Note that any modifications to this
/// structure won't affect the internal data structures of the manager.</returns>
- public Kdb3Entry GetEntry(uint uIndex)
+ public KdbEntry GetEntry(uint uIndex)
{
Debug.Assert(uIndex < this.EntryCount);
IntPtr p;
- if(m_bX64) p = Kdb3Manager.GetEntry64(m_pManager, uIndex);
- else p = Kdb3Manager.GetEntry32(m_pManager, uIndex);
+ if(m_bX64) p = KdbManager.GetEntry64(m_pManager, uIndex);
+ else p = KdbManager.GetEntry32(m_pManager, uIndex);
if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException("uIndex");
- if(m_bX64) Kdb3Manager.UnlockEntryPassword64(m_pManager, p);
- else Kdb3Manager.UnlockEntryPassword32(m_pManager, p);
+ if(m_bX64) KdbManager.UnlockEntryPassword64(m_pManager, p);
+ else KdbManager.UnlockEntryPassword32(m_pManager, p);
- Kdb3Entry kdbEntry = (Kdb3Entry)Marshal.PtrToStructure(p, typeof(Kdb3Entry));
+ KdbEntry kdbEntry = (KdbEntry)Marshal.PtrToStructure(p, typeof(KdbEntry));
- if(m_bX64) Kdb3Manager.LockEntryPassword64(m_pManager, p);
- else Kdb3Manager.LockEntryPassword32(m_pManager, p);
+ if(m_bX64) KdbManager.LockEntryPassword64(m_pManager, p);
+ else KdbManager.LockEntryPassword32(m_pManager, p);
return kdbEntry;
}
@@ -848,7 +848,7 @@ namespace KeePass.DataExchange
/// <param name="uGroupId">ID of the group containing the entry.</param>
/// <returns>The requested entry. Note that any modifications to this
/// structure won't affect the internal data structures of the manager.</returns>
- public Kdb3Entry GetEntryByGroup(UInt32 uGroupId, UInt32 uIndex)
+ public KdbEntry GetEntryByGroup(UInt32 uGroupId, UInt32 uIndex)
{
Debug.Assert((uGroupId != 0) && (uGroupId != UInt32.MaxValue));
if((uGroupId == 0) || (uGroupId == UInt32.MaxValue))
@@ -862,13 +862,13 @@ namespace KeePass.DataExchange
if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException();
- if(m_bX64) Kdb3Manager.UnlockEntryPassword64(m_pManager, p);
- else Kdb3Manager.UnlockEntryPassword32(m_pManager, p);
+ if(m_bX64) KdbManager.UnlockEntryPassword64(m_pManager, p);
+ else KdbManager.UnlockEntryPassword32(m_pManager, p);
- Kdb3Entry kdbEntry = (Kdb3Entry)Marshal.PtrToStructure(p, typeof(Kdb3Entry));
+ KdbEntry kdbEntry = (KdbEntry)Marshal.PtrToStructure(p, typeof(KdbEntry));
- if(m_bX64) Kdb3Manager.LockEntryPassword64(m_pManager, p);
- else Kdb3Manager.LockEntryPassword32(m_pManager, p);
+ if(m_bX64) KdbManager.LockEntryPassword64(m_pManager, p);
+ else KdbManager.LockEntryPassword32(m_pManager, p);
return kdbEntry;
}
@@ -883,17 +883,17 @@ namespace KeePass.DataExchange
/// <param name="uIndex">Index of the group. Must be valid, otherwise an
/// <c>ArgumentOutOfRangeException</c> is thrown.</param>
/// <returns>Group structure.</returns>
- public Kdb3Group GetGroup(UInt32 uIndex)
+ public KdbGroup GetGroup(UInt32 uIndex)
{
Debug.Assert(uIndex < this.GroupCount);
IntPtr p;
- if(m_bX64) p = Kdb3Manager.GetGroup64(m_pManager, uIndex);
- else p = Kdb3Manager.GetGroup32(m_pManager, uIndex);
+ if(m_bX64) p = KdbManager.GetGroup64(m_pManager, uIndex);
+ else p = KdbManager.GetGroup32(m_pManager, uIndex);
if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException("uIndex");
- return (Kdb3Group)Marshal.PtrToStructure(p, typeof(Kdb3Group));
+ return (KdbGroup)Marshal.PtrToStructure(p, typeof(KdbGroup));
}
[DllImport(DllFile32, EntryPoint = "GetGroupById")]
@@ -905,19 +905,19 @@ namespace KeePass.DataExchange
/// </summary>
/// <param name="uGroupId">ID of the group.</param>
/// <returns>Group structure.</returns>
- public Kdb3Group GetGroupById(UInt32 uGroupId)
+ public KdbGroup GetGroupById(UInt32 uGroupId)
{
Debug.Assert((uGroupId != 0) && (uGroupId != UInt32.MaxValue));
if((uGroupId == 0) || (uGroupId == UInt32.MaxValue))
throw new ArgumentException("Invalid group ID!");
IntPtr p;
- if(m_bX64) p = Kdb3Manager.GetGroupById64(m_pManager, uGroupId);
- else p = Kdb3Manager.GetGroupById32(m_pManager, uGroupId);
+ if(m_bX64) p = KdbManager.GetGroupById64(m_pManager, uGroupId);
+ else p = KdbManager.GetGroupById32(m_pManager, uGroupId);
if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException("uGroupId");
- return (Kdb3Group)Marshal.PtrToStructure(p, typeof(Kdb3Group));
+ return (KdbGroup)Marshal.PtrToStructure(p, typeof(KdbGroup));
}
[DllImport(DllFile32, EntryPoint = "GetGroupByIdN")]
@@ -935,8 +935,8 @@ namespace KeePass.DataExchange
if((uGroupId == 0) || (uGroupId == UInt32.MaxValue))
throw new ArgumentException("Invalid group ID!");
- if(m_bX64) return Kdb3Manager.GetGroupByIdN64(m_pManager, uGroupId);
- else return Kdb3Manager.GetGroupByIdN32(m_pManager, uGroupId);
+ if(m_bX64) return KdbManager.GetGroupByIdN64(m_pManager, uGroupId);
+ else return KdbManager.GetGroupByIdN32(m_pManager, uGroupId);
}
[DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "OpenDatabase")]
@@ -944,20 +944,20 @@ namespace KeePass.DataExchange
[DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "OpenDatabase")]
private static extern Int32 OpenDatabase64(IntPtr pMgr, string pszFile, IntPtr pRepair);
/// <summary>
- /// Open a KDB3 database.
+ /// Open a KDB database.
/// </summary>
/// <param name="strFile">File path of the database.</param>
/// <param name="pRepairInfo">Pointer to a repair information structure. If
- /// you want to open a KDB3 file normally, set this parameter to
+ /// you want to open a Kdb file normally, set this parameter to
/// <c>IntPtr.Zero</c>.</param>
- /// <returns>Error code (see <c>Kdb3ErrorCode</c>).</returns>
- public Kdb3ErrorCode OpenDatabase(string strFile, IntPtr pRepairInfo)
+ /// <returns>Error code (see <c>KdbErrorCode</c>).</returns>
+ public KdbErrorCode OpenDatabase(string strFile, IntPtr pRepairInfo)
{
Debug.Assert(strFile != null);
if(strFile == null) throw new ArgumentNullException("strFile");
- if(m_bX64) return (Kdb3ErrorCode)Kdb3Manager.OpenDatabase64(m_pManager, strFile, pRepairInfo);
- else return (Kdb3ErrorCode)Kdb3Manager.OpenDatabase32(m_pManager, strFile, pRepairInfo);
+ if(m_bX64) return (KdbErrorCode)KdbManager.OpenDatabase64(m_pManager, strFile, pRepairInfo);
+ else return (KdbErrorCode)KdbManager.OpenDatabase32(m_pManager, strFile, pRepairInfo);
}
[DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "SaveDatabase")]
@@ -965,17 +965,17 @@ namespace KeePass.DataExchange
[DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "SaveDatabase")]
private static extern Int32 SaveDatabase64(IntPtr pMgr, string pszFile);
/// <summary>
- /// Save the current contents of the manager to a KDB3 file on disk.
+ /// Save the current contents of the manager to a KDB file on disk.
/// </summary>
/// <param name="strFile">File to create.</param>
- /// <returns>Error code (see <c>Kdb3ErrorCode</c>).</returns>
- public Kdb3ErrorCode SaveDatabase(string strFile)
+ /// <returns>Error code (see <c>KdbErrorCode</c>).</returns>
+ public KdbErrorCode SaveDatabase(string strFile)
{
Debug.Assert(strFile != null);
if(strFile == null) throw new ArgumentNullException("strFile");
- if(m_bX64) return (Kdb3ErrorCode)Kdb3Manager.SaveDatabase64(m_pManager, strFile);
- else return (Kdb3ErrorCode)Kdb3Manager.SaveDatabase32(m_pManager, strFile);
+ if(m_bX64) return (KdbErrorCode)KdbManager.SaveDatabase64(m_pManager, strFile);
+ else return (KdbErrorCode)KdbManager.SaveDatabase32(m_pManager, strFile);
}
/// <summary>
@@ -983,8 +983,8 @@ namespace KeePass.DataExchange
/// </summary>
public void NewDatabase()
{
- if(m_bX64) Kdb3Manager.NewDatabase64(m_pManager);
- else Kdb3Manager.NewDatabase32(m_pManager);
+ if(m_bX64) KdbManager.NewDatabase64(m_pManager);
+ else KdbManager.NewDatabase32(m_pManager);
}
/// <summary>
@@ -993,44 +993,44 @@ namespace KeePass.DataExchange
/// <returns><c>DateTime</c> object.</returns>
public static DateTime GetNeverExpireTime()
{
- return Kdb3Time.NeverExpireTime.ToDateTime();
+ return KdbTime.NeverExpireTime.ToDateTime();
}
[DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "AddGroup")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool AddGroup32(IntPtr pMgr, ref Kdb3Group pTemplate);
+ private static extern bool AddGroup32(IntPtr pMgr, ref KdbGroup pTemplate);
[DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "AddGroup")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool AddGroup64(IntPtr pMgr, ref Kdb3Group pTemplate);
+ private static extern bool AddGroup64(IntPtr pMgr, ref KdbGroup pTemplate);
/// <summary>
/// Add a new password group.
/// </summary>
/// <param name="pNewGroup">Template containing new group information.</param>
/// <returns>Returns <c>true</c> if the group was created successfully.</returns>
- public bool AddGroup(ref Kdb3Group pNewGroup)
+ public bool AddGroup(ref KdbGroup pNewGroup)
{
- if(m_bX64) return Kdb3Manager.AddGroup64(m_pManager, ref pNewGroup);
- else return Kdb3Manager.AddGroup32(m_pManager, ref pNewGroup);
+ if(m_bX64) return KdbManager.AddGroup64(m_pManager, ref pNewGroup);
+ else return KdbManager.AddGroup32(m_pManager, ref pNewGroup);
}
[DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "SetGroup")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool SetGroup32(IntPtr pMgr, UInt32 dwIndex, ref Kdb3Group pTemplate);
+ private static extern bool SetGroup32(IntPtr pMgr, UInt32 dwIndex, ref KdbGroup pTemplate);
[DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "SetGroup")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool SetGroup64(IntPtr pMgr, UInt32 dwIndex, ref Kdb3Group pTemplate);
+ private static extern bool SetGroup64(IntPtr pMgr, UInt32 dwIndex, ref KdbGroup pTemplate);
/// <summary>
/// Set/change a password group.
/// </summary>
/// <param name="uIndex">Index of the group to be changed.</param>
/// <param name="pNewGroup">Template containing new group information.</param>
/// <returns>Returns <c>true</c> if the group was created successfully.</returns>
- public bool SetGroup(UInt32 uIndex, ref Kdb3Group pNewGroup)
+ public bool SetGroup(UInt32 uIndex, ref KdbGroup pNewGroup)
{
Debug.Assert(uIndex < this.GroupCount);
- if(m_bX64) return Kdb3Manager.SetGroup64(m_pManager, uIndex, ref pNewGroup);
- else return Kdb3Manager.SetGroup32(m_pManager, uIndex, ref pNewGroup);
+ if(m_bX64) return KdbManager.SetGroup64(m_pManager, uIndex, ref pNewGroup);
+ else return KdbManager.SetGroup32(m_pManager, uIndex, ref pNewGroup);
}
[DllImport(DllFile32, EntryPoint = "DeleteGroupById")]
@@ -1050,45 +1050,45 @@ namespace KeePass.DataExchange
if((uGroupID == 0) || (uGroupID == UInt32.MaxValue))
throw new ArgumentException("Invalid group ID!");
- if(m_bX64) return Kdb3Manager.DeleteGroupById64(m_pManager, uGroupID);
- else return Kdb3Manager.DeleteGroupById32(m_pManager, uGroupID);
+ if(m_bX64) return KdbManager.DeleteGroupById64(m_pManager, uGroupID);
+ else return KdbManager.DeleteGroupById32(m_pManager, uGroupID);
}
[DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "AddEntry")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool AddEntry32(IntPtr pMgr, ref Kdb3Entry pTemplate);
+ private static extern bool AddEntry32(IntPtr pMgr, ref KdbEntry pTemplate);
[DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "AddEntry")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool AddEntry64(IntPtr pMgr, ref Kdb3Entry pTemplate);
+ private static extern bool AddEntry64(IntPtr pMgr, ref KdbEntry pTemplate);
/// <summary>
/// Add a new password entry.
/// </summary>
/// <param name="peNew">Template containing new entry information.</param>
/// <returns>Returns <c>true</c> if the entry was created successfully.</returns>
- public bool AddEntry(ref Kdb3Entry peNew)
+ public bool AddEntry(ref KdbEntry peNew)
{
- if(m_bX64) return Kdb3Manager.AddEntry64(m_pManager, ref peNew);
- else return Kdb3Manager.AddEntry32(m_pManager, ref peNew);
+ if(m_bX64) return KdbManager.AddEntry64(m_pManager, ref peNew);
+ else return KdbManager.AddEntry32(m_pManager, ref peNew);
}
[DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "SetEntry")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool SetEntry32(IntPtr pMgr, UInt32 dwIndex, ref Kdb3Entry pTemplate);
+ private static extern bool SetEntry32(IntPtr pMgr, UInt32 dwIndex, ref KdbEntry pTemplate);
[DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "SetEntry")]
[return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool SetEntry64(IntPtr pMgr, UInt32 dwIndex, ref Kdb3Entry pTemplate);
+ private static extern bool SetEntry64(IntPtr pMgr, UInt32 dwIndex, ref KdbEntry pTemplate);
/// <summary>
/// Set/change a password entry.
/// </summary>
/// <param name="uIndex">Index of the entry to be changed.</param>
/// <param name="peNew">Template containing new entry information.</param>
/// <returns>Returns <c>true</c> if the entry was created successfully.</returns>
- public bool SetEntry(UInt32 uIndex, ref Kdb3Entry peNew)
+ public bool SetEntry(UInt32 uIndex, ref KdbEntry peNew)
{
Debug.Assert(uIndex < this.EntryCount);
- if(m_bX64) return Kdb3Manager.SetEntry64(m_pManager, uIndex, ref peNew);
- else return Kdb3Manager.SetEntry32(m_pManager, uIndex, ref peNew);
+ if(m_bX64) return KdbManager.SetEntry64(m_pManager, uIndex, ref peNew);
+ else return KdbManager.SetEntry32(m_pManager, uIndex, ref peNew);
}
[DllImport(DllFile32, EntryPoint = "DeleteEntry")]
@@ -1106,15 +1106,15 @@ namespace KeePass.DataExchange
{
Debug.Assert(uIndex < this.EntryCount);
- if(m_bX64) return Kdb3Manager.DeleteEntry64(m_pManager, uIndex);
- else return Kdb3Manager.DeleteEntry32(m_pManager, uIndex);
+ if(m_bX64) return KdbManager.DeleteEntry64(m_pManager, uIndex);
+ else return KdbManager.DeleteEntry32(m_pManager, uIndex);
}
/// <summary>
/// Helper function to extract file attachments.
/// </summary>
/// <param name="pMemory">Native memory pointer (as stored in the
- /// <c>BinaryData</c> member of <c>Kdb3Entry</c>.</param>
+ /// <c>BinaryData</c> member of <c>KdbEntry</c>.</param>
/// <param name="uSize">Size in bytes of the memory block.</param>
/// <returns>Managed byte array.</returns>
public static byte[] ReadBinary(IntPtr pMemory, uint uSize)
diff --git a/KeePass/Ecas/EcasTriggerSystem.cs b/KeePass/Ecas/EcasTriggerSystem.cs
index 730fba9..8ce1f44 100644
--- a/KeePass/Ecas/EcasTriggerSystem.cs
+++ b/KeePass/Ecas/EcasTriggerSystem.cs
@@ -149,9 +149,8 @@ namespace KeePass.Ecas
}
catch(Exception ex)
{
- if(VistaTaskDialog.ShowMessageBox(ex.Message, KPRes.TriggerExecutionFailed,
- PwDefs.ShortProductName, VtdIcon.Warning,
- Program.GetSafeMainWindowHandle()) == false)
+ if(!VistaTaskDialog.ShowMessageBox(ex.Message, KPRes.TriggerExecutionFailed,
+ PwDefs.ShortProductName, VtdIcon.Warning, null))
{
MessageService.ShowWarning(KPRes.TriggerExecutionFailed + ".", ex);
}
diff --git a/KeePass/Forms/AboutForm.cs b/KeePass/Forms/AboutForm.cs
index 67ba82f..8a04c87 100644
--- a/KeePass/Forms/AboutForm.cs
+++ b/KeePass/Forms/AboutForm.cs
@@ -84,14 +84,14 @@ namespace KeePass.Forms
private void GetAppComponents()
{
ListViewItem lvi = new ListViewItem(KPRes.KeePassLibCLong);
- if(!Kdb3File.IsLibraryInstalled())
+ if(!KdbFile.IsLibraryInstalled())
lvi.SubItems.Add(KPRes.NotInstalled);
- else lvi.SubItems.Add(Kdb3Manager.KeePassVersionString + " (0x" +
- Kdb3Manager.LibraryBuild.ToString("X4") + ")");
+ else lvi.SubItems.Add(KdbManager.KeePassVersionString + " (0x" +
+ KdbManager.LibraryBuild.ToString("X4") + ")");
m_lvComponents.Items.Add(lvi);
- lvi = new ListViewItem(KPRes.XslStylesheets);
+ lvi = new ListViewItem(KPRes.XslStylesheetsKdbx);
string strPath = WinUtil.GetExecutable();
strPath = UrlUtil.GetFileDirectory(strPath, true, false);
strPath += AppDefs.XslFilesDir;
diff --git a/KeePass/Forms/CsvImportForm.cs b/KeePass/Forms/CsvImportForm.cs
index e73ff20..4cb16d6 100644
--- a/KeePass/Forms/CsvImportForm.cs
+++ b/KeePass/Forms/CsvImportForm.cs
@@ -169,7 +169,7 @@ namespace KeePass.Forms
UpdateTextPreview();
UpdateImportPreview();
- GuessFieldTypes();
+ GuessCsvStructure();
ProcessResize();
EnableControlsEx();
@@ -483,7 +483,7 @@ namespace KeePass.Forms
if(bCreatePreview) m_lvImportPreview.BeginUpdate();
DateTime dtNow = DateTime.Now;
- DateTime dtNoExpire = Kdb3Time.NeverExpireTime.ToDateTime();
+ DateTime dtNoExpire = KdbTime.NeverExpireTime.ToDateTime();
bool bIgnoreFirstRow = m_cbIgnoreFirst.Checked;
bool bIsFirstRow = true;
@@ -663,24 +663,30 @@ namespace KeePass.Forms
EnableControlsEx();
}
- private void GuessFieldTypes()
+ private void GuessCsvStructure()
+ {
+ bool bFieldsGuessed = GuessFieldTypes();
+ m_cbIgnoreFirst.Checked = bFieldsGuessed;
+ }
+
+ private bool GuessFieldTypes()
{
CsvOptions opt = GetCsvOptions();
- if(opt == null) { Debug.Assert(false); return; }
+ if(opt == null) { Debug.Assert(false); return false; }
- string str = GetDecodedText();
- CsvStreamReaderEx csv = new CsvStreamReaderEx(str, opt);
+ string strData = GetDecodedText();
+ CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt);
string[] v;
while(true)
{
v = csv.ReadLine();
- if(v == null) return;
+ if(v == null) return false;
if(v.Length == 0) continue;
if((v.Length == 1) && (v[0].Length == 0)) continue;
break;
}
- if(v.Length <= 3) return;
+ if(v.Length <= 3) return false;
CsvFieldInfo[] vFields = new CsvFieldInfo[v.Length];
int nDetermined = 0;
@@ -695,11 +701,13 @@ namespace KeePass.Forms
// Accept the guesses only if at least half of them are
// probably correct
- if(nDetermined < (v.Length + 1) / 2) return;
+ if(nDetermined < (v.Length + 1) / 2) return false;
m_lvFields.Items.Clear();
foreach(CsvFieldInfo fi in vFields)
AddCsvField(fi.Type, fi.Name, fi.Format);
+
+ return true;
}
private static CsvFieldInfo GuessFieldType(string strRawName)
diff --git a/KeePass/Forms/DataEditorForm.Designer.cs b/KeePass/Forms/DataEditorForm.Designer.cs
index 0706c14..8f44c2a 100644
--- a/KeePass/Forms/DataEditorForm.Designer.cs
+++ b/KeePass/Forms/DataEditorForm.Designer.cs
@@ -29,7 +29,6 @@
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DataEditorForm));
- this.m_rtbText = new KeePass.UI.CustomRichTextBoxEx();
this.m_menuMain = new System.Windows.Forms.MenuStrip();
this.m_menuFile = new System.Windows.Forms.ToolStripMenuItem();
this.m_menuFileSave = new System.Windows.Forms.ToolStripMenuItem();
@@ -65,25 +64,15 @@
this.m_tbAlignRight = new System.Windows.Forms.ToolStripButton();
this.m_statusMain = new System.Windows.Forms.StatusStrip();
this.m_tssStatusMain = new System.Windows.Forms.ToolStripStatusLabel();
+ this.m_tbFileSep2 = new System.Windows.Forms.ToolStripSeparator();
+ this.m_tbFind = new System.Windows.Forms.ToolStripTextBox();
+ this.m_rtbText = new KeePass.UI.CustomRichTextBoxEx();
this.m_menuMain.SuspendLayout();
this.m_toolFile.SuspendLayout();
this.m_toolFormat.SuspendLayout();
this.m_statusMain.SuspendLayout();
this.SuspendLayout();
//
- // m_rtbText
- //
- this.m_rtbText.AcceptsTab = true;
- this.m_rtbText.HideSelection = false;
- this.m_rtbText.Location = new System.Drawing.Point(25, 102);
- this.m_rtbText.Name = "m_rtbText";
- this.m_rtbText.Size = new System.Drawing.Size(100, 96);
- this.m_rtbText.TabIndex = 0;
- this.m_rtbText.Text = "";
- this.m_rtbText.SelectionChanged += new System.EventHandler(this.OnTextSelectionChanged);
- this.m_rtbText.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnTextLinkClicked);
- this.m_rtbText.TextChanged += new System.EventHandler(this.OnTextTextChanged);
- //
// m_menuMain
//
this.m_menuMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -108,20 +97,20 @@
//
this.m_menuFileSave.Image = global::KeePass.Properties.Resources.B16x16_FileSave;
this.m_menuFileSave.Name = "m_menuFileSave";
- this.m_menuFileSave.Size = new System.Drawing.Size(152, 22);
+ this.m_menuFileSave.Size = new System.Drawing.Size(105, 22);
this.m_menuFileSave.Text = "&Save";
this.m_menuFileSave.Click += new System.EventHandler(this.OnFileSave);
//
// m_menuFileSep0
//
this.m_menuFileSep0.Name = "m_menuFileSep0";
- this.m_menuFileSep0.Size = new System.Drawing.Size(149, 6);
+ this.m_menuFileSep0.Size = new System.Drawing.Size(102, 6);
//
// m_menuFileExit
//
this.m_menuFileExit.Image = global::KeePass.Properties.Resources.B16x16_Exit;
this.m_menuFileExit.Name = "m_menuFileExit";
- this.m_menuFileExit.Size = new System.Drawing.Size(152, 22);
+ this.m_menuFileExit.Size = new System.Drawing.Size(105, 22);
this.m_menuFileExit.Text = "&Close";
this.m_menuFileExit.Click += new System.EventHandler(this.OnFileExit);
//
@@ -164,7 +153,9 @@
this.m_tbEditPaste,
this.m_tbFileSep1,
this.m_tbEditUndo,
- this.m_tbEditRedo});
+ this.m_tbEditRedo,
+ this.m_tbFileSep2,
+ this.m_tbFind});
this.m_toolFile.Location = new System.Drawing.Point(0, 24);
this.m_toolFile.Name = "m_toolFile";
this.m_toolFile.Size = new System.Drawing.Size(608, 25);
@@ -382,6 +373,32 @@
this.m_tssStatusMain.Spring = true;
this.m_tssStatusMain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
+ // m_tbFileSep2
+ //
+ this.m_tbFileSep2.Name = "m_tbFileSep2";
+ this.m_tbFileSep2.Size = new System.Drawing.Size(6, 25);
+ //
+ // m_tbFind
+ //
+ this.m_tbFind.AcceptsReturn = true;
+ this.m_tbFind.Name = "m_tbFind";
+ this.m_tbFind.Size = new System.Drawing.Size(121, 25);
+ this.m_tbFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnTextFindKeyDown);
+ this.m_tbFind.KeyUp += new System.Windows.Forms.KeyEventHandler(this.OnTextFindKeyUp);
+ //
+ // m_rtbText
+ //
+ this.m_rtbText.AcceptsTab = true;
+ this.m_rtbText.HideSelection = false;
+ this.m_rtbText.Location = new System.Drawing.Point(25, 102);
+ this.m_rtbText.Name = "m_rtbText";
+ this.m_rtbText.Size = new System.Drawing.Size(100, 96);
+ this.m_rtbText.TabIndex = 0;
+ this.m_rtbText.Text = "";
+ this.m_rtbText.SelectionChanged += new System.EventHandler(this.OnTextSelectionChanged);
+ this.m_rtbText.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnTextLinkClicked);
+ this.m_rtbText.TextChanged += new System.EventHandler(this.OnTextTextChanged);
+ //
// DataEditorForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -451,5 +468,7 @@
private System.Windows.Forms.ToolStripSeparator m_menuViewSep0;
private System.Windows.Forms.ToolStripMenuItem m_menuViewWordWrap;
private System.Windows.Forms.ToolStripStatusLabel m_tssStatusMain;
+ private System.Windows.Forms.ToolStripSeparator m_tbFileSep2;
+ private System.Windows.Forms.ToolStripTextBox m_tbFind;
}
}
\ No newline at end of file
diff --git a/KeePass/Forms/DataEditorForm.cs b/KeePass/Forms/DataEditorForm.cs
index a2f880f..6e191ad 100644
--- a/KeePass/Forms/DataEditorForm.cs
+++ b/KeePass/Forms/DataEditorForm.cs
@@ -132,6 +132,10 @@ namespace KeePass.Forms
UIUtil.ConfigureTbButton(m_tbAlignLeft, KPRes.AlignLeft, null);
UIUtil.ConfigureTbButton(m_tbAlignRight, KPRes.AlignRight, null);
+ string strSearchTr = ((WinUtil.IsAtLeastWindowsVista ?
+ string.Empty : " ") + KPRes.Search);
+ UIUtil.SetCueBanner(m_tbFind, strSearchTr);
+
UIUtil.EnableAutoCompletion(m_tbFontCombo, true);
UIUtil.EnableAutoCompletion(m_tbFontSizeCombo, true);
@@ -561,5 +565,38 @@ namespace KeePass.Forms
return pbData;
}
+
+ private void OnTextFindKeyDown(object sender, KeyEventArgs e)
+ {
+ if((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
+ {
+ e.SuppressKeyPress = true;
+ e.Handled = true;
+
+ OnTextFind();
+ }
+ }
+
+ private void OnTextFindKeyUp(object sender, KeyEventArgs e)
+ {
+ if((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
+ {
+ e.SuppressKeyPress = true;
+ e.Handled = true;
+ }
+ }
+
+ private void OnTextFind()
+ {
+ string strNeedle = m_tbFind.Text;
+ if(string.IsNullOrEmpty(strNeedle)) return;
+
+ int iStart = m_rtbText.SelectionStart + m_rtbText.SelectionLength;
+ if(iStart < 0) { Debug.Assert(false); iStart = 0; }
+ if(iStart >= m_rtbText.TextLength) iStart = 0;
+
+ int p = m_rtbText.Find(strNeedle, iStart, -1, RichTextBoxFinds.None);
+ if(p < 0) m_rtbText.Find(strNeedle, 0, -1, RichTextBoxFinds.None);
+ }
}
}
diff --git a/KeePass/Forms/DataViewerForm.cs b/KeePass/Forms/DataViewerForm.cs
index e95ab06..56b2940 100644
--- a/KeePass/Forms/DataViewerForm.cs
+++ b/KeePass/Forms/DataViewerForm.cs
@@ -198,7 +198,7 @@ namespace KeePass.Forms
}
else if(strViewer == KPRes.ImageViewer)
{
- if(m_img == null) m_img = UIUtil.LoadImage(m_pbData);
+ if(m_img == null) m_img = GfxUtil.LoadImage(m_pbData);
// m_picBox.Image = m_img;
m_pnlImageViewer.Visible = true;
diff --git a/KeePass/Forms/DatabaseSettingsForm.cs b/KeePass/Forms/DatabaseSettingsForm.cs
index a890b26..4a809b0 100644
--- a/KeePass/Forms/DatabaseSettingsForm.cs
+++ b/KeePass/Forms/DatabaseSettingsForm.cs
@@ -35,6 +35,7 @@ using KeePassLib.Delegates;
using KeePassLib.Cryptography.Cipher;
using KeePassLib.Keys;
using KeePassLib.Security;
+using KeePassLib.Utility;
namespace KeePass.Forms
{
@@ -98,7 +99,7 @@ namespace KeePass.Forms
else this.Text = KPRes.DatabaseSettings;
m_tbDbName.Text = m_pwDatabase.Name;
- m_tbDbDesc.Text = m_pwDatabase.Description;
+ UIUtil.SetMultilineText(m_tbDbDesc, m_pwDatabase.Description);
m_tbDefaultUser.Text = m_pwDatabase.DefaultUserName;
m_clr = m_pwDatabase.Color;
@@ -219,9 +220,12 @@ namespace KeePass.Forms
m_pwDatabase.NameChanged = DateTime.Now;
}
- if(!m_tbDbDesc.Text.Equals(m_pwDatabase.Description))
+ string strNew = m_tbDbDesc.Text;
+ string strOrgFlt = StrUtil.NormalizeNewLines(m_pwDatabase.Description, false);
+ string strNewFlt = StrUtil.NormalizeNewLines(strNew, false);
+ if(!strNewFlt.Equals(strOrgFlt))
{
- m_pwDatabase.Description = m_tbDbDesc.Text;
+ m_pwDatabase.Description = strNew;
m_pwDatabase.DescriptionChanged = DateTime.Now;
}
diff --git a/KeePass/Forms/EcasTriggerForm.cs b/KeePass/Forms/EcasTriggerForm.cs
index cc2dd6f..98cc3fd 100644
--- a/KeePass/Forms/EcasTriggerForm.cs
+++ b/KeePass/Forms/EcasTriggerForm.cs
@@ -82,7 +82,7 @@ namespace KeePass.Forms
m_lvActions.Columns.Add(string.Empty, nColWidth);
m_tbName.Text = m_trigger.Name;
- m_tbComments.Text = StrUtil.NormalizeNewLines(m_trigger.Comments, true);
+ UIUtil.SetMultilineText(m_tbComments, m_trigger.Comments);
m_cbEnabled.Checked = m_trigger.Enabled;
m_cbInitiallyOn.Checked = m_trigger.InitiallyOn;
m_cbTurnOffAfterAction.Checked = m_trigger.TurnOffAfterAction;
diff --git a/KeePass/Forms/EditAutoTypeItemForm.cs b/KeePass/Forms/EditAutoTypeItemForm.cs
index 453e5fd..53320a0 100644
--- a/KeePass/Forms/EditAutoTypeItemForm.cs
+++ b/KeePass/Forms/EditAutoTypeItemForm.cs
@@ -162,7 +162,9 @@ namespace KeePass.Forms
};
string[] vSpecialPlaceholders = new string[] {
- "GROUP", "GROUPPATH", "PASSWORD_ENC", "URL:RMVSCM",
+ "GROUP", "GROUPPATH", "PASSWORD_ENC",
+ "URL:RMVSCM", "URL:SCM", "URL:HOST", "URL:PORT", "URL:PATH",
+ "URL:QUERY",
"C:Comment", VkcBreak,
"DELAY 1000", "DELAY=200", "VKEY 65",
"PICKCHARS", "PICKCHARS:Password:C=3",
diff --git a/KeePass/Forms/EntropyForm.Designer.cs b/KeePass/Forms/EntropyForm.Designer.cs
index 42c0f7b..4b74ef3 100644
--- a/KeePass/Forms/EntropyForm.Designer.cs
+++ b/KeePass/Forms/EntropyForm.Designer.cs
@@ -33,7 +33,6 @@
this.m_picRandom = new System.Windows.Forms.PictureBox();
this.m_lblHint = new System.Windows.Forms.Label();
this.m_lblGeneratedHint = new System.Windows.Forms.Label();
- this.m_pbGenerated = new KeePass.UI.QualityProgressBar();
this.m_lblStatus = new System.Windows.Forms.Label();
this.m_bannerImage = new System.Windows.Forms.PictureBox();
this.m_grpMouse = new System.Windows.Forms.GroupBox();
@@ -41,6 +40,7 @@
this.m_lblKeysDesc = new System.Windows.Forms.Label();
this.m_lblKeysIntro = new System.Windows.Forms.Label();
this.m_tbEdit = new System.Windows.Forms.TextBox();
+ this.m_pbGenerated = new KeePass.UI.QualityProgressBar();
((System.ComponentModel.ISupportInitialize)(this.m_picRandom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit();
this.m_grpMouse.SuspendLayout();
@@ -50,7 +50,7 @@
// m_btnOK
//
this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
- this.m_btnOK.Location = new System.Drawing.Point(462, 383);
+ this.m_btnOK.Location = new System.Drawing.Point(462, 388);
this.m_btnOK.Name = "m_btnOK";
this.m_btnOK.Size = new System.Drawing.Size(75, 23);
this.m_btnOK.TabIndex = 1;
@@ -61,7 +61,7 @@
// m_btnCancel
//
this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.m_btnCancel.Location = new System.Drawing.Point(543, 383);
+ this.m_btnCancel.Location = new System.Drawing.Point(543, 388);
this.m_btnCancel.Name = "m_btnCancel";
this.m_btnCancel.Size = new System.Drawing.Size(75, 23);
this.m_btnCancel.TabIndex = 2;
@@ -76,6 +76,7 @@
this.m_picRandom.Location = new System.Drawing.Point(9, 47);
this.m_picRandom.Name = "m_picRandom";
this.m_picRandom.Size = new System.Drawing.Size(286, 233);
+ this.m_picRandom.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.m_picRandom.TabIndex = 2;
this.m_picRandom.TabStop = false;
this.m_picRandom.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OnRandomMouseMove);
@@ -91,28 +92,16 @@
// m_lblGeneratedHint
//
this.m_lblGeneratedHint.AutoSize = true;
- this.m_lblGeneratedHint.Location = new System.Drawing.Point(6, 286);
+ this.m_lblGeneratedHint.Location = new System.Drawing.Point(6, 288);
this.m_lblGeneratedHint.Name = "m_lblGeneratedHint";
this.m_lblGeneratedHint.Size = new System.Drawing.Size(79, 13);
this.m_lblGeneratedHint.TabIndex = 1;
this.m_lblGeneratedHint.Text = "Generated bits:";
//
- // m_pbGenerated
- //
- this.m_pbGenerated.Location = new System.Drawing.Point(91, 286);
- this.m_pbGenerated.Maximum = 100;
- this.m_pbGenerated.Minimum = 0;
- this.m_pbGenerated.Name = "m_pbGenerated";
- this.m_pbGenerated.Size = new System.Drawing.Size(148, 13);
- this.m_pbGenerated.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
- this.m_pbGenerated.TabIndex = 2;
- this.m_pbGenerated.TabStop = false;
- this.m_pbGenerated.Value = 0;
- //
// m_lblStatus
//
this.m_lblStatus.AutoSize = true;
- this.m_lblStatus.Location = new System.Drawing.Point(245, 286);
+ this.m_lblStatus.Location = new System.Drawing.Point(245, 288);
this.m_lblStatus.Name = "m_lblStatus";
this.m_lblStatus.Size = new System.Drawing.Size(50, 13);
this.m_lblStatus.TabIndex = 3;
@@ -137,7 +126,7 @@
this.m_grpMouse.Controls.Add(this.m_lblStatus);
this.m_grpMouse.Location = new System.Drawing.Point(12, 66);
this.m_grpMouse.Name = "m_grpMouse";
- this.m_grpMouse.Size = new System.Drawing.Size(301, 311);
+ this.m_grpMouse.Size = new System.Drawing.Size(302, 316);
this.m_grpMouse.TabIndex = 3;
this.m_grpMouse.TabStop = false;
this.m_grpMouse.Text = "Random mouse input";
@@ -147,9 +136,9 @@
this.m_grpKeyboard.Controls.Add(this.m_lblKeysDesc);
this.m_grpKeyboard.Controls.Add(this.m_lblKeysIntro);
this.m_grpKeyboard.Controls.Add(this.m_tbEdit);
- this.m_grpKeyboard.Location = new System.Drawing.Point(319, 66);
+ this.m_grpKeyboard.Location = new System.Drawing.Point(320, 66);
this.m_grpKeyboard.Name = "m_grpKeyboard";
- this.m_grpKeyboard.Size = new System.Drawing.Size(299, 311);
+ this.m_grpKeyboard.Size = new System.Drawing.Size(298, 316);
this.m_grpKeyboard.TabIndex = 0;
this.m_grpKeyboard.TabStop = false;
this.m_grpKeyboard.Text = "Random keyboard input";
@@ -158,7 +147,7 @@
//
this.m_lblKeysDesc.Location = new System.Drawing.Point(6, 254);
this.m_lblKeysDesc.Name = "m_lblKeysDesc";
- this.m_lblKeysDesc.Size = new System.Drawing.Size(287, 54);
+ this.m_lblKeysDesc.Size = new System.Drawing.Size(286, 56);
this.m_lblKeysDesc.TabIndex = 2;
this.m_lblKeysDesc.Text = "Just hack some random keys into the box above. You do not need to remember them. " +
"They are only used as a random seed for a cryptographically strong random number" +
@@ -176,20 +165,32 @@
// m_tbEdit
//
this.m_tbEdit.AcceptsReturn = true;
- this.m_tbEdit.Location = new System.Drawing.Point(6, 47);
+ this.m_tbEdit.Location = new System.Drawing.Point(7, 47);
this.m_tbEdit.Multiline = true;
this.m_tbEdit.Name = "m_tbEdit";
this.m_tbEdit.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
- this.m_tbEdit.Size = new System.Drawing.Size(287, 204);
+ this.m_tbEdit.Size = new System.Drawing.Size(284, 204);
this.m_tbEdit.TabIndex = 0;
//
+ // m_pbGenerated
+ //
+ this.m_pbGenerated.Location = new System.Drawing.Point(91, 288);
+ this.m_pbGenerated.Maximum = 100;
+ this.m_pbGenerated.Minimum = 0;
+ this.m_pbGenerated.Name = "m_pbGenerated";
+ this.m_pbGenerated.Size = new System.Drawing.Size(148, 13);
+ this.m_pbGenerated.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+ this.m_pbGenerated.TabIndex = 2;
+ this.m_pbGenerated.TabStop = false;
+ this.m_pbGenerated.Value = 0;
+ //
// EntropyForm
//
this.AcceptButton = this.m_btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.m_btnCancel;
- this.ClientSize = new System.Drawing.Size(630, 418);
+ this.ClientSize = new System.Drawing.Size(630, 423);
this.Controls.Add(this.m_grpKeyboard);
this.Controls.Add(this.m_grpMouse);
this.Controls.Add(this.m_bannerImage);
diff --git a/KeePass/Forms/ExchangeDataForm.Designer.cs b/KeePass/Forms/ExchangeDataForm.Designer.cs
index 8dbed93..530787d 100644
--- a/KeePass/Forms/ExchangeDataForm.Designer.cs
+++ b/KeePass/Forms/ExchangeDataForm.Designer.cs
@@ -55,10 +55,10 @@
// m_btnOK
//
this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
- this.m_btnOK.Location = new System.Drawing.Point(210, 452);
+ this.m_btnOK.Location = new System.Drawing.Point(210, 449);
this.m_btnOK.Name = "m_btnOK";
this.m_btnOK.Size = new System.Drawing.Size(75, 23);
- this.m_btnOK.TabIndex = 1;
+ this.m_btnOK.TabIndex = 0;
this.m_btnOK.Text = "&OK";
this.m_btnOK.UseVisualStyleBackColor = true;
this.m_btnOK.Click += new System.EventHandler(this.OnBtnOK);
@@ -66,10 +66,10 @@
// m_btnCancel
//
this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.m_btnCancel.Location = new System.Drawing.Point(291, 452);
+ this.m_btnCancel.Location = new System.Drawing.Point(291, 449);
this.m_btnCancel.Name = "m_btnCancel";
this.m_btnCancel.Size = new System.Drawing.Size(75, 23);
- this.m_btnCancel.TabIndex = 2;
+ this.m_btnCancel.TabIndex = 1;
this.m_btnCancel.Text = "&Cancel";
this.m_btnCancel.UseVisualStyleBackColor = true;
this.m_btnCancel.Click += new System.EventHandler(this.OnBtnCancel);
@@ -77,10 +77,10 @@
// m_grpFormat
//
this.m_grpFormat.Controls.Add(this.m_lvFormats);
- this.m_grpFormat.Location = new System.Drawing.Point(12, 75);
+ this.m_grpFormat.Location = new System.Drawing.Point(12, 72);
this.m_grpFormat.Name = "m_grpFormat";
this.m_grpFormat.Size = new System.Drawing.Size(354, 297);
- this.m_grpFormat.TabIndex = 3;
+ this.m_grpFormat.TabIndex = 2;
this.m_grpFormat.TabStop = false;
this.m_grpFormat.Text = "Format";
//
@@ -93,7 +93,7 @@
this.m_lvFormats.MultiSelect = false;
this.m_lvFormats.Name = "m_lvFormats";
this.m_lvFormats.Size = new System.Drawing.Size(336, 268);
- this.m_lvFormats.TabIndex = 1;
+ this.m_lvFormats.TabIndex = 0;
this.m_lvFormats.UseCompatibleStateImageBehavior = false;
this.m_lvFormats.View = System.Windows.Forms.View.Details;
this.m_lvFormats.ItemActivate += new System.EventHandler(this.OnFormatsItemActivate);
@@ -105,10 +105,10 @@
this.m_grpFile.Controls.Add(this.m_btnSelFile);
this.m_grpFile.Controls.Add(this.m_tbFile);
this.m_grpFile.Controls.Add(this.m_lblFile);
- this.m_grpFile.Location = new System.Drawing.Point(12, 378);
+ this.m_grpFile.Location = new System.Drawing.Point(12, 375);
this.m_grpFile.Name = "m_grpFile";
this.m_grpFile.Size = new System.Drawing.Size(354, 68);
- this.m_grpFile.TabIndex = 4;
+ this.m_grpFile.TabIndex = 3;
this.m_grpFile.TabStop = false;
this.m_grpFile.Text = "File";
//
@@ -118,7 +118,7 @@
this.m_lnkFileFormats.Location = new System.Drawing.Point(110, 45);
this.m_lnkFileFormats.Name = "m_lnkFileFormats";
this.m_lnkFileFormats.Size = new System.Drawing.Size(182, 13);
- this.m_lnkFileFormats.TabIndex = 4;
+ this.m_lnkFileFormats.TabIndex = 3;
this.m_lnkFileFormats.TabStop = true;
this.m_lnkFileFormats.Text = "Help: Configuring source applications";
this.m_lnkFileFormats.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkFileFormats);
@@ -155,7 +155,7 @@
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.m_btnCancel;
- this.ClientSize = new System.Drawing.Size(378, 487);
+ this.ClientSize = new System.Drawing.Size(378, 484);
this.Controls.Add(this.m_grpFile);
this.Controls.Add(this.m_grpFormat);
this.Controls.Add(this.m_btnCancel);
diff --git a/KeePass/Forms/ExchangeDataForm.cs b/KeePass/Forms/ExchangeDataForm.cs
index 1b9fd84..b45d810 100644
--- a/KeePass/Forms/ExchangeDataForm.cs
+++ b/KeePass/Forms/ExchangeDataForm.cs
@@ -206,8 +206,9 @@ namespace KeePass.Forms
if(m_bExport == false) // Import
{
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.Import + ": " +
- strFormat, strFilter, 1, strPriExt, true, true);
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog(KPRes.Import +
+ ": " + strFormat, strFilter, 1, strPriExt, true,
+ AppDefs.FileDialogContext.Import);
if(ofd.ShowDialog() != DialogResult.OK) return;
@@ -229,8 +230,9 @@ namespace KeePass.Forms
}
else // Export
{
- SaveFileDialog sfd = UIUtil.CreateSaveFileDialog(KPRes.Export + ": " +
- strFormat, null, strFilter, 1, strPriExt, false);
+ SaveFileDialogEx sfd = UIUtil.CreateSaveFileDialog(KPRes.Export +
+ ": " + strFormat, null, strFilter, 1, strPriExt,
+ AppDefs.FileDialogContext.Export);
string strSuggestion;
if((m_pwDatabaseInfo != null) &&
diff --git a/KeePass/Forms/FileBrowserForm.cs b/KeePass/Forms/FileBrowserForm.cs
index c1a8be4..ab7c88b 100644
--- a/KeePass/Forms/FileBrowserForm.cs
+++ b/KeePass/Forms/FileBrowserForm.cs
@@ -31,6 +31,7 @@ using System.Diagnostics;
using KeePass.Native;
using KeePass.Resources;
using KeePass.UI;
+using KeePass.Util;
using KeePassLib;
using KeePassLib.Utility;
@@ -42,6 +43,7 @@ namespace KeePass.Forms
private bool m_bSaveMode = false;
private string m_strTitle = PwDefs.ShortProductName;
private string m_strHint = string.Empty;
+ private string m_strContext = null;
private ImageList m_ilFolders = null;
private List<Image> m_vFolderImages = new List<Image>();
@@ -76,11 +78,13 @@ namespace KeePass.Forms
get { return m_strSelectedFile; }
}
- public void InitEx(bool bSaveMode, string strTitle, string strHint)
+ public void InitEx(bool bSaveMode, string strTitle, string strHint,
+ string strContext)
{
m_bSaveMode = bSaveMode;
if(strTitle != null) m_strTitle = strTitle;
if(strHint != null) m_strHint = strHint;
+ m_strContext = strContext;
}
public FileBrowserForm()
@@ -117,7 +121,11 @@ namespace KeePass.Forms
m_lvFiles.Columns.Add(KPRes.Size, nWidth / 4, HorizontalAlignment.Right);
InitialPopulateFolders();
- BrowseToFolder(Environment.CurrentDirectory);
+
+ string strWorkDir = Program.Config.Application.GetWorkingDirectory(m_strContext);
+ if(string.IsNullOrEmpty(strWorkDir))
+ strWorkDir = WinUtil.GetHomeDirectory();
+ BrowseToFolder(strWorkDir);
EnableControlsEx();
}
@@ -465,6 +473,10 @@ namespace KeePass.Forms
else if(File.Exists(str))
{
m_strSelectedFile = str;
+
+ Program.Config.Application.SetWorkingDirectory(m_strContext,
+ UrlUtil.GetFileDirectory(str, false, true));
+
return true;
}
else { Debug.Assert(false); }
diff --git a/KeePass/Forms/GroupForm.cs b/KeePass/Forms/GroupForm.cs
index 3a0f7b5..a79121c 100644
--- a/KeePass/Forms/GroupForm.cs
+++ b/KeePass/Forms/GroupForm.cs
@@ -77,7 +77,7 @@ namespace KeePass.Forms
m_pwCustomIconID = m_pwGroup.CustomIconUuid;
m_tbName.Text = m_pwGroup.Name;
- m_tbNotes.Text = m_pwGroup.Notes;
+ UIUtil.SetMultilineText(m_tbNotes, m_pwGroup.Notes);
if(m_pwCustomIconID != PwUuid.Zero)
UIUtil.SetButtonImage(m_btnIcon, m_pwDatabase.GetCustomIcon(
diff --git a/KeePass/Forms/IconPickerForm.cs b/KeePass/Forms/IconPickerForm.cs
index 50a0469..8052bc4 100644
--- a/KeePass/Forms/IconPickerForm.cs
+++ b/KeePass/Forms/IconPickerForm.cs
@@ -27,6 +27,7 @@ using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
+using KeePass.App;
using KeePass.Resources;
using KeePass.UI;
@@ -228,8 +229,8 @@ namespace KeePass.Forms
AddFileType(sbFilter, "*.wmf", "Windows Metafile (*.wmf)");
sbFilter.Append(@"|" + KPRes.AllFiles + @" (*.*)|*.*");
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.ImportFileTitle,
- sbFilter.ToString(), 1, null, true, true);
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog(KPRes.ImportFileTitle,
+ sbFilter.ToString(), 1, null, true, AppDefs.FileDialogContext.Import);
if(ofd.ShowDialog() == DialogResult.OK)
{
@@ -249,17 +250,23 @@ namespace KeePass.Forms
// Bitmap img = new Bitmap(strFile);
// Image img = Image.FromFile(strFile);
byte[] pb = File.ReadAllBytes(strFile);
-
+
// MemoryStream msSource = new MemoryStream(pb, false);
// Image img = Image.FromStream(msSource);
// msSource.Close();
- Image img = UIUtil.LoadImage(pb);
-
- Image imgNew = new Bitmap(img, new Size(16, 16));
-
+ Image img = GfxUtil.LoadImage(pb);
MemoryStream ms = new MemoryStream();
- imgNew.Save(ms, ImageFormat.Png);
+ if((img.Width == 16) && (img.Height == 16))
+ img.Save(ms, ImageFormat.Png);
+ else
+ {
+ // Image imgNew = new Bitmap(img, new Size(16, 16));
+ Bitmap imgSc = UIUtil.CreateScaledImage(img, 16, 16);
+ imgSc.Save(ms, ImageFormat.Png);
+ imgSc.Dispose();
+ }
+ img.Dispose();
PwCustomIcon pwci = new PwCustomIcon(new PwUuid(true),
ms.ToArray());
@@ -363,8 +370,9 @@ namespace KeePass.Forms
// AddFileType(sbFilter, "*.ico", "Windows Icon (*.ico)");
sbFilter.Append(@"|" + KPRes.AllFiles + @" (*.*)|*.*");
- SaveFileDialog sfd = UIUtil.CreateSaveFileDialog(KPRes.ExportFileTitle,
- KPRes.Export + ".png", sbFilter.ToString(), 1, null, true);
+ SaveFileDialogEx sfd = UIUtil.CreateSaveFileDialog(KPRes.ExportFileTitle,
+ KPRes.Export + ".png", sbFilter.ToString(), 1, null,
+ AppDefs.FileDialogContext.Export);
if(sfd.ShowDialog() == DialogResult.OK)
SaveImageFile(lvsic[0], sfd.FileName);
}
diff --git a/KeePass/Forms/KeyCreationForm.Designer.cs b/KeePass/Forms/KeyCreationForm.Designer.cs
index 819afb9..bdde0d5 100644
--- a/KeePass/Forms/KeyCreationForm.Designer.cs
+++ b/KeePass/Forms/KeyCreationForm.Designer.cs
@@ -54,7 +54,9 @@
this.m_bannerImage = new System.Windows.Forms.PictureBox();
this.m_cmbKeyFile = new System.Windows.Forms.ComboBox();
this.m_lblWindowsAccDesc2 = new System.Windows.Forms.Label();
+ this.m_picAccWarning = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.m_picAccWarning)).BeginInit();
this.SuspendLayout();
//
// m_lblIntro
@@ -284,12 +286,21 @@
//
// m_lblWindowsAccDesc2
//
- this.m_lblWindowsAccDesc2.Location = new System.Drawing.Point(28, 359);
+ this.m_lblWindowsAccDesc2.Location = new System.Drawing.Point(53, 359);
this.m_lblWindowsAccDesc2.Name = "m_lblWindowsAccDesc2";
- this.m_lblWindowsAccDesc2.Size = new System.Drawing.Size(476, 55);
+ this.m_lblWindowsAccDesc2.Size = new System.Drawing.Size(451, 55);
this.m_lblWindowsAccDesc2.TabIndex = 14;
this.m_lblWindowsAccDesc2.Text = resources.GetString("m_lblWindowsAccDesc2.Text");
//
+ // m_picAccWarning
+ //
+ this.m_picAccWarning.Location = new System.Drawing.Point(31, 359);
+ this.m_picAccWarning.Name = "m_picAccWarning";
+ this.m_picAccWarning.Size = new System.Drawing.Size(16, 16);
+ this.m_picAccWarning.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.m_picAccWarning.TabIndex = 22;
+ this.m_picAccWarning.TabStop = false;
+ //
// KeyCreationForm
//
this.AcceptButton = this.m_btnCreate;
@@ -297,6 +308,7 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.m_btnCancel;
this.ClientSize = new System.Drawing.Size(519, 464);
+ this.Controls.Add(this.m_picAccWarning);
this.Controls.Add(this.m_lblWindowsAccDesc2);
this.Controls.Add(this.m_cmbKeyFile);
this.Controls.Add(this.m_lblQualityBits);
@@ -332,6 +344,7 @@
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnFormClosing);
((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.m_picAccWarning)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -363,5 +376,6 @@
private System.Windows.Forms.Label m_lblQualityBits;
private System.Windows.Forms.ComboBox m_cmbKeyFile;
private System.Windows.Forms.Label m_lblWindowsAccDesc2;
+ private System.Windows.Forms.PictureBox m_picAccWarning;
}
}
\ No newline at end of file
diff --git a/KeePass/Forms/KeyCreationForm.cs b/KeePass/Forms/KeyCreationForm.cs
index acd5b4c..ef29feb 100644
--- a/KeePass/Forms/KeyCreationForm.cs
+++ b/KeePass/Forms/KeyCreationForm.cs
@@ -21,6 +21,8 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
@@ -48,6 +50,7 @@ namespace KeePass.Forms
private IOConnectionInfo m_ioInfo = new IOConnectionInfo();
private PwInputControlGroup m_icgPassword = new PwInputControlGroup();
+ private Image m_imgAccWarning = null;
public CompositeKey CompositeKey
{
@@ -85,6 +88,11 @@ namespace KeePass.Forms
FontUtil.AssignDefaultBold(m_cbKeyFile);
FontUtil.AssignDefaultBold(m_cbUserAccount);
+ Bitmap bmpBig = SystemIcons.Warning.ToBitmap();
+ m_imgAccWarning = UIUtil.CreateScaledImage(bmpBig, 16, 16);
+ bmpBig.Dispose();
+ m_picAccWarning.Image = m_imgAccWarning;
+
m_ttRect.SetToolTip(m_cbHidePassword, KPRes.TogglePasswordAsterisks);
m_ttRect.SetToolTip(m_btnSaveKeyFile, KPRes.KeyFileCreate);
m_ttRect.SetToolTip(m_btnOpenKeyFile, KPRes.KeyFileUseExisting);
@@ -128,6 +136,13 @@ namespace KeePass.Forms
private void CleanUpEx()
{
+ if(m_imgAccWarning != null)
+ {
+ m_picAccWarning.Image = null;
+ m_imgAccWarning.Dispose();
+ m_imgAccWarning = null;
+ }
+
m_icgPassword.Release();
}
@@ -276,10 +291,10 @@ namespace KeePass.Forms
private void OnClickKeyFileCreate(object sender, EventArgs e)
{
- SaveFileDialog sfd = UIUtil.CreateSaveFileDialog(KPRes.KeyFileCreate,
+ SaveFileDialogEx sfd = UIUtil.CreateSaveFileDialog(KPRes.KeyFileCreate,
UrlUtil.StripExtension(UrlUtil.GetFileName(m_ioInfo.Path)) + "." +
AppDefs.FileExtension.KeyFile, UIUtil.CreateFileTypeFilter("key",
- KPRes.KeyFiles, true), 1, "key", true);
+ KPRes.KeyFiles, true), 1, "key", AppDefs.FileDialogContext.KeyFile);
if(sfd.ShowDialog() == DialogResult.OK)
{
@@ -309,9 +324,9 @@ namespace KeePass.Forms
private void OnClickKeyFileBrowse(object sender, EventArgs e)
{
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.KeyFileUseExisting,
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog(KPRes.KeyFileUseExisting,
UIUtil.CreateFileTypeFilter("key", KPRes.KeyFiles, true), 2, null,
- false, true);
+ false, AppDefs.FileDialogContext.KeyFile);
if(ofd.ShowDialog() == DialogResult.OK)
{
diff --git a/KeePass/Forms/KeyPromptForm.cs b/KeePass/Forms/KeyPromptForm.cs
index 1510269..7a01a04 100644
--- a/KeePass/Forms/KeyPromptForm.cs
+++ b/KeePass/Forms/KeyPromptForm.cs
@@ -157,6 +157,17 @@ namespace KeePass.Forms
m_tbPassword.Text = StrUtil.DecryptString(str);
}
+ str = Program.CommandLineArgs[AppDefs.CommandLineOptions.PasswordStdIn];
+ if(str != null)
+ {
+ KcpPassword kcpPw = KeyUtil.ReadPasswordStdIn(true);
+ if(kcpPw != null)
+ {
+ m_cbPassword.Checked = true;
+ m_tbPassword.Text = kcpPw.Password.ReadString();
+ }
+ }
+
str = Program.CommandLineArgs[AppDefs.CommandLineOptions.KeyFile];
if(str != null)
{
@@ -417,7 +428,8 @@ namespace KeePass.Forms
if(m_bSecureDesktop)
{
FileBrowserForm dlg = new FileBrowserForm();
- dlg.InitEx(false, KPRes.KeyFileSelect, KPRes.SecDeskFileDialogHint);
+ dlg.InitEx(false, KPRes.KeyFileSelect, KPRes.SecDeskFileDialogHint,
+ AppDefs.FileDialogContext.KeyFile);
if(dlg.ShowDialog() == DialogResult.OK)
strFile = dlg.SelectedFile;
UIUtil.DestroyForm(dlg);
@@ -425,8 +437,8 @@ namespace KeePass.Forms
else
{
string strFilter = UIUtil.CreateFileTypeFilter("key", KPRes.KeyFiles, true);
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.KeyFileSelect,
- strFilter, 2, null, false, true);
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog(KPRes.KeyFileSelect,
+ strFilter, 2, null, false, AppDefs.FileDialogContext.KeyFile);
if(ofd.ShowDialog() == DialogResult.OK)
strFile = ofd.FileName;
diff --git a/KeePass/Forms/MainForm.Designer.cs b/KeePass/Forms/MainForm.Designer.cs
index ae47290..7a6f590 100644
--- a/KeePass/Forms/MainForm.Designer.cs
+++ b/KeePass/Forms/MainForm.Designer.cs
@@ -285,7 +285,7 @@
this.m_ctxGroupEmpty.Image = global::KeePass.Properties.Resources.B16x16_Trashcan_Full;
this.m_ctxGroupEmpty.Name = "m_ctxGroupEmpty";
this.m_ctxGroupEmpty.Size = new System.Drawing.Size(179, 22);
- this.m_ctxGroupEmpty.Text = "&Empty Recycle Bin";
+ this.m_ctxGroupEmpty.Text = "Empty Recycle &Bin";
this.m_ctxGroupEmpty.Click += new System.EventHandler(this.OnGroupsEmpty);
//
// m_ctxGroupSep1
@@ -319,7 +319,7 @@
this.m_ctxGroupExport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Outbox;
this.m_ctxGroupExport.Name = "m_ctxGroupExport";
this.m_ctxGroupExport.Size = new System.Drawing.Size(179, 22);
- this.m_ctxGroupExport.Text = "E&xport...";
+ this.m_ctxGroupExport.Text = "&Export...";
this.m_ctxGroupExport.Click += new System.EventHandler(this.OnGroupsExport);
//
// m_ctxGroupSep3
@@ -490,7 +490,7 @@
this.m_ctxEntryClipboard,
this.m_ctxEntryRearrangePopup});
this.m_ctxPwList.Name = "m_ctxPwList";
- this.m_ctxPwList.Size = new System.Drawing.Size(215, 352);
+ this.m_ctxPwList.Size = new System.Drawing.Size(215, 374);
this.m_ctxPwList.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxPwListOpening);
//
// m_ctxEntryCopyUserName
@@ -581,7 +581,7 @@
this.m_ctxEntryPerformAutoType.Image = global::KeePass.Properties.Resources.B16x16_KRec_Record;
this.m_ctxEntryPerformAutoType.Name = "m_ctxEntryPerformAutoType";
this.m_ctxEntryPerformAutoType.Size = new System.Drawing.Size(214, 22);
- this.m_ctxEntryPerformAutoType.Text = "&Perform Auto-Type";
+ this.m_ctxEntryPerformAutoType.Text = "Perform Auto-&Type";
this.m_ctxEntryPerformAutoType.Click += new System.EventHandler(this.OnEntryPerformAutoType);
//
// m_ctxEntrySep1
@@ -648,7 +648,7 @@
this.m_ctxEntryColorSep1,
this.m_ctxEntryColorCustom});
this.m_ctxEntrySetColor.Name = "m_ctxEntrySetColor";
- this.m_ctxEntrySetColor.Size = new System.Drawing.Size(144, 22);
+ this.m_ctxEntrySetColor.Size = new System.Drawing.Size(152, 22);
this.m_ctxEntrySetColor.Text = "Set &Color";
//
// m_ctxEntryColorStandard
@@ -707,21 +707,21 @@
//
this.m_ctxEntryMassSetIcon.Image = global::KeePass.Properties.Resources.B16x16_Spreadsheet;
this.m_ctxEntryMassSetIcon.Name = "m_ctxEntryMassSetIcon";
- this.m_ctxEntryMassSetIcon.Size = new System.Drawing.Size(144, 22);
+ this.m_ctxEntryMassSetIcon.Size = new System.Drawing.Size(152, 22);
this.m_ctxEntryMassSetIcon.Text = "Set &Icons...";
this.m_ctxEntryMassSetIcon.Click += new System.EventHandler(this.OnEntryMassSetIcon);
//
// m_ctxEntrySelectedSep0
//
this.m_ctxEntrySelectedSep0.Name = "m_ctxEntrySelectedSep0";
- this.m_ctxEntrySelectedSep0.Size = new System.Drawing.Size(141, 6);
+ this.m_ctxEntrySelectedSep0.Size = new System.Drawing.Size(149, 6);
//
// m_ctxEntrySelectedAddTag
//
this.m_ctxEntrySelectedAddTag.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.m_ctxEntrySelectedNewTag});
this.m_ctxEntrySelectedAddTag.Name = "m_ctxEntrySelectedAddTag";
- this.m_ctxEntrySelectedAddTag.Size = new System.Drawing.Size(144, 22);
+ this.m_ctxEntrySelectedAddTag.Size = new System.Drawing.Size(152, 22);
this.m_ctxEntrySelectedAddTag.Text = "Add &Tag";
this.m_ctxEntrySelectedAddTag.DropDownOpening += new System.EventHandler(this.OnEntrySelectedAddTagOpening);
//
@@ -736,20 +736,20 @@
// m_ctxEntrySelectedRemoveTag
//
this.m_ctxEntrySelectedRemoveTag.Name = "m_ctxEntrySelectedRemoveTag";
- this.m_ctxEntrySelectedRemoveTag.Size = new System.Drawing.Size(144, 22);
+ this.m_ctxEntrySelectedRemoveTag.Size = new System.Drawing.Size(152, 22);
this.m_ctxEntrySelectedRemoveTag.Text = "&Remove Tag";
this.m_ctxEntrySelectedRemoveTag.DropDownOpening += new System.EventHandler(this.OnEntrySelectedRemoveTagOpening);
//
// m_ctxEntrySelectedSep1
//
this.m_ctxEntrySelectedSep1.Name = "m_ctxEntrySelectedSep1";
- this.m_ctxEntrySelectedSep1.Size = new System.Drawing.Size(141, 6);
+ this.m_ctxEntrySelectedSep1.Size = new System.Drawing.Size(149, 6);
//
// m_ctxEntrySelectedPrint
//
this.m_ctxEntrySelectedPrint.Image = global::KeePass.Properties.Resources.B16x16_FilePrint;
this.m_ctxEntrySelectedPrint.Name = "m_ctxEntrySelectedPrint";
- this.m_ctxEntrySelectedPrint.Size = new System.Drawing.Size(144, 22);
+ this.m_ctxEntrySelectedPrint.Size = new System.Drawing.Size(152, 22);
this.m_ctxEntrySelectedPrint.Text = "&Print...";
this.m_ctxEntrySelectedPrint.Click += new System.EventHandler(this.OnEntrySelectedPrint);
//
@@ -757,8 +757,8 @@
//
this.m_ctxEntrySelectedExport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Outbox;
this.m_ctxEntrySelectedExport.Name = "m_ctxEntrySelectedExport";
- this.m_ctxEntrySelectedExport.Size = new System.Drawing.Size(144, 22);
- this.m_ctxEntrySelectedExport.Text = "E&xport...";
+ this.m_ctxEntrySelectedExport.Size = new System.Drawing.Size(152, 22);
+ this.m_ctxEntrySelectedExport.Text = "&Export...";
this.m_ctxEntrySelectedExport.Click += new System.EventHandler(this.OnEntrySelectedExport);
//
// m_ctxEntrySelectAll
@@ -903,7 +903,7 @@
this.m_menuFileOpenLocal.Image = global::KeePass.Properties.Resources.B16x16_Folder_Yellow_Open;
this.m_menuFileOpenLocal.Name = "m_menuFileOpenLocal";
this.m_menuFileOpenLocal.Size = new System.Drawing.Size(141, 22);
- this.m_menuFileOpenLocal.Text = "Open File...";
+ this.m_menuFileOpenLocal.Text = "Open &File...";
this.m_menuFileOpenLocal.Click += new System.EventHandler(this.OnFileOpen);
//
// m_menuFileOpenUrl
@@ -911,7 +911,7 @@
this.m_menuFileOpenUrl.Image = global::KeePass.Properties.Resources.B16x16_Browser;
this.m_menuFileOpenUrl.Name = "m_menuFileOpenUrl";
this.m_menuFileOpenUrl.Size = new System.Drawing.Size(141, 22);
- this.m_menuFileOpenUrl.Text = "Open URL...";
+ this.m_menuFileOpenUrl.Text = "Open &URL...";
this.m_menuFileOpenUrl.Click += new System.EventHandler(this.OnFileOpenUrl);
//
// m_menuFileRecent
@@ -1190,7 +1190,7 @@
this.m_menuViewShowEntryView.CheckOnClick = true;
this.m_menuViewShowEntryView.Name = "m_menuViewShowEntryView";
this.m_menuViewShowEntryView.Size = new System.Drawing.Size(222, 22);
- this.m_menuViewShowEntryView.Text = "&Show Entry View";
+ this.m_menuViewShowEntryView.Text = "Show &Entry View";
this.m_menuViewShowEntryView.Click += new System.EventHandler(this.OnViewShowEntryView);
//
// m_menuViewWindowLayout
@@ -1207,7 +1207,7 @@
this.m_menuViewWindowsStacked.Image = global::KeePass.Properties.Resources.B16x16_Window_2Horz1Vert;
this.m_menuViewWindowsStacked.Name = "m_menuViewWindowsStacked";
this.m_menuViewWindowsStacked.Size = new System.Drawing.Size(142, 22);
- this.m_menuViewWindowsStacked.Text = "Stacked";
+ this.m_menuViewWindowsStacked.Text = "&Stacked";
this.m_menuViewWindowsStacked.Click += new System.EventHandler(this.OnViewWindowsStacked);
//
// m_menuViewWindowsSideBySide
@@ -1215,7 +1215,7 @@
this.m_menuViewWindowsSideBySide.Image = global::KeePass.Properties.Resources.B16x16_Window_3Horz;
this.m_menuViewWindowsSideBySide.Name = "m_menuViewWindowsSideBySide";
this.m_menuViewWindowsSideBySide.Size = new System.Drawing.Size(142, 22);
- this.m_menuViewWindowsSideBySide.Text = "Side by Side";
+ this.m_menuViewWindowsSideBySide.Text = "Side &by Side";
this.m_menuViewWindowsSideBySide.Click += new System.EventHandler(this.OnViewWindowsSideBySide);
//
// m_menuViewSep1
@@ -1241,14 +1241,14 @@
this.m_menuViewConfigColumns.Image = global::KeePass.Properties.Resources.B16x16_View_Detailed;
this.m_menuViewConfigColumns.Name = "m_menuViewConfigColumns";
this.m_menuViewConfigColumns.Size = new System.Drawing.Size(222, 22);
- this.m_menuViewConfigColumns.Text = "Configure &Columns...";
+ this.m_menuViewConfigColumns.Text = "&Configure Columns...";
this.m_menuViewConfigColumns.Click += new System.EventHandler(this.OnViewConfigColumns);
//
// m_menuViewSortBy
//
this.m_menuViewSortBy.Name = "m_menuViewSortBy";
this.m_menuViewSortBy.Size = new System.Drawing.Size(222, 22);
- this.m_menuViewSortBy.Text = "S&ort By";
+ this.m_menuViewSortBy.Text = "&Sort By";
//
// m_menuViewTanOptions
//
diff --git a/KeePass/Forms/MainForm.cs b/KeePass/Forms/MainForm.cs
index c85db50..56e3f8e 100644
--- a/KeePass/Forms/MainForm.cs
+++ b/KeePass/Forms/MainForm.cs
@@ -122,7 +122,7 @@ namespace KeePass.Forms
AssignMenuShortcuts();
- if(NativeLib.IsUnix())
+ if(MonoWorkarounds.IsRequired)
{
// Workaround for tab bar height bug in Mono
// https://sourceforge.net/projects/keepass/forums/forum/329221/topic/4519750
@@ -239,7 +239,17 @@ namespace KeePass.Forms
if((sizeX != AppDefs.InvalidWindowValue) &&
(sizeY != AppDefs.InvalidWindowValue) && bWndValid)
+ {
+ if(MonoWorkarounds.IsRequired) // Debian 686017
+ {
+ sizeX = Math.Max(250, sizeX);
+ sizeY = Math.Max(250, sizeY);
+ }
+
this.Size = new Size(sizeX, sizeY);
+ }
+ if(MonoWorkarounds.IsRequired) // Debian 686017
+ this.MinimumSize = new Size(250, 250);
Rectangle rectRestWindow = new Rectangle(wndX, wndY,
this.Size.Width, this.Size.Height);
@@ -323,8 +333,14 @@ namespace KeePass.Forms
{
float fSplitPos = mw.SplitterHorizontalFrac;
if(fSplitPos == float.Epsilon) fSplitPos = 0.8333f;
- m_splitHorizontal.SplitterDistance = (int)Math.Round(fSplitPos *
+ // m_splitHorizontal.SplitterDistance = (int)Math.Round(fSplitPos *
+ // (double)m_splitHorizontal.Height);
+ int iSplitDist = (int)Math.Round(fSplitPos *
(double)m_splitHorizontal.Height);
+ if(MonoWorkarounds.IsRequired) // Debian 686017
+ m_splitHorizontal.SplitterDistance = Math.Max(35, iSplitDist);
+ else
+ m_splitHorizontal.SplitterDistance = iSplitDist;
fSplitPos = mw.SplitterVerticalFrac;
if(fSplitPos == float.Epsilon) fSplitPos = 0.25f;
@@ -387,6 +403,7 @@ namespace KeePass.Forms
UpdateTagsMenu(m_dynRemoveTag, false, false, false, false);
UpdateUIState(false);
ApplyUICustomizations();
+ MonoWorkarounds.ApplyTo(this);
ThreadPool.QueueUserWorkItem(new WaitCallback(OnFormLoadParallelAsync));
@@ -433,14 +450,14 @@ namespace KeePass.Forms
if(!AppPolicy.Try(AppPolicyId.NewFile)) return;
if(!AppPolicy.Try(AppPolicyId.SaveFile)) return;
- SaveFileDialog sfd = UIUtil.CreateSaveFileDialog(KPRes.CreateNewDatabase,
+ SaveFileDialogEx sfd = UIUtil.CreateSaveFileDialog(KPRes.CreateNewDatabase,
KPRes.NewDatabaseFileName, UIUtil.CreateFileTypeFilter(
AppDefs.FileExtension.FileExt, KPRes.KdbxFiles, true), 1,
- AppDefs.FileExtension.FileExt, false, true);
+ AppDefs.FileExtension.FileExt, AppDefs.FileDialogContext.Database);
- GlobalWindowManager.AddDialog(sfd);
+ GlobalWindowManager.AddDialog(sfd.FileDialog);
DialogResult dr = sfd.ShowDialog();
- GlobalWindowManager.RemoveDialog(sfd);
+ GlobalWindowManager.RemoveDialog(sfd.FileDialog);
string strPath = sfd.FileName;
@@ -1392,12 +1409,13 @@ namespace KeePass.Forms
private void OnGroupsAfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
- if(e.Node == null) return;
- PwGroup pg = (e.Node.Tag as PwGroup);
+ if((e == null) || (e.Node == null)) return;
- if((pg != null) && (e.Label != null))
+ PwGroup pg = (e.Node.Tag as PwGroup);
+ string strNew = e.Label;
+ if((pg != null) && (strNew != null) && (pg.Name != strNew))
{
- pg.Name = e.Label;
+ pg.Name = strNew;
pg.Touch(true, false);
UpdateUIState(true);
}
diff --git a/KeePass/Forms/MainForm.resx b/KeePass/Forms/MainForm.resx
index 695b671..637d560 100644
--- a/KeePass/Forms/MainForm.resx
+++ b/KeePass/Forms/MainForm.resx
@@ -127,1437 +127,1429 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ
- TwEAAk1TRnQBSQFMAgEBRQEAAWwBAAEkAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
- AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAVIBRgH/AUUBEgEBAf8BRQESAQEB/wFFARIBAQH/AUUBEgEB
- Af8BRQESAQEB/wGFAVIBRgH/4AABlgFqAWAB/wFfAT8BNAH/AWABSwFFAf8BYgFRAUwB/wOHAf8BawFd
- AVgB/wFrAVoBVAH/AWEBQAE2Af8BnAFwAWYB/9wAAWsBSAE9Af8BQwEnAR8B/wFBASABFgH/AUEBIAEW
- Af8BTAEvASUB/wFMAS8BJQH/AUwBLwElAf8BTAEvASUB/wFrAUgBPQH/3AABawFIAT0B/wFcAT0BMwH/
- AWIBQwE5Af8BYgFDATkB/wFiAUUBOwH/AWIBRQE7Af8BYgFFATsB/wFiAUQBOwH/AWsBSAE9Af/cAAFr
- AUgBPQH/AVwBPQE0Af8BYgFDATkB/wFmAUYBPQH/AY4BXgFUAf8BZgFIAT4B/wFiAUUBOwH/AWIBRQE7
- Af8BawFIAT0B/9wAAWsBSAE9Af8BRwFDARYB/wFlAZEBQwH/AW4BTQE6Af8B6wH1AfgB/wGBAkUB/wFN
- AS8BkAH/AUMBHQFIAf8BawFIAT0B/9wAAWsBSAE9Af8CZAFFAf8BmQGyAZQB/wHGAb0BugH/AcgBtgGx
- Af8BxgG9AboB/wGZAZQBxgH/AWQBTAFuAf8BawFIAT0B/9wAAWsBSAE9Af8BLAESAQ0B/wEkAhQB/wE1
- ARoBNAH/ATsCLwH/AUYCOgH/ASgCGAH/ASwBEgENAf8BawFIAT0B/9wAAWsBSAE9Af8BxwG8AbgB/wHw
- AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AWsBSAE9Af/cAAFrAUgBPQH/
- AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AWsBSAE9
- Af/cAAFrAUgBPQH/AcABtAG5Af8BXQFOAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFjAf8BuQGu
- AaoB/wFrAUgBPQH/3AABawFIAT0B/wG/AboBuwH/AWYBwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg
- AcEBuQH/AbkBrgGqAf8BawFIAT0B/9wAAWsBSAE9Af8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf
- Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BawFIAT0B/9wAAWsBSAE9Af8BLAESAQ0B/wEjAhIB/wE7
- Ai4B/wFFAjkB/wFAAjMB/wEjAhIB/wEsARIBDQH/AWsBSAE9Af/cAAGEAVIBRwH/AUcBFgEFAf8BgAFQ
- AUYB/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABUAFGAf8BRwEWAQUB/wGKAVkBTQH/3AAB0gHFAcEB/wFF
- ARIBAQH/AUUBEgEBAf8BRQESAQEB/wFFARIBAQH/AUUBEgEBAf8BOgEYAVsB/wFCAREBCQH/AdIBxQHB
- Af/kAAPHAf8DRQH/A14B/wOwAf8DbAH/Az8B/wOJAf9sAAGFAb4BhQH/AS0BlwEtAf9sAAOuAf8DSgH/
- A0oB/wNJAf8DSQH/A0kB/wNJAf8DSQH/A04B/2gAAYUBvgGFAf8BLQGXAS0B/2wAA1YB/wNYAf8DVgH/
- A1MB/wNOAf8DSgH/A0kB/wNJAf8DSQH/A1sB/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFl
- AbUBZQH/AS0BlwEtAf8BFgGLARYB/wEWAYsBFgH/AQABaQEAAf8BFgGLARYB/wEtAZcBLQH/AbEB1QGx
- Af9cAANvAf8DYwH/A2MB/wNiAf8DXgH/A1kB/wNTAf8DTAH/A0kB/wNJAf8DSQH/A8oB/xgAA04B/wMD
- Af8D8gH/BAADwQH/AwAB/wOvAf8cAAEtAZcBLQH/AQABaQEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF
- Af8BLQGXAS0B/wG/Ad0BvwH/ARYBiwEWAf8BAAFpAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAO
+ TQEAAk1TRnQBSQFMAgEBRQEAAVQBAAFUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAUwBQAH/AT8BDAEAAf8BPwEMAQAB/wE/AQwBAAH/AT8BDAEA
+ Af8BPwEMAQAB/wGFAUwBQAH/4AABlgFkAVoB/wFZATkBLgH/AVoBRQE/Af8BXAFLAUYB/wOHAf8BZQFX
+ AVIB/wFlAVQBTgH/AVsBOgEwAf8BnAFqAWAB/9wAAWUBQgE3Af8BPQEhARkB/wE7ARoBEAH/ATsBGgEQ
+ Af8BRgEpAR8B/wFGASkBHwH/AUYBKQEfAf8BRgEpAR8B/wFlAUIBNwH/3AABZQFCATcB/wFWATcBLQH/
+ AVwBPQEzAf8BXAE9ATMB/wFcAT8BNQH/AVwBPwE1Af8BXAE/ATUB/wFcAT4BNQH/AWUBQgE3Af/cAAFl
+ AUIBNwH/AVYBNwEuAf8BXAE9ATMB/wFgAUABNwH/AY4BWAFOAf8BYAFCATgB/wFcAT8BNQH/AVwBPwE1
+ Af8BZQFCATcB/9wAAWUBQgE3Af8BQQE9ARAB/wFfAZEBPQH/AWgBRwE0Af8B6wH1AfgB/wGBAj8B/wFH
+ ASkBkAH/AT0BFwFCAf8BZQFCATcB/9wAAWUBQgE3Af8CXgE/Af8BmQGyAZQB/wHGAb0BugH/AcgBtgGx
+ Af8BxgG9AboB/wGZAZQBxgH/AV4BRgFoAf8BZQFCATcB/9wAAWUBQgE3Af8BJgEMAQcB/wEeAg4B/wEv
+ ARQBLgH/ATUCKQH/AUACNAH/ASICEgH/ASYBDAEHAf8BZQFCATcB/9wAAWUBQgE3Af8BxwG8AbgB/wHw
+ AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AWUBQgE3Af/cAAFlAUIBNwH/
+ AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AWUBQgE3
+ Af/cAAFlAUIBNwH/AcABtAG5Af8BVwFIAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFdAf8BuQGu
+ AaoB/wFlAUIBNwH/3AABZQFCATcB/wG/AboBuwH/AWABwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg
+ AcEBuQH/AbkBrgGqAf8BZQFCATcB/9wAAWUBQgE3Af8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf
+ Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BZQFCATcB/9wAAWUBQgE3Af8BJgEMAQcB/wEdAgwB/wE1
+ AigB/wE/AjMB/wE6Ai0B/wEdAgwB/wEmAQwBBwH/AWUBQgE3Af/cAAGEAUwBQQH/AUEBEAEAAf8BgAFK
+ AUAB/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABSgFAAf8BQQEQAQAB/wGKAVMBRwH/3AAB0gHFAcEB/wE/
+ AQwBAAH/AT8BDAEAAf8BPwEMAQAB/wE/AQwBAAH/AT8BDAEAAf8BNAESAVUB/wE8AQsBAwH/AdIBxQHB
+ Af/kAAPHAf8DPwH/A1gB/wOwAf8DZgH/AzkB/wOJAf9sAAGFAb4BhQH/AScBlwEnAf9sAAOuAf8DRAH/
+ A0QB/wNDAf8DQwH/A0MB/wNDAf8DQwH/A0gB/2gAAYUBvgGFAf8BJwGXAScB/2wAA1AB/wNSAf8DUAH/
+ A00B/wNIAf8DRAH/A0MB/wNDAf8DQwH/A1UB/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFf
+ AbUBXwH/AScBlwEnAf8BEAGLARAB/wEQAYsBEAH/AQABYwEAAf8BEAGLARAB/wEnAZcBJwH/AbEB1QGx
+ Af9cAANpAf8DXQH/A10B/wNcAf8DWAH/A1MB/wNNAf8DRgH/A0MB/wNDAf8DQwH/A8oB/xgAA0gB/wMA
+ Af8D8gH/BAADwQH/AwAB/wOvAf8cAAEnAZcBJwH/AQABYwEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF
+ Af8BJwGXAScB/wG/Ad0BvwH/ARABiwEQAf8BAAFjAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/
AbQB5gG0Af8BtAHlAbQB/wG1AeYBswH/AbMB5QGyAf8BsQHlAbIB/wGxAeUBsgH/AbAB5AGvAf8BrwHj
- Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA20B/wOA
- Af8DgAH/A20B/wNqAf8DYwH/A10B/wNUAf8DTAH/A0kB/wNJAf8DSgH/FAAD3wH/AwAB/wMAAf8DiAH/
- BAADNwH/AwAB/wM8Af8cAAEtAZcBLQH/AUIBogFCAf8IAAGFAb4BhQH/AS0BlwEtAf8EAAGFAb4BhQH/
- AQABaQEAAf8BFgGLARYB/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7
+ Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA2cB/wOA
+ Af8DgAH/A2cB/wNkAf8DXQH/A1cB/wNOAf8DRgH/A0MB/wNDAf8DRAH/FAAD3wH/AwAB/wMAAf8DiAH/
+ BAADMQH/AwAB/wM2Af8cAAEnAZcBJwH/ATwBogE8Af8IAAGFAb4BhQH/AScBlwEnAf8EAAGFAb4BhQH/
+ AQABYwEAAf8BEAGLARAB/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7
AewBwAH/AboB6wG/Af8BugHrAb0B/wG7AesBvgH/AbkB6gG8Af8BuQHqAbwB/wG4AeoBvAH/AbcB6gG5
- Af8BtAHpAbcB/wFtAdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wNtAf8DZQH/
- A10B/wNTAf8DSgH/A0kB/wNJAf8UAANdAf8DAAH/AzUB/wMlAf8DvAH/AwAB/wMAAf8DJgH/A+EB/xgA
- AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BLQGXAS0B/wQAAUIBogFCAf8BAAFpAQAB/wEAAWkBAAH/
+ Af8BtAHpAbcB/wFnAdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wNnAf8DXwH/
+ A1cB/wNNAf8DRAH/A0MB/wNDAf8UAANXAf8DAAH/Ay8B/wMfAf8DvAH/AwAB/wMAAf8DIAH/A+EB/xgA
+ AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BJwGXAScB/wQAATwBogE8Af8BAAFjAQAB/wEAAWMBAAH/
AdkB6gHZAf8IAAGYAeABmwH/AcoB7wHRAf8B+gL+Af8B+gL+Af8B+gL+Af8B/QH/Af4F/wHLAc4B7gH/
- AWoBhAHQAf8BvQHCAd4B/wFvAYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl
- AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNsAf8DYgH/A1gB/wNOAf8DSQH/A0kB/wOn
- Af8MAAPoAf8DAAH/AwAB/wPFAf8DkQH/AwIB/wMAAf8DUAH/A6wB/wNwAf8oAAFlAbUBZQH/ARYBiwEW
- Af8BLQGXAS0B/wEAAWkBAAH/AQABaQEAAf8BFgGLARYB/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/
- AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BAAE1AfgB/wGbAasB3QH/AQ0BRAH4Af8BZAGL
+ AWQBhAHQAf8BvQHCAd4B/wFpAYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl
+ AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNmAf8DXAH/A1IB/wNIAf8DQwH/A0MB/wOn
+ Af8MAAPoAf8DAAH/AwAB/wPFAf8DkQH/AwAB/wMAAf8DSgH/A6wB/wNqAf8oAAFfAbUBXwH/ARABiwEQ
+ Af8BJwGXAScB/wEAAWMBAAH/AQABYwEAAf8BEAGLARAB/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/
+ AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BAAEvAfgB/wGbAasB3QH/AQcBPgH4Af8BXgGL
AeMB/wHrAf0B9wH/AecB/QH0Af8BjgHfAZcB/wHBAeYBwgH/CAADlQH/A58B/wOkAf8DpAH/A50B/wOV
- Af8DiwH/A4EB/wNnAf8DXQH/A1EB/wNJAf8DSQH/A2IB/wwAA2cB/wMAAf8DLgH/BAADywH/AwAB/wMA
- Af8D2AH/BAADJgH/A/wB/xgAAeYB8QHmAf8BVAGsAVQB/wEWAYsBFgH/AQABaQEAAf8BAAFpAQAB/wEA
- AWkBAAH/AQABaQEAAf8BAAFpAQAB/wFCAaIBQgH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7
- AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFTAW8B9AH/AQoBKgHXAf8BAAEfAdEB/wHh
+ Af8DiwH/A4EB/wNhAf8DVwH/A0sB/wNDAf8DQwH/A1wB/wwAA2EB/wMAAf8DKAH/BAADywH/AwAB/wMA
+ Af8D2AH/BAADIAH/A/wB/xgAAeYB8QHmAf8BTgGsAU4B/wEQAYsBEAH/AQABYwEAAf8BAAFjAQAB/wEA
+ AWMBAAH/AQABYwEAAf8BAAFjAQAB/wE8AaIBPAH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7
+ AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFNAWkB9AH/AQQBJAHXAf8BAAEZAdEB/wHh
AeMB7QH/Af0C/gH/AfwB/gH9Af8BjwHgAZgB/wG/AeUBwAH/CAADmgH/A6YB/wOuAf8DrgH/A6QB/wOa
- Af8DjgH/A4MB/wNoAf8DXgH/A1MB/wNJAf8DSQH/A1EB/wgAA/AB/wMBAf8DAAH/A7YB/wQAA04B/wMA
- Af8DRQH/CAADZgH/A7IB/xQAAdkB6gHZAf8BFgGLARYB/wEAAWkBAAH/AQABaQEAAf8BAAFpAQAB/wEA
- AWkBAAH/AQABaQEAAf8BAAFpAQAB/wFCAaIBQgH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa
- AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wEkAVEB8wH/AQABGAHGAf8BAAETAc0B/wG3
- AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wNtAf8DgAH/
- A2gB/wNdAf8DUwH/A0kB/wNJAf8DhQH/CAADhQH/AwAB/wMjAf8EAAPiAf8DAAH/AwAB/wMeAf8D+wH/
- BAAD1gH/A0EB/xQAAVQBrAFUAf8BAAFpAQAB/wEAAWkBAAH/AQABaQEAAf8BFgGLARYB/wEWAYsBFgH/
+ Af8DjgH/A4MB/wNiAf8DWAH/A00B/wNDAf8DQwH/A0sB/wgAA/AB/wMAAf8DAAH/A7YB/wQAA0gB/wMA
+ Af8DPwH/CAADYAH/A7IB/xQAAdkB6gHZAf8BEAGLARAB/wEAAWMBAAH/AQABYwEAAf8BAAFjAQAB/wEA
+ AWMBAAH/AQABYwEAAf8BAAFjAQAB/wE8AaIBPAH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa
+ AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wEeAUsB8wH/AQABEgHGAf8BAAENAc0B/wG3
+ AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wNnAf8DgAH/
+ A2IB/wNXAf8DTQH/A0MB/wNDAf8DhQH/CAADhQH/AwAB/wMdAf8EAAPiAf8DAAH/AwAB/wMYAf8D+wH/
+ BAAD1gH/AzsB/xQAAU4BrAFOAf8BAAFjAQAB/wEAAWMBAAH/AQABYwEAAf8BEAGLARAB/wEQAYsBEAH/
AYUBvgGFAf8B2QHqAdkB/xQAAZ8B4wGiAf8BswHeAb0B/wHNAdoB1wH/AcwB2QHXAf8ByQHUAdMB/wHS
- Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wERAUEB4AH/ATMBTwHjAf8B+AH7AfoB/wH7Af4B/QH/
- AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DVAH/A4gB/wNe
- Af8DVAH/A08B/wNJAf8DRwH/CAAD9AH/AwYB/wMAAf8DqAH/BAADYAH/AwAB/wM2Af8DgQH/A5sB/wgA
- AzIB/wPlAf8QAAEtAZcBLQH/AQABaQEAAf8BAAFpAQAB/wGUAcYBlAH/AWUBtQFlAf8BLQGXAS0B/wgA
+ Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wELATsB4AH/AS0BSQHjAf8B+AH7AfoB/wH7Af4B/QH/
+ AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DTgH/A4gB/wNY
+ Af8DTgH/A0kB/wNDAf8DQQH/CAAD9AH/AwAB/wMAAf8DqAH/BAADWgH/AwAB/wMwAf8DgQH/A5sB/wgA
+ AywB/wPlAf8QAAEnAZcBJwH/AQABYwEAAf8BAAFjAQAB/wGUAcYBlAH/AV8BtQFfAf8BJwGXAScB/wgA
AdkB6gHZAf8QAAGfAeMBowH/AcAB7gHKAf8B4wHyAe8B/wHSAeAB3QH/Ac8B3gHbAf8B0wHhAd0B/wHV
AeEB3gH/AdQB4AHdAf8B0AHdAdoB/wHRAd4B2wH/Ac4B3AHYAf8BzQHcAdQB/wHLAd8B1QH/AdkB9AHn
- Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wNAAf8DbAH/A2IB/wNWAf8DTAH/
- A1MB/wwAA5AB/wMAAf8DCgH/BAAD6AH/AwAB/wMAAf8DuAH/A+4B/wMdAf8D8wH/BAADiwH/A2UB/xAA
- AUIBogFCAf8BAAFpAQAB/wEtAZcBLQH/BAABhQG+AYUB/wEtAZcBLQH/CAABLQGXAS0B/wGFAb4BhQH/
+ Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wM6Af8DZgH/A1wB/wNQAf8DRgH/
+ A00B/wwAA5AB/wMAAf8DBAH/BAAD6AH/AwAB/wMAAf8DuAH/A+4B/wMXAf8D8wH/BAADiwH/A18B/xAA
+ ATwBogE8Af8BAAFjAQAB/wEnAZcBJwH/BAABhQG+AYUB/wEnAZcBJwH/CAABJwGXAScB/wGFAb4BhQH/
DAABnQHhAaEB/wG+Ae0ByAH/AeoB/AH4Af8B1wHnAeIB/wHJAdkB0wH/AcgB2AHTAf8ByQHYAdMB/wHT
AeIB3QH/AckB2AHUAf8BwAHTAcwB/wHEAdQBzgH/AcIB1AHKAf8B3AH1AekB/wHgAfwB7wH/AYsB3gGX
- Af8BugHiAbsB/xgAA5MB/wNbAf8DRwH/A9MB/wPJAf8D2QH/EAADXwH/AwAB/wMAAf8DAAH/A8UB/wMd
- Af8DAAH/AwAB/wM6Af8DRQH/AwAB/wMfAf8DxAH/AxAB/wMAAf8DVAH/DAABvwHdAb8B/wEAAWkBAAH/
- ARYBiwEWAf8BzAHkAcwB/wGFAb4BhQH/AS0BlwEtAf8EAAGUAcYBlAH/AQABaQEAAf8BhQG+AYUB/wwA
+ Af8BugHiAbsB/xgAA5MB/wNVAf8DQQH/A9MB/wPJAf8D2QH/EAADWQH/AwAB/wMAAf8DAAH/A8UB/wMX
+ Af8DAAH/AwAB/wM0Af8DPwH/AwAB/wMZAf8DxAH/AwoB/wMAAf8DTgH/DAABvwHdAb8B/wEAAWMBAAH/
+ ARABiwEQAf8BzAHkAcwB/wGFAb4BhQH/AScBlwEnAf8EAAGUAcYBlAH/AQABYwEAAf8BhQG+AYUB/wwA
AaAB4wGjAf8BnQHkAaIB/wG0AesBuwH/AaUB3QGrAf8BnwHWAaQB/wGeAdUBogH/AaIB2wGnAf8BowHa
- AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFlAdcBbQH/
- AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/AS0BlwEtAf8BFgGL
- ARYB/wEWAYsBFgH/ARYBiwEWAf8BFgGLARYB/wEWAYsBFgH/AUIBogFCAf8BvwHdAb8B/wwAAcgB6wHI
+ AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFfAdcBZwH/
+ AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/AScBlwEnAf8BEAGL
+ ARAB/wEQAYsBEAH/ARABiwEQAf8BEAGLARAB/wEQAYsBEAH/ATwBogE8Af8BvwHdAb8B/wwAAcgB6wHI
Af8BtAHmAbMB/wG1AeYBtAH/AbYB5wG2Af8BtQHnAbYB/wG1AeYBtAH/AbcB5wG4Af8BtwHmAbUB/wG1
AeUBtAH/AbYB5QG1Af8BtwHmAbYB/wG1AeMBtAH/AbIB4wGyAf8BtAHjAbQB/wGyAeEBsQH/AdkB7gHZ
- Af8EAANeAf8DWwH/A20B/wNqAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFlAbUBZQH/AS0BlwEtAf8B2QHq
- AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/AS0BlwEtAf9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh
- IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BYAG5AdkB/wFaAbYB2AH/AWIBuQHZ
- Af8BlgHNAeUB/wGYAdAB6AH/AWIBugHZAf8BWgG2AdgB/wFgAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA
- AycBOgNVAbEBPwFIAWIB9gGWAa8B1QH/AZgBpQHMAf8BQgFJAYwB/QNUAe4DVwHCA0QBegMhATEDAQEC
- EAADQAFxASQBZgHjAf8BIgFAAZYB/QNUAa4DEAEWDAADTAGTAScBXwGRAfsBGwFHAakB/wM8AWcQAAHH
- AeoB+gH/AS0BtQHpAf8BKwG2AewB/wErAbYB7AH/ASsBtgHsAf8BKAGtAeEB/wEnAasB3gH/ASsBtgHs
- Af8BKwG2AewB/wErAbYB7AH/ASwBswHnAf8BxQHpAfgB/wgAAukB8wH/Ao0BxwH/PAADEQEXA1UBtAE6
- AlwB+AEAAW4BJQH/AVYBrQFsAf8B8wf/AfwD/wHVAdsB8gH/AZoBqQHPAf8BVwFjAX8B/gFFAUgBUgH0
- A1sB0AMvAUoMAAIhASIBMQFUAWIBqgH7AY0B7wL/ARYBVAG/Af8DXgHaAycBOgMWAR8DWQHMATQBkAHW
- Af8BlAHwAv8CTAFoAfMDFgEfFAABCQEaASIB/wELAUIBWgH/ASQBZgGSAf8BKQFdAYMB/wEXASMBKQH/
- ARcBIwEoAf8BKQFdAYMB/wEiAWQBkAH/AQsBQgFaAf8BBwEZASAB/xAAAtMB7AH/AlAByAH/AtQB/gH/
- NAADPwFtAXwBgwG7Af4BQAHVAYkB/wEAAakBBQH/AUkBmwFaAf8B1QH0Av8B8gH9Af4B/wHdAfMB+QH/
- AesD/wHvA/8B0QH7Av8BogHiAfsB/wE3AV0BtwH/A0wBkxAAAloBXQHTAY8B6QH+Af8BiAHxAv8BKQGR
- Ad8B/wFJAUwBWQHyAU8BUwFkAfEBQAG1AfMB/wGXAf0C/wFmAb0B7gH/A1kBwxAAA2sB/wOCAf8DAAH/
- A4cB/wP+Ef8D/QH/A2sB/wMAAf8DZgH/A4IB/wgAAvgB/gH/AisB1wH/AkcB2AH/ApoC/wLlAv8sAANA
- AXEBfwGXAcQB/gFAAdABhgH/AQABnwEaAf8BQAGPAWEB/wHLAe8C/wHbAfEB+AH/AaEBoAGMAf8BwAHS
- AcYB/wHIAfYC/wGYAc0B9AH/AYkB0gH+Af8BOwGCAcoB/wNMAZMQAAJLAUwBjwFJAbMB8QH/AV4B4gL/
- AVwB4gL/ATMBtAH4Af8BPgHFAfwB/wFfAeEC/wFdAeMC/wFCAX8BpgH+A0EBcxMAAf8DAAH/AwMB/wP8
- Gf8D9wH/AwAB/wMAAf8DAAH/DAACjwH6Af8CUAHjAf8CSAHaAf8CggL/AsEC/ygAA0ABcAF7AYkBvwH+
- ATcBywGKAf8BAAGxAQYB/wExAZEBRAH/Ab8B5AL/AdMB7gH5Af8BzAGyAYsB/wHMAcsBqQH/AZoB3QL/
- AZsBqgGuAf8BrgG6AbQB/wEbAV0ByQH/A0wBkxAAAyMBMwFBAWoBlgH5ATEB2AL/ASsBygL/ATIB1QL/
- ATAB0QL/ASkBywL/ATcB0QH+Af8BTgFXAWcB8gMSARkQAAMQAf8DAAH/Aych/wMYAf8DAAH/AygB/wwA
- As4B/AH/Ak8B9AH/AlUB5gH/AkEB1AH/AoAC/wKnAv8kAANAAnABhQHDAf4BOgG8AYAB/wELAZABEQH/
- AUwBmQGSAf8BrwHiAv8B1gHxAfoB/wHBAY4BQQH/AbsBsAGLAf8BgAHTAv8BpQGeAYMB/wHKAaUBRwH/
- AQ8BVwHHAf8DTQGWEAADQAFxASMBXwGWAfsBCwHRAv8BAQHEAv8BAwHEAv8BAwHEAv8BAAHHAv8BFQHH
- Af0B/wEpAUMBZgH6A0gBhAMBAQIMAANOAf8DAAH/AyYh/wMXAf8DAAH/A2cB/xAAAoUB8wH/AoAC/wJe
- Ae4B/wI7AdAB/wJwAf4B/wKWAv8C7gL/HAADPAFnAWABgAHHAf4BZwHGAesB/wFoAbwB5gH/AYMByAH8
- Af8BlAHWAv8BiwHZAfwB/wFNAaYB0AH/AUYBpgHgAf8BRwG5Av8BSQGOAcAB/wFVAYgBoQH/AQoBVAHF
- Af8DTgGUAwEBAggAAlABUgGkASsBVgGyAf0BHQHQAfkB/wEeAdQC/wEgAdEC/wEhAdEC/wEhAdEC/wEg
- AdEC/wEeAdcC/wEbAcAB7gH/ARMBSwF/Af4DVgG7AxQBGwgAA7QB/wMAAf8DBh3/A/sB/wMAAf8DAAH/
- A80B/xQAApkC/wKAAv8CZQH1Af8COwHSAf8CbwH9Af8CigL/AuEC/xQAAzIBUANXAb8BRwGWAdoB/wFh
- AcQC/wFfAb0C/wFrAckC/wFVAZ8B+AH/ARcBNQHcAf8BHQFMAeQB/wESAUoB4wH/ARABTwHjAf8BCgFa
- AfIB/wEAAV8B/AH/AQEBPwHIAf8CTQFXAe8DVAGvAiEBIgExAlsBXgHZAS0BqQHqAf8BWAH2Av8BZQHr
- Av8BZwHmAv8BZQHlAv8BYgHkAv8BYgHkAv8BZgHlAv8BZgHnAv8BYgHwAv8BTwHsAv8BHQGDAbUB/wNY
- AeMDNQFXCAADFwH/AwAB/wPNGf8DvwH/AwAB/wMuAf8cAAKUAv8CgAL/AmoB+QH/Aj0B1wH/Am0B/AH/
- AoQC/wLXAv8QAAJYAWAB6wIAAaEB/wE2AYYB6AH/AVABuwL/AVMBtwL/AVgBuwH+Af8BKwFEAe0B/wEQ
- ARIB1gH/ARUBGgHTAf8BFAEYAdIB/wEUARgB0gH/ARoBIAHVAf8BHgEnAdkB/wEeASsB2QH/ASEBJgHO
- Af8DXAHcAlkBaAHsAVoB2wL/AYoD/wGZAfUC/wGWAfMB/gH/AZMB9QL/AZkB8gL/AacB8AL/AaQB7wL/
- AZQB8gL/AZUB9AL/AZcB8gH+Af8BlwH4Av8BgwP/AUoBsgHdAf8DXAHnCAADugH/AwAB/wM6Af8B+wL8
- Af8BzwHtAfoB/wGkAd0B9gH/AagB3wH3Af8B2wHyAfsB/wP5Af8DLgH/AwAB/wPOAf8gAAKVAv8CgAL/
- Am4B/AH/AkEB2wH/AmwB+wH/AoIC/wLWAv8MAANOAZQBAgEAAb0B/wEfAVYB6AH/AUQBuAL/AUcBtgL/
- ATcBgAH2Af8BFwEgAeIB/wEXASoB3QH/ARYBKAHeAf8BFgEpAd8B/wEUAScB3gH/ARQBJQHeAf8BEwEk
- Ad4B/wEVASMB5wH/AS0BLwF6AfkDKwFDA1kBxwFYAWEBZwHmAlsBYQHhAlsBYQHhAlcBXgHfAVUBWQF5
- AfIBkwHbAfQB/wHSAf0C/wHJAf4C/wFkAbIB2gH/AlQBYwHuAl8BYQHgAlsBYQHhAl0BYQHiAl4BZQHl
- A1EBogwAA28B/wMAAf8BKwGLAa8B/wEhAaUB2AH/AR8BoQHTAf8BHwGiAdQB/wEjAagB2wH/ASkBZwGR
- Af8DAAH/A7kB/ygAApoC/wKAAv8CcAH+Af8CRgHhAf8CawH7Af8ChwL/AuUC/wgAAwQBBgJcAWEB3AEH
- ARQBuQH/AS4BmQH1Af8BNQGjAv8BHwEyAeIB/wEYASUB2AH/ARgBKAHaAf8BFwEnAdsB/wEWASUB2gH/
- ARYBJQHbAf8BFQElAdkB/wEXAScB5AH/AQ4BFwG8Af8DTgGZGAACMAExAU0BcAF/Ab8B/gHvA/8B2gH8
- Av8BTAFNAXcB+gMkATUgAAPOAf8DAAH/AR8BagGZAf8BIwGRAbsB/wEsAbQB6QH/ASoBrgHhAf8BLAGa
- AcMB/wEPAUkBYgH/AwAB/wPzAf8sAAKpAv8CgAL/AoAC/wJNAeUB/wKFAfoB/wKuAv8C+AL/CAADLQFG
- AiEBcAH7AQkBNgG9Af8BJAFbAfAB/wEdASIB1gH/ARsBJwHTAf8BGwEnAdUB/wEZAScB2QH/ARkBJAHU
- Af8BGAEkAdQB/wEYASUB2AH/ARgBIgHcAf8BXgJfAeADBwEKGAADCgEOAVUBXAFlAeoB9AP/Ac4B5QH8
- Af8DXAHcAwQBBicAAf8DMgH/AygB/wNKAf8CUgFTAf8DSgH/AwcB/wMhAf80AALGAv8ChQL/AoAC/wJV
- AesB/wKDAfoB/wK+Av8MAAJSAVQBpgINAaAB/wEoATUB5gH/ASABMAHkAf8BHQEsAeAB/wEdAS8B6AH/
- ARoBLQHoAf8BGgEpAeEB/wEYASkB4wH/ARoBKwHsAf8BJAEoAXUB/AMtAUUgAAJVAVYBtAHcAeoB/AH/
- AakBuwHiAf8DUAGdKAADKwH/AwAB/wOkAf8DEwH/Ay4B/wOSAf8DAAH/A5AB/zgAAu8C/wKsAv8CgQL/
- AmcB9wH/ApEC/wLkAv8IAAMMARACXgFlAeUBKQEtAZEB/gIrAX0B/AIrAXwB/AEhASMBjQH7ASEBIwGN
- AfsCKQF7AfoCIQGNAfsBKAEpAXoB+gNOAZckAAM6AWIBrAGyAe4B/wF1AXsBkwH+Ay8BSigAA8sB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AywB/wP5Af9AAALqAv8CsAL/AoQC/wKiAv9YAAMMARACWwFhAeECXAFe
- Ac4DBAEGLAAD2wH/A1kB/wMVAf8DIwH/A4IB/wP1Af9MAAL1Av8C1gL/DAADFAEbA1EBoQNMAZMDJAE1
- AwMBBGgAAxABFgNbAdADWAHGAwkBDAQAAxkBIwMoATwDLQFGAy0BRgMpAT4DHwEsAwYBCDQAAw8BFANR
- AaIDVgG+AzEBTxAAA1kByQE+Aa0BOAH/AToBhAEyAf8BQgFKAUIB9QNcAc4DRQF9Ax8BLBgAAV4CWAHd
- AZQBXAEhAfsBkgFNASYB+gGTAU0BJgH6AZMBTQElAfoBkwFNASQB+gGTAU0BJAH6AZMBTQEjAfoBkwFN
- ASIB+gGVAU0BIQH6AZUBTQEhAfoBlQFNASEB+gGVAU0BIQH6AZUBTQEhAfoBlAFIAR4B+wFhAlsB4QQA
- AxIBGQNcAdQBAAGkAeIB/wEIAVQBmAH/A1kBwwNXAcIBZAJTAfEBdAE+AT0B+AF4AU0BKQH6AXgBTQEp
- AfoBcwE+AT0B+AFfAUwBSgHzA1sB2QM8AWcwAANWAbkBCgE9AZYB/wEOATsBkgH/AVECUwHxAzYBWQgA
- A0oBjAEjAZABQwH/AVgBsQGnAf8B3wHzAc8B/wG1AeEBqQH/AV0BqwFRAf8BMAF1ATIB/gFRAlMB8QNX
- Ab8DLwFKEAABeAFfAUwB8wHuAaMBXAH/AewBsAGHAf8B7AGtAYEB/wHrAaoBbwH/AeoBqQFsAf8B6gGn
- AWoB/wHqAaQBZwH/AekBogFkAf8B6QGgAWEB/wHpAZ4BXQH/AegBnAFaAf8B5wGaAVgB/wHkAZsBXAH/
- Ae0BiwE4Af8BewFMAUQB8wQAAisBLAFDAQ8BUQGoAf0BAAH3Av8BEAHBAeoB/wFoATUBOwH/AfIBkQE0
- Av8BtQFVAv8BvgFdAf8B7QGtAWUB/wH0AbQBXgL/Ab0BXAL/AbMBVAH/AegBiAE5Af8BaQE1ASoB+QM5
- AV8oAAM/AW0BPQFLAaEB/QE/AZgB3wH/AQYBXgHeAf8BBgFHAb4B/wNWAb4EAAMzAVIBLQFxAUkB+gGL
- AWoBuwH/Ae0BywH7Av8B+wHtAv8B+QH2Af8B+AH3AecB/wHaAeIBsgH/AZ4BxgFmAf8BQAGcATgB/wFN
- AVQBTQHvAykBPgwAAXIBWAFTAfEB7AHEAawN/wH2AfkC/wH3AfsC/wH9A/8B+wH+Av8B9wH6Av8B9AH2
- Af0B/wHwAfIB+QH/Ae8B7QH1Af8B5gHuAf0B/wHmAbwBqAH/AXQBUwFPAfEEAAMBAQICWAFiAekBAAHb
- Af4B/wERAcQB5wH/AZ4BhQFrAv8BzAFpAv8BzQGDAf8B2wGwAZYB/wEcARkB1gH/ATwBLgGrAf8B8wHC
- AYYC/wHIAYYC/wHSAYQB/wHdAW8BOgH/A1YBuyQAAw0BEgJeAWUB5QFNAaIB4wH/AbYB3wH9Af8BvgHf
- Av8BSwFzAZwB/gNFAX8DDwEUAVgBYQFYAeYBKQHJAVoB/wGxAekB5wL/Ae8B5AH/AfEB5QHYAf8B8wHj
- AdQB/wH2AeEBzQL/AeMByAH/AfsB0QGtAf8B0QG8AYEB/wFSAZMBOwH/A1gBywMEAQYIAAFyAVgBUwHx
- AfUBzQGyAf8BxwHIAcwB/wGGAYABgQH/AbsCtwX/Ad8C3QH/AZICjAH/AY8BhwGIAf8BkQGJAYoB/wGP
- AogB/wGOAYYBhwH/AYYCbwH/Aq8BtgH/Ae8BwgGmAf8BcgFTAU8B8QQAAzYBWQEeAV8BjwH7AQAB4wL/
- ARABvwHiAf8BlQGEAYYC/wHUAZcC/wHZAaIB/wHYAbwBsAH/AR0BIQHoAf8BNAEwAdQB/wHwAdIBqAH/
- AfgByQGKAv8BxQGGAf8B8QGnAWMB/wNbAcgkAANGAYEBKgFnAb0B/wGXAdAB/QH/Ad0B/AL/AbQBvgHP
- Af8DVAGrBAADWAHGAU8BngFYAf8B0AHaAaoB/wH9AfEB4QH/AfEB5AHWAf8B8AHkAdUB/wHxAeABzAH/
- AfQB1wG4Af8B8gHPAakB/wHVAbMBigH/AfcBxwGcAf8ByQHVAZsB/wE2AWoBKwH+A0oBiwgAAXIBWAFT
- AfEB8gHKAa8B/wHmAekB7AH/AckByAHJAf8B4ALfAf8D/gH/Ae8C7QH/Ac4CzAH/AcwCyQH/AcwCxwH/
- AcoCxQH/AckCwwH/AcQCvQH/AdIB0wHaAf8B7gG/AaMB/wFyAVMBTwHxBAADNAFUAQ8BUgGoAf0BAAHl
- Av8BDwG/AeEB/wGTAYQBjwL/AeEBtQL/AeoBxwH/AeYB1gHMAf8CPAHgAf8BXwFXAdUB/wH8AewBxQH/
- Ad4B1AGfAf8B/QHVAaUB/wHvAagBggH/A1YBtiAAAxIBGQJZAWQB7AFrAb4B9wH/AccB8wL/AZUBuQHY
- Af8DVgG7CAABXgFlAV4B5QFFAYMBnAH/AfAB6wH7Av8B/gH7Af8B+wHsAeQB/wHzAeQB1AH/AfIB2wHC
- Af8B9wHYAbcB/wHcAcABnQH/AeQBvQGRAf8B+gHOAaEB/wH+AegBzAH/AZkBzAGLAf8BQwFQAUEB9AMt
- AUUEAAFyAVcBUwHxAe8ByAGtDf8B/AL6Hf8B+AH5Av8B6wG+AaIB/wFyAVMBTwHxBAADLQFFAQ8BUwF+
- AfwBAAHhAv8BDwHAAeEB/wGYAY8BogL/AekBzAL/AfsB7AH/AvIB7QH/AUIBQAHZAf8BZQFhAdUD/wHw
- Av8B9wHtAv8B6wHTAf8BtQF/AW0B/gM8AWggAANWAb4BQwGYAdsB/wGtAecC/wFjAagB1wH/A1kBwwMB
- AQIIAAMQARYBPAE9ATwBaAFZAVwBWQHPAXABlAFzAfsB0QHpAdEB/wH2AfQB5gL/AekB0gH/AeIBxwGr
- Af8B2wG9AZkB/wH3AdEBpgH/AfMB0gGtAf8B/QHgAckB/wHzAfoB5wH/AVgBqQFTAf8DWgHTAw8BFAFw
- AVgBUwHxAfQBzgG0Af8C0wHWAf8BoAKcAf8ByQLHAf8D/gH/AegC5QH/AaoCpQH/AagCoQH/AagCogH/
- AacCoAH/AaUCnwH/AZ8ClgH/AcEBwwHJAf8B9AHIAawB/wFyAVMBTwHxBAADUQGgAQABkwHTAf8BAAHr
- Av8BDwG9AeAB/wGNAVkBawL/Ad8BygL/AfEB3gH/AeEBzQG8Af8BIgEmAbsB/wFFAUIBsAH/AfoB2AGv
- Av8B6gHZAv8B1QHJAf8BXQJZAdIDBgEIBAADFAEbAy4BSAMJAQwMAANOAZgBKgFvAZsB/gGbAeEC/wFt
- AbUB4wH/A1kBzAMGAQgYAAMYASEDSwGOAl4BWgHYAXcBjAFrAfoB2AHKAagB/wH4AdQBsQH/AfIB0wGx
- Af8B8wHcAcIB/wHxAd4ByAL/AfQB7wH/AdcB9AHYAf8BNwF4ATEB/gNOAZcBcAFXAVMB8QHzAc4BtAH/
- Ad4B4QHlAf8BuAG2AbcB/wHYAtYF/wHuAu0B/wHAAr4B/wG+ArsB/wG/ArwB/wG+ArkB/wG9ArkB/wG3
- ArIB/wHPAdMB2QH/AfMByQGtAf8BcgFTAU8B8QMSARkBUgFWAV4B7QEAAckB/QH/AQAB4gH9Af8BFgHJ
- AeoB/wFBATEBQQH5AZEBQQE1AfwBswKiAf8BVQGdAcAB/wE8AZYBxgH/AS4BjAG+Af8BTAGIAZ8B/wHD
- AY4BbgH/AWUCXgHlAxsBJgQAAyABLgNYAeMCOQE4AfwDTwGcCAADTgGXASQBZgGSAf4BbwHNAv8BnwHb
- Af4B/wFQAVgBYgHvAx0BKigAASsBLAErAUMBYQFpAV0B8AH+AfAB2AH/AfUB2wHEAf8B8gHhAdAB/wHz
- AeYB2AL/AfAB7QH/Aa0B2gGtAf8BJgGkASsB/wNRAacBcAFWAVMB8QHwAcwBsw7/Av4h/wHwAccBrAH/
- AXABUwFPAfEDUgGoAQABXQHCAf8BAAHiAv8BAAHZAfUB/wEaAd0B9wH/ARoBlwHHAf8BNQFIAXcB/gFc
- AZ4BxwH/AYgB1wH9Af8BjQHUAfUB/wFvAcsB7gH/AUQBsQHiAf8BJgFgAZ8B/wNSAagIAANZAdcB1gHP
- Ac0B/wG4AbQBsgH/Az4B+AM6AWEDTgGXAR8BZwGXAf4BWwHCAv8BqAHmAv8BTQF8AY8B/gNCAXYwAAM6
- AWIBjwGvAYUB/AH/AfgB8AH/AfIB4wHUAv8B7wHrAf8BywHiAccB/wExAboBQQH/A1gB4wMVAR0BbwFW
- AVMB8QH0AdABuAH/At0B3gH/AbYCsgH/AdYC0wX/Ae4C7QH/Ab4CuwH/Ab0CuQH/Ab8CugH/Ab4CuQH/
- Ab0CuAH/AbkCsgH/AdQB1gHaAf8B9gHMAbAB/wFwAVMBTwHxAVkBWgFhAeQBAAG9Av8BAAHlAv8BAAHr
- AfgB/wEtAfsB/QH/AYYD/wFLAZsBzAH/AYQBuQHiAf8BpQHjAv8BnAHaAf4B/wGWAdcB+gH/AY4B0gHz
- Af8BTQG3AekB/wFYAVkBYAHrAxQBGwQAA2QB7AHXAdIB0wH/AcsByQHKAf8BjgGPAY4B/wFEAUEBMgH7
- AW4BbwF1Af4BRAGVAckB/wGAAdMC/wFnAbIB4AH/A1kBxDgAAVUBVgFVAbEB5AH0AeUC/wH0AfEB/wHp
- AegB2wH/AVcB1gFrAf8BQQFqAUEB+QMwAU0EAAFvAVYBUwHxAfYB0wG8Af8B0wHXAdsB/wGgAZ8BoAH/
- A8kF/wPqAf8BqwKqAf8BqQGnAagB/wGrAakBqgH/AaoCqQH/AasCqAH/AaMBoQGiAf8ByQHPAdUB/wH5
- AdEBtAH/AXABUwFRAfEBRAFMAW8B8wEAAcUC/wEAAeIC/wEAAf0C/wEtA/8BlAP/AWcBsAHQAf8BhQGm
- Ac4B/wHCAe0C/wG3AeUC/wGmAd4C/wGYAdgB+gH/AYUB0wH9Af8BOwFaAWIB9gMdASoEAAMnAToDWAHL
- A4gB/QKsAasB/wGqAakBpwH/Ab4BtwGxAf8BtgGwAaoB/wFjAZ0BvQH/AlUBXAHqAxgBITgAAw8BFANk
- AecB8wH6AfUB/wGQAeUBnwH/ATEBtAE/Af8DSAGHCAABbwFVAVMB8QHtAccBrgH/AfgB8QHuAf8B+AHw
- Ae0B/wH3AfEB7gH/AfcB8gHvAf8B+AHxAe8B/wH4AfEB7gH/AfgB8QHuAf8B+AHxAe8B/wH4AfEB7wH/
- AfgB8QHvAf8B9wHxAe8B/wH3AfMB8QH/AfEBxgGqAf8BcAFTAVEB8QEeAVEBkAH7AQABxwL/AQAB4gL/
- AQAB+wL/AS4D/wGPA/8BZwGzAdQB/wGeAbEB0AH/AecB+wL/AdYB7wL/AboB5AL/AaIB4AL/AYwB2QL/
- AlsBYQHhAwYBCAwAA1MBrQGkAaMBoAH/AcwBygHHAf8BxQHBAb8B/wHNAcYBwwH/AWsBYwFhAf8DUAGj
- CAADAwEEAw8BFAMJAQwsAAM1AVcBXwG2AYgB/QFUAeYBggH/A1gBxgwAAW8BYQFTAfEB7AGdAVEB/wHk
- AY0BQwH/AeQBjwFGAf8B5AGNAUQB/wHkAYwBQwH/AeQBjAFCAf8B5AGMAUEB/wHkAYsBQAH/AeQBigE/
- Af8B5AGJAT0B/wHkAYkBPAH/AeQBiAE8Af8B4wGIAT0B/wHsAYsBMgH/AXACUwHxAVIBWQFmAe0BAAHK
- Av8BAAHFAfAB/wEiAUsBXwH7ATABfwGhAf4BcAP/AT4BhgG3Af8BoAGxAc4F/wHxA/8BzAH0Av8BrgHu
- Av8BWwF/AaYB/gNAAXAQAAMdASoDZAHxAdEBzwHNAf8B5gHjAeEB/wGzAbEBsAH/AWABXwFdAf8CRQFE
- AfkDWgHkA1oB2wNXAegDXgHlAy4BSDAAAVIBUwFSAagBVwFcAVcB3wMYASEMAAFxAl8B8wH/AeEBoQL/
- AccBggL/AcQBbwL/AcEBaQL/Ab4BYwL/AboBXQL/AbYBVwL/AbIBUQL/Aa4BSgL/AaoBQwL/AaYBPgL/
- AaMBOAL/AZ4BMAL/AakBNgH/AXIBWQFOAfICWQFcAckBAAHBAf0B/wEAAc8B9gH/AQ8BQAFPAf0BBQGJ
- AbUB/wFeA/8BQQFHAWoB+QNWAcEBgQGIAZAB+QG9AdUB4QH/AZ8ByQHdAf8BSQFiAXMB9gNLAY8YAAMt
- AUYDXAHnAcIBwAG9Af8B1gHTAdEB/wGsAqkB/wGoAacBpgH/Aa8BrQGsAf8BuwG5AbgB/wN/Af4DVgG4
- AwkBDEgAAV0CWQHXAYoBXAFTAfsBeQJNAfoBeQJNAfoBeQJNAfoBeQJNAfoBeQJNAfoBeQFNAUoB+gF5
- AU0BRgH6AXkBTQFDAfoBeQFNATEB+gF5AU0BLgH6AXkBTQErAfoBeQFNASkB+gGKAUQBJQH7AWACWgHe
- AkYBRwGBASIBTQGAAfoBIgFcAYwB+gEnAWUBiAH5ATgBXAGCAfgBPgFkAYMB9wNUAa8EAAMpAT8CSAFJ
- AYcCRQFGAX8BIQIiATEgAAMSARkDTgGYA2UB5QGDAoIB+QF7AnkB/AFlAmIB9gNeAdkDQAFxEAADOgFh
+ Af8EAANYAf8DVQH/A2cB/wNkAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFfAbUBXwH/AScBlwEnAf8B2QHq
+ AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/AScBlwEnAf9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh
+ IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BWgG5AdkB/wFUAbYB2AH/AVwBuQHZ
+ Af8BlgHNAeUB/wGYAdAB6AH/AVwBugHZAf8BVAG2AdgB/wFaAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA
+ AycBOgNVAbECSAFiAfYBlgGvAdUB/wGYAaUBzAH/AUABQwGMAf0DVAHuA1cBwgNEAXoDIQExAwEBAhAA
+ A0ABcQEeAWAB4wH/ASgBQAGWAf0DVAGuAxABFgwAA0wBkwEnAV8BiwH7ARUBQQGpAf8DPAFnEAABxwHq
+ AfoB/wEnAbUB6QH/ASUBtgHsAf8BJQG2AewB/wElAbYB7AH/ASIBrQHhAf8BIQGrAd4B/wElAbYB7AH/
+ ASUBtgHsAf8BJQG2AewB/wEmAbMB5wH/AcUB6QH4Af8IAALpAfMB/wKNAccB/zwAAxEBFwNVAbQBPgJc
+ AfgBAAFoAR8B/wFQAa0BZgH/AfMH/wH8A/8B1QHbAfIB/wGaAakBzwH/AVcBYwF/Af4BUAJSAfQDWwHQ
+ Ay8BSgwAAiEBIgExAVQBXwGYAfsBjQHvAv8BEAFOAb8B/wNeAdoDJwE6AxYBHwNZAcwBLgGQAdYB/wGU
+ AfAC/wJMAV8B8wMWAR8UAAEDARQBHAH/AQUBPAFUAf8BHgFgAZIB/wEjAVcBgwH/AREBHQEjAf8BEQEd
+ ASIB/wEjAVcBgwH/ARwBXgGQAf8BBQE8AVQB/wEBARMBGgH/EAAC0wHsAf8CSgHIAf8C1AH+Af80AAM/
+ AW0BfAF/Aa8B/gE6AdUBiQH/AQABqQEAAf8BQwGbAVQB/wHVAfQC/wHyAf0B/gH/Ad0B8wH5Af8B6wP/
+ Ae8D/wHRAfsC/wGiAeIB+wH/ATEBVwG3Af8DTAGTEAACWgFdAdMBjwHpAf4B/wGIAfEC/wEjAZEB3wH/
+ AU8BVQFZAfICUwFkAfEBOgG1AfMB/wGXAf0C/wFgAb0B7gH/A1kBwxAAA2UB/wOCAf8DAAH/A4cB/wP+
+ Ef8D/QH/A2UB/wMAAf8DYAH/A4IB/wgAAvgB/gH/AiUB1wH/AkEB2AH/ApoC/wLlAv8sAANAAXEBfwGL
+ AbgB/gE6AdABhgH/AQABnwEUAf8BOgGPAVsB/wHLAe8C/wHbAfEB+AH/AaEBoAGMAf8BwAHSAcYB/wHI
+ AfYC/wGYAc0B9AH/AYkB0gH+Af8BNQGCAcoB/wNMAZMQAAJLAUwBjwFDAbMB8QH/AVgB4gL/AVYB4gL/
+ AS0BtAH4Af8BOAHFAfwB/wFZAeEC/wFXAeMC/wFCAX8BmgH+A0EBcxMAAf8DAAH/AwAB/wP8Gf8D9wH/
+ AwAB/wMAAf8DAAH/DAACjwH6Af8CSgHjAf8CQgHaAf8CggL/AsEC/ygAA0ABcAF7AX8BswH+ATEBywGK
+ Af8BAAGxAQAB/wErAZEBPgH/Ab8B5AL/AdMB7gH5Af8BzAGyAYsB/wHMAcsBqQH/AZoB3QL/AZsBqgGu
+ Af8BrgG6AbQB/wEVAVcByQH/A0wBkxAAAyMBMwFBAWoBiwH5ASsB2AL/ASUBygL/ASwB1QL/ASoB0QL/
+ ASMBywL/ATEB0QH+Af8BVwFZAWcB8gMSARkQAAMKAf8DAAH/AyEh/wMSAf8DAAH/AyIB/wwAAs4B/AH/
+ AkkB9AH/Ak8B5gH/AjsB1AH/AoAC/wKnAv8kAANAAnABfwG3Af4BNAG8AYAB/wEFAZABCwH/AUYBmQGS
+ Af8BrwHiAv8B1gHxAfoB/wHBAY4BOwH/AbsBsAGLAf8BgAHTAv8BpQGeAYMB/wHKAaUBQQH/AQkBUQHH
+ Af8DTQGWEAADQAFxASMBXwGQAfsBBQHRAv8BAAHEAv8BAAHEAv8BAAHEAv8BAAHHAv8BDwHHAf0B/wEp
+ AUkBWgH6A0gBhAMBAQIMAANIAf8DAAH/AyAh/wMRAf8DAAH/A2EB/xAAAoUB8wH/AoAC/wJYAe4B/wI1
+ AdAB/wJqAf4B/wKWAv8C7gL/HAADPAFnAWABfwG7Af4BYQHGAesB/wFiAbwB5gH/AYMByAH8Af8BlAHW
+ Av8BiwHZAfwB/wFHAaYB0AH/AUABpgHgAf8BQQG5Av8BQwGOAcAB/wFPAYgBoQH/AQQBTgHFAf8DTgGU
+ AwEBAggAAlABUgGkATEBTwGsAf0BFwHQAfkB/wEYAdQC/wEaAdEC/wEbAdEC/wEbAdEC/wEaAdEC/wEY
+ AdcC/wEVAcAB7gH/ARMBSwF/Af4DVgG7AxQBGwgAA7QB/wMAAf8DAB3/A/sB/wMAAf8DAAH/A80B/xQA
+ ApkC/wKAAv8CXwH1Af8CNQHSAf8CaQH9Af8CigL/AuEC/xQAAzIBUANXAb8BQQGWAdoB/wFbAcQC/wFZ
+ Ab0C/wFlAckC/wFPAZ8B+AH/AREBLwHcAf8BFwFGAeQB/wEMAUQB4wH/AQoBSQHjAf8BBAFUAfIB/wEA
+ AVkB/AH/AQABOQHIAf8CVQFYAe8DVAGvAiEBIgExAlsBXgHZAScBqQHqAf8BUgH2Av8BXwHrAv8BYQHm
+ Av8BXwHlAv8BXAHkAv8BXAHkAv8BYAHlAv8BYAHnAv8BXAHwAv8BSQHsAv8BFwGDAbUB/wNYAeMDNQFX
+ CAADEQH/AwAB/wPNGf8DvwH/AwAB/wMoAf8cAAKUAv8CgAL/AmQB+QH/AjcB1wH/AmcB/AH/AoQC/wLX
+ Av8QAAJZAWAB6wIAAaEB/wEwAYYB6AH/AUoBuwL/AU0BtwL/AVIBuwH+Af8BJQE+Ae0B/wEKAQwB1gH/
+ AQ8BFAHTAf8BDgESAdIB/wEOARIB0gH/ARQBGgHVAf8BGAEhAdkB/wEYASUB2QH/ARsBIAHOAf8DXAHc
+ AlkBZAHsAVQB2wL/AYoD/wGZAfUC/wGWAfMB/gH/AZMB9QL/AZkB8gL/AacB8AL/AaQB7wL/AZQB8gL/
+ AZUB9AL/AZcB8gH+Af8BlwH4Av8BgwP/AUQBsgHdAf8DXAHnCAADugH/AwAB/wM0Af8B+wL8Af8BzwHt
+ AfoB/wGkAd0B9gH/AagB3wH3Af8B2wHyAfsB/wP5Af8DKAH/AwAB/wPOAf8gAAKVAv8CgAL/AmgB/AH/
+ AjsB2wH/AmYB+wH/AoIC/wLWAv8MAANOAZQCAAG9Af8BGQFQAegB/wE+AbgC/wFBAbYC/wExAYAB9gH/
+ AREBGgHiAf8BEQEkAd0B/wEQASIB3gH/ARABIwHfAf8BDgEhAd4B/wEOAR8B3gH/AQ0BHgHeAf8BDwEd
+ AecB/wE5ATsBagH5AysBQwNZAccBWAJhAeYCWwFhAeECWwFhAeECVwFcAd8CWQFqAfIBkwHbAfQB/wHS
+ Af0C/wHJAf4C/wFeAbIB2gH/AlQBYQHuA18B4AJbAWEB4QJdAWEB4gJeAWUB5QNRAaIMAANpAf8DAAH/
+ ASUBiwGvAf8BGwGlAdgB/wEZAaEB0wH/ARkBogHUAf8BHQGoAdsB/wEjAWEBkQH/AwAB/wO5Af8oAAKa
+ Av8CgAL/AmoB/gH/AkAB4QH/AmUB+wH/AocC/wLlAv8IAAMEAQYCXAFhAdwBAQEOAbkB/wEoAZkB9QH/
+ AS8BowL/ARkBLAHiAf8BEgEfAdgB/wESASIB2gH/AREBIQHbAf8BEAEfAdoB/wEQAR8B2wH/AQ8BHwHZ
+ Af8BEQEhAeQB/wEIAREBvAH/A04BmRgAAjABMQFNAXABfwGzAf4B7wP/AdoB/AL/Ak0BcQH6AyQBNSAA
+ A84B/wMAAf8BGQFkAZkB/wEdAZEBuwH/ASYBtAHpAf8BJAGuAeEB/wEmAZoBwwH/AQkBQwFcAf8DAAH/
+ A/MB/ywAAqkC/wKAAv8CgAL/AkcB5QH/AoUB+gH/Aq4C/wL4Av8IAAMtAUYCIQFgAfsBAwEwAb0B/wEe
+ AVUB8AH/ARcBHAHWAf8BFQEhAdMB/wEVASEB1QH/ARMBIQHZAf8BEwEeAdQB/wESAR4B1AH/ARIBHwHY
+ Af8BEgEcAdwB/wNfAeADBwEKGAADCgEOAVUBXAFeAeoB9AP/Ac4B5QH8Af8DXAHcAwQBBicAAf8DLAH/
+ AyIB/wNEAf8CTAFNAf8DRAH/AwEB/wMbAf80AALGAv8ChQL/AoAC/wJPAesB/wKDAfoB/wK+Av8MAAJS
+ AVQBpgIHAaAB/wEiAS8B5gH/ARoBKgHkAf8BFwEmAeAB/wEXASkB6AH/ARQBJwHoAf8BFAEjAeEB/wES
+ ASMB4wH/ARQBJQHsAf8BKgErAW8B/AMtAUUgAAJVAVYBtAHcAeoB/AH/AakBuwHiAf8DUAGdKAADJQH/
+ AwAB/wOkAf8DDQH/AygB/wOSAf8DAAH/A5AB/zgAAu8C/wKsAv8CgQL/AmEB9wH/ApEC/wLkAv8IAAMM
+ ARACXgFlAeUBKQEtAYUB/gIrAXcB/AIrAXYB/AEhASMBhwH7ASEBIwGHAfsCKQF1AfoCIQGHAfsCKQF0
+ AfoDTgGXJAADOgFiAawBsgHuAf8BdQF7AYcB/gMvAUooAAPLAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMm
+ Af8D+QH/QAAC6gL/ArAC/wKEAv8CogL/WAADDAEQAlsBYQHhAlwBXgHOAwQBBiwAA9sB/wNTAf8DDwH/
+ Ax0B/wOCAf8D9QH/TAAC9QL/AtYC/wwAAxQBGwNRAaEDTAGTAyQBNQMDAQRoAAMQARYDWwHQA1gBxgMJ
+ AQwEAAMZASMDKAE8Ay0BRgMtAUYDKQE+Ax8BLAMGAQg0AAMPARQDUQGiA1YBvgMxAU8QAANZAckBOAGt
+ ATIB/wE0AYQBLAH/AUIBSgFCAfUDXAHOA0UBfQMfASwYAAFeAlgB3QGOAVwBIQH7AYABTQEpAfoBgQFN
+ ASkB+gGBAU0BKQH6AYEBTQEpAfoBgQFNASkB+gGBAU0BKQH6AYEBTQEoAfoBgwFNAScB+gGDAU0BJwH6
+ AYMBTQEnAfoBgwFNAScB+gGDAU0BJwH6AY4BSAEhAfsBYQJbAeEEAAMSARkDXAHUAQABpAHiAf8BAgFO
+ AZgB/wNZAcMDVwHCAWQCUwHxAW4CPgH4AXIBTQEpAfoBcgFNASkB+gFtAj4B+AFfAkwB8wNbAdkDPAFn
+ MAADVgG5AQQBNwGWAf8BCAE1AZIB/wNTAfEDNgFZCAADSgGMAR0BkAE9Af8BUgGxAacB/wHfAfMBzwH/
+ AbUB4QGpAf8BVwGrAUsB/wEwAXUBMgH+A1MB8QNXAb8DLwFKEAABbQFfAUwB8wHuAaMBVgH/AewBsAGH
+ Af8B7AGtAYEB/wHrAaoBaQH/AeoBqQFmAf8B6gGnAWQB/wHqAaQBYQH/AekBogFeAf8B6QGgAVsB/wHp
+ AZ4BVwH/AegBnAFUAf8B5wGaAVIB/wHkAZsBVgH/Ae0BiwEyAf8BbgJMAfMEAAIrASwBQwEVAUsBqAH9
+ AQAB9wL/AQoBwQHqAf8BYgEvATUB/wHyAZEBLgL/AbUBTwL/Ab4BVwH/Ae0BrQFfAf8B9AG0AVgC/wG9
+ AVYC/wGzAU4B/wHoAYgBMwH/AWkBQQE1AfkDOQFfKAADPwFtAUABRQGhAf0BOQGYAd8B/wEAAVgB3gH/
+ AQABQQG+Af8DVgG+BAADMwFSAS0BawFNAfoBiwFkAbsB/wHtAcsB+wL/AfsB7QL/AfkB9gH/AfgB9wHn
+ Af8B2gHiAbIB/wGeAcYBYAH/AToBnAEyAf8BVQFYAVUB7wMpAT4MAAFpAVgBUwHxAewBxAGsDf8B9gH5
+ Av8B9wH7Av8B/QP/AfsB/gL/AfcB+gL/AfQB9gH9Af8B8AHyAfkB/wHvAe0B9QH/AeYB7gH9Af8B5gG8
+ AagB/wFrAlMB8QQAAwEBAgJYAWIB6QEAAdsB/gH/AQsBxAHnAf8BngGFAWUC/wHMAWMC/wHNAYMB/wHb
+ AbABlgH/ARYBEwHWAf8BNgEoAasB/wHzAcIBhgL/AcgBhgL/AdIBhAH/Ad0BaQE0Af8DVgG7JAADDQES
+ Al4BZQHlAUcBogHjAf8BtgHfAf0B/wG+Ad8C/wFLAXMBkAH+A0UBfwMPARQBWAFhAVgB5gEjAckBVAH/
+ AbEB6QHnAv8B7wHkAf8B8QHlAdgB/wHzAeMB1AH/AfYB4QHNAv8B4wHIAf8B+wHRAa0B/wHRAbwBgQH/
+ AUwBkwE1Af8DWAHLAwQBBggAAWkBWAFTAfEB9QHNAbIB/wHHAcgBzAH/AYYBgAGBAf8BuwK3Bf8B3wLd
+ Af8BkgKMAf8BjwGHAYgB/wGRAYkBigH/AY8CiAH/AY4BhgGHAf8BhgJpAf8CrwG2Af8B7wHCAaYB/wFp
+ AlMB8QQAAzYBWQEhAV8BiQH7AQAB4wL/AQoBvwHiAf8BlQGEAYYC/wHUAZcC/wHZAaIB/wHYAbwBsAH/
+ ARcBGwHoAf8BLgEqAdQB/wHwAdIBqAH/AfgByQGKAv8BxQGGAf8B8QGnAV0B/wNbAcgkAANGAYEBJAFh
+ Ab0B/wGXAdAB/QH/Ad0B/AL/AbQBvgHPAf8DVAGrBAADWAHGAUkBngFSAf8B0AHaAaoB/wH9AfEB4QH/
+ AfEB5AHWAf8B8AHkAdUB/wHxAeABzAH/AfQB1wG4Af8B8gHPAakB/wHVAbMBigH/AfcBxwGcAf8ByQHV
+ AZsB/wE2AWoBKwH+A0oBiwgAAWkBWAFTAfEB8gHKAa8B/wHmAekB7AH/AckByAHJAf8B4ALfAf8D/gH/
+ Ae8C7QH/Ac4CzAH/AcwCyQH/AcwCxwH/AcoCxQH/AckCwwH/AcQCvQH/AdIB0wHaAf8B7gG/AaMB/wFp
+ AlMB8QQAAzQBVAEVAUwBqAH9AQAB5QL/AQkBvwHhAf8BkwGEAY8C/wHhAbUC/wHqAccB/wHmAdYBzAH/
+ AjYB4AH/AVkBUQHVAf8B/AHsAcUB/wHeAdQBnwH/Af0B1QGlAf8B7wGoAYIB/wNWAbYgAAMSARkCWQFk
+ AewBZQG+AfcB/wHHAfMC/wGVAbkB2AH/A1YBuwgAAV4BZQFeAeUBPwGDAZwB/wHwAesB+wL/Af4B+wH/
+ AfsB7AHkAf8B8wHkAdQB/wHyAdsBwgH/AfcB2AG3Af8B3AHAAZ0B/wHkAb0BkQH/AfoBzgGhAf8B/gHo
+ AcwB/wGZAcwBiwH/AUwBUgFIAfQDLQFFBAABaQFXAVMB8QHvAcgBrQ3/AfwC+h3/AfgB+QL/AesBvgGi
+ Af8BaQJTAfEEAAMtAUUBFQFHAXgB/AEAAeEC/wEJAcAB4QH/AZgBjwGiAv8B6QHMAv8B+wHsAf8C8gHt
+ Af8BPAE6AdkB/wFfAVsB1QP/AfAC/wH3Ae0C/wHrAdMB/wGpAX8BbQH+AzwBaCAAA1YBvgE9AZgB2wH/
+ Aa0B5wL/AV0BqAHXAf8DWQHDAwEBAggAAxABFgE8AT0BPAFoAVkBXAFZAc8BYAGOAWIB+wHRAekB0QH/
+ AfYB9AHmAv8B6QHSAf8B4gHHAasB/wHbAb0BmQH/AfcB0QGmAf8B8wHSAa0B/wH9AeAByQH/AfMB+gHn
+ Af8BUgGpAU0B/wNaAdMDDwEUAWcBWAFTAfEB9AHOAbQB/wLTAdYB/wGgApwB/wHJAscB/wP+Af8B6ALl
+ Af8BqgKlAf8BqAKhAf8BqAKiAf8BpwKgAf8BpQKfAf8BnwKWAf8BwQHDAckB/wH0AcgBrAH/AWkCUwHx
+ BAADUQGgAQABkwHTAf8BAAHrAv8BCQG9AeAB/wGNAVMBZQL/Ad8BygL/AfEB3gH/AeEBzQG8Af8BHAEg
+ AbsB/wE/ATwBsAH/AfoB2AGvAv8B6gHZAv8B1QHJAf8BXQJZAdIDBgEIBAADFAEbAy4BSAMJAQwMAANO
+ AZgBKgFvAY8B/gGbAeEC/wFnAbUB4wH/A1kBzAMGAQgYAAMYASEDSwGOAl4BWgHYAXEBfQFkAfoB2AHK
+ AagB/wH4AdQBsQH/AfIB0wGxAf8B8wHcAcIB/wHxAd4ByAL/AfQB7wH/AdcB9AHYAf8BNwF4ATEB/gNO
+ AZcBZwFXAVMB8QHzAc4BtAH/Ad4B4QHlAf8BuAG2AbcB/wHYAtYF/wHuAu0B/wHAAr4B/wG+ArsB/wG/
+ ArwB/wG+ArkB/wG9ArkB/wG3ArIB/wHPAdMB2QH/AfMByQGtAf8BaQJTAfEDEgEZAVgBXAFdAe0BAAHJ
+ Af0B/wEAAeIB/QH/ARAByQHqAf8BQQE9AUEB+QF/AToBLwH8AbMCogH/AU8BnQHAAf8BNgGWAcYB/wEo
+ AYwBvgH/AUYBiAGfAf8BwwGOAWgB/wFlAl4B5QMbASYEAAMgAS4DWAHjAjMBMgH8A08BnAgAA04BlwEk
+ AWYBhgH+AWkBzQL/AZ8B2wH+Af8CWAFiAe8DHQEqKAABKwEsASsBQwFdAWEBXQHwAf4B8AHYAf8B9QHb
+ AcQB/wHyAeEB0AH/AfMB5gHYAv8B8AHtAf8BrQHaAa0B/wEgAaQBJQH/A1EBpwFnAVYBUwHxAfABzAGz
+ Dv8C/iH/AfABxwGsAf8BZwJTAfEDUgGoAQABVwHCAf8BAAHiAv8BAAHZAfUB/wEUAd0B9wH/ARQBlwHH
+ Af8BNQFIAXcB/gFWAZ4BxwH/AYgB1wH9Af8BjQHUAfUB/wFpAcsB7gH/AT4BsQHiAf8BIAFaAZ8B/wNS
+ AagIAANZAdcB1gHPAc0B/wG4AbQBsgH/Az4B+AM6AWEDTgGXAR8BZwGLAf4BVQHCAv8BqAHmAv8BTQF8
+ AYMB/gNCAXYwAAM6AWIBfgGgAXsB/AH/AfgB8AH/AfIB4wHUAv8B7wHrAf8BywHiAccB/wErAboBOwH/
+ A1gB4wMVAR0BZQFWAVMB8QH0AdABuAH/At0B3gH/AbYCsgH/AdYC0wX/Ae4C7QH/Ab4CuwH/Ab0CuQH/
+ Ab8CugH/Ab4CuQH/Ab0CuAH/AbkCsgH/AdQB1gHaAf8B9gHMAbAB/wFnAlMB8QJaAWEB5AEAAb0C/wEA
+ AeUC/wEAAesB+AH/AScB+wH9Af8BhgP/AUUBmwHMAf8BhAG5AeIB/wGlAeMC/wGcAdoB/gH/AZYB1wH6
+ Af8BjgHSAfMB/wFHAbcB6QH/AlkBYAHrAxQBGwQAA2QB7AHXAdIB0wH/AcsByQHKAf8BjgGPAY4B/wFE
+ AUEBMgH7AW4BbwF1Af4BPgGVAckB/wGAAdMC/wFhAbIB4AH/A1kBxDgAAVUBVgFVAbEB5AH0AeUC/wH0
+ AfEB/wHpAegB2wH/AVEB1gFlAf8BQQFqAUEB+QMwAU0EAAFlAVYBUwHxAfYB0wG8Af8B0wHXAdsB/wGg
+ AZ8BoAH/A8kF/wPqAf8BqwKqAf8BqQGnAagB/wGrAakBqgH/AaoCqQH/AasCqAH/AaMBoQGiAf8ByQHP
+ AdUB/wH5AdEBtAH/AWcCUwHxAkwBaAHzAQABxQL/AQAB4gL/AQAB/QL/AScD/wGUA/8BYQGwAdAB/wGF
+ AaYBzgH/AcIB7QL/AbcB5QL/AaYB3gL/AZgB2AH6Af8BhQHTAf0B/wFHAVoBYgH2Ax0BKgQAAycBOgNY
+ AcsDiAH9AqwBqwH/AaoBqQGnAf8BvgG3AbEB/wG2AbABqgH/AV0BnQG9Af8CVQFcAeoDGAEhOAADDwEU
+ A2QB5wHzAfoB9QH/AZAB5QGfAf8BKwG0ATkB/wNIAYcIAAFlAVUBUwHxAe0BxwGuAf8B+AHxAe4B/wH4
+ AfAB7QH/AfcB8QHuAf8B9wHyAe8B/wH4AfEB7wH/AfgB8QHuAf8B+AHxAe4B/wH4AfEB7wH/AfgB8QHv
+ Af8B+AHxAe8B/wH3AfEB7wH/AfcB8wHxAf8B8QHGAaoB/wFnAlMB8QEhAVEBigH7AQABxwL/AQAB4gL/
+ AQAB+wL/ASgD/wGPA/8BYQGzAdQB/wGeAbEB0AH/AecB+wL/AdYB7wL/AboB5AL/AaIB4AL/AYwB2QL/
+ AlsBYQHhAwYBCAwAA1MBrQGkAaMBoAH/AcwBygHHAf8BxQHBAb8B/wHNAcYBwwH/AWUBXQFbAf8DUAGj
+ CAADAwEEAw8BFAMJAQwsAAM1AVcBVAGwAYgB/QFOAeYBggH/A1gBxgwAAWUBYQFTAfEB7AGdAUsB/wHk
+ AY0BPQH/AeQBjwFAAf8B5AGNAT4B/wHkAYwBPQH/AeQBjAE8Af8B5AGMATsB/wHkAYsBOgH/AeQBigE5
+ Af8B5AGJATcB/wHkAYkBNgH/AeQBiAE2Af8B4wGIATcB/wHsAYsBLAH/AWcCUwHxAVgBXQFgAe0BAAHK
+ Av8BAAHFAfAB/wEiAUsBXwH7ATABfwGVAf4BagP/ATgBhgG3Af8BoAGxAc4F/wHxA/8BzAH0Av8BrgHu
+ Av8BWwF/AZoB/gNAAXAQAAMdASoDZAHxAdEBzwHNAf8B5gHjAeEB/wGzAbEBsAH/AVoBWQFXAf8CRQFE
+ AfkDWgHkA1oB2wNXAegDXgHlAy4BSDAAAVIBUwFSAagBVwFcAVcB3wMYASEMAAFrAl8B8wH/AeEBoQL/
+ AccBggL/AcQBaQL/AcEBYwL/Ab4BXQL/AboBVwL/AbYBUQL/AbIBSwL/Aa4BRAL/AaoBPQL/AaYBOAL/
+ AaMBMgL/AZ4BKgL/AakBMAH/AWcBWQFXAfICWQFcAckBAAHBAf0B/wEAAc8B9gH/ARUBQAFJAf0BAAGJ
+ AbUB/wFYA/8BQQFHAWoB+QNWAcEBdAGCAYkB+QG9AdUB4QH/AZ8ByQHdAf8BSQJiAfYDSwGPGAADLQFG
+ A1wB5wHCAcABvQH/AdYB0wHRAf8BrAKpAf8BqAGnAaYB/wGvAa0BrAH/AbsBuQG4Af8DfwH+A1YBuAMJ
+ AQxIAAFdAlkB1wGEAVwBUwH7AXMCTQH6AXMCTQH6AXMCTQH6AXMCTQH6AXMCTQH6AXMCTQH6AXMBTQFM
+ AfoBcwFNAUkB+gFzAU0BMQH6AXMBTQEuAfoBcwFNASsB+gFzAU0BKQH6AYQBRAElAfsBYAJaAd4CRgFH
+ AYEBKAFNAXkB+gEoAVIBfQH6AS8BZQGCAfkBPgFcAXoB+AFIAWQBegH3A1QBrwQAAykBPwJIAUkBhwJF
+ AUYBfwEhAiIBMSAAAxIBGQNOAZgDZQHlAXoCdwH5AXUCcwH8A2IB9gNeAdkDQAFxEAADOgFhA1kBxwNZ
+ AcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1wBzgNZAcMDNAFVRAADVwHC
+ A0QBezgAA2EB4gNnAfEDYQHuA2EB7gNhAe4DYQHuA2EB7gNhAe4DYQHuA2EB7gNhAe4DYQHuA18B8ANl
+ AeUEAANhAe4D4gH/A90B/wPaAf8C2wHaAf8D2QH/A9gB/wPYAf8D1wH/A9YB/wPVAf8D1AH/A9MB/wPg
+ Af8DmQH/A1cBvQwAA0gBhgJNATIB+gNDAXcsAANcAdQBAQEdATIB/wNJAYkDEwEaMAABogKjBf8B9gLw
+ Af8B9gLvAf8B9gLvAf8B9ALvAf8B9ALtAf8B9ALtAf8B9ALtAf8B8gLrAf8B8wLrAf8B8gLoAv8C+wH/
+ AaICoQH/BAADfQH3BP8C9AHzAf8B/QH4AfUC/wH2AfMB/wH9AfQB8QH/AfwB8wHwAf8B+wHwAe0B/wH5
+ AfAB7QH/AfgB7wHsAf8B9wHtAeoB/wHyAe0B6gH/AecB5gHnAf8D9QH/A8YB/wNZAcMIAAMOARMDXwHg
+ ASoBxAFFAf8BRwFqAUEB+QM4AV4oAAMpAT8BUAFSAWkB9wFbAZoBrgH/A1sB0ANCAXUDBgEIKAADnwH9
+ AfoC8wH/AeoC4gH/AekC4QH/AekC4QH/AegC3wH/AecC3gH/AeYC3gH/AeYC3QH/AeQC2wH/AeQC2gH/
+ AeIC1wH/AfUC6wH/AZ4CnAH9BAADYgH2AfwC+wH/Ae4B7AHqAf8BuwHMAdoB/wGTAbMBywH/AZgBtQHL
+ Af8BlgG1AcsB/wGVAbQBygH/AZUBswHJAf8BlAGzAckB/wGOAa4BxwH/AakBugHIAf8B3gLcAf8B7gLt
+ Af8DvQH/A1YBwQgAA0ABcQE1AZoBMAH/AUMB6QGSAf8BNwHSAV8B/wFMAV8BTAHzAy4BRygAA1EBogFo
+ AcQB3wH/AZsB5AHyAf8BHAGKAa0B/wNMAZEDAgEDJAABnwKeAv0C9gH/AfUC7QH/AfMC7AH/AfMC7AH/
+ AfIC6gH/AfEC6QH/AfEC6QH/AfAC6AH/Ae8C5gH/Ae8C5QH/Ae0C4wH/AfgC7gH/A5wB/QQAA2IB9gL/
+ Af4B/wHtAeQB5wH/AUMBswHYAf8BAAHLAesB/wEJAdAB7QH/AQwB0QHuAf8BDAHUAfEB/wENAdIB7gH/
+ AQ8B0gHuAf8BBgHPAe4B/wEwAaQBzAH/AdUBzwHTAf8B9gHyAfAB/wPAAf8DVgHBBAADBQEHAVYBWAFW
+ AbwBRgHPAWUB/wFnAegBqwH/AVgB6AGjAf8BPAHOAV8B/wFZAWABWQHrAyQBNSQAAzEBTgEIAWgBpQH/
+ AZcB5gH5Af8BhgHoAfUB/wFAAU8BjwH9AyIBMiQAA6AB/QH7AvcB/wHeAtoB/wHeAtkB/wHfAtoB/wHe
+ AtkB/wHdAtkB/wHdAtkB/wHdAtgB/wHcAtYB/wHbAtYB/wHaAtQB/wH4AvEB/wGeAp0B/QQAA2UB9gT/
+ AeoB5AHmAf8BSAG7AeEB/wEbAdwC/wEgAd0C/wEIAdMB/QH/AQMB0AH3Af8BBgHUAfwB/wEGAd0C/wEA
+ Ad0C/wEuAa4B2AH/AdUBzwHTAf8B9wHzAfEB/wPBAf8DVgHBBAADLgFIAUMBfwE8Af4BiQHuAbUB/wGW
+ AfMBxQH/AYoB6wG4Af8BZAHsAa8B/wE7AcwBXQH/AVcBXAFXAd8DGgEkIAADCAELA1MBrQEZAaEBzAH/
+ AZ0B0wHdAf8BqgHiAfAB/wNUAaskAAOoAf0B0gLRAf8BGQIYAf8CDQEMAf8BEQEQAQ8B/wENAQwBDQH/
+ ARACDwH/ARICDwH/AxIB/wEQAhEB/wEJAQwBDQH/AxUB/wHLAsoB/wOoAf0EAANlAfYE/wHpAecB6QH/
+ AVcBtwHhAf8BVgHQAf4B/wFWAdUC/wE1AakB3AH/AToBWAGHAf8BDQGfAdoB/wEAAcEC/wEAAbwC/wEr
+ AaUB1wH/AdgB1AHWAf8B+AH0AfIB/wLCAcMB/wNWAcEDAgEDA1ABmgFXAc4BggH/AaEB+gHRAf8BRwHN
+ AWEB/wFjAeYBpQH/AZUB8wHIAf8BZwHyAbgB/wE6AcgBWAH/AVsBXgFbAdADFAEcIAADEgEYA1YBswFb
+ AcYB4QH/AfAD/wGOAZoBogH/AzMBUgMPARQcAAOoAf0BxgLIAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AbwCvQH/A6gB/QQAA2UB9gT/AekB6AHrAf8BWgG5AeEB/wFkAdUB/gH/
+ AWYB3QL/AVwBrAHKAf8BVgFDAT8B/wEtAZ0ByQH/AQABuAL/AQABrwL/ASwBogHXAf8B2gHVAdYB/wH6
+ AfYB9AH/AcQCxQH/A1YBwQMcAScBUQFtAVEB9wGYAfwByQH/AV4BngFzAf4BWgFhAVoB5AFCAWYBQgH1
+ AVcB4wGYAf8BkQH5AcwB/wFnAfcBwQH/ATYBwwFPAf8BVQFXAVUBtwMKAQ0gAAMKAQ4DTwGlAY0BvgHP
+ Af8BmAHHAeAB/wFCAVkBaQH1AVgCXAHRAxoBJRgAA6gB/QHKAc8B0AH/AQEBCQEKAf8DAAH/AS4BMQEq
+ Af8BvQG2AZYB/wEMAR4BGgH/ARUBGwESAf8BHAEYAQ0B/wMAAf8BWAEmAQUB/wMAAf8BwgK/Af8DqAH9
+ BAADZQH2BP8B5gHnAesB/wFgAbsB4gH/AZcB5AL/AZYB6AL/AZABxwHdAf8BiwGSAZMB/wFXAbwB3gH/
+ ARIBxQL/AQoBwAL/ATIBpgHYAf8B1wHUAdcB/wH7AfcB9QH/A8YB/wNWAcEDRwGCAUUB0AFlAf8BSgHV
+ AWoB/wFYAVoBWAHAAwABAQMtAUUBXQFhAV0B4gE8AcsBWAH/AYEB+QHGAf8BZQH+AcoB/wEvAcABSAH/
+ A1IBqQMEAQUgAAMKAQ4DVwHFAT0BlAG7Af8BOwGYAbsB/wEcASEBJgH/A1ABnwMAAQEUAAOoAf0B0QLM
+ Af8BuAGYAVUB/wFbAVwBRgH/AbYCuAX/AUQCTgH/AVQBTQEyAf8BWgFZAUEB/wEtASEBDAH/Ac4BXQEc
+ Af8BOQERAQAB/wHJAb4BvQH/A6gB/QQAA2gB9gT/AfEB8AHxAf8BgwG5AdoB/wFYAbcB3gH/AVwBuAHe
+ Af8BXAG/AecB/wFqAcsB8wH/AU0BuwHoAf8BOAGuAeAB/wEuAaoB3AH/AVUBqgHRAf8B4QHfAeAB/wH6
+ AfcB9gH/A8gB/wNWAcEBWAFiAVgB6QEvAdABTQH/AVkBWwFZAcQDDQESCAADHAEoAVQBVgFUAasBJQG0
+ ATEB/wFZAfIBswH/AV0B/wHQAf8BKgG7AT4B/wNLAY4kAAI+AT8BbAGAAWoBZwH/AZMBEwEJAf8BDgIA
+ Af8BHQIAAf8DQAFwFAABpgKoAf0B0QHMAcoB/wHXAa8BYwH/AfwB4QGuAf8B9gL3Af8B+wH+Av8B5AHX
+ AcUB/wHLAa8BZwH/AY8BZQFDAf8BzAGSATcC/wGRASkB/wHJATcBAAH/AcoBvQG7Af8BpQKoAf0EAANo
+ AfYE/wH7AfoB+QH/AeYB6gHuAf8BnwGnAbEB/wGiAacBrgH/AZ8BpwGvAf8BwAHMAdcB/wGwAbUBvQH/
+ Aa4BrQGzAf8BnwGhAagB/wHeAd8B4wH/Ae4C7QH/A/UB/wPJAf8DVgHBAUgBYgFFAfYBWQFcAVkBzwMU
+ ARsQAAMEAQUBPQE+AT0BagFIAWIBRwH2AUQB6AGWAf8BVAH/AdIB/wEjAbgBNAH/AUUBRgFFAX4gAAMB
+ AQIDRwGCAb4BUQE3Af8BYwEKAQYB/wEJAgAB/wFHATcBLQH5ASwCKwFDEAABpwKoAf0B0AHKAckB/wHN
+ AaEBVQL/AdwBnQH/Af0B5QHBAf8B9gHjAc0B/wH+AeABrgL/AdoBmgH/AfkBwAFhAf8B/AGnAT4C/wGA
+ AR4B/wHQATQBAAH/AckBvAG6Af8BpAKoAf0EAANoAfYE/wP3A/8B/gH/AdsB1gHUAf8BuwG1AbIB/wHJ
+ AcIBwAH/AbsBtQGyAf8BzAHHAcQB/wG7AbUBsgH/AdABywHIAf8B9wH1AfQB/wLqAekB/wP2Af8DywH/
+ A1YBwQMYASEDEQEXHAADJAE2AVoBXgFaAdUBLQHUAVkB/wFQAfwBvgH/AR8BtwExAf8DPAFmIAADAgED
+ A1MBqgHGAWABRgH/AT8CAAH/ARACAAH/AV0CWQHXAxgBIQwAAacCqAH9Ac8BygHIAf8BzQGXAUMC/wHL
+ AYUC/wHOAY4C/wHPAZAC/wHNAY0C/wHEAWkC/wG2AU4B/wH8AZYBMQH/AfoBWgESAf8ByAElAQAB/wHI
+ AboBuQH/AaUCqAH9BAADaAH2BP8D+QH/A/oB/wH5AvoB/wPLAf8BuAK2Af8BwQK/Af8BuAK2Af8DxAH/
+ AfAC8QH/Ae4C7wH/A+sB/wP5Af8DzQH/A1YBwSgAAxABFQFPAVABTwGbARoBvgEyAf8BRgH1AaQB/wFA
+ AagBQAH9AzEBTiAAAxABFgFcAlkBzAG5AVMBNQH/ASACAAH/ASQCAAH/AVECUAGfDAABpwKoAf0BzQHF
+ AcQB/wHQAYIBJAL/AbkBSQL/Ab8BWgL/AcEBXQL/AbwBVAL/AbABQwL/AZgBLQH/Af0BYwEWAv8BPgEA
+ Af8BzQEQAQAB/wHGAbYBtQH/AaUCqAH9BAADawH2BP8D+wH/A/kB/wP6Af8B+gL7Af8D5QH/A9UB/wPh
+ Af8D9AH/A/EB/wPtAf8D6wH/A/cB/wPPAf8DVwHCMAABOQE6ATkBYAFYAV8BWAHjAS8B3QFUAf8BWgFi
+ AVsB7SQAAx0BKgFiAlgB6QGfAT4BHAH/AQsCAAH/AUACAAH/AzcBWwgAA6gB/QHUAssB/wGYAUgBIQH/
+ AbQBZwEwAf8BswGDATkB/wG0AYYBOgH/AbMBggE3Af8BswFjAS8B/wGzAVUBJwH/AbMBQwEbAf8BtQEu
+ AQsB/wGXARoBCQH/AcsBvwG+Af8BpwKoAf0EAAN8Afgg/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwjQA
+ Ax0BKQFXAVoBVwHFAVUBYgFVAe8oAAMqAUABawFJAUgB9gGAASsBDgH/AQgCAAH/AWACWQHrCAABowKk
+ Bf8B2wHcAeAB/wLYAd4B/wLZAd0B/wHYAdkB3QH/AdgB2QHeAf8B2AHZAd4B/wHYAdoB3gH/AdgB2wHf
+ Af8B1wHcAeAB/wHZAdwB3wL/AvwB/wOiAf8EAANbAcsDmQH+A6sB/QOrAf0DqwH9A6sB/QOrAf0DqwH9
+ A6sB/QOrAf0DqwH9A6sB/QOsAf0DoQH+A2IB9QM7AWVsAAM7AWQBZQJIAfYBWQJCAfUBUgJRAacIAANe
+ Ad0DYgHvA2EB7QNhAe0DYQHtA2EB7QNhAe0BYAJhAe0DYAHtA2AB7QNgAe0DYQHuA2IB7wNfAeCTAAEB
+ AwQBBQMQARYDKQE/Az4BbANGAYADRAF7AzgBXAMgAS4DCgENAwEBAgwAAVoCXQHTAUwBawFwAfMBWAFi
+ AWMB7wFYAWIBYwHvAVgBYgFjAe8BWAFiAWMB7wFYAWIBYwHvAVgBYgFjAe8BWAFiAWMB7wFYAWIBYwHv
+ AVgBYgFjAe8BWAFiAWMB7wFZAWcBbAHyAVsCXgHZCwABAQMGAQgDCgENAwoBDQMKAQ0DCgENAwoBDQMK
+ AQ0DCgENAwoBDQMKAQ0DCgENAwcBCgMDAQQLAAEBAwYBCAMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMK
+ AQ0DCgENAwcBCgMDAQQTAAEBAwcBCQMVAR0DOQFfA1MBsAJYAWEB5gFfAYYBjgH7AU0BqAGrAf0BTgJd
+ AfADWQHSA1IBqQNGAYADJAE2AwQBBggAASkBoAHSAf8BHwH7Av8BFQHxAv8BGAHwAv8BGQHwAv8BGQHx
+ Av8BGQHxAv8BGQHxAv8BGQHxAv8BGQHwAv8BGQHwAv8BFwHwAv8BHQH7Av8BLQGsAdgB/wQAAwQBBQMk
+ ATYDRAF5A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNHAYIDMwFSAwsBDwME
+ AQUDJAE2A0QBeQNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0UBfwMpAT8DAwEECAADBAEF
+ AyQBNgNEAXoCXgFhAdoBUQFwAXoB/AGvAdUB4wH/AcQB8gH9Af8BtwHwAv8BqgH+Av8BnwH9Af4B/wGI
+ AdoB5QH/AVoBfwGPAf4BUAFSAWUB9ANWAbkDNQFXAwsBDwQAASsBcwGaAfwBDwHiAv8BBgHZAv8BCAHY
+ Av8BBwHXAv8BCQHfAv8BCgHlAv8BCgHlAv8BCgHgAv8BCAHZAv8BCQHZAv8BBgHZAv8BDQHjAv8BKwF2
+ AaAB/AQAAx0BKgG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1
+ ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/A1IBqQM1
+ AVgDHQEqAbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEA
+ Af8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wNLAY4DFAEbAwABAQQAAx0BKgG1ATEBAAH/
+ AfMBSQEAAf8BlQG/AdMB/wHvA/8B1AH7Av8BqQHmAv8BkgHZAv8BjgHrAv8BjQHzAv8BnQH9Av8BqwP/
+ AV8BxAHXAf8BVQEUAQAB/wNTAa0DNQFYBAABKwFzAZoB/AEpAeAC/wEcAdUC/wEQAdMC/wEFAdAC/wEA
+ AZ4B9gH/AQABiQHmAf8BAAGKAeUB/wEAAZoB8wH/AQAByQL/AQABzAL/AQAByQL/AQMB1AL/ASsBdQGg
+ AfwEAAG1ATEBAAL/AV8BAAH/AbUBMQEAAv8BqAFJAv8BpwFIAv8BpgFGAv8BpAFDAv8BogE/Av8BoAE7
+ Av8BnQE2Av8BmwEyAv8BmwEyAf8B5QE4AQ4C/wGbATIB/wG1ATEBAAH/A0gBiAG1ATEBAAH/AbUBMQEA
+ Av8BZQECAv8BrwFVAv8BpQFEAv8BpAFCAv8BowFAAv8BoAE8Av8BnwE6Av8BnQE2Av8BmwEyAf8BtQEx
+ AQAB/wNUAa8DNgFZAxsBJgQAAbUBMQEAAv8BXwEAAf8B+wFjAQIB/wGYAcMB2AH/AdkD/wGrAeYC/wGG
+ AdMC/wFfAcoC/wFkAd0C/wFhAeIC/wGBAegC/wGRAfcC/wFXAcIB2wH/AWABMgEMAf8B6QFFAQAB/wNI
+ AYgEAAErAXIBmwH8ATsB4AL/AS4B1gL/AR8B1AL/AREB2wL/AQABgAHjAf8CAAFjAf8CAAFdAf8BAAFZ
+ AdwB/wEAAccC/wEAAb4C/wEAAbsC/wEAAcYC/wErAXQBoAH8BAABtQExAQAC/wFpAQsB/wG1ATEBAAL/
+ AbIBXAL/AbEBWwL/AbEBWgL/Aa8BVgL/AasBUAL/AagBSgL/AacBRwL/AaQBQgL/AaIBPgH/AeUBOwET
+ Av8BogE+Af8BtQExAQAB/wNLAZABtQExAQAC/wFgAQAB/wG1ATEBAAH/AbUBMQEAAv8BrwFVAv8BrgFT
+ Av8BrQFRAv8BqgFMAv8BqAFIAv8BpQFEAv8BowFAAf8B5QE8ARUB/wG1ATEBAAH/A0wBkQMUARsEAAG1
+ ATEBAAL/AWkBCwH/AfsBYwECAf8BiQG/AdsB/wG5AfAC/wGMAdYC/wFRAcQC/wFCAbwC/wFOAc8C/wFL
+ AdMC/wFWAdoC/wFlAecC/wFGAbgB3QH/AWABNQERAf8B6QFFAQAB/wNLAZAEAAErAXIBmwH8AUYB3wL/
+ AT4B2AL/AS0B0wL/ASEB3AL/AQIBrwHzAf8CAAFMAf8CAAFBAf8BAAGVAeoB/wEAAbsC/wEAAbAC/wEA
+ Aa4C/wEAAbkC/wErAXMBoAH8BAABtQExAQAC/wGIAR0B/wG1ATEBAAL/Ab4BhwL/Ab4BhgL/AbwBgwL/
+ AboBaQL/AbcBZAL/AbMBXQL/AbABVwL/Aa0BUgL/AaoBTQH/AeUBPwEaAv8BqQFKAf8BtQExAQAB/wNL
+ AZABtQExAQAC/wGSASUC/wFqAQgB/wG1ATEBAAL/AboBaQL/AbgBZAL/AbYBYgL/AbQBXgL/AbABVwL/
+ Aa8BVQL/Aa0BUQH/AeUBQQEeAf8BtQExAQAB/wNUAa8DNQFYAwMBBAG1ATEBAAL/AYgBHQH/AfsBYwEC
+ Af8BXwG3Ad4B/wGXAd8C/wFUAcUC/wEpAbAC/wEqAa8C/wFBAcQC/wEtAcAC/wE9AcoC/wFNAdcC/wE2
+ AbAB4AH/AWABOQEXAf8B6QFFAQAB/wNLAZAEAAErAXIBmwH8AVoB4wL/AVIB3AL/AUEB2QL/ATAB4AL/
+ AQABYQG3Af8CAAEKAf8CAAEGAf8BAAFOAaoB/wEAAb0C/wEAAbMC/wEAAbAC/wEAAbsC/wErAXQBoAH8
+ BAABtQExAQAC/wGVATEB/wG1ATEBAAL/AcgBmgL/AcgBmAL/AcYBlgL/AcQBkAL/AcABiwL/Ab0BhAL/
+ AbkBaAL/AbYBYQL/AbIBXAH/AeUBQwEhAv8BsAFXAf8BtQExAQAB/wNLAZABtQExAQAC/wGfAToC/wGf
+ AToC/wFhAQAB/wG1ATEBAAL/AcMBjgL/AcABiQL/Ab4BhAL/AboBaQL/AbgBZAL/AbUBYAH/AeUBQwEh
+ Av8BsAFXAf8BtQExAQAB/wNMAZEDEwEaAbUBMQEAAv8BlQExAf8B/AFkAQIB/wFIAa4B4AH/AV8BzQL/
+ AUIBvAL/AUMBvgL/AVEByAL/AWUB1QL/AVEBywL/AToBwgL/ATUBxgL/ASABpgHiAf8BZgFAAR8B/wHr
+ AUYBAAH/A0sBkAQAAS4BcwGdAfwBigHqAv8BgAHiAv8BWQHeAv8BSwHlAv8BDQGZAc8B/wEAAQUBGgH/
+ AgABFAH/AQABiQHDAf8BEQHFAv8BEgG7Av8BDgG5Av8BFQHDAv8BKwF1AaEB/AQAAbUBMQEAAv8BoQFG
+ Af8BtQExAQAC/wHTAawC/wHTAa0C/wHRAakC/wHOAaQC/wHLAZ4C/wHHAZUC/wHEAZAC/wHAAYoC/wG9
+ AYQB/wHlAUgBKQL/AboBaQH/AbUBMQEAAf8DSwGPAbUBMQEAAv8BqwFOAv8BqwFOAv8BkwEnAf8BtQEx
+ AQAC/wHOAaAC/wHMAZwC/wHJAZcC/wHFAZIC/wHCAYsC/wG/AYcB/wHlAUoBLgL/AboBaQH/AbUBMQEA
+ Af8DVAGvAzUBWAG1ATEBAAL/AaEBRgH/Af4BZQECAf8BQwGqAeEB/wGUAd4C/wGZAeMC/wGQAeIB/gH/
+ AVoByQH7Af8BYQHQAfsB/wGLAd0B/QH/AZoB4gL/AY0B3QL/ATUBqAHiAf8BpgFkAT0B/wHxAUgBAAH/
+ A0sBjwQAATkBoAHSAf8BowH4Av8BmQHuAv8BhgHqAv8BZAHoAv8BUQHnAv8BKgHGAe4B/wEeAcIB7AH/
+ ASsB3QL/ATQB0AL/AS0ByAL/AS0ByQL/AT0B2AL/ATYBpwHYAf8EAAG1ATEBAAL/Aa4BXAH/AbUBMQEA
+ Av8B3AG+Av8B3AG+Av8B2gG5Av8B2AG1Av8B1QGvAv8B0QGpAv8BzgGiAv8BygGaAv8ByAGXAf8B5QFN
+ ATQC/wHDAY4B/wG1ATEBAAH/A0QBfAG1ATEBAAL/AbgBZAL/AbgBZAL/AbgBZAL/AYgBFQH/AbUBMQEA
+ Av8B1QGtAv8B0gGoAv8B0AGjAv8BzQGeAv8BygGZAf8B5QFQATcC/wHFAZIC/wHFAZIB/wG1ATEBAAH/
+ A0IBdQG1ATEBAAL/Aa4BXAL/AWUBAgH/AWYBowG8Af8BOAGdAc4B/wFWAb0B6AH/AZcB2gH4Af8BjwHK
+ Ae0B/wGWAdMB9AH/AZEB1AH1Af8BUwG6AecB/wEuAZYBygH/ATgBUwGNAf8B7AG0AYMB/wH1AUoBAAH/
+ A0QBfAQAAVkCXAHMAVwBeAGHAfgBTwFoAW8B8wFMAWgBbwHzAUwBaAFvAfMBTQFoAW8B8wFPAWoBbwHz
+ AU0BagFvAfMBUwFkAW0B8QFRAXEBhQH3AUwBqgHUAf8BWAF/AakB/gFcAXcBhwH4AVkCXQHSBAABtQEx
+ AQAC/wG7AYgB/wG1ATEBAC3/AbUBMQEAAf8DJQE3AbUBMQEAAv8BxAGQAv8BxAGQAv8BxAGQAv8BqgFM
+ Af8BtQExAQAC/wH2Aewd/wG1ATEBAAH/Ay4BRwG1ATEBAAL/AbsBiAL/AWUBAgX/A/4B/wG+AdgB6wH/
+ AUsBpwHVAf8BTQGwAdwB/wFQAbQB3gH/AToBmAHHAf8BmQG5AdAB/wHwAfEB8gH/A/wB/wP+Af8B9gFK
+ AQAB/wMlATcEAAMQARUDHAEoAxoBJAMZASMDGgElAxsBJgMbASYDGwEmAxIBGANIAYUBuwGnAagB/wNl
+ AeUDLgFHAw0BEQQAAbUBMQEAAv8ByQGfAv8BsgFhAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQEx
+ AQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/
+ AyoBQAMEAQUBtQExAQAC/wHSAagC/wHOAaAC/wHSAagC/wHSAagC/wGZATAB/wG1ATEBAAH/AbUBMQEA
+ Af8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8DQAFxAwcBCgG1
+ ATEBAAL/AckBnwL/AbIBYQL/AWUBAgL/AWUBAgL/AWUBAgH/Af4BZQECAf8B/gFlAQIB/wH8AWQBAgH/
+ Af0BZAECAf8B/gFlAQIC/wFlAQIC/wFlAQIC/wFlAQIB/wMqAUADBAEFKAADSAGEAdMBwAG9Af8DYQHa
+ AxUBHQgAAbUBMQEAAv8B1QG1Av8B1QG1Av8B1QG0Av8B1gG1Av8B1QGzAv8B1QGzFf8BtQExAQAB/wMq
+ AUADBAEFBAABtQExAQAC/wHeAb4C/wHeAb4C/wHdAbsC/wHeAb4C/wHdAbsC/wHdAbsR/wG1ATEBAAH/
+ AysBQgMHAQoDAAEBBAABtQExAQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1
+ ATEBAAH/AyoBQAMEAQUQAANAAW4DWAG8A04BmAMTARoIAAMIAQsDWgHFAd8BzwHQAf8DWAG8DAABtQEx
+ AQAC/wHgAccC/wHgAccC/wHgAccC/wHgAccC/wHgAccF/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1
+ ATEBAAH/AbUBMQEAAf8DHQEqAwQBBQMCAQMEAAG1ATEBAAL/AeYBzQL/AeYBzQL/AeYBzQL/AeYBzQL/
+ AeYBzQX/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8DHQEqAwQBBQwAAbUBMQEAAv8B4AHH
+ Av8B4AHHAv8B4AHHAv8B4AHHAv8B4AHHBf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1
+ ATEBAAH/Ax0BKgMEAQUDAgEDEAADNgFYAYcCfwH7AbgCpAH/A1YBtgMgAS8DHQEqA1IBpwHOAb4BvwH/
+ AYACegH8AzcBWgwAAbUBMQEAFf8BtQExAQAB/wMrAUIDBwEKAwMBBAMDAQQDAgEDAwABAQwAAbUBMQEA
+ Ff8BtQExAQAB/wMrAUIDBwEKAwMBBAMCAQMDAAEBEAABtQExAQAV/wG1ATEBAAH/AysBQgMHAQoDAwEE
+ AwMBBAMCAQMDAAEBHAADRgF/AbICpQH/AccCtgH/A38B/gGkApYB/QHUAsQB/wHDArkB/wNMAY8QAAMB
+ AQIBtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/Ax0BKgMEAQUDAgEDHAADAQEC
+ AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wMdASoDBAEFIAADAQECAbUBMQEA
+ Af8BtQExAQAB/wG1ATEBAAH/AbUBMQEAAf8BtQExAQAB/wMdASoDBAEFAwIBAy8AAQEDNwFaA1sBywFn
+ AmQB8QNnAfIDXgHQAzsBZQMBAQIQAAMKAQ4DHwEsAyUBNwMtAUYDOQFfA0IBdANIAYgDTgGXA1IBpgNW
+ AbMDVwG9A0EBcxQAAx0BKQJaAVwBzQJBAYgB+QM9AWkYAAM3AVsCQgFvAfUCXgFhAdoDJQE3EAADCAEL
+ AzcBWgFcAlkByQFlAVIBSAH0AXwBTQEpAfoBewFLASkB+gFpAkIB9QFdAloB0wE/Aj4BbAMNARIoAAMK
+ AQ4DNgFZA1UBsQNUAa4DNAFVAwwBEAwAAlkBXQHSAUECYgH2AT4BXwF5AfgBIgFfAYwB+wEkAX8BnQH+
+ ARUBnQHTAf8BGgGmAd4B/wEdAbEB5wH/AR4BugHtAf8BHAHGAfUB/wEZAawB9AH/ASkBLAFzAfwDVAGv
+ AxEBFwgAAx4BKwJZAVwBzAIZAfEB/wIFAfsB/wIlAZEB+wM+AWsQAAM3AVsCSAFxAfYCOgH3Af8CTAH1
+ Af8CWQFdAdcDJgE4CAADGQEjA1YBswG9ATgBCwH/AdABTQELAf8BywE+AQAB/wHBATABAAH/Ab4BNQEA
+ Af8BwgE8AQAB/wHBATgBAAH/AbIBIwEAAf8DWwHIAyABLxwAAx0BKgNIAYgDWAHdAXcBLwE9AfwB5AFk
+ AY8B/wHMAWkBggH/AWYCTQH6A1MBqgwAAUEBhwGWAfkBoQP/AaUD/wGeA/8BmQP/AYwD/wFmA/8BVAP/
+ AUEB/AL/ASsB+QL/ASEB3wH9Af8BEgGrAv8BAAE+Ac4B/wNaAdgDKgFBBAACXAFgAdQCIQHzAf8CAAH6
+ Af8CAAHsAf8CAAHxAf8CIQGSAfsDPgFrCAADNgFZAkcBcQH2AiUB7wH/AiYB7AH/AjcB9gH/AlwB9wH/
+ AlcBXAHfBAADGAEiAWACWwHWAdcBVwEaAf8B2AFQAQUB/wHAATIBAAH/AcgBTgEUAf8B2AGQAU8B/wG6
+ ATwBAwH/AacBIwEAAf8BqgEqAQAB/wG4ATUBAAH/AcIBNgEAAf8BZQJeAeUDIwEzDAADBgEIAzsBZANX
+ AcIBXwJMAfMBuAE8AVMB/wHkAV8BjwH/Ae0BjwGpAf8B9wGJAaEC/wGgAaYB/wH3AaQBqAH/A1oB3gwA
+ AVQBYQFlAe4BxAP/AcQD/wGzA/8BqQP/AZwD/wGKAfsC/wFiAfYC/wFQAfEC/wE+AfAC/wErAdsB9wH/
+ ARABrgH7Af8BAAGpAv8BAAFnAecB/wNaAdMDCQEMAlkBZwHyAhsC/wIAAfgB/wIAAesB/wIAAecB/wIA
+ AesB/wI+AX8B+AI5AToBYAMyAVECSgFtAfQCFAHpAf8CGgHmAf8CJwHqAf8CMQH0Af8CYgL/AlEBhAH3
+ AwcBCgFVAlMBrQHcAV4BIAH/AdoBUAEBAf8BxAExAQAB/wHEATIBAAH/AesBywGzAf8B+AH/Af4B/wHj
+ Aa0BjAH/Aa4BHgEAAf8BrAEoAQAB/wGlASQBAAH/Aa8BLQEAAf8BwQE1AQAB/wFcAloBzQMPARQEAAMJ
+ AQwDWQHHAX8BRgFWAf4BzQFNAWEB/wHkAYMBmAH/AecBpwG1Af8B4AHHAcsB/wHaAckBzAH/AeoBhQGa
+ Av8BkwGaAf8B9wGcAaAB/wNbAdkMAAFcAmQB5wHCA/8BxwP/AbcD/wGuA/8BpAP/AZkB/gL/AYgB+wL/
+ AWAB9gL/AU4B8QL/ATwB7QL/ASkB5AL/ARYB7AL/ARYB3AL/AlkBZAHsAxYBHwMxAU4CWQFoAfICEAH6
+ Af8CAAHxAf8CAAHlAf8CAAHfAf8CAAHjAf8CHwGsAf0CIQGOAfsCAQHjAf8CDAHfAf8CGQHkAf8CJwHu
+ Af8CSwH5Af8CUgFvAfQDOAFeAy0BRQHEAUgBFwH/AegBYAERAf8BzwE6AQAB/wHLAToBAAH/AcYBMwEA
+ Af8B3wGfAWMB/wHvAd8B0AH/AdUBhQFBAf8BtAEmAQAB/wGxASwBAAH/AawBKQEAAf8BpQEkAQAB/wG3
+ ATQBAAH/AbIBIwEAAf8BPgI9AWoEAAMdASoBdAFRAVIB9wHmAZUBpAH/AeUBvwHFAf8B5QHaAdsB/wHk
+ AeMB4QH/AeUB5AHhAf8B4QHSAdUB/wHrAYUBmQL/AZUBmwH/AfUBlwGcAf8DWwHZDAABWgJgAd4ByAP/
+ AdID/wHBA/8BuAP/Aa4D/wGlA/8BmQP/AYgB+wL/AWAB9gL/AU4B8QL/AT0B7gL/ASoB7wL/AR0B4gL/
+ AkwBYgHzAyEBMQQAAy8BSgJTAWkB8QIJAfUB/wIAAeoB/wIAAd8B/wIAAdcB/wIAAdsB/wIAAdwB/wIA
+ AdcB/wINAd4B/wIaAecB/wI5AfQB/wJIAXEB9gM2AVkEAANUAa8B5gFoASUB/wHiAUsBAAH/AdUBPwEA
+ Af8B0gFAAQAB/wHIAS8BAAH/Ac4BUQEUAf8B5QGwAYkB/wG+AS0BAAH/AbkBLwEAAf8BtQEvAQAB/wGy
+ ASwBAAH/AawBKAEAAf8BqgEpAQAB/wHAATcBAAH/AV0CWQHSBAADGgElAWYBRwFZAfUB7QHTAdcB/wH0
+ AfoB9wH/AfUB9AHzAf8B+AL1Af8C+gH5Af8B8wHmAeoB/wHrAYQBmAH/Af4BlAGaAf8B9gGWAZsB/wNb
+ AdkMAAFZAl0B0gHMA/8B2gP/AckD/wHBA/8BuAP/Aa8D/wGkA/8BmQP/AYgB+wL/AWAB9gL/AU8B8QL/
+ ATwB8AL/AS0B7gL/AT4BXAF4AfgDLgFICAADMAFMAlgBaAHyAgMB8AH/AgAB4AH/AgAB1QH/AgABzAH/
+ AgABzAH/AgAB1AH/AgsB3wH/AigB7gH/AkgBcQH2AzcBWwgAAV8CVwHoAfMBgwEhAf8B4AFDAQAB/wHZ
+ AUIBAAH/AdUBPAEAAf8BzwEyAQAB/wHZAYUBQgH/AfQB7wHpAf8ByQFLAQ8B/wG+ASwBAAH/AbsBMQEA
+ Af8BtAEuAQAB/wGxASwBAAH/AaoBJwEAAf8BwAE6AQAB/wFiAUgBPQH2BAADGgElAWYBRwFZAvUB3AHg
+ Ef8B+QHrAfAB/wHpAYIBlgH/Af4BkwGZAf8B9gGVAZkB/wNbAdkMAAFZAlsBxAHOAfwB/gH/AeED/wHR
+ A/8BygP/AcED/wG3A/8BrgP/AaQD/wGYA/8BiAH7Av8BYQH1Av8BTwHzAv8BPAH3Av8BKwFjAX4B/AM6
+ AWEMAAMqAUACSgGBAfcCAAHnAf8CFQHoAf8CLQHqAf8CLQHqAf8CIgHnAf8CFAHnAf8CKQGDAfoCMAEx
+ AU0MAAFqAVIBUQH0AfgBhAEcAf8B4gFBAQAB/wHfAUQBAAH/AeEBYAEeAf8B4QFpAS4B/wHfAZkBWgH/
+ AfcB+AH2Af8B9AHuAegB/wHfAaYBgwH/AcsBQwEFAf8BxAE5AQAB/wG2ATABAAH/Aa0BKQEAAf8BvwE5
+ AQAB/wF8AUoBKQH6BAADGgElAWYBRwFZAfUB9wHeAeIR/wH5AewB8AH/AecBggGVAf8B/QGTAZkB/wH2
+ AZUBmQH/A1sB2QwAA1YBtgHRAfgC/wHyA/8B2gP/AdED/wHKA/8BwAP/AbgD/wGuA/8BpAP/AZgB/gL/
+ AYgB+wL/AWEB9wL/AU4B/gL/AScBfwGeAf4DRgGADAADMgFQAjsBhQH5Ai0B9AH/AoUC/wKPAv8CjgL/
+ AocB/gH/AkIB9QH/AisBkQH8AzgBXQwAAWoBUgFRAfQB+wGCARgB/wHoAUoBAAH/Ae4BlwFLAf8B7wGp
+ AWkB/wHrAZsBVwH/Ad4BjQFIAf8B4gGwAZMB/wHwAeMB3AH/AfwD/wHeAaYBhQH/Ac8BRAEHAf8BygFA
+ AQQB/wG1AS0BAAH/AcEBPAEAAf8BfAFNASkB+gQAAxoBJQFkAUUBTAH1AfYB3gHhEf8B9wHiAegB/wHr
+ AYEBkwL/AZgBngH/AfcBlQGZAf8DWgHYDAABUgJUAaYB2QH4AfsB/wH2AfoB8gH/Ae0B/wH9Af8B3gP/
+ AdAD/wHKA/8BwQP/AbcD/wGtA/8BpAP/AZgB/gL/AYgB+wL/AWED/wEbAagB2gH/A04BmAgAAzcBWwJI
+ AYEB9wI2AfoB/wKTAv8CoAL/ApYB/QH/ApUB/QH/Ap8C/wKWAf4B/wJVAfsB/wItAZEB+wM+AWsIAAFh
+ AlgB5gH8AZIBLwH/AfgBpgFZAf8B9gG7AZcB/wHyAa0BgQH/AeoBmwFWAf8B4wGJAUEB/wHgAWgBMAH/
+ AdYBagE5Af8B9QHtAecB/wHyAeQB2gH/Ac8BVAEeAf8B0wFLARAB/wHHAT4BAQH/Ac0BRwEBAf8BZQFS
+ AUgB9AQAAxoBJQFkAUYBTAH1AfYB3wHjBf8B/QH6AfsB/wH4AeAB4wH/Ae8BrgG2Af8B4AFmAY8B/wHg
+ AVwBhAH/Af0BkgGWAf8B9wGTAZgB/wNaAdUMAAJPAVEBnAEwAUUB2wH/ARsBHQHBAf8BUQFcAcEB/wHX
+ Au0B/wHeA/8B0gP/AcoD/wHAA/8BtwP/Aa4D/wGkA/8BmgP/AYwD/wEqAb8B5wH/A1QBqwQAAzYBWQJI
+ AW4B9gJHAfwB/wKqAv8CtAL/ArAB/QH/AigB7AH/AiEB6gH/AqsB/QH/ArMC/wKsAv8CgQH9Af8CMgGS
+ AfsDPgFrBAABUwJSAagB7wGpAWAC/wHVAbMB/wH7AcABmAH/AfEBrAGAAf8B3wGkAYIB/wHdAakBjAH/
+ AeUBlAFQAf8B3wGEAToB/wHsAdEBwgH/AfYB8AHsAf8B0gFiAS4B/wHSAVMBGQH/AdgBUAEUAf8B4wFQ
+ AQ4B/wFeAlwBzgQAAxoBJQFkAUcBWQH1Ae0BywHPAf8B7wHGAcgB/wHgAYsBkgH/Ac0BUgFhAf8BqgE+
+ AVoB/wFgATUBXwH/ATgBKQFZAf8BkwE4AVEB/wHoAVoBZgH/AWcBVwFZAfIDOQFfAwYBCAQAAlgBXwHj
+ AQsBCgHzAf8CAAHjAf8CAAHCAf8BXgFpAcQB/wHsAf0B+wH/Ad8D/wHXA/8B0QP/AckD/wHCA/8BuQP/
+ Aa4D/wGlA/8BPQHZAfIB/wNYAcADNwFaAlIBZwH0AlIB/QH/ArsC/wLIAv8CxAL/AjgB9AH/AiEBjAH7
+ Aj0BegH4AjcB8QH/AsEC/wLGAv8CvwL/ApQB/gH/AkQBgQH4Aj0BPgFqAykBPgHKAWMBNQL/AdkBtAL/
+ AcsBpgH/AekBpQFlAf8B6QHPAcEB/wH2AfUB9AH/AdYBiAFHAf8B2wGIAUYB/wH3AfEB7QH/AecBygG5
+ Af8B0wFcASUB/wHXAV8BKQH/Ae4BZQEjAf8BzwE8AQgB/wM7AWMEAAMaASUBZQJSAfQBzQFVAVsB/wGv
+ AUEBUQH/AYEBOQFbAf8BOAE3AYEB/wELATEBhQH/AQABLwGGAf8BAgFBAZYB/wEqAYYBtgH/AZgBqgG/
+ Af8BxwGHAZ4B/wFfAS8BRgH7A0ABcAQAAisBowH8AR0BHgHyAf8CLwHrAf8CAAHeAf8BNAE4AcoB/wH0
+ Af8B9AH/AewD/wHRA/8BuAP/AZkB9QL/AWUB6gH8Af8BSgHaAfYB/wFAAa0BuwH9ATIBjAGdAfsBRwFi
+ AXcB9gNKAYsCSAFiAfYCWQL/AtQC/wLfAv8C0wL/AkgB9wH/AkYBZwH0AzMBUwMtAUUCUQFoAfICTQH0
+ Af8C0gL/AtkC/wLWAv8CqgL/AkMBjwH7AwYBCAFSAlABowHoAagBZQL/AdwBuAH/AfUBvgGVAf8B3gGr
+ AY4B/wHwAeYB4wH/AeUBygG7Af8B7AHZAdEB/wHqAdoB0gH/AdQBhwFJAf8B3QGBATkB/wHtAYoBOwH/
+ AewBYQEhAf8BWwJZAcMDDQERBAADGgElAVkBRAFZAfUBPgE2AV4B/wEPAToBaAH/AQABRQGkAf8BAAFI
+ AaoB/wEIAWYBvAH/AS0BpwHaAf8BTgHTAfUB/wFkAfIC/wGBAfsC/wGPAe0C/wJcAXcB+AMvAUoEAAIp
+ AX4B+gICAe4B/wEZARgB+AH/AQQBAQHqAf8CQAGtAf0BZQFnAXUB9AFZAmQB7AFdAmEB4gFZAlwBzANW
+ AbMDUAGdA0UBfQM5AV8DMAFLAyABLgQAAlkBXAHJAkYB7QH/AskC/wLtAv8CVAH7Af8CPwFrAfYDNgFZ
+ CAADLwFKAlMBaQHxAl8B+AH/AusC/wLeAv8CiwHzAf8CWgFeAdUEAAMWAR4BWwJYAcsB6QGoAWYC/wHe
+ AbgB/wH2AcEBmgH/AeABpQGDAf8B5gG7AaQB/wHiAa8BlAH/AdoBjgFPAf8B7AGZAVIB/wH5AaABUwH/
+ AewBgQExAf8BYAJaAd4DHwEtCAADRQF9AVYBigHEAf4BHAGaAdcB/wEAAWABwQH/AQsBnAHgAf8BLAG+
+ Ae4B/wFLAeAB/gH/AV4B8AL/AWMB6QL/AWwBnQHGAf4BWAFiAWQB7wFWAlgBuQMvAUoIAAJPAVABmwIk
+ AX0B/AEnASUBrQH+AlwBYQHcATACMQFNAxgBIQMRARcDCQEMIAADFgEfAlkBWwHDAkUB6wH/AlMC/wJH
+ AWgB9gM3AVsQAAMwAUwCUwFpAfEChwH9Af8ChAHyAf8CWQFcAcwDHgErCAADFgEeAVUCUwGtAc4BaAE5
+ Af8B9AG8AZEC/wHIAZsB/wH9Ab0BjgH/Af0BtQGFAv8BswGAAf8B9AGdAVMB/wHQAVQBIwH/AVgCVgG8
+ AxwBKAwAAVkBYAFmAesBlgP/AYMB+gL/ATABWAGSAfoBPgFuAYsB+AFQAekC/wFIAcUB9gH/AUYBZgFz
+ AfUCWQFbAcQDQAFxAxEBF1QAAxYBHwJZAVsBwwJQAWUB9AI1ATYBWBgAAzABSwJXAWcB8gJZAVwBzwMd
+ ASkQAAMHAQkDLwFKA1YBtgFiAlgB7wGGAk0B+gGEAk0B+gFpAlMB8QFbAlkBxAM2AVkDCgEOEAADQwF3
+ AVkCXAHPAVIBdAGLAfcCSAFJAYcDOwFkAVkCXQHXA0sBjgMhATBQAAM4AV4CWQFkAesCVQFXAboDOgFh
A1kBxwNZAcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1wBzgNZAcMDNAFV
- RAADVwHCA0QBezgAA2EB4gNwAfEDZwHuA2cB7gNnAe4DZQHuA2UB7gNlAe4DZQHuA2UB7gNlAe4DZQHu
- A2gB8ANlAeUEAANhAe4D4gH/A90B/wPaAf8C2wHaAf8D2QH/A9gB/wPYAf8D1wH/A9YB/wPVAf8D1AH/
- A9MB/wPgAf8DmQH/A1cBvQwAA0gBhgJNATIB+gNDAXcsAANcAdQBBwEjATgB/wNJAYkDEwEaMAABogKj
- Bf8B9gLwAf8B9gLvAf8B9gLvAf8B9ALvAf8B9ALtAf8B9ALtAf8B9ALtAf8B8gLrAf8B8wLrAf8B8gLo
- Av8C+wH/AaICoQH/BAADhAH3BP8C9AHzAf8B/QH4AfUC/wH2AfMB/wH9AfQB8QH/AfwB8wHwAf8B+wHw
- Ae0B/wH5AfAB7QH/AfgB7wHsAf8B9wHtAeoB/wHyAe0B6gH/AecB5gHnAf8D9QH/A8YB/wNZAcMIAAMO
- ARMDXwHgATABxAFLAf8BRwFqAUEB+QM4AV4oAAMpAT8BRAFSAWkB9wFhAZoBrgH/A1sB0ANCAXUDBgEI
- KAADnwH9AfoC8wH/AeoC4gH/AekC4QH/AekC4QH/AegC3wH/AecC3gH/AeYC3gH/AeYC3QH/AeQC2wH/
- AeQC2gH/AeIC1wH/AfUC6wH/AZ4CnAH9BAADcwH2AfwC+wH/Ae4B7AHqAf8BuwHMAdoB/wGTAbMBywH/
- AZgBtQHLAf8BlgG1AcsB/wGVAbQBygH/AZUBswHJAf8BlAGzAckB/wGOAa4BxwH/AakBugHIAf8B3gLc
- Af8B7gLtAf8DvQH/A1YBwQgAA0ABcQE7AZoBNgH/AUkB6QGSAf8BPQHSAWUB/wFMAV8BTAHzAy4BRygA
- A1EBogFuAcQB3wH/AZsB5AHyAf8BIgGKAa0B/wNMAZEDAgEDJAABnwKeAv0C9gH/AfUC7QH/AfMC7AH/
- AfMC7AH/AfIC6gH/AfEC6QH/AfEC6QH/AfAC6AH/Ae8C5gH/Ae8C5QH/Ae0C4wH/AfgC7gH/A5wB/QQA
- A3MB9gL/Af4B/wHtAeQB5wH/AUkBswHYAf8BAQHLAesB/wEPAdAB7QH/ARIB0QHuAf8BEgHUAfEB/wET
- AdIB7gH/ARUB0gHuAf8BDAHPAe4B/wE2AaQBzAH/AdUBzwHTAf8B9gHyAfAB/wPAAf8DVgHBBAADBQEH
- AVYBWAFWAbwBTAHPAWsB/wFtAegBqwH/AV4B6AGjAf8BQgHOAWUB/wFZAWABWQHrAyQBNSQAAzEBTgEO
- AW4BpQH/AZcB5gH5Af8BhgHoAfUB/wFAAVUBjwH9AyIBMiQAA6AB/QH7AvcB/wHeAtoB/wHeAtkB/wHf
- AtoB/wHeAtkB/wHdAtkB/wHdAtkB/wHdAtgB/wHcAtYB/wHbAtYB/wHaAtQB/wH4AvEB/wGeAp0B/QQA
- A3UB9gT/AeoB5AHmAf8BTgG7AeEB/wEhAdwC/wEmAd0C/wEOAdMB/QH/AQkB0AH3Af8BDAHUAfwB/wEM
- Ad0C/wEFAd0C/wE0Aa4B2AH/AdUBzwHTAf8B9wHzAfEB/wPBAf8DVgHBBAADLgFIAUMBfwE8Af4BiQHu
- AbUB/wGWAfMBxQH/AYoB6wG4Af8BagHsAa8B/wFBAcwBYwH/AVcBXAFXAd8DGgEkIAADCAELA1MBrQEf
- AaEBzAH/AZ0B0wHdAf8BqgHiAfAB/wNUAaskAAOoAf0B0gLRAf8BHwIeAf8CEwESAf8BFwEWARUB/wET
- ARIBEwH/ARYCFQH/ARgCFQH/AxgB/wEWAhcB/wEPARIBEwH/AxsB/wHLAsoB/wOoAf0EAAN1AfYE/wHp
- AecB6QH/AV0BtwHhAf8BXAHQAf4B/wFcAdUC/wE7AakB3AH/AUABXgGHAf8BEwGfAdoB/wEAAcEC/wEA
- AbwC/wExAaUB1wH/AdgB1AHWAf8B+AH0AfIB/wLCAcMB/wNWAcEDAgEDA1ABmgFdAc4BggH/AaEB+gHR
- Af8BTQHNAWcB/wFpAeYBpQH/AZUB8wHIAf8BbQHyAbgB/wFAAcgBXgH/AVsBXgFbAdADFAEcIAADEgEY
- A1YBswFhAcYB4QH/AfAD/wGOAZoBogH/AzMBUgMPARQcAAOoAf0BxgLIAf8DAAH/AwAB/wMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AbwCvQH/A6gB/QQAA3UB9gT/AekB6AHrAf8BYAG5AeEB/wFq
- AdUB/gH/AWwB3QL/AWIBrAHKAf8BXAFJAUUB/wEzAZ0ByQH/AQABuAL/AQABrwL/ATIBogHXAf8B2gHV
- AdYB/wH6AfYB9AH/AcQCxQH/A1YBwQMcAScBUQF9AUYB9wGYAfwByQH/AV4BqgFzAf4BWgFhAVoB5AFC
- AWwBQgH1AV0B4wGYAf8BkQH5AcwB/wFtAfcBwQH/ATwBwwFVAf8BVQFXAVUBtwMKAQ0gAAMKAQ4DTwGl
- AY0BvgHPAf8BmAHHAeAB/wFCAVwBbwH1AVgCXAHRAxoBJRgAA6gB/QHKAc8B0AH/AQcBDwEQAf8DAAH/
- ATQBNwEwAf8BvQG2AZYB/wESASQBIAH/ARsBIQEYAf8BIgEeARMB/wMAAf8BXgEsAQsB/wMAAf8BwgK/
- Af8DqAH9BAADdQH2BP8B5gHnAesB/wFmAbsB4gH/AZcB5AL/AZYB6AL/AZABxwHdAf8BiwGSAZMB/wFd
- AbwB3gH/ARgBxQL/ARABwAL/ATgBpgHYAf8B1wHUAdcB/wH7AfcB9QH/A8YB/wNWAcEDRwGCAUsB0AFr
- Af8BUAHVAXAB/wFYAVoBWAHAAwABAQMtAUUBXQFhAV0B4gFCAcsBXgH/AYEB+QHGAf8BawH+AcoB/wE1
- AcABTgH/A1IBqQMEAQUgAAMKAQ4DVwHFAUMBlAG7Af8BQQGYAbsB/wEiAScBLAH/A1ABnwMAAQEUAAOo
- Af0B0QLMAf8BuAGYAVsB/wFhAWIBTAH/AbYCuAX/AUoCVAH/AVoBUwE4Af8BYAFfAUcB/wEzAScBEgH/
- Ac4BYwEiAf8BPwEXAQMB/wHJAb4BvQH/A6gB/QQAA3cB9gT/AfEB8AHxAf8BgwG5AdoB/wFeAbcB3gH/
- AWIBuAHeAf8BYgG/AecB/wFwAcsB8wH/AVMBuwHoAf8BPgGuAeAB/wE0AaoB3AH/AVsBqgHRAf8B4QHf
- AeAB/wH6AfcB9gH/A8gB/wNWAcEBWAFiAVgB6QE1AdABUwH/AVkBWwFZAcQDDQESCAADHAEoAVQBVgFU
- AasBKwG0ATcB/wFfAfIBswH/AWMB/wHQAf8BMAG7AUQB/wNLAY4kAAI+AT8BbAGAAXABbQH/AZMBGQEP
- Af8BFAIAAf8BIwEBAQAB/wNAAXAUAAGmAqgB/QHRAcwBygH/AdcBrwFpAf8B/AHhAa4B/wH2AvcB/wH7
- Af4C/wHkAdcBxQH/AcsBrwFtAf8BjwFrAUkB/wHMAZIBPQL/AZEBLwH/AckBPQEFAf8BygG9AbsB/wGl
- AqgB/QQAA3cB9gT/AfsB+gH5Af8B5gHqAe4B/wGfAacBsQH/AaIBpwGuAf8BnwGnAa8B/wHAAcwB1wH/
- AbABtQG9Af8BrgGtAbMB/wGfAaEBqAH/Ad4B3wHjAf8B7gLtAf8D9QH/A8kB/wNWAcEBPwFrATkB9gFZ
- AVwBWQHPAxQBGxAAAwQBBQE9AT4BPQFqAT8BbgE7AfYBSgHoAZYB/wFaAf8B0gH/ASkBuAE6Af8BRQFG
- AUUBfiAAAwEBAgNHAYIBvgFXAT0B/wFpARABDAH/AQ8CAAH/AUcBKwEmAfkBLAIrAUMQAAGnAqgB/QHQ
- AcoByQH/Ac0BoQFbAv8B3AGdAf8B/QHlAcEB/wH2AeMBzQH/Af4B4AGuAv8B2gGaAf8B+QHAAWcB/wH8
- AacBRAL/AYABJAH/AdABOgEAAf8ByQG8AboB/wGkAqgB/QQAA3cB9gT/A/cD/wH+Af8B2wHWAdQB/wG7
- AbUBsgH/AckBwgHAAf8BuwG1AbIB/wHMAccBxAH/AbsBtQGyAf8B0AHLAcgB/wH3AfUB9AH/AuoB6QH/
- A/YB/wPLAf8DVgHBAxgBIQMRARccAAMkATYBWgFeAVoB1QEzAdQBXwH/AVYB/AG+Af8BJQG3ATcB/wM8
- AWYgAAMCAQMDUwGqAcYBZgFMAf8BRQEFAQIB/wEWAgAB/wFdAlkB1wMYASEMAAGnAqgB/QHPAcoByAH/
- Ac0BlwFJAv8BywGFAv8BzgGOAv8BzwGQAv8BzQGNAv8BxAFvAv8BtgFUAf8B/AGWATcB/wH6AWABGAH/
- AcgBKwEAAf8ByAG6AbkB/wGlAqgB/QQAA3cB9gT/A/kB/wP6Af8B+QL6Af8DywH/AbgCtgH/AcECvwH/
- AbgCtgH/A8QB/wHwAvEB/wHuAu8B/wPrAf8D+QH/A80B/wNWAcEoAAMQARUBTwFQAU8BmwEgAb4BOAH/
- AUwB9QGkAf8BOgGoAUAB/QMxAU4gAAMQARYBXAJZAcwBuQFZATsB/wEmAgAB/wEqAQMBAAH/AVECUAGf
- DAABpwKoAf0BzQHFAcQB/wHQAYIBKgL/AbkBTwL/Ab8BYAL/AcEBYwL/AbwBWgL/AbABSQL/AZgBMwH/
- Af0BaQEcAv8BRAEAAf8BzQEWAQAB/wHGAbYBtQH/AaUCqAH9BAADeQH2BP8D+wH/A/kB/wP6Af8B+gL7
- Af8D5QH/A9UB/wPhAf8D9AH/A/EB/wPtAf8D6wH/A/cB/wPPAf8DVwHCMAABOQE6ATkBYAFYAV8BWAHj
- ATUB3QFaAf8BVAFoAVUB7SQAAx0BKgFiAlgB6QGfAUQBIgH/ARECAAH/AUYBBAEAAf8DNwFbCAADqAH9
- AdQCywH/AZgBTgEnAf8BtAFtATYB/wGzAYMBPwH/AbQBhgFAAf8BswGCAT0B/wGzAWkBNQH/AbMBWwEt
- Af8BswFJASEB/wG1ATQBEQH/AZcBIAEPAf8BywG/Ab4B/wGnAqgB/QQAA4gB+CD/A/0B/wP8Af8D+gH/
- A/kF/wPTAf8DVwHCNAADHQEpAVcBWgFXAcUBTQFmAU0B7ygAAyoBQAF5AUkBSAH2AYABMQEUAf8BDgIA
- Af8BYAFYAVcB6wgAAaMCpAX/AdsB3AHgAf8C2AHeAf8C2QHdAf8B2AHZAd0B/wHYAdkB3gH/AdgB2QHe
- Af8B2AHaAd4B/wHYAdsB3wH/AdcB3AHgAf8B2QHcAd8C/wL8Af8DogH/BAADWwHLA6UB/gOxAf0DsQH9
- A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsgH9A60B/gNqAfUDOwFlbAADOwFkAXUBSAE/
- AfYBWQFCAT4B9QFSAlEBpwgAA14B3QNlAe8DZwHtA2cB7QNnAe0DZwHtA2cB7QFmAmcB7QNmAe0DZgHt
- A2YB7QNjAe4DZAHvA18B4JMAAQEDBAEFAxABFgMpAT8DPgFsA0YBgANEAXsDOAFcAyABLgMKAQ0DAQEC
- DAABWgJdAdMBTAFyAYAB8wFXAWYBbgHvAVcBZgFuAe8BVwFmAW4B7wFXAWYBbgHvAVcBZgFuAe8BVwFm
- AW4B7wFXAWYBbgHvAVcBZgFuAe8BVwFmAW4B7wFXAWYBbgHvAVcBcgF7AfIBWwJeAdkLAAEBAwYBCAMK
- AQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DBwEKAwMBBAsAAQEDBgEIAwoBDQMK
- AQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DBwEKAwMBBBMAAQEDBwEJAxUBHQM5AV8DUwGwAlgBYQHm
- AV8BjAGUAfsBUwGoAbEB/QFOAV0BXwHwA1kB0gNSAakDRgGAAyQBNgMEAQYIAAEvAaAB0gH/ASUB+wL/
- ARsB8QL/AR4B8AL/AR8B8AL/AR8B8QL/AR8B8QL/AR8B8QL/AR8B8QL/AR8B8AL/AR8B8AL/AR0B8AL/
- ASMB+wL/ATMBrAHYAf8EAAMEAQUDJAE2A0QBeQNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGL
- A0oBiwNKAYsDRwGCAzMBUgMLAQ8DBAEFAyQBNgNEAXkDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGL
- A0oBiwNFAX8DKQE/AwMBBAgAAwQBBQMkATYDRAF6Al4BYQHaAVkBdgGDAfwBrwHVAeMB/wHEAfIB/QH/
- AbcB8AL/AaoB/gL/AZ8B/QH+Af8BiAHaAeUB/wFaAX8BmwH+AUUBUgFlAfQDVgG5AzUBVwMLAQ8EAAEs
- AXkBqwH8ARUB4gL/AQwB2QL/AQ4B2AL/AQ0B1wL/AQ8B3wL/ARAB5QL/ARAB5QL/ARAB4AL/AQ4B2QL/
- AQ8B2QL/AQwB2QL/ARMB4wL/AS4BfAGvAfwEAAMdASoBtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3
- AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
- AbUBNwEAAf8BtQE3AQAB/wNSAakDNQFYAx0BKgG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
- AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DSwGO
- AxQBGwMAAQEEAAMdASoBtQE3AQAB/wHzAU8BAAH/AZUBvwHTAf8B7wP/AdQB+wL/AakB5gL/AZIB2QL/
- AY4B6wL/AY0B8wL/AZ0B/QL/AasD/wFlAcQB1wH/AVsBGgEAAf8DUwGtAzUBWAQAAS4BeQGrAfwBLwHg
- Av8BIgHVAv8BFgHTAv8BCwHQAv8BAAGeAfYB/wEAAYkB5gH/AQABigHlAf8BAAGaAfMB/wEFAckC/wEG
- AcwC/wEDAckC/wEJAdQC/wEsAXsBrwH8BAABtQE3AQAC/wFlAQMB/wG1ATcBAAL/AagBTwL/AacBTgL/
- AaYBTAL/AaQBSQL/AaIBRQL/AaABQQL/AZ0BPAL/AZsBOAL/AZsBOAH/AeUBPgEUAv8BmwE4Af8BtQE3
- AQAB/wNIAYgBtQE3AQAB/wG1ATcBAAL/AWsBCAL/Aa8BWwL/AaUBSgL/AaQBSAL/AaMBRgL/AaABQgL/
- AZ8BQAL/AZ0BPAL/AZsBOAH/AbUBNwEAAf8DVAGvAzYBWQMbASYEAAG1ATcBAAL/AWUBAwH/AfsBaQEI
- Af8BmAHDAdgB/wHZA/8BqwHmAv8BhgHTAv8BZQHKAv8BagHdAv8BZwHiAv8BgQHoAv8BkQH3Av8BXQHC
- AdsB/wFmATgBEgH/AekBSwEAAf8DSAGIBAABLgF4AawB/AFBAeAC/wE0AdYC/wElAdQC/wEXAdsC/wEA
- AYAB4wH/AgABaQH/AgABYwH/AQABXwHcAf8BAAHHAv8BAAG+Av8BAAG7Av8BAAHGAv8BKwF6Aa8B/AQA
- AbUBNwEAAv8BbwERAf8BtQE3AQAC/wGyAWIC/wGxAWEC/wGxAWAC/wGvAVwC/wGrAVYC/wGoAVAC/wGn
- AU0C/wGkAUgC/wGiAUQB/wHlAUEBGQL/AaIBRAH/AbUBNwEAAf8DSwGQAbUBNwEAAv8BZgEBAf8BtQE3
- AQAB/wG1ATcBAAL/Aa8BWwL/Aa4BWQL/Aa0BVwL/AaoBUgL/AagBTgL/AaUBSgL/AaMBRgH/AeUBQgEb
- Af8BtQE3AQAB/wNMAZEDFAEbBAABtQE3AQAC/wFvAREB/wH7AWkBCAH/AYkBvwHbAf8BuQHwAv8BjAHW
- Av8BVwHEAv8BSAG8Av8BVAHPAv8BUQHTAv8BXAHaAv8BawHnAv8BTAG4Ad0B/wFmATsBFwH/AekBSwEA
- Af8DSwGQBAABLgF4AawB/AFMAd8C/wFEAdgC/wEzAdMC/wEnAdwC/wEIAa8B8wH/AQABAwFSAf8CAAFH
- Af8BAAGVAeoB/wEAAbsC/wEAAbAC/wEAAa4C/wEAAbkC/wErAXkBrwH8BAABtQE3AQAC/wGIASMB/wG1
- ATcBAAL/Ab4BhwL/Ab4BhgL/AbwBgwL/AboBbwL/AbcBagL/AbMBYwL/AbABXQL/Aa0BWAL/AaoBUwH/
- AeUBRQEgAv8BqQFQAf8BtQE3AQAB/wNLAZABtQE3AQAC/wGSASsC/wFwAQ4B/wG1ATcBAAL/AboBbwL/
- AbgBagL/AbYBaAL/AbQBZAL/AbABXQL/Aa8BWwL/Aa0BVwH/AeUBRwEkAf8BtQE3AQAB/wNUAa8DNQFY
- AwMBBAG1ATcBAAL/AYgBIwH/AfsBaQEIAf8BZQG3Ad4B/wGXAd8C/wFaAcUC/wEvAbAC/wEwAa8C/wFH
- AcQC/wEzAcAC/wFDAcoC/wFTAdcC/wE8AbAB4AH/AWYBPwEdAf8B6QFLAQAB/wNLAZAEAAEwAXgBrAH8
- AWAB4wL/AVgB3AL/AUcB2QL/ATYB4AL/AQABZwG3Af8CAAEQAf8CAAEMAf8BAAFUAaoB/wEAAb0C/wEA
- AbMC/wEAAbAC/wECAbsC/wErAXoBrwH8BAABtQE3AQAC/wGVATcB/wG1ATcBAAL/AcgBmgL/AcgBmAL/
- AcYBlgL/AcQBkAL/AcABiwL/Ab0BhAL/AbkBbgL/AbYBZwL/AbIBYgH/AeUBSQEnAv8BsAFdAf8BtQE3
- AQAB/wNLAZABtQE3AQAC/wGfAUAC/wGfAUAC/wFnAQIB/wG1ATcBAAL/AcMBjgL/AcABiQL/Ab4BhAL/
- AboBbwL/AbgBagL/AbUBZgH/AeUBSQEnAv8BsAFdAf8BtQE3AQAB/wNMAZEDEwEaAbUBNwEAAv8BlQE3
- Af8B/AFqAQgB/wFOAa4B4AH/AWUBzQL/AUgBvAL/AUkBvgL/AVcByAL/AWsB1QL/AVcBywL/AUABwgL/
- ATsBxgL/ASYBpgHiAf8BbAFGASUB/wHrAUwBAAH/A0sBkAQAATQBeQGtAfwBigHqAv8BgAHiAv8BXwHe
- Av8BUQHlAv8BEwGZAc8B/wEAAQsBIAH/AQABBgEaAf8BAAGJAcMB/wEXAcUC/wEYAbsC/wEUAbkC/wEb
- AcMC/wExAXsBsAH8BAABtQE3AQAC/wGhAUwB/wG1ATcBAAL/AdMBrAL/AdMBrQL/AdEBqQL/Ac4BpAL/
- AcsBngL/AccBlQL/AcQBkAL/AcABigL/Ab0BhAH/AeUBTgEvAv8BugFvAf8BtQE3AQAB/wNLAY8BtQE3
- AQAC/wGrAVQC/wGrAVQC/wGTAS0B/wG1ATcBAAL/Ac4BoAL/AcwBnAL/AckBlwL/AcUBkgL/AcIBiwL/
- Ab8BhwH/AeUBUAE0Av8BugFvAf8BtQE3AQAB/wNUAa8DNQFYAbUBNwEAAv8BoQFMAf8B/gFrAQgB/wFJ
- AaoB4QH/AZQB3gL/AZkB4wL/AZAB4gH+Af8BYAHJAfsB/wFnAdAB+wH/AYsB3QH9Af8BmgHiAv8BjQHd
- Av8BOwGoAeIB/wGmAWoBQwH/AfEBTgEAAf8DSwGPBAABPwGgAdIB/wGjAfgC/wGZAe4C/wGGAeoC/wFq
- AegC/wFXAecC/wEwAcYB7gH/ASQBwgHsAf8BMQHdAv8BOgHQAv8BMwHIAv8BMwHJAv8BQwHYAv8BPAGn
- AdgB/wQAAbUBNwEAAv8BrgFiAf8BtQE3AQAC/wHcAb4C/wHcAb4C/wHaAbkC/wHYAbUC/wHVAa8C/wHR
- AakC/wHOAaIC/wHKAZoC/wHIAZcB/wHlAVMBOgL/AcMBjgH/AbUBNwEAAf8DRAF8AbUBNwEAAv8BuAFq
- Av8BuAFqAv8BuAFqAv8BiAEbAf8BtQE3AQAC/wHVAa0C/wHSAagC/wHQAaMC/wHNAZ4C/wHKAZkB/wHl
- AVYBPQL/AcUBkgL/AcUBkgH/AbUBNwEAAf8DQgF1AbUBNwEAAv8BrgFiAv8BawEIAf8BbAGjAbwB/wE+
- AZ0BzgH/AVwBvQHoAf8BlwHaAfgB/wGPAcoB7QH/AZYB0wH0Af8BkQHUAfUB/wFZAboB5wH/ATQBlgHK
- Af8BPgFZAY0B/wHsAbQBgwH/AfUBUAEAAf8DRAF8BAABWQJcAcwBXAF+AZYB+AFPAW8BfgHzAUwBbwF+
- AfMBTAFvAX4B8wFNAW8BfgHzAU8BcAF+AfMBTQFwAX4B8wFTAW4BdwHxAVEBgAGMAfcBUgGqAdQB/wFY
- AYgBtQH+AVcBfQGWAfgBWQJdAdIEAAG1ATcBAAL/AbsBiAH/AbUBNwEALf8BtQE3AQAB/wMlATcBtQE3
- AQAC/wHEAZAC/wHEAZAC/wHEAZAC/wGqAVIB/wG1ATcBAAL/AfYB7B3/AbUBNwEAAf8DLgFHAbUBNwEA
- Av8BuwGIAv8BawEIBf8D/gH/Ab4B2AHrAf8BUQGnAdUB/wFTAbAB3AH/AVYBtAHeAf8BQAGYAccB/wGZ
- AbkB0AH/AfAB8QHyAf8D/AH/A/4B/wH2AVABAAH/AyUBNwQAAxABFQMcASgDGgEkAxkBIwMaASUDGwEm
- AxsBJgMbASYDEgEYA0gBhQG7AacBqAH/A2UB5QMuAUcDDQERBAABtQE3AQAC/wHJAZ8C/wGyAWcB/wG1
- ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEA
- Af8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DKgFAAwQBBQG1ATcBAAL/AdIBqAL/Ac4BoAL/AdIBqAL/
- AdIBqAL/AZkBNgH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
- AbUBNwEAAf8BtQE3AQAB/wNAAXEDBwEKAbUBNwEAAv8ByQGfAv8BsgFnAv8BawEIAv8BawEIAv8BawEI
- Af8B/gFrAQgB/wH+AWsBCAH/AfwBagEIAf8B/QFqAQgB/wH+AWsBCAL/AWsBCAL/AWsBCAL/AWsBCAH/
- AyoBQAMEAQUoAANIAYQB0wHAAb0B/wNhAdoDFQEdCAABtQE3AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHW
- AbUC/wHVAbMC/wHVAbMV/wG1ATcBAAH/AyoBQAMEAQUEAAG1ATcBAAL/Ad4BvgL/Ad4BvgL/Ad0BuwL/
- Ad4BvgL/Ad0BuwL/Ad0BuxH/AbUBNwEAAf8DKwFCAwcBCgMAAQEEAAG1ATcBAAL/AdUBtQL/AdUBtQL/
- AdUBtAL/AdYBtQL/AdUBswL/AdUBsxX/AbUBNwEAAf8DKgFAAwQBBRAAA0ABbgNYAbwDTgGYAxMBGggA
- AwgBCwNaAcUB3wHPAdAB/wNYAbwMAAG1ATcBAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/
- AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wMdASoDBAEFAwIBAwQAAbUBNwEA
- Av8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNBf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3
- AQAB/wMdASoDBAEFDAABtQE3AQAC/wHgAccC/wHgAccC/wHgAccC/wHgAccC/wHgAccF/wG1ATcBAAH/
- AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DHQEqAwQBBQMCAQMQAAM2AVgBjQKFAfsBuAKk
- Af8DVgG2AyABLwMdASoDUgGnAc4BvgG/Af8BkgKDAfwDNwFaDAABtQE3AQAV/wG1ATcBAAH/AysBQgMH
- AQoDAwEEAwMBBAMCAQMDAAEBDAABtQE3AQAV/wG1ATcBAAH/AysBQgMHAQoDAwEEAwIBAwMAAQEQAAG1
- ATcBABX/AbUBNwEAAf8DKwFCAwcBCgMDAQQDAwEEAwIBAwMAAQEcAANGAX8BsgKlAf8BxwK2Af8BhwJ/
- Af4BpAKWAf0B1ALEAf8BwwK5Af8DTAGPEAADAQECAbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEA
- Af8BtQE3AQAB/wMdASoDBAEFAwIBAxwAAwEBAgG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
- AbUBNwEAAf8DHQEqAwQBBSAAAwEBAgG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEA
- Af8DHQEqAwQBBQMCAQMvAAEBAzcBWgNbAcsBcAJuAfEBcgJvAfIDXgHQAzsBZQMBAQIQAAMKAQ4DHwEs
- AyUBNwMtAUYDOQFfA0IBdANIAYgDTgGXA1IBpgNWAbMDVwG9A0EBcxQAAx0BKQJaAVwBzQJBAY4B+QM9
- AWkYAAM3AVsCQgGAAfUCXgFhAdoDJQE3EAADCAELAzcBWgFcAlkByQFwAUoBQQH0AYkBSAEnAfoBhwFF
- AScB+gFvAUIBQAH1AV0CWgHTAT8CPgFsAw0BEigAAwoBDgM2AVkDVQGxA1QBrgM0AVUDDAEQDAACWQFd
- AdIBNwFiAXEB9gE9AWsBfwH4ASIBbQGSAfsBJAF/AakB/gEbAZ0B0wH/ASABpgHeAf8BIwGxAecB/wEk
- AboB7QH/ASIBxgH1Af8BHwGsAfQB/wEjATIBeQH8A1QBrwMRARcIAAMeASsCWQFcAcwCHwHxAf8CCwH7
- Af8CJQGXAfsDPgFrEAADNwFbAj8BfQH2AkAB9wH/AlIB9QH/AlkBXQHXAyYBOAgAAxkBIwNWAbMBvQE+
- AREB/wHQAVMBEQH/AcsBRAEAAf8BwQE2AQAB/wG+ATsBAAH/AcIBQgEAAf8BwQE+AQAB/wGyASkBAAH/
- A1sByAMgAS8cAAMdASoDSAGIA1gB3QF9ATUBRwH8AeQBagGPAf8BzAFvAYIB/wFsAk0B+gNTAaoMAAFB
- AY0BrQH5AaED/wGlA/8BngP/AZkD/wGMA/8BbAP/AVoD/wFHAfwC/wExAfkC/wEnAd8B/QH/ARgBqwL/
- AQABRAHOAf8DWgHYAyoBQQQAAlwBYAHUAicB8wH/AgAB+gH/AgAB7AH/AgEB8QH/AiEBmQH7Az4BawgA
- AzYBWQI7AX0B9gIrAe8B/wIsAewB/wI9AfYB/wJiAfcB/wJXAV4B3wQAAxgBIgFgAlsB1gHXAV0BIAH/
- AdgBVgELAf8BwAE4AQAB/wHIAVQBGgH/AdgBkAFVAf8BugFCAQkB/wGnASkBAAH/AaoBMAEAAf8BuAE7
- AQAB/wHCATwBAAH/AWUBXgFdAeUDIwEzDAADBgEIAzsBZANXAcIBXwJMAfMBuAFCAVkB/wHkAWUBjwH/
- Ae0BjwGpAf8B9wGJAaEC/wGgAaYB/wH3AaQBqAH/A1oB3gwAAVQBZwFyAe4BxAP/AcQD/wGzA/8BqQP/
- AZwD/wGKAfsC/wFoAfYC/wFWAfEC/wFEAfAC/wExAdsB9wH/ARYBrgH7Af8BAAGpAv8BAAFtAecB/wNa
- AdMDCQEMAlUBcgHyAiEC/wIAAfgB/wIAAesB/wIAAecB/wIAAesB/wI6AZEB+AI5AToBYAMyAVECQgF7
- AfQCGgHpAf8CIAHmAf8CLQHqAf8CNwH0Af8CaAL/AlEBigH3AwcBCgFVAlMBrQHcAWQBJgH/AdoBVgEH
- Af8BxAE3AQAB/wHEATgBAAH/AesBywGzAf8B+AH/Af4B/wHjAa0BjAH/Aa4BJAEAAf8BrAEuAQAB/wGl
- ASoBAAH/Aa8BMwEAAf8BwQE7AQAB/wFcAloBzQMPARQEAAMJAQwDWQHHAYEBRgFWAf4BzQFTAWcB/wHk
- AYMBmAH/AecBpwG1Af8B4AHHAcsB/wHaAckBzAH/AeoBhQGaAv8BkwGaAf8B9wGcAaAB/wNbAdkMAAFc
- AWQBaQHnAcID/wHHA/8BtwP/Aa4D/wGkA/8BmQH+Av8BiAH7Av8BZgH2Av8BVAHxAv8BQgHtAv8BLwHk
- Av8BHAHsAv8BHAHcAv8CWQFkAewDFgEfAzEBTgJVAXUB8gIWAfoB/wIAAfEB/wIAAeUB/wIAAd8B/wIA
- AeMB/wIZAbIB/QIhAZQB+wIHAeMB/wISAd8B/wIfAeQB/wItAe4B/wJRAfkB/wJSAXwB9AM4AV4DLQFF
- AcQBTgEdAf8B6AFmARcB/wHPAUABAAH/AcsBQAEAAf8BxgE5AQAB/wHfAZ8BaQH/Ae8B3wHQAf8B1QGF
- AUcB/wG0ASwBAAH/AbEBMgEAAf8BrAEvAQAB/wGlASoBAAH/AbcBOgEAAf8BsgEpAQAB/wE+Aj0BagQA
- Ax0BKgGBAVEBUgH3AeYBlQGkAf8B5QG/AcUB/wHlAdoB2wH/AeQB4wHhAf8B5QHkAeEB/wHhAdIB1QH/
- AesBhQGZAv8BlQGbAf8B9QGXAZwB/wNbAdkMAAFaAmAB3gHIA/8B0gP/AcED/wG4A/8BrgP/AaUD/wGZ
- A/8BiAH7Av8BZgH2Av8BVAHxAv8BQwHuAv8BMAHvAv8BIwHiAv8BSwFMAWwB8wMhATEEAAMvAUoCUwFy
- AfECDwH1Af8CAAHqAf8CAAHfAf8CAAHXAf8CAAHbAf8CAAHcAf8CBAHXAf8CEwHeAf8CIAHnAf8CPwH0
- Af8CSAF9AfYDNgFZBAADVAGvAeYBbgErAf8B4gFRAQAB/wHVAUUBAAH/AdIBRgEAAf8ByAE1AQAB/wHO
- AVcBGgH/AeUBsAGJAf8BvgEzAQAB/wG5ATUBAAH/AbUBNQEAAf8BsgEyAQAB/wGsAS4BAAH/AaoBLwEA
- Af8BwAE9AQAB/wFdAlkB0gQAAxoBJQFsAUcBWQH1Ae0B0wHXAf8B9AH6AfcB/wH1AfQB8wH/AfgC9QH/
- AvoB+QH/AfMB5gHqAf8B6wGEAZgB/wH+AZQBmgH/AfYBlgGbAf8DWwHZDAABWQJdAdIBzAP/AdoD/wHJ
- A/8BwQP/AbgD/wGvA/8BpAP/AZkD/wGIAfsC/wFmAfYC/wFVAfEC/wFCAfAC/wEzAe4C/wE8AVwBfgH4
- Ay4BSAgAAzABTAJPAXUB8gIJAfAB/wIAAeAB/wIAAdUB/wIAAcwB/wIAAcwB/wIAAdQB/wIRAd8B/wIu
- Ae4B/wJHAX0B9gM3AVsIAAFkAlcB6AHzAYMBJwH/AeABSQEAAf8B2QFIAQAB/wHVAUIBAAH/Ac8BOAEA
- Af8B2QGFAUgB/wH0Ae8B6QH/AckBUQEVAf8BvgEyAQAB/wG7ATcBAAH/AbQBNAEAAf8BsQEyAQAB/wGq
- AS0BAAH/AcABQAEAAf8BcQE/ATUB9gQAAxoBJQFsAUcBWQL1AdwB4BH/AfkB6wHwAf8B6QGCAZYB/wH+
- AZMBmQH/AfYBlQGZAf8DWwHZDAABWQJbAcQBzgH8Af4B/wHhA/8B0QP/AcoD/wHBA/8BtwP/Aa4D/wGk
- A/8BmAP/AYgB+wL/AWcB9QL/AVUB8wL/AUIB9wL/ASsBaQGOAfwDOgFhDAADKgFAAj8BhwH3AgAB5wH/
- AhsB6AH/AjMB6gH/AjMB6gH/AigB5wH/AhoB5wH/AikBlQH6AjABMQFNDAABeQFSAUYB9AH4AYQBIgH/
- AeIBRwEAAf8B3wFKAQAB/wHhAWYBJAH/AeEBbwE0Af8B3wGZAWAB/wH3AfgB9gH/AfQB7gHoAf8B3wGm
- AYMB/wHLAUkBCwH/AcQBPwEAAf8BtgE2AQAB/wGtAS8BAAH/Ab8BPwEAAf8BiQFEASYB+gQAAxoBJQFs
- AUcBWQH1AfcB3gHiEf8B+QHsAfAB/wHnAYIBlQH/Af0BkwGZAf8B9gGVAZkB/wNbAdkMAANWAbYB0QH4
- Av8B8gP/AdoD/wHRA/8BygP/AcAD/wG4A/8BrgP/AaQD/wGYAf4C/wGIAfsC/wFnAfcC/wFUAf4C/wEn
- AX8BqgH+A0YBgAwAAzIBUAIvAYsB+QIzAfQB/wKFAv8CjwL/Ao4C/wKHAf4B/wJIAfUB/wIrAaMB/AM4
- AV0MAAF5AVIBRgH0AfsBggEeAf8B6AFQAQAB/wHuAZcBUQH/Ae8BqQFvAf8B6wGbAV0B/wHeAY0BTgH/
- AeIBsAGTAf8B8AHjAdwB/wH8A/8B3gGmAYUB/wHPAUoBDQH/AcoBRgEKAf8BtQEzAQAB/wHBAUIBAAH/
- AYkBRwEnAfoEAAMaASUBawFFAUwB9QH2Ad4B4RH/AfcB4gHoAf8B6wGBAZMC/wGYAZ4B/wH3AZUBmQH/
- A1oB2AwAAVICVAGmAdkB+AH7Af8B9gH6AfIB/wHtAf8B/QH/Ad4D/wHQA/8BygP/AcED/wG3A/8BrQP/
- AaQD/wGYAf4C/wGIAfsC/wFnA/8BIQGoAdoB/wNOAZgIAAM3AVsCPgGHAfcCPAH6Af8CkwL/AqAC/wKW
- Af0B/wKVAf0B/wKfAv8ClgH+Af8CWwH7Af8CLQGXAfsDPgFrCAABZAJYAeYB/AGSATUB/wH4AaYBXwH/
- AfYBuwGXAf8B8gGtAYEB/wHqAZsBXAH/AeMBiQFHAf8B4AFuATYB/wHWAXABPwH/AfUB7QHnAf8B8gHk
- AdoB/wHPAVoBJAH/AdMBUQEWAf8BxwFEAQcB/wHNAU0BBwH/AXABSgFBAfQEAAMaASUBawFGAUwB9QH2
- Ad8B4wX/Af0B+gH7Af8B+AHgAeMB/wHvAa4BtgH/AeABbAGPAf8B4AFiAYQB/wH9AZIBlgH/AfcBkwGY
- Af8DWgHVDAACTwFRAZwBNgFLAdsB/wEhASMBwQH/AVcBYgHBAf8B1wLtAf8B3gP/AdID/wHKA/8BwAP/
- AbcD/wGuA/8BpAP/AZoD/wGMA/8BMAG/AecB/wNUAasEAAM2AVkCQQF7AfYCTQH8Af8CqgL/ArQC/wKw
- Af0B/wIuAewB/wInAeoB/wKrAf0B/wKzAv8CrAL/AoEB/QH/AjIBmQH7Az4BawQAAVMCUgGoAe8BqQFm
- Av8B1QGzAf8B+wHAAZgB/wHxAawBgAH/Ad8BpAGCAf8B3QGpAYwB/wHlAZQBVgH/Ad8BhAFAAf8B7AHR
- AcIB/wH2AfAB7AH/AdIBaAE0Af8B0gFZAR8B/wHYAVYBGgH/AeMBVgEUAf8BXgJcAc4EAAMaASUBawFH
- AVkB9QHtAcsBzwH/Ae8BxgHIAf8B4AGLAZIB/wHNAVgBZwH/AaoBRAFgAf8BZgE7AWUB/wE+AS8BXwH/
- AZMBPgFXAf8B6AFgAWwB/wFnAU4BUQHyAzkBXwMGAQgEAAJYAV8B4wERARAB8wH/AgAB4wH/AgABwgH/
- AWQBbwHEAf8B7AH9AfsB/wHfA/8B1wP/AdED/wHJA/8BwgP/AbkD/wGuA/8BpQP/AUMB2QHyAf8DWAHA
- AzcBWgJMAXcB9AJYAf0B/wK7Av8CyAL/AsQC/wI+AfQB/wIfAZIB+wI0AYQB+AI9AfEB/wLBAv8CxgL/
- Ar8C/wKUAf4B/wJEAZIB+AI9AT4BagMpAT4BygFpATsC/wHZAbQC/wHLAaYB/wHpAaUBawH/AekBzwHB
- Af8B9gH1AfQB/wHWAYgBTQH/AdsBiAFMAf8B9wHxAe0B/wHnAcoBuQH/AdMBYgErAf8B1wFlAS8B/wHu
- AWsBKQH/Ac8BQgEOAf8DOwFjBAADGgElAWcCUgH0Ac0BWwFhAf8BrwFHAVcB/wGBAT8BYQH/AT4BPQGB
- Af8BEQE3AYUB/wEAATUBhgH/AQgBRwGWAf8BMAGGAbYB/wGYAaoBvwH/AccBhwGeAf8BXwEvAUYB+wNA
- AXAEAAIrAbEB/AEjASQB8gH/AjUB6wH/AgAB3gH/AToBPgHKAf8B9AH/AfQB/wHsA/8B0QP/AbgD/wGZ
- AfUC/wFrAeoB/AH/AVAB2gH2Af8BQAGzAcUB/QEyAZIBswH7ATsBaAGJAfYDSgGLAkgBcwH2Al8C/wLU
- Av8C3wL/AtMC/wJOAfcB/wJAAXcB9AMzAVMDLQFFAkoBdQHyAlMB9AH/AtIC/wLZAv8C1gL/AqoC/wJD
- AZUB+wMGAQgBUgJQAaMB6AGoAWsC/wHcAbgB/wH1Ab4BlQH/Ad4BqwGOAf8B8AHmAeMB/wHlAcoBuwH/
- AewB2QHRAf8B6gHaAdIB/wHUAYcBTwH/Ad0BgQE/Af8B7QGKAUEB/wHsAWcBJwH/AVsCWQHDAw0BEQQA
- AxoBJQFZAUQBWQH1AUQBPAFkAf8BFQFAAW4B/wEAAUsBpAH/AQABTgGqAf8BDgFsAbwB/wEzAacB2gH/
- AVQB0wH1Af8BagHyAv8BgQH7Av8BjwHtAv8CXAF9AfgDLwFKBAACJgGPAfoCCAHuAf8BHwEeAfgB/wEK
- AQcB6gH/AUABQwGzAf0BZQF3AYMB9AFZAWYBcAHsAV0BYQFiAeIBWQJcAcwDVgGzA1ABnQNFAX0DOQFf
- AzABSwMgAS4EAAJZAVwByQJMAe0B/wLJAv8C7QL/AloB+wH/AjYBeQH2AzYBWQgAAy8BSgJRAXIB8QJl
- AfgB/wLrAv8C3gL/AosB8wH/AloBXgHVBAADFgEeAVsCWAHLAekBqAFsAv8B3gG4Af8B9gHBAZoB/wHg
- AaUBgwH/AeYBuwGkAf8B4gGvAZQB/wHaAY4BVQH/AewBmQFYAf8B+QGgAVkB/wHsAYEBNwH/AWACWgHe
- Ax8BLQgAA0UBfQFWAZYB0AH+ASIBmgHXAf8BAQFmAcEB/wERAZwB4AH/ATIBvgHuAf8BUQHgAf4B/wFk
- AfAC/wFpAekC/wFsAakB0gH+AVgBZAFwAe8BVgJYAbkDLwFKCAACTwFQAZsCHgGMAfwBJwElAbkB/gJc
- AWEB3AEwAjEBTQMYASEDEQEXAwkBDCAAAxYBHwJZAVsBwwJLAesB/wJZAv8COwF3AfYDNwFbEAADMAFM
- AlMBcgHxAocB/QH/AoQB8gH/AlkBXAHMAx4BKwgAAxYBHgFVAlMBrQHOAW4BPwH/AfQBvAGRAv8ByAGb
- Af8B/QG9AY4B/wH9AbUBhQL/AbMBgAH/AfQBnQFZAf8B0AFaASkB/wFYAlYBvAMcASgMAAFZAWABbQHr
- AZYD/wGDAfoC/wEwAWQBoAH6AT4BdAGZAfgBVgHpAv8BTgHFAfYB/wFGAWwBhAH1AlkBWwHEA0ABcQMR
- ARdUAAMWAR8CWQFbAcMCRQFzAfQCNQE2AVgYAAMwAUsCTgFyAfICWQFcAc8DHQEpEAADBwEJAy8BSgNW
- AbYBaAFYAVIB7wGYAVEBSgH6AZYBTgFHAfoBcgJTAfEBWwJZAcQDNgFZAwoBDhAAA0MBdwFZAlwBzwFS
- AYEBnwH3AkgBSQGHAzsBZAFZAl0B1wNLAY4DIQEwUAADOAFeAVgBWQFrAesCVQFXAboDOgFhA1kBxwNZ
- AcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1wBzgNZAcMDNAFVDAADHAEo
- A1QBqwMzAVI0AAMRARcDOAFdA04BmQNWAbMDVgG8A1YBuwNVAbIDTgGUAzQBVAMMARA8AAM0AVQBTAFY
- AW4B7wErAdEC/wFTAWsBewHxA2EB7gPiAf8D3QH/A9oB/wPaAf8D2AH/AtsB2gH/At8B2gH/At0B2gH/
- AtgB1wH/A9UB/wPUAf8D0wH/A+AB/wOZAf8DVwG9CAADGAEhA1sB4QENAYABMgH/AVIBVwFUAe0DKwFD
- KAADAQECA0MBdwFlAl4B5QGoAWEBRgH9AdEBZAEaAf8B4AFrARsB/wHoAW8BHQH/AegBbQEeAf8B2wFn
- AR4B/wG6AVIBFAH/AW8BSQElAfoDWwHZAzgBXRQAAyMBMwNHAYIDIAEuAwEBAgMGAQgDDAEQAwMBBAQA
- AzIBUQFMAVgBcAHvASkBzQL/AUEBhgGeAfkCPAE9AWgDhAH3BP8D9AH/A/MB/wLxAfMB/wL4AfMB/wLx
- AegB/wLeAd8B/wPeAf8C6QHhAf8C8QHoAf8C7gHqAf8C5gHnAf8D9QH/A8YB/wNZAcMEAAMSARkDWwHh
- ASEBSwEAAf8BIQGAAVEB/wEAAaYBqAH/AVIBVgFUAe0DLQFGJAABUAJPAZsBrwF/AVIC/gHjAcIC/wHS
- AaUB/wHoAWQBAAH/AecBbgEbAf8B8AGGASgB/wH2AZIBPwH/AfUBmgFOAf8B8AGYAU8B/wHyAZUBQgH/
- AdMBXAEMAf8BUgE/ATcB9wM7AWQMAAMEAQYDVwG6AegBuAG6Af8DYQHkA1QBrgNcAckDYAHeA1kBvgM/
- AW8BWgJcAc0BbAHoAv8BPgF/AZwB+AM9AWkEAANzAfYD+wH/A+oB/wLqAesB/wLxAewB/wLUAdwB/wJE
- AdQB/wIiAecB/wJAAeQB/wJlAdcB/wKkAc0B/wPQAf8C5QHfAf8D7QH/A70B/wNWAcEDFAEbA1sB2QEj
- AVABAwH/ATgBTQEMAf8BKgE4AQAB/wETAWsBVAH/AQABngGnAf8BUQJUAe4DLQFGIAABngF2AU0B+gH4
- AcgBkQH/AfYB2gG5Af8B7wHDAZgB/wHVAWUBEwH/AdYBkwFOAf8B3gGdAVwB/wHgAZoBWQH/AdIBjAFM
- Af8B4AGTAU8B/wHtAaABWwH/AfUBjwEvAf8BzgFQAQAB/wNWAbsMAAMzAVIBowKNAfsB9gL6Af8BwAG5
- AboB/wHIAb0BswH/AeoB4QHRAf8B8AHnAdYB/wHaAdIBwwH/AZUBkAGHAf8BoQGeAZAB/wNfAdsDOwFj
- CAADdQH2A/wB/wLsAe0B/wPuAf8C+AHoAf8CbgHaAf8CAAH5Af8CAAL/AgAC/wISAv8CQQH2Af8CbwHY
- Af8CxAHOAf8C9QHvAf8DwAH/A1YBwQNYAd0BEAE+AQAB/wE5AUQBCgH/ATwBSwEQAf8BOgFOASgB/wFV
- AWEBKAH/ASABhQFaAf8BAAGbAawB/wFSAVYBVAHtAy0BRhwAAcUBkQF/Af4B8wHOAaoB/wH0AdsBvgH/
- AewBxAGfAf8BzgFwAS0B/wHaAaEBYAH/AdwBqQGBAf8B3AGmAXAB/wHZAZcBVQH/Ad0BjQFCAf8B3wGT
- AUkB/wHfAY0BNwH/AdEBWQEAAf8DWAHACAADAQECA1UBsAH1Ad4B4AH/AcQBxQHGAf8BzQHHAboC/wH2
- AdwC/wHzAdsC/wHyAdsC/wH4AeEB/wH5Ae0B1gH/AZkBlAGBAf8DRAF6DAADdQH2A/0B/wLtAe4B/wL1
- AfEB/wLrAeIB/wI/AeEB/wIAAf4B/wIAAv8CAAL/AgAC/wICAv8CNQH9Af8CcAHWAf8D5AH/AscBxAH/
- A1YBwQNaAdsBIwFAAQAB/wE0ATkBAAH/AToBQAEjAf8CRQFOAf8BVwJlAf8BUQFiASQB/wETAW0BVQH/
- AQABlAGqAf8BTAFSAU8B7wMuAUgYAAG/AYgBdQH+Af0B6wHZAf8B/QHuAd4B/wHyAdABrQH/AdsBlgFF
- Af8B2wGmAWUB/wHWAaUBawH/AeIBrwGFAf8B4gGlAWAB/wHcAZABQAH/Ad4BlQFEAf8B2wGLASoB/wHN
- AVUBAAH/A1YBvggAAzABTAGEAm8B9QHvAeIB5QH/AcIBugG1Af8B+QHnAcoC/wHoAckC/wHhAb8C/wHg
- Ab8C/wHkAcUC/wH0AdcB/wHQAccBrgH/A1oB2AE2AjUBWAMQARUEAAN1AfYC/gH9Af8C8gHwAf8C+AHy
- Af8C6AHjAf8CPgHkAf8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CMAHpAf8CywHfAf8CzgHEAf8DVgHB
- AxABFgNbAdYBLAFNAQkB/wFlAWEBUQH/AU8BTAFPAf8CSQFOAf8BVAFiAWMB/wFKAWEBHwH/ASIBhgFg
- Af8BAAGMAZ8B/wFRAVQBUwHuAysBQxQAAbsBpwFZAf0B/wHtAdgB/wH8AesB2wH/Af4B5AHJAf8B7wG7
- AYgB/wHsAbYBgAH/AdQBowFjAf8B1gGsAYMB/wHnAbQBgQH/AfEBqgFVAf8B5gGgAUsB/wHbAY0BLQH/
- Ac0BVgEAAf8DVgG+BAADBwEKA1UBrQH5AdYB0wH/AecB1QHWAf8B1AHGAbsC/wHfAbYC/wHTAaQC/wHQ
- AZ4C/wHOAZ0C/wHPAaEC/wHhAbgB/wHkAdABsQH/AZMBhAFwAf8BzAGRAYkB/wFbAlgBywMpAT4DdQH2
- A/0B/wLtAe8B/wL3AfMB/wLxAeoB/wJjAeUB/wIAAf0B/wIAAv8CAAL/AgAB+wH/AgAB+AH/AgAB9QH/
- AkMB3wH/A+oB/wLKAcYB/wNWAcEEAAMPARQDWgHVATQBWgEVAf8BZwFoAVIB/wFfAVsBXwH/AVwBWgFk
- Af8BVwFiAV0B/wEzAVsBAAH/ARYBgAEmAf8BAAGbAWYB/wFSAVcBVQHtAy4BSBAAAbsBpwFYAf0B/wHr
- AdYB/wH9AewB2gH/Af0B5wHQAf8B4QG7AZMB/wHnAbwBjwH/Ad4BsQGDAf8B0gGyAZIB/wHYAa0BgAH/
- AeQBmwFEAf8B4AGXAUEB/wHfAYYBHAH/Ac8BVwEAAf8DVgG+BAADLgFHAY4BgQGAAfcB/wHqAd4B/wHn
- Ac8BzAH/AdIBvwG2Av8BzwGeAf8B/gHLAZgB/wH+Ac0BoAL/AdEBowL/Ac4BnAL/AdUBnwH/Ad0BtwGO
- Af8BjwGNAYoB/wH6A/8B6gGoAaQB/wFAAj8BbwN3AfYC5wH8Af8CmwHdAf8C2AHpA/8B8QH/Ap0B5gH/
- Ai8B/AH/AhMC/wIMAfIB/wJrAeEB/wKhAd8B/wKsAd4B/wLfAeEB/wL5AfQB/wPGAf8DVgHBCAADCgEO
- A1sB1gEwAV0BDgH/AWwBbQFWAf8BaQFmAWgB/wEzAVYBFwH/ATUBYgEVAf8BVAGHASQB/wEkAaQBYQH/
- AQABpwGrAf8BUgFXAVQB7QMtAUUMAAG7AagBWAH9Af8B6wHUAf8B/AHrAdsC/wHrAdMB/wHyAdYBtAH/
- AeIBwgGfAf8B5wHCAZsB/wHYAbMBiwH/Ad0BqgFmAf8B4wGcAUUB/wHhAZoBRAH/AeABbgELAf8B0QFV
- AQAB/wNWAb4EAANXAboB3AGwAagB/wHbAbIBqAH/AcsBoQGeAf8BtwGoAacB/wHzAcQBowL/AdIBqgH/
- AfwB2AG8Av8B3gHBAv8B5AG/Av8B1wGkAf8BtAGPAWIB/wGgAaMBpQL/AfEB8AH/AWACXAHUAxgBIgN3
- AfYC+QL/AsQB6AH/Ar4B2gH/AtgB6gH/AocB8AH/Ak4C/wIlAfsB/wKCAeIB/wL+AecB/wL9AesB/wL3
- AeoB/wLrAegB/wP0Af8DyAH/A1YBwQwAAw8BFANZAdcBNAFjARIB/wE+AWEBGAH/ATMBXgEYAf8BWwJd
- Af8BYQGAAYEB/wFPAYkBIwH/ARABmAFQAf8BAAGeAakB/wFSAVYBVQHtAysBQwgAAbQBfgFmAfwB/wHq
- AdAB/wH9AesB2AL/AeYBywH/Af4B1QGpAf8B8QHDAZsB/wHpAbUBiQH/AeIBnAFOAf8B9AGmAU8B/wH4
- AakBTgH/AecBnwFGAf8B3wFwAQ4B/wHQAVYBAAH/A1YBvgQAA2EB5AHHAZ4BmwH/AeQByAHHAf8B8wLm
- Af8B1AHVAdcB/wHEAbQBrAH/AfIByQGtAv8B3wHIAv8B3gHLAf8B+wHaAbwB/wHMAaYBiwH/AY4BgwGB
- Af8B5AHjAeUB/wG+AqgB/QNAAXAEAAN3AfYG/wH5Af8C2wHlAf8CjQHSAf8ChgH2Af8CWgL/AikB9gH/
- AqsB5wH/AvwB7QH/AuwB7QH/AuoB6wH/A+gB/wP2Af8DyQH/A1YBwRAAAwoBDgNaAdgBHgFlAQAB/wFr
- AYgBVAH/AWsBYgFsAf8BUAFOAVUB/wFSAWQBYQH/AUYBiAEeAf8BFAGZAVcB/wEAAZUBqwH/AVIBVwFV
- Ae0DNAFVBAABtAGAAWkB/AH/AeoBzwH/AfkBzgGnAf8B+AHKAaQB/wHrAbwBmAH/AeUBuwGeAf8B6wHE
- AaoB/wHuAcEBoQH/AeoBsgGLAf8B7wGoAWcB/wHvAZIBPQH/Ae0BgAEKAf8B0QFZAQAB/wNWAb4EAAMt
- AUYDUwGqAZIBfQF3AfkB7wHDAcAC/wHpAecB/wHVAdQB1QH/Ab8BtAGvAf8BzgGyAaUB/wHQAa0BoAH/
- AbYBlgGLAf8BnQGRAZAB/wHVAckBywL/Ae0B6wH/AV0BWgFZAdIDEgEYBAADdwH2BP8D+AP/AfsB/wLG
- AeIB/wKKAdsB/wKOAfYB/wKSAfAB/wLiAe4B/wL0Ae8B/wPtAf8D6wH/A+oB/wP3Af8DywH/A1YBwRQA
- AwoBDgNbAdYBNwGIARkB/wFsAYcBVgH/AVUBUQFUAf8BQwFAAUsB/wFLAlcB/wEyAYUBAgH/ARgBoAFD
- Af8BCgGVATEB/wNTAaoEAAG1AYIBaAH8Af8BwQGJAf8BzwGJAUEB/wPfAf8BzwHVAdsB/wHBAcYByQH/
- AeAB5AHoAf8B1QHcAeIB/wHBAcwB1QH/AdEB2wHgAf8B2AHAAbIB/wHZAWQBIwH/AeIBYgEHAf8DVwG/
- CAADBwEJAyYBOQNQAZ4BawJiAe8B6wG3AbQB/wHrAdYB1QH/AdsB1wHWAf8B0gLXAf8BygGwAbMB/wHn
- Ab8BugL/AfIB6wH/AeoBsAGrAf8DRAF6CAADdwH2BP8D+QH/AvkB+AH/Av0B+gH/AssB4AH/AscB3AH/
- AvsB8gH/AvYB8wH/Au8B8AH/A+8B/wPtAf8D6wH/A/kB/wPNAf8DVgHBGAADEQEXAVkBXQFZAdcBNAGM
- ARUB/wFhAW0BSgH/AUgBPwFKAf8BRAFaATcB/wFNAaUBJgH/ASEBnwEAAf8DWwHhAx0BKgQAAbcBfAFJ
- AfwB7AGUATcB/wGtAWEBLgH/AcUBuwG0Af8BzwHLAcgB/wHeAeYB6gH/AdwB4wHoAf8BuwHAAcQB/wGe
- AYIBZAH/AagBgAFfAf8BogFvAWMB/wGbATcBEwH/AekBZwEcAf8DVgG+FAADIwE0A0wBkwNfAdsB5gGw
- Aa0B/wH6AeYB5AL/Ae0B7gH/AfwBwwG9Av8B3QHPAf8CXgFaAd0DEwEaCAADeQH2BP8D+wH/A/kB/wL6
- AfkB/wL8AfsB/wKsAc8B/wK6AdQB/wL5AfYB/wPxAf8D7wH/A+0B/wPrAf8D9wH/A88B/wNXAcIcAAMH
- AQoDWwHWATEBjQEUAf8BSgGAAScB/wFeAa0BPAH/AT0BsAEmAf8DWwHhAxUBHQgAAV8BXgFYAd0B9QGx
- AWAB/wHeAYoBMgH/AdIBXwENAf8BvwFfASEB/wHKAbEBoAH/AcgBtQGoAf8BqwFnAUMB/wGfAS0BAAH/
- AZsBHQEAAf8BlwEdAQAB/wHNAVEBGAH/AbEBbgEtAf4DQQFzHAADHQEpAUcCRgGAA2EB2gHgAagBpwH/
- Af0BzgHMAf8B5wGdAZYB/wNAAXAMAAOIAfgU/wL4AfwB/wLzAfoD/wH+Af8D/QH/A/wB/wP6Af8D+QX/
- A9MB/wNXAcIgAAMPARQBWgFeAVoB1QEjAZwBBQH/ASEBlgESAf8DWwHZAxYBHwwAAyUBNwFiAl8B4AHz
- AaoBUgH/AfMBnwFDAf8B6QGJASkB/wHVAW0BJgH/AcsBYgEhAf8BywFVAQ4B/wHKAVgBGAH/AdEBXwEg
- Af8B2wFrASgB/wGSAVwBPgH4A0wBkygAAxoBJAFAAj8BbwNeAdkBXAJZAcwDEwEaDAADWwHLA6UB/gOx
- Af0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsgH9A60B/gNqAfUDOwFlJAADDQES
- AVwBYQFcAdwDXAHcAxABFhQAAw0BEgNDAXcCWwFZAcQBZgFkAVwB5wF/AWUBUgH0AZkBdAFCAfgBhQFi
- AUgB9gFuAWEBVAHuAmABWwHWAVECTwGcAycBOhAAAyMBMwNWAbkDVAGrAxEBFwMQARYDIAEuAwEBAiMA
- AQEDBAQFAQcDDAEQAx0BKgMrAUMDLwFJAyUBNwMWAR4DEgEZAyABLgMtAUUDMgFQAzIBUQMuAUgDIgEy
- DAADBgEIA1ABpANZAc8DXAHOAlcBYAHoAUsBWQFsAfIDWwHhA1kBzANbAdADSAGEGAADBAEGAzQBVANW
- AbMBaQFkAVwB5wFzAWIBWAHvAXMBYgFYAe8BaAFfAVcB6AFXAlYBuAM2AVkDBwEJEAADXQHSAbUCmgH/
- AW4CWQH/A1ABngNaAdsDXgHlAx8BLCAAAwMBBAMKAQ0DEQEXAUACPwFuAWECXAHcAWECWgHkA1kBwwNC
- AXUDNQFWA0QBfAFdAlkB1wGOAW0BUQH3AZcBbgFBAfgBZQJeAeUDVAGrA0ABcQwAAxgBIQGGAoEB+gHe
- Ac4ByAH/Aa0BsQHOAf8BUAHCAfkB/wFfAeAC/wGHAakB4AH/AeQBzgHDAf8ByQLCAf8DVQGyFAADEgEY
- AVMCUgGoAfYBigFSAf8B8AG/AasB/wHjAcYBwAH/AdUBwAG+Af8B0wG/Ab0B/wHkAcYBwAH/Ae8BwAGt
- Af8B9gGPAVcB/wNVAbIDGAEhDAADWQHHAcgBswGyAf8BoAGHAYYB/QFfAVYBVAH7AWgCZQH/AV8CWQH+
- A1cB3wNZAckDWgHNA1oBzQNaAc0DWwHQA1kByQNFAX0DBgEIAyIBMQMwAUwDMQFNAlwBWgHNAf4BxgGm
- Af8B7AHQAcUB/wHOAX8BSwH+A1IBqQNKAYwBbAFhAVQB7gH2AcIBpQH/AdcCxgH/AdUBxQHGAf8B7wHI
- AbQB/wGiAW8BTQH6A04BmQgAAwQBBgMQARYDPgFrA0QBeQNCAXQBXwFvAXsB8wFtAaUBygH/A1cBxQM/
- AW0DRQF9AyEBMAMJAQwDBgEICAADEgEYAVsCWQHDAfMBqQGFAf8BzQG2Aa4B/wHGAbwBvwH/AfIB6gHt
- Af8BywHGAcgB/wHGAcIBwwH/AfQB7AHuAf8BxwG+AcIB/wHIAbIBrgH/AfQBsAGNAf8BWwJYAcsDFQEd
- CAADDwEUA0gBhANWAbsBegF8AX8B/gFuAZMBoAH/AW8BowGvAf8BqAGfAa0B/wHBAY4BmgH/Ac4BbAGD
- Af8B1gFiAWgB/wHhAW4BcAH/AeABawFvAf8B4AFrAYEB/wFXAkAB/QNEAXoDGgElAycBOwMnATsDSAGE
- AekBmwFcAf8ByAHFAdAB/wHqAbsBpAH/AV4CXAHOAVYCVQGxAfEBrwGJAf8BxgHBAcoB/wHcAbwBrgH/
- AeEBuwGpAf8BxAG8AcQB/wHrAb8BqgH/AVwCWAHRBAABSQJIAYgDXAHnAVsCWAHpAVwCVwHfAWECXAHc
- A1sB2QGPAYkBiAH7AbgBogGeAf8DXQHtA1sB2QFeAlgB3QNaAeQDYAHrA1sB4QM6AWIDCAELAVQCUgGm
- AfYBpQFlAf8B1gG9AcMB/wG0AbAB1gH/AtwB2QL/Af4B/AH/AfcC9QH/AvUB9AL/Af0B/AH/A90B/wHa
- AdMB1wH/AeAByAHFAf8B8wGlAWwB/wNVAbIDCgENBAADUgGoAWACZAHsAYYBkAGTAfsBtAHiAesB/wG0
- AfMC/wGrAf4C/wGUAfcB+gH/AZEB2wHkAf8BjgGzAcAB/wGGAYEBkwH/AWQBNAE3AfwBYgJXAe8B0AJS
- Af8B3gFvAXAB/wNWAbMHAAEBAwcBCQMPARQBXAJaAc0B4gHDAbYB/wHSAcoB0QH/AaIBcAFNAfoBagFU
- AVEB7gHhAcIBtQH/Ac8BxgHMAf8BxAF/AUwB/gG7AVQBPAH9AdcBxgHFAf8B2gHFAcIB/wF7AWcBTwHy
- BAABjAKIAvkC+AH/AeEC3wH/AdwC2gH/AdkC1wH/AcoCxwH/Ad8C3gH/Ae0C6wH/AfcC9AH/AfUC8gH/
- AfYB8wH0Af8B7gHwAewB/wHMAewB0AH/AdEBzwHLAf8DVgG7AzABSwG9AVMBQAH9Ac0BoQGKAf8B2AHU
- AdUB/wLWAfsB/wLQAfoD/wH9Cf8B/gL9Av8C/gH/Af4C/AH/AdkB1gHaAf8BygGhAY4B/wHnAWgBNwH/
- ATYCNQFYBAABdAGMAZsC+gP/AdoD/wGvAfMC/wGMAeAC/wGJAeoC/wGHAfYC/wGTAf0C/wGeA/8BkwHz
- Af4B/wNXAd8DKQE+AZECWgH7Ad8BaQFoAf8DVQGyAwABAQMKAQ0DHAEoAzIBUAFMAksBkAHCAX8BWgH+
- AdMBzgHWAf8B4AG6AaYB/wHhAV0BFQH/AdsBwQG3Af8B1wHLAc8B/wGBAWIBSAH2AXcBWwFTAfEB4AHI
- AcMB/wHYAsgB/wGaAWoBQQH5BAABpgKdAfwB7ALvAf8B1QLWAf8D2QH/AdcC2AH/AcsCzAH/AeEC4gH/
- AewC7QH/AuoB6wH/AeoC7AH/AewC7QH/AegB6gHpAf8B5gHvAegB/wHhAt4B/wNVAboDUgGpAesBkQFM
- Af8BywG2AbMB/wHaAd0B3gL/Av4B/wHFAcYB/AH/AtIB+hL/Av4B/wHdAd8B4QH/AcoBuAG3Af8B7QGV
- AVEB/wFYAlYBuQQAAW4BhwGMAfcB3AP/AaIB6wL/AYAB3AL/AVYB0QL/AV4B3QL/AVoB5AL/AWUB6AL/
- AYUB9QL/AYwB+QL/A1sB4QMgAS4BjwJNAfoB3QFpAWoB/wNVAbEDBgEIAzcBWgFgAlwB1AF8AV8BTAHz
- AXsBXwFMAfMBuQFhARkB/gHgAbkBpgH/AdQBzwHVAf8B7wGZAVUB/wHgAbsBqgH/AdYBzwHVAf8BxQF/
- AUsB/gG5AVABNQH9Ad0BzAHKAf8B3gHLAcgB/wF+AV8BTAHzBAABjQKLAfkB7gLwAf8C5gHlAf8D5gH/
- A+YB/wHoAukB/wHmAuUB/wHsAekB5gH/Ae8B7AHmAf8C6QHmAf8D4wH/AeMC4gH/Au8B8AH/AdkB1AHV
- Af8DVAGvAWECWwHhAegBlgFVAf8B8wHsAe8B/wH+Af0E/wH+Af8C9wL/ArkB+wH/AtwO/wP+Av8C/gH/
- AfQB7QHyAf8B5wGYAVsB/wFmAlcB6AQAAV8BcQF8AfMBsAH2Av8BawHaAv8BRAHMAv8BKwHBAv8BTAHT
- Av8BOQHUAv8BQwHYAv8BVQHjAv8BXgHsAv8DXgHlAykBPgGPAk0B+gHdAmkB/wNVAbEDKgFAAYABWQFC
- AfUB4wHEAbYB/wHeAdcB3AH/Ad4B1gHbAf8B4AG4AaEB/wHjAZgBWAH/AdYBzwHTAf8B5wG/Aa0B/wHv
- AbUBlQH/AdMB0AHYAf8B5AHBAbEB/wHoAbwBpgH/AdQB0AHWAf8B6gHDAa8B/wFeAlwBzgQAA2UB5QT/
- AfwD/wH5Af0B/gH/AfQB+wH9Af8B8wH8Af4B/wHrAekB6wH/AcABxwHaAf8BrAG0Ac8B/wHJAcQBzwH/
- AuMB4AH/Ad0C3gH/AeYC6AH/AbMCrQH/A0gBhwFsAlQB7gHZAYUBRAH/AcUBwwHJAf8B8gHzAfQJ/wL0
- Av8BsAGqAcgB/wGxAacBowH/AeYB4gHfAf8B+gL5Bf8B9gH1AfYB/wHHAcgBzgH/AdkBjAFQAf8BbgFY
- AU4B7wQAAVkBbwF7AfIBiQHrAv8BTQHQAv8BQAHLAv8BRgHOAv8BYAHZAv8BVgHbAv8BQwHWAv8BQAHY
- Av8BRAHlAv8BWAFZAWAB6wEsAisBQwGPAk0B+gHcAWkBagH/A1UBsQNVAbUB3wGzAZkB/wHaAdcB4AH/
- AdsBsQGbAf8B3AG2AaEB/wHXAdYB3wH/AeoBtQGYAf8B6QG7AaUB/wHXAdMB2gH/AfMBqgGAAf8B6gG8
- AaQB/wHeAdcB2wH/Ad4B2AHdAf8B6QHOAcIB/wGlAV8BQAH7AzgBXAQAA1cBugHrAeAB3AH/AeEBxwG+
- Af8B1wHKAcgB/wHcAcIBugH/AdEBowGZAf8BXgGjAdwB/wE4AbYB7QH/ARwBxwHqAf8BFwGDAcwB/wGs
- AagBvAH/AdkB0gHNAf8B2gLXAf8BcwJwAfwDLwFKAWsCVAHuAdsBhQFCAf8ByQHIAcwB/wH2AvcF/wHv
- AuwB/wHNAcIBvgH/AbsBsAGrAf8BkwGKAasB/wG0AagBtgH/AcUBuQG1Af8B0gLLAf8D8QH/Ac4BzwHV
- Af8B3AGMAU4B/wFrAVgBTwHvBAABVQFhAWUB6gGGAd0B/gH/AYkB4AL/AYUB2wH7Af8BaAHKAfEB/wFR
- AbgB6wH/AW8B0AHyAf8BhgHbAv8BhQHjAv8BWQHgAv8CWgFfAdsDJAE1AY8BTQFOAfoB3AFpAWoB/wNV
- AbEBYwJYAekB3gHJAcIB/wHhAdYB1wH/AbMBSwEwAf0BtwFUAUAB/QHgAdoB3QH/AeMBxgG6Af8B9wGe
- AVoB/wHdAdYB2gH/AeYByAG7Af8BxgFvASsB/gF5AWcBVQHyAXsBZwFXAfIBXAJZAc8DNQFXAwcBCQQA
- A0gBhgG8AaABnAH/AeMBcAEwAf8B3wGjAWoB/wHrAZ8BZQH/AdMBMgEIAf8BRwGEAbYB/wFXAd0C/wFS
- A/8BHAHLAfsB/wFfAYABtwH/AeEBywHEAf8B2gHIAckB/wFiAlcB8QMVAR0BXQJXAd8B6QGQAUcB/wH0
- AesB7gH/AvkB+gH/AdICygH/AboCrAH/AdYBzwHOAf8B+wH5AfgB/wHqAewC/wHsAe0B/QH/Ae8B6wHo
- Af8B3wLZAf8B+QH4AfkB/wH1Ae4B8gH/AecBkgFOAf8BZQJXAegEAAM1AVcDVQG1AV0BZwFtAe0BhgGl
- AbMB/wFrAYsBmAH/AWEBgwGUAf8BXAGTAakB/wFOAX8BlAH+AU4BZQFtAfQCWgFdAcoDLwFKAx8BLAGD
- Ak0B+gHiAWwBbQH/A1UBtAF8AV8BTAHzAeMB0wHPAf8B5wHXAdUB/wF3AV0BTAHzAXsBYgFIAfQB5gLb
- Af8B4wHRAcsB/wHgAWIBHwH/AeQBtwGfAf8B4AHhAeoB/wHEAX8BbQH+A1MBqgM2AVkDFQEdAwMBBAgA
- AzQBVAGIAX8BgQH+AewBmQFQAv8BzAGOAv8B3QG3Af8B8wFZAScB/wGOAVkBYwH/AT8BxAH+Af8BRwH4
- Af0B/wEZAeEB+gH/AS0BbQHXAf8B4AHKAc0B/wHMArgB/wNYAd0DBgEIAVICUAGjAeoBjAFBAf8BzwGv
- AacB/wG6AbQBuAH/AcwCwgH/AfMC8Rn/AdsB3wHiAf8ByAGvAagB/wHrAY8BQgH/A1UBtQwAAzYBWQF/
- AX4BdwH+AYIBbwFtAf8BnAGNAYYB/wHFAaYBoQH/AX8BdgF7Af4BYgJZAfUBZAJcAecDWgHYA1kB1wGd
- AWoBaAH+AeECgQH/A1ABnQFnAWEBWAHmAecB1AHOAf8B5gHeAeAB/wG1AXABNwH+AbcBeQFCAf4B5gHg
- AeQB/wHpAdMBygH/AWkBVAFTAe4BgQFiAUgB9gHmAeAB4gH/AekB1AHMAf8BZAJcAecDOgFhAyMBMwMI
- AQsIAAMaASUBbAFqAWwB9QHVAaMBjAH/Af0BtgFbAv8B5QGsAf8B+QGDATQB/wHCAVoBQQH/AVoBrwHK
- Af8BVgG1AZgB/wFTAbgBkAH/ATwBcAGLAf8BxQG3AbwB/wG4AqEB/wNWAbgEAAMtAUUBnQFfAUUB+wHT
- AZEBXQH/AdQBygHQCf8B/gL9Cf8D/QL/Av0B/wH+AvwB/wHaAdYB3AH/AdABlQFkAf8B2QFvATsB/wMz
- AVMMAAM1AVUBdAFzAXIB/gFaAlwB/wFoAmQB/wG7AZ0BlwH/AfcBxQG8Af8B+wHEAb0B/wH5AcIBuwH/
- AfEBsQGrAf8B6gGfAZkB/wHqAZMBkAH/AWACWQHrAxwBKAFTAlIBqAHnAb8BpwH/AucB7gH/AecByQG6
- Af8B5wHKAb0B/wHnAegB7wH/AegBvAGgAf8BUQJQAZ8DTgGYAecBvQGlAf8B5wHrAfUB/wHiAakBhwH/
- AVICUAGkAygBPAMMARAIAAMGAQgDXgHdAbgBogGjAf8BawFTAZ8B/wGWAXABnwH/AZQBYgGbAf8BTwE1
- Aa8B/wFUAYMBSQH/AUMBwwFUAf8BlgH2AbMB/wFWAckBWQH/AWwBiAFWAf8DfwH+Az8BbQQAAwcBCQNQ
- AZ4B6wGjAWEB/wHnAbcBowH/AdcBzgHSAf8B1gHYAdoB/wH+AvwB/wH1AvQB/wH0AvMC/wH9Af4B/wHa
- AdwB3QH/AdYBzwHSAf8B5QG3AaYB/wHsAaYBZAH/A1MBqgMJAQwMAAMfASwDagH5AWsCagH/AVEBUwFU
- Af8DUgH0A1EBogNWAbQDXAHJA2AB3gFqAWUBZAHtAVsCWQHEAx0BKgQAAx0BKgFnAWEBWAHmAegBzgG8
- Af8B6ALjAf8B6AHiAeMB/wHoAcoBuAH/AWQBXAFVAeoDJQE3AxgBIgF+AV8BTAHzAekB2AHPAf8B6gHO
- AbsB/wFdAlkB0gMcAScDBwEKDAADKgFBAk8BTgGXAlcBZgHoAWcBagH5Af8BnQGmAf4B/wEoASkB9gH/
- ASEBIwEyAfsBOgG9AU4B/wGiAf8BzgH/AYwB/wGwAf8BIQFgARkB/wNTAaoMAAMMARABVwJVAboB7AGw
- AYAB/wHRAaUBkAH/AcgBsgGxAf8B8gHmAegB/wHKAcIBxAH/AcUBvQG/Af8B8wHoAeoB/wHKArYB/wHN
- AaMBkQH/Ae4BtAGFAf8BWQJXAcIDEAEVFAADWwHLA9cB/wOTAf8DUAGjEAADBgEIEAADJAE2AVsCWQHE
- AZABagFHAfkBkgFrAVgB+AFaAlcBxQMpAT4DBgEIAwABAQM9AWkBXAFaAVkBzAFcAlkBzAM7AWMDBwEK
- AwEBAhQAA0MBdwFmAWgC/wHLAcwC/wFdAVsC/wEQARQBXAH9ASkBcQEqAfoBYwGaAX8B+QFhAXMBYwHu
- AUABgAFGAfcDRwGDEAADDQESAlABTwGbAd8BnAFZAf8B7AG+AZwB/wHnAcIBrwH/AdkBtQGpAf8B1wGz
- AagB/wHnAcIBrwH/AewBvgGdAf8B4QGgAV4B/wJSAVABowMTARoYAAMnAToDcAHxA14B2QMUARtwAAMQ
- ARYCWgFgAd4CqAHRAf0CTQGvAfoCWgFeAdUDOwFkAyYBOAMSARkDKAE8AxYBHxgAAy0BRgNRAaIBXgFc
- AVcB3wFuAWMBXgHuAW4BYwFfAe4CYQFbAeECUwFSAagDMAFMAwIBA7gAAyMBMwNZAewDVgG+AxIBGQgA
- AxEBFwNTAaoBXwFcAVUB6gFqAWYBVwHyAWIBXQFaAe0DWQHHAyoBQQQAAwkBDBwAA0YBgQNWAbsDVQG1
- A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1YBtgNWAbsDPAFoDAACOQE6AWACQQFu
- AfUCWQFdAdcDSgGLAy4BSAMYASEDBwEKQAADJgE5A1gB6QHyAucB/wHaAtAB/wNXAcIDEgEZAxEBFwJe
- AVsB2QH3AdgBqwL/Ad4BrQL/Ad0BrgL/AewBwgH/AegBzgGqAf8BYgFYAVcB7wNZAdIDWwHhA1kBwwNQ
- AZ0DPwFuAyABLgwAAbcBXQFAAf0B8AGKASUB/wHtAW8BGgH/Ae4BbgEZAf8B7gFrARUB/wHuAWgBEAH/
- Ae0BYwEGAf8B7QFeAQAB/wHtAV8BAAH/Ae0BWwEAAf8B7QFYAQAB/wHtAVUBAAH/AfIBUwEAAf8B4wFR
- AQAB/wNZAcQMAAJRAVIBpwImAd4B/wIbAdUB/wIKAboB/wIAAaMB/wJRAWEB7gJVAVYBtANAAXEDMgFR
- AxQBHDAAAycBOwNcAecB6gLfAf8B7ALiAf8B5gLZAf8B3ALVAf8DWQHEA1QBrgH6AbwBgAL/AdsBoQL/
- AcUBhgH/Af0BwgGEAf8B+AHCAYgC/wHdAakB/wHqAbUBhwH/Ab0BogGXAf8B4AHdAeAB/wHnAeIB4wH/
- AdMBzAHNAf8BlAGMAY0B/gNlAfQDWQHHAzEBTwQAAb4BfwFGAf4B9gG3AYoB/wH0AboBlAH/AfIBtwGP
- Af8B8gG2AY8B/wHyAbUBjQH/AfMBtAGIAf8B8wGxAYUB/wHxAa4BgAH/AfABqgFtAf8B8AGqAWwB/wHv
- AakBawH/AfMBrAFuAf8B7wFtAR4B/wNWAcEIAAMKAQ0CXAFeAc4CNAHzAf8CJQHsAf8CGQHmAf8CDAHe
- Af8CAAHPAf8BlwGRAcUB/wG0AasBsAH/AWYBYAGWAf8CWwFeAdkCVQFWAbEDQAFxJAADJAE2A1kB7AHp
- AtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFaAlgB7gFzAV8BTAHzAa4BVgEaAf8B5gGcAUMC/wG+
- AVsB/wHtAaQBRwH/Aa4BUQETAf8B5QGhAU0B/wHeAZYBRgH/Ac0BnwFvAf8BzQHCAcEB/wHsAdwB2AH/
- Ae8B2QHXAf8B8AHeAdwC/wH9AfwB/wHgAtQB/wNWAbgEAAGzAX0BSwH+Af8B8QHzAf8BmQHgAbAB/wE0
- AccBTgH/ATMBwQFIAf8BIQG1ATAB/wGsAd0BuAH/Af0B7wH2Af8B+QG2AYcB/wH7AbMBgwH/AfoBqwFq
- Af8B9QGsAYAB/wHpAecB7gH/AeMBjwFRAf8DWAHACAADLAFEAkMBfQH2AjwB9wH/AisB6gH/Ah8B5QH/
- Ag4B4AH/ARkBGAHdAf8B3QHUAeAB/wH3Ae0B3gH/AekB3gHYAf8B3QHSAcwB/wHMAcIBvAH/Ak0BbwH6
- IAADJAE1AVwCWQHsAesC5AH/AfUC7QH/AeoC4gH/AfsC+AH/AfYC9AH/AV8CWwHsAyYBOAF/AVgBKwH8
- AYQBMQEAAf8B2wGWAUEB/wHyAbkBZQH/AbcBawEtAf8BZAEhAQAB/wGVAUABAgH/AckBiAE0Af8BzwGc
- AWMB/wHkAcwBxAL/Ae0B3wL/AeIB0QH/AfkB1QHGAf8B2AHAAbsB/wFhAl8B6AMpAT8EAAG0AX8BTwH+
- Af8B7wHwAf8BhQHdAZoB/wEXAc8BNQH/ARABwQEmAf8BAAGpAQAB/wGXAdMBmwL/AucB/wH9AbABZAL/
- AbEBaAL/AaEBTwH/AfwBnAFNAf8B7QHgAd4B/wHkAZABTwH/A1gBwAgAAjwBPQFnAisB4QH/AjoB+QH/
- Ai8B7QH/AicB6AH/AhAB4gH/AUcBRAHeAf8B8wHsAd8B/wHoAd8B2wH/AeIB2AHaAf8B6AHdAdsB/wHs
- AeEB3AH/AloBXQHTHAADJAE2AV8CVwHoAesC5gX/AfgC9gH/AfoC9gH/AfIC7wH/AWQCYgHnAycBOwQA
- AXkBZQFMAfQB4AGnAVgC/wHfAbMB/wHHAaYBhgH/AZ8BawFLAf8BngFqAUcB/wGEAUUBGgH/AW4BMgEA
- Af8BqAFmAUMB/wNlAfQDYgHpAY4BfwF9AfgBZgFiAWEB7QFQAk8BmwMKAQ4IAAGyAX8BUwH+Af8B7wHu
- Af8BhwHhAaEB/wEgAd4BTAH/ARoB0gE9Af8BAAG4AREB/wGXAdYBnwL/AeoB6QH/Af4BtgFuAv8BvAGJ
- Af8B/gGsAWAB/wH8AaIBVgH/AfAB5AHiAf8B5AGTAVIB/wNYAcAEAAMEAQYDUQGiAoMB9AH/AVIBUQH5
- Af8BLgEtAfIB/wEdAR4B7AH/AQoBCwHmAf8BkgGPAeIB/wH6AfEB4QH/AeQB2wHcAf8B4wHZAdoB/wHv
- AeQB3gH/AcIBuAHGAf8DSAGFEAADGgElAyoBQQM4AVwDXgHlAe4C6A3/AfEC7gH/AWICYAHpAyYBOQgA
- A1YBswHvAcoBoQL/AfsB9AH/AfkB9AHuAf8B7AHZAcYB/wHtAdgBwAH/AecB0gG6Af8BzQGRAU4B/wFy
- AVABPAH+A0QBegMDAQQDEQEXFAABrwF/AVcB/gH/Ae8B6wH/AbwB7gHHAf8BigHmAZQB/wGJAeMBjwH/
- AWkB2QFsAf8BxgHpAccC/wHxAfAC/wHPAZkC/wHRAZwC/wHKAZMB/wH9AccBlAH/AfQC6wH/AeMBkQFT
- Af8DWAHABAADFAEbAV0BXAFhAeEC+QH4Af8B6AHkAfEB/wHGAcAB7wH/AZABjQHsAf8CQAHoAf8BywHF
- AeUC/wH3AeIB/wHzAeoB4AH/Ae0B4wHdAf8B9wHsAeMB/wGYAZABsAH/AywBRAgAAxYBHwNUAasDZAHn
- AWMCXwHwAWsCagH5AeAC1g3/Ae8C6wH/AWQCYwHsAyMBMwwAAxEBFwJhAVwB3AH4AeYB0wb/AfYB6wH/
- AfsB7QHcAf8B9wHbAb4B/wHjAb8BpwH/AasBpwGvAf8CYgFmAfUDXAHqA1sB2QNZAcMDUgGmAzcBWgMD
- AQQEAAGuAX8BWgH+Af8B9gHmAf8ByAHHAfMB/wGUAYsB3gH/AZcBjgHeAf8BlAGKAdkB/wHYAdMB7gH/
- AfUB9gH7Af8BmAGtAf4B/wGPAacB+wH/AYwBoQH6Af8BlgGmAfoB/wHvAfAB9wH/AekBlQFOAf8DWAHA
- BAADJgE5ApYBzwP/AfwB/wH5AfYB8gH/AfwB9wHvA/8B6wH/AdkB1AHoAf8BNgE1AeYB/wFcAVgB4gH/
- AaABmgHgAf8ByQHCAdwB/wHvAekB4gH/AWIBXgFkAewDFgEfBAADFQEdA1oB0wHHArgB/wHxAuUB/wH5
- AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wNgAesDJQE3FAADCQEMA1ABngFmAWIBXQHqAeQBzQG/
- Af8B4gG/AakB/wG+AVcBGgH/AcYBhAE9Af8B1QGsAW0B/wHLAawBiwH/AdEBuQGiAf8B3QHHAbgB/wHY
- AckBwgH/AdEBwwHFAf8DXQHiAwwBEAQAAa8BfwFfAf4B/wH+AeoB/wFeAWMB3gH/AgABwwH/AgABtwH/
- AgABnwH/AZkBmAHTAf8B7gHwAv8BFwFXAfwB/wEFAVQB/QH/AQABOAH8Af8BDQE5AfwB/wHpAesB+QH/
- Ae4BnQFRAf8DWAHABAADQwF4AsgB5gP/Af0B/wH2AvMB/wHzAe4B8QL/AfsB7QH/AawBpwHsAf8BFgEX
- AeoB/wIOAeQB/wEAAQEB3wH/AgkB3AH/AS0BKgHWAf8DVAGvAwcBCQQAA1ABmgG8Aq8B/wHpAtoB/wHp
- At0B/wH0AuoB/wHzAu4B/wH2AvQB/wHuAucB/wHmAt8B/wNfAeADJwE7IAADLgFIAZEBiwGPAfwB1AG1
- AagB/wGyAS0BAAH/AcwBTgEAAf8BzwFdAQAB/wHSAWgBAAH/Ac8BaAEDAf8BzQFgAQEB/wG+AVQBEQH/
- AdABuAGvAf8DWgHVAwMBBAQAAa0BfwFkAf4B/wH+AegB/wFiAWcB6AH/AgAB3wH/AgAB0gH/AgABuAH/
- AZwBmwHaAf8B7gHwAv8BKwGFAf0B/wEfAYwB/QH/ARMBXgH8Af8BHgFSAf0B/wHqAewB/AH/AewBnQFU
- Af8DWAHABAADWQHHAvoB/QL/Af0B+wH/AfgB9AH1Af8B9wHzAfIC/wH8Ae8B/wFwAW4B8AH/AScBKAHu
- Af8CKAHoAf8CFwHhAf8CBQHhAf8CAAHFAf8CPwFAAW4IAANhAe4B3ALJAf8B3QLNAf8BvQKvAf8BnwKV
- Af8B3wLUAf8B8wLvAf8B+wL2Af8BZwJlAfQDNAFUJAABRwJGAYEB1wHaAd8B/wG/AY8BhAH/AawBHwEA
- Af8BwAFEAQAB/wHIAVEBAAH/AcsBVgEAAf8BygFUAQAB/wHHAUgBAAH/Ab0BQgEAAf8BxAGsAaYB/wNV
- AbIIAAGsAX8BaAH+Av8B7AH/AYgBjQHqAf8BDwERAdwB/wETARUB1gH/AQwBDgHDAf8BrAGtAeMB/wHx
- AfUC/wFBAYoC/wE1AY4C/wEsAWwC/wE5AWYC/wHuAfIC/wHrAZ0BWAH/A1gBwAQAAlkBdQHyAu0B9wH/
- AvkB/AP/Af4D/wH5Af8B8wHwAfUB/wFTAVIB9gH/Ai8B8QH/AioB6gH/Ah8B5AH/AhUB6AH/AiEBhQH8
- AjABMQFNCAADbQH3Ae8C3AH/AcACsgH/A1UBtQM/AW8BogKZAf8B9ALrAf8B+ALxAf8BagJoAfIDKgFB
- JAADVQGyAegB5wHoAf8BqQFOAT4B/wGyASYBAAH/AckBUQEAAf8B2gFhAQAB/wHeAWcBAAH/AdABVwEA
- Af8BuwE1AQAB/wG1AUUBGwH/AbwCrgH/A0gBiAgAAacBfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHi
+ DAADHAEoA1QBqwMzAVI0AAMRARcDOAFdA04BmQNWAbMDVgG8A1YBuwNVAbIDTgGUAzQBVAMMARA8AAM0
+ AlQBWAFjAe8BJQHRAv8BUwFkAW4B8QNhAe4D4gH/A90B/wPaAf8D2gH/A9gB/wLbAdoB/wLfAdoB/wLd
+ AdoB/wLYAdcB/wPVAf8D1AH/A9MB/wPgAf8DmQH/A1cBvQgAAxgBIQNbAeEBBwGAASwB/wFYAV0BWgHt
+ AysBQygAAwEBAgNDAXcBZQJeAeUBqAFVAUAB/QHRAV4BFAH/AeABZQEVAf8B6AFpARcB/wHoAWcBGAH/
+ AdsBYQEYAf8BugFMAQ4B/wFpAU0BKQH6A1sB2QM4AV0UAAMjATMDRwGCAyABLgMBAQIDBgEIAwwBEAMD
+ AQQEAAMyAVEBVAFYAWQB7wEjAc0C/wFBAYABjQH5AjwBPQFoA30B9wT/A/QB/wPzAf8C8QHzAf8C+AHz
+ Af8C8QHoAf8C3gHfAf8D3gH/AukB4QH/AvEB6AH/Au4B6gH/AuYB5wH/A/UB/wPGAf8DWQHDBAADEgEZ
+ A1sB4QEbAUUBAAH/ARsBgAFLAf8BAAGmAagB/wFYAVwBWgHtAy0BRiQAAVACTwGbAaMBfwFSAv4B4wHC
+ Av8B0gGlAf8B6AFeAQAB/wHnAWgBFQH/AfABhgEiAf8B9gGSATkB/wH1AZoBSAH/AfABmAFJAf8B8gGV
+ ATwB/wHTAVYBBgH/AVIBSgE9AfcDOwFkDAADBAEGA1cBugHoAbgBugH/A2EB5ANUAa4DXAHJA2AB3gNZ
+ Ab4DPwFvAVoCXAHNAWYB6AL/AT4BeQGQAfgDPQFpBAADYgH2A/sB/wPqAf8C6gHrAf8C8QHsAf8C1AHc
+ Af8CPgHUAf8CHAHnAf8COgHkAf8CXwHXAf8CpAHNAf8D0AH/AuUB3wH/A+0B/wO9Af8DVgHBAxQBGwNb
+ AdkBHQFKAQAB/wEyAUcBBgH/ASQBMgEAAf8BDQFlAU4B/wEAAZ4BpwH/A1QB7gMtAUYgAAGPAXABTQH6
+ AfgByAGRAf8B9gHaAbkB/wHvAcMBmAH/AdUBXwENAf8B1gGTAUgB/wHeAZ0BVgH/AeABmgFTAf8B0gGM
+ AUYB/wHgAZMBSQH/Ae0BoAFVAf8B9QGPASkB/wHOAUoBAAH/A1YBuwwAAzMBUgGWAocB+wH2AvoB/wHA
+ AbkBugH/AcgBvQGzAf8B6gHhAdEB/wHwAecB1gH/AdoB0gHDAf8BlQGQAYcB/wGhAZ4BkAH/A18B2wM7
+ AWMIAANlAfYD/AH/AuwB7QH/A+4B/wL4AegB/wJoAdoB/wIAAfkB/wIAAv8CAAL/AgwC/wI7AfYB/wJp
+ AdgB/wLEAc4B/wL1Ae8B/wPAAf8DVgHBA1gB3QEKATgBAAH/ATMBPgEEAf8BNgFFAQoB/wE0AUgBIgH/
+ AU8BWwEiAf8BGgGFAVQB/wEAAZsBrAH/AVgBXAFaAe0DLQFGHAABuQGFAX8B/gHzAc4BqgH/AfQB2wG+
+ Af8B7AHEAZ8B/wHOAWoBJwH/AdoBoQFaAf8B3AGpAYEB/wHcAaYBagH/AdkBlwFPAf8B3QGNATwB/wHf
+ AZMBQwH/Ad8BjQExAf8B0QFTAQAB/wNYAcAIAAMBAQIDVQGwAfUB3gHgAf8BxAHFAcYB/wHNAccBugL/
+ AfYB3AL/AfMB2wL/AfIB2wL/AfgB4QH/AfkB7QHWAf8BmQGUAYEB/wNEAXoMAANlAfYD/QH/Au0B7gH/
+ AvUB8QH/AusB4gH/AjkB4QH/AgAB/gH/AgAC/wIAAv8CAAL/AgAC/wIvAf0B/wJqAdYB/wPkAf8CxwHE
+ Af8DVgHBA1oB2wEdAToBAAH/AS4BMwEAAf8BNAE6AR0B/wI/AUgB/wFRAl8B/wFLAVwBHgH/AQ0BZwFP
+ Af8BAAGUAaoB/wFUAVgBVwHvAy4BSBgAAbMBfwF1Af4B/QHrAdkB/wH9Ae4B3gH/AfIB0AGtAf8B2wGW
+ AT8B/wHbAaYBXwH/AdYBpQFlAf8B4gGvAYUB/wHiAaUBWgH/AdwBkAE6Af8B3gGVAT4B/wHbAYsBJAH/
+ Ac0BTwEAAf8DVgG+CAADMAFMAXMCaQH1Ae8B4gHlAf8BwgG6AbUB/wH5AecBygL/AegByQL/AeEBvwL/
+ AeABvwL/AeQBxQL/AfQB1wH/AdABxwGuAf8DWgHYATYCNQFYAxABFQQAA2UB9gL+Af0B/wLyAfAB/wL4
+ AfIB/wLoAeMB/wI4AeQB/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIqAekB/wLLAd8B/wLOAcQB/wNW
+ AcEDEAEWA1sB1gEmAUcBAwH/AV8BWwFLAf8BSQFGAUkB/wJDAUgB/wFOAVwBXQH/AUQBWwEZAf8BHAGG
+ AVoB/wEAAYwBnwH/A1QB7gMrAUMUAAG1AacBUQH9Af8B7QHYAf8B/AHrAdsB/wH+AeQByQH/Ae8BuwGI
+ Af8B7AG2AYAB/wHUAaMBXQH/AdYBrAGDAf8B5wG0AYEB/wHxAaoBTwH/AeYBoAFFAf8B2wGNAScB/wHN
+ AVABAAH/A1YBvgQAAwcBCgNVAa0B+QHWAdMB/wHnAdUB1gH/AdQBxgG7Av8B3wG2Av8B0wGkAv8B0AGe
+ Av8BzgGdAv8BzwGhAv8B4QG4Af8B5AHQAbEB/wGTAYQBagH/AcwBkQGJAf8BWwJYAcsDKQE+A2UB9gP9
+ Af8C7QHvAf8C9wHzAf8C8QHqAf8CXQHlAf8CAAH9Af8CAAL/AgAC/wIAAfsB/wIAAfgB/wIAAfUB/wI9
+ Ad8B/wPqAf8CygHGAf8DVgHBBAADDwEUA1oB1QEuAVQBDwH/AWEBYgFMAf8BWQFVAVkB/wFWAVQBXgH/
+ AVEBXAFXAf8BLQFVAQAB/wEQAYABIAH/AQABmwFgAf8BWAFdAVsB7QMuAUgQAAG1AacBUAH9Af8B6wHW
+ Af8B/QHsAdoB/wH9AecB0AH/AeEBuwGTAf8B5wG8AY8B/wHeAbEBgwH/AdIBsgGSAf8B2AGtAYAB/wHk
+ AZsBPgH/AeABlwE7Af8B3wGGARYB/wHPAVEBAAH/A1YBvgQAAy4BRwGGAXQBcQH3Af8B6gHeAf8B5wHP
+ AcwB/wHSAb8BtgL/Ac8BngH/Af4BywGYAf8B/gHNAaAC/wHRAaMC/wHOAZwC/wHVAZ8B/wHdAbcBjgH/
+ AY8BjQGKAf8B+gP/AeoBqAGkAf8BQAI/AW8DaAH2AucB/AH/ApsB3QH/AtgB6QP/AfEB/wKdAeYB/wIp
+ AfwB/wINAv8CBgHyAf8CZQHhAf8CoQHfAf8CrAHeAf8C3wHhAf8C+QH0Af8DxgH/A1YBwQgAAwoBDgNb
+ AdYBKgFXAQgB/wFmAWcBUAH/AWMBYAFiAf8BLQFQAREB/wEvAVwBDwH/AU4BhwEeAf8BHgGkAVsB/wEA
+ AacBqwH/AVgBXQFaAe0DLQFFDAABtQGoAVAB/QH/AesB1AH/AfwB6wHbAv8B6wHTAf8B8gHWAbQB/wHi
+ AcIBnwH/AecBwgGbAf8B2AGzAYsB/wHdAaoBYAH/AeMBnAE/Af8B4QGaAT4B/wHgAWgBBQH/AdEBTwEA
+ Af8DVgG+BAADVwG6AdwBsAGoAf8B2wGyAagB/wHLAaEBngH/AbcBqAGnAf8B8wHEAaMC/wHSAaoB/wH8
+ AdgBvAL/Ad4BwQL/AeQBvwL/AdcBpAH/AbQBjwFcAf8BoAGjAaUC/wHxAfAB/wFgAlwB1AMYASIDaAH2
+ AvkC/wLEAegB/wK+AdoB/wLYAeoB/wKHAfAB/wJIAv8CHwH7Af8CggHiAf8C/gHnAf8C/QHrAf8C9wHq
+ Af8C6wHoAf8D9AH/A8gB/wNWAcEMAAMPARQDWQHXAS4BXQEMAf8BOAFbARIB/wEtAVgBEgH/AVUCVwH/
+ AVsBgAGBAf8BSQGJAR0B/wEKAZgBSgH/AQABngGpAf8BWAFcAVsB7QMrAUMIAAGnAXgBYAH8Af8B6gHQ
+ Af8B/QHrAdgC/wHmAcsB/wH+AdUBqQH/AfEBwwGbAf8B6QG1AYkB/wHiAZwBSAH/AfQBpgFJAf8B+AGp
+ AUgB/wHnAZ8BQAH/Ad8BagEIAf8B0AFQAQAB/wNWAb4EAANhAeQBxwGeAZsB/wHkAcgBxwH/AfMC5gH/
+ AdQB1QHXAf8BxAG0AawB/wHyAckBrQL/Ad8ByAL/Ad4BywH/AfsB2gG8Af8BzAGmAYsB/wGOAYMBgQH/
+ AeQB4wHlAf8BuAKoAf0DQAFwBAADaAH2Bv8B+QH/AtsB5QH/Ao0B0gH/AoYB9gH/AlQC/wIjAfYB/wKr
+ AecB/wL8Ae0B/wLsAe0B/wLqAesB/wPoAf8D9gH/A8kB/wNWAcEQAAMKAQ4DWgHYARgBXwEAAf8BZQGI
+ AU4B/wFlAVwBZgH/AUoBSAFPAf8BTAFeAVsB/wFAAYgBGAH/AQ4BmQFRAf8BAAGVAasB/wFYAV0BWwHt
+ AzQBVQQAAacBeQFjAfwB/wHqAc8B/wH5Ac4BpwH/AfgBygGkAf8B6wG8AZgB/wHlAbsBngH/AesBxAGq
+ Af8B7gHBAaEB/wHqAbIBiwH/Ae8BqAFhAf8B7wGSATcB/wHtAYABBAH/AdEBUwEAAf8DVgG+BAADLQFG
+ A1MBqgGKAWsBagH5Ae8BwwHAAv8B6QHnAf8B1QHUAdUB/wG/AbQBrwH/Ac4BsgGlAf8B0AGtAaAB/wG2
+ AZYBiwH/AZ0BkQGQAf8B1QHJAcsC/wHtAesB/wFdAVoBWQHSAxIBGAQAA2gB9gT/A/gD/wH7Af8CxgHi
+ Af8CigHbAf8CjgH2Af8CkgHwAf8C4gHuAf8C9AHvAf8D7QH/A+sB/wPqAf8D9wH/A8sB/wNWAcEUAAMK
+ AQ4DWwHWATEBiAETAf8BZgGHAVAB/wFPAUsBTgH/AT0BOgFFAf8BRQJRAf8BLAGFAQAB/wESAaABPQH/
+ AQQBlQErAf8DUwGqBAABqQF6AWIB/AH/AcEBiQH/Ac8BiQE7Af8D3wH/Ac8B1QHbAf8BwQHGAckB/wHg
+ AeQB6AH/AdUB3AHiAf8BwQHMAdUB/wHRAdsB4AH/AdgBwAGyAf8B2QFeAR0B/wHiAVwBAQH/A1cBvwgA
+ AwcBCQMmATkDUAGeA2IB7wHrAbcBtAH/AesB1gHVAf8B2wHXAdYB/wHSAtcB/wHKAbABswH/AecBvwG6
+ Av8B8gHrAf8B6gGwAasB/wNEAXoIAANoAfYE/wP5Af8C+QH4Af8C/QH6Af8CywHgAf8CxwHcAf8C+wHy
+ Af8C9gHzAf8C7wHwAf8D7wH/A+0B/wPrAf8D+QH/A80B/wNWAcEYAAMRARcBWQFdAVkB1wEuAYwBDwH/
+ AVsBZwFEAf8BQgE5AUQB/wE+AVQBMQH/AUcBpQEgAf8BGwGfAQAB/wNbAeEDHQEqBAABqwF2AT4B/AHs
+ AZQBMQH/Aa0BWwEoAf8BxQG7AbQB/wHPAcsByAH/Ad4B5gHqAf8B3AHjAegB/wG7AcABxAH/AZ4BggFe
+ Af8BqAGAAVkB/wGiAWkBXQH/AZsBMQENAf8B6QFhARYB/wNWAb4UAAMjATQDTAGTA18B2wHmAbABrQH/
+ AfoB5gHkAv8B7QHuAf8B/AHDAb0C/wHdAc8B/wJeAVoB3QMTARoIAANrAfYE/wP7Af8D+QH/AvoB+QH/
+ AvwB+wH/AqwBzwH/AroB1AH/AvkB9gH/A/EB/wPvAf8D7QH/A+sB/wP3Af8DzwH/A1cBwhwAAwcBCgNb
+ AdYBKwGNAQ4B/wFEAYABIQH/AVgBrQE2Af8BNwGwASAB/wNbAeEDFQEdCAACXgFYAd0B9QGxAVoB/wHe
+ AYoBLAH/AdIBWQEHAf8BvwFZARsB/wHKAbEBoAH/AcgBtQGoAf8BqwFhAT0B/wGfAScBAAH/AZsBFwEA
+ Af8BlwEXAQAB/wHNAUsBEgH/AaUBbgEtAf4DQQFzHAADHQEpAUcCRgGAA2EB2gHgAagBpwH/Af0BzgHM
+ Af8B5wGdAZYB/wNAAXAMAAN8AfgU/wL4AfwB/wLzAfoD/wH+Af8D/QH/A/wB/wP6Af8D+QX/A9MB/wNX
+ AcIgAAMPARQBWgFeAVoB1QEdAZwBAAH/ARsBlgEMAf8DWwHZAxYBHwwAAyUBNwNfAeAB8wGqAUwB/wHz
+ AZ8BPQH/AekBiQEjAf8B1QFnASAB/wHLAVwBGwH/AcsBTwEIAf8BygFSARIB/wHRAVkBGgH/AdsBZQEi
+ Af8BgQFcAT4B+ANMAZMoAAMaASQBQAI/AW8DXgHZAVwCWQHMAxMBGgwAA1sBywOZAf4DqwH9A6sB/QOr
+ Af0DqwH9A6sB/QOrAf0DqwH9A6sB/QOrAf0DqwH9A6wB/QOhAf4DYgH1AzsBZSQAAw0BEgFcAWEBXAHc
+ A1wB3AMQARYUAAMNARIDQwF3AlsBWQHEAmQBXAHnAXMBZQFSAfQBiwFuAUIB+AF1AWIBSAH2AWMBYQFU
+ Ae4CYAFbAdYBUQJPAZwDJwE6EAADIwEzA1YBuQNUAasDEQEXAxABFgMgAS4DAQECIwABAQMEBAUBBwMM
+ ARADHQEqAysBQwMvAUkDJQE3AxYBHgMSARkDIAEuAy0BRQMyAVADMgFRAy4BSAMiATIMAAMGAQgDUAGk
+ A1kBzwNcAc4CVwFfAegBUwFZAWcB8gNbAeEDWQHMA1sB0ANIAYQYAAMEAQYDNAFUA1YBswJkAVwB5wFl
+ AWIBWAHvAWUBYgFYAe8BYQFfAVcB6AFXAlYBuAM2AVkDBwEJEAADXQHSAbUCmgH/AWgCUwH/A1ABngNa
+ AdsDXgHlAx8BLCAAAwMBBAMKAQ0DEQEXAUACPwFuAWECXAHcAWECWgHkA1kBwwNCAXUDNQFWA0QBfAFd
+ AlkB1wGGAW0BUQH3AYgBYwFBAfgBZQJeAeUDVAGrA0ABcQwAAxgBIQF7AnkB+gHeAc4ByAH/Aa0BsQHO
+ Af8BSgHCAfkB/wFZAeAC/wGHAakB4AH/AeQBzgHDAf8ByQLCAf8DVQGyFAADEgEYAVMCUgGoAfYBigFM
+ Af8B8AG/AasB/wHjAcYBwAH/AdUBwAG+Af8B0wG/Ab0B/wHkAcYBwAH/Ae8BwAGtAf8B9gGPAVEB/wNV
+ AbIDGAEhDAADWQHHAcgBswGyAf8BoAGHAYYB/QFfAVYBVAH7AWICXwH/AV8CWQH+A1cB3wNZAckDWgHN
+ A1oBzQNaAc0DWwHQA1kByQNFAX0DBgEIAyIBMQMwAUwDMQFNAlwBWgHNAf4BxgGmAf8B7AHQAcUB/wHC
+ AX8BSwH+A1IBqQNKAYwCYQFUAe4B9gHCAaUB/wHXAsYB/wHVAcUBxgH/Ae8ByAG0Af8BlQFpAU0B+gNO
+ AZkIAAMEAQYDEAEWAz4BawNEAXkDQgF0AV8BaAFuAfMBZwGlAcoB/wNXAcUDPwFtA0UBfQMhATADCQEM
+ AwYBCAgAAxIBGAFbAlkBwwHzAakBhQH/Ac0BtgGuAf8BxgG8Ab8B/wHyAeoB7QH/AcsBxgHIAf8BxgHC
+ AcMB/wH0AewB7gH/AccBvgHCAf8ByAGyAa4B/wH0AbABjQH/AVsCWAHLAxUBHQgAAw8BFANIAYQDVgG7
+ AXoBfAF/Af4BaAGTAaAB/wFpAaMBrwH/AagBnwGtAf8BwQGOAZoB/wHOAWYBgwH/AdYBXAFiAf8B4QFo
+ AWoB/wHgAWUBaQH/AeABZQGBAf8BUAJAAf0DRAF6AxoBJQMnATsDJwE7A0gBhAHpAZsBVgH/AcgBxQHQ
+ Af8B6gG7AaQB/wFeAlwBzgFWAlUBsQHxAa8BiQH/AcYBwQHKAf8B3AG8Aa4B/wHhAbsBqQH/AcQBvAHE
+ Af8B6wG/AaoB/wFcAlgB0QQAAUkCSAGIA1wB5wFbAlgB6QFcAlcB3wFhAlwB3ANbAdkBiQGDAYIB+wG4
+ AaIBngH/A10B7QNbAdkBXgJYAd0DWgHkA2AB6wNbAeEDOgFiAwgBCwFUAlIBpgH2AaUBXwH/AdYBvQHD
+ Af8BtAGwAdYB/wLcAdkC/wH+AfwB/wH3AvUB/wL1AfQC/wH9AfwB/wPdAf8B2gHTAdcB/wHgAcgBxQH/
+ AfMBpQFmAf8DVQGyAwoBDQQAA1IBqAFgAmQB7AGAAYoBjQH7AbQB4gHrAf8BtAHzAv8BqwH+Av8BlAH3
+ AfoB/wGRAdsB5AH/AY4BswHAAf8BhgGBAZMB/wFeAS4BMQH8AWICWAHvAdACTAH/Ad4BaQFqAf8DVgGz
+ BwABAQMHAQkDDwEUAVwCWgHNAeIBwwG2Af8B0gHKAdEB/wGVAWoBTQH6AWECVAHuAeEBwgG1Af8BzwHG
+ AcwB/wG4AX8BTAH+AbUBTgFAAf0B1wHGAcUB/wHaAcUBwgH/AWwBZwFYAfIEAAGGAoIC+QL4Af8B4QLf
+ Af8B3ALaAf8B2QLXAf8BygLHAf8B3wLeAf8B7QLrAf8B9wL0Af8B9QLyAf8B9gHzAfQB/wHuAfAB7AH/
+ AcwB7AHQAf8B0QHPAcsB/wNWAbsDMAFLAbcBTQFAAf0BzQGhAYoB/wHYAdQB1QH/AtYB+wH/AtAB+gP/
+ Af0J/wH+Av0C/wL+Af8B/gL8Af8B2QHWAdoB/wHKAaEBjgH/AecBYgExAf8BNgI1AVgEAAFuAX0BigL6
+ A/8B2gP/Aa8B8wL/AYwB4AL/AYkB6gL/AYcB9gL/AZMB/QL/AZ4D/wGTAfMB/gH/A1cB3wMpAT4BiwJa
+ AfsB3wFjAWIB/wNVAbIDAAEBAwoBDQMcASgDMgFQAUwCSwGQAbYBfwFaAf4B0wHOAdYB/wHgAboBpgH/
+ AeEBVwEPAf8B2wHBAbcB/wHXAcsBzwH/AXMBYgFIAfYBbQFbAVMB8QHgAcgBwwH/AdgCyAH/AYwBagFB
+ AfkEAAGUAosB/AHsAu8B/wHVAtYB/wPZAf8B1wLYAf8BywLMAf8B4QLiAf8B7ALtAf8C6gHrAf8B6gLs
+ Af8B7ALtAf8B6AHqAekB/wHmAe8B6AH/AeEC3gH/A1UBugNSAakB6wGRAUYB/wHLAbYBswH/AdoB3QHe
+ Av8C/gH/AcUBxgH8Af8C0gH6Ev8C/gH/Ad0B3wHhAf8BygG4AbcB/wHtAZUBSwH/AVgCVgG5BAABbQGB
+ AYUB9wHcA/8BogHrAv8BgAHcAv8BUAHRAv8BWAHdAv8BVAHkAv8BXwHoAv8BhQH1Av8BjAH5Av8DWwHh
+ AyABLgF+Ak0B+gHdAWMBZAH/A1UBsQMGAQgDNwFaAWACXAHUAW4BXwFMAfMBbgFfAUwB8wGtAWEBGQH+
+ AeABuQGmAf8B1AHPAdUB/wHvAZkBTwH/AeABuwGqAf8B1gHPAdUB/wG5AX8BSwH+AbMBSgE7Af0B3QHM
+ AcoB/wHeAcsByAH/AW8BXwFMAfMEAAGHAoUB+QHuAvAB/wLmAeUB/wPmAf8D5gH/AegC6QH/AeYC5QH/
+ AewB6QHmAf8B7wHsAeYB/wLpAeYB/wPjAf8B4wLiAf8C7wHwAf8B2QHUAdUB/wNUAa8BYQJbAeEB6AGW
+ AU8B/wHzAewB7wH/Af4B/QT/Af4B/wL3Av8CuQH7Af8C3A7/A/4C/wL+Af8B9AHtAfIB/wHnAZgBVQH/
+ AV8CVwHoBAABXwFrAW4B8wGwAfYC/wFlAdoC/wE+AcwC/wElAcEC/wFGAdMC/wEzAdQC/wE9AdgC/wFP
+ AeMC/wFYAewC/wNeAeUDKQE+AX4CTQH6Ad0CYwH/A1UBsQMqAUABbwFZAUIB9QHjAcQBtgH/Ad4B1wHc
+ Af8B3gHWAdsB/wHgAbgBoQH/AeMBmAFSAf8B1gHPAdMB/wHnAb8BrQH/Ae8BtQGVAf8B0wHQAdgB/wHk
+ AcEBsQH/AegBvAGmAf8B1AHQAdYB/wHqAcMBrwH/AV4CXAHOBAADZQHlBP8B/AP/AfkB/QH+Af8B9AH7
+ Af0B/wHzAfwB/gH/AesB6QHrAf8BwAHHAdoB/wGsAbQBzwH/AckBxAHPAf8C4wHgAf8B3QLeAf8B5gLo
+ Af8BswKtAf8DSAGHAWECVAHuAdkBhQE+Af8BxQHDAckB/wHyAfMB9An/AvQC/wGwAaoByAH/AbEBpwGj
+ Af8B5gHiAd8B/wH6AvkF/wH2AfUB9gH/AccByAHOAf8B2QGMAUoB/wFjAVgBVgHvBAABWQFnAWwB8gGJ
+ AesC/wFHAdAC/wE6AcsC/wFAAc4C/wFaAdkC/wFQAdsC/wE9AdYC/wE6AdgC/wE+AeUC/wJZAWAB6wEs
+ AisBQwF+Ak0B+gHcAWMBZAH/A1UBsQNVAbUB3wGzAZkB/wHaAdcB4AH/AdsBsQGbAf8B3AG2AaEB/wHX
+ AdYB3wH/AeoBtQGYAf8B6QG7AaUB/wHXAdMB2gH/AfMBqgGAAf8B6gG8AaQB/wHeAdcB2wH/Ad4B2AHd
+ Af8B6QHOAcIB/wGWAV8BQAH7AzgBXAQAA1cBugHrAeAB3AH/AeEBxwG+Af8B1wHKAcgB/wHcAcIBugH/
+ AdEBowGZAf8BWAGjAdwB/wEyAbYB7QH/ARYBxwHqAf8BEQGDAcwB/wGsAagBvAH/AdkB0gHNAf8B2gLX
+ Af8BbQJqAfwDLwFKAWECVAHuAdsBhQE8Af8ByQHIAcwB/wH2AvcF/wHvAuwB/wHNAcIBvgH/AbsBsAGr
+ Af8BkwGKAasB/wG0AagBtgH/AcUBuQG1Af8B0gLLAf8D8QH/Ac4BzwHVAf8B3AGMAUgB/wFiAVgBVwHv
+ BAABVQFcAV4B6gGGAd0B/gH/AYkB4AL/AYUB2wH7Af8BYgHKAfEB/wFLAbgB6wH/AWkB0AHyAf8BhgHb
+ Av8BhQHjAv8BUwHgAv8CWgFfAdsDJAE1AX4CTQH6AdwBYwFkAf8DVQGxAWICWAHpAd4ByQHCAf8B4QHW
+ AdcB/wGtAUUBNgH9AbEBTgFAAf0B4AHaAd0B/wHjAcYBugH/AfcBngFUAf8B3QHWAdoB/wHmAcgBuwH/
+ AboBbwErAf4BagFnAVkB8gFsAWcBWQHyAVwCWQHPAzUBVwMHAQkEAANIAYYBvAGgAZwB/wHjAWoBKgH/
+ Ad8BowFkAf8B6wGfAV8B/wHTASwBAgH/AUEBhAG2Af8BUQHdAv8BTAP/ARYBywH7Af8BWQGAAbcB/wHh
+ AcsBxAH/AdoByAHJAf8BYgJXAfEDFQEdAVwCVwHfAekBkAFBAf8B9AHrAe4B/wL5AfoB/wHSAsoB/wG6
+ AqwB/wHWAc8BzgH/AfsB+QH4Af8B6gHsAv8B7AHtAf0B/wHvAesB6AH/Ad8C2QH/AfkB+AH5Af8B9QHu
+ AfIB/wHnAZIBSAH/AV8CVwHoBAADNQFXA1UBtQFdAWEBZQHtAYYBpQGzAf8BZQGLAZgB/wFbAYMBlAH/
+ AVYBkwGpAf8BTgF/AYgB/gFSAmUB9AJaAV0BygMvAUoDHwEsAXoCTQH6AeIBZgFnAf8DVQG0AW4BXwFM
+ AfMB4wHTAc8B/wHnAdcB1QH/AW0BXQFMAfMBbQFiAVIB9AHmAtsB/wHjAdEBywH/AeABXAEZAf8B5AG3
+ AZ8B/wHgAeEB6gH/AbgBfwFtAf4DUwGqAzYBWQMVAR0DAwEECAADNAFUA38B/gHsAZkBSgL/AcwBjgL/
+ Ad0BtwH/AfMBUwEhAf8BjgFTAV0B/wE5AcQB/gH/AUEB+AH9Af8BEwHhAfoB/wEnAWcB1wH/AeABygHN
+ Af8BzAK4Af8DWAHdAwYBCAFSAlABowHqAYwBOwH/Ac8BrwGnAf8BugG0AbgB/wHMAsIB/wHzAvEZ/wHb
+ Ad8B4gH/AcgBrwGoAf8B6wGPATwB/wNVAbUMAAM2AVkBfwF+AXcB/gGCAWkBZwH/AZwBjQGGAf8BxQGm
+ AaEB/wF/AXYBewH+A1kB9QFkAlwB5wNaAdgDWQHXAZEBagFoAf4B4QKBAf8DUAGdAmEBWAHmAecB1AHO
+ Af8B5gHeAeAB/wGpAXABNwH+AasBeQFCAf4B5gHgAeQB/wHpAdMBygH/AWECVAHuAXMBYgFIAfYB5gHg
+ AeIB/wHpAdQBzAH/AWQCXAHnAzoBYQMjATMDCAELCAADGgElAWYBYgFmAfUB1QGjAYwB/wH9AbYBVQL/
+ AeUBrAH/AfkBgwEuAf8BwgFUATsB/wFUAa8BygH/AVABtQGYAf8BTQG4AZAB/wE2AWoBiwH/AcUBtwG8
+ Af8BuAKhAf8DVgG4BAADLQFFAZQBXwFFAfsB0wGRAVcB/wHUAcoB0An/Af4C/Qn/A/0C/wL9Af8B/gL8
+ Af8B2gHWAdwB/wHQAZUBXgH/AdkBaQE1Af8DMwFTDAADNQFVAXQBcwFyAf4BVAJWAf8BYgJeAf8BuwGd
+ AZcB/wH3AcUBvAH/AfsBxAG9Af8B+QHCAbsB/wHxAbEBqwH/AeoBnwGZAf8B6gGTAZAB/wFgAlkB6wMc
+ ASgBUwJSAagB5wG/AacB/wLnAe4B/wHnAckBugH/AecBygG9Af8B5wHoAe8B/wHoAbwBoAH/AVECUAGf
+ A04BmAHnAb0BpQH/AecB6wH1Af8B4gGpAYcB/wFSAlABpAMoATwDDAEQCAADBgEIA14B3QG4AaIBowH/
+ AWUBTQGfAf8BlgFqAZ8B/wGUAVwBmwH/AUkBLwGvAf8BTgGDAUMB/wE9AcMBTgH/AZYB9gGzAf8BUAHJ
+ AVMB/wFmAYgBUAH/A38B/gM/AW0EAAMHAQkDUAGeAesBowFbAf8B5wG3AaMB/wHXAc4B0gH/AdYB2AHa
+ Af8B/gL8Af8B9QL0Af8B9ALzAv8B/QH+Af8B2gHcAd0B/wHWAc8B0gH/AeUBtwGmAf8B7AGmAV4B/wNT
+ AaoDCQEMDAADHwEsA2oB+QFlAmQB/wFLAU0BTgH/A1IB9ANRAaIDVgG0A1wByQNgAd4BZAFfAV4B7QFb
+ AlkBxAMdASoEAAMdASoCYQFYAeYB6AHOAbwB/wHoAuMB/wHoAeIB4wH/AegBygG4Af8BXQFcAVUB6gMl
+ ATcDGAEiAW8BXwFMAfMB6QHYAc8B/wHqAc4BuwH/AV0CWQHSAxwBJwMHAQoMAAMqAUECTwFOAZcCVwFf
+ AegBYQFkAfkB/wGdAaYB/gH/ASIBIwH2Af8BIQEjATIB+wE0Ab0BSAH/AaIB/wHOAf8BjAH/AbAB/wEb
+ AVoBEwH/A1MBqgwAAwwBEAFXAlUBugHsAbABgAH/AdEBpQGQAf8ByAGyAbEB/wHyAeYB6AH/AcoBwgHE
+ Af8BxQG9Ab8B/wHzAegB6gH/AcoCtgH/Ac0BowGRAf8B7gG0AYUB/wFZAlcBwgMQARUUAANbAcsD1wH/
+ A5MB/wNQAaMQAAMGAQgQAAMkATYBWwJZAcQBiQFqAUcB+QGBAV8BXAH4AVoCVwHFAykBPgMGAQgDAAEB
+ Az0BaQFcAVoBWQHMAVwCWQHMAzsBYwMHAQoDAQECFAADQwF3AWABYgL/AcsBzAL/AVcBVQL/ARYBGgFS
+ Af0BKQFrASoB+gFjAYwBbgH5AWEBZQFhAe4BTAFxAVEB9wNHAYMQAAMNARICUAFPAZsB3wGcAVMB/wHs
+ Ab4BnAH/AecBwgGvAf8B2QG1AakB/wHXAbMBqAH/AecBwgGvAf8B7AG+AZ0B/wHhAaABWAH/AlIBUAGj
+ AxMBGhgAAycBOgNnAfEDXgHZAxQBG3AAAxABFgJaAWAB3gKoAb8B/QJNAaAB+gJaAV4B1QM7AWQDJgE4
+ AxIBGQMoATwDFgEfGAADLQFGA1EBogJcAVcB3wFjAWEBXgHuAWMBYQFfAe4CYQFbAeECUwFSAagDMAFM
+ AwIBA7gAAyMBMwNZAewDVgG+AxIBGQgAAxEBFwNTAaoCXAFVAeoBZwFmAVkB8gNdAe0DWQHHAyoBQQQA
+ AwkBDBwAA0YBgQNWAbsDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1YBtgNW
+ AbsDPAFoDAACOQE6AWACQgFoAfUCWQFdAdcDSgGLAy4BSAMYASEDBwEKQAADJgE5A1gB6QHyAucB/wHa
+ AtAB/wNXAcIDEgEZAxEBFwJeAVsB2QH3AdgBqwL/Ad4BrQL/Ad0BrgL/AewBwgH/AegBzgGqAf8BYgJY
+ Ae8DWQHSA1sB4QNZAcMDUAGdAz8BbgMgAS4MAAGxAVMBQAH9AfABigEfAf8B7QFpARQB/wHuAWgBEwH/
+ Ae4BZQEPAf8B7gFiAQoB/wHtAV0BAAH/Ae0BWAEAAf8B7QFZAQAB/wHtAVUBAAH/Ae0BUgEAAf8B7QFP
+ AQAB/wHyAU0BAAH/AeMBSwEAAf8DWQHEDAACUQFSAacCIAHeAf8CFQHVAf8CBAG6Af8CAAGjAf8CVAFh
+ Ae4CVQFWAbQDQAFxAzIBUQMUARwwAAMnATsDXAHnAeoC3wH/AewC4gH/AeYC2QH/AdwC1QH/A1kBxANU
+ Aa4B+gG8AYAC/wHbAaEC/wHFAYYB/wH9AcIBhAH/AfgBwgGIAv8B3QGpAf8B6gG1AYcB/wG9AaIBlwH/
+ AeAB3QHgAf8B5wHiAeMB/wHTAcwBzQH/AYgBgAGBAf4DZQH0A1kBxwMxAU8EAAGyAX8BRgH+AfYBtwGK
+ Af8B9AG6AZQB/wHyAbcBjwH/AfIBtgGPAf8B8gG1AY0B/wHzAbQBiAH/AfMBsQGFAf8B8QGuAYAB/wHw
+ AaoBZwH/AfABqgFmAf8B7wGpAWUB/wHzAawBaAH/Ae8BZwEYAf8DVgHBCAADCgENAlwBXgHOAi4B8wH/
+ Ah8B7AH/AhMB5gH/AgYB3gH/AgABzwH/AZcBkQHFAf8BtAGrAbAB/wFgAVoBlgH/AlsBXgHZAlUBVgGx
+ A0ABcSQAAyQBNgNZAewB6QLcAf8B9QLtAf8B4QLYAf8B5ALZAf8B/AL3Af8BWgJYAe4BbAFfAUwB8wGu
+ AVABFAH/AeYBnAE9Av8BvgFVAf8B7QGkAUEB/wGuAUsBDQH/AeUBoQFHAf8B3gGWAUAB/wHNAZ8BaQH/
+ Ac0BwgHBAf8B7AHcAdgB/wHvAdkB1wH/AfAB3gHcAv8B/QH8Af8B4ALUAf8DVgG4BAABpwF9AUsB/gH/
+ AfEB8wH/AZkB4AGwAf8BLgHHAUgB/wEtAcEBQgH/ARsBtQEqAf8BrAHdAbgB/wH9Ae8B9gH/AfkBtgGH
+ Af8B+wGzAYMB/wH6AasBZAH/AfUBrAGAAf8B6QHnAe4B/wHjAY8BSwH/A1gBwAgAAywBRAJIAXEB9gI2
+ AfcB/wIlAeoB/wIZAeUB/wIIAeAB/wETARIB3QH/Ad0B1AHgAf8B9wHtAd4B/wHpAd4B2AH/Ad0B0gHM
+ Af8BzAHCAbwB/wJNAWkB+iAAAyQBNQFcAlkB7AHrAuQB/wH1Au0B/wHqAuIB/wH7AvgB/wH2AvQB/wFf
+ AlsB7AMmATgBeQFPASsB/AGEASsBAAH/AdsBlgE7Af8B8gG5AV8B/wG3AWUBJwH/AV4BGwEAAf8BlQE6
+ AQAB/wHJAYgBLgH/Ac8BnAFdAf8B5AHMAcQC/wHtAd8C/wHiAdEB/wH5AdUBxgH/AdgBwAG7Af8DXwHo
+ AykBPwQAAagBfwFPAf4B/wHvAfAB/wGFAd0BmgH/AREBzwEvAf8BCgHBASAB/wEAAakBAAH/AZcB0wGb
+ Av8C5wH/Af0BsAFeAv8BsQFiAv8BoQFJAf8B/AGcAUcB/wHtAeAB3gH/AeQBkAFJAf8DWAHACAACPAE9
+ AWcCJQHhAf8CNAH5Af8CKQHtAf8CIQHoAf8CCgHiAf8BQQE+Ad4B/wHzAewB3wH/AegB3wHbAf8B4gHY
+ AdoB/wHoAd0B2wH/AewB4QHcAf8CWgFdAdMcAAMkATYBXwJXAegB6wLmBf8B+AL2Af8B+gL2Af8B8gLv
+ Af8BZAJiAecDJwE7BAABagFlAVIB9AHgAacBUgL/Ad8BswH/AccBpgGGAf8BnwFlAUUB/wGeAWQBQQH/
+ AYQBPwEUAf8BaAEsAQAB/wGoAWABPQH/A2UB9ANiAekBfgF5AXcB+AFgAl0B7QFQAk8BmwMKAQ4IAAGm
+ AX8BUwH+Af8B7wHuAf8BhwHhAaEB/wEaAd4BRgH/ARQB0gE3Af8BAAG4AQsB/wGXAdYBnwL/AeoB6QH/
+ Af4BtgFoAv8BvAGJAf8B/gGsAVoB/wH8AaIBUAH/AfAB5AHiAf8B5AGTAUwB/wNYAcAEAAMEAQYDUQGi
+ AoMB9AH/AUwBSwH5Af8BKAEnAfIB/wEXARgB7AH/AQQBBQHmAf8BkgGPAeIB/wH6AfEB4QH/AeQB2wHc
+ Af8B4wHZAdoB/wHvAeQB3gH/AcIBuAHGAf8DSAGFEAADGgElAyoBQQM4AVwDXgHlAe4C6A3/AfEC7gH/
+ AWICYAHpAyYBOQgAA1YBswHvAcoBoQL/AfsB9AH/AfkB9AHuAf8B7AHZAcYB/wHtAdgBwAH/AecB0gG6
+ Af8BzQGRAUgB/wFyAVABPAH+A0QBegMDAQQDEQEXFAABowF/AVcB/gH/Ae8B6wH/AbwB7gHHAf8BigHm
+ AZQB/wGJAeMBjwH/AWMB2QFmAf8BxgHpAccC/wHxAfAC/wHPAZkC/wHRAZwC/wHKAZMB/wH9AccBlAH/
+ AfQC6wH/AeMBkQFNAf8DWAHABAADFAEbAV0BXAFhAeEC+QH4Af8B6AHkAfEB/wHGAcAB7wH/AZABjQHs
+ Af8COgHoAf8BywHFAeUC/wH3AeIB/wHzAeoB4AH/Ae0B4wHdAf8B9wHsAeMB/wGYAZABsAH/AywBRAgA
+ AxYBHwNUAasDZAHnA10B8ANqAfkB4ALWDf8B7wLrAf8BZAJjAewDIwEzDAADEQEXAmEBXAHcAfgB5gHT
+ Bv8B9gHrAf8B+wHtAdwB/wH3AdsBvgH/AeMBvwGnAf8BqwGnAa8B/wJZAVoB9QNcAeoDWwHZA1kBwwNS
+ AaYDNwFaAwMBBAQAAaIBfwFaAf4B/wH2AeYB/wHIAccB8wH/AZQBiwHeAf8BlwGOAd4B/wGUAYoB2QH/
+ AdgB0wHuAf8B9QH2AfsB/wGYAa0B/gH/AY8BpwH7Af8BjAGhAfoB/wGWAaYB+gH/Ae8B8AH3Af8B6QGV
+ AUgB/wNYAcAEAAMmATkClgHPA/8B/AH/AfkB9gHyAf8B/AH3Ae8D/wHrAf8B2QHUAegB/wEwAS8B5gH/
+ AVYBUgHiAf8BoAGaAeAB/wHJAcIB3AH/Ae8B6QHiAf8BYgFeAWQB7AMWAR8EAAMVAR0DWgHTAccCuAH/
+ AfEC5QH/AfkC8QH/AfsC9AH/AewC5QH/AewC5QX/AfIC7QH/A2AB6wMlATcUAAMJAQwDUAGeAV8CXAHq
+ AeQBzQG/Af8B4gG/AakB/wG+AVEBFAH/AcYBhAE3Af8B1QGsAWcB/wHLAawBiwH/AdEBuQGiAf8B3QHH
+ AbgB/wHYAckBwgH/AdEBwwHFAf8DXQHiAwwBEAQAAaMBfwFfAf4B/wH+AeoB/wFYAV0B3gH/AgABwwH/
+ AgABtwH/AgABnwH/AZkBmAHTAf8B7gHwAv8BEQFRAfwB/wEAAU4B/QH/AQABMgH8Af8BBwEzAfwB/wHp
+ AesB+QH/Ae4BnQFLAf8DWAHABAADQwF4AsgB5gP/Af0B/wH2AvMB/wHzAe4B8QL/AfsB7QH/AawBpwHs
+ Af8BEAERAeoB/wIIAeQB/wIAAd8B/wIDAdwB/wEnASQB1gH/A1QBrwMHAQkEAANQAZoBvAKvAf8B6QLa
+ Af8B6QLdAf8B9ALqAf8B8wLuAf8B9gL0Af8B7gLnAf8B5gLfAf8DXwHgAycBOyAAAy4BSAF/AX0BfgH8
+ AdQBtQGoAf8BsgEnAQAB/wHMAUgBAAH/Ac8BVwEAAf8B0gFiAQAB/wHPAWIBAAH/Ac0BWgEAAf8BvgFO
+ AQsB/wHQAbgBrwH/A1oB1QMDAQQEAAGhAX8BZAH+Af8B/gHoAf8BXAFhAegB/wIAAd8B/wIAAdIB/wIA
+ AbgB/wGcAZsB2gH/Ae4B8AL/ASUBhQH9Af8BGQGMAf0B/wENAVgB/AH/ARgBTAH9Af8B6gHsAfwB/wHs
+ AZ0BTgH/A1gBwAQAA1kBxwL6Af0C/wH9AfsB/wH4AfQB9QH/AfcB8wHyAv8B/AHvAf8BagFoAfAB/wEh
+ ASIB7gH/AiIB6AH/AhEB4QH/AgAB4QH/AgABxQH/Aj8BQAFuCAADYQHuAdwCyQH/Ad0CzQH/Ab0CrwH/
+ AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/A2UB9AM0AVQkAAFHAkYBgQHXAdoB3wH/Ab8BjwGEAf8BrAEZ
+ AQAB/wHAAT4BAAH/AcgBSwEAAf8BywFQAQAB/wHKAU4BAAH/AccBQgEAAf8BvQE8AQAB/wHEAawBpgH/
+ A1UBsggAAaABfwFoAf4C/wHsAf8BiAGNAeoB/wEJAQsB3AH/AQ0BDwHWAf8BBgEIAcMB/wGsAa0B4wH/
+ AfEB9QL/ATsBigL/AS8BjgL/ASYBZgL/ATMBYAL/Ae4B8gL/AesBnQFSAf8DWAHABAACWQFoAfIC7QH3
+ Af8C+QH8A/8B/gP/AfkB/wHzAfAB9QH/AU0BTAH2Af8CKQHxAf8CJAHqAf8CGQHkAf8CDwHoAf8CJwF7
+ AfwCMAExAU0IAANtAfcB7wLcAf8BwAKyAf8DVQG1Az8BbwGiApkB/wH0AusB/wH4AvEB/wNnAfIDKgFB
+ JAADVQGyAegB5wHoAf8BqQFIATgB/wGyASABAAH/AckBSwEAAf8B2gFbAQAB/wHeAWEBAAH/AdABUQEA
+ Af8BuwEvAQAB/wG1AT8BFQH/AbwCrgH/A0gBiAgAAZsBfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHi
Af8B3wHZAeQB/wHfAdgB5AH/Ae8B6QHrAf8B9gHuAewB/wHiAdoB7QH/AeAB2QHtAf8B4AHaAe4B/wHj
- Ad8B8AH/AfoB9AHyAf8B4gGTAVYB/wNWAcEEAAM4AVwCUAFSAaQCWgFdAcoBagFrAXsB8wLDAd4B/wLO
- AfQB/wJrAv8CUQH+Af8COAH3Af8CIgHrAf8CFgHqAf8CXAFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMW
- AR4DVQGyAcACtAH/AegC3AH/AfAC5wH/AWMCYQHrAxwBJyAAAwMBBANeAdkB3gHZAdwB/wGhATEBFgH/
- AcABPAEAAf8BzwFbAQAB/wHfAWsBAAH/AecBggEAAf8B4AFuAQAB/wHJAUkBAAH/AboBWQE7Af8BoQGZ
- AZ4B/QM3AVoIAAHRAZ8BgwH/Af4BzgGYAf8B/QHIAZIC/wHMAZEC/wHJAYwC/wHHAYkB/wH8Ab4BggH/
- AfkBtwFtAv8BvAFpAv8BuQFlAv8BtwFiAf8B/gGzAV0C/wGxAVwB/wHvAZABNwH/A1kBxAwAAwcBCgMq
- AUEDOwFkAk8BUQGcAloBYAHeAlABxQH/Al8B3wH/AlwB9AH/AkEB7gH/A1QBrwwAA0IBdANRAZwDHwEt
- A1UBsgHAArAB/wHeAswB/wHoAtoB/wHOAsEB/wNTAaokAAMRARcBbQJrAfMB0AG6Ab0B/wGRAQMBAAH/
- Aa8BHgEAAf8BugE2AQAB/wHEAUUBAAH/AckBSgEAAf8ByAFKAQAB/wG7AS8BAAH/Ab4BaAFVAf8BdAFt
- AXQB9wMhATAIAAFuAWQBYAHxAaEBdgFmAfwBlAJfAfsBlAJfAfsBlAFfAVkB+wGUAV8BVAH7AZQBXwFO
- AfsBlAFfAUkB+wGUAV8BRAH7AZQBXwEyAfsBlAFfATIB+wGUAV8BMgH7AZYBXwExAfsBjwFDASsB/ANI
- AYYcAAMUARsDIgEyA0IBdQJXAVkBwgJTAWoB8gM+AWsUAANRAZwBxQK3Af8B7wLdAf8B3gLLAf8BxAK3
- Af8DYAHUAxUBHSQAAzABTQGdApQB/gHcAc4BzwH/AZ0CRwH/Aa0BUAFDAf8BrgFTAT4B/wGuAVMBOgH/
- Aa4BUwE2Af8BrAFOATIB/wGhAToBLQH/AcIBmgGYAf8DYgHpAwcBCowAA0IBdgNkAecBcQJtAfcDZAHs
- A04BmAMUARwoAAMiATEDXgHZA2UB7gFlAmcB7gJvAXAB8QNxAfMBdwFzAXcB9QGHAYYBhwH3AYsBiQGL
- AfkBkwGRAZIB+wG0Aa8BsAH9A1YBuQgAAzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHK
- A1oBygNaAcoDWgHKA1oBygNcAc4DWQHDAzQBVUAAA04BmANZAcMDVgG+A1YBvgNWAb4DVgG+A1YBvgNW
- Ab4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DWQHEA0QBfAgAA0gBhAF/An4B8wFyAnAB8AFyAnAB8AFy
- AnAB8AFyAnAB8AFyAm4B8AFwAm4B8AFwAm4B8AFwAm4B8AGAAn8B8wNRAZwIAANhAe4D4gH/A90B/wPa
- Af8D2gH/A9gB/wHYAtcB/wPXAf8D1gH/A9UB/wPVAf8D1AH/A9MB/wPgAf8DmQH/A1cBvQwAAy4BRwJe
- AWEB2gMlATcoAAGZAZ0BnwH9AcoBzQHPAf8BywHNAdAB/wHLAc4B0AH/AcoBzQHQAf8BygHNAc8B/wHJ
- Ac0BzwH/AcgBzAHOAf8ByAHMAc4B/wHIAcsBzQH/AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AckBywHO
- Af8BsQG1AbcB/wNbAdADAwEEAy8BSQNSAaQB6ALjBf8B+wL5Af8B+gL3Af8B+AL0Af8B9gLwAf8B8wLs
- Af8B8ALoAf8B8gLrAf8B7ALlAf8DVgG2AzEBTQMEAQYDhAH3BP8D9AH/A/MB/wHzAvIB/wHxAvAB/wHw
- AfEB8gH/Ae8B8AHxAf8B7QHuAe8B/wHrAewB6wH/AesC7AH/AekB6gHsAf8B5QLmAf8D9QH/A8YB/wNZ
- AcMIAAMbASYBTAFiAWsB7wEAAeQC/wJcAWAB1CgAAa4BsAGyAf0B7QLwAf8B2QHbAdoB/wHbAd0B3gH/
- AdsB3QHeAf8B2wHeAd8B/wHbAd4B3wH/AdsB3gHgAf8B2wHeAeAB/wHbAd4B4AH/AdwB3gHgAf8B2wHd
- Ad4B/wHaAdsB3AH/AeYB6AHpAf8B4QHmAekB/wNYAcsDPgFrAYACfgH1Ad0C1QH/Ad4C1Qb/Av0B/wH8
- AvgB/wH6AvUB/wH4AvEB/wH1Au0B/wHxAukB/wH2Au8B/wHhAtYB/wHdAtYB/wN9AfYDRAF6A3MB9gP7
- Af8D6gH/AesC6gH/AeoB6wHqAf8B6wHwAfEB/wHmAekB6gH/AeEB4AHiAf8B4wHlAecB/wHnAewB7wH/
- AeEB4gHlAf8B3gHfAeEB/wHeAt8B/wLsAesB/wO9Af8DVgHBCAADDgETAVcBXwFlAegBAAHxAv8BMgF3
- AZUB+gJMAU0BkQNJAYcDSQGHA0kBhwNJAYcDSQGHA0kBhwNJAYcDRwGABAABqAGqAa4B/QFcAV4BWwH/
- AhsBBgH/AicBBwH/AjUBEgH/AkoBKgH/AlABNAH/AlIBNwH/AU8BTgEzAf8BRAFFAScB/wE3ATgBFwH/
- ASsBLAERAf8BIQEgAQsB/wI1AS8B/wG/AcYBywH/A1oBygNeAc4B9QLpAf8B0QLIAf8BaQJnAf8CtQG0
- Af8BwgLBAf8BvAK7Af8BvAG7AboB/wG6ArkB/wG5AbgBtwH/AbsCuQH/AbUCtAH/AWkCaAH/AckCwgH/
- AfgC7AH/A14B2QN1AfYD/AH/Ae0C7AH/Ae4B8AHyAf8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+
- Aa4B/wHSAbYBpwH/AdABuQGwAf8B1QG1AaMB/wHOAaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHB
- CAADGwEmAVcBYAFqAesBAAHoAv8BLQGbAcgB/wG7AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/
- AcYB0QHOAf8BxAHPAc0B/wHBAc0BywH/AckB1QHXAf8BnQGkAagB/wQAAqgBqwH9AUMBRgE9Af8DAAH/
- AjkBGAH/AkABGwH/ASIBIQEAAf8CNgEEAf8CNwEGAf8CNAEDAf8CKgEAAf8CHQEAAf8CFQEAAf8CCgEA
- Af8BGQEYAQsB/wG2Ab0BwgH/A1oBygNhAeYB4gLQAf8BwgKyAf8BUwFQAVEB/wFXAVsBYgH/AV4BYwFq
- Af8BXQFjAWsB/wFeAWMBawH/AV4BYwFrAf8BXQFkAWwB/wFeAWQBawH/AVkBXgFlAf8BUAFOAU8B/wG5
- AawBqwH/AeIC0AH/AWcCZgHrA3UB9gP8Af8B8ALyAf8B6wHpAeoB/wHXAbMBoAH/AegBvgGVAf8B9QHR
- AaIB/wHyAdIBpwH/AfMB0AGgAf8B6wHCAZkB/wH1Ac0BoQH/Ad4BqAFsAf8B0wHDAbsB/wHwAfQB9wH/
- A8EB/wNWAcEIAAMpAT4BDwF4AbEB/AEAAeoC/wEcAZEBtwH/AVIBaQFEAf8BTgGIATYB/wE1AXABFAH/
- ATYBgwETAf8BOwGFARkB/wEzAW4BFgH/ASABXgEHAf8BbAGeAWEB/wGpAawBtAH/BAACqAGpAf0BPQFA
- ATsB/wItAR4B/wLbAdUB/wK9AbcB/wIiAQMB/wIgAQAB/wIeAQAB/wIWAQAB/wIdAQAB/wIdAQAB/wIZ
- AQAB/wIOAQAB/wIeARAB/wG0AbsBwQH/A1oBygFkAmIB7wHOArkB/wHOAb8BwQH/AdgBwwG8Af8B4AGn
- AYoB/wHmAaUBgAH/AekBogFnAf8B6QGdAV8B/wHpAZ0BXwH/AekBoQFmAf8B5gGmAW8B/wHgAagBiwH/
- AdkBwQG6Af8BzgHAAcIB/wHOArkB/wFoAmYB8AN1AfYD/gH/AfAB9AH3Af8B3QG7AasB/wHuAbcBgwH/
- AfIBwAGHAf8B3wGzAZEB/wHeAb8BqgH/Ad4BsgGOAf8B8wHBAYkB/wH3AcgBlQH/AdQBowGGAf8B3gHc
- Ad4B/wHyAfQB9QH/A8IB/wNWAcEIAAMcASgBIQFzAZwB+gEAAegC/wEZAZABtQH/AVIBbwFJAf8BgwGl
- AWYB/wFXAZABRgH/AVgBkAFGAf8BGgFiAQAB/wEYAV4BAAH/AQIBTAEAAf8BWwGSAVIB/wGqAasBtQH/
- BAADqAH9ATgCOQH/ATcBNgEmAf8CgQFsAf8CqgGnAf8CkQGHAf8CFwEAAf8CkwGCAf8CSQE2Af8CDQEA
- Af8CFAEAAf8CEQEAAf8CBgEAAf8CGQEQAf8BsAG3Ab0B/wNaAcoBbwJuAfEB7QLkAf8C6wHxAf8B5QHR
- AcAB/wH5AYcBEwL/AWYBAAL/AWYBAAL/AWcBAAL/AWcBAAL/AWgBAAL/AWgBAAH/AfoBZgEAAf8B5wHE
- AaoB/wHsAfAB+AH/AeoC4AH/AWkCaAHwA3UB9gT/AeoC5QH/AeUBqwGDAf8B9QGvAWAB/wHYAaoBjQH/
- AegB5gHoAf8C7QHrAf8B5AHnAewB/wHbAa8BkgH/AfUBtQFsAf8B2QGiAW0B/wHbAdcB2AH/AfMB9wH4
- Af8CxQHEAf8DVgHBCAADQgF1AQABuAHvAf8BAAHoAv8BGgGUAbYB/wGHAaEBgQH/ATkBgwEtAf8BNQGD
- ASoB/wEvAW0BIAH/AQsBUgEAAf8BCgFNAQAB/wEAAUABAAH/AVoBkAFTAf8BqgGsAbQB/wQAAaUCqAH9
- AT4BQQE/Af8DAAH/AwAB/wKoAaUB/wKlAZ0B/wIBAQAB/wJRAUYB/wK9AboB/wKRAYkB/wIOAQAB/wIH
- AQAB/wIBAQAB/wEUARMBDwH/Aa0BtAG5Af8DWgHKA2kB8AT/AfEB7gHyAf8B3QHVAc8B/wHwAcABZAL/
- AbcBOgL/AaYBFgH/Af4BogEJAf8B/gGhAQcB/wH+AaEBBwL/AZ8BAgH/AfABnAESAf8B2wHNAb0B/wHk
- AeMB6AH/AfIC6wH/AXIBcAFyAfEDdQH2BP8B5wHaAdYB/wHqAakBZwH/AesBpwFbAf8B2gHDAbcB/wHw
- Ae0B5gH/AeYBuAGJAf8B7QHnAdoB/wHbAcABswH/AfABwgGZAf8B5gG4AZUB/wHaAc0ByAH/AfQB+AH6
- Af8DxgH/A1YBwQQAAwoBDQJcAWAB1AEAAeEC/wEAAeAC/wEVAZUBwAH/ASgBVQFLAf8BLwGQATEB/wEG
- AYEBBQH/AQkBgQEIAf8BEQGCAQ8B/wEQAWQBDAH/AQABMwEAAf8BUwGJAU4B/wGsAa0BtQH/BAABogKo
- Af0BNAE3ATkB/wEIAQcBBgH/AqwBpQH/Ar0BugH/AiQBFQH/AgEBAAH/AkEBOQH/Ar4BuwH/ApwBmAH/
- AgkBAAH/AgEBAAH/AwAB/wEPARABDgH/AaoBsgG3Af8DWgHKA18B4AH/AfsB+gH/AfgB9AH1Af8B3wLb
- Af8B4AHLAasB/wH9AeUBuwH/AfwB4AGzAf8B+wHZAaMB/wH8AdMBlgH/AfsB0AGQAf8B/gHPAYgB/wHk
- AcABiAH/AdQBywHKAf8BzQHMAbsB/wHiAdsBzwH/A2EB6AN3AfYE/wHuAuoB/wHnAasBgAH/AfYBtAFm
- Af8B1AGfAW8B/wHjAeIB4wH/AesB4gHQAf8B4QG6AZMB/wHbAa0BiwH/AfcB0wG0Af8B3gGtAY4B/wHf
- AdkB1wH/AfUB+QH6Af8DyAH/A1YBwQQAA1EBoAEAAZkB6gH/AQAB5gL/AQAB2wH2Af8BMgHmAfwB/wE7
- AaUB3QH/AUgBggFkAf8BggHEAW8B/wFuAbwBcAH/AW4BvQFvAf8BgQHCAYIB/wFBAZEBQQH/AVYBjAFS
- Af8BqgGsAbMB/wQAAZ8BpgGoAf0BLAEvATEB/wFrAWoBaQH/A7gB/wICAQEB/wMAAf8CEgEGAf8ClQGN
- Af8CRQFBAf8DAAH/AwAB/wMAAf8DAAH/AQwCDgH/AagBsAG1Af8DWgHKA0kBhwHIAsIB/wH2Ae8B7gH/
- AeoC5QH/AcMBtAGrAf8B7gHcAcwB/wHvAeIB1AH/AewB4gHWAf8B6wHjAdcB/wHqAeMB1gH/AeoB3wHQ
- Af8BxQG2Aa0B/wHgAdcB2QH/Ae4B5AHjAf8BxwHAAb8B/wNOAZgDdwH2BP8B9wH9Af4B/wHkAcABrAH/
- Ae8BrAFmAf8B8QG6AYUB/wHYAaQBgAH/AdsBtAGbAf8B3QGoAYIB/wHlAcYBpwH/AeYBsQGNAf8B3QG7
- AagB/wHoAe4B8QH/AfYC9wH/A8kB/wNWAcEEAAJaAV4B1QEAAcgC/wEAAecC/wEAAf0B/gH/AVMD/wGK
- Ae4B/gH/AWABhgGfAf8BuwHSAbAB/wG3Ac8BsAH/AbgBzwGxAf8BuQHQAbIB/wG2AdABsAH/AacBvgGh
- Af8BpAGnAawB/wQAAZsBogGnAf0BLQExATIB/wJZAVgB/wO9Af8CigGJAf8CMAErAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AQsBDAENAf8BpgGuAbMB/wNaAcoDBwEJAz0BaANYAbkDYAHeAagBpQGm
- Af0B+QH3AfYB/wH1AfoB+QH/AfAB+gH4Af8B7AH6AfkB/wHoAfsB+QH/Ae8C+QH/AZcBjwGQAf4DYQHi
- A1oBvQNAAW8DCQEMA3cB9gT/AfkB+gH7Af8B9QL2Af8B4wG5AaIB/wHsAa8BgQH/AfYBwAGRAf8B9gHB
- AZcB/wH1AcsBpwH/AegBsgGPAf8B3gG4AaQB/wHrAe4B8AH/AesB7QHuAf8B9wL2Af8DywH/A1YBwQQA
- ATMBWAF7AfYBAAHHAv8BAAHqAv8BAAP/AU0D/wGUAfcC/wFdAYQBqgH/AtIBzQH/AdEB1gHRAf8BzwHU
- AdAB/wHNAdMBzwH/AcwB0gHPAf8B2QLgAf8BnAGfAaIB/wQAAZYBnQGjAf0BPgFBAUIB/wIMAQsB/wOy
- Af8D0QH/Ai8BMAH/AwgB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEJAQoBCwH/AaUBrQGyAf8DWgHK
- DAADDgETA1gBwQT/AfoD/wH1A/8B8gP/Ae4D/wH5A/8DXAHMAxQBHAwAA3cB9gT/A/kB/wH5AvsB/wH3
- AvsB/wHrAdsB0wH/AecBwQGuAf8B5QG8AaUB/wHlAcEBrgH/AegB1wHQAf8B8AH0AfcB/wHuAvAB/wHr
- AuoB/wP5Af8DzQH/A1YBwQQAAlcBZQHoAQABywL/ARgBoAG5AfwBWAJfAeMBQwHpAfcB/wGIAfIC/wJW
- AVgBuwNDAXgDQwF4A0MBeANDAXgDQwF4A0MBeANBAXIEAAGRAZkBngH9AU0BUAFRAf8BJwImAf8DRgH/
- A0QB/wMwAf8DOwH/AzUB/wMpAf8CHAEdAf8DEgH/AwoB/wECAgEB/wEWAhcB/wGiAaoBrwH/A1oByhAA
- A1MBpQP9Af8B/gP/AfgD/wH1A/8B8QP/AfgD/wNVAbIQAAN5AfYE/wP7Af8D+QH/AfgC+QH/AfgB/QH+
- Af8B9QH6Af0B/wHyAfUB+AH/AfIB9gH6Af8B8wH3AfoB/wHvAfAB8QH/A+0B/wPrAf8D9wH/A88B/wNX
- AcIEAANTAaoBAAHJAv8BOAGCAZIB9wJSAVMBqAEqAcsB7QH/AVkBzQHsAf8DKwFCIAABjwGXAZ0B/QFL
- AU0BTgH/ATcCNAH/AjoBOQH/ATgCNwH/Aj8BPgH/AUACPwH/AUECQAH/AkIBQQH/AUMCQgH/AkEBQAH/
- Aj4BPQH/ATsCOQH/ATQCMwH/AZwBpAGqAf8DWQHMEAADVgGrA/0F/wH7A/8B+AP/AfUD/wH6A/8DVwG3
- AwMBBAwAA4gB+Bz/A/4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwgQAAzsBZQE3AWcBiAH3ATQBYgF7
- AfYBIgFUAYwB+gFUAWEBagHuAloBXgHVAw0BESAAA38B/gGPAZcBmgH/AV8BYwFmAf8BZgFrAW4B/wFl
- AWoBbQH/AWUBagFtAf8BZQFqAW0B/wFlAWoBbAH/AWUBagFsAf8BZQFqAW0B/wFmAWkBbQH/AWYBawFu
- Af8BZAFpAWwB/wFtAYEBhQH/AasBtgG8Af8DWQHHEAADVAGvGP8DWAG7AwQBBQwAA1sBywOlAf4DsQH9
- A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7IB/QOtAf4DagH1AzsBZUAAAlkBWgHP
- AYoBjQGOAfsBegF8AX4B+gF5AXsBfQH6AXoBfAF+AfoBegF9AYAB+gF7AX0BgQH6AXwBfgGDAfoBfAF+
- AYMB+gF9AYEBhAH6AX0BgwGGAfoBfgGDAYYB+gF+AYQBhwH6AYMBjgGSAfwCZwFoAfIDOgFiEAADUQGc
- AX4CfAHzA24B7wNuAe8DbgHvA24B7wF+AnwB8wNSAacDAQECMAADPwFtATkBSAGJAfYCIQEiATEgAAMF
- AQcDIwEzAzQBVAMmATgDDAEQAwIBA2QAAyABLgM6AWEDNgFZA0UBfwNWAbsDVgGzA0ABcAM3AVoDOQFf
- AxwBKDAAAzgBXgE2AaIB+AH/AloBXQHKAxcBIBMAAQEDBgEIAwsBDwNBAXIBawJiAe8BXgJbAdkDVQGy
- A0gBhgMyAVEDGQEjAw0BEQMKAQ4DBwEKAwMBBAgAAVkCVwHCAaIBcAFZAfsBmwFrAU0B+gGNAnIB+gGQ
- AXUBdgH6AY8CdAH6AY8CcwH6AY8CcwH6AY8CdAH6AY8BcgFwAfoBnwF0AVgB+gGgAW8BTQH6AaIBXwFF
- AfsBXgJbAdAMAAMDAQQDYAHeAn8BfgH+AYYBWQFYAf0BNwFlAbgB/wEzAbkB8wH/AS4BiAHPAf8BdwFw
- AX4B/gGOAYMBYwH9AVECTgH9A04BlxwAAzkBYANKAY0BSQJIAYcDNwFbBAADIAEuAVQBYQFyAe4BPgG5
- AfQB/wNbAcgDFgEeCAADBAEFAyQBNgNEAXkDTAGSAWUCYQHuAf8B/AH9Af8B/ALrAf8BtwGmAacB/QFn
- AlcB8gNXAd8DWgHKA1UBsgNQAZoDSAGFAzMBUwMLAQ8EAAHSAWwBRQL/AcQBWAH/Ae8BmgFPAf8B0AHE
- AccB/wHSAssB/wHTAcoBywH/AdcCzgH/AdYCzgH/AdUB0AHTAf8B1AHCAb0B/wH9AbkBjAL/AZ0BNwL/
- AZcBGAH/AdwBcAE5Af8QAANcAd8BrwGrAaoB/AGcAZYBlQH6AVQBqAG+Af0BagHkAv8BVAG2AfEB/wKR
- AZUB+wGnAZ0BnAH7AX8CfQH4A0ABcBgAA0gBiAF1AnMB+gGqAqMB/wGKAmYB/wFqAmkB+QJbAVkBwwMo
- ATwDVAGvAVMB8AL/ASQBbQHEAf8CRQFGAX4IAAMdASoBtQE3AQAB/wH0AU8BAAH/AbsBQAEMAf8B8QHM
- Ac0C/wLzAv8B9wH2Bv8B9AH1Af8B5wG9AbwB/wGgAUwBRAH/AVoBGQEEAf8BUAEFAQAB/wGSASoBAAH/
- A1MBsAM2AVkEAAGtAWsBOwH8Af8BtgFSAf8B7QGUAU8B/wHUAcIBxAH/AdoBUQE2Af8B1wGgAZYB/wHb
- AdcB2gH/AdwBzgHNAf8B2wHTAdQB/wHYAb4BugH/AfMBlAFaAf8B/gGOAS8C/wGPARsB/wG6AV0BQAH9
- CAADEQEXAxUBHQMpAT8DMwFSAygBPAFTAlUBsAGmAcIB3wH/AkwBXQHzAzoBYgMtAUYDLwFKAxgBIQMV
- AR0DDwEUDAADKQE+A2cB8gG/AbsBsQH/AawBrQGmAf8BxgK6Af8BrgKUAf8BrwGaAZcB/wNeAdACVQFX
- AboBVAG3AeEB/gFQAeoB/AH/A1sByAMJAQwEAAG1ATcBAAL/AWUBAwH/Ae8BYwEIAf8BuwFvAWQC/wHo
- AeYC/wHnAegC/wLvAv8C9gL/AvoG/wL7Af8B8gLPAf8BswFeAVsB/wFuAS4BHAH/AbIBNgEAAf8DSQGJ
- BAABrAFnATkB/AH/AbsBWAH/Ae8BmwFXAf8B3QHRAdIB/wHmATEBDgH/AeEBnQGRAf8B5QHtAe8B/wHl
- Ad8B3QH/AuYB6AH/AeABygHFAf8B8gGCAUUB/wH9AY0BLwL/AZgBJAH/AbkBWwFAAf0EAANLAZADXAHn
- AVwCVQHqAVsCWAHjA1sB4QNaAd4DXQHwAc0BuQG1Af8BcQFhAV4B/ANaAeQDXwHgA10B4gNcAecDYAHr
- A1gB4wNAAXADFgEfAzcBWwNVAbUBhwFvAaEB/wFZAVQBjAH/AVUBVwGBAf8BugG4AbYB/wG+AawBqwH/
- AbsBpgGlAf8BwgGsAaIB/wFEAUIBYgH1ATIBjgGtAfsBWQP/AUEBxgH1Af8CRgFHAYAEAAG1ATcBAAH/
- Af4BbwERAf8BygFVAR4B/wHxAcMBuwH/AfwB0wHKAf8B9wHRAc8B/wHaAaIBpQH/AdkBngGhAf8BqwFQ
- AVoC/wL0Av8C9QL/Af4B/QP/Af0B/wG5AWABVwH/AbUBNwEAAf8DTAGRBAABrAFnATkB/AH/AbwBWwH/
- AfABoAFeAf8C5gHqAf8B5QGWAYcB/wHnAcsBxwH/Ae0B+gH+Af8B7QHxAfUB/wHuAfoB/gH/AeYB2AHU
- Af8B8AFeAS8B/wH9AYoBLQL/AZwBLAH/AbkBWgFAAf0EAAGNAokB+QHyAvAB/wHiAuAB/wHdAtsB/wHc
- AtkB/wHOAswB/wHTAtIB/wHnAuYB/wHuAuwB/wHyAvEB/wHyAu8B/wH0AvEB/wHkAekB4gH/AccB5gHK
- Af8B0AHLAcoB/wNXAcUDVgGzAQsBlgHiAf8BAwGQAegB/wEAAYEB6gH/AQABYwHoAf8BIAFQAbwB/wGv
- AaUBnwH/Ac4BwAG+Af8BzAG4AbIB/wGnAZoBtgH/AS8BbgHNAf8BQQHQAfIB/wFVAfkC/wFdA/8BUQF6
- AZIB9wMsAUQBtQE3AQAB/wH+AYcBIwH/AcIBZQFSAf8B1QKZAf8B1gGdAZ4B/wHXAaEBowH/AfMC3gH/
- AfgC7AH/AbYBYAFoAf8B/QHlAeQC/wLsAv8C8wH/AfUBzwHNAf8BjQE7ASYB/wHeAUcBAAH/A0sBkAQA
- AawBZAE4AfwB/wHAAWIB/wHzAZwBWQH/AegB0gHQAf8B6gHpAecB/wHrAd8B3AH/AesB2QHVAf8B6wHZ
- AdYB/wHsAeEB2gH/AecBwQG1Af8B7wFEARIB/wH8AYYBKAL/AaABMQH/AbkBWQFAAf0EAAG2ArMB/QHu
- AvAB/wHSAtMB/wHVAtYB/wHVAtYB/wHDAsQB/wHPAtAB/wH0AfUB9AH/AfEC8gH/AfEC8gH/AfEC8gH/
- A/MB/wHpAe4B6gH/AdwB7gHgAf8B4gHgAd8B/wNZAccBWwJhAeEBRAF/AYsB9AEvAa8BwAH9ARIBsQHv
- Af8BCwGhAe8B/wFVAYYBqAH/AakBngGWAf8B0QLGAf8B2wHLAcYB/wG9AacBvgH/AUMBpgHgAf8BVgH9
- Av8BVwH8Av8BVQH1AfwB/wFLAdsB8wH/AlcBWQHCAbUBNwEAAv8BlQE3Af8B2wFeASIB/wHLAYwBhAH/
- AfABwgG/Av8B7gHrAv8B/QH8Bf8B+QLmAf8BuAFfAWcC/wHjAeIC/wHpAegB/wGzAVkBVQH/AbMBawE8
- Af8B8gFPAQAB/wNLAZAEAAGsAWMBNgH8Af8BxQFsAf8B/QGjAVAB/wH3AZkBTAH/AfgBmgFMAf8B+AGX
- AUgB/wH4AZcBRAH/AfgBlAFBAf8B+AGUAUAB/wH5AY8BOAH/AfwBgQEmAv8BkQEuAv8BoAE1Af8BuQFX
- AUAB/QQAAacCngH8AeUC5gH/AdsC3AH/A98B/wPfAf8D4AH/AeEC4AH/A+AB/wPfAf8D4AH/A+AB/wPg
- Af8B4QHgAeEB/wHvAewB7wH/AeEC3QH/A1kBwwMMARADLwFJA10B4gGbAY8BngH/AW4BZgGIAf8BbgFo
- AW8B/wGfAp0B/wHWAs0B/wHkAdsB2QH/AfsB4gHYAf8BjwGUAckB/wFGAdMB8AH/AYAD/wFbAeAB9AH/
- AlgBZAHmAjQBNQFVAbUBNwEAAv8BoQFMAv8BawEIAf8B/AHPAakB/wHgAagBjgH/AcoBhgFsAf8B5QGs
- AakB/wH+AeAB3gL/AfwB+wH/AbkBZAFrAv8B1gHNAf8B8gHBAbwB/wGCASUBGgH/AekBqgFkAf8B9gFQ
- AQAB/wNLAY8EAAGtAV8BMwH8Af8BzgGTAf8B+AHYAb4B/wH4AdcBugH/AfcB1AG1Af8B9QHSAbMB/wHy
- Ac8BsAH/AfEBzQGuAf8B8QHJAasB/wHvAckBqQH/AewBzAGtAf8B6AHEAakB/wH7Aa8BVwH/AboBVAFA
- Af0EAAF5AncB9AH3AvgB/wPxAf8D8AH/Ae4C7wH/A+4B/wHsAu0B/wHqAusB/wPpAf8D6AH/A+cB/wPl
- Af8D4wH/AesC7AH/Ac8CygH/A1UBsQE9Aj4BagEmAU0BmAH6AQsBWgHCAf8BEAFjAdMB/wEFAVIBzgH/
- ARwBSgG8Af8BqAGgAaIB/wHkAdkB1AH/AfEB6QHqAf8BsAG2AdkB/wFSAWEBvgH/AScBmgHZAf8BiAH+
- Av8BnQP/AVgBYgFuAe8CIQEiATEBtQE3AQAC/wGuAWIC/wFrAQgC/wHcAb4C/wHcAb4B/wH+AdkBuAH/
- AeoBuQGdAf8BzQGJAWsB/wHbAZ0BmQH/AfoB0wHSAf8BvAFjAWcB/wG2AWMBWgH/Aa0BOwEoAf8B/AHB
- AYwB/wH2AVABAAH/A0QBfAQAAa0BXQEwAfwB/gHTAZ4B/wH1AvgB/wH8A/8B/AP/AfwD/wH6Af0C/wH6
- AfsB/QH/AfoB9wH5Af8B+QL0Af8B+QHyAfMB/wHpAeYB6gH/AfIBswFlAf8BugFTAUAB/QQAAV0CXAHf
- CP8B+QL6Af8B9gL3Af8D8wH/Ae4C7wH/AeoC6wH/A+cB/wHiAuMB/wPeAf8B2QLbAf8D1gH/Ad0C3gH/
- AagCogH/A0gBiAFYAV4BYQHdARQB3gL/AQkB1QL/AQABugL/AQABogL/AUsBmgHfAf8ByAG0Aa4B/wHp
- AeAB3QH/Ae4B6QHwAf8BQgGMAdQB/wFUAcwB7wH/AYsB5wH3Af8BlwH9Av8BowP/AZgD/wJZAVwBzAG1
- ATcBAAL/AbsBiAL/AWsBCBX/AfIC5QH/AdICpQH/AaQBPgFHAf8BywGqAakB/wP2Bf8B9gFQAQAB/wMl
- ATcEAAGtAV0BMAH8Af0B0gGcAf8B9gH1AfIK/wL8Av8B+QH2Av8B9wHyAv8B8wHuAv8B8AHpAv8B8QHr
- Af8B8AHlAeQB/wHyAbMBYwH/AboBUwE+Af0EAANXAboB3wLVAf8B4wLZAf8B3ALTAf8B2wLRAf8B2gLQ
- Af8B1wLOAf8B1QLMAf8B1ALLAf8B0wLKAf8B0QLJAf8BzwLIAf8B0ALJAf8B1wLQAf8BZAJfAfsDNAFU
- AzIBUAM1AVYDVQG1AWwBkAGgAf8BpAHCAdoB/wHDAcoB0AH/AcsBvgG7Af8B8wHuAe0C/wH9Av8BhgGo
- AeEB/wFvAdsB8wH/AcQD/wG3A/8BRAGtAeIB/wFCAVkBfgH1AlcBXQHfAbUBNwEAAv8ByQGfAv8BsgFn
- Av8BawEIAv8BawEIAv8BawEIAv8BawEIAv8BawEIAv8BawEIAv8BawEIAf8B/gFrAQgB/wH+AWsBCAL/
- AWsBCAL/AWsBCAH/AyoBQAMEAQUEAAGtAVwBLgL8AdIBnQH/AfQB8wHxBv8B/AH7Av8B9wH2Av8B9AHx
- Av8B8gHtAv8B7gHoAv8B7gHnAv8B8wHvAf8B7AHlAeQB/wHwAbIBZAH/AboBUgE9Af0EAANMAZIBtwKh
- Af8BxgKwAf8BwQKsAf8BwgKtAf8BwwKuAf8BxAKwAf8BxgKzAf8ByAK2Af8BywK5Af8BzgK9Af8B0QLB
- Af8B2QLLAf8B1gLDAf8BZAJXAfEDHQEqCAADLAFEAVwBWAFBAfgB7AHhAdwB/wHmAd0B2wH/AeUC2gX/
- Ad8B2QHTAf8BQQFJAV8B+wFJAagBugH9AdED/wHRA/8BjQHHAeoB/wNOAZQDAQECAbUBNwEAAv8B1QG1
- Av8B1QG1Av8B1QG0Av8B1gG1Av8B1QGzAv8B1QGzFf8BtQE3AQAB/wMqAUADBAEFCAABrQFcAS4B/AH7
- AdIBnQH/AfMB8QHwAv8C/gL/AfkB9QL/AfUB8QL/AfEB7QL/Ae4B5wL/Ae0B5gL/Ae8B6QL/AfYB8wH/
- AesC5QH/AfEBswFmAf8BugFSAT4B/QQAAz0BaAGOAn8B/gHKArUB/wHGArIB/wHGArMB/wHIArQB/wHK
- ArcB/wHLArkB/wHNArwB/wHRAsAB/wHTAsQB/wHXAsoB/wHfAtIB/wHJArUB/wNbAeEDDAEQDAADSgGM
- AVkCVAH/AZ8ClQH/AbQCswH/AYgBhwGIAf8DVgG4A0MBdwFVAV0BZgHqAd8B/gL/AecD/wHrA/8BUgFt
- AYoB9wMkATYBtQE3AQAC/wHgAccC/wHgAccC/wHgAccC/wHgAccC/wHgAccF/wG1ATcBAAH/AbUBNwEA
- Af8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DHQEqAwQBBQMCAQMIAAG3AVIBQAH9AfoB1AGgAf8B8gHv
- AfAC/wH+A/8B+AH2Av8B9QHxAv8B8QHsAv8B7wHrAv8B8wHuAv8B9QHzAv8B/AH7Af8B7ALqAf8B4AGl
- AVkB/wG4AU4BNAH9BAADJgE4AW4CYgH2AcYCsQH/AccCswH/AccCswH/AckCtgH/AcsCuQH/Ac0CvAH/
- AdACvwH/AdICwwH/AdUCyAH/AdsC0AH/Ad0C0QH/AbACnAH/A1YBwRAAAwEBAgM0AVQDQgF0Az4BbAMx
- AU8DCwEPAwABAQJZAVwCyQH5Av8B+wf/AdEB+AH+Af8DWwHIAbUBNwEAFf8BtQE3AQAB/wMrAUIDBwEK
- AwMBBAMDAQQDAgEDAwABARAAAdABWAEpAv8B4QGnAf8B9wH6AfMH/wH6A/8B9QL/AfwB8gL/Af4B9gP/
- AfoD/wH9Bf8B8QH1Ae4B/wHnAbMBYwH/AdMBUgETAf8EAAMQARYBXwJcAeoBwwKtAf8BzwK7Af8B0AK+
- Af8B0QK/Af8B1ALDAf8B1wLHAf8B2wLLAf8B3gLQAf8B4QLWAf8B6QLeAf8B3QLLAf8BmAKEAf8DTAGS
- LAACSAFJAYcBMQFfAZUB+wFNAWcBmgH6AU0BYgGZAfoBSQFfAZoB+wFOAVcBZgHvAwEBAgG1ATcBAAH/
- AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DHQEqAwQBBQMCAQMgAAFWAlQBqwGWAVoBMgH7
- AX4CWQH1AX4CWQH1AX4CWQH1AX4CWQH1AX4BWQFMAfUBfgJZAfUBfgJZAfUBfgJZAfUBfgJZAfUBiAFS
- AVEB9wGWAVYBLAH7AVgCVgG7CAADUQGcAXgCcQH6AY4ChAH7AYECeAH6AYECeAH6AYQCeQH6AYYCegH6
- AYkCfAH6AYoCfQH6AYwCgAH6AZICjwH7AX4CeAH8A18B4AMhATAYAAMhATEDQAFwA1ABngMpAT8EAAMK
- AQ4DEQEXHAADBAEFAxQBHAMnAToDLAFEAygBPQMjATQDHgErAxgBIgMUARsDEAEVAwwBEAMJAQwDBAEG
- AzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNcAc4DWQHD
- AzQBVQNKAYwDVgG2A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGx
- A1YBtgNOAZgUAANeAdkBxQKyAf8BzwK7Af8DWAHAAykBPwNbAcsDXQHSAzEBTxgAAx8BLAJXAVoBxQJb
- AWAB1gNXAb8DUAGkA0oBiwNBAXIDOAFdAzEBTgMtAUUDKAE9AyMBNAMaASUDYQHuA+IB/wPdAf8D2gH/
- A9oB/wPYAf8D2AH/A9cB/wPXAf8D1QH/A9UB/wPUAf8DyAH/A9oB/wOZAf8DVwG9AWABQAE8Af0BtAFv
- AWEB/wGwAYYBbwH/AbQBiAGAAf8BsgGIAXAB/wGxAYYBcAH/Aa4BhgFwAf8BrQGFAXAB/wGsAYUBbwH/
- AaoBhAFvAf8BqQGBAW4B/wGoAYIBbwH/AaYBgQFuAf8BpwGDAYIB/wGsAW4BaAH/AVIBRAFDAfQIAAM6
- AWIDOAFeAzIBUQFzAmsB9gHmAtIB/wHnAtgB/wHFArQB/wGdAo4B/wHMAroB/wHgAswB/wN/Af4DNwFb
- EAADAgEDAk8BUQGcATEB3gL/AT8BswHHAf8BIQGNAa0B/wEQAZYB0QH/ARIBfwG5Af4BPgFZAXsB9QJX
- AWAB6AJaAV4B1QNXAb8DUgGmA0kBiQM0AVQDhAH3BP8D9AH/A/MB/wPzAf8D8QH/A/AB/wPuAf8D7QH/
- A+sB/wPsAf8D5wH/A5YB/wPQAf8DzAH/A1kBwwGmAUwBQAH9AfMB2wHOAf8B4AHRAcYB/wHfAc0BwQH/
- AdoByQG/Af8B2gHIAb0B/wHaAcUBuwH/AdkBxQG6Af8B2QHFAbgB/wHYAcMBtgH/AdgBwQG0Af8B2AHB
- AbIB/wHWAb8BsAH/AdgBxAG1Af8B5AG8AagB/wFZAU8BTQHyBAADNQFXAa8CnQH/AbgCpAH/AaUCkwH/
- AccCtAH/AeEC0QH/Ae0C4QH/AewC3wH/AeMC0gH/AdsCzgH/AfQC6wH/AfEC4gH/AVkCVwHCEAADDgET
- AVcBXwFlAegBUQHTAfQB/wGzAWwBTAH/AeIBqQGEAf8BwQGUAWIB/wGmAZgBbQH/AYIBowGdAf8BUAGw
- AcwB/wE0AbgB9gH/ASABsQL/ARQBngL/AQQBUgHTAf8DUQGgA3MB9gP7Af8D6gH/A+sB/wPqAf8D6AH/
- A+cB/wPmAf8D5AH/A+MB/wPkAf8D3wH/A5wB/wPQAf8DxAH/A1YBwQGkAUsBQAH9Ae8BxwGcAf8BxAGl
- AYIB/wHZAawBbgH/AfMBtwFwAf8B8QGxAWcB/wHyAa0BYAH/AfIBqQFYAf8B8gGkAVIB/wHyAaABTAH/
- AfIBnAFFAf8B8gGZAT4B/wHyAZUBOAH/AfUBlQE1Af8B9gGQAS4B/wFWAVMBUQHxAwwBEANkAecBzAK5
- Af8B3QLLAf8B2gLHAf8B2ALHAf8B6QLcAf8B8QLmAf8B9gLsAf8B9gLtAf8B9gLtAf8B/QL2Af8B3QLQ
- Af8DYQHcA0UBfgMEAQYIAAM4AVwBIgGpAfQB/wFbAaMBtAH/AeQBtAGLAv8BzwHEAv8B1gG9Av8B3AG2
- Af8B+wHIAZ0B/wHmAbMBhAH/AcQBoAFpAf8BnwGbAXAB/wFtAqoB/wFKAc4C/wJaAVwBzQN1AfYD/AH/
- A+0B/wPtAf8D7AH/A+oB/wPpAf8D6AH/A+YB/wPlAf8D5QH/A+EB/wPTAf8D6gH/A8EB/wNWAcEBqAFK
- AUAB/QHmAcsBrgH/AdAB3AHjAf8B1QG9AaYB/wH+Ab0BgAL/AbwBgAL/AbYBaQL/AbIBYgL/Aa4BWwL/
- AakBVQL/AaUBTwL/AaIBSAL/AZ8BQgL/AZ8BPgL/AZkBNgH/AVkBUwFRAfEEAANMAZABzAK6Af8B6QLb
- Af8B6ALbAf8B7QLgAf8B8gLmAf8B3gLRAf8B0ALDAf8B5QLaAf8B/AL0Af8B/QL3Af8B5wLbAf8B2wLG
- Af8BsQKeAf8DOgFiBAADAwEEA1YBtgFCAc8C/wGXAZABgAH/Af0B1QG6Af8B9AG7AbkB/wH9Ad4BvwH/
- Af4B3QG/Av8B5gHLAv8B5wHLAv8B5wHJAv8B0QGuAf8B0QGgAVMB/wEYAYkB0gH/A0oBigN1AfYD/QH/
- A+4B/wPuAf8D7QH/A+sB/wPqAf8D6QH/A+cB/wPmAf8D5gH/A+MB/wOiAf8D0wH/A8cB/wNWAcEBpwFK
- AUAB/QHwAdYBugH/AegB8wH6Af8B4QHKAbQB/wH7AbwBgQL/Ab0BggL/AbcBbAL/AbMBZgL/Aa8BXwL/
- AasBWgL/AacBVAL/AaQBTQL/AaEBSAL/AaIBRQL/AZwBPwH/AVkBUwFRAfEDFQEdA0gBhAHAAqsB/wHm
- AtcB/wHsAuAB/wHvAuMB/wFoAmYB7wNCAXQDLAFEA0gBhQGaApUB+gH/AvwC/wL7Af8B+QLzAf8B8ALl
- Af8DUwGqBAADGQEjAUIBWQGAAfUBYwHJAesB/wHIAaABbgH/AfwB0wHRAf8B9gHLAcUB/wH8AeMBygH/
- Af0B4AHKAf8BrgGgAYEB/wHiAcUBsAL/Ad0BxQH/AfQByQGsAf8B+AHYAasB/wNaAdsDIwEzA3UB9gP9
- Af8D8AH/A+8B/wPuAf8D7AH/A+sB/wPqAf8D6QH/A+cB/wPpAf8D5AH/A5EB/wPNAf8DywH/A1YBwQGl
- AUwBQAH9AfsB1AGqAf8B4wHDAaIB/wHvAcABlgL/AcIBjAL/Ab4BhQL/AbkBcAL/AbUBagL/AbEBYwL/
- Aa4BXgL/AaoBWAL/AacBUgL/AaQBTQL/AaYBSwL/AaABRAH/AVkBUwFRAfEDYQHkAcECqwH/Ac0CtgH/
- AeQC1gH/AfMC6QH/Ac0CvQH/AzQBVQgAAwsBDwFxAm4B8wH/AvoJ/wH9AvYB/wNbAcsDAAEBAkEBQgFz
- ASoBoAH9Af8BlQGwAa0B/wHtAcQBpAH/AfUBxwHVAf8B+AHhAdIC/wHpAdsB/wHPAcMBpwH/ASsBpAE8
- Af8BUQGRAUgB/wHfAbsBrAH/AfUBywG0Af8B+AHOAaAB/wNKAYoDEwEaA3UB9gP+Af8D8QH/A/EB/wPw
- Af8D7gH/A+0B/wPsAf8D6gH/A+kB/wPoAf8D5gH/A8sB/wPoAf8DxwH/A1YBwQGoAU0BQAH9AecBygGo
- Af8BwwG4Aa0B/wHXAbUBlgL/AcUBjwL/AcEBigL/AbwBgwL/AbgBbgL/AbQBaAL/AbIBYgL/Aa4BXQL/
- AasBVwL/AagBUgL/AakBUQL/AaQBSgH/AVoBUwFRAfEBYAJfAeAB0gK9Af8B4gLSAf8B7QLiAf8B+ALt
- Af8BigKFAfkDHQEpBAADFAEbA1UBsgHYAscB/wH+AvsF/wGbApYB+wNRAaADKAE9AwQBBgJZAVwByQFa
- AcgC/wG4AaYBhQH/AfkB1gHTAf8B8wHLAdgB/wH3AesB3gH/AfwB5AHeAf8BgQGxAWkB/wFbAegBnwH/
- AU0B2wGNAf8BUQGWAUsB/wHrAdYBywH/AmEBXAHcAykBPwMNAREDdQH2BP8D8wH/A/IB/wPyAf8D8AH/
- A+8B/wPtAf8D7AH/A+oB/wPqAf8D6AH/A8gB/wPlAf8DyQH/A1YBwQGoAUwBQAH9AesB1gG/Af8B5AHz
- Av8B2wHKAbkB/wH7AcMBjQL/AcQBjwL/AcABhwL/AbwBggL/AbkBbQL/AbUBaAL/AbIBYgL/Aa4BXQL/
- AasBWAL/Aa0BVwL/AagBUgH/AVoCUwHxA1IBoQHUAsIB/wH2AuwB/wHyAugB/wH3Au4B/wHYAskB/wNg
- AdYDVwG4AWECYAHoAc4CuwH/AewC4Qn/AXACbQHzAx0BKgQAAygBPAEoAU0BpAH6AZUBzgHiAf8B2AG2
- AZEB/wH3AdMB7AH/AfMB4AHkAf8B/AHuAewB/wHKAdABuAH/AUwBxgFmAf8BWgG6AWMB/wFXAc8BhAH/
- AU4B6AGbAf8BTAGZAUgB/wNOAZcDLwFKAxkBIwN3AfYE/wP0Af8D9AH/A/MB/wPxAf8D8AH/A+8B/wPt
- Af8D7AH/A+0B/wPoAf8DiQH/A8kB/wPQAf8DVgHBAacBTgFAAf0B9gHcAb0B/wHnAeAB2AH/AecBzAGw
- Af8B/gHHAZUC/wHGAZMC/wHCAYwC/wG+AYcC/wG7AYEC/wG4AW0C/wG0AWgC/wGyAWMC/wGvAV8C/wGx
- AV4C/wGsAVgB/wFgAlMB8QMcASgDXAHRAXcCcQHzAeAC0QH/AfcC7wH/AfkC8QH/AegC2gH/AdwCyQH/
- Ad8CzwH/AewC4wL/Av4J/wHwAuUB/wNYAcEDAQECAk8BUAGbAToBngL/AbUBvgGqAf8B8gHOAb4B/wH3
- AdMB7wH/AfwB8wHxAv8B8QH0Af8BWgG6AVsB/wFVAboBXAH/AesB3gHYAf8ByAHSAbkB/wFfAcoBaQH/
- AUQB7gGVAf8BWQFdAVkB1wM3AVoDKQE/A3cB9gT/A/YB/wP1Af8D9QH/A/MB/wPyAf8D8AH/A+8B/wPt
- Af8D7QH/A+oB/wOwAf8D3AH/A88B/wNWAcEBqAFPAUAB/QH1AdcBsAH/AdQBtgGYAf8B6AG/AZkC/wHO
- AZ4C/wHIAZgC/wHFAZEC/wHBAYwC/wG+AYYC/wG7AYEC/wG3AW0C/wG1AWkC/wGyAWUC/wG1AWQC/wGx
- AV4B/wFgAlMB8QQAAwgBCwNhAdwB0AK7Af8B9QLsAf8B/QL4Bv8C/QL/Av4J/wH0Au0B/wH9AvsB/wHd
- AtMB/wNAAW4EAAFLAU4BcAHwAYcBzgH9Af8BzgG5AZIC/wHdAfEB/wH8Ad4B7gH/Ad4B2wHUAf8B5gLb
- Af8BxAHSAbYB/wHxAeoB4wL/AfMB9QL/AfcB7gH/An8BiAH+A1UBugFNAaUBWAH6AVkBXQFZAdcDMAFN
- A3cB9gT/A/cB/wP2Af8D9gH/A/QB/wPzAf8D8QH/A/AB/wPuAf8D7QH/A+sB/wPiAf8D9AH/A8wB/wNW
- AcEBqAFPAUAB/QHmAdQBvAH/AdIB2gHgAf8B1QHEAbEB/wH8Ac0BnQL/AcsBnAL/AccBlQL/AcMBkQL/
- AcEBiwL/Ab4BhgL/AbsBggL/AbgBbwL/AbYBagL/AbgBagL/AbQBZAH/AWACUwHxCAADVQGwAdwCywL/
- Av0B/wH8AvUB/wHrAuEB/wH6AvYJ/wF3AnIB8gNEAXkDVAGuA0oBjAgAAl0BYgHiAbwB4wHkAf8B6QHH
- AZIB/wHuAdcB0AH/AVABnAFDAf8BCwGKAQYB/wEKAYABAwH/AUcBgwExAf8B7wHdAc4C/wHyAeAB/wHn
- AeEBwgH/AlkBXQHSAxsBJgMiATIDWwHIAVgBWwFYAcYDdwH2BP8D+QH/A/gB/wP4Af8D9gH/A/QB/wPz
- Af8D8gH/A/AB/wPxAf8D7QH/A50B/wPSAf8D0gH/A1YBwQGoAU8BQAH9AfAB4QHNAf8B5gHxAfkB/wHf
- AdMBwwH/AfwB0gGlAv8B0gGlAv8BzgGfAv8BywGZAv8ByAGUAv8BxAGQAv8BwgGLAv8BwAGHAv8BvQGC
- Av8BvgGEAv8BvAFtAf8BYAJTAfEIAAMSARkDUgGjAdsCzQH/A2EB4gNAAW4DZAHnAf8C/gH/AfwC+QH/
- A1wByRQAAy0BRQNVAbIBWgJdAcoBWQJkAewBQgHKAT0B/wFEAd0BQgH/ATcB2AExAf8BEwGMASMB/wGN
- AawBxQH/AaoBzAHXAf8BWQFkAW4B7AMxAU8DCAELAwABAQMCAQMDHwEsA3kB9gT/A/sB/wP5Af8D+AH/
- A/YB/wP0Af8D8wH/A/IB/wPxAf8D8QH/A+0B/wOWAf8DzwH/A9QB/wNXAcIBlQFxAU0B/gH/AfIBzQH/
- AfoB3gHFAv8B2wG4Av8B4AGyAv8B3gGtAv8B2QGmAv8B1gGiAv8B0wGcAv8BzwGYAv8BzQGUAv8BywGQ
- Av8ByAGMAv8BywGMAv8BxgGHAf8BXwJMAfMQAAMyAVADHwEsBAADSgGJA2EB4gNWAbEDNQFXIAADIAEu
- A1sBwwF6AZIBegH3AVwBYAFcAdQDPQFpAz4BawJBAUIBcwMfAS0DBAEFAwABAQwAA4gB+Bz/A/4B/wP9
- Af8D/QH/A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFPAUsB8gF0AU0BRwH6AXIBTQExAfoBcgFNATIB+gFx
- AU0BMgH6AXABTQExAfoBcAFNAS8B+gFvAU0BLgH6AW8BTQEsAfoBbgFNASoB+gFuAU0BKgH6AW4BTQEp
- AfoBbgFNASkB+gFqAUMBQQH5AXABMQErAfwDWwHZgAADWwHLA6UB/gOxAf0DsQH9A7EB/QOxAf0DsQH9
- A7EB/QOxAf0DsQH9A7EB/QOxAf0DswH9A7AB/gNqAfUDOwFlTAADVgGzA1IBqQM1AVgDLQFFAxwBJwMX
- ASADOwFlAVoCXwHbA0EBcwMaASQDBAEGGAADFQEdA0IBdgNVAbIDVwHCA1YBwQNUAasDPgFrAw8BFBwA
- AxABFgNbAcgDZAHxA2IB7wNiAe8DYgHvA2IB7wNnAfIDWgHTAxQBGxQAA1YBswFnAlcB8gNfAeADVgG2
- A0QBeQMoATwDDQESKAADUgGpAQABlgHtAf8BWwJeAdADRAF7AzUBVgJPAVEBnAE5AYMBmgH3AT4BcwGE
- AfUDPAFmAykBPgMXASADCgENAwIBAwwAA0MBdwFcAlUB6gGfAXsBegH+AdoBoAGdAf8B4gG1Aa0B/wHe
- Aa0BpQH/AcsBkQGKAf8BdQE6ATkB/ANcAdwDOAFdGAADBAEGA2cB6wP6Af8D8AH/A/AB/wPvAf8D8gH/
- A/IB/wNXAd8UAAEsAisBQwGNAmoB+QH/AeMB1AH/Ae8BwAGzAf8B0AGbAZMB/wGIAWsBaQH+AV8BRAFF
- AfgDWgHkA1cBvwNIAYYDLwFKAxABFhgAAzEBTgEAAVoB6gH/AQABJgH0Af8BUwFhAWoB7gFbAl4B2QEA
- AYMC/wEAASkB8QH/AVMBZAFtAfEDUwGqA0EBcgMxAU8DIQExAw0BEggAA1ABowGrAmMB/QH7AuQC/wHp
- AeYC/wHZAc8C/wHpAdkC/wHoAdYC/wHnAdUC/wHaAcoB/wHcAZoBkQH/AVwCPgH4A0UBfwgAAwQBBgMq
- AUEDPwFtA0oBiwNZAesDvQH/A78B/wO8Af8DvQH/A74B/wOtAf8DXgHlA00BlgNCAXYDMAFNAxQBGwQA
- AUkCSAGHAd8BrAGlAv8B3AHFAv8B1wHBAv8B3wHNAv8B4QHTAv8B2wHQAf8B9AHIAb8B/wHZAaQBngH/
- Aa4BZQFiAf8BXwFEAUMB+wNZAesDWQHHA04BlAMlATcLAAEBAw4BEwFYAWQBaAHmAQABFgH3Af8BAwEp
- Av8BBgFNAv8BAgENAfgB/wEAAWAB+AH/AbkBywG1Av8B3gGvAf8BcgFnAWQB8QNQAaQDNgFZAyIBMgQA
- A0sBkAG2An8B/gX/Af4B/AL/AekB5wL/Ac0BwwL/AdgByQL/AdoByQL/AdcBxgL/AdoBxwL/AeUB0QH/
- AfQBtQGnAf8BXAI+AfgDOAFcBAADWgHNA3cB/AG3AbgBuQH/AdAB0QHSAf8BzgHPAdAB/wHaAdsB3AH/
- AuUB5gH/AeIB4wHkAf8B4gHjAeQB/wHjAuUB/wLlAecB/wHMAdEBzwH/AbsBvwG9Af8CrAGtAf8DcgH8
- A1kB0gQAA1sByAHyAc0BxAL/AdsBzQL/AdYBzAL/AdkB0QL/AdoB1AL/Ad0B1gL/AeIB2QL/AecB3QL/
- AegB3gL/Ad8B1AH/AfoBzAHBAf8B4wGtAaYB/wGjAUkBSAH/A1UBsgQAAwIBAwMLAQ8DHQEqAVsCYAHW
- AR8BWwH9Af8BVAFcAf0B/wFGAVEB/AH/ASMBNwH8Af8BBwGUAfUB/wHEAcMBpQL/AdsBpQL/Ae8BxwH/
- AewBvgGVAf8DUQGnAzMBUgMqAUEBigJlAfkB/wHwAe8C/wH7AfkC/wHwAe8C/wHvAe4C/wHZAdEC/wHc
- AcwC/wHgAc4C/wHYAccC/wHTAcEC/wHUAcEC/wHjAcwB/wHcAZQBhwH/A1wB3AMQARYDtQH9AvgB9wH/
- AdUB0QHOAf8B0wHQAc0B/wHSAdABzQH/AdEBzwHMAf8BxgHEAcIB/wG3AbYBswH/Ab4BvAG7Af8CzQHL
- Af8C0QHPAf8BzwHRAc4B/wHOAc8BzQH/A9kF/wNgAfMDHAEoAWkCXQHwAf8B4QHaAv8B4AHcAv8B4QHf
- Av8C4wL/AuUC/wLnAv8C5QL/AeEB4AL/Ad0B2wL/AdsB1QL/Ad0B0AL/AewB3QH/AcYBggFvAf8DTwGb
- BAADCQEMAzABSwFcAmAB1AEuAZoB/AH/AaUBsAH+Af8BnQGrAf0B/wFrAY0B/AH/AU0BYAH7Af8BFgFD
- AfkB/wENAYEB5gH/AZ4BrgGhAf8B/gG+AYMC/wHjAbAB/wGKAXoBaAH3A0UBfQFVAlMBsAHxAbsBuQL/
- AdwB1wL/AdsB2AL/Ae4B7QL/AfcB9QL/AdQB0QL/AbkBsgL/AcYBuwL/AdgBxwL/AdYBxAL/AdIBvgL/
- AdYBwQL/AdABugH/AY8CQAH9Az4BawGZApsB+wG7AbABpgH/AbABZwE2Af8BxgGIAUgB/wHGAYABQwH/
- AcYBawE+Af8BxAFnATgB/wHEAWEBMwH/AcQBXAEvAf8BwgFXASkB/wHCAVEBIwH/AcIBTQEgAf8BwQFF
- ARcB/wGZATsBGgH/AdIB1AHWAf8DXQHwAT4CPQFqAbECfwH+Af8B7AHrAv8B5wHoAv8C7gL/AvcB/wH+
- AvgB/wH8AvMB/wH+AvUC/wHvAe4C/wHqAesC/wLlAv8B5gHiAv8B0gHNAf8BbgJBAfkDMAFLBAADQgF2
- ATYBYgGFAfYBGQFmAv8BjgGmAv8BjAGlAv8BjAGaAf0B/wFoAYgB/AH/AT8BWwH9Af8BHgFEAv8BAAEm
- Av8BAAFWAfIB/wFOAaQBvAH/AcMBhAFEAf8BywFqAS8B/wNWAcEBYwJiAekB/wHvAekC/wHkAdwC/wHS
- AcsC/wHZAdIC/wHLAcoB/wH9AaoBrwH/Af4BwAHDAf8B/QGuAbQB/wH+Aa8BqwL/AdYBwwL/AdMBvwL/
- AdABvAL/AdoBwwH/AcwBhgFqAf8DUwGtAZcBmQGbAfsBvQGvAaEB/wHmAaIBXQL/AbwBhwL/Aa4BawL/
- AaUBYgL/AZwBWQL/AZQBUgH/Af4BjAFJAf8B/QGFAUAB/wH9AW4BOQH/AfwBZwEyAv8BXwEnAf8BwAFI
- ARsB/wHMAtAB/wJdAV8B8AFWAlQBqwHwAckByAL/AvoC/wH8Af0B/wH+AvoB/wH0AeUB5gH/AeYBvgG9
- Af8B3QGYAZMB/wHvAdIB0Ab/AfQB9QL/AfAB7wL/AfQB9QH/AfACvAH/A1sB4QMPARQEAAFYAlsBywFb
- AmAB1gFCAWoBgQH1ASABiQHKAf8BDgGVAekB/wFMAYoB/gH/AWABbQH8Af8BEwGLAfkB/wE0AaYB4AH/
- ASMBiwHOAf8BGwGAAcUB/wEkAaYB2gH/Aa8BhwFXAf8B3wGXAUYB/wFjAV8BVwHoAZACagH5Af8B9wHu
- Av8B6wHiAv8B6QHeAv8B2AHNAv8BqQGqAf8B4gG2AboB/wGnAmEB/QGwAY0BjgH+Af0BrgGzAv8BwQG1
- Av8B1gHCAv8BzwG7Av8B2QHCAf8B3wGeAY4B/wNXAcIBlwGZAZsB+wG9Aa8BowH/AeEBoAFdAv8BuQGH
- Af8B+QGsAWwB/wH4AaQBZAH/AfgBnQFcAf8B9gGWAVUB/wH2AY4BTQH/AfUBiAFHAf8B9AGBAUAB/wHz
- AW0BOQH/Af0BZgEwAf8BvQFNASMB/wHNAtAB/wJdAV8B8ANfAeMB/AHnAeYB/wH6AegB5QH/AeYBwQG8
- Af8B0gGZAZYB/wHIAXABbgH/AcoBbAFqAf8BzwFrAWYB/wHTAYMBbQH/AfIB3QHaBv8C+AL/Av4B/wHS
- AZEBkAH/A1MBsBAAAl0BWgHKAYQBKAEAAf8BRQFLAUUB/wEgAYsC/wExAVwC/wFFAZgByAH/Ae8BnAFE
- Af8BhgEwAQAB/wFwASoBAAH/AZQBOAEDAf8B2wGMATMB/wHXAZUBRQH/AXMBXwFMAfMBmQFzAWoB+wH/
- AfUB7QL/AegB3wL/AeoB3wL/AdgBzgL/AbMBtgH/AdIBsgGzAf8BUgI6AfcBpwJhAv0BwAHFAv8BuAGu
- Av8B1wHBAv8BzwG7Av8B2AHCAf8B4gGiAZIB/wNXAcIBlwGZAZsB+wG8Aa8BowH/AeIBowFhAv8BvQGL
- Af8B+gGxAYAB/wH5AakBaAH/AfkBogFhAf8B+AGbAVoB/wH3AZQBUwH/AfYBjgFNAf8B9gGIAUYB/wH1
- AYIBPwH/Af0BbwE5Af8BvgFUASgB/wHNAtAB/wJdAV8B8AGKAm0B9wHdAZ8BnAH/AbIBUgFQAf8BowE+
- AT0B/wGmAUMBQgH/AbABUQFQAf8BuAFcAVsB/wG/AWUBZAH/AcABXwFcAf8BzgFvAWgB/wH3Ad8B2Qb/
- AfUB8wH/AaMBSAFGAf0DPQFqEAACWQFXAb8BngFMAQ4B/wG+AYcBQQH/AR4BhQHzAf8BAAFPAf0B/wFM
- AVUBVgH/AYsBPgELAf8BZgEwAQIB/wFcASQBAAH/AV0BIgEAAf8BgAEzAQAB/wGNAUIBCwH/AWQCWQHr
- AX8CYgH1Af8B9AHtAv8B6gHhAv8B5wHcAv8B4wHbAv8BsAGyAf8B7gGyAbYB/wHSAbIBswH/AeIBtwG5
- Af8B/QGoAa0C/wHLAcQC/wHUAcMC/wHPAboC/wHbAcQB/wHbAZcBigH/A1UBsQGXAZkBmwH7AbsBrgGi
- Af8B4wGmAWQC/wHCAZAB/wH7AbUBhAH/AfoBrgFuAf8B+QGnAWYB/wH4AaEBYAH/AfgBmgFZAf8B9wGV
- AVQB/wH2AY4BTQH/AfYBiQFHAf8B/gGGAUEB/wG/AVgBLQH/Ac0CzgH/Al0BXwHwA1cBugHhAbMBtQH/
- AeEBoQGlAf8BzgGHAYgB/wG9AWMBZQH/Aa0CUgH/AaUCRwH/AaQCRQH/AakBTAFLAf8BqgFHAUYB/wHJ
- AWoBZgH/Af0B7AHqAv8B4QHcAf8BZAJTAfEDHAEoEAACSQFIAYgBzwGIATIC/wHGAXAB/wFPAaUB6QH/
- AQMBgwH0Af8BrgGcAZEB/wG9AaABgwH/Ab0BpAGKAf8BtQGYAW0B/wGdAWgBQwH/AV0BKQEAAf8BhAE1
- AQAB/wFbAlkBxAFeAloB2AH4AeQB3gL/AfAB5gL/AeMB3AL/AeUB4QL/AdcB1QL/Aa8BsgL/AbIBtwL/
- Aa0BsQL/AcoBzAL/AeUB5AL/AdgB0wL/AcoBvAL/AdEBvAH/AaABdAFqAf4DQgF2AZgBmgGcAfsBuwGu
- AaIB/wHjAasBaAL/AccBlQH/AfsBugGJAf8B+wG1AYMB/wH6Aa4BbQH/AfkBqAFnAf8B+QGgAWAB/wH4
- AZwBWwH/AfcBlQFUAf8B9gGRAU8B/wH+AY8BSgH/Ab4BXQEzAf8BzAHOAc0B/wFdAl8B8AMYASEBagJk
- AewB/wHmAekC/wHUAdcB/wH9AcoBzQH/AfUBvQHAAf8B5QGnAaoB/wHSAY4BjwH/Ab8CZwH/AbABVQFW
- Af8BoQE7ATwB/wHQAYoBiAH/AekBowGdAf8DWQHMFAADHAEoAZwBcQFNAfoB9wHTAa0B/wGzAc4B7wH/
- AWEBsQH3Af8B/gHzAecB/wHoAdEBugH/AekB0AG3Af8B6wHRAbgB/wHmAcwBtAH/AdcBtAGOAf8BnwFy
- ATMB/gM7AWQBSQJIAYcB3QGsAaYC/wH5AfIC/wHlAeIC/wHjAeAC/wHmAeIC/wHjAd8C/wHUAdIC/wHb
- AdkC/wHrAeoC/wHoAecC/wLmAv8B4wHfAf8B/QG3AasB/wFgAlkB6wMUARsBmAGaAZwB+wG7Aa4BogH/
- AeMBsAFsAv8BzAGbAf8B/AG/AY4B/wH7AboBiAH/AfoBswGBAf8B+gGtAWwB/wH5AaYBZgH/AfgBowFh
- Af8B+AGdAVsB/wH3AZkBVwH/Af4BlwFTAf8BvgFjATcB/wHLAc0BzAH/AV0CXwHwBAADOwFlAboBrAGt
- Af0B/wHtAe8C/wHcAd4C/wHaAd0C/wHYAdwC/wHVAdgC/wHNAdAB/wH7AcMBxwH/Ae4BuwG/Af8B4AGc
- AZ0B/wGFAkcB+QM8AWgYAANEAXoB8gHGAZsB/wH9AeoB2AL/Ae4B4QH/Af4B+wHzAf8B9wHkAdMB/wHz
- AdgBwQH/AfMB3AHFAf8B+AHnAdMB/wH4AcUBkwH/A1EBoAMQARYDDwEUAWECWwHhAfMB3QHXAv8B/QH6
- Av8B6wHoAv8B6QHlAv8B6wHmAv8B7AHnAv8B5gHjAv8B6gHpAv8B7gHtAv8B9wH2Av8B/gH9Af8BsAFa
- AVcB/QNDAXcEAAGYAZkBnAH7AbsBrgGgAf8B6AG5AYQC/wHYAacC/wHLAZoC/wHFAZQC/wG+AYwC/wG5
- AYcC/wGzAYEC/wGuAW0B/wH+AagBZwH/Af4BpAFjAv8BpAFfAf8BwgFqAT0B/wHLAcwBywH/AV0CXwHw
- CAADWAG8AfMC6AL/AfcB+QL/AecB6gL/AeMB5gL/AeQB5wL/Ae0B8AL/AeQB5gH/AbUBoQGiAf0BXAJZ
- AckDLwFKIAACRwFGAYABnAGRAX0B+AH+AfUB6gL/Af0B+AL/AfwB+AH/Af4B+AHxAf8B/gH1AekB/wG5
- AaEBewH8A1ABnQMNARIDAwEEBAADKQE/AWoCXQHwAfMB4gHfBv8B+QH3Av8B9AHvAv8B8gHtAv8B7QHp
- Av8B9AHyBv8C+AH/AbUCfwH+A1EBoggAAZkBmwGdAfsBswGnAZoB/wHMAZwBVAH/AeYBuQGCAf8B5QGu
- AWkB/wHlAagBZAH/AeQBowFfAf8B5AGeAVoB/wHjAZoBVgH/AeIBlgFRAf8B4gGSAU0B/wHhAY4BSQH/
- AeQBjgFGAf8BqQFZASwB/wLJAcoB/wNfAfAIAAMWAR8BagJmAesM/wH+AfYB9wH/AboBlgGXAf4BXQJa
- AdMBMQIwAU0sAAMqAUECVgFVAbQBcgFqAWYB8AHsAckBrgH/AX0BdQFpAfICWgFXAb0BNQI0AVUDBwEJ
- AwEBAgwAAyoBQQFhAl0B4gHdAa8BrgH/AfcB6QHoAv8B/QH4A/8B+wL/AfgB8wL/AfAB7QH/AewCygH/
- AYYCbQH3A0sBjgwAAbYCtwH9AdsB2AHWAf8BtAGkAZUB/wG7AaoBmQH/AboBqgGaAf8BugGpAZoB/wG6
- AagBmgH/AbkBqAGZAf8BuQGoAZoB/wG5AacBmAH/AbkBqAGZAf8BuAGnAZgB/wG4AaQBlgH/AbIBpQGa
- Af8C7QHuAf8DZAHzDAADQAFuAboCsQH9BP8BvAKjAf4BXQJZAdcDNwFaaAADEAEWAUkCSAGIAWACWwHW
- AXsCZQH0AZkBbQFkAfsBkAJqAfkBZQJfAegBVgJVAbEDKgFBEAADZQHlA50B+wGaAZwBngH6AZoBnAGe
- AfoBmgGcAZ4B+gGaAZwBngH6AZoBnAGeAfoBmgGcAZ4B+gGaAZwBngH6AZoBnAGeAfoBmgGcAZ4B+gGa
- AZwBngH6AZkBnAGdAfoBmgGcAZ4B+gOrAfwDXAHJDAADAQECA1cBuANlAeUBPQI8AWgDAwEENAADCAEL
- AlMBVQGwAkwBgAHzAkQBgAHzAlMBVQGwAwgBC6gAAxABFgM6AWEDVQG0A0sBjgMDAQQgAAMEAQYDAgED
- BAADAQECA1ABnQI0Av8CAAH0Af8DUAGdAwEBAgQAAwIBAwMEAQYkAAM9AWkDXQHXA1IBoWAAAwkBDAM3
- AVoDVAGrA1wB6gOoAf0B5QLhAf8DfwH+A1UBsQMNARIYAAMlATcDSAGEDAADQgF0AiUB8AH/AgABzQH/
- A0IBdAwAAkcBSAGDAyYBOBwAAwMBBANeAdkBuQK0Af8DXgHVAwEBAhgAAw0BEgMeASsDAwEEAxYBHgJY
- AVkB3QFUAVUBXAHqA0IBdAMRARcDHAEoAzcBWgNEAXsDKAE9DAADKQE+A1QBrgNcAeoCqAGnAf0B3QLX
- Af8B+QH3AfgB/wH+A/8B+gH+Bv8BrwKoAf8DWQHPAxkBIxAAAwwBEAJRAVIBpwM7AWQDJAE1AwABAQQA
- AzkBXwIDAccB/wIAAasB/wM5AV8HAAEBAyQBNQM7AWMCUQFSAacDDAEQGAADVQGyAaICmwH/Ab0CuAH/
- A0sBjgMAAQEYAANXAb0BSwFOAV0B8ANHAYIDIAEuAT8BUAFlAfQBAAGIAfQB/wEAAUkBpgH/A1kBzAFf
- AlcB6AGZAU0BTAH/AbQCXQH/AVkCTwHyAzgBXggAAXACbQH1Ad8C0wH/AfoB8QHyBf8B+AH2AfgB/wH3
- AfUB9gH/AfMB6AHgAf8B8QHLAaoB/wHxAdsBxQX/AccCwgH/A10B4gMtAUYMAAM+AWsDRAF6A0QBeQNC
- AXQDAAEBBAADMAFLAh4BigH7Ah4BfAH7AzABSwcAAQEDQgF1A0QBeQNEAXoDPgFrFAADLQFFAXQCcgH6
- AccCwQH/AWICYQHmAw0BEhwAAUIBUAFkAfQBAAGMAfwB/wEAAU0BrAH/A1gBxgFbAlgB6QGFAYEBlQH/
- AScBvQH9Af8BAAGfAeAB/wGdAZIBsQL/AbsBtwH/Af4BqwGqAf8BywFaAVwB/wFgAkEB+QMwAU0EAAHh
- AtMF/wH+Af0B+wL/AfsB8wH/Af4B9gHmAf8B+wHkAcAB/wH8AcwBkAL/AbQBUAH/AfcBogFCAf8B6gHF
- AasB/wH9A/8C1QHYAf8DUwHxAzoBYggAA1ABnQM1AVYDSgGMAzQBVAM/AW0EAAMVAR0CWQFhAeQCWQFh
- AeQDFQEdBAADPwFtAzUBVQNKAYwDNQFVAk8BUQGcDwABAQM7AWQDYQHuAbsCtAH/AboCtQH/AzoBYgQA
- AwMBBANMAY8DQwF3AxsBJgwAAzABTQJUAWEB7gEnAbUB9gH/AQABlQHiAf8BawGDAacC/wG7Aa8B/wHk
- AcoBxwH/AVwB1QHvAf8BiwGuAcoB/wH+AaoBpwH/AfACjgH/AewBhAGIAf8BzAFfAWIB/wNbAdkEAANW
- AasBngKaAfoB+wH6AeoD/wHeAv8B9wHLAv8B4QGnAv8ByQGEAv8BtAFTAf8B9wGcATgB/wHmAYMBKwH/
- Ad4BpQGHAf8B9gH3AfoB/wHlAeYB6QH/AV8CWAH5A0oBigMEAQYDSgGKAz4BagNCAXYDSwGOAzIBUAQA
- AyUBNwJXAWAB6wJXAWAB6wMlATcEAAMxAU8DTAGPA0IBdgM+AWoCSAFJAYgIAAMNAREDWwHDAZwClgH/
- Ab0CtwH/AcYCvwH/A1oBvQMEAQYDSgGLA1oBxQG3ArEB/wG/ArgB/wM/AW0MAAMUARwBYQJbAeEB9gHX
- AdMB/wFeAeEB+QH/AVgBxQHnAf8B9QHHAcUC/wHDAbsC/wGyAa4B/wH+Aa4BrQH/AfsBsQG0Af8B7wGr
- AaQB/wHfAZABigH/AegBgwGEAf8BjwFGAUcB/wgAAykBPwNcAc8BwQG1AaoB/gH/AewBywL/AdoBnQL/
- AcEBZgH/Af0BrQFKAf8B8gGZAT0B/wHkAYMBMAH/AdQBVwEZAf8B0AGAAVIB/wHrAd8B3gH/AukB6wH/
- AVkCUQH9A0sBkAJEAUUBfAM9AWcDPQFnA08BlwMSARkDCgENAlcBWQHCAgAB0wH/AgABoQH/AlcBWQHC
- AwoBDQMSARkDTgGWAz0BZwM+AWoDQgF0BAADBAEFA1QBrAGwAqcB/wHEArwB/wHAArgB/wG4ArIB/wNb
- AcMDXgHQAakCpAH/AcgCwgH/AckCwgH/A18B4wMUARwMAAMcASgBggFuAXAB/gH/AeQB3gH/Af4B1wHQ
- Af8B+AHGAcQC/wHBAcMC/wHHAcoC/wHSAdMC/wLeAv8B4wHiAv8B3AHXAf8B8QG2Aa4B/wHFAWsBZAH/
- A18B4BAAAz4BagNlAeUB4gHGAbIC/wG/AW8C/wGlAT0B/wHuAZEBNQH/AeABbwEvAf8B0wFYASAB/wHD
- ATYBBQH/AbwBPwEiAf8B4QG9AbkB/wHfAdQB1gH/A1sB0ANEAXsDPQFnAz0BZwNPAZcDEgEYAw4BEwJZ
- AWEB5AEVAScC/wIAAfQB/wJZAWEB5AMOARMDEQEXA04BlgM9AWcCPQE+AWoDQgF0BAADMwFSAaYCnQH/
- AcMCtwH/AckCxgH/A9MB/wHXAtUB/wGhApYB/wG8ArUB/wHJAcIBwQH/AYoChwH5A00BkQMSARgQAAME
- AQYBSgJJAYkBkgGFAYYB+wH2AtUC/wHuAe0C/wH9AfwG/wH8AfkC/wHwAe0C/wHgAdsB/wHzAcgBwgH/
- AdMBoQGcAf8BhQFXAVQB/wM4AVwUAAMEAQYDTAGTAXcBcAFvAfQB7QGvAYoB/wHwAY0BPQH/Ad4BZgEp
- Af8B0AFbATAB/wHEAVgBOwH/AbcBUQE/Af8BvAGFAXAB/wG4AagBqgH/A1UBtANKAYoDPQFpA0IBdgNM
- AY8DLAFDBAADOwFlAkwBdwHzAkQBcwHzAzsBZQQAAysBQgNMAY8DQgF2Aj0BPgFqAkkBSgGJBAADVgGz
- Ab0CsgH/AbsCsgH/AcgCxgH/AeIC4wH/AeAC3QH/AagCngH/AZMCjwH7A1QBpgMaASUfAAEBAzEBTgNW
- AbMBaAFmAWQB7AHJAbcBsQH/AdEBvAG3Af8BzQG1Aa8B/wGVAY0BiwH7A10B0gNnAfIB1gHKAckB/wG1
- AbEBsgH/AzkBXxwAAxoBJQNbAcYBxQGfAZQB/wHLAZwBjQH/AbwBnwGdAf8BtgGkAaUB/wG2AakBqwH/
- AbYBpgGnAf8BXwJSAfQDJQE3Ak8BUQGcAzUBVQNKAYsDMgFQA1IBowMRARcEAAMWAR4DFgEeBAADEQEX
- A1IBpAMyAVEDSgGLAzUBVgNQAZ0EAANcAd8BuQGuAawB/wGIAWsBbAH/AaUCmwH/AewC6wH/AbgCrgH/
- AakBngGaAf8BQgFZAW0B9QNCAXQDMwFTAjwBPQFoAyMBNAMzAVMYAAMBAQIDFgEfAyIBMgMoATwDJgE5
- AyYBOQMjATMDYAHeBP8BygLDAf8DNgFZIAADWQHHAbkBrQGwAf8BvQGyAbYB/wG6Aa4BsAH/AbsCrAH/
- AcgCtgH/A38B/gNCAXYEAAM+AWsDRAF5A0MBeANCAXMDOQFfA1IBowMuAUcDEQEXAxEBFwMuAUcDUQGi
- AzoBYANCAXMDRAF5A0QBegM+AWsEAAMWAR8DXAHPAYsBawFpAf8BswKmAf8BuwKzAf8BvgG1AbQB/wHE
- Aa4BqwH/ARIBqwHJAf8BAAHLAfwB/wEAAawB7AH/AQABswHwAf8BAAGUAd0B/wEAAZ4B5wH/A04BmQwA
- AwIBAwMVAR0DFgEfAxYBHgMbASYDIwE0AzUBVwNPAZcDXQHXAc4CzAH+AeoC5QH/A1sBxgMOARMcAANU
- AasBwgKzAf8B0ALDAf8ByQK8Af8ByAK8Af8B0QLEAf8BugKtAf8DVwG9CAADDAEQAlIBVAGmAzQBVAJH
- AUgBgwNEAXoDNAFUA0wBjwNPAZcDTwGXA0wBjwM0AVQDRAF6AkcBSAGDAjQBNQFVAlEBUgGnAwwBEAgA
- A1ABnQGjAZ0BmQH/AaQBkgGQAf8BpgGTAZIB/wG0AasBqQH/ATgBsAG9Af8BEAHTAe8B/wETAdYB8wH/
- ARIB1QH0Af8BEwHRAfMB/wEUAdUB9gH/AQ4BsgHkAf8CUwFUAawMAAMKAQ0DVwG4AWMBXgFfAeoBaQJh
- Ae4BsgGkAaIB/QHSAbgBtgH/AeABywHKAf8B7QHZAdoB/wHiAtYB/wFjAmIB6QNOAZYDFgEeHAADQgF2
- AaACkwH+Ad8C1gH/AdQCywH/AdQCywH/AdoC0QH/AdoCzwH/AWICWQHsAxIBGQwAAyMBMwNSAakCNAE1
- AVUDQwF3A0oBiwNCAXYDPQFnAz0BaANCAXYDSgGLA0MBdwM1AVYDUgGpAyIBMgwAA1ABmgFrAaMBtgH/
- AZsBrQGwAf8BkgHCAcMB/wGBAeIB4wH/ASsBfAGxAfwDQAFxAzsBZAM6AWIDOgFhAzoBYQMyAVAUAAND
- AXgBawJiAe8BdwFpAWsB8QNkAecDYQHaA1sBxANOAZUDOgFgAx0BKgMBAQIcAAMpAT4BhwKEAfkB8ALs
- Af8B4wLfAf8B5QLhAf8B6QLmAf8B8gLtAf8BhQJzAfsDNgFZFAADIwE0AlEBUgGnA0QBewM1AVYDPQFp
- AjwBPQFnAjwBPQFnAj0BPgFqAzUBVwNEAXsCUQFSAacDIwE0EAADHAEnAkcBSAGDAVoCXQHKAVgBYwFr
- Ae8BWgJdAcoDSAGGbAADIQEwA2QB7AT/A/gB/wH0AvMB/wHsAuoB/wHpAuYB/wG/ArcB/wNPAZwcAAMP
- ARQDPgFrA1ABnQNKAYoDRAF7A0QBewJJAUoBiQJPAVEBnAI9AT4BagMPARSYAANAAXEBkAKNAfkBdwJ1
- AfIBZAJiAeYDYAHWA1gBwQNUAa4DRgF/AwMBBDAAAxEBFwNIAYgDVwG/A1YBwQNMAZMDGwEm2AADBgEI
- AzEBTwNCAXYDSAGHAlcBXAHfAgABsgH/AgQBywH/AgUBygH/AhIBmAH/A1wB3AMoATxYAAMHAQoDRAF6
- A1IBqQNFAX0DJgE4AwoBDhQAAz8BbgNWAcEDVwG/A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNW
- Ab4DVgG+A1YBvgNYAcADVgG+AzkBXwwAAz4BawFcAlcB3wGHAU4BQwH6Aa4BfQE9Af4BVAE0AW8B/gEA
- AQQB1AH/ASQBJQHvAf8BKAEpAfcB/wFCAUEC/wFTAUwC/wEvAS4BwAH/A1wBzgMKAQ4BXQJZAdcBfwFk
- AVIB9wFrAWIBWwH2AWsBYgFeAfYBbgFiAVsB9gFuAWIBWQH2AW4BYgFaAfYBcQFiAVgB9gFxAWIBSQH2
- AXMBYgFJAfYBcwFiAUkB9gFzAWIBSQH2AXMBYgFJAfYBcwFiAUkB9gGDAWUBUQH3AV4CWwHZFAABVQJT
- AbAB5QGmAUYB/wHuAcgBlwH/AZ0BfwFbAf4BbQFSAUIB9wNXAd8DVAGrAz4BawMjATMDBAEGBAABcQJi
- AfYB2QLTAf8ByQK4Af8BuAKfAf8BvAKiAf8BxAKpAf8BvgKkAf8BvAKqAf8ByQLBAf8B0gLMAf8BxwK9
- Af8BxQKwAf8B3gLAAf8B5ALFAf8BwgKTAf8DVwHFBAADAwEEA1MBqgG0AZwBVQH9Af8B1gGqAv8B2QGc
- Af8B2wGzAZoB/wEaARQBvgH/ARcBGQHpAf8CKQH3Af8CRgL/AUkBTQHzAf8BLwFAAeAB/wE1AS0B7AH/
- A14B5QMPARQBaQJZAfIB3wHbAd8B/wHnAeAB4gH/AeEBtwGqAf8B5gG0AZIB/wHqAbkBkAH/Ad0BsQGd
- Af8B2QHIAcYB/wHaAdUB2gH/AdoB0gHVAf8B2wHUAdcB/wHbAdQB2AH/AdwB1QHYAf8B4QHcAd8B/wHc
- AdsB4QH/AW8BZAFTAfEEAAMWAR8DWgHKA1kBxANKAYoBvgGoAVsB/QG4Ab8BaAH/Ab4BxAGdAv8B7wHQ
- Av8B7AHJAf8B9gHXAa0B/wHcAbQBhgH/AagBgAFGAf0BYgFJAT0B9gJfAV4B4ANOAZgBsAKoAf0B+gP/
- AeIC2gH/Ac0CugH/AdQCvgH/AdACvAH/AdICygH/AfgC9w3/AfEC7QH/AeAC1AH/AfkC2gH/AeMCsQH/
- A1gBywQAA1ABnQHnAa0BbAL/Ae4BxAL/Ad8BtQL/AegBrAH/AasBlwGgAf8CAAHFAf8BDQEPAfMB/wJA
- Av8BVwFIAfsB/wE7AUcB7AH/ARgBuQHpAf8BFAFOAcAB/wNWAb4EAAFjAWEBXAHuAe0B7AHvAf8B/gHD
- AZ8B/wH+AakBRQH/AdgBlwFkAf8BvQGCAWcC/wGtAVAB/wHpAZwBVQH/AbwBoAGdAf8BwwGzAbQB/wHI
- ArcB/wHMArwB/wHQAsEB/wHdAdAB0QH/AewB6gHtAf8BZwFhAVUB7gQAA0gBhAFhAe8BkQH/AUwBvwFg
- Af8BOAFuARkB/wFdAb0BTgH/AS4BxgE9Af8BNAGXASQB/wHpAccBowL/AeUBxAL/AeoBzAL/AfIB2QL/
- AfUB3QL/AewB0AH/AfoB1QGpAf8BXQJVAeoBkQJ+AfwB7wLyAf8B2ALPAf8BxQKxAf8ByAKyAf8BwAKz
- Af8B5QLfAf8B+gL3Af8B9gL1Af8B7wHwAfEB/wHyAvAB/wH3AvIB/wHeAtkB/wHYAsEB/wHaAqoB/wNb
- AcgDLwFKAZgBbQFNAfoB/wHHAZEC/wHTAZ8C/wHHAY4C/wHSAYcB/wG9AZcBggH/AgABxgH/AR4BHAL/
- AV0BYwH6Af8BNgFiAd0B/wE7ATYB3gH/ASoBgwH8Af8BAAGyAe8B/wFSAVkBXQHtAzYBWQFjAmEC7gHf
- AeAC/wG2AW4C/wHaAYwB/wGbAYwBxAH/AT0BOAHQAf8B9wHOAY8B/wH8AbEBWAH/AeUBvgGuAf8C6wHv
- Af8B7ALlAf8B7ALmAf8B7QLnAf8B8gLtAf8B7gHtAe4B/wFnAWEBWAHuBAADOgFhAY4B0QGfAf4B7gH/
- AfIB/wGlAfgBuQH/AaAB8QGxAf8BqAH/AcAB/wFhAb8BXwH/AfIB2QG5Av8B5wHKAv8B6AHMAf8B/QHo
- Ac8B/wH9AekB0wL/AfgB6gH/AfUB3QHCAf8DUwGtAZECfgH8AfAC8wH/AdkC0AH/AcgCswH/AcACrQH/
- AcwCwQH/Ae4C5QH/AegC5gH/AdQC0gH/AcsCxwH/AcoByQHIAf8B5ALgAf8B7gLmAf8B1gLJAf8B0QKj
- Af8DWwHIAVoCWAHAAc4BbgEvAf8B0QGMAUIB/wH8AcMBcAL/Ab0BZQL/AbwBWwH/Ae0BsAFQAf8BMAEd
- AaUB/wI3Av8BZAFrAf4B/wEcAcEB9wH/AQ8BigHjAf8BUAEgAZAB/wFPAYQBpwH/AQABiAHoAf8DUAGd
- AWMCYQHuAfIB6QHoAf8B/AHLAagC/wHxAcgB/wGxAa8B4wH/AWgBZgHjAf8B+wHwAc4B/wH1AcIBmAH/
- AcYBoAGUAf8BwwG3AbkB/wHKArgB/wHOAr4B/wHQAsAB/wHbAtAB/wHwAe8B8gH/AWkBYQFdAe4EAANQ
- AZ4BjAHoAaUB/wHhAf8B4wH/AboB/wHBAf8BbgH/AYIB/wFtAfIBkQH/AVQBowFKAf8B7QHXAcEC/wHv
- AdcB/wH7AeoB1QH/AfsB7AHbAf8B+gHuAeAC/wH+AfEB/wGRAXYBXwH7AyoBQQGRAn0B/AHwAvMB/wHZ
- AtAB/wHHArIB/wG9AqwB/wHTAscB/wHqAuIB/wHjAeEB4AH/AZEBjQGMAf8BKQEnASYB/wGgAZ0BmwH/
- AdkB1wHWAf8B7ALlAf8B2gLQAf8ByQKfAf8DWwHIAWoBXwFYAe0BqgFTARgB/wGXAToBAAH/AcMBagEn
- Af8B+QGxAU4C/wGxAU8C/wG8AUwB/wG1AWwBRwH/AUEBNwGvAf8BVwFVAe4B/wFEAWQB3QH/AQMBtQHv
- Af8BPgGVAbMB/wG4AWMBTQH/AlsBXgHZAyEBMAFjAmEB7gH2AfUB9gH/Af0B4gHUAv8B5AHJAf8BowGe
- AcMB/wFZAVYBqAH/Af0B3gHDAf8B9wHVAcQB/wHeAdMB0QH/Ad4C1gH/AeIC2AH/AeQC2gH/AeQC3AH/
- AesB5QHmAf8B9AH1AfgB/wFpAmEB7gM7AWQBXwG3AX8B/gHaAf4B5QH/AdgB/wHcAf8BrAH/AbgB/wGJ
- Af0BkwH/AZwB+gGtAf8BOAHAAVEB/wFcAYwBQAH/AfgB5wHaAf8B/QHyAeQB/wH5Ae8B4wH/AfwB+AHw
- Af8B/AHtAdwB/wFdAlkB0gMBAQIBjwJ9AfwB8ALzAf8B2QLQAf8BxwKyAf8BvgKuAf8B1QLIAf8B6ALh
- Af8B6AHlAeQB/wFXAVIBUQH/AwAB/wGBAmwB/wHgAt0B/wHqAuIB/wHbAtIB/wHGAp8B/wNbAcgBkAFn
- AT4B+AGNAT4BBwH/AWsBJwEAAf8BmwFFAQkB/wHxAa0BUwL/AcQBbgL/Ac4BhwH/AdQBkAE0Af8BYwEo
- AQgB/wFNASYBNQH/AZIBQQErAf8BogGaAYkB/wErAawB+QH/AZ4BgwGAAf8DUAGdBAABYwJhAe4B+QH4
- AfkD/wH7Af8BxAHJAcoB/wFIAYoBsgH/ASsBYwGfAf8BggGZAacB/wHsAd0B2AH/Ad8C1QH/AdwC0gH/
- Ad8C1gH/AeEC1wH/AeIC2QH/AeoC4wH/AfgB+QH7Af8BaQJhAe4BMAIxAU0BagGdAYIB+QHQAfgB0wH/
- AcgB/QHVAf8B4wH/Ae8B/wG/Af4BzwH/AYsB7wGSAf8BXAHjAYcB/wFDAZ8BOwH/AfIB3wHaAf8B/QH4
- Ae8B/wH3AfEB7QX/AboBmQGDAf4DQgF0BAABjwJ9AfwB8AL0Af8B2QLQAf8ByAKzAf8BvAKsAf8B0ALF
- Af8B7ALkAf8B4wLgAf8BrgGlAaQB/wFjAlkB/wG1Aa0BrAH/AeAC3QH/Ae8C5QH/AdkCzQH/AcsCoQH/
- A1sByAGQAWoBQQH5AYkBPwEJAf8BkwFGAQoB/wHbAZ4BTAH/Af0BywGKAf8B4QGsAWQB/wGvAWoBNgH/
- AY8BRgERAf8BaAEnAQAB/wFnASQBAAH/AYYBMwEAAf8BsgFWAQ8B/wGcAV4BRwH/AawBZAE+Af8DUQGi
- BAABZQJhAe4B/gL7Af8B8wH6Af0B/wGbAdgB+QH/AYIBvQHiAf8BaAGyAdcB/wFUAbYB4gH/AbQBygHX
- Af8BygG1AbIB/wHFArUB/wHKArsB/wHOAr8B/wHRAsEB/wHbAtAB/wL6AfsB/wFpAmEB7gMEAQYCZAFc
- AecB1AHxAdAB/wGjAe0BtgH/AcwB/wHbAf8BkgHvAaMB/wGQAdQBjwH/AbYB1QGpAf8B3wHjAdAB/wH9
- AfYB8wH/AfYB9AHyAf8B9wH4AfkD/wH8Af8BYQFfAVQB7gMNARIEAAGOAn0B/AHwAvQB/wHZAtAB/wHH
- ArIB/wHEArAB/wHHArwB/wHxAegB6QH/AfgB+QH7Af8B5wLlAf8B5ALeAf8B4QHeAd0B/wHyAewB7QH/
- AeoB5AHlAf8B1gHFAcYB/wHWAqYB/wNbAcgBawFgAVkB6wHHAYkBNwH/AfMBtQFeAv8B1AGbAf8B/gHd
- AbYB/wG+AZsBbAH/AZMBYAFBAf8BngFtAU0B/wGdAWoBSAH/AZABWAEwAf8BgAE+AQ4B/wFZASEBAAH/
- AXABMAEAAf8BiQFjATQB/gNCAXQEAAFlAmEB7gL/Af4B/wHrAfUB/AH/Aa4B3AH3Af8B2AH3Av8BwAHw
- Av8BbwHKAfMB/wG+AdgB5wH/AfUB8AHtAf8B8QLtAf8B8wLuAf8B8wLvAf8B8wLwAf8B9wL0Af8B/gP/
- AWkCYQHuA1EBogH7AdoBvAX/AcgB6QHMAf8BjQHlAZoB/wGQAdkBlQH/AfQB6wHnAv8B+AH9Av8B+gH7
- Af8B9QH3AfUB/wL3AfgB/wH9Af4C/wHtAdUByAH/A1EBpwgAAY4CfQH8AfAC8wH/AdgCzwH/AcQCsQH/
- AcoCtAH/AcQCswH/AdAByAHHAf8B0AHHAcMB/wPsAf8B3gLgAf8B/AL6Af8B9AHuAe0B/wHUAs0B/wHd
- AsEB/wHaAqgB/wNZAckCVgFVAbQBzgGJATQB/wHsAcEBkAL/AfAB2wL/AfUB6QH/AfIB6QHfAf8B3QHK
- AbYB/wHZAcQBrgH/AeABzAG4Af8B2gHGAbAB/wHJAa4BlAH/AaEBZwFAAf8BsQFbARwB/wFhAlQB7gMY
- ASEEAAFlAmEB7gT/AfwB/QL/Ac8B5wH3Af8B1QHsAfoB/wG0AeEB/QH/AZ4B1QH6Af8C3gHiAf8BuQGh
- AZ8B/wG4AqQB/wG+AqsB/wHDArAB/wHEArQB/wHSAcQBxQH/Af0B/gL/AWoCYQHuAX4BbwFVAfMB/wH8
- AfcF/wHvAdkBvwH/Ab0BxgGLAf8B5wH0AecC/wL7Af8B+AH6AfwB/wH6Af0C/wH8A/8B/Qf/AY8BZwFf
- AfsDJgE4CAABrAKoAf0B9wL8Af8B3gLXAf8ByQK2Af8B0AK6Af8B2QHHAcsB/wGmAY0BgQH/AZgBSwEa
- Af8BmgGWAZMB/wFkAWkBbAH/AeoC7AH/AecB3QHUAf8B5AHLAbEB/wHqAccBqwH/AdMBpgGlAf8DXAHO
- AykBPgGBAWIBSAH2Ae4B0QGwAf8B+AHuAeIB/wH9AfMB6QP/AfwB/wH5AfAB5wH/Ae8B1gG+Af8B8AHW
- Ab4B/wHvAdYBvgH/AfEB3QHJAf8B+gHYAbIB/wHVAYYBOgH/A04BlAgAAW8CZwHyCP8B+wP/Ad8B8gL/
- AdMB7QL/Ae8B+wP/Av4B/wHtAukB/wHuAusB/wHwAu0B/wHxAe4B7wH/AfIB7wHwAf8B9QH0AfUF/wFy
- AWkBZAHxAkABPwFuAl0BWgHTAaEBjQGDAfkB7wHUAbYB/wHzAcwBrAH/AfMB1AG4Af8B7QHLAawB/wHs
- AcsBrwH/AfQB3gHKAf8B9QHiAdUB/wH3Ae0B5gH/AfcB5QHZAf8DWwHQAwEBAggAAYQCfQH3AeUC3wH/
- AdQCxwH/AcYCtAH/AcwCuAH/AdgBwgHEAf8BvQGmAaIB/wGfAYEBYwH/Aa0BoQGgAf8BqwGjAaQB/wHL
- Ab8BwAH/AdMBwgHBAf8B4gHPAcYB/wHhAcgBugH/AckBpQGkAf8DUQGnBAADRAF6AbwBpQFTAf0B/AHs
- AdcB/wH6AfIB5wH/AfsB8wHrAf8B/AH0AesB/wH3AeUB1AH/AfcB5AHSAf8B+QHuAeAC/wHzAdsB/wHy
- AbEBbQH/AVsCWQHEAwQBBggAAWACXAHUAYICbQH3AXECYgH2AXMCYgH2AXMCYgH2AXUCYgH2AXUCYgH2
- AXUCYgH2AXUCYgH2AXcCYgH2AXcCYgH2AXcCYgH2AXcCYgH2AXcCYgH2AYcCbQH3AV4CWgHYCAADJQE3
- Ak8BTgGXAWICXwHgAbsBqgGaAf0B8wHcAcMB/wH8AesBygH/AaIBfwFmAf4DVQGyAlMBUgGoAVsCWQHE
- Ay0BRQwAAT0CPAFnAVICUQGhA10B1wF3AmgB+gFkAlkB7AFWAlQBqwNQAZ0BUgFRAVIBoQNSAaEDUgGh
- AVICUQGhA1IBoQNSAaEDUgGkA0wBkwMYASEIAAJHAUYBgAGFAWsBYgH2AfcB4gHMAv8B/QH3B/8B/QP/
- AfoC/wHuAdcB/wGuAXoBZgH8A1YBtgMMARBcAAMHAQoDMAFLAlYBVQG0AXsCZQH0A1UBtWgAAygBPAJW
- AVUBtAFlAWIBXQHpAZoBiAFxAfkBowGHAXQB+gFuAWUBXQHwAVwCWQHJAzoBYf8AGQADHwEsA0sBjwNV
- AbQDVwG/A1gBwANXAb0DVAGuA0EBcwMNARJgAAMMARADTgGUA1UBtQNVAbQDVQG0A1UBtQNWAbYDVgG2
- A1UBugNWAb4DQQFzGAADBQEHAwEBAiwAAzIBUAFPAVgBTwHvASMBmAE3Af8BKgGwAUgB/wEuAbgBTwH/
- AS8BuAFPAf8BKwGzAUoB/wElAZ0BPAH/ATMBSwE0Af0DVwHFAw8BFCwAAw8BFANOAZcDRgGAAwMBBCAA
- A0gBhwGeATkBPAH/AbEBRgFJAf8BtQFJAUwB/wG+AVEBUwH/AccBWAFaAf8BzwFgAWEB/wHUAWQBZQH/
- AdkBaQFqAf8B1QFvAXAB/wNeAeUDBgEIEAACUwFVAa0BFgFvAdIB/wFCAWIBgAH1A1kBxwJNAU4BlgM7
- AWUDSgGNAYwBbQFRAfcCXQFZAdcBVgJVAbQBTQJMAZEBQAI/AW4DJQE3BAADXwHgATkB1QFkAf8BRgHl
- AYgB/wFRAeEBjQH/AVcB4gGSAf8BWAHhAZIB/wFUAeMBjwH/AUsB5QGLAf8BQQHgAW4B/wEpAWcBLQH+
- A0ABcSgAAyUBNwNbAeEBIAGSARkB/wEwAUABEAH9A1YBswMQARYcAAFbAlgBywHwAZsBlAL/AbsBpAH/
- Af4BvQGpAv8BvAGoAv8BvgGrAv8BvAGoAv8BvAGpAv8BvwGqAv8BwwG4Af8BXwJYAeMDBAEGEAABTQFd
- AWwB8AE4AcEB/gH/AVsByQH+Af8BVAHIAf4B/wE/AbcB8AH/AVoBXAFmAf8B8wG4AYYC/wG/AW4C/wG5
- AWEC/wGyAVIC/wGxAVAB/wHsAaQBXgH/A0QBeQQAATQBewE6AfwBYAHoAZwB/wFwAd4BnwH/AYkB4QGn
- Af8BkAHjAawB/wGRAeMBrQH/AY0B4gGqAf8BhAHfAaIB/wFqAewBogH/AT8BrwFUAf8DUQGgJAADQgF2
- ATcBYgE/AfYBIwHQAVoB/wEoAckBNgH/AScBngEAAf8BGwFRAQAB/wNaAdsDLQFGFAADAQECAWICWAHp
- AfwBxgGsAv8B9QHZAf8B+AHuAdkB/wH6AfQB4gH/AfsB9AHkAv8B/AHxAv8B/gH5Av8B/AH4Af8B7QHh
- Ad0B/wNWAb4QAAMJAQwBAAFcAdQB/wFLAcUB/gH/AZIB2AL/AZYB3AL/AYMBqgG/Af8B2AGfAW4C/wHO
- AZoC/wHLAZMC/wHFAYgC/wG+AWsB/wH4AbIBYAH/AWkBbAGHAf8CUAFRAZ8EAAFYAY8BXwH7AZQB6gG0
- Af8BpwHoAbwB/wGyAewBxwH/Ab4B8wHMAf8BwAH0Ac4B/wG3AewByQH/Aa0B6gHAAf8BnwHwAbsB/wFX
- AbYBaQH/A0wBkyAAAycBOgEpAXkBQgH6ASYB1wFeAf8BJQHWAWMB/wEiAbQBKgH/ASQBmAEAAf8BJwGk
- AQAB/wEiAWcBAAH/A1oByhQAAyMBMwGNAU8BTQH7Af8B0wG3Av8B9wHfAf8BnQGPAYIB/wFCAT4BOgH/
- AY4BiAGMAf8BwgGwAasB/wHqAeAB0QP/Af4B/wHNAcEBwAH/A0YBgRAAAxwBKAEAAWYB4gH/AWkB0AH+
- Af8BvgHoAv8BuAHlAf0B/wGfAYwBhAH/Af0B2QG0Av8B1gGrAv8B0wGkAv8BzgGbAv8ByAGOAf8ByQGP
- AWIB/wE6Aa8B+QH/A1IBqQQAAVUBYQFVAeoBsgHxAckB/wHQAfQB3QH/AeYB+wHsAf8B5QHxAesB/wHi
- Ae8B6QH/Ae0B/AHwAf8B3AH2AeYB/wHAAfkB0wH/AU8BnQFTAf0DNgFZHAADDAEQA1gBwAEfAbsBRAH/
- ASQB0wFcAf8BIQHNAVsB/wEoAcABOwH/ASUBlwEAAf8BJQGbAQAB/wEmAZgBAAH/AToCPgH4A0gBhgMD
- AQQMAANEAXoBvQFWAUwC/wHeAb4C/wHxAdkB/wHCAbQBowH/AUMBSQFEAf8BgQGnAcAB/wEMAUgBpwH/
- AksBawH/Ae8B2wHJAf8BfgF2AXQB+gMtAUUQAAIrASwBQwEEAYIB8AH/AY8B2QH+Af8BwgHqAv8BwQHl
- AfgB/wHRAacBjAL/Ad4BuQL/AdwBtgL/AdkBsAL/AdUBqAH/AfMBpAFhAf8BpgGqAa4B/wE8AbYB/gH/
- A0oBjQQAA04BmQG3AeABwAH/AfQB/wH0Af8B7AH9AdYB/wFtAYcB2wH/AVkBXgHbAf8B0AH7AcUB/wHp
- Af8B7AH/Ac0B8gHUAf8DWwHZAwcBChgAAyYBOAJXAVwB3wEAAQsBqAH/ARQBrwFCAf8BIwHVAVUB/wFB
- AeYBgwH/AUAB6wGHAf8BKAHBAT0B/wElAZ0BAAH/ASMBjQEAAf8BAAFcAacB/wEPAT0BrAH9A1UBugMV
- AR0IAANVAbIB0gFoAVQC/wHlAcMB/wHwAdoBwgH/AekB2QHCAf8BsAKnAf8BjAG/AegB/wEIAa8C/wEA
- AWQB0gH/AV4BYgGiAf8BYgJYAe8DEgEZEAADOAFeARQBkQH8Af8BngHeAv8ByAHrAv8BxQHgAe4B/wHm
- AbsBmwL/AeUByAL/AdYBsAL/AZEBPgL/AaYBWwH/AdUBXwEtAf8BmwHbAfoB/wE3AbUB/gH/A0EBcgQA
- Aw8BFAFaAV4BWgHVAaIB0gGgAf8BbQHDAbYB/wEXAV4BuQH/AQoBTAG5Af8BLgGwAZUB/wFtAdMBjQH/
- AV0BYwFdAfADKQE+GAADQQFzAjMBYgH2AgAB9wH/AQABDgHLAf8BPwHEAVAB/wGLAfsBqAH/AWEB/gGf
- Af8BPgHqAYMB/wEpAdYBZQH/ASUByAFFAf8BIwGgAQUB/wEAAWoBnAH/AQABZAL/AQABNAHOAf8DVwHf
- AzABSwMBAQIBYQJcAdwB4wGRAWYC/wHtAcoB/wHnAc8BtgH/AeUB0AG6Af8B2gHEAbYB/wFFAW4BpwH/
- AV0B2QH3Af8BHAHOAv8BAAGaAewB/wEcAUABUwH9A1EBpwMGAQgMAANEAXkBJQGYAv8BrAHjAv8BzwHu
- Av8ByQLNAf8B8wHaAcUC/wHxAeIC/wHrAdYC/wGuAWYB/wHYAYYBUgH/AScBFwFuAf8BYwGqAeEB/wEz
- Aa0B+gH/AzgBXAgAAxkBIwFIAmIB9gFqAbQB3QH/Ab0B1AHfAf8BwgHXAd8B/wFWAZ4BywH/AQ4BZwFs
- Af8DTQGWHAACMQGIAfgCAAL/AgAC/wIAAdkB/wFHAYsBagH/AaYB+QGgAf8BYQH/AaAB/wE6AeYBggH/
- ASsB1QFeAf8BJQHNAUcB/wEQAaIBQAH/AQABagHEAf8BAAFcAv8BAAFmAv8BAAFDAeQB/wNYAcADHwEs
- AWgCQgH1AfMBrQGLAf8B+wHlAcUB/wHRAbkBpAH/AcYBsgGgAf8B7QHYAcEB/wHMAb4BuQH/AUcBiwGz
- Af8BXQHdAfMB/wE3AfAC/wEAAcUB+wH/AQYBUQF/Af4DWAHGAxUBHQgAA04BlAE3AZ8C/wG7AegC/wHW
- AfAC/wHOAcIBtgH/AfsB8AHmAv8B9gHtAf8B/QHxAeMB/wHuAc0BrwH/AVQBRQGTAf8BAAECAbsB/wEA
- AQUBrQH/AQABEQG1Af8CVwFaAcUIAAM6AWEBTwGoAbkB/QG0Ac8B5QH/AeYB6gHxAf8B7AHuAfYB/wG8
- AckB3QH/AToBlgHMAf8DWQHSAx8BLAMSARkDBAEGAwQBBgwAAg8BuAH9AgAC/wIAAv8BEgEQAf4B/wIA
- AccB/wERAUwBZAH/AUwB5wFeAf8BRAH6AYEB/wEmAccBPgH/AQMBlAFQAf8BAAGbAdQB/wEAAZ4C/wEA
- AVwC/wEAAV4C/wEAAVoB+AH/A1kBxwM6AWIBfwE3AS8C/gHBAZkB/wHeAcgBrgH/AcUBrgGaAf8B0AG/
- AagB/wHTAcIBrQH/Ad8BzQGzAf8BuAGgAZsB/wE0AVkBmwH/AVUBzgHrAf8BSQH9Av8BAAHdAv8BAAFc
- AawB/wNeAdoDJQE3BAACUwFVAbABTQGrAv8BywHtAv8B4AH0Av8B1QHAAa0B/wH+AfsB+AL/AfsB9wH/
- AfMB8AHsAf8B0wHOAcwB/wFKAVIBtwH/AVYBbgHxAf8BLgFFAdsB/wEtAUIB2gH/AlgBXAHRCAABUAJS
- AaMBngHZAfQB/wGyAeAB+gH/AaoB2gH2Af8BnQHUAfUB/wGVAdEB9QH/AWoBzQH3Af8CUwFhAfEBXAJX
- Ad8BYgJYAekBXgJbAdkBXgJaAdgDUwGwAygBPAQAAh4BnQH7AgAC/wI/Av8CgQH+Af8BTQFKAf0B/wED
- AQAB3gH/AQABJQGIAf8BIwGkATgB/wEGAZwBhwH/AQABowHsAf8BAAHMAv8BAAHHAv8BAAGcAv8BAAFl
- Av8BAAFSAfQB/wNYAcYDTgGZAboBPQEqAf8B8wHAAZgB/wHWAcIBpAH/AdABuAGeAf8BxgGVAY0B/wHL
- AYcBjQH/AccBgwGNAf8B1QGQAZQB/wHUAYIBkwH/AVcBTAGbAf8BSQGzAd4B/wFSAfYC/wEJAd8C/wE0
- AWQBpwH/A1wB3AQAAlgBWwHLAWQBuQL/AdwB8wL/AeoB9wL/Ad0BxgGyAf8B8wHfAdAB/wH1AeUB2AH/
- AfYB6QHeAf8B+AHtAeQB/wG+AbYBzAH/ATIBPQG4Af8BlwGfAdMB/wFJAZABvQH9Ax8BLAgAAU0CTgGW
- AbIB3gHyAf8B2wH3Av8B0QHvAv8BuAHmAv8BoAHfAv8BhgHXAv8DWQHsAZUBaQFcAfgB/wHpAcAC/wHd
- AbwC/wHcAbgB/wHcAaUBcAH/AWACWQHrAzABSwIvAbgB/QJqAv8CkgL/AmsC/wJhAv8BWQFXAv8BHgER
- AeEB/wIhAV8B+wEAAawB4wH/AQAB9QL/AQAB3gL/AQABwgL/AQABsAL/AQABpgL/AQABbAH7Af8DWQHE
- A1oCygFSATgB/wHgAb4BmAH/AdMBtQGXAf8B0wGWAY0B/wHxAaIBpQH/Af4BswG0Af8B/gG0AbYB/wH+
- AbcBuQL/AcQBwgH/AfkBuAG6Af8BgwGAAbgB/wFEAa4B5QH/Aa0B8gHzAf8BawGwAewB/wFTAVUBXQHt
- BAACWQFdAdIBiwHIAv8B8QH6Av8B9wH8Av8B9gH5AfsB/wHwAeUB3AH/Ae4B4AHVAf8B7QHcAc8B/wHs
- AdgByQH/AeoB1AHCAf8B9AHwAe0B/wH3AfsC/wFYAWIBaAHpDAADKAE8AXMBiQGaAfoE/wH1A/8BzwHy
- Av8BtAHyAv8BYgGHAa4B/gFnAlkB8gH5AcwBlwL/Ad4BsgL/AeABuQL/AeEBuQL/AewBvgH/AewBpQFk
- Af8DVwG9AlgBWwHLAm8B5QH/ApEC/wJqAv8CYAL/AlwC/wFIAUQBhAH6A1ABnQFXAVwBXgHfAQAB6QH+
- Af8BAAHkAv8BAAHAAv8BAAGxAv8BAAGuAv8BNwFtAY4B9wM6AmICTgHvAb4BYwFEAf8BzAGiAYQB/wHU
- AY4BhwH/AfcBqwGpAv8BtwGyAv8BtgGzAv8BvgG8Av8BxgHFAv8B2QHXAv8B/AH6Af8B5gGxAb0B/wNe
- AeUBRwFgAa4B/QEYAVYBygH/A0sBjwQAAxwBJwJTAVUBrQNcAdEDXQHXA14B3QJfAWAB4wJiAWUB6QFi
- AWMBbgHvAWYBbQGGAfUBYgGMAa8B+wGHAaYB8AH/AYgBqwH1Af8CVAFWAasQAAFGAkcBgAF6AYwBmgH6
- AdYB5QHuAf8BvAHiAfEB/wFmAYABqgH8AlABUgGjAV8CWgHbAf8B2gGUAv8BzQGZAv8BzgGdAv8BzAGb
- Av8B1wGcAf8B/gG1AWMB/wNXAb8EAAJPAVEBnAI6AawB/AKDAv8CVQH1Af8CTwFiAe8DMwFSBAADEAEW
- AVgCWgHAAQABtQH2Af8BAAHPAv8BAAGkAv8BXgFfAWEB4AMnAToEAAFyAisB/AG2AWABSwH/AegBqwGg
- Av8BxgHAAv8BzwHHAv8B1AHNAv8B3gHXAv8B5gHhAv8B7wHpAv8C+gH/AbMBfwGRAf4DVAGvAwQBBgNA
- AXACSwFMAY8DAQECLwABAQMFAQcYAAMvAUoBUQJSAaEDUgGpAzkBXwQAA0UBfQHOAYUBcgH+Af8B9AHU
- Av8B9AHfAv8B9QHdAv8B2wGqAf8BhwFSAUQB9wMxAU8IAAM7AWQCVAFpAe4CWwFeAdADGAEhEAADTAGS
- ATgBYgGNAfYCVQFXAboDDAEQCAABXAJXAd8BjwFBAUAB/gGzAk4B/QGgAVUBVwH8AZ4BVwFcAfwBlAJf
- AfsBlAJfAfsBkgFRAWcB+gGUAl8B+wFvAVkBZwHyA0QBfHgAAUcCRgGAAmUBXgHlAaEBfAF2AfoBjgF9
- AW0B9wFgAlwB1AMzAVKEAANLAY4DWQHDA1cBwgNCAXZAAAMRARcDRAF5A1YBswNYAcYDVwHFA1QBrwM9
- AWoDDQESEAACVQFXAboBIQEkAZAB+wI+AYIB+AE8AT4BfwH4ATsBPAF+AfgBOgE8AX0B+AE6ATsBfAH4
- ATkBOgF6AfgCOQF4AfgBNwE5AXYB+AE3ATgBdQH4ATUBNwF0AfgCNwFzAfgCNwFzAfgCIQFiAfsCWQFb
- AcMMAANTAaoDWAHRA1gBywNaAdUBVAFdAWYB7QFKAV0BbwHzAlcBXwHoA1sB0ANcAc4DWQHSA0QBfAgA
- AToBbQGHAfcBAAG1AeEB/wEAAasB2gH/AVcCWQHsAxkBIzgAA0MBdwFgAlkB6wJ/AU0B/gGBAakBRAH/
- AYYBuwFSAf8BiQG2AVMB/wGzAagBbgH/AaIBUQFKAf0DWgHeAzkBXwwAAT0BPwF5AfYBHwE6Ae4B/wEH
- ASIB5AH/AQIBGwHgAf8BBQEaAdoB/wEDARYB1QH/AQABEQHPAf8BCwEZAdYB/wELARUB0gH/AQABBQHB
- Af8BAAECAb0B/wIAAbkB/wIAAbUB/wIAAa8B/wIAAbkB/wI4AW4B9wwAAbIBqwGsAf8B2wHSAdEB/wHi
- AcwBwgH/AYUBowHeAf8BVgHSAv8BZAHpAv8BXgGtAfIB/wHaAcYBwgH/Ad8B1QHUAf8BvAK2Af8DVQG1
- CAABQgFqAXkB9AEAAegC/wEAAe4C/wEAAYMBtQH/A1wB3ANKAYsDAwEELAABUgJQAaQBqgJ/Af4B/wHv
- AeUB/wHdAfgBzwH/Ad8B9QHOAf8B5gH1AdYB/wHpAfoB3wP/AfoD/wH5Af8B6wHIAbkB/wFqAkEB+QNE
- AXoIAANVAbUBGwEuAdsB/wEAAQ0B5AH/AVQBYwHRAf8BqwGvAdAB/wGpAa4B2QH/AbMBtwHgAf8BnAGf
- AccB/wGaAZwBxAH/AbQBtgHcAf8BrAGuAdMB/wGvAbABywH/AWEBYwG6Af8CAAGkAf8CAAGrAf8CVgFY
- AcEMAANRAaADVQGtA1ABnQNVAbUBWAGoAb8B/QFpAbcB5wH/AVkBYAFjAesDVAGmA1UBrQNSAakDKAE8
- CAABWgJdAdMBAAHaAfQB/wEAAdkB9wH/AQABzAH6Af8BAAG4AesB/wEpAUMBagH5AzgBXCgAA0sBkAHG
- AZoBbQL/Af0B4wL/AeoBzgL/AeABwgL/AdwBuwL/AdwBuQL/Ad0BvQL/AeABwwL/AeoB0QP/AfYB/wH9
- AeQB1AH/AWoCQQH5AzgBXQQAAysBQgEoAS4BkwH7AQUBIQHqAf8BbQGIAdcB/wH5AfUB2QH/AfgB9gHq
- A/8B+wH/AlsBTwH/AlABRQP/AfkB/wL6Ae8B/wL7AeIB/wGNAY8BxQH/AgABtQH/AgABkwH/AzIBURgA
- AzMBUgF5AXUBdgH6AaUBmgGcAf8DVAGuGAADJAE1AVcBXwFkAegBAAHbAfQB/wEAAdoB9gH/AQAB7gL/
- AQABmgHUAf8BSQFOAVkB8gNLAZADIwEzHAADJgE4AXkBXAFDAfgBvwHTAY4C/wHbAbIC/wHPAZwC/wHK
- AZMC/wHIAY8C/wHJAY4C/wHLAZQC/wHSAZ8C/wHWAakB/wHuAdUBqwL/AfgB4QH/AfIByAGtAf8DWAHd
- Aw0BEgMEAQUDUwGqARoBLQHeAf8BFwEuAegB/wHWAdgB5QH/AfoB+QHyAf8C/QH+Af8C1QHXAf8C0gHT
- Af8C/QH+Af8C+gH1Af8B4QHiAeUB/wEeASEBvAH/AgABtQH/AlYBWAG5AwkBDAwAAzEBTwNWAbYDVwHo
- AXEBdQFwAfoBswGrAaYB/wGGAmkB/wNYAdEDEAEWGAADJAE1AVkBYgFpAesBAAHhAfkB/wEAAdAB9QH/
- AQAB1AH+Af8BAgHBAfEB/wEWAUEBmQH9AVIBVQFdAe0DUQGnA0oBiwMkATUQAANVAbIBbAGPATMB/wFo
- AaMBPAH/AfgByQGNAv8BwAFuAv8BugFlAv8BuQFhAv8BuwFkAf8B1AGvAVIB/wFwAZgBMgH/AeEBvQFs
- Af8B7QHHAY4B/wGoAbIBYAH/AWYBqQFHAf8BlgFPAUAB/QM9AWoEAAMqAUECQgF7AfUBBAEgAe0B/wFm
- AYMB6AP/AfcF/wO8Af8DtQf/AfwB/wGQAZQB1QH/AgABwAH/AToBOwF7AfgDMQFOEAABZQJkAfEB4wHa
- AdsB/wHzAesB6gH/AekB7AHkAf8B2wHQAc4B/wHLAbgBuQH/AY4CgQH/A1gB4wM9AWoDAQECFAADJgE4
- AVQBYgFoAe0BAAHiAfkB/wEAAdMB8wH/AQcB5QH9Af8BDwHmAv8BCQGvAfIB/wEAAVcBxgH/AQABTAG+
- Af8BWAFaAVwB5wM4AV0MAAFiAlUB6gE7AYIBGQH/ARIBWgEAAf8BbAGJASUB/wH1AbMBVAL/AbEBTwL/
- Aa4BSwL/AbMBUQH/AYYBigEjAf8BAgFUAQAB/wFnAYYBIQH/Af0BxQGDAf8BnQGcAT8B/wFSAZEBKwH/
- AcYBnAFfAf8DUwGwCAACVAFWAasBIQEzAd4B/wE8AVAB9QH/Ae0B7gH8Bf8DjAH/A28F/wHqAesB/gH/
- ASEBKAHfAf8BAQEKAcAB/wJVAVcBtwMBAQIQAAF6AnYB+AHtAuAB/wHiAtYB/wHnAdwB3gH/AdkBygHL
- Af8B1ALDAf8B5QLUAf8ByQK6Af8BUAJLAf0DVwHCAyEBMBQAAykBPwFOAWIBaAHvAQAB4wH6Af8BAAHO
- AfIB/wESAeQB+wH/ATQD/wE+AeoC/wFWAeQC/wEPAYoB5wH/ATcBPQFtAfcDRgGACAABgwFbAUEB+QEp
- AV0BCAH/ARMBSAEAAf8BEAFHAQAB/wGxAZEBLgL/AbMBTgL/AbQBUAL/AbgBUwH/AVoBZwEVAf8BFQFL
- AQAB/wEaAUwBAAH/AaoBkwE1Af8B5QGwAVgB/wHJAbIBYwH/AewBugGKAf8DVwHFCAADJwE6AkEBjQH5
- AZ4BogH9Af8Czwb/A2YB/wNUBf8CpwL/ARYBFwH+Af8BJgEoAagB/QMvAUkUAAGAAn0B9wH5AvIB/wHy
- Au0B/wHxAu4B/wHcAs8B/wHPAr0B/wHUAsUB/wHhAtIB/wHvAuIB/wGYAo0B/wNRAaEYAAMtAUYBTQFi
- AWsB7wEAAd0B9AH/AQABxwHwAf8BEQHgAfYB/wFJA/8BjgP/AY8B9gL/ASMBowH5Af8BOgFCAVoB9QMv
- AUoEAAGMAV8BMgH7ASEBSAEAAf8BEgE0AQAB/wFgAV4BFAH/AeMBqQFHAv8BtwFWAf8B2wGjAUUB/wG2
- AY4BMgH/ATEBQwEAAf8BFgE2AQAB/wEZAToBAAH/ATIBSAEAAf8BngGDASsB/wGjAY8BOAH/AbsBlwFO
- Af8DWQHHCAADAgEDAlABUgGjAXABggHnAf8BvQG8Av8C+wL/AkUBQQH/AjcBMgH/AvYB/gH/Al4C/wEh
- ASIB4gH/A1UBsgMFAQcUAAGBAoAB9wH+AvwB/wHsAuYB/wHvAuoB/wHdAtEB/wHOArwB/wHTAsQB/wHV
- AsYB/wHtAt8B/wG6Aq0B/wNSAakcAANIAYQBAAGoAdoB/wEAAesB/QH/AQAB5AH0Af8BDwL+Af8BQAP/
- AZID/wGbA/8BDAFtAeEB/wNbAdADDwEUAXUBWAFIAfYBhQFnASAB/wG3AYoBLAH/AfUBrgFMAv8BvgFj
- Af8B2wGsAVwB/wFKAU8BGwH/ATcBRgETAf8BPQFHARUB/wE0AT0BDAH/ASUBLwEAAf8BLwEwAQAB/wI3
- AQAB/wE2ATwBAwH/AZIBYAEpAf8DVQG0DAADJAE2AkwBdwHzAbIBtAH+Af8C3wL/AmYBYAH/AmEBVQH/
- AsAB/AH/AU0BTgH+Af8BPgE/AYYB9wMqAUEYAAOAAfcB2ALKAf8ByAK3Af8B6ALgAf8B3wLTAf8BzAK5
- Af8B0gLBAf8B1QLEAf8B5gLWAf8BrQKfAf8DUQGnHAACWwFgAdYBAAHKAfkB/wEAAeAC/wEAAe8C/wEA
- AfwC/wEOA/8BNQH6Av8BhgP/AVsB4AL/AQcBSwGTAf4DSgGMAV4CWwHZAbEBiwEyAf8B7QGqAUUC/wHK
- AYwC/wHeAbcB/wHgAdIBuQH/AZ8BpgGPAf8BoAGnAY8B/wGoAasBkwH/AaYBqQGQAf8BlQGZAW0B/wFd
- AWEBOwH/ARgBKAEAAf8BIAEwAQAB/wGqAWEBMAH/A0MBdwwAAwMBBANQAZ0BggGFAeUB/wHJAcgC/wLm
- Ae8B/wLmAe0B/wKWAv8BQgFEAeMB/wNTAaoDBgEIGAABgAJ/AfcBzQK7Af8BwwKyAf8B7wLqAf8B3gLS
- Af8BxgKzAf8B0AK+Af8B0QLAAf8B4gLRAf8BqQKaAf8DUQGnHAABVQJXAboBAAHHAfMB/wEAAdEC/wEA
- AdoC/wEAAfUC/wEOAdgB8QH/AUIBWQF3AfUBMwGoAbwB/QFUA/8BAwGCAegB/wNOAZQBRwJGAYEBnQFl
- AS0B/wGlAbUBbwH/AfkB7gHaAv8B8AHhAv8B9gHqAf8B8QHuAeAB/wHCAc8BuAH/AcYB0QG6Af8BzQHV
- AbwB/wHEAdABtwH/AboBzQG1Af8BhQGoAYYB/wFmAYABKQH/AWQCWQHsAxIBGRAAAyUBNwJTAXQB8QG+
- AcAB/gH/AtcC/wHJAcgC/wGOAY8C/wFDAUUBeQH2Ay0BRRwAA4AB9wHvAugB/wHwAusB/wH+Av0B/wHZ
- AswB/wG+AqgB/wHHArQB/wHNArsB/wHfAs0B/wGmApcB/wNRAaccAAMQARYBWQFgAWoB6wEAAdMC/wEA
- Ac8C/wEAAegC/wElAX8BsgH+A1kBzwExAV0BiwH4AQABswHzAf8CVwFaAb0DDQESAw0BEgFcAlcB3wG9
- AccBlQH/AcwB6QHRAf8B5QHpAdgB/wH4AfQB6QL/Af0B+AH/AdkB6AHWAf8BvgHYAb4B/wHAAdgBvwH/
- AcMB2QHBAf8BwAHfAcoB/wG3AdgBqwH/AZABfAFFAf4DRAF5GAADUAGeAYwBkAHlAf8CzAL/AbUBtAL/
- AWkBbAHkAf8DVAGuIAADbAH1Af8C/QH/AfYC7wH/AeQC2wH/Ad4C0wH/AdMCxQH/AcQCsAH/AcECqwH/
- AdYCwQH/AaICkQH/A1EBpyAAAzkBXwElAXUBnAH6AQAB0QH7Af8BAAHeAv8BAAHBAe0B/wEGAX8BoAH+
- AQABjQHbAf8CWQFbAcMDBAEGCAADJQE3AWgBWAFWAe8B4AHdAboB/wHbAfgB5wH/Ad4B8AHlAf8B7AH1
- Ae0B/wHjAe8B4wH/AdUB5wHWAf8B1QHqAdwB/wHbAfYB6QH/AesB8AHPAf8ByQGTAU8B/wFSAlABpBwA
- Ax0BKgJMAXcB8wHWAdgC/wHMAc0C/wI+AY0B+AMmATkgAAM+AWsDXAHqAcwCxQH/AfAC6AH/AfAC6AH/
- AegC4wH/AeAC2QH/Ac4CvwH/AdACuQH/AZ0CiwH/A1QBqyQAAzgBXAFXAVwBXQHfAQABsQHpAf8BAAHq
- Av8BAAHLAfQB/wJaAV0BygMJAQwQAAMlATcBXgJYAd0B4gG3AZ4B/wH4AfcB7An/AfsD/wH6Af4B8gH/
- AfYB2QG9Af8BjQFdAVwB+ANOAZQgAAMCAQMDTgGUAZMBlwHoAf8BmgGfAekB/wJPAVMBpQMDAQQkAAMJ
- AQwDSwGPA2IB7wHZAtYB/wH5AvYB/wH6AvcB/wH4AvcB/wHtAuUB/wGXAooB/wNOAZkoAAMNARIDTgGU
- AUwBXQFuAfACWgFdAcoDDQESGAADCQEMAUcCRgGAAV4CWwHZAYABZAFZAfUBnQGIAWQB+wGSAX8BagH5
- AWQBXAFVAeoDVQGyAycBOigAAxsBJgJaAV8B2wJaAWEB5AMiATIwAAMVAR0DUAGeA24B9QOHAfkDXwHj
- A1kBxwNMAZMDFgEfCAABQgFNAT4HAAE+AwABKAMAAUADAAEgAQECAAEBAQABAQYAAQkWAAP/AQAB8AEf
- BgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEP
- BgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB+AEPAv8B/gF/Av8B8AEHAv8B/gF/Av8B8AED
- AfkBzwHgAQ8C/wHgAQEB+AGPAeABBwIAAeABAQHwAY8B5gFHAgABwAEBAfABBwHmAUMCAAHAAQAB4AEH
- Af4BBwIAAcABAAHiARMB8AEHAgABwAEAAcIBMwHgAQ8CAAHAAQABxAETAeABHwIAAcABAQGEARkB4AFv
- AgAB4AEDAYgBCQHiAWcCAAH8AQ8CAAHgAUcCAAHAAX8C/wHwAQcCAAGDAb8C/wH8AT8C/wHPAb8C/wH+
- AX8C/wH4AT8BxwHjAeABBwF/Af8B4AEDAcEBwwHAAQMBPwH/AYABAQHAAQMB4AEHAY8B/wGAAQEB4AEH
- AYABAQGDAf8BgAEBAeABBwGAAQEBwQH/AYABAQHgAQcBgAEBAcAB/wGAAQEB4AEDAYABAQHgAT8BgAEA
- AcABAQGAAQEB8AEfBAABwAEDAfgBDwQAAcABAwH8AQcEAAHgAQcB/gEDAQABAQH4AR8B4AEHAf8BAQGA
- AQEB+AEfAfABDwH/AYEBwAEDAfwBPwHwAQ8B/wLAAQcB/AE/AfABDwH/AfAC/wH8AT8B+AEfAf8B/AHg
- A/8BwgEDAf8B4QHgAT8CAAGAAQEB/wHgAcABDwIAAYABAAH/AcABgAEHAgABgAEAAf8BgAEAAQMCAAGA
- AQAB/wGBAQABAwIAAYABAAH/AQMBAAEBAgABgAEAAf8BAwQAAYABAAGOAQcB4AQAAQEBDAEPAfwEAAED
- AQABHwH+BAABAQEAAT8B/wEBAwABAQEAAT8B/wEDAwABAQHAAWMB/wGHAwABAwHAAQMB/wHHAwABBwHg
- AQMC/wIAAQEBDwHwAQ8CAAL/AZ8B/wGAAQECAAHjAf8BhwH/AYABAQIAAcEB/wGBAf8BgAEBAgABwAH/
- AcAB/wGAAQECAAGAAX8BwAH/AYABAQIAAYABPwHAAf8BgAEBAwABHwHgAT8BgAEBAwABDwHwAR8BgAEB
- AwABBwH4AQ8BgAEBAgABDAEHAfwBDwGAAQECAAEeAQMB/AEHAYABAQIAAT8BgQH+AQMBgAEBAgAB/wHA
- Af8BAwGAAQECAAH/AfAB/wGBAYABAQIAAf8B+AH/AcEBgAEBAgAD/wHhAYABAQT/AeABAwGAAQEBgAEB
- AYABBwGAAQEBgAEBAwABAwIAAYABAQMAAQECAAGAAQEDAAEBAgABgAEBAwABAQIAAYABAQYAAYABAQYA
- AYABAQYAAYABAQYAAYABAQYAAYABAQYAAf8BwwEAAQEBAAEBAQABAQHhAYcBAAEBAQABBwEAAQEB4AEH
- AQABBwEAAQ8BAAEHAfABDwEAAX8BAAH/AQABfwHwAQ8BAAEPAYcB4QHgAQcB/gEHAQACAwLAAQMB+AEH
- AQACAQKAAQEBwAEHBgABgAEHBgABgAEHAgABgAEBAgABgAEHAgABwAEDAgABgAEHAgAB4AEHAgABgAEH
- AgAB4AEHAgABgAEHAgABwAEDAgABgAEHAgABgAEBAgABgAEBBgABgAEBBgABgAEBAQACAQKAAQEBgAED
- AQAB/wEDAsABAwGAAQ8C/wGHAeEB4AEHAYABfwH/AfgCAAHjAf8B4AEHAf8B8AIAAcEB/wGAAQMB4AEg
- AgABgAH/AYABAQHAAQEDAAF/AYABAQHAAQMDAAE/AYABAQGAAQcDAAEfAYABAQGAAQEDAAEPAYABAQQA
- AYABBwGAAQEEAAHAAQMBgAEBBAAB4AEBAYABAQEAAQECAAHwAQABgAEBAQABAQIAAfgBAAGAAQEBgAED
- AgAB/AEAAYABAQHwAQMCAAH+AQEBgAEBAfwBBwIAAf8BAwGAAQMB/wEHAgAB/wGHAcABBwGAAf8CAAHg
- AQcB4AEHAYAB/wIAAeABBwHAAQMBgAMAAcABAQGAAQEBgAMAAYADAAGAAQABgAEAAYADAAGAAwABgAMA
- AYADAAGAAwABgAMAAYADAAGAAwABgAMAAYADAAGAAwABgAIAAQEBgAMAAeACAAEBAYABAQIAAeACAAEB
- AYABAQIAAeABAQEAAQEBwAEDAYABAQHwAfcBgAEBAfABAwHAAQMB8AP/AfABAwHwAQcF/wHhAYABvwGA
- AQAB4AE/Af8BwAEAAQMBgAEAAeABBwH/AYACAAGAAQABwAEBAf8DAAGAAQABwAEBAf4DAAGAAQABwAEB
- AfwBAQEAAQEBgAEAAYABAQHgAQMBAAEPAYABAAGAAQEBgAEHAgABgAEAAYABAQEAAQ8BgAEAAYABAAGA
- AQEBAAEfAeABAAGAAQABgAEDAQABPwHgAQEBgAEAAYABAwEAAT8B4AEBAYABAAGAAQMBAAE/AcABAQGA
- AQAB4AEHAQABfwHAAQEBgAEAAf4BBwHAAX8BwAEBBP8BwAH/AcABAwIAAv8CAAHAAQMCAAHjAf8GAAHD
- Af8GAAHAAQEGAAHAAQEGAAHAAQEGAAHAAQEGAAHAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQECAAHg
- AQcCAAGAAQECAAHwAQ8CAAGAAf8CAAHwAQcCAAGAAf8CAAHwAQcCAAL/AgAB8AEHAf8BjwHwAT8C/wHg
- AQcB/wGHAYABAQGAAQEBwAEHAfABgwIAAYABAQHgAQcB4AEDAgABgAEBAYABAQHAAQECAAGAAQEDAAEB
- AgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBAgABwAIAAQEBgAEBAgAB4AIA
- AQEBgAEBAQABAQHgAgABBwGAAQEBAAEBAf8BwAEAAX8BgAEBAYABAQH4AU8B4AUAAfgBBwHgBQABwAED
- AcAFAAGAAQMBwAcAAcAFAAGAAQABgAcAAYAFAAEBAYAGAAEBCAABAQ4AAYABAQYAAcABAwYAAcABHwYA
- AfIBHwHgAQcEAAT/AgAC/wHgAQMB8AEPAeABBwHAAX8B4AEAAeABBwHgAQ8BgAEHAeABAAHAAQMCAAGA
- AQABwAEAAYABAQIAAYABAAGABwABgAcAAYAHAAGABgABAQHgBgABAQHgBgABAQHgBgABAwHgBQABgAED
- AfACAAEBAgABwAEHAfgBAAGAAQMCAAHAAR8B/AEBAcABBwIAAeABfwL/AeABDwIAAeAB/wH4AR8E/wH4
- AT8ByAETAf4BPwL/AcABHwGcATkB/AEfAYABBwEAAQ8BBAEgAfwBHwGAAQMBAAEHAQQBIAH4AT8BgAEB
- AQABAwEEASAB4AFDAYABAQIAAQQBIAHAAQMBgAEBAYADAAGAAQMBgAEBAeADAAGAAQcBgAEBAfABAAEE
- ASABgAEfAcABAQH8AQABAgFAAYABAwHwAQEB/gEBAgABgAEBAcABAQH8AQMCAAHAAQEBwAEDAfgBAwGA
- AQEBwAEDAeABBwHwAQcBwAEDAcAD/wHgAQ8B4AEHBP8B4AEPAf8BAwb/AfABAQL/AfgBHwIAAeADAAH4
- AQECAAGAAwABgAMAAYABAQIAAYAHAAGABwABgAwAAQEDAAEBAwABAQMAAQEDAAEBAwABAwMAAQEDAAED
- AwABAwMAAQMCAAGAAQMCAAHAAQcCAAHAAQcC/wHwAX8C/wHgAR8I/wGAAT8C/wHAAQcB5wH/AQABHwH8
- AT8BwAEDAcABAQEAAR8B+AEfAcABAwHAAQEBAAEfAfABDwGAAQcBgAEBAQABHwHgAQ8BgAEHAYABAQEA
- AR8BwAEDAYABBwGAAQEBAAEfAYABAQGAAQcBgAEBAQABPwMAAQMBgAEBAYABfwMAAQEBgAEBAYABBwQA
- AYABAQGAAQEEAAGAAQEBgAUAAYABAwGABQABgAEDAcABAAGBAQECAAH/AecB4QEAAsMBAAEfA/8BgQT/
- AQ8B/wHwAQ8CAAHgAQMBBwH/AeABBwIAAeABAwEBAf8BwAEDAgAB4AEDAQEB/wGAAQECAAH8AT8BAAF/
- BAAB4AEfAYABDwIAAYABAQHgAQcBwAEHAgABwAEBAeABAwHgAQMCAAHAAQMB4AEDAfABAQIAAcABAwHg
- AQMB+AMAAeABBwHgAQMB+AMAAeABBwHgAQMB+AMAAfABDwHgAQMB+AIAAQEB+AEfAeABAwH8AQEBgAED
- AfgBHwHgAQMB/gEDAcABBwH4AR8B8AEDAf8BBwHgAQ8B/AE/AfwBAws=
+ Ad8B8AH/AfoB9AHyAf8B4gGTAVAB/wNWAcEEAAM4AVwCUAFSAaQCWgFdAcoBXwFgAW4B8wLDAd4B/wLO
+ AfQB/wJlAv8CSwH+Af8CMgH3Af8CHAHrAf8CEAHqAf8CXAFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMW
+ AR4DVQGyAcACtAH/AegC3AH/AfAC5wH/A2AB6wMcAScgAAMDAQQDXgHZAd4B2QHcAf8BoQErARAB/wHA
+ ATYBAAH/Ac8BVQEAAf8B3wFlAQAB/wHnAYIBAAH/AeABaAEAAf8ByQFDAQAB/wG6AVMBNQH/AaEBmQGe
+ Af0DNwFaCAAB0QGfAYMB/wH+Ac4BmAH/Af0ByAGSAv8BzAGRAv8ByQGMAv8BxwGJAf8B/AG+AYIB/wH5
+ AbcBZwL/AbwBYwL/AbkBXwL/AbcBXAH/Af4BswFXAv8BsQFWAf8B7wGQATEB/wNZAcQMAAMHAQoDKgFB
+ AzsBZAJPAVEBnAJaAWAB3gJKAcUB/wJZAd8B/wJWAfQB/wI7Ae4B/wNUAa8MAANCAXQDUQGcAx8BLQNV
+ AbIBwAKwAf8B3gLMAf8B6ALaAf8BzgLBAf8DUwGqJAADEQEXAWQCYAHzAdABugG9Af8BkQIAAf8BrwEY
+ AQAB/wG6ATABAAH/AcQBPwEAAf8ByQFEAQAB/wHIAUQBAAH/AbsBKQEAAf8BvgFiAU8B/wNtAfcDIQEw
+ CAACZAFgAfEBjwFwAWAB/AGOAl8B+wGOAl8B+wGOAV8BWQH7AY4BXwFUAfsBjgFfAU4B+wGOAV8BSQH7
+ AY4BXwFEAfsBjgFfATIB+wGOAV8BMgH7AY4BXwEyAfsBkAFfATEB+wF+ATsBKwH8A0gBhhwAAxQBGwMi
+ ATIDQgF1AlcBWQHCAlkBZwHyAz4BaxQAA1EBnAHFArcB/wHvAt0B/wHeAssB/wHEArcB/wNgAdQDFQEd
+ JAADMAFNAZECiAH+AdwBzgHPAf8BnQJBAf8BrQFKAT0B/wGuAU0BOAH/Aa4BTQE0Af8BrgFNATAB/wGs
+ AUgBLAH/AaEBNAEnAf8BwgGaAZgB/wNiAekDBwEKjAADQgF2A2QB5wNtAfcDZAHsA04BmAMUARwoAAMi
+ ATEDXgHZA2EB7gNhAe4CZQFnAfEDawHzAWwBawFsAfUBgQGAAYEB9wGFAYMBhQH5AY0BiwGMAfsBrgGp
+ AaoB/QNWAbkIAAM6AWEDWQHHA1kBzANaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNa
+ AcoDXAHOA1kBwwM0AVVAAANOAZgDWQHDA1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+
+ A1YBvgNWAb4DVgG+A1kBxANEAXwIAANIAYQDbwHzAWcCZgHwAWcCZgHwAWcCZgHwAWcCZgHwAWcCZgHw
+ A2YB8ANmAfADZgHwAXACbwHzA1EBnAgAA2EB7gPiAf8D3QH/A9oB/wPaAf8D2AH/AdgC1wH/A9cB/wPW
+ Af8D1QH/A9UB/wPUAf8D0wH/A+AB/wOZAf8DVwG9DAADLgFHAl4BYQHaAyUBNygAAZkBnQGfAf0BygHN
+ Ac8B/wHLAc0B0AH/AcsBzgHQAf8BygHNAdAB/wHKAc0BzwH/AckBzQHPAf8ByAHMAc4B/wHIAcwBzgH/
+ AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AcgBywHNAf8ByQHLAc4B/wGxAbUBtwH/A1sB0AMDAQQDLwFJ
+ A1IBpAHoAuMF/wH7AvkB/wH6AvcB/wH4AvQB/wH2AvAB/wHzAuwB/wHwAugB/wHyAusB/wHsAuUB/wNW
+ AbYDMQFNAwQBBgN9AfcE/wP0Af8D8wH/AfMC8gH/AfEC8AH/AfAB8QHyAf8B7wHwAfEB/wHtAe4B7wH/
+ AesB7AHrAf8B6wLsAf8B6QHqAewB/wHlAuYB/wP1Af8DxgH/A1kBwwgAAxsBJgFUAmIB7wEAAeQC/wJc
+ AWAB1CgAAagBqgGsAf0B7QLwAf8B2QHbAdoB/wHbAd0B3gH/AdsB3QHeAf8B2wHeAd8B/wHbAd4B3wH/
+ AdsB3gHgAf8B2wHeAeAB/wHbAd4B4AH/AdwB3gHgAf8B2wHdAd4B/wHaAdsB3AH/AeYB6AHpAf8B4QHm
+ AekB/wNYAcsDPgFrAW8CbgH1Ad0C1QH/Ad4C1Qb/Av0B/wH8AvgB/wH6AvUB/wH4AvEB/wH1Au0B/wHx
+ AukB/wH2Au8B/wHhAtYB/wHdAtYB/wNxAfYDRAF6A2IB9gP7Af8D6gH/AesC6gH/AeoB6wHqAf8B6wHw
+ AfEB/wHmAekB6gH/AeEB4AHiAf8B4wHlAecB/wHnAewB7wH/AeEB4gHlAf8B3gHfAeEB/wHeAt8B/wLs
+ AesB/wO9Af8DVgHBCAADDgETAVcCXwHoAQAB8QL/ATIBcQGDAfoCTAFNAZEDSQGHA0kBhwNJAYcDSQGH
+ A0kBhwNJAYcDSQGHA0cBgAQAA6gB/QFWAVgBVQH/AhUBAAH/AiEBAQH/Ai8BDAH/AkQBJAH/AkoBLgH/
+ AkwBMQH/AUkBSAEtAf8BPgE/ASEB/wExATIBEQH/ASUBJgELAf8BGwEaAQUB/wIvASkB/wG/AcYBywH/
+ A1oBygNeAc4B9QLpAf8B0QLIAf8BYwJhAf8CtQG0Af8BwgLBAf8BvAK7Af8BvAG7AboB/wG6ArkB/wG5
+ AbgBtwH/AbsCuQH/AbUCtAH/AWMCYgH/AckCwgH/AfgC7AH/A14B2QNlAfYD/AH/Ae0C7AH/Ae4B8AHy
+ Af8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+Aa4B/wHSAbYBpwH/AdABuQGwAf8B1QG1AaMB/wHO
+ AaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHBCAADGwEmAVkBYAFjAesBAAHoAv8BJwGbAcgB/wG7
+ AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/AcYB0QHOAf8BxAHPAc0B/wHBAc0BywH/AckB1QHX
+ Af8BnQGkAagB/wQAA6gB/QE9AUABNwH/AwAB/wIzARIB/wI6ARUB/wEcARsBAAH/AjABAAH/AjEBAAH/
+ Ai4BAAH/AiQBAAH/AhcBAAH/Ag8BAAH/AgQBAAH/ARMBEgEFAf8BtgG9AcIB/wNaAcoDYQHmAeIC0AH/
+ AcICsgH/AU0BSgFLAf8BUQFVAVwB/wFYAV0BZAH/AVcBXQFlAf8BWAFdAWUB/wFYAV0BZQH/AVcBXgFm
+ Af8BWAFeAWUB/wFTAVgBXwH/AUoBSAFJAf8BuQGsAasB/wHiAtAB/wNgAesDZQH2A/wB/wHwAvIB/wHr
+ AekB6gH/AdcBswGgAf8B6AG+AZUB/wH1AdEBogH/AfIB0gGnAf8B8wHQAaAB/wHrAcIBmQH/AfUBzQGh
+ Af8B3gGoAWYB/wHTAcMBuwH/AfAB9AH3Af8DwQH/A1YBwQgAAykBPgEVAXIBowH8AQAB6gL/ARYBkQG3
+ Af8BTAFjAT4B/wFIAYgBMAH/AS8BagEOAf8BMAGDAQ0B/wE1AYUBEwH/AS0BaAEQAf8BGgFYAQEB/wFm
+ AZ4BWwH/AakBrAG0Af8EAAOoAf0BNwE6ATUB/wInARgB/wLbAdUB/wK9AbcB/wIcAQAB/wIaAQAB/wIY
+ AQAB/wIQAQAB/wIXAQAB/wIXAQAB/wITAQAB/wIIAQAB/wIYAQoB/wG0AbsBwQH/A1oBygNiAe8BzgK5
+ Af8BzgG/AcEB/wHYAcMBvAH/AeABpwGKAf8B5gGlAYAB/wHpAaIBYQH/AekBnQFZAf8B6QGdAVkB/wHp
+ AaEBYAH/AeYBpgFpAf8B4AGoAYsB/wHZAcEBugH/Ac4BwAHCAf8BzgK5Af8BXwJdAfADZQH2A/4B/wHw
+ AfQB9wH/Ad0BuwGrAf8B7gG3AYMB/wHyAcABhwH/Ad8BswGRAf8B3gG/AaoB/wHeAbIBjgH/AfMBwQGJ
+ Af8B9wHIAZUB/wHUAaMBhgH/Ad4B3AHeAf8B8gH0AfUB/wPCAf8DVgHBCAADHAEoAScBbQGMAfoBAAHo
+ Av8BEwGQAbUB/wFMAWkBQwH/AYMBpQFgAf8BUQGQAUAB/wFSAZABQAH/ARQBXAEAAf8BEgFYAQAB/wEA
+ AUYBAAH/AVUBkgFMAf8BqgGrAbUB/wQAA6gB/QEyAjMB/wExATABIAH/AoEBZgH/AqoBpwH/ApEBhwH/
+ AhEBAAH/ApMBggH/AkMBMAH/AgcBAAH/Ag4BAAH/AgsBAAH/AwAB/wITAQoB/wGwAbcBvQH/A1oBygFl
+ AmQB8QHtAuQB/wLrAfEB/wHlAdEBwAH/AfkBhwENAv8BYAEAAv8BYAEAAv8BYQEAAv8BYQEAAv8BYgEA
+ Av8BYgEAAf8B+gFgAQAB/wHnAcQBqgH/AewB8AH4Af8B6gLgAf8BYQJfAfADZQH2BP8B6gLlAf8B5QGr
+ AYMB/wH1Aa8BWgH/AdgBqgGNAf8B6AHmAegB/wLtAesB/wHkAecB7AH/AdsBrwGSAf8B9QG1AWYB/wHZ
+ AaIBZwH/AdsB1wHYAf8B8wH3AfgB/wLFAcQB/wNWAcEIAANCAXUBAAG4Ae8B/wEAAegC/wEUAZQBtgH/
+ AYcBoQGBAf8BMwGDAScB/wEvAYMBJAH/ASkBZwEaAf8BBQFMAQAB/wEEAUcBAAH/AQABOgEAAf8BVAGQ
+ AU0B/wGqAawBtAH/BAABpQKoAf0BOAE7ATkB/wMAAf8DAAH/AqgBpQH/AqUBnQH/AwAB/wJLAUAB/wK9
+ AboB/wKRAYkB/wIIAQAB/wIBAQAB/wMAAf8BDgENAQkB/wGtAbQBuQH/A1oBygNhAfAE/wHxAe4B8gH/
+ Ad0B1QHPAf8B8AHAAV4C/wG3ATQC/wGmARAB/wH+AaIBAwH/Af4BoQEBAf8B/gGhAQEC/wGfAQAB/wHw
+ AZwBDAH/AdsBzQG9Af8B5AHjAegB/wHyAusB/wFpAWcBaQHxA2UB9gT/AecB2gHWAf8B6gGpAWEB/wHr
+ AacBVQH/AdoBwwG3Af8B8AHtAeYB/wHmAbgBiQH/Ae0B5wHaAf8B2wHAAbMB/wHwAcIBmQH/AeYBuAGV
+ Af8B2gHNAcgB/wH0AfgB+gH/A8YB/wNWAcEEAAMKAQ0CXAFgAdQBAAHhAv8BAAHgAv8BDwGVAcAB/wEi
+ AU8BRQH/ASkBkAErAf8BAAGBAQAB/wEDAYEBAgH/AQsBggEJAf8BCgFeAQYB/wEAAS0BAAH/AU0BiQFI
+ Af8BrAGtAbUB/wQAAaICqAH9AS4BMQEzAf8BAgEBAQAB/wKsAaUB/wK9AboB/wIeAQ8B/wMAAf8COwEz
+ Af8CvgG7Af8CnAGYAf8CAwEAAf8DAAH/AwAB/wEJAQoBCAH/AaoBsgG3Af8DWgHKA18B4AH/AfsB+gH/
+ AfgB9AH1Af8B3wLbAf8B4AHLAasB/wH9AeUBuwH/AfwB4AGzAf8B+wHZAaMB/wH8AdMBlgH/AfsB0AGQ
+ Af8B/gHPAYgB/wHkAcABiAH/AdQBywHKAf8BzQHMAbsB/wHiAdsBzwH/A18B6ANoAfYE/wHuAuoB/wHn
+ AasBgAH/AfYBtAFgAf8B1AGfAWkB/wHjAeIB4wH/AesB4gHQAf8B4QG6AZMB/wHbAa0BiwH/AfcB0wG0
+ Af8B3gGtAY4B/wHfAdkB1wH/AfUB+QH6Af8DyAH/A1YBwQQAA1EBoAEAAZkB6gH/AQAB5gL/AQAB2wH2
+ Af8BLAHmAfwB/wE1AaUB3QH/AUIBggFeAf8BggHEAWkB/wFoAbwBagH/AWgBvQFpAf8BgQHCAYIB/wE7
+ AZEBOwH/AVABjAFMAf8BqgGsAbMB/wQAAZ8BpgGoAf0BJgEpASsB/wFlAWQBYwH/A7gB/wMAAf8DAAH/
+ AgwBAAH/ApUBjQH/Aj8BOwH/AwAB/wMAAf8DAAH/AwAB/wEGAggB/wGoAbABtQH/A1oBygNJAYcByALC
+ Af8B9gHvAe4B/wHqAuUB/wHDAbQBqwH/Ae4B3AHMAf8B7wHiAdQB/wHsAeIB1gH/AesB4wHXAf8B6gHj
+ AdYB/wHqAd8B0AH/AcUBtgGtAf8B4AHXAdkB/wHuAeQB4wH/AccBwAG/Af8DTgGYA2gB9gT/AfcB/QH+
+ Af8B5AHAAawB/wHvAawBYAH/AfEBugGFAf8B2AGkAYAB/wHbAbQBmwH/Ad0BqAGCAf8B5QHGAacB/wHm
+ AbEBjQH/Ad0BuwGoAf8B6AHuAfEB/wH2AvcB/wPJAf8DVgHBBAACWgFeAdUBAAHIAv8BAAHnAv8BAAH9
+ Af4B/wFNA/8BigHuAf4B/wFaAYYBnwH/AbsB0gGwAf8BtwHPAbAB/wG4Ac8BsQH/AbkB0AGyAf8BtgHQ
+ AbAB/wGnAb4BoQH/AaQBpwGsAf8EAAGbAaIBpwH9AScBKwEsAf8CUwFSAf8DvQH/AooBiQH/AioBJQH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEFAQYBBwH/AaYBrgGzAf8DWgHKAwcBCQM9AWgDWAG5
+ A2AB3gGoAaUBpgH9AfkB9wH2Af8B9QH6AfkB/wHwAfoB+AH/AewB+gH5Af8B6AH7AfkB/wHvAvkB/wGL
+ AYMBhAH+A2EB4gNaAb0DQAFvAwkBDANoAfYE/wH5AfoB+wH/AfUC9gH/AeMBuQGiAf8B7AGvAYEB/wH2
+ AcABkQH/AfYBwQGXAf8B9QHLAacB/wHoAbIBjwH/Ad4BuAGkAf8B6wHuAfAB/wHrAe0B7gH/AfcC9gH/
+ A8sB/wNWAcEEAAE5AVgBbgH2AQABxwL/AQAB6gL/AQAD/wFHA/8BlAH3Av8BVwGEAaoB/wLSAc0B/wHR
+ AdYB0QH/Ac8B1AHQAf8BzQHTAc8B/wHMAdIBzwH/AdkC4AH/AZwBnwGiAf8EAAGWAZ0BowH9ATgBOwE8
+ Af8CBgEFAf8DsgH/A9EB/wIpASoB/wMCAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BAwEEAQUB/wGl
+ Aa0BsgH/A1oBygwAAw4BEwNYAcEE/wH6A/8B9QP/AfID/wHuA/8B+QP/A1wBzAMUARwMAANoAfYE/wP5
+ Af8B+QL7Af8B9wL7Af8B6wHbAdMB/wHnAcEBrgH/AeUBvAGlAf8B5QHBAa4B/wHoAdcB0AH/AfAB9AH3
+ Af8B7gLwAf8B6wLqAf8D+QH/A80B/wNWAcEEAAJXAV8B6AEAAcsC/wEeAY4BrQH8AVgCXwHjAT0B6QH3
+ Af8BiAHyAv8CVgFYAbsDQwF4A0MBeANDAXgDQwF4A0MBeANDAXgDQQFyBAABkQGZAZ4B/QFHAUoBSwH/
+ ASECIAH/A0AB/wM+Af8DKgH/AzUB/wMvAf8DIwH/AhYBFwH/AwwB/wMEAf8DAAH/ARACEQH/AaIBqgGv
+ Af8DWgHKEAADUwGlA/0B/wH+A/8B+AP/AfUD/wHxA/8B+AP/A1UBshAAA2sB9gT/A/sB/wP5Af8B+AL5
+ Af8B+AH9Af4B/wH1AfoB/QH/AfIB9QH4Af8B8gH2AfoB/wHzAfcB+gH/Ae8B8AHxAf8D7QH/A+sB/wP3
+ Af8DzwH/A1cBwgQAA1MBqgEAAckC/wE+AXcBhwH3AlIBUwGoASQBywHtAf8BUwHNAewB/wMrAUIgAAGP
+ AZcBnQH9AUUBRwFIAf8BMQIuAf8CNAEzAf8BMgIxAf8COQE4Af8BOgI5Af8BOwI6Af8CPAE7Af8BPQI8
+ Af8COwE6Af8COAE3Af8BNQIzAf8BLgItAf8BnAGkAaoB/wNZAcwQAANWAasD/QX/AfsD/wH4A/8B9QP/
+ AfoD/wNXAbcDAwEEDAADfAH4HP8D/gH/A/0B/wP8Af8D+gH/A/kF/wPTAf8DVwHCBAADOwFlAT0BZwGC
+ AfcBOwFiAW4B9gEoAU4BfQH6AVQCYQHuAloBXgHVAw0BESAAA38B/gGPAZcBmgH/AVkBXQFgAf8BYAFl
+ AWgB/wFfAWQBZwH/AV8BZAFnAf8BXwFkAWcB/wFfAWQBZgH/AV8BZAFmAf8BXwFkAWcB/wFgAWMBZwH/
+ AWABZQFoAf8BXgFjAWYB/wFnAYEBhQH/AasBtgG8Af8DWQHHEAADVAGvGP8DWAG7AwQBBQwAA1sBywOZ
+ Af4DqwH9A6sB/QOrAf0DqwH9A6sB/QOrAf0DqwH9A6sB/QOrAf0DqwH9A6wB/QOhAf4DYgH1AzsBZUAA
+ AlkBWgHPAYQBhwGIAfsBdAF2AXgB+gFzAXUBdwH6AXQBdgF4AfoBdAF3AXkB+gF1AXcBeQH6AXYBeAF6
+ AfoBdgF4AXoB+gF3AXkBegH6AXcBegF7AfoBeAF6AXsB+gF4AXoBewH6AXoBfgGAAfwDZwHyAzoBYhAA
+ A1EBnAFvAm4B8wNjAe8DYwHvA2MB7wNjAe8BbwJuAfMDUgGnAwEBAjAAAz8BbQFFAUgBdwH2AiEBIgEx
+ IAADBQEHAyMBMwM0AVQDJgE4AwwBEAMCAQNkAAMgAS4DOgFhAzYBWQNFAX8DVgG7A1YBswNAAXADNwFa
+ AzkBXwMcASgwAAM4AV4BMAGiAfgB/wJaAV0BygMXASATAAEBAwYBCAMLAQ8DQQFyA2IB7wFeAlsB2QNV
+ AbIDSAGGAzIBUQMZASMDDQERAwoBDgMHAQoDAwEECAABWQJXAcIBlQFgAVkB+wGKAWQBTQH6AX0CbAH6
+ AX4BbwFwAfoBfgJuAfoBfgJtAfoBfgJtAfoBfgJuAfoBfgFsAWoB+gGQAW4BUAH6AZIBaQFNAfoBlQFf
+ AUUB+wFeAlsB0AwAAwMBBANgAd4CfwF+Af4BhgFRAVAB/QExAV8BuAH/AS0BuQHzAf8BKAGIAc8B/wF3
+ AXABfgH+AY4BgwFXAf0BSwJIAf0DTgGXHAADOQFgA0oBjQFJAkgBhwM3AVsEAAMgAS4BVAFhAWUB7gE4
+ AbkB9AH/A1sByAMWAR4IAAMEAQUDJAE2A0QBeQNMAZIDYQHuAf8B/AH9Af8B/ALrAf8BsQGmAacB/QFn
+ AlkB8gNXAd8DWgHKA1UBsgNQAZoDSAGFAzMBUwMLAQ8EAAHSAWYBPwL/AcQBUgH/Ae8BmgFJAf8B0AHE
+ AccB/wHSAssB/wHTAcoBywH/AdcCzgH/AdYCzgH/AdUB0AHTAf8B1AHCAb0B/wH9AbkBjAL/AZ0BMQL/
+ AZcBEgH/AdwBagEzAf8QAANcAd8BoAGaAZgB/AGMAYQBgwH6AU4BqAG4Af0BZAHkAv8BTgG2AfEB/wKL
+ AY8B+wGXAZQBkwH7AXkCdwH4A0ABcBgAA0gBiAFvAm0B+gGqAqMB/wGKAmAB/wFqAmkB+QJbAVkBwwMo
+ ATwDVAGvAU0B8AL/AR4BZwHEAf8CRQFGAX4IAAMdASoBtQExAQAB/wH0AUkBAAH/AbsBOgEGAf8B8QHM
+ Ac0C/wLzAv8B9wH2Bv8B9AH1Af8B5wG9AbwB/wGgAUYBPgH/AVQBEwEAAf8BSgIAAf8BkgEkAQAB/wNT
+ AbADNgFZBAABnQFlATUB/AH/AbYBTAH/Ae0BlAFJAf8B1AHCAcQB/wHaAUsBMAH/AdcBoAGWAf8B2wHX
+ AdoB/wHcAc4BzQH/AdsB0wHUAf8B2AG+AboB/wHzAZQBVAH/Af4BjgEpAv8BjwEVAf8BtAFTAUAB/QgA
+ AxEBFwMVAR0DKQE/AzMBUgMoATwBUwJVAbABpgHCAd8B/wJMAV0B8wM6AWIDLQFGAy8BSgMYASEDFQEd
+ Aw8BFAwAAykBPgNnAfIBvwG7AbEB/wGsAa0BpgH/AcYCugH/Aa4ClAH/Aa8BmgGXAf8DXgHQAlUBVwG6
+ AVQBqwHVAf4BSgHqAfwB/wNbAcgDCQEMBAABtQExAQAC/wFfAQAB/wHvAV0BAgH/AbsBaQFeAv8B6AHm
+ Av8B5wHoAv8C7wL/AvYC/wL6Bv8C+wH/AfICzwH/AbMBWAFVAf8BaAEoARYB/wGyATABAAH/A0kBiQQA
+ AZsBYQEzAfwB/wG7AVIB/wHvAZsBUQH/Ad0B0QHSAf8B5gErAQgB/wHhAZ0BkQH/AeUB7QHvAf8B5QHf
+ Ad0B/wLmAegB/wHgAcoBxQH/AfIBggE/Af8B/QGNASkC/wGYAR4B/wGzAVIBQAH9BAADSwGQA1wB5wFc
+ AlUB6gFbAlgB4wNbAeEDWgHeA10B8AHNAbkBtQH/AWsBWwFYAfwDWgHkA18B4ANdAeIDXAHnA2AB6wNY
+ AeMDQAFwAxYBHwM3AVsDVQG1AYcBaQGhAf8BUwFOAYwB/wFPAVEBgQH/AboBuAG2Af8BvgGsAasB/wG7
+ AaYBpQH/AcIBrAGiAf8BRAFCAVkB9QEyAYgBmQH7AVMD/wE7AcYB9QH/AkYBRwGABAABtQExAQAB/wH+
+ AWkBCwH/AcoBTwEYAf8B8QHDAbsB/wH8AdMBygH/AfcB0QHPAf8B2gGiAaUB/wHZAZ4BoQH/AasBSgFU
+ Av8C9AL/AvUC/wH+Af0D/wH9Af8BuQFaAVEB/wG1ATEBAAH/A0wBkQQAAZsBYQEzAfwB/wG8AVUB/wHw
+ AaABWAH/AuYB6gH/AeUBlgGHAf8B5wHLAccB/wHtAfoB/gH/Ae0B8QH1Af8B7gH6Af4B/wHmAdgB1AH/
+ AfABWAEpAf8B/QGKAScC/wGcASYB/wGzAVEBQAH9BAABhwKDAfkB8gLwAf8B4gLgAf8B3QLbAf8B3ALZ
+ Af8BzgLMAf8B0wLSAf8B5wLmAf8B7gLsAf8B8gLxAf8B8gLvAf8B9ALxAf8B5AHpAeIB/wHHAeYBygH/
+ AdABywHKAf8DVwHFA1YBswEFAZYB4gH/AQABkAHoAf8BAAGBAeoB/wEAAV0B6AH/ARoBSgG8Af8BrwGl
+ AZ8B/wHOAcABvgH/AcwBuAGyAf8BpwGaAbYB/wEpAWgBzQH/ATsB0AHyAf8BTwH5Av8BVwP/AVEBbQGH
+ AfcDLAFEAbUBMQEAAf8B/gGHAR0B/wHCAV8BTAH/AdUCmQH/AdYBnQGeAf8B1wGhAaMB/wHzAt4B/wH4
+ AuwB/wG2AVoBYgH/Af0B5QHkAv8C7AL/AvMB/wH1Ac8BzQH/AY0BNQEgAf8B3gFBAQAB/wNLAZAEAAGb
+ AV4BMgH8Af8BwAFcAf8B8wGcAVMB/wHoAdIB0AH/AeoB6QHnAf8B6wHfAdwB/wHrAdkB1QH/AesB2QHW
+ Af8B7AHhAdoB/wHnAcEBtQH/Ae8BPgEMAf8B/AGGASIC/wGgASsB/wGzAVEBQAH9BAABsAKtAf0B7gLw
+ Af8B0gLTAf8B1QLWAf8B1QLWAf8BwwLEAf8BzwLQAf8B9AH1AfQB/wHxAvIB/wHxAvIB/wHxAvIB/wPz
+ Af8B6QHuAeoB/wHcAe4B4AH/AeIB4AHfAf8DWQHHAVsCYQHhAU4BcwF5AfQBNQGpAbkB/QEMAbEB7wH/
+ AQUBoQHvAf8BTwGGAagB/wGpAZ4BlgH/AdECxgH/AdsBywHGAf8BvQGnAb4B/wE9AaYB4AH/AVAB/QL/
+ AVEB/AL/AU8B9QH8Af8BRQHbAfMB/wJXAVkBwgG1ATEBAAL/AZUBMQH/AdsBWAEcAf8BywGMAYQB/wHw
+ AcIBvwL/Ae4B6wL/Af0B/AX/AfkC5gH/AbgBWQFhAv8B4wHiAv8B6QHoAf8BswFTAU8B/wGzAWUBNgH/
+ AfIBSQEAAf8DSwGQBAABmwFdATAB/AH/AcUBZgH/Af0BowFKAf8B9wGZAUYB/wH4AZoBRgH/AfgBlwFC
+ Af8B+AGXAT4B/wH4AZQBOwH/AfgBlAE6Af8B+QGPATIB/wH8AYEBIAL/AZEBKAL/AaABLwH/AbMBUAFA
+ Af0EAAGVAowB/AHlAuYB/wHbAtwB/wPfAf8D3wH/A+AB/wHhAuAB/wPgAf8D3wH/A+AB/wPgAf8D4AH/
+ AeEB4AHhAf8B7wHsAe8B/wHhAt0B/wNZAcMDDAEQAy8BSQNdAeIBmwGPAZ4B/wFoAWABiAH/AWgBYgFp
+ Af8BnwKdAf8B1gLNAf8B5AHbAdkB/wH7AeIB2AH/AY8BlAHJAf8BQAHTAfAB/wGAA/8BVQHgAfQB/wJY
+ AWEB5gI0ATUBVQG1ATEBAAL/AaEBRgL/AWUBAgH/AfwBzwGpAf8B4AGoAY4B/wHKAYYBZgH/AeUBrAGp
+ Af8B/gHgAd4C/wH8AfsB/wG5AV4BZQL/AdYBzQH/AfIBwQG8Af8BggEfARQB/wHpAaoBXgH/AfYBSgEA
+ Af8DSwGPBAABnQFZAS0B/AH/Ac4BkwH/AfgB2AG+Af8B+AHXAboB/wH3AdQBtQH/AfUB0gGzAf8B8gHP
+ AbAB/wHxAc0BrgH/AfEByQGrAf8B7wHJAakB/wHsAcwBrQH/AegBxAGpAf8B+wGvAVEB/wG0AU4BQAH9
+ BAABagJnAfQB9wL4Af8D8QH/A/AB/wHuAu8B/wPuAf8B7ALtAf8B6gLrAf8D6QH/A+gB/wPnAf8D5QH/
+ A+MB/wHrAuwB/wHPAsoB/wNVAbEBPQI+AWoBKQFNAYYB+gEFAVQBwgH/AQoBXQHTAf8BAAFMAc4B/wEW
+ AUQBvAH/AagBoAGiAf8B5AHZAdQB/wHxAekB6gH/AbABtgHZAf8BTAFbAb4B/wEhAZoB2QH/AYgB/gL/
+ AZ0D/wFYAWIBYwHvAiEBIgExAbUBMQEAAv8BrgFcAv8BZQECAv8B3AG+Av8B3AG+Af8B/gHZAbgB/wHq
+ AbkBnQH/Ac0BiQFlAf8B2wGdAZkB/wH6AdMB0gH/AbwBXQFhAf8BtgFdAVQB/wGtATUBIgH/AfwBwQGM
+ Af8B9gFKAQAB/wNEAXwEAAGdAVcBKwH8Af4B0wGeAf8B9QL4Af8B/AP/AfwD/wH8A/8B+gH9Av8B+gH7
+ Af0B/wH6AfcB+QH/AfkC9AH/AfkB8gHzAf8B6QHmAeoB/wHyAbMBXwH/AbQBTQFAAf0EAANcAd8I/wH5
+ AvoB/wH2AvcB/wPzAf8B7gLvAf8B6gLrAf8D5wH/AeIC4wH/A94B/wHZAtsB/wPWAf8B3QLeAf8BqAKi
+ Af8DSAGIAVgCXgHdAQ4B3gL/AQMB1QL/AQABugL/AQABogL/AUUBmgHfAf8ByAG0Aa4B/wHpAeAB3QH/
+ Ae4B6QHwAf8BPAGMAdQB/wFOAcwB7wH/AYsB5wH3Af8BlwH9Av8BowP/AZgD/wJZAVwBzAG1ATEBAAL/
+ AbsBiAL/AWUBAhX/AfIC5QH/AdICpQH/AaQBOAFBAf8BywGqAakB/wP2Bf8B9gFKAQAB/wMlATcEAAGd
+ AVcBKwH8Af0B0gGcAf8B9gH1AfIK/wL8Av8B+QH2Av8B9wHyAv8B8wHuAv8B8AHpAv8B8QHrAf8B8AHl
+ AeQB/wHyAbMBXQH/AbQBTQFAAf0EAANXAboB3wLVAf8B4wLZAf8B3ALTAf8B2wLRAf8B2gLQAf8B1wLO
+ Af8B1QLMAf8B1ALLAf8B0wLKAf8B0QLJAf8BzwLIAf8B0ALJAf8B1wLQAf8DXwH7AzQBVAMyAVADNQFW
+ A1UBtQFmAZABoAH/AaQBwgHaAf8BwwHKAdAB/wHLAb4BuwH/AfMB7gHtAv8B/QL/AYYBqAHhAf8BaQHb
+ AfMB/wHEA/8BtwP/AT4BrQHiAf8BQgFZAW4B9QJXAVwB3wG1ATEBAAL/AckBnwL/AbIBYQL/AWUBAgL/
+ AWUBAgL/AWUBAgL/AWUBAgL/AWUBAgL/AWUBAgL/AWUBAgH/Af4BZQECAf8B/gFlAQIC/wFlAQIC/wFl
+ AQIB/wMqAUADBAEFBAABnQFWASsC/AHSAZ0B/wH0AfMB8Qb/AfwB+wL/AfcB9gL/AfQB8QL/AfIB7QL/
+ Ae4B6AL/Ae4B5wL/AfMB7wH/AewB5QHkAf8B8AGyAV4B/wG0AUwBQAH9BAADTAGSAbcCoQH/AcYCsAH/
+ AcECrAH/AcICrQH/AcMCrgH/AcQCsAH/AcYCswH/AcgCtgH/AcsCuQH/Ac4CvQH/AdECwQH/AdkCywH/
+ AdYCwwH/AWQCVwHxAx0BKggAAywBRAJcAUEB+AHsAeEB3AH/AeYB3QHbAf8B5QLaBf8B3wHZAdMB/wFB
+ AUkBXwH7AUMBqAG0Af0B0QP/AdED/wGNAccB6gH/A04BlAMBAQIBtQExAQAC/wHVAbUC/wHVAbUC/wHV
+ AbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1ATEBAAH/AyoBQAMEAQUIAAGdAVYBKwH8AfsB0gGdAf8B8wHx
+ AfAC/wL+Av8B+QH1Av8B9QHxAv8B8QHtAv8B7gHnAv8B7QHmAv8B7wHpAv8B9gHzAf8B6wLlAf8B8QGz
+ AWAB/wG0AUwBQAH9BAADPQFoAYICfwH+AcoCtQH/AcYCsgH/AcYCswH/AcgCtAH/AcoCtwH/AcsCuQH/
+ Ac0CvAH/AdECwAH/AdMCxAH/AdcCygH/Ad8C0gH/AckCtQH/A1sB4QMMARAMAANKAYwBUwJOAf8BnwKV
+ Af8BtAKzAf8BiAGHAYgB/wNWAbgDQwF3AVUBXAFfAeoB3wH+Av8B5wP/AesD/wFSAW0BhAH3AyQBNgG1
+ ATEBAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/AbUBMQEAAf8BtQExAQAB/wG1ATEBAAH/
+ AbUBMQEAAf8BtQExAQAB/wMdASoDBAEFAwIBAwgAAbEBTAFAAf0B+gHUAaAB/wHyAe8B8AL/Af4D/wH4
+ AfYC/wH1AfEC/wHxAewC/wHvAesC/wHzAe4C/wH1AfMC/wH8AfsB/wHsAuoB/wHgAaUBUwH/AbIBSAE6
+ Af0EAAMmATgDYgH2AcYCsQH/AccCswH/AccCswH/AckCtgH/AcsCuQH/Ac0CvAH/AdACvwH/AdICwwH/
+ AdUCyAH/AdsC0AH/Ad0C0QH/AbACnAH/A1YBwRAAAwEBAgM0AVQDQgF0Az4BbAMxAU8DCwEPAwABAQJZ
+ AVwCyQH5Av8B+wf/AdEB+AH+Af8DWwHIAbUBMQEAFf8BtQExAQAB/wMrAUIDBwEKAwMBBAMDAQQDAgED
+ AwABARAAAdABUgEjAv8B4QGnAf8B9wH6AfMH/wH6A/8B9QL/AfwB8gL/Af4B9gP/AfoD/wH9Bf8B8QH1
+ Ae4B/wHnAbMBXQH/AdMBTAENAf8EAAMQARYDXAHqAcMCrQH/Ac8CuwH/AdACvgH/AdECvwH/AdQCwwH/
+ AdcCxwH/AdsCywH/Ad4C0AH/AeEC1gH/AekC3gH/Ad0CywH/AZgChAH/A0wBkiwAAkgBSQGHATEBXwGP
+ AfsBTQFcAYkB+gFNAVYBhwH6AUkBXwGSAfsBVgFYAWIB7wMBAQIBtQExAQAB/wG1ATEBAAH/AbUBMQEA
+ Af8BtQExAQAB/wG1ATEBAAH/Ax0BKgMEAQUDAgEDIAABVgJUAasBkAFaATIB+wFuAlkB9QFuAlkB9QFu
+ AlkB9QFuAlkB9QFuAVkBTAH1AW4CWQH1AW4CWQH1AW4CWQH1AW4CWQH1AYIBUgFRAfcBkAFWASwB+wFY
+ AlYBuwgAA1EBnAFyAmsB+gGIAnwB+wF5AnIB+gF5AnIB+gF6AnMB+gF7AnQB+gF8AnYB+gF8AncB+gF9
+ AnkB+gGMAokB+wF4AnIB/ANfAeADIQEwGAADIQExA0ABcANQAZ4DKQE/BAADCgEOAxEBFxwAAwQBBQMU
+ ARwDJwE6AywBRAMoAT0DIwE0Ax4BKwMYASIDFAEbAxABFQMMARADCQEMAwQBBgM6AWEDWQHHA1kBzANa
+ AcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDXAHOA1kBwwM0AVUDSgGMA1YBtgNV
+ AbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNWAbYDTgGYFAADXgHZ
+ AcUCsgH/Ac8CuwH/A1gBwAMpAT8DWwHLA10B0gMxAU8YAAMfASwCVwFaAcUCWwFgAdYDVwG/A1ABpANK
+ AYsDQQFyAzgBXQMxAU4DLQFFAygBPQMjATQDGgElA2EB7gPiAf8D3QH/A9oB/wPaAf8D2AH/A9gB/wPX
+ Af8D1wH/A9UB/wPVAf8D1AH/A8gB/wPaAf8DmQH/A1cBvQFUAkAB/QG0AWkBWwH/AbABhgFpAf8BtAGI
+ AYAB/wGyAYgBagH/AbEBhgFqAf8BrgGGAWoB/wGtAYUBagH/AawBhQFpAf8BqgGEAWkB/wGpAYEBaAH/
+ AagBggFpAf8BpgGBAWgB/wGnAYMBggH/AawBaAFiAf8BUgFOAUwB9AgAAzoBYgM4AV4DMgFRA2IB9gHm
+ AtIB/wHnAtgB/wHFArQB/wGdAo4B/wHMAroB/wHgAswB/wN/Af4DNwFbEAADAgEDAk8BUQGcASsB3gL/
+ ATkBswHHAf8BGwGNAa0B/wEKAZYB0QH/ARIBfwGtAf4BQgFZAW0B9QJXAV8B6AJaAV4B1QNXAb8DUgGm
+ A0kBiQM0AVQDfQH3BP8D9AH/A/MB/wPzAf8D8QH/A/AB/wPuAf8D7QH/A+sB/wPsAf8D5wH/A5YB/wPQ
+ Af8DzAH/A1kBwwGmAUYBQAH9AfMB2wHOAf8B4AHRAcYB/wHfAc0BwQH/AdoByQG/Af8B2gHIAb0B/wHa
+ AcUBuwH/AdkBxQG6Af8B2QHFAbgB/wHYAcMBtgH/AdgBwQG0Af8B2AHBAbIB/wHWAb8BsAH/AdgBxAG1
+ Af8B5AG8AagB/wFZAVgBVgHyBAADNQFXAa8CnQH/AbgCpAH/AaUCkwH/AccCtAH/AeEC0QH/Ae0C4QH/
+ AewC3wH/AeMC0gH/AdsCzgH/AfQC6wH/AfEC4gH/AVkCVwHCEAADDgETAVcCXwHoAUsB0wH0Af8BswFm
+ AUYB/wHiAakBhAH/AcEBlAFcAf8BpgGYAWcB/wGCAaMBnQH/AUoBsAHMAf8BLgG4AfYB/wEaAbEC/wEO
+ AZ4C/wEAAUwB0wH/A1EBoANiAfYD+wH/A+oB/wPrAf8D6gH/A+gB/wPnAf8D5gH/A+QB/wPjAf8D5AH/
+ A98B/wOcAf8D0AH/A8QB/wNWAcEBpAFFAUAB/QHvAccBnAH/AcQBpQGCAf8B2QGsAWgB/wHzAbcBagH/
+ AfEBsQFhAf8B8gGtAVoB/wHyAakBUgH/AfIBpAFMAf8B8gGgAUYB/wHyAZwBPwH/AfIBmQE4Af8B8gGV
+ ATIB/wH1AZUBLwH/AfYBkAEoAf8BVgJTAfEDDAEQA2QB5wHMArkB/wHdAssB/wHaAscB/wHYAscB/wHp
+ AtwB/wHxAuYB/wH2AuwB/wH2Au0B/wH2Au0B/wH9AvYB/wHdAtAB/wNhAdwDRQF+AwQBBggAAzgBXAEc
+ AakB9AH/AVUBowG0Af8B5AG0AYsC/wHPAcQC/wHWAb0C/wHcAbYB/wH7AcgBnQH/AeYBswGEAf8BxAGg
+ AWMB/wGfAZsBagH/AWcCqgH/AUQBzgL/AloBXAHNA2UB9gP8Af8D7QH/A+0B/wPsAf8D6gH/A+kB/wPo
+ Af8D5gH/A+UB/wPlAf8D4QH/A9MB/wPqAf8DwQH/A1YBwQGoAUQBQAH9AeYBywGuAf8B0AHcAeMB/wHV
+ Ab0BpgH/Af4BvQGAAv8BvAGAAv8BtgFjAv8BsgFcAv8BrgFVAv8BqQFPAv8BpQFJAv8BogFCAv8BnwE8
+ Av8BnwE4Av8BmQEwAf8BWQJTAfEEAANMAZABzAK6Af8B6QLbAf8B6ALbAf8B7QLgAf8B8gLmAf8B3gLR
+ Af8B0ALDAf8B5QLaAf8B/AL0Af8B/QL3Af8B5wLbAf8B2wLGAf8BsQKeAf8DOgFiBAADAwEEA1YBtgE8
+ Ac8C/wGXAZABgAH/Af0B1QG6Af8B9AG7AbkB/wH9Ad4BvwH/Af4B3QG/Av8B5gHLAv8B5wHLAv8B5wHJ
+ Av8B0QGuAf8B0QGgAU0B/wESAYkB0gH/A0oBigNlAfYD/QH/A+4B/wPuAf8D7QH/A+sB/wPqAf8D6QH/
+ A+cB/wPmAf8D5gH/A+MB/wOiAf8D0wH/A8cB/wNWAcEBpwFEAUAB/QHwAdYBugH/AegB8wH6Af8B4QHK
+ AbQB/wH7AbwBgQL/Ab0BggL/AbcBZgL/AbMBYAL/Aa8BWQL/AasBVAL/AacBTgL/AaQBRwL/AaEBQgL/
+ AaIBPwL/AZwBOQH/AVkCUwHxAxUBHQNIAYQBwAKrAf8B5gLXAf8B7ALgAf8B7wLjAf8DYgHvA0IBdAMs
+ AUQDSAGFAYkCgwH6Af8C/AL/AvsB/wH5AvMB/wHwAuUB/wNTAaoEAAMZASMBQgFZAW8B9QFdAckB6wH/
+ AcgBoAFoAf8B/AHTAdEB/wH2AcsBxQH/AfwB4wHKAf8B/QHgAcoB/wGuAaABgQH/AeIBxQGwAv8B3QHF
+ Af8B9AHJAawB/wH4AdgBqwH/A1oB2wMjATMDZQH2A/0B/wPwAf8D7wH/A+4B/wPsAf8D6wH/A+oB/wPp
+ Af8D5wH/A+kB/wPkAf8DkQH/A80B/wPLAf8DVgHBAaUBRgFAAf0B+wHUAaoB/wHjAcMBogH/Ae8BwAGW
+ Av8BwgGMAv8BvgGFAv8BuQFqAv8BtQFkAv8BsQFdAv8BrgFYAv8BqgFSAv8BpwFMAv8BpAFHAv8BpgFF
+ Av8BoAE+Af8BWQJTAfEDYQHkAcECqwH/Ac0CtgH/AeQC1gH/AfMC6QH/Ac0CvQH/AzQBVQgAAwsBDwFr
+ AmYB8wH/AvoJ/wH9AvYB/wNbAcsDAAEBAkEBQgFzASQBoAH9Af8BlQGwAa0B/wHtAcQBpAH/AfUBxwHV
+ Af8B+AHhAdIC/wHpAdsB/wHPAcMBpwH/ASUBpAE2Af8BSwGRAUIB/wHfAbsBrAH/AfUBywG0Af8B+AHO
+ AaAB/wNKAYoDEwEaA2UB9gP+Af8D8QH/A/EB/wPwAf8D7gH/A+0B/wPsAf8D6gH/A+kB/wPoAf8D5gH/
+ A8sB/wPoAf8DxwH/A1YBwQGoAUcBQAH9AecBygGoAf8BwwG4Aa0B/wHXAbUBlgL/AcUBjwL/AcEBigL/
+ AbwBgwL/AbgBaAL/AbQBYgL/AbIBXAL/Aa4BVwL/AasBUQL/AagBTAL/AakBSwL/AaQBRAH/AVoCUwHx
+ A18B4AHSAr0B/wHiAtIB/wHtAuIB/wH4Au0B/wGEAn8B+QMdASkEAAMUARsDVQGyAdgCxwH/Af4C+wX/
+ AZMCkAH7A1EBoAMoAT0DBAEGAlkBXAHJAVQByAL/AbgBpgGFAf8B+QHWAdMB/wHzAcsB2AH/AfcB6wHe
+ Af8B/AHkAd4B/wGBAbEBYwH/AVUB6AGfAf8BRwHbAY0B/wFLAZYBRQH/AesB1gHLAf8CYQFcAdwDKQE/
+ Aw0BEQNlAfYE/wPzAf8D8gH/A/IB/wPwAf8D7wH/A+0B/wPsAf8D6gH/A+oB/wPoAf8DyAH/A+UB/wPJ
+ Af8DVgHBAagBRgFAAf0B6wHWAb8B/wHkAfMC/wHbAcoBuQH/AfsBwwGNAv8BxAGPAv8BwAGHAv8BvAGC
+ Av8BuQFnAv8BtQFiAv8BsgFcAv8BrgFXAv8BqwFSAv8BrQFRAv8BqAFMAf8BWgJTAfEDUgGhAdQCwgH/
+ AfYC7AH/AfIC6AH/AfcC7gH/AdgCyQH/A2AB1gNXAbgDXwHoAc4CuwH/AewC4Qn/AWoCZAHzAx0BKgQA
+ AygBPAEpAU0BmAH6AZUBzgHiAf8B2AG2AZEB/wH3AdMB7AH/AfMB4AHkAf8B/AHuAewB/wHKAdABuAH/
+ AUYBxgFgAf8BVAG6AV0B/wFRAc8BhAH/AUgB6AGbAf8BRgGZAUIB/wNOAZcDLwFKAxkBIwNoAfYE/wP0
+ Af8D9AH/A/MB/wPxAf8D8AH/A+8B/wPtAf8D7AH/A+0B/wPoAf8DiQH/A8kB/wPQAf8DVgHBAacBSAFA
+ Af0B9gHcAb0B/wHnAeAB2AH/AecBzAGwAf8B/gHHAZUC/wHGAZMC/wHCAYwC/wG+AYcC/wG7AYEC/wG4
+ AWcC/wG0AWIC/wGyAV0C/wGvAVkC/wGxAVgC/wGsAVIB/wFgAlMB8QMcASgDXAHRAW0CawHzAeAC0QH/
+ AfcC7wH/AfkC8QH/AegC2gH/AdwCyQH/Ad8CzwH/AewC4wL/Av4J/wHwAuUB/wNYAcEDAQECAk8BUAGb
+ ATQBngL/AbUBvgGqAf8B8gHOAb4B/wH3AdMB7wH/AfwB8wHxAv8B8QH0Af8BVAG6AVUB/wFPAboBVgH/
+ AesB3gHYAf8ByAHSAbkB/wFZAcoBYwH/AT4B7gGVAf8BWQFdAVkB1wM3AVoDKQE/A2gB9gT/A/YB/wP1
+ Af8D9QH/A/MB/wPyAf8D8AH/A+8B/wPtAf8D7QH/A+oB/wOwAf8D3AH/A88B/wNWAcEBqAFJAUAB/QH1
+ AdcBsAH/AdQBtgGYAf8B6AG/AZkC/wHOAZ4C/wHIAZgC/wHFAZEC/wHBAYwC/wG+AYYC/wG7AYEC/wG3
+ AWcC/wG1AWMC/wGyAV8C/wG1AV4C/wGxAVgB/wFgAlMB8QQAAwgBCwNhAdwB0AK7Af8B9QLsAf8B/QL4
+ Bv8C/QL/Av4J/wH0Au0B/wH9AvsB/wHdAtMB/wNAAW4EAAJOAWYB8AGHAc4B/QH/Ac4BuQGSAv8B3QHx
+ Af8B/AHeAe4B/wHeAdsB1AH/AeYC2wH/AcQB0gG2Af8B8QHqAeMC/wHzAfUC/wH3Ae4B/wN/Af4DVQG6
+ AU0BmQFQAfoBWQFdAVkB1wMwAU0DaAH2BP8D9wH/A/YB/wP2Af8D9AH/A/MB/wPxAf8D8AH/A+4B/wPt
+ Af8D6wH/A+IB/wP0Af8DzAH/A1YBwQGoAUkBQAH9AeYB1AG8Af8B0gHaAeAB/wHVAcQBsQH/AfwBzQGd
+ Av8BywGcAv8BxwGVAv8BwwGRAv8BwQGLAv8BvgGGAv8BuwGCAv8BuAFpAv8BtgFkAv8BuAFkAv8BtAFe
+ Af8BYAJTAfEIAANVAbAB3ALLAv8C/QH/AfwC9QH/AesC4QH/AfoC9gn/AWkCZwHyA0QBeQNUAa4DSgGM
+ CAACXQFhAeIBvAHjAeQB/wHpAccBkgH/Ae4B1wHQAf8BSgGcAT0B/wEFAYoBAAH/AQQBgAEAAf8BQQGD
+ ASsB/wHvAd0BzgL/AfIB4AH/AecB4QHCAf8CWQFdAdIDGwEmAyIBMgNbAcgBWAFbAVgBxgNoAfYE/wP5
+ Af8D+AH/A/gB/wP2Af8D9AH/A/MB/wPyAf8D8AH/A/EB/wPtAf8DnQH/A9IB/wPSAf8DVgHBAagBSQFA
+ Af0B8AHhAc0B/wHmAfEB+QH/Ad8B0wHDAf8B/AHSAaUC/wHSAaUC/wHOAZ8C/wHLAZkC/wHIAZQC/wHE
+ AZAC/wHCAYsC/wHAAYcC/wG9AYIC/wG+AYQC/wG8AWcB/wFgAlMB8QgAAxIBGQNSAaMB2wLNAf8DYQHi
+ A0ABbgNkAecB/wL+Af8B/AL5Af8DXAHJFAADLQFFA1UBsgFaAl0BygFZAmQB7AE8AcoBNwH/AT4B3QE8
+ Af8BMQHYASsB/wENAYwBHQH/AY0BrAHFAf8BqgHMAdcB/wFZAmQB7AMxAU8DCAELAwABAQMCAQMDHwEs
+ A2sB9gT/A/sB/wP5Af8D+AH/A/YB/wP0Af8D8wH/A/IB/wPxAf8D8QH/A+0B/wOWAf8DzwH/A9QB/wNX
+ AcIBiQFxAU0B/gH/AfIBzQH/AfoB3gHFAv8B2wG4Av8B4AGyAv8B3gGtAv8B2QGmAv8B1gGiAv8B0wGc
+ Av8BzwGYAv8BzQGUAv8BywGQAv8ByAGMAv8BywGMAv8BxgGHAf8BXwJMAfMQAAMyAVADHwEsBAADSgGJ
+ A2EB4gNWAbEDNQFXIAADIAEuA1sBwwFtAYcBbQH3AVwBYAFcAdQDPQFpAz4BawJBAUIBcwMfAS0DBAEF
+ AwABAQwAA3wB+Bz/A/4B/wP9Af8D/QH/A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFYAVMB8gFuAk0B+gFs
+ AU0BMQH6AWwBTQEyAfoBawFNATIB+gFqAU0BMQH6AWoBTQEvAfoBaQFNAS4B+gFpAU0BLAH6AWgBTQEq
+ AfoBaAFNASoB+gFoAU0BKQH6AWgBTQEpAfoBagFDAUEB+QFqAisB/ANbAdmAAANbAcsDmQH+A6sB/QOr
+ Af0DqwH9A6sB/QOrAf0DqwH9A6sB/QOrAf0DqwH9A6sB/QOtAf0DpAH+A2IB9QM7AWVMAANWAbMDUgGp
+ AzUBWAMtAUUDHAEnAxcBIAM7AWUBWgJfAdsDQQFzAxoBJAMEAQYYAAMVAR0DQgF2A1UBsgNXAcIDVgHB
+ A1QBqwM+AWsDDwEUHAADEAEWA1sByANkAfEDYgHvA2IB7wNiAe8DYgHvA2cB8gNaAdMDFAEbFAADVgGz
+ AWcCWQHyA18B4ANWAbYDRAF5AygBPAMNARIoAANSAakBAAGWAe0B/wFbAl4B0ANEAXsDNQFWAk8BUQGc
+ AT8BegGJAfcBQgFrAXMB9QM8AWYDKQE+AxcBIAMKAQ0DAgEDDAADQwF3AVwCVQHqAZMBewF6Af4B2gGg
+ AZ0B/wHiAbUBrQH/Ad4BrQGlAf8BywGRAYoB/wFvATQBMwH8A1wB3AM4AV0YAAMEAQYDYAHrA/oB/wPw
+ Af8D8AH/A+8B/wPyAf8D8gH/A1cB3xQAASwCKwFDAYcCagH5Af8B4wHUAf8B7wHAAbMB/wHQAZsBkwH/
+ AX8BawFpAf4BXAFEAUUB+ANaAeQDVwG/A0gBhgMvAUoDEAEWGAADMQFOAQABVAHqAf8BAAEgAfQB/wFU
+ AmEB7gFbAl4B2QEAAYMC/wEAASMB8QH/AVMCZAHxA1MBqgNBAXIDMQFPAyEBMQMNARIIAANQAaMBqAJX
+ Af0B+wLkAv8B6QHmAv8B2QHPAv8B6QHZAv8B6AHWAv8B5wHVAv8B2gHKAf8B3AGaAZEB/wFcAj4B+ANF
+ AX8IAAMEAQYDKgFBAz8BbQNKAYsDWQHrA70B/wO/Af8DvAH/A70B/wO+Af8DrQH/A14B5QNNAZYDQgF2
+ AzABTQMUARsEAAFJAkgBhwHfAawBpQL/AdwBxQL/AdcBwQL/Ad8BzQL/AeEB0wL/AdsB0AH/AfQByAG/
+ Af8B2QGkAZ4B/wGuAV8BXAH/AV8BRAFDAfsDWQHrA1kBxwNOAZQDJQE3CwABAQMOARMBWAJhAeYBAAEQ
+ AfcB/wEAASMC/wEAAUcC/wEAAQcB+AH/AQABWgH4Af8BuQHLAbUC/wHeAa8B/wFpAmQB8QNQAaQDNgFZ
+ AyIBMgQAA0sBkAGqAn8B/gX/Af4B/AL/AekB5wL/Ac0BwwL/AdgByQL/AdoByQL/AdcBxgL/AdoBxwL/
+ AeUB0QH/AfQBtQGnAf8BXAI+AfgDOAFcBAADWgHNA3EB/AG3AbgBuQH/AdAB0QHSAf8BzgHPAdAB/wHa
+ AdsB3AH/AuUB5gH/AeIB4wHkAf8B4gHjAeQB/wHjAuUB/wLlAecB/wHMAdEBzwH/AbsBvwG9Af8CrAGt
+ Af8DbAH8A1kB0gQAA1sByAHyAc0BxAL/AdsBzQL/AdYBzAL/AdkB0QL/AdoB1AL/Ad0B1gL/AeIB2QL/
+ AecB3QL/AegB3gL/Ad8B1AH/AfoBzAHBAf8B4wGtAaYB/wGjAUMBQgH/A1UBsgQAAwIBAwMLAQ8DHQEq
+ AVsCYAHWARkBVQH9Af8BTgFWAf0B/wFAAUsB/AH/AR0BMQH8Af8BAQGUAfUB/wHEAcMBpQL/AdsBpQL/
+ Ae8BxwH/AewBvgGVAf8DUQGnAzMBUgMqAUEBhAJlAfkB/wHwAe8C/wH7AfkC/wHwAe8C/wHvAe4C/wHZ
+ AdEC/wHcAcwC/wHgAc4C/wHYAccC/wHTAcEC/wHUAcEC/wHjAcwB/wHcAZQBhwH/A1wB3AMQARYDrwH9
+ AvgB9wH/AdUB0QHOAf8B0wHQAc0B/wHSAdABzQH/AdEBzwHMAf8BxgHEAcIB/wG3AbYBswH/Ab4BvAG7
+ Af8CzQHLAf8C0QHPAf8BzwHRAc4B/wHOAc8BzQH/A9kF/wNfAfMDHAEoAWECXQHwAf8B4QHaAv8B4AHc
+ Av8B4QHfAv8C4wL/AuUC/wLnAv8C5QL/AeEB4AL/Ad0B2wL/AdsB1QL/Ad0B0AL/AewB3QH/AcYBggFp
+ Af8DTwGbBAADCQEMAzABSwFcAmAB1AEoAZoB/AH/AaUBsAH+Af8BnQGrAf0B/wFlAY0B/AH/AUcBWgH7
+ Af8BEAE9AfkB/wEHAYEB5gH/AZ4BrgGhAf8B/gG+AYMC/wHjAbAB/wGEAW0BaAH3A0UBfQFVAlMBsAHx
+ AbsBuQL/AdwB1wL/AdsB2AL/Ae4B7QL/AfcB9QL/AdQB0QL/AbkBsgL/AcYBuwL/AdgBxwL/AdYBxAL/
+ AdIBvgL/AdYBwQL/AdABugH/AY8CQAH9Az4BawGSApMB+wG7AbABpgH/AbABYQEwAf8BxgGIAUIB/wHG
+ AYABPQH/AcYBZQE4Af8BxAFhATIB/wHEAVsBLQH/AcQBVgEpAf8BwgFRASMB/wHCAUsBHQH/AcIBRwEa
+ Af8BwQE/AREB/wGZATUBFAH/AdIB1AHWAf8DXQHwAT4CPQFqAaUCfwH+Af8B7AHrAv8B5wHoAv8C7gL/
+ AvcB/wH+AvgB/wH8AvMB/wH+AvUC/wHvAe4C/wHqAesC/wLlAv8B5gHiAv8B0gHNAf8BagJBAfkDMAFL
+ BAADQgF2AT8BYgF1AfYBEwFgAv8BjgGmAv8BjAGlAv8BjAGaAf0B/wFiAYgB/AH/ATkBVQH9Af8BGAE+
+ Av8BAAEgAv8BAAFQAfIB/wFIAaQBvAH/AcMBhAE+Af8BywFkASkB/wNWAcEDYgHpAf8B7wHpAv8B5AHc
+ Av8B0gHLAv8B2QHSAv8BywHKAf8B/QGqAa8B/wH+AcABwwH/Af0BrgG0Af8B/gGvAasC/wHWAcMC/wHT
+ Ab8C/wHQAbwC/wHaAcMB/wHMAYYBZAH/A1MBrQGRAZIBkwH7Ab0BrwGhAf8B5gGiAVcC/wG8AYcC/wGu
+ AWUC/wGlAVwC/wGcAVMC/wGUAUwB/wH+AYwBQwH/Af0BhQE6Af8B/QFoATMB/wH8AWEBLAL/AVkBIQH/
+ AcABQgEVAf8BzALQAf8DXQHwAVYCVAGrAfAByQHIAv8C+gL/AfwB/QH/Af4C+gH/AfQB5QHmAf8B5gG+
+ Ab0B/wHdAZgBkwH/Ae8B0gHQBv8B9AH1Av8B8AHvAv8B9AH1Af8B8AK8Af8DWwHhAw8BFAQAAVgCWwHL
+ AVsCYAHWAUIBYgFvAfUBGgGJAcoB/wEIAZUB6QH/AUYBigH+Af8BWgFnAfwB/wENAYsB+QH/AS4BpgHg
+ Af8BHQGLAc4B/wEVAYABxQH/AR4BpgHaAf8BrwGHAVEB/wHfAZcBQAH/Al8BVwHoAYkCagH5Af8B9wHu
+ Av8B6wHiAv8B6QHeAv8B2AHNAv8BqQGqAf8B4gG2AboB/wGnAlUB/QGkAYEBggH+Af0BrgGzAv8BwQG1
+ Av8B1gHCAv8BzwG7Av8B2QHCAf8B3wGeAY4B/wNXAcIBkQGSAZMB+wG9Aa8BowH/AeEBoAFXAv8BuQGH
+ Af8B+QGsAWYB/wH4AaQBXgH/AfgBnQFWAf8B9gGWAU8B/wH2AY4BRwH/AfUBiAFBAf8B9AGBAToB/wHz
+ AWcBMwH/Af0BYAEqAf8BvQFHAR0B/wHNAtAB/wNdAfADXwHjAfwB5wHmAf8B+gHoAeUB/wHmAcEBvAH/
+ AdIBmQGWAf8ByAFqAWgB/wHKAWYBZAH/Ac8BZQFgAf8B0wGDAWcB/wHyAd0B2gb/AvgC/wL+Af8B0gGR
+ AZAB/wNTAbAQAAJdAVoBygGEASIBAAH/AT8BRQE/Af8BGgGLAv8BKwFWAv8BPwGYAcgB/wHvAZwBPgH/
+ AYYBKgEAAf8BagEkAQAB/wGUATIBAAH/AdsBjAEtAf8B1wGVAT8B/wFsAV8BTAHzAZIBYgFfAfsB/wH1
+ Ae0C/wHoAd8C/wHqAd8C/wHYAc4C/wGzAbYB/wHSAbIBswH/AVICQAH3AacCVQL9AcABxQL/AbgBrgL/
+ AdcBwQL/Ac8BuwL/AdgBwgH/AeIBogGSAf8DVwHCAZEBkgGTAfsBvAGvAaMB/wHiAaMBWwL/Ab0BiwH/
+ AfoBsQGAAf8B+QGpAWIB/wH5AaIBWwH/AfgBmwFUAf8B9wGUAU0B/wH2AY4BRwH/AfYBiAFAAf8B9QGC
+ ATkB/wH9AWkBMwH/Ab4BTgEiAf8BzQLQAf8DXQHwAYQCbQH3Ad0BnwGcAf8BsgFMAUoB/wGjATgBNwH/
+ AaYBPQE8Af8BsAFLAUoB/wG4AVYBVQH/Ab8BXwFeAf8BwAFZAVYB/wHOAWkBYgH/AfcB3wHZBv8B9QHz
+ Af8BowFCAUAB/QM9AWoQAAJZAVcBvwGeAUYBCAH/Ab4BhwE7Af8BGAGFAfMB/wEAAUkB/QH/AUYBTwFQ
+ Af8BiwE4AQUB/wFgASoBAAH/AVYBHgEAAf8BVwEcAQAB/wGAAS0BAAH/AY0BPAEFAf8BYAJZAesBbgJZ
+ AfUB/wH0Ae0C/wHqAeEC/wHnAdwC/wHjAdsC/wGwAbIB/wHuAbIBtgH/AdIBsgGzAf8B4gG3AbkB/wH9
+ AagBrQL/AcsBxAL/AdQBwwL/Ac8BugL/AdsBxAH/AdsBlwGKAf8DVQGxAZEBkgGTAfsBuwGuAaIB/wHj
+ AaYBXgL/AcIBkAH/AfsBtQGEAf8B+gGuAWgB/wH5AacBYAH/AfgBoQFaAf8B+AGaAVMB/wH3AZUBTgH/
+ AfYBjgFHAf8B9gGJAUEB/wH+AYYBOwH/Ab8BUgEnAf8BzQLOAf8DXQHwA1cBugHhAbMBtQH/AeEBoQGl
+ Af8BzgGHAYgB/wG9AV0BXwH/Aa0CTAH/AaUCQQH/AaQCPwH/AakBRgFFAf8BqgFBAUAB/wHJAWQBYAH/
+ Af0B7AHqAv8B4QHcAf8BZAJTAfEDHAEoEAACSQFIAYgBzwGIASwC/wHGAWoB/wFJAaUB6QH/AQABgwH0
+ Af8BrgGcAZEB/wG9AaABgwH/Ab0BpAGKAf8BtQGYAWcB/wGdAWIBPQH/AVcBIwEAAf8BhAEvAQAB/wFb
+ AlkBxAFeAloB2AH4AeQB3gL/AfAB5gL/AeMB3AL/AeUB4QL/AdcB1QL/Aa8BsgL/AbIBtwL/Aa0BsQL/
+ AcoBzAL/AeUB5AL/AdgB0wL/AcoBvAL/AdEBvAH/AZQBdAFqAf4DQgF2AZEBkgGTAfsBuwGuAaIB/wHj
+ AasBYgL/AccBlQH/AfsBugGJAf8B+wG1AYMB/wH6Aa4BZwH/AfkBqAFhAf8B+QGgAVoB/wH4AZwBVQH/
+ AfcBlQFOAf8B9gGRAUkB/wH+AY8BRAH/Ab4BVwEtAf8BzAHOAc0B/wNdAfADGAEhA2QB7AH/AeYB6QL/
+ AdQB1wH/Af0BygHNAf8B9QG9AcAB/wHlAacBqgH/AdIBjgGPAf8BvwJhAf8BsAFPAVAB/wGhATUBNgH/
+ AdABigGIAf8B6QGjAZ0B/wNZAcwUAAMcASgBjAFrAU0B+gH3AdMBrQH/AbMBzgHvAf8BWwGxAfcB/wH+
+ AfMB5wH/AegB0QG6Af8B6QHQAbcB/wHrAdEBuAH/AeYBzAG0Af8B1wG0AY4B/wGTAXIBMwH+AzsBZAFJ
+ AkgBhwHdAawBpgL/AfkB8gL/AeUB4gL/AeMB4AL/AeYB4gL/AeMB3wL/AdQB0gL/AdsB2QL/AesB6gL/
+ AegB5wL/AuYC/wHjAd8B/wH9AbcBqwH/AWACWQHrAxQBGwGRAZIBkwH7AbsBrgGiAf8B4wGwAWYC/wHM
+ AZsB/wH8Ab8BjgH/AfsBugGIAf8B+gGzAYEB/wH6Aa0BZgH/AfkBpgFgAf8B+AGjAVsB/wH4AZ0BVQH/
+ AfcBmQFRAf8B/gGXAU0B/wG+AV0BMQH/AcsBzQHMAf8DXQHwBAADOwFlAbQCqAH9Af8B7QHvAv8B3AHe
+ Av8B2gHdAv8B2AHcAv8B1QHYAv8BzQHQAf8B+wHDAccB/wHuAbsBvwH/AeABnAGdAf8BfwJHAfkDPAFo
+ GAADRAF6AfIBxgGbAf8B/QHqAdgC/wHuAeEB/wH+AfsB8wH/AfcB5AHTAf8B8wHYAcEB/wHzAdwBxQH/
+ AfgB5wHTAf8B+AHFAZMB/wNRAaADEAEWAw8BFAFhAlsB4QHzAd0B1wL/Af0B+gL/AesB6AL/AekB5QL/
+ AesB5gL/AewB5wL/AeYB4wL/AeoB6QL/Ae4B7QL/AfcB9gL/Af4B/QH/AaoBUQFQAf0DQwF3BAABkQGS
+ AZMB+wG7Aa4BoAH/AegBuQGEAv8B2AGnAv8BywGaAv8BxQGUAv8BvgGMAv8BuQGHAv8BswGBAv8BrgFn
+ Af8B/gGoAWEB/wH+AaQBXQL/AaQBWQH/AcIBZAE3Af8BywHMAcsB/wNdAfAIAANYAbwB8wLoAv8B9wH5
+ Av8B5wHqAv8B4wHmAv8B5AHnAv8B7QHwAv8B5AHmAf8BrwGhAaIB/QFcAlkByQMvAUogAAJHAUYBgAGQ
+ AX8BdwH4Af4B9QHqAv8B/QH4Av8B/AH4Af8B/gH4AfEB/wH+AfUB6QH/Aa0BjwF1AfwDUAGdAw0BEgMD
+ AQQEAAMpAT8BYwJdAfAB8wHiAd8G/wH5AfcC/wH0Ae8C/wHyAe0C/wHtAekC/wH0AfIG/wL4Af8BqQJ/
+ Af4DUQGiCAABkgGTAZQB+wGzAacBmgH/AcwBnAFOAf8B5gG5AYIB/wHlAa4BYwH/AeUBqAFeAf8B5AGj
+ AVkB/wHkAZ4BVAH/AeMBmgFQAf8B4gGWAUsB/wHiAZIBRwH/AeEBjgFDAf8B5AGOAUAB/wGpAVMBJgH/
+ AskBygH/A10B8AgAAxYBHwFjAmAB6wz/Af4B9gH3Af8BrgGKAYsB/gFdAloB0wExAjABTSwAAyoBQQJW
+ AVUBtAFnAWMBXQHwAewByQGuAf8BbwFoAWcB8gJaAVcBvQE1AjQBVQMHAQkDAQECDAADKgFBAWECXQHi
+ Ad0BrwGuAf8B9wHpAegC/wH9AfgD/wH7Av8B+AHzAv8B8AHtAf8B7ALKAf8BgAJtAfcDSwGODAABsAKx
+ Af0B2wHYAdYB/wG0AaQBlQH/AbsBqgGZAf8BugGqAZoB/wG6AakBmgH/AboBqAGaAf8BuQGoAZkB/wG5
+ AagBmgH/AbkBpwGYAf8BuQGoAZkB/wG4AacBmAH/AbgBpAGWAf8BsgGlAZoB/wLtAe4B/wNfAfMMAANA
+ AW4BtAKrAf0E/wGwApcB/gFdAlkB1wM3AVpoAAMQARYBSQJIAYgBYAJbAdYBbQJlAfQBkgJfAfsBiQJq
+ AfkDXwHoAVYCVQGxAyoBQRAAA2UB5QOUAfsBiQGMAY8B+gGJAYwBjwH6AYkBjAGPAfoBiQGMAY8B+gGJ
+ AYwBjwH6AYkBjAGPAfoBiQGMAY8B+gGJAYwBjwH6AYkBjAGPAfoBiQGMAY8B+gGHAYwBjQH6AYkBjAGP
+ AfoDmgH8A1wByQwAAwEBAgNXAbgDZQHlAT0CPAFoAwMBBDQAAwgBCwJTAVUBsAJMAXAB8wJMAXAB8wJT
+ AVUBsAMIAQuoAAMQARYDOgFhA1UBtANLAY4DAwEEIAADBAEGAwIBAwQAAwEBAgNQAZ0CLgL/AgAB9AH/
+ A1ABnQMBAQIEAAMCAQMDBAEGJAADPQFpA10B1wNSAaFgAAMJAQwDNwFaA1QBqwNcAeoDqAH9AeUC4QH/
+ A38B/gNVAbEDDQESGAADJQE3A0gBhAwAA0IBdAIfAfAB/wIAAc0B/wNCAXQMAAJHAUgBgwMmATgcAAMD
+ AQQDXgHZAbkCtAH/A14B1QMBAQIYAAMNARIDHgErAwMBBAMWAR4CWAFZAd0CVQFcAeoDQgF0AxEBFwMc
+ ASgDNwFaA0QBewMoAT0MAAMpAT4DVAGuA1wB6gKoAacB/QHdAtcB/wH5AfcB+AH/Af4D/wH6Af4G/wGv
+ AqgB/wNZAc8DGQEjEAADDAEQAlEBUgGnAzsBZAMkATUDAAEBBAADOQFfAgABxwH/AgABqwH/AzkBXwcA
+ AQEDJAE1AzsBYwJRAVIBpwMMARAYAANVAbIBogKbAf8BvQK4Af8DSwGOAwABARgAA1cBvQJOAV0B8ANH
+ AYIDIAEuAUUBUgFlAfQBAAGIAfQB/wEAAUMBpgH/A1kBzAFfAlcB6AGZAUcBRgH/AbQCVwH/AVkCWAHy
+ AzgBXggAAWoCZwH1Ad8C0wH/AfoB8QHyBf8B+AH2AfgB/wH3AfUB9gH/AfMB6AHgAf8B8QHLAaoB/wHx
+ AdsBxQX/AccCwgH/A10B4gMtAUYMAAM+AWsDRAF6A0QBeQNCAXQDAAEBBAADMAFLAiEBhAH7AiEBagH7
+ AzABSwcAAQEDQgF1A0QBeQNEAXoDPgFrFAADLQFFAW4CbAH6AccCwQH/A2EB5gMNARIcAAFKAVIBZAH0
+ AQABjAH8Af8BAAFHAawB/wNYAcYBWwJYAekBhQGBAZUB/wEhAb0B/QH/AQABnwHgAf8BnQGSAbEC/wG7
+ AbcB/wH+AasBqgH/AcsBVAFWAf8BYAJBAfkDMAFNBAAB4QLTBf8B/gH9AfsC/wH7AfMB/wH+AfYB5gH/
+ AfsB5AHAAf8B/AHMAZAC/wG0AUoB/wH3AaIBPAH/AeoBxQGrAf8B/QP/AtUB2AH/A1MB8QM6AWIIAANQ
+ AZ0DNQFWA0oBjAM0AVQDPwFtBAADFQEdAloBYQHkAloBYQHkAxUBHQQAAz8BbQM1AVUDSgGMAzUBVQJP
+ AVEBnA8AAQEDOwFkA2EB7gG7ArQB/wG6ArUB/wM6AWIEAAMDAQQDTAGPA0MBdwMbASYMAAMwAU0CVAFh
+ Ae4BIQG1AfYB/wEAAZUB4gH/AWUBgwGnAv8BuwGvAf8B5AHKAccB/wFWAdUB7wH/AYsBrgHKAf8B/gGq
+ AacB/wHwAo4B/wHsAYQBiAH/AcwBWQFcAf8DWwHZBAADVgGrAY8CiQH6AfsB+gHqA/8B3gL/AfcBywL/
+ AeEBpwL/AckBhAL/AbQBTQH/AfcBnAEyAf8B5gGDASUB/wHeAaUBhwH/AfYB9wH6Af8B5QHmAekB/wFf
+ AlgB+QNKAYoDBAEGA0oBigM+AWoDQgF2A0sBjgMyAVAEAAMlATcCWQFgAesCWQFgAesDJQE3BAADMQFP
+ A0wBjwNCAXYDPgFqAkgBSQGICAADDQERA1sBwwGcApYB/wG9ArcB/wHGAr8B/wNaAb0DBAEGA0oBiwNa
+ AcUBtwKxAf8BvwK4Af8DPwFtDAADFAEcAWECWwHhAfYB1wHTAf8BWAHhAfkB/wFSAcUB5wH/AfUBxwHF
+ Av8BwwG7Av8BsgGuAf8B/gGuAa0B/wH7AbEBtAH/Ae8BqwGkAf8B3wGQAYoB/wHoAYMBhAH/AY8BQAFB
+ Af8IAAMpAT8DXAHPAbUBqQGeAf4B/wHsAcsC/wHaAZ0C/wHBAWAB/wH9Aa0BRAH/AfIBmQE3Af8B5AGD
+ ASoB/wHUAVEBEwH/AdABgAFMAf8B6wHfAd4B/wLpAesB/wFRAksB/QNLAZACRAFFAXwDPQFnAz0BZwNP
+ AZcDEgEZAwoBDQJXAVkBwgIAAdMB/wIAAaEB/wJXAVkBwgMKAQ0DEgEZA04BlgM9AWcDPgFqA0IBdAQA
+ AwQBBQNUAawBsAKnAf8BxAK8Af8BwAK4Af8BuAKyAf8DWwHDA14B0AGpAqQB/wHIAsIB/wHJAsIB/wNf
+ AeMDFAEcDAADHAEoAX8BbgFwAf4B/wHkAd4B/wH+AdcB0AH/AfgBxgHEAv8BwQHDAv8BxwHKAv8B0gHT
+ Av8C3gL/AeMB4gL/AdwB1wH/AfEBtgGuAf8BxQFlAV4B/wNfAeAQAAM+AWoDZQHlAeIBxgGyAv8BvwFp
+ Av8BpQE3Af8B7gGRAS8B/wHgAWkBKQH/AdMBUgEaAf8BwwEwAQAB/wG8ATkBHAH/AeEBvQG5Af8B3wHU
+ AdYB/wNbAdADRAF7Az0BZwM9AWcDTwGXAxIBGAMOARMCWgFhAeQBDwEhAv8CAAH0Af8CWgFhAeQDDgET
+ AxEBFwNOAZYDPQFnAj0BPgFqA0IBdAQAAzMBUgGmAp0B/wHDArcB/wHJAsYB/wPTAf8B1wLVAf8BoQKW
+ Af8BvAK1Af8ByQHCAcEB/wGEAoEB+QNNAZEDEgEYEAADBAEGAUoCSQGJAYwBfwGAAfsB9gLVAv8B7gHt
+ Av8B/QH8Bv8B/AH5Av8B8AHtAv8B4AHbAf8B8wHIAcIB/wHTAaEBnAH/AYUBUQFOAf8DOAFcFAADBAEG
+ A0wBkwFnAmUB9AHtAa8BigH/AfABjQE3Af8B3gFgASMB/wHQAVUBKgH/AcQBUgE1Af8BtwFLATkB/wG8
+ AYUBagH/AbgBqAGqAf8DVQG0A0oBigM9AWkDQgF2A0wBjwMsAUMEAAM7AWUCTAFtAfMCTAFsAfMDOwFl
+ BAADKwFCA0wBjwNCAXYCPQE+AWoCSQFKAYkEAANWAbMBvQKyAf8BuwKyAf8ByALGAf8B4gLjAf8B4ALd
+ Af8BqAKeAf8BjQKJAfsDVAGmAxoBJR8AAQEDMQFOA1YBswNkAewByQG3AbEB/wHRAbwBtwH/Ac0BtQGv
+ Af8BjwGHAYUB+wNdAdIDZwHyAdYBygHJAf8BtQGxAbIB/wM5AV8cAAMaASUDWwHGAcUBnwGUAf8BywGc
+ AY0B/wG8AZ8BnQH/AbYBpAGlAf8BtgGpAasB/wG2AaYBpwH/AV8CUgH0AyUBNwJPAVEBnAM1AVUDSgGL
+ AzIBUANSAaMDEQEXBAADFgEeAxYBHgQAAxEBFwNSAaQDMgFRA0oBiwM1AVYDUAGdBAADXAHfAbkBrgGs
+ Af8BiAFlAWYB/wGlApsB/wHsAusB/wG4Aq4B/wGpAZ4BmgH/AUIBWQFnAfUDQgF0AzMBUwI8AT0BaAMj
+ ATQDMwFTGAADAQECAxYBHwMiATIDKAE8AyYBOQMmATkDIwEzA2AB3gT/AcoCwwH/AzYBWSAAA1kBxwG5
+ Aa0BsAH/Ab0BsgG2Af8BugGuAbAB/wG7AqwB/wHIArYB/wN/Af4DQgF2BAADPgFrA0QBeQNDAXgDQgFz
+ AzkBXwNSAaMDLgFHAxEBFwMRARcDLgFHA1EBogM6AWADQgFzA0QBeQNEAXoDPgFrBAADFgEfA1wBzwGL
+ AWUBYwH/AbMCpgH/AbsCswH/Ab4BtQG0Af8BxAGuAasB/wEMAasByQH/AQABywH8Af8BAAGsAewB/wEA
+ AbMB8AH/AQABlAHdAf8BAAGeAecB/wNOAZkMAAMCAQMDFQEdAxYBHwMWAR4DGwEmAyMBNAM1AVcDTwGX
+ A10B1wHCAsAB/gHqAuUB/wNbAcYDDgETHAADVAGrAcICswH/AdACwwH/AckCvAH/AcgCvAH/AdECxAH/
+ AboCrQH/A1cBvQgAAwwBEAJSAVQBpgM0AVQCRwFIAYMDRAF6AzQBVANMAY8DTwGXA08BlwNMAY8DNAFU
+ A0QBegJHAUgBgwI0ATUBVQJRAVIBpwMMARAIAANQAZ0BowGdAZkB/wGkAZIBkAH/AaYBkwGSAf8BtAGr
+ AakB/wEyAbABvQH/AQoB0wHvAf8BDQHWAfMB/wEMAdUB9AH/AQ0B0QHzAf8BDgHVAfYB/wEIAbIB5AH/
+ AlMBVAGsDAADCgENA1cBuANcAeoDYQHuAawBpAGiAf0B0gG4AbYB/wHgAcsBygH/Ae0B2QHaAf8B4gLW
+ Af8DYgHpA04BlgMWAR4cAANCAXYBlAKHAf4B3wLWAf8B1ALLAf8B1ALLAf8B2gLRAf8B2gLPAf8BYgJZ
+ AewDEgEZDAADIwEzA1IBqQI0ATUBVQNDAXcDSgGLA0IBdgM9AWcDPQFoA0IBdgNKAYsDQwF3AzUBVgNS
+ AakDIgEyDAADUAGaAWUBowG2Af8BmwGtAbAB/wGSAcIBwwH/AYEB4gHjAf8BKwF2AaMB/ANAAXEDOwFk
+ AzoBYgM6AWEDOgFhAzIBUBQAA0MBeANiAe8BbQJkAfEDZAHnA2EB2gNbAcQDTgGVAzoBYAMdASoDAQEC
+ HAADKQE+AYECfQH5AfAC7AH/AeMC3wH/AeUC4QH/AekC5gH/AfIC7QH/AX8CYgH7AzYBWRQAAyMBNAJR
+ AVIBpwNEAXsDNQFWAz0BaQI8AT0BZwI8AT0BZwI9AT4BagM1AVcDRAF7AlEBUgGnAyMBNBAAAxwBJwJH
+ AUgBgwFaAl0BygFYAmIB7wFaAl0BygNIAYZsAAMhATADZAHsBP8D+AH/AfQC8wH/AewC6gH/AekC5gH/
+ Ab8CtwH/A08BnBwAAw8BFAM+AWsDUAGdA0oBigNEAXsDRAF7AkkBSgGJAk8BUQGcAj0BPgFqAw8BFJgA
+ A0ABcQGJAocB+QFpAmgB8gNhAeYDYAHWA1gBwQNUAa4DRgF/AwMBBDAAAxEBFwNIAYgDVwG/A1YBwQNM
+ AZMDGwEm2AADBgEIAzEBTwNCAXYDSAGHAlcBXAHfAgABsgH/AgABywH/AgABygH/AgwBmAH/A1wB3AMo
+ ATxYAAMHAQoDRAF6A1IBqQNFAX0DJgE4AwoBDhQAAz8BbgNWAcEDVwG/A1YBvgNWAb4DVgG+A1YBvgNW
+ Ab4DVgG+A1YBvgNWAb4DVgG+A1YBvgNYAcADVgG+AzkBXwwAAz4BawFcAlcB3wF7AU0BSQH6AaIBfQE9
+ Af4BVAE0AW8B/gIAAdQB/wEeAR8B7wH/ASIBIwH3Af8BPAE7Av8BTQFGAv8BKQEoAcAB/wNcAc4DCgEO
+ AV0CWQHXAW4BZAFSAfcCYgFbAfYCYgFeAfYCYgFbAfYCYgFZAfYCYgFaAfYCYgFYAfYCYgFJAfYCYgFJ
+ AfYCYgFJAfYCYgFJAfYCYgFJAfYCYgFJAfYBegFlAVEB9wFeAlsB2RQAAVUCUwGwAeUBpgFAAf8B7gHI
+ AZcB/wGRAX8BWwH+AW0BUgFOAfcDVwHfA1QBqwM+AWsDIwEzAwQBBgQAA2IB9gHZAtMB/wHJArgB/wG4
+ Ap8B/wG8AqIB/wHEAqkB/wG+AqQB/wG8AqoB/wHJAsEB/wHSAswB/wHHAr0B/wHFArAB/wHeAsAB/wHk
+ AsUB/wHCApMB/wNXAcUEAAMDAQQDUwGqAa4BnAFPAf0B/wHWAaoC/wHZAZwB/wHbAbMBmgH/ARQBDgG+
+ Af8BEQETAekB/wIjAfcB/wJAAv8BQwFHAfMB/wEpAToB4AH/AS8BJwHsAf8DXgHlAw8BFAFnAlkB8gHf
+ AdsB3wH/AecB4AHiAf8B4QG3AaoB/wHmAbQBkgH/AeoBuQGQAf8B3QGxAZ0B/wHZAcgBxgH/AdoB1QHa
+ Af8B2gHSAdUB/wHbAdQB1wH/AdsB1AHYAf8B3AHVAdgB/wHhAdwB3wH/AdwB2wHhAf8BZQFkAVMB8QQA
+ AxYBHwNaAcoDWQHEA0oBigG4AagBUgH9AbgBvwFiAf8BvgHEAZ0C/wHvAdAC/wHsAckB/wH2AdcBrQH/
+ AdwBtAGGAf8BqAGAAUAB/QFiAUkBSAH2A18B4ANOAZgBqgKoAf0B+gP/AeIC2gH/Ac0CugH/AdQCvgH/
+ AdACvAH/AdICygH/AfgC9w3/AfEC7QH/AeAC1AH/AfkC2gH/AeMCsQH/A1gBywQAA1ABnQHnAa0BZgL/
+ Ae4BxAL/Ad8BtQL/AegBrAH/AasBlwGgAf8CAAHFAf8BBwEJAfMB/wI6Av8BUQFCAfsB/wE1AUEB7AH/
+ ARIBuQHpAf8BDgFIAcAB/wNWAb4EAAJhAVwB7gHtAewB7wH/Af4BwwGfAf8B/gGpAT8B/wHYAZcBXgH/
+ Ab0BggFhAv8BrQFKAf8B6QGcAU8B/wG8AaABnQH/AcMBswG0Af8ByAK3Af8BzAK8Af8B0ALBAf8B3QHQ
+ AdEB/wHsAeoB7QH/AmEBVQHuBAADSAGEAVsB7wGRAf8BRgG/AVoB/wEyAWgBEwH/AVcBvQFIAf8BKAHG
+ ATcB/wEuAZcBHgH/AekBxwGjAv8B5QHEAv8B6gHMAv8B8gHZAv8B9QHdAv8B7AHQAf8B+gHVAakB/wFc
+ AlUB6gF/AngB/AHvAvIB/wHYAs8B/wHFArEB/wHIArIB/wHAArMB/wHlAt8B/wH6AvcB/wH2AvUB/wHv
+ AfAB8QH/AfIC8AH/AfcC8gH/Ad4C2QH/AdgCwQH/AdoCqgH/A1sByAMvAUoBhgFnAU0B+gH/AccBkQL/
+ AdMBnwL/AccBjgL/AdIBhwH/Ab0BlwGCAf8CAAHGAf8BGAEWAv8BVwFdAfoB/wEwAVwB3QH/ATUBMAHe
+ Af8BJAGDAfwB/wEAAbIB7wH/AVgCXQHtAzYBWQNhAu4B3wHgAv8BtgFoAv8B2gGMAf8BmwGMAcQB/wE3
+ ATIB0AH/AfcBzgGPAf8B/AGxAVIB/wHlAb4BrgH/AusB7wH/AewC5QH/AewC5gH/Ae0C5wH/AfIC7QH/
+ Ae4B7QHuAf8CYQFYAe4EAAM6AWEBggHFAZMB/gHuAf8B8gH/AaUB+AG5Af8BoAHxAbEB/wGoAf8BwAH/
+ AVsBvwFZAf8B8gHZAbkC/wHnAcoC/wHoAcwB/wH9AegBzwH/Af0B6QHTAv8B+AHqAf8B9QHdAcIB/wNT
+ Aa0BfwJ4AfwB8ALzAf8B2QLQAf8ByAKzAf8BwAKtAf8BzALBAf8B7gLlAf8B6ALmAf8B1ALSAf8BywLH
+ Af8BygHJAcgB/wHkAuAB/wHuAuYB/wHWAskB/wHRAqMB/wNbAcgBWgJYAcABzgFoASkB/wHRAYwBPAH/
+ AfwBwwFqAv8BvQFfAv8BvAFVAf8B7QGwAUoB/wEqARcBpQH/AjEC/wFeAWUB/gH/ARYBwQH3Af8BCQGK
+ AeMB/wFKARoBkAH/AUkBhAGnAf8BAAGIAegB/wNQAZ0DYQHuAfIB6QHoAf8B/AHLAagC/wHxAcgB/wGx
+ Aa8B4wH/AWIBYAHjAf8B+wHwAc4B/wH1AcIBmAH/AcYBoAGUAf8BwwG3AbkB/wHKArgB/wHOAr4B/wHQ
+ AsAB/wHbAtAB/wHwAe8B8gH/AmEBXQHuBAADUAGeAYwB6AGlAf8B4QH/AeMB/wG6Af8BwQH/AWgB/wGC
+ Af8BZwHyAZEB/wFOAaMBRAH/Ae0B1wHBAv8B7wHXAf8B+wHqAdUB/wH7AewB2wH/AfoB7gHgAv8B/gHx
+ Af8BiwFkAV8B+wMqAUEBfwJ3AfwB8ALzAf8B2QLQAf8BxwKyAf8BvQKsAf8B0wLHAf8B6gLiAf8B4wHh
+ AeAB/wGRAY0BjAH/ASMBIQEgAf8BoAGdAZsB/wHZAdcB1gH/AewC5QH/AdoC0AH/AckCnwH/A1sByAFk
+ Al0B7QGqAU0BEgH/AZcBNAEAAf8BwwFkASEB/wH5AbEBSAL/AbEBSQL/AbwBRgH/AbUBZgFBAf8BOwEx
+ Aa8B/wFRAU8B7gH/AT4BXgHdAf8BAAG1Ae8B/wE4AZUBswH/AbgBXQFHAf8CWwFeAdkDIQEwA2EB7gH2
+ AfUB9gH/Af0B4gHUAv8B5AHJAf8BowGeAcMB/wFTAVABqAH/Af0B3gHDAf8B9wHVAcQB/wHeAdMB0QH/
+ Ad4C1gH/AeIC2AH/AeQC2gH/AeQC3AH/AesB5QHmAf8B9AH1AfgB/wNhAe4DOwFkAV8BqwF/Af4B2gH+
+ AeUB/wHYAf8B3AH/AawB/wG4Af8BiQH9AZMB/wGcAfoBrQH/ATIBwAFLAf8BVgGMAToB/wH4AecB2gH/
+ Af0B8gHkAf8B+QHvAeMB/wH8AfgB8AH/AfwB7QHcAf8BXQJZAdIDAQECAX4CdwH8AfAC8wH/AdkC0AH/
+ AccCsgH/Ab4CrgH/AdUCyAH/AegC4QH/AegB5QHkAf8BUQFMAUsB/wMAAf8BgQJmAf8B4ALdAf8B6gLi
+ Af8B2wLSAf8BxgKfAf8DWwHIAX4BXAE+AfgBjQE4AQEB/wFlASEBAAH/AZsBPwEDAf8B8QGtAU0C/wHE
+ AWgC/wHOAYcB/wHUAZABLgH/AV0BIgECAf8BRwEgAS8B/wGSATsBJQH/AaIBmgGJAf8BJQGsAfkB/wGe
+ AYMBgAH/A1ABnQQAA2EB7gH5AfgB+QP/AfsB/wHEAckBygH/AUIBigGyAf8BJQFdAZ8B/wGCAZkBpwH/
+ AewB3QHYAf8B3wLVAf8B3ALSAf8B3wLWAf8B4QLXAf8B4gLZAf8B6gLjAf8B+AH5AfsB/wNhAe4BMAIx
+ AU0BagGNAXcB+QHQAfgB0wH/AcgB/QHVAf8B4wH/Ae8B/wG/Af4BzwH/AYsB7wGSAf8BVgHjAYcB/wE9
+ AZ8BNQH/AfIB3wHaAf8B/QH4Ae8B/wH3AfEB7QX/Aa4BjQF/Af4DQgF0BAABfgJ3AfwB8AL0Af8B2QLQ
+ Af8ByAKzAf8BvAKsAf8B0ALFAf8B7ALkAf8B4wLgAf8BrgGlAaQB/wFdAlMB/wG1Aa0BrAH/AeAC3QH/
+ Ae8C5QH/AdkCzQH/AcsCoQH/A1sByAGJAWoBQQH5AYkBOQEDAf8BkwFAAQQB/wHbAZ4BRgH/Af0BywGK
+ Af8B4QGsAV4B/wGvAWQBMAH/AY8BQAELAf8BYgEhAQAB/wFhAR4BAAH/AYYBLQEAAf8BsgFQAQkB/wGc
+ AVgBQQH/AawBXgE4Af8DUQGiBAADYQHuAf4C+wH/AfMB+gH9Af8BmwHYAfkB/wGCAb0B4gH/AWIBsgHX
+ Af8BTgG2AeIB/wG0AcoB1wH/AcoBtQGyAf8BxQK1Af8BygK7Af8BzgK/Af8B0QLBAf8B2wLQAf8C+gH7
+ Af8DYQHuAwQBBgJkAVwB5wHUAfEB0AH/AaMB7QG2Af8BzAH/AdsB/wGSAe8BowH/AZAB1AGPAf8BtgHV
+ AakB/wHfAeMB0AH/Af0B9gHzAf8B9gH0AfIB/wH3AfgB+QP/AfwB/wFhAV8BVAHuAw0BEgQAAX4CdwH8
+ AfAC9AH/AdkC0AH/AccCsgH/AcQCsAH/AccCvAH/AfEB6AHpAf8B+AH5AfsB/wHnAuUB/wHkAt4B/wHh
+ Ad4B3QH/AfIB7AHtAf8B6gHkAeUB/wHWAcUBxgH/AdYCpgH/A1sByAFkAWABWQHrAccBiQExAf8B8wG1
+ AVgC/wHUAZsB/wH+Ad0BtgH/Ab4BmwFmAf8BkwFaATsB/wGeAWcBRwH/AZ0BZAFCAf8BkAFSASoB/wGA
+ ATgBCAH/AVMBGwEAAf8BagEqAQAB/wF/AWMBNAH+A0IBdAQAA2EB7gL/Af4B/wHrAfUB/AH/Aa4B3AH3
+ Af8B2AH3Av8BwAHwAv8BaQHKAfMB/wG+AdgB5wH/AfUB8AHtAf8B8QLtAf8B8wLuAf8B8wLvAf8B8wLw
+ Af8B9wL0Af8B/gP/A2EB7gNRAaIB+wHaAbwF/wHIAekBzAH/AY0B5QGaAf8BkAHZAZUB/wH0AesB5wL/
+ AfgB/QL/AfoB+wH/AfUB9wH1Af8C9wH4Af8B/QH+Av8B7QHVAcgB/wNRAacIAAF+AncB/AHwAvMB/wHY
+ As8B/wHEArEB/wHKArQB/wHEArMB/wHQAcgBxwH/AdABxwHDAf8D7AH/Ad4C4AH/AfwC+gH/AfQB7gHt
+ Af8B1ALNAf8B3QLBAf8B2gKoAf8DWQHJAlYBVQG0Ac4BiQEuAf8B7AHBAZAC/wHwAdsC/wH1AekB/wHy
+ AekB3wH/Ad0BygG2Af8B2QHEAa4B/wHgAcwBuAH/AdoBxgGwAf8ByQGuAZQB/wGhAWEBOgH/AbEBVQEW
+ Af8BYQJUAe4DGAEhBAADYQHuBP8B/AH9Av8BzwHnAfcB/wHVAewB+gH/AbQB4QH9Af8BngHVAfoB/wLe
+ AeIB/wG5AaEBnwH/AbgCpAH/Ab4CqwH/AcMCsAH/AcQCtAH/AdIBxAHFAf8B/QH+Av8DYQHuAW8BaAFV
+ AfMB/wH8AfcF/wHvAdkBvwH/Ab0BxgGLAf8B5wH0AecC/wL7Af8B+AH6AfwB/wH6Af0C/wH8A/8B/Qf/
+ AYkCXwH7AyYBOAgAA6gB/QH3AvwB/wHeAtcB/wHJArYB/wHQAroB/wHZAccBywH/AaYBjQGBAf8BmAFF
+ ARQB/wGaAZYBkwH/AV4BYwFmAf8B6gLsAf8B5wHdAdQB/wHkAcsBsQH/AeoBxwGrAf8B0wGmAaUB/wNc
+ Ac4DKQE+AXMBYgFIAfYB7gHRAbAB/wH4Ae4B4gH/Af0B8wHpA/8B/AH/AfkB8AHnAf8B7wHWAb4B/wHw
+ AdYBvgH/Ae8B1gG+Af8B8QHdAckB/wH6AdgBsgH/AdUBhgE0Af8DTgGUCAADZwHyCP8B+wP/Ad8B8gL/
+ AdMB7QL/Ae8B+wP/Av4B/wHtAukB/wHuAusB/wHwAu0B/wHxAe4B7wH/AfIB7wHwAf8B9QH0AfUF/wFp
+ AmQB8QJAAT8BbgJdAVoB0wGOAYcBegH5Ae8B1AG2Af8B8wHMAawB/wHzAdQBuAH/Ae0BywGsAf8B7AHL
+ Aa8B/wH0Ad4BygH/AfUB4gHVAf8B9wHtAeYB/wH3AeUB2QH/A1sB0AMBAQIIAAF9Am0B9wHlAt8B/wHU
+ AscB/wHGArQB/wHMArgB/wHYAcIBxAH/Ab0BpgGiAf8BnwGBAV0B/wGtAaEBoAH/AasBowGkAf8BywG/
+ AcAB/wHTAcIBwQH/AeIBzwHGAf8B4QHIAboB/wHJAaUBpAH/A1EBpwQAA0QBegG2AaUBTQH9AfwB7AHX
+ Af8B+gHyAecB/wH7AfMB6wH/AfwB9AHrAf8B9wHlAdQB/wH3AeQB0gH/AfkB7gHgAv8B8wHbAf8B8gGx
+ AWcB/wFbAlkBxAMEAQYIAAFgAlwB1AF3Am0B9wNiAfYDYgH2A2IB9gFlAmIB9gFlAmIB9gFlAmIB9gFl
+ AmIB9gFoAmIB9gFoAmIB9gFoAmIB9gFoAmIB9gFoAmIB9gGBAm0B9wFeAloB2AgAAyUBNwJPAU4BlwNf
+ AeABtQGoAZoB/QHzAdwBwwH/AfwB6wHKAf8BlgF/AWYB/gNVAbICUwFSAagBWwJZAcQDLQFFDAABPQI8
+ AWcBUgJRAaEDXQHXAXECXgH6AWQCWQHsAVYCVAGrA1ABnQFSAVEBUgGhA1IBoQNSAaEBUgJRAaEDUgGh
+ A1IBoQNSAaQDTAGTAxgBIQgAAkcBRgGAAXUCYgH2AfcB4gHMAv8B/QH3B/8B/QP/AfoC/wHuAdcB/wGe
+ AXQBYAH8A1YBtgMMARBcAAMHAQoDMAFLAlYBVQG0AW0CZQH0A1UBtWgAAygBPAJWAVUBtAJiAV0B6QGM
+ AYIBagH5AZYBewFuAfoBZgJdAfABXAJZAckDOgFh/wAZAAMfASwDSwGPA1UBtANXAb8DWAHAA1cBvQNU
+ Aa4DQQFzAw0BEmAAAwwBEANOAZQDVQG1A1UBtANVAbQDVQG1A1YBtgNWAbYDVQG6A1YBvgNBAXMYAAMF
+ AQcDAQECLAADMgFQAVcBWAFXAe8BHQGYATEB/wEkAbABQgH/ASgBuAFJAf8BKQG4AUkB/wElAbMBRAH/
+ AR8BnQE2Af8BOQFFAToB/QNXAcUDDwEULAADDwEUA04BlwNGAYADAwEEIAADSAGHAZ4BMwE2Af8BsQFA
+ AUMB/wG1AUMBRgH/Ab4BSwFNAf8BxwFSAVQB/wHPAVoBWwH/AdQBXgFfAf8B2QFjAWQB/wHVAWkBagH/
+ A14B5QMGAQgQAAJTAVUBrQEQAWkB0gH/AUIBWQFvAfUDWQHHAk0BTgGWAzsBZQNKAY0BhQFtAVEB9wJd
+ AVkB1wFWAlUBtAFNAkwBkQFAAj8BbgMlATcEAANfAeABMwHVAV4B/wFAAeUBiAH/AUsB4QGNAf8BUQHi
+ AZIB/wFSAeEBkgH/AU4B4wGPAf8BRQHlAYsB/wE7AeABaAH/ASkBZwEtAf4DQAFxKAADJQE3A1sB4QEa
+ AZIBEwH/ATYBQAEWAf0DVgGzAxABFhwAAVsCWAHLAfABmwGUAv8BuwGkAf8B/gG9AakC/wG8AagC/wG+
+ AasC/wG8AagC/wG8AakC/wG/AaoC/wHDAbgB/wFfAlgB4wMEAQYQAAFOAV0BZQHwATIBwQH+Af8BVQHJ
+ Af4B/wFOAcgB/gH/ATkBtwHwAf8BVAFWAWAB/wHzAbgBhgL/Ab8BaAL/AbkBWwL/AbIBTAL/AbEBSgH/
+ AewBpAFYAf8DRAF5BAABLgF1ATQB/AFaAegBnAH/AWoB3gGfAf8BiQHhAacB/wGQAeMBrAH/AZEB4wGt
+ Af8BjQHiAaoB/wGEAd8BogH/AWQB7AGiAf8BOQGvAU4B/wNRAaAkAANCAXYBQQFiAUgB9gEdAdABVAH/
+ ASIByQEwAf8BIQGeAQAB/wEVAUsBAAH/A1oB2wMtAUYUAAMBAQIBYgJYAekB/AHGAawC/wH1AdkB/wH4
+ Ae4B2QH/AfoB9AHiAf8B+wH0AeQC/wH8AfEC/wH+AfkC/wH8AfgB/wHtAeEB3QH/A1YBvhAAAwkBDAEA
+ AVYB1AH/AUUBxQH+Af8BkgHYAv8BlgHcAv8BgwGqAb8B/wHYAZ8BaAL/Ac4BmgL/AcsBkwL/AcUBiAL/
+ Ab4BZQH/AfgBsgFaAf8BYwFmAYcB/wJQAVEBnwQAAVgBiQFfAfsBlAHqAbQB/wGnAegBvAH/AbIB7AHH
+ Af8BvgHzAcwB/wHAAfQBzgH/AbcB7AHJAf8BrQHqAcAB/wGfAfABuwH/AVEBtgFjAf8DTAGTIAADJwE6
+ ASkBcwFIAfoBIAHXAVgB/wEfAdYBXQH/ARwBtAEkAf8BHgGYAQAB/wEhAaQBAAH/ARwBYQEAAf8DWgHK
+ FAADIwEzAYcBTwFNAfsB/wHTAbcC/wH3Ad8B/wGdAY8BggH/ATwBOAE0Af8BjgGIAYwB/wHCAbABqwH/
+ AeoB4AHRA/8B/gH/Ac0BwQHAAf8DRgGBEAADHAEoAQABYAHiAf8BYwHQAf4B/wG+AegC/wG4AeUB/QH/
+ AZ8BjAGEAf8B/QHZAbQC/wHWAasC/wHTAaQC/wHOAZsC/wHIAY4B/wHJAY8BXAH/ATQBrwH5Af8DUgGp
+ BAABVQFcAVUB6gGyAfEByQH/AdAB9AHdAf8B5gH7AewB/wHlAfEB6wH/AeIB7wHpAf8B7QH8AfAB/wHc
+ AfYB5gH/AcAB+QHTAf8BSQGdAU0B/QM2AVkcAAMMARADWAHAARkBuwE+Af8BHgHTAVYB/wEbAc0BVQH/
+ ASIBwAE1Af8BHwGXAQAB/wEfAZsBAAH/ASABmAEAAf8DPgH4A0gBhgMDAQQMAANEAXoBvQFQAUYC/wHe
+ Ab4C/wHxAdkB/wHCAbQBowH/AT0BQwE+Af8BgQGnAcAB/wEGAUIBpwH/AkUBZQH/Ae8B2wHJAf8BeAFw
+ AW4B+gMtAUUQAAIrASwBQwEAAYIB8AH/AY8B2QH+Af8BwgHqAv8BwQHlAfgB/wHRAacBjAL/Ad4BuQL/
+ AdwBtgL/AdkBsAL/AdUBqAH/AfMBpAFbAf8BpgGqAa4B/wE2AbYB/gH/A0oBjQQAA04BmQG3AeABwAH/
+ AfQB/wH0Af8B7AH9AdYB/wFnAYcB2wH/AVMBWAHbAf8B0AH7AcUB/wHpAf8B7AH/Ac0B8gHUAf8DWwHZ
+ AwcBChgAAyYBOAJXAVwB3wEAAQUBqAH/AQ4BrwE8Af8BHQHVAU8B/wE7AeYBgwH/AToB6wGHAf8BIgHB
+ ATcB/wEfAZ0BAAH/AR0BjQEAAf8BAAFWAacB/wEVAUABqAH9A1UBugMVAR0IAANVAbIB0gFiAU4C/wHl
+ AcMB/wHwAdoBwgH/AekB2QHCAf8BsAKnAf8BjAG/AegB/wECAa8C/wEAAV4B0gH/AVgBXAGiAf8BYgJY
+ Ae8DEgEZEAADOAFeAQ4BkQH8Af8BngHeAv8ByAHrAv8BxQHgAe4B/wHmAbsBmwL/AeUByAL/AdYBsAL/
+ AZEBOAL/AaYBVQH/AdUBWQEnAf8BmwHbAfoB/wExAbUB/gH/A0EBcgQAAw8BFAFaAV4BWgHVAaIB0gGg
+ Af8BZwHDAbYB/wERAVgBuQH/AQQBRgG5Af8BKAGwAZUB/wFnAdMBjQH/A10B8AMpAT4YAANBAXMCOQFi
+ AfYCAAH3Af8BAAEIAcsB/wE5AcQBSgH/AYsB+wGoAf8BWwH+AZ8B/wE4AeoBgwH/ASMB1gFfAf8BHwHI
+ AT8B/wEdAaABAAH/AQABZAGcAf8BAAFeAv8BAAEuAc4B/wNXAd8DMAFLAwEBAgFhAlwB3AHjAZEBYAL/
+ Ae0BygH/AecBzwG2Af8B5QHQAboB/wHaAcQBtgH/AT8BaAGnAf8BVwHZAfcB/wEWAc4C/wEAAZoB7AH/
+ ASIBQAFNAf0DUQGnAwYBCAwAA0QBeQEfAZgC/wGsAeMC/wHPAe4C/wHJAs0B/wHzAdoBxQL/AfEB4gL/
+ AesB1gL/Aa4BYAH/AdgBhgFMAf8BIQERAWgB/wFdAaoB4QH/AS0BrQH6Af8DOAFcCAADGQEjAUgCYgH2
+ AWQBtAHdAf8BvQHUAd8B/wHCAdcB3wH/AVABngHLAf8BCAFhAWYB/wNNAZYcAAI8AXwB+AIAAv8CAAL/
+ AgAB2QH/AUEBiwFkAf8BpgH5AaAB/wFbAf8BoAH/ATQB5gGCAf8BJQHVAVgB/wEfAc0BQQH/AQoBogE6
+ Af8BAAFkAcQB/wEAAVYC/wEAAWAC/wEAAT0B5AH/A1gBwAMfASwBXgJCAfUB8wGtAYsB/wH7AeUBxQH/
+ AdEBuQGkAf8BxgGyAaAB/wHtAdgBwQH/AcwBvgG5Af8BQQGLAbMB/wFXAd0B8wH/ATEB8AL/AQABxQH7
+ Af8BBgFRAX8B/gNYAcYDFQEdCAADTgGUATEBnwL/AbsB6AL/AdYB8AL/Ac4BwgG2Af8B+wHwAeYC/wH2
+ Ae0B/wH9AfEB4wH/Ae4BzQGvAf8BTgE/AZMB/wIAAbsB/wIAAa0B/wEAAQsBtQH/AlcBWgHFCAADOgFh
+ AUkBqAGzAf0BtAHPAeUB/wHmAeoB8QH/AewB7gH2Af8BvAHJAd0B/wE0AZYBzAH/A1kB0gMfASwDEgEZ
+ AwQBBgMEAQYMAAIVAbIB/QIAAv8CAAL/AQwBCgH+Af8CAAHHAf8BCwFGAV4B/wFGAecBWAH/AT4B+gGB
+ Af8BIAHHATgB/wEAAZQBSgH/AQABmwHUAf8BAAGeAv8BAAFWAv8BAAFYAv8BAAFUAfgB/wNZAccDOgFi
+ AX8BNwEvAv4BwQGZAf8B3gHIAa4B/wHFAa4BmgH/AdABvwGoAf8B0wHCAa0B/wHfAc0BswH/AbgBoAGb
+ Af8BLgFTAZsB/wFPAc4B6wH/AUMB/QL/AQAB3QL/AQABVgGsAf8DXgHaAyUBNwQAAlMBVQGwAUcBqwL/
+ AcsB7QL/AeAB9AL/AdUBwAGtAf8B/gH7AfgC/wH7AfcB/wHzAfAB7AH/AdMBzgHMAf8BRAFMAbcB/wFQ
+ AWgB8QH/ASgBPwHbAf8BJwE8AdoB/wJYAVwB0QgAAVACUgGjAZ4B2QH0Af8BsgHgAfoB/wGqAdoB9gH/
+ AZ0B1AH1Af8BlQHRAfUB/wFkAc0B9wH/AlMBYQHxAVwCVwHfAWICWAHpAV4CWwHZAV4CWgHYA1MBsAMo
+ ATwEAAIhAZQB+wIAAv8COQL/AoEB/gH/AUcBRAH9Af8CAAHeAf8BAAEfAYgB/wEdAaQBMgH/AQABnAGH
+ Af8BAAGjAewB/wEAAcwC/wEAAccC/wEAAZwC/wEAAV8C/wEAAUwB9AH/A1gBxgNOAZkBugE3ASQB/wHz
+ AcABmAH/AdYBwgGkAf8B0AG4AZ4B/wHGAZUBjQH/AcsBhwGNAf8BxwGDAY0B/wHVAZABlAH/AdQBggGT
+ Af8BUQFGAZsB/wFDAbMB3gH/AUwB9gL/AQMB3wL/AS4BXgGnAf8DXAHcBAACWAFbAcsBXgG5Av8B3AHz
+ Av8B6gH3Av8B3QHGAbIB/wHzAd8B0AH/AfUB5QHYAf8B9gHpAd4B/wH4Ae0B5AH/Ab4BtgHMAf8BLAE3
+ AbgB/wGXAZ8B0wH/AUMBkAG3Af0DHwEsCAABTQJOAZYBsgHeAfIB/wHbAfcC/wHRAe8C/wG4AeYC/wGg
+ Ad8C/wGGAdcC/wNZAewBhQFdAVwB+AH/AekBwAL/Ad0BvAL/AdwBuAH/AdwBpQFqAf8BYAJZAesDMAFL
+ AjUBsgH9AmQC/wKSAv8CZQL/AlsC/wFTAVEC/wEYAQsB4QH/AiEBXwH7AQABrAHjAf8BAAH1Av8BAAHe
+ Av8BAAHCAv8BAAGwAv8BAAGmAv8BAAFmAfsB/wNZAcQDWgLKAUwBMgH/AeABvgGYAf8B0wG1AZcB/wHT
+ AZYBjQH/AfEBogGlAf8B/gGzAbQB/wH+AbQBtgH/Af4BtwG5Av8BxAHCAf8B+QG4AboB/wGDAYABuAH/
+ AT4BrgHlAf8BrQHyAfMB/wFlAbAB7AH/AVkBWwFdAe0EAAJZAV0B0gGLAcgC/wHxAfoC/wH3AfwC/wH2
+ AfkB+wH/AfAB5QHcAf8B7gHgAdUB/wHtAdwBzwH/AewB2AHJAf8B6gHUAcIB/wH0AfAB7QH/AfcB+wL/
+ AVgCYgHpDAADKAE8AW0BfAGJAfoE/wH1A/8BzwHyAv8BtAHyAv8BYgF/AaIB/gFnAlkB8gH5AcwBlwL/
+ Ad4BsgL/AeABuQL/AeEBuQL/AewBvgH/AewBpQFeAf8DVwG9AlgBWwHLAmkB5QH/ApEC/wJkAv8CWgL/
+ AlYC/wFNAUoBegH6A1ABnQFXAlwB3wEAAekB/gH/AQAB5AL/AQABwAL/AQABsQL/AQABrgL/AT0BbQGG
+ AfcDOgJiAlYB7wG+AV0BPgH/AcwBogGEAf8B1AGOAYcB/wH3AasBqQL/AbcBsgL/AbYBswL/Ab4BvAL/
+ AcYBxQL/AdkB1wL/AfwB+gH/AeYBsQG9Af8DXgHlAUEBVAGoAf0BEgFQAcoB/wNLAY8EAAMcAScCUwFV
+ Aa0DXAHRA10B1wNeAd0DXwHjA2IB6QJiAWMB7wFaAWcBdwH1AV8BhgGbAfsBhwGmAfAB/wGIAasB9QH/
+ AlQBVgGrEAABRgJHAYABdAF9AYkB+gHWAeUB7gH/AbwB4gHxAf8BYAF5AZgB/AJQAVIBowFfAloB2wH/
+ AdoBlAL/Ac0BmQL/Ac4BnQL/AcwBmwL/AdcBnAH/Af4BtQFdAf8DVwG/BAACTwFRAZwCNAGbAfwCgwL/
+ Ak8B9QH/AlcBYgHvAzMBUgQAAxABFgFYAloBwAEAAbUB9gH/AQABzwL/AQABpAL/A18B4AMnAToEAAFs
+ AisB/AG2AVoBRQH/AegBqwGgAv8BxgHAAv8BzwHHAv8B1AHNAv8B3gHXAv8B5gHhAv8B7wHpAv8C+gH/
+ AacBfwGFAf4DVAGvAwQBBgNAAXACSwFMAY8DAQECLwABAQMFAQcYAAMvAUoBUQJSAaEDUgGpAzkBXwQA
+ A0UBfQHCAX8BcgH+Af8B9AHUAv8B9AHfAv8B9QHdAv8B2wGqAf8BgQFSAVAB9wMxAU8IAAM7AWQCVAFh
+ Ae4CWwFeAdADGAEhEAADTAGSAUMBYgF5AfYCVQFXAboDDAEQCAABXAJXAd8BgwFBAUAB/gGtAkgB/QGO
+ AUkBTQH8AYwBTQFWAfwBjgJfAfsBjgJfAfsBgAFNAVwB+gGOAl8B+wFnAVkBZwHyA0QBfHgAAUcCRgGA
+ AmUBXgHlAZMBdgFwAfoBhgJtAfcBYAJcAdQDMwFShAADSwGOA1kBwwNXAcIDQgF2QAADEQEXA0QBeQNW
+ AbMDWAHGA1cBxQNUAa8DPQFqAw0BEhAAAlUBVwG6ASEBJAGKAfsCPgF6AfgCPgF5AfgCPgF4AfgCPgF3
+ AfgCPgF2AfgCPgF0AfgCPgFyAfgCPgFwAfgCPgFvAfgBPQE+AW4B+AI+AW0B+AI+AW0B+AIhAV8B+wJZ
+ AVsBwwwAA1MBqgNYAdEDWAHLA1oB1QFaAV0BYAHtAUwBXQFoAfMCVwFfAegDWwHQA1wBzgNZAdIDRAF8
+ CAABQAFtAYEB9wEAAbUB4QH/AQABqwHaAf8DWQHsAxkBIzgAA0MBdwFgAlkB6wJ/AU0B/gGBAakBPgH/
+ AYYBuwFMAf8BiQG2AU0B/wGzAagBaAH/AaIBSwFEAf0DWgHeAzkBXwwAAkgBawH2ARkBNAHuAf8BAQEc
+ AeQB/wEAARUB4AH/AQABFAHaAf8BAAEQAdUB/wEAAQsBzwH/AQUBEwHWAf8BBQEPAdIB/wIAAcEB/wIA
+ Ab0B/wIAAbkB/wIAAbUB/wIAAa8B/wIAAbkB/wI+AW0B9wwAAbIBqwGsAf8B2wHSAdEB/wHiAcwBwgH/
+ AYUBowHeAf8BUAHSAv8BXgHpAv8BWAGtAfIB/wHaAcYBwgH/Ad8B1QHUAf8BvAK2Af8DVQG1CAABSgFl
+ AWoB9AEAAegC/wEAAe4C/wEAAYMBtQH/A1wB3ANKAYsDAwEELAABUgJQAaQBngJ/Af4B/wHvAeUB/wHd
+ AfgBzwH/Ad8B9QHOAf8B5gH1AdYB/wHpAfoB3wP/AfoD/wH5Af8B6wHIAbkB/wFqAkEB+QNEAXoIAANV
+ AbUBFQEoAdsB/wEAAQcB5AH/AU4BXQHRAf8BqwGvAdAB/wGpAa4B2QH/AbMBtwHgAf8BnAGfAccB/wGa
+ AZwBxAH/AbQBtgHcAf8BrAGuAdMB/wGvAbABywH/AVsBXQG6Af8CAAGkAf8CAAGrAf8CVgFYAcEMAANR
+ AaADVQGtA1ABnQNVAbUBUAGoAbkB/QFjAbcB5wH/AVkCYAHrA1QBpgNVAa0DUgGpAygBPAgAAVoCXQHT
+ AQAB2gH0Af8BAAHZAfcB/wEAAcwB+gH/AQABuAHrAf8BMwFDAWoB+QM4AVwoAANLAZABxgGaAWcC/wH9
+ AeMC/wHqAc4C/wHgAcIC/wHcAbsC/wHcAbkC/wHdAb0C/wHgAcMC/wHqAdED/wH2Af8B/QHkAdQB/wFq
+ AkEB+QM4AV0EAAMrAUIBKAEuAY0B+wEAARsB6gH/AWcBiAHXAf8B+QH1AdkB/wH4AfYB6gP/AfsB/wJV
+ AUkB/wJKAT8D/wH5Af8C+gHvAf8C+wHiAf8BjQGPAcUB/wIAAbUB/wIAAZMB/wMyAVEYAAMzAVIBcwFv
+ AXAB+gGlAZoBnAH/A1QBrhgAAyQBNQFXAl8B6AEAAdsB9AH/AQAB2gH2Af8BAAHuAv8BAAGaAdQB/wFP
+ AVcBWQHyA0sBkAMjATMcAAMmATgBcwFcAUMB+AG/AdMBjgL/AdsBsgL/Ac8BnAL/AcoBkwL/AcgBjwL/
+ AckBjgL/AcsBlAL/AdIBnwL/AdYBqQH/Ae4B1QGrAv8B+AHhAf8B8gHIAa0B/wNYAd0DDQESAwQBBQNT
+ AaoBFAEnAd4B/wERASgB6AH/AdYB2AHlAf8B+gH5AfIB/wL9Af4B/wLVAdcB/wLSAdMB/wL9Af4B/wL6
+ AfUB/wHhAeIB5QH/ARgBGwG8Af8CAAG1Af8CVgFYAbkDCQEMDAADMQFPA1YBtgNXAegBawFvAWoB+gGz
+ AasBpgH/AYYCYwH/A1gB0QMQARYYAAMkATUBWQFgAWIB6wEAAeEB+QH/AQAB0AH1Af8BAAHUAf4B/wEA
+ AcEB8QH/ARwBQAGZAf0BWAFbAV0B7QNRAacDSgGLAyQBNRAAA1UBsgFmAY8BLQH/AWIBowE2Af8B+AHJ
+ AY0C/wHAAWgC/wG6AV8C/wG5AVsC/wG7AV4B/wHUAa8BTAH/AWoBmAEsAf8B4QG9AWYB/wHtAccBjgH/
+ AagBsgFaAf8BYAGpAUEB/wGWAUkBQAH9Az0BagQAAyoBQQJCAW0B9QEAARoB7QH/AWABgwHoA/8B9wX/
+ A7wB/wO1B/8B/AH/AZABlAHVAf8CAAHAAf8CPgF1AfgDMQFOEAADZAHxAeMB2gHbAf8B8wHrAeoB/wHp
+ AewB5AH/AdsB0AHOAf8BywG4AbkB/wGOAoEB/wNYAeMDPQFqAwEBAhQAAyYBOAFaAV0BYgHtAQAB4gH5
+ Af8BAAHTAfMB/wEBAeUB/QH/AQkB5gL/AQMBrwHyAf8BAAFRAcYB/wEAAUYBvgH/A1wB5wM4AV0MAAFc
+ AlUB6gE1AYIBEwH/AQwBVAEAAf8BZgGJAR8B/wH1AbMBTgL/AbEBSQL/Aa4BRQL/AbMBSwH/AYYBigEd
+ Af8BAAFOAQAB/wFhAYYBGwH/Af0BxQGDAf8BnQGcATkB/wFMAZEBJQH/AcYBnAFZAf8DUwGwCAACVAFW
+ AasBGwEtAd4B/wE2AUoB9QH/Ae0B7gH8Bf8DjAH/A2kF/wHqAesB/gH/ARsBIgHfAf8BAAEEAcAB/wJV
+ AVcBtwMBAQIQAAF0AnAB+AHtAuAB/wHiAtYB/wHnAdwB3gH/AdkBygHLAf8B1ALDAf8B5QLUAf8ByQK6
+ Af8BSgJFAf0DVwHCAyEBMBQAAykBPwFWAmIB7wEAAeMB+gH/AQABzgHyAf8BDAHkAfsB/wEuA/8BOAHq
+ Av8BUAHkAv8BCQGKAecB/wE9AUYBbQH3A0YBgAgAAXoBWwFBAfkBIwFXAQIB/wENAUIBAAH/AQoBQQEA
+ Af8BsQGRASgC/wGzAUgC/wG0AUoC/wG4AU0B/wFUAWEBDwH/AQ8BRQEAAf8BFAFGAQAB/wGqAZMBLwH/
+ AeUBsAFSAf8ByQGyAV0B/wHsAboBigH/A1cBxQgAAycBOgJBAYcB+QGeAaIB/QH/As8G/wNgAf8DTgX/
+ AqcC/wEQAREB/gH/ASwBLgGoAf0DLwFJFAABcQJtAfcB+QLyAf8B8gLtAf8B8QLuAf8B3ALPAf8BzwK9
+ Af8B1ALFAf8B4QLSAf8B7wLiAf8BmAKNAf8DUQGhGAADLQFGAVUCYgHvAQAB3QH0Af8BAAHHAfAB/wEL
+ AeAB9gH/AUMD/wGOA/8BjwH2Av8BHQGjAfkB/wJCAVkB9QMvAUoEAAGGAV8BMgH7ARsBQgEAAf8BDAEu
+ AQAB/wFaAVgBDgH/AeMBqQFBAv8BtwFQAf8B2wGjAT8B/wG2AY4BLAH/ASsBPQEAAf8BEAEwAQAB/wET
+ ATQBAAH/ASwBQgEAAf8BngGDASUB/wGjAY8BMgH/AbsBlwFIAf8DWQHHCAADAgEDAlABUgGjAWoBggHn
+ Af8BvQG8Av8C+wL/Aj8BOwH/AjEBLAH/AvYB/gH/AlgC/wEbARwB4gH/A1UBsgMFAQcUAAF0AnEB9wH+
+ AvwB/wHsAuYB/wHvAuoB/wHdAtEB/wHOArwB/wHTAsQB/wHVAsYB/wHtAt8B/wG6Aq0B/wNSAakcAANI
+ AYQBAAGoAdoB/wEAAesB/QH/AQAB5AH0Af8BCQL+Af8BOgP/AZID/wGbA/8BBgFnAeEB/wNbAdADDwEU
+ AWUBWAFIAfYBhQFhARoB/wG3AYoBJgH/AfUBrgFGAv8BvgFdAf8B2wGsAVYB/wFEAUkBFQH/ATEBQAEN
+ Af8BNwFBAQ8B/wEuATcBBgH/AR8BKQEAAf8BKQEqAQAB/wIxAQAB/wEwATYBAAH/AZIBWgEjAf8DVQG0
+ DAADJAE2AkwBbQHzAbIBtAH+Af8C3wL/AmABWgH/AlsBTwH/AsAB/AH/AUcBSAH+Af8BSAFKAYAB9wMq
+ AUEYAANxAfcB2ALKAf8ByAK3Af8B6ALgAf8B3wLTAf8BzAK5Af8B0gLBAf8B1QLEAf8B5gLWAf8BrQKf
+ Af8DUQGnHAACWwFgAdYBAAHKAfkB/wEAAeAC/wEAAe8C/wEAAfwC/wEIA/8BLwH6Av8BhgP/AVUB4AL/
+ AQcBSwGHAf4DSgGMAV4CWwHZAbEBiwEsAf8B7QGqAT8C/wHKAYwC/wHeAbcB/wHgAdIBuQH/AZ8BpgGP
+ Af8BoAGnAY8B/wGoAasBkwH/AaYBqQGQAf8BlQGZAWcB/wFXAVsBNQH/ARIBIgEAAf8BGgEqAQAB/wGq
+ AVsBKgH/A0MBdwwAAwMBBANQAZ0BggGFAeUB/wHJAcgC/wLmAe8B/wLmAe0B/wKWAv8BPAE+AeMB/wNT
+ AaoDBgEIGAABcQJuAfcBzQK7Af8BwwKyAf8B7wLqAf8B3gLSAf8BxgKzAf8B0AK+Af8B0QLAAf8B4gLR
+ Af8BqQKaAf8DUQGnHAABVQJXAboBAAHHAfMB/wEAAdEC/wEAAdoC/wEAAfUC/wEIAdgB8QH/AUIBWQFs
+ AfUBOQGoAbYB/QFOA/8BAAGCAegB/wNOAZQBRwJGAYEBnQFfAScB/wGlAbUBaQH/AfkB7gHaAv8B8AHh
+ Av8B9gHqAf8B8QHuAeAB/wHCAc8BuAH/AcYB0QG6Af8BzQHVAbwB/wHEAdABtwH/AboBzQG1Af8BhQGo
+ AYYB/wFgAYABIwH/AWQCWQHsAxIBGRAAAyUBNwJTAWsB8QG+AcAB/gH/AtcC/wHJAcgC/wGOAY8C/wJI
+ AWsB9gMtAUUcAANxAfcB7wLoAf8B8ALrAf8B/gL9Af8B2QLMAf8BvgKoAf8BxwK0Af8BzQK7Af8B3wLN
+ Af8BpgKXAf8DUQGnHAADEAEWAVkBYAFjAesBAAHTAv8BAAHPAv8BAAHoAv8BJQF/AaYB/gNZAc8BPAFc
+ AX0B+AEAAbMB8wH/AlcBWgG9Aw0BEgMNARIBXAJXAd8BvQHHAZUB/wHMAekB0QH/AeUB6QHYAf8B+AH0
+ AekC/wH9AfgB/wHZAegB1gH/Ab4B2AG+Af8BwAHYAb8B/wHDAdkBwQH/AcAB3wHKAf8BtwHYAasB/wGE
+ AXwBRQH+A0QBeRgAA1ABngGMAZAB5QH/AswC/wG1AbQC/wFjAWYB5AH/A1QBriAAA2YB9QH/Av0B/wH2
+ Au8B/wHkAtsB/wHeAtMB/wHTAsUB/wHEArAB/wHBAqsB/wHWAsEB/wGiApEB/wNRAacgAAM5AV8BKQFv
+ AYwB+gEAAdEB+wH/AQAB3gL/AQABwQHtAf8BBgF/AZQB/gEAAY0B2wH/AlkBWwHDAwQBBggAAyUBNwFi
+ AlgB7wHgAd0BugH/AdsB+AHnAf8B3gHwAeUB/wHsAfUB7QH/AeMB7wHjAf8B1QHnAdYB/wHVAeoB3AH/
+ AdsB9gHpAf8B6wHwAc8B/wHJAZMBSQH/AVICUAGkHAADHQEqAkwBbQHzAdYB2AL/AcwBzQL/Aj4BfQH4
+ AyYBOSAAAz4BawNcAeoBzALFAf8B8ALoAf8B8ALoAf8B6ALjAf8B4ALZAf8BzgK/Af8B0AK5Af8BnQKL
+ Af8DVAGrJAADOAFcAVcCXAHfAQABsQHpAf8BAAHqAv8BAAHLAfQB/wJaAV0BygMJAQwQAAMlATcBXgJY
+ Ad0B4gG3AZ4B/wH4AfcB7An/AfsD/wH6Af4B8gH/AfYB2QG9Af8BfQJcAfgDTgGUIAADAgEDA04BlAGT
+ AZcB6AH/AZoBnwHpAf8CTwFTAaUDAwEEJAADCQEMA0sBjwNiAe8B2QLWAf8B+QL2Af8B+gL3Af8B+AL3
+ Af8B7QLlAf8BlwKKAf8DTgGZKAADDQESA04BlAFOAV0BZgHwAloBXQHKAw0BEhgAAwkBDAFHAkYBgAFe
+ AlsB2QFvAlkB9QGUAYIBXwH7AYoBbgFqAfkBXQFcAVUB6gNVAbIDJwE6KAADGwEmAloBXwHbAloBYQHk
+ AyIBMjAAAxUBHQNQAZ4DaAH1A4EB+QNfAeMDWQHHA0wBkwMWAR8IAAFCAU0BPgcAAT4DAAEoAwABQAMA
+ ASABAQIAAQEBAAEBBgABCRYAA/8BAAHwAR8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHg
+ AQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAH4
+ AQ8C/wH+AX8C/wHwAQcC/wH+AX8C/wHwAQMB+QHPAeABDwL/AeABAQH4AY8B4AEHAgAB4AEBAfABjwHm
+ AUcCAAHAAQEB8AEHAeYBQwIAAcABAAHgAQcB/gEHAgABwAEAAeIBEwHwAQcCAAHAAQABwgEzAeABDwIA
+ AcABAAHEARMB4AEfAgABwAEBAYQBGQHgAW8CAAHgAQMBiAEJAeIBZwIAAfwBDwIAAeABRwIAAcABfwL/
+ AfABBwIAAYMBvwL/AfwBPwL/Ac8BvwL/Af4BfwL/AfgBPwHHAeMB4AEHAX8B/wHgAQMBwQHDAcABAwE/
+ Af8BgAEBAcABAwHgAQcBjwH/AYABAQHgAQcBgAEBAYMB/wGAAQEB4AEHAYABAQHBAf8BgAEBAeABBwGA
+ AQEBwAH/AYABAQHgAQMBgAEBAeABPwGAAQABwAEBAYABAQHwAR8EAAHAAQMB+AEPBAABwAEDAfwBBwQA
+ AeABBwH+AQMBAAEBAfgBHwHgAQcB/wEBAYABAQH4AR8B8AEPAf8BgQHAAQMB/AE/AfABDwH/AsABBwH8
+ AT8B8AEPAf8B8AL/AfwBPwH4AR8B/wH8AeAD/wHCAQMB/wHhAeABPwIAAYABAQH/AeABwAEPAgABgAEA
+ Af8BwAGAAQcCAAGAAQAB/wGAAQABAwIAAYABAAH/AYEBAAEDAgABgAEAAf8BAwEAAQECAAGAAQAB/wED
+ BAABgAEAAY4BBwHgBAABAQEMAQ8B/AQAAQMBAAEfAf4EAAEBAQABPwH/AQEDAAEBAQABPwH/AQMDAAEB
+ AcABYwH/AYcDAAEDAcABAwH/AccDAAEHAeABAwL/AgABAQEPAfABDwIAAv8BnwH/AYABAQIAAeMB/wGH
+ Af8BgAEBAgABwQH/AYEB/wGAAQECAAHAAf8BwAH/AYABAQIAAYABfwHAAf8BgAEBAgABgAE/AcAB/wGA
+ AQEDAAEfAeABPwGAAQEDAAEPAfABHwGAAQEDAAEHAfgBDwGAAQECAAEMAQcB/AEPAYABAQIAAR4BAwH8
+ AQcBgAEBAgABPwGBAf4BAwGAAQECAAH/AcAB/wEDAYABAQIAAf8B8AH/AYEBgAEBAgAB/wH4Af8BwQGA
+ AQECAAP/AeEBgAEBBP8B4AEDAYABAQGAAQEBgAEHAYABAQGAAQEDAAEDAgABgAEBAwABAQIAAYABAQMA
+ AQECAAGAAQEDAAEBAgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgAB/wHDAQABAQEA
+ AQEBAAEBAeEBhwEAAQEBAAEHAQABAQHgAQcBAAEHAQABDwEAAQcB8AEPAQABfwEAAf8BAAF/AfABDwEA
+ AQ8BhwHhAeABBwH+AQcBAAIDAsABAwH4AQcBAAIBAoABAQHAAQcGAAGAAQcGAAGAAQcCAAGAAQECAAGA
+ AQcCAAHAAQMCAAGAAQcCAAHgAQcCAAGAAQcCAAHgAQcCAAGAAQcCAAHAAQMCAAGAAQcCAAGAAQECAAGA
+ AQEGAAGAAQEGAAGAAQEBAAIBAoABAQGAAQMBAAH/AQMCwAEDAYABDwL/AYcB4QHgAQcBgAF/Af8B+AIA
+ AeMB/wHgAQcB/wHwAgABwQH/AYABAwHgASACAAGAAf8BgAEBAcABAQMAAX8BgAEBAcABAwMAAT8BgAEB
+ AYABBwMAAR8BgAEBAYABAQMAAQ8BgAEBBAABgAEHAYABAQQAAcABAwGAAQEEAAHgAQEBgAEBAQABAQIA
+ AfABAAGAAQEBAAEBAgAB+AEAAYABAQGAAQMCAAH8AQABgAEBAfABAwIAAf4BAQGAAQEB/AEHAgAB/wED
+ AYABAwH/AQcCAAH/AYcBwAEHAYAB/wIAAeABBwHgAQcBgAH/AgAB4AEHAcABAwGAAwABwAEBAYABAQGA
+ AwABgAMAAYABAAGAAQABgAMAAYADAAGAAwABgAMAAYADAAGAAwABgAMAAYADAAGAAwABgAMAAYADAAGA
+ AgABAQGAAwAB4AIAAQEBgAEBAgAB4AIAAQEBgAEBAgAB4AEBAQABAQHAAQMBgAEBAfAB9wGAAQEB8AED
+ AcABAwHwA/8B8AEDAfABBwX/AeEBgAG/AYABAAHgAT8B/wHAAQABAwGAAQAB4AEHAf8BgAIAAYABAAHA
+ AQEB/wMAAYABAAHAAQEB/gMAAYABAAHAAQEB/AEBAQABAQGAAQABgAEBAeABAwEAAQ8BgAEAAYABAQGA
+ AQcCAAGAAQABgAEBAQABDwGAAQABgAEAAYABAQEAAR8B4AEAAYABAAGAAQMBAAE/AeABAQGAAQABgAED
+ AQABPwHgAQEBgAEAAYABAwEAAT8BwAEBAYABAAHgAQcBAAF/AcABAQGAAQAB/gEHAcABfwHAAQEE/wHA
+ Af8BwAEDAgAC/wIAAcABAwIAAeMB/wYAAcMB/wYAAcABAQYAAcABAQYAAcABAQYAAcABAQYAAcABAQYA
+ AYABAQYAAYABAQYAAYABAQYAAYABAQIAAeABBwIAAYABAQIAAfABDwIAAYAB/wIAAfABBwIAAYAB/wIA
+ AfABBwIAAv8CAAHwAQcB/wGPAfABPwL/AeABBwH/AYcBgAEBAYABAQHAAQcB8AGDAgABgAEBAeABBwHg
+ AQMCAAGAAQEBgAEBAcABAQIAAYABAQMAAQECAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGA
+ AQEGAAGAAQECAAHAAgABAQGAAQECAAHgAgABAQGAAQEBAAEBAeACAAEHAYABAQEAAQEB/wHAAQABfwGA
+ AQEBgAEBAfgBTwHgBQAB+AEHAeAFAAHAAQMBwAUAAYABAwHABwABwAUAAYABAAGABwABgAUAAQEBgAYA
+ AQEIAAEBDgABgAEBBgABwAEDBgABwAEfBgAB8gEfAeABBwQABP8CAAL/AeABAwHwAQ8B4AEHAcABfwHg
+ AQAB4AEHAeABDwGAAQcB4AEAAcABAwIAAYABAAHAAQABgAEBAgABgAEAAYAHAAGABwABgAcAAYAGAAEB
+ AeAGAAEBAeAGAAEBAeAGAAEDAeAFAAGAAQMB8AIAAQECAAHAAQcB+AEAAYABAwIAAcABHwH8AQEBwAEH
+ AgAB4AF/Av8B4AEPAgAB4AH/AfgBHwT/AfgBPwHIARMB/gE/Av8BwAEfAZwBOQH8AR8BgAEHAQABDwEE
+ ASAB/AEfAYABAwEAAQcBBAEgAfgBPwGAAQEBAAEDAQQBIAHgAUMBgAEBAgABBAEgAcABAwGAAQEBgAMA
+ AYABAwGAAQEB4AMAAYABBwGAAQEB8AEAAQQBIAGAAR8BwAEBAfwBAAECAUABgAEDAfABAQH+AQECAAGA
+ AQEBwAEBAfwBAwIAAcABAQHAAQMB+AEDAYABAQHAAQMB4AEHAfABBwHAAQMBwAP/AeABDwHgAQcE/wHg
+ AQ8B/wEDBv8B8AEBAv8B+AEfAgAB4AMAAfgBAQIAAYADAAGAAwABgAEBAgABgAcAAYAHAAGADAABAQMA
+ AQEDAAEBAwABAQMAAQEDAAEDAwABAQMAAQMDAAEDAwABAwIAAYABAwIAAcABBwIAAcABBwL/AfABfwL/
+ AeABHwj/AYABPwL/AcABBwHnAf8BAAEfAfwBPwHAAQMBwAEBAQABHwH4AR8BwAEDAcABAQEAAR8B8AEP
+ AYABBwGAAQEBAAEfAeABDwGAAQcBgAEBAQABHwHAAQMBgAEHAYABAQEAAR8BgAEBAYABBwGAAQEBAAE/
+ AwABAwGAAQEBgAF/AwABAQGAAQEBgAEHBAABgAEBAYABAQQAAYABAQGABQABgAEDAYAFAAGAAQMBwAEA
+ AYEBAQIAAf8B5wHhAQACwwEAAR8D/wGBBP8BDwH/AfABDwIAAeABAwEHAf8B4AEHAgAB4AEDAQEB/wHA
+ AQMCAAHgAQMBAQH/AYABAQIAAfwBPwEAAX8EAAHgAR8BgAEPAgABgAEBAeABBwHAAQcCAAHAAQEB4AED
+ AeABAwIAAcABAwHgAQMB8AEBAgABwAEDAeABAwH4AwAB4AEHAeABAwH4AwAB4AEHAeABAwH4AwAB8AEP
+ AeABAwH4AgABAQH4AR8B4AEDAfwBAQGAAQMB+AEfAeABAwH+AQMBwAEHAfgBHwHwAQMB/wEHAeABDwH8
+ AT8B/AEDCw==
</value>
</data>
<metadata name="m_ctxPwList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
diff --git a/KeePass/Forms/MainForm_Functions.cs b/KeePass/Forms/MainForm_Functions.cs
index 15ac1f7..1724008 100644
--- a/KeePass/Forms/MainForm_Functions.cs
+++ b/KeePass/Forms/MainForm_Functions.cs
@@ -242,6 +242,8 @@ namespace KeePass.Forms
Program.TriggerSystem.RaiseEvent(EcasEventIDs.AppExit);
+ MonoWorkarounds.Release(this);
+
m_nClipClearCur = -1;
if(Program.Config.Security.ClipboardClearOnExit)
ClipboardUtil.ClearIfOwner();
@@ -409,7 +411,7 @@ namespace KeePass.Forms
TaskbarList.SetOverlayIcon(this, Properties.Resources.LockOverlay,
KPRes.Locked);
- NativeMethods.EnableWindowPeekPreview(this.Handle, false);
+ DwmUtil.EnableWindowPeekPreview(this, false);
}
else if(s.DatabaseOpened == false)
{
@@ -423,7 +425,7 @@ namespace KeePass.Forms
if(icoDisposable != null) icoDisposable.Dispose();
TaskbarList.SetOverlayIcon(this, null, string.Empty);
- NativeMethods.EnableWindowPeekPreview(this.Handle, true);
+ DwmUtil.EnableWindowPeekPreview(this, true);
}
else // Database open and not locked
{
@@ -453,7 +455,7 @@ namespace KeePass.Forms
if(icoDisposable != null) icoDisposable.Dispose();
TaskbarList.SetOverlayIcon(this, null, string.Empty);
- NativeMethods.EnableWindowPeekPreview(this.Handle, true);
+ DwmUtil.EnableWindowPeekPreview(this, true);
}
// Clip the strings again (it could be that a translator used
@@ -1955,13 +1957,14 @@ namespace KeePass.Forms
{
if(bOpenLocal)
{
- OpenFileDialog ofdDb = UIUtil.CreateOpenFileDialog(KPRes.OpenDatabaseFile,
+ OpenFileDialogEx ofdDb = UIUtil.CreateOpenFileDialog(KPRes.OpenDatabaseFile,
UIUtil.CreateFileTypeFilter(AppDefs.FileExtension.FileExt,
- KPRes.KdbxFiles, true), 1, null, false, false);
+ KPRes.KdbxFiles, true), 1, null, false,
+ AppDefs.FileDialogContext.Database);
- GlobalWindowManager.AddDialog(ofdDb);
+ GlobalWindowManager.AddDialog(ofdDb.FileDialog);
DialogResult dr = ofdDb.ShowDialog();
- GlobalWindowManager.RemoveDialog(ofdDb);
+ GlobalWindowManager.RemoveDialog(ofdDb.FileDialog);
if(dr != DialogResult.OK) return;
ioc = IOConnectionInfo.FromPath(ofdDb.FileName);
@@ -2526,6 +2529,8 @@ namespace KeePass.Forms
UpdateUIState(false, null); // Set overlay icon
m_bTaskbarButtonMessage = true;
}
+ // else if(m.Msg == DwmUtil.WM_DWMSENDICONICTHUMBNAIL)
+ // DwmUtil.SetThumbnailIcon(this, Properties.Resources.KeePass, m.LParam);
base.WndProc(ref m);
}
@@ -2800,14 +2805,15 @@ namespace KeePass.Forms
}
else
{
- SaveFileDialog sfdDb = UIUtil.CreateSaveFileDialog(KPRes.SaveDatabase,
+ SaveFileDialogEx sfdDb = UIUtil.CreateSaveFileDialog(KPRes.SaveDatabase,
UrlUtil.GetFileName(pd.IOConnectionInfo.Path),
UIUtil.CreateFileTypeFilter(AppDefs.FileExtension.FileExt,
- KPRes.KdbxFiles, true), 1, AppDefs.FileExtension.FileExt, false, true);
+ KPRes.KdbxFiles, true), 1, AppDefs.FileExtension.FileExt,
+ AppDefs.FileDialogContext.Database);
- GlobalWindowManager.AddDialog(sfdDb);
+ GlobalWindowManager.AddDialog(sfdDb.FileDialog);
dr = sfdDb.ShowDialog();
- GlobalWindowManager.RemoveDialog(sfdDb);
+ GlobalWindowManager.RemoveDialog(sfdDb.FileDialog);
if(dr == DialogResult.OK)
ioc = IOConnectionInfo.FromPath(sfdDb.FileName);
@@ -3187,7 +3193,7 @@ namespace KeePass.Forms
if(bExiting) fso = FileSaveOrigin.Exiting;
DialogResult dr = FileDialogsEx.ShowFileSaveQuestion(
- pd.IOConnectionInfo.GetDisplayName(), fso, this.Handle);
+ pd.IOConnectionInfo.GetDisplayName(), fso);
if(dr == DialogResult.Cancel) return;
else if(dr == DialogResult.Yes) bInvokeSave = true;
@@ -3674,7 +3680,7 @@ namespace KeePass.Forms
private DialogResult AskIfSynchronizeInstead(IOConnectionInfo ioc)
{
- VistaTaskDialog dlg = new VistaTaskDialog(this.Handle);
+ VistaTaskDialog dlg = new VistaTaskDialog();
string strText = string.Empty;
if(ioc.GetDisplayName().Length > 0)
@@ -3845,7 +3851,7 @@ namespace KeePass.Forms
{
bool bSingle = (vSelected.Length == 1);
- VistaTaskDialog dlg = new VistaTaskDialog(this.Handle);
+ VistaTaskDialog dlg = new VistaTaskDialog();
dlg.CommandLinks = false;
dlg.Content = EntryUtil.CreateSummaryList(null, vSelected);
dlg.MainInstruction = (bSingle ? KPRes.DeleteEntriesQuestionSingle :
@@ -3924,7 +3930,7 @@ namespace KeePass.Forms
if(bPermanent)
{
- VistaTaskDialog dlg = new VistaTaskDialog(this.Handle);
+ VistaTaskDialog dlg = new VistaTaskDialog();
dlg.CommandLinks = false;
dlg.Content = KPRes.DeleteGroupInfo + EntryUtil.CreateSummaryList(pg, true);
dlg.MainInstruction = KPRes.DeleteGroupQuestion;
@@ -3974,7 +3980,7 @@ namespace KeePass.Forms
if(pg == null) { Debug.Assert(false); return; }
if(pg != GetSelectedGroup()) { Debug.Assert(false); return; }
- VistaTaskDialog dlg = new VistaTaskDialog(this.Handle);
+ VistaTaskDialog dlg = new VistaTaskDialog();
dlg.CommandLinks = false;
dlg.Content = EntryUtil.CreateSummaryList(pg, false);
dlg.MainInstruction = KPRes.EmptyRecycleBinQuestion;
@@ -4092,7 +4098,7 @@ namespace KeePass.Forms
if(ioc.IsLocalFile()) // Expand relative path to absolute
ioc.Path = UrlUtil.MakeAbsolutePath(UrlUtil.EnsureTerminatingSeparator(
- Directory.GetCurrentDirectory(), false) + "Sentinel", ioc.Path);
+ WinUtil.GetWorkingDirectory(), false) + "Sentinel", ioc.Path);
if(args[AppDefs.CommandLineOptions.IoCredFromRecent] != null)
ioc = CompleteConnectionInfoUsingMru(ioc);
@@ -4671,7 +4677,7 @@ namespace KeePass.Forms
SetStatusEx(str);
if(!bDbMntnc || !Program.Config.UI.ShowDbMntncResultsDialog) return;
- VistaTaskDialog dlg = new VistaTaskDialog(this.Handle);
+ VistaTaskDialog dlg = new VistaTaskDialog();
dlg.CommandLinks = false;
dlg.Content = str;
dlg.SetIcon(VtdIcon.Information);
diff --git a/KeePass/Forms/OptionsForm.cs b/KeePass/Forms/OptionsForm.cs
index a061396..e78034a 100644
--- a/KeePass/Forms/OptionsForm.cs
+++ b/KeePass/Forms/OptionsForm.cs
@@ -508,6 +508,8 @@ namespace KeePass.Forms
lvg, KPRes.SameKeybLayout);
m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeCancelOnWindowChange",
lvg, KPRes.AutoTypeCancelOnWindowChange);
+ m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeCancelOnTitleChange",
+ lvg, KPRes.AutoTypeCancelOnTitleChange);
lvg = new ListViewGroup(KPRes.Advanced);
m_lvAdvanced.Groups.Add(lvg);
@@ -525,6 +527,8 @@ namespace KeePass.Forms
m_cdxAdvanced.CreateItem(Program.Config.Defaults, "RememberKeySources",
lvg, KPRes.RememberKeySources);
+ m_cdxAdvanced.CreateItem(Program.Config.Application, "RememberWorkingDirectories",
+ lvg, KPRes.RememberWorkingDirectories);
m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "SeparateHidingSettings",
lvg, KPRes.RememberHidingSettings);
m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "UnhideButtonAlsoUnhidesSource",
diff --git a/KeePass/Forms/PwEntryForm.Designer.cs b/KeePass/Forms/PwEntryForm.Designer.cs
index e189648..cc86f7d 100644
--- a/KeePass/Forms/PwEntryForm.Designer.cs
+++ b/KeePass/Forms/PwEntryForm.Designer.cs
@@ -67,21 +67,17 @@
this.m_ttBalloon = new System.Windows.Forms.ToolTip(this.components);
this.m_tabMain = new System.Windows.Forms.TabControl();
this.m_tabEntry = new System.Windows.Forms.TabPage();
- this.m_rtNotes = new KeePass.UI.CustomRichTextBoxEx();
- this.m_pbQuality = new KeePass.UI.QualityProgressBar();
this.m_tabAdvanced = new System.Windows.Forms.TabPage();
this.m_grpAttachments = new System.Windows.Forms.GroupBox();
this.m_btnBinView = new System.Windows.Forms.Button();
this.m_btnBinSave = new System.Windows.Forms.Button();
this.m_btnBinDelete = new System.Windows.Forms.Button();
this.m_btnBinAdd = new System.Windows.Forms.Button();
- this.m_lvBinaries = new KeePass.UI.CustomListViewEx();
this.m_grpStringFields = new System.Windows.Forms.GroupBox();
this.m_btnStrMove = new System.Windows.Forms.Button();
this.m_btnStrAdd = new System.Windows.Forms.Button();
this.m_btnStrEdit = new System.Windows.Forms.Button();
this.m_btnStrDelete = new System.Windows.Forms.Button();
- this.m_lvStrings = new KeePass.UI.CustomListViewEx();
this.m_ctxListOperations = new System.Windows.Forms.ContextMenuStrip(this.components);
this.m_menuListCtxCopyFieldValue = new System.Windows.Forms.ToolStripMenuItem();
this.m_tabProperties = new System.Windows.Forms.TabPage();
@@ -107,12 +103,10 @@
this.m_btnAutoTypeEdit = new System.Windows.Forms.Button();
this.m_btnAutoTypeAdd = new System.Windows.Forms.Button();
this.m_btnAutoTypeDelete = new System.Windows.Forms.Button();
- this.m_lvAutoType = new KeePass.UI.CustomListViewEx();
this.m_tabHistory = new System.Windows.Forms.TabPage();
this.m_btnHistoryDelete = new System.Windows.Forms.Button();
this.m_btnHistoryView = new System.Windows.Forms.Button();
this.m_btnHistoryRestore = new System.Windows.Forms.Button();
- this.m_lvHistory = new KeePass.UI.CustomListViewEx();
this.m_btnTools = new System.Windows.Forms.Button();
this.m_bannerImage = new System.Windows.Forms.PictureBox();
this.m_ctxStrMoveToStandard = new System.Windows.Forms.ContextMenuStrip(this.components);
@@ -142,6 +136,12 @@
this.m_ctxBinImportFile = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxBinSep0 = new System.Windows.Forms.ToolStripSeparator();
this.m_ctxBinNew = new System.Windows.Forms.ToolStripMenuItem();
+ this.m_rtNotes = new KeePass.UI.CustomRichTextBoxEx();
+ this.m_pbQuality = new KeePass.UI.QualityProgressBar();
+ this.m_lvBinaries = new KeePass.UI.CustomListViewEx();
+ this.m_lvStrings = new KeePass.UI.CustomListViewEx();
+ this.m_lvAutoType = new KeePass.UI.CustomListViewEx();
+ this.m_lvHistory = new KeePass.UI.CustomListViewEx();
this.m_ctxDefaultTimes.SuspendLayout();
this.m_tabMain.SuspendLayout();
this.m_tabEntry.SuspendLayout();
@@ -501,28 +501,6 @@
this.m_tabEntry.Text = "Entry";
this.m_tabEntry.UseVisualStyleBackColor = true;
//
- // m_rtNotes
- //
- this.m_rtNotes.Location = new System.Drawing.Point(81, 167);
- this.m_rtNotes.Name = "m_rtNotes";
- this.m_rtNotes.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
- this.m_rtNotes.Size = new System.Drawing.Size(374, 140);
- this.m_rtNotes.TabIndex = 18;
- this.m_rtNotes.Text = "";
- this.m_rtNotes.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnNotesLinkClicked);
- //
- // m_pbQuality
- //
- this.m_pbQuality.Location = new System.Drawing.Point(81, 118);
- this.m_pbQuality.Maximum = 100;
- this.m_pbQuality.Minimum = 0;
- this.m_pbQuality.Name = "m_pbQuality";
- this.m_pbQuality.Size = new System.Drawing.Size(283, 16);
- this.m_pbQuality.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
- this.m_pbQuality.TabIndex = 13;
- this.m_pbQuality.TabStop = false;
- this.m_pbQuality.Value = 50;
- //
// m_tabAdvanced
//
this.m_tabAdvanced.Controls.Add(this.m_grpAttachments);
@@ -589,23 +567,6 @@
this.m_btnBinAdd.UseVisualStyleBackColor = true;
this.m_btnBinAdd.Click += new System.EventHandler(this.OnBtnBinAdd);
//
- // m_lvBinaries
- //
- this.m_lvBinaries.FullRowSelect = true;
- this.m_lvBinaries.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.m_lvBinaries.HideSelection = false;
- this.m_lvBinaries.LabelEdit = true;
- this.m_lvBinaries.Location = new System.Drawing.Point(6, 20);
- this.m_lvBinaries.Name = "m_lvBinaries";
- this.m_lvBinaries.ShowItemToolTips = true;
- this.m_lvBinaries.Size = new System.Drawing.Size(362, 135);
- this.m_lvBinaries.TabIndex = 0;
- this.m_lvBinaries.UseCompatibleStateImageBehavior = false;
- this.m_lvBinaries.View = System.Windows.Forms.View.Details;
- this.m_lvBinaries.ItemActivate += new System.EventHandler(this.OnBinariesItemActivate);
- this.m_lvBinaries.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.OnBinAfterLabelEdit);
- this.m_lvBinaries.SelectedIndexChanged += new System.EventHandler(this.OnBinariesSelectedIndexChanged);
- //
// m_grpStringFields
//
this.m_grpStringFields.Controls.Add(this.m_btnStrMove);
@@ -660,22 +621,6 @@
this.m_btnStrDelete.UseVisualStyleBackColor = true;
this.m_btnStrDelete.Click += new System.EventHandler(this.OnBtnStrDelete);
//
- // m_lvStrings
- //
- this.m_lvStrings.ContextMenuStrip = this.m_ctxListOperations;
- this.m_lvStrings.FullRowSelect = true;
- this.m_lvStrings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.m_lvStrings.HideSelection = false;
- this.m_lvStrings.Location = new System.Drawing.Point(6, 20);
- this.m_lvStrings.Name = "m_lvStrings";
- this.m_lvStrings.ShowItemToolTips = true;
- this.m_lvStrings.Size = new System.Drawing.Size(362, 135);
- this.m_lvStrings.TabIndex = 0;
- this.m_lvStrings.UseCompatibleStateImageBehavior = false;
- this.m_lvStrings.View = System.Windows.Forms.View.Details;
- this.m_lvStrings.ItemActivate += new System.EventHandler(this.OnStringsItemActivate);
- this.m_lvStrings.SelectedIndexChanged += new System.EventHandler(this.OnStringsSelectedIndexChanged);
- //
// m_ctxListOperations
//
this.m_ctxListOperations.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -932,22 +877,6 @@
this.m_btnAutoTypeDelete.UseVisualStyleBackColor = true;
this.m_btnAutoTypeDelete.Click += new System.EventHandler(this.OnBtnAutoTypeDelete);
//
- // m_lvAutoType
- //
- this.m_lvAutoType.ContextMenuStrip = this.m_ctxListOperations;
- this.m_lvAutoType.FullRowSelect = true;
- this.m_lvAutoType.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.m_lvAutoType.HideSelection = false;
- this.m_lvAutoType.Location = new System.Drawing.Point(9, 134);
- this.m_lvAutoType.Name = "m_lvAutoType";
- this.m_lvAutoType.ShowItemToolTips = true;
- this.m_lvAutoType.Size = new System.Drawing.Size(367, 170);
- this.m_lvAutoType.TabIndex = 6;
- this.m_lvAutoType.UseCompatibleStateImageBehavior = false;
- this.m_lvAutoType.View = System.Windows.Forms.View.Details;
- this.m_lvAutoType.ItemActivate += new System.EventHandler(this.OnAutoTypeItemActivate);
- this.m_lvAutoType.SelectedIndexChanged += new System.EventHandler(this.OnAutoTypeSelectedIndexChanged);
- //
// m_tabHistory
//
this.m_tabHistory.Controls.Add(this.m_btnHistoryDelete);
@@ -992,21 +921,6 @@
this.m_btnHistoryRestore.UseVisualStyleBackColor = true;
this.m_btnHistoryRestore.Click += new System.EventHandler(this.OnBtnHistoryRestore);
//
- // m_lvHistory
- //
- this.m_lvHistory.FullRowSelect = true;
- this.m_lvHistory.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.m_lvHistory.HideSelection = false;
- this.m_lvHistory.Location = new System.Drawing.Point(9, 13);
- this.m_lvHistory.Name = "m_lvHistory";
- this.m_lvHistory.ShowItemToolTips = true;
- this.m_lvHistory.Size = new System.Drawing.Size(447, 288);
- this.m_lvHistory.TabIndex = 0;
- this.m_lvHistory.UseCompatibleStateImageBehavior = false;
- this.m_lvHistory.View = System.Windows.Forms.View.Details;
- this.m_lvHistory.ItemActivate += new System.EventHandler(this.OnHistoryItemActivate);
- this.m_lvHistory.SelectedIndexChanged += new System.EventHandler(this.OnHistorySelectedIndexChanged);
- //
// m_btnTools
//
this.m_btnTools.Location = new System.Drawing.Point(6, 453);
@@ -1080,7 +994,7 @@
this.m_ctxPwGenSep0,
this.m_ctxPwGenProfiles});
this.m_ctxPwGen.Name = "m_ctxPwGen";
- this.m_ctxPwGen.Size = new System.Drawing.Size(229, 76);
+ this.m_ctxPwGen.Size = new System.Drawing.Size(229, 54);
//
// m_ctxPwGenOpen
//
@@ -1233,6 +1147,96 @@
this.m_ctxBinNew.Text = "&Create Empty Attachment";
this.m_ctxBinNew.Click += new System.EventHandler(this.OnCtxBinNew);
//
+ // m_rtNotes
+ //
+ this.m_rtNotes.Location = new System.Drawing.Point(81, 167);
+ this.m_rtNotes.Name = "m_rtNotes";
+ this.m_rtNotes.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
+ this.m_rtNotes.Size = new System.Drawing.Size(374, 140);
+ this.m_rtNotes.TabIndex = 18;
+ this.m_rtNotes.Text = "";
+ this.m_rtNotes.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnNotesLinkClicked);
+ //
+ // m_pbQuality
+ //
+ this.m_pbQuality.Location = new System.Drawing.Point(81, 118);
+ this.m_pbQuality.Maximum = 100;
+ this.m_pbQuality.Minimum = 0;
+ this.m_pbQuality.Name = "m_pbQuality";
+ this.m_pbQuality.Size = new System.Drawing.Size(283, 16);
+ this.m_pbQuality.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+ this.m_pbQuality.TabIndex = 13;
+ this.m_pbQuality.TabStop = false;
+ this.m_pbQuality.Value = 50;
+ //
+ // m_lvBinaries
+ //
+ this.m_lvBinaries.AllowDrop = true;
+ this.m_lvBinaries.FullRowSelect = true;
+ this.m_lvBinaries.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.m_lvBinaries.HideSelection = false;
+ this.m_lvBinaries.LabelEdit = true;
+ this.m_lvBinaries.Location = new System.Drawing.Point(6, 20);
+ this.m_lvBinaries.Name = "m_lvBinaries";
+ this.m_lvBinaries.ShowItemToolTips = true;
+ this.m_lvBinaries.Size = new System.Drawing.Size(362, 135);
+ this.m_lvBinaries.TabIndex = 0;
+ this.m_lvBinaries.UseCompatibleStateImageBehavior = false;
+ this.m_lvBinaries.View = System.Windows.Forms.View.Details;
+ this.m_lvBinaries.ItemActivate += new System.EventHandler(this.OnBinariesItemActivate);
+ this.m_lvBinaries.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.OnBinAfterLabelEdit);
+ this.m_lvBinaries.SelectedIndexChanged += new System.EventHandler(this.OnBinariesSelectedIndexChanged);
+ this.m_lvBinaries.DragDrop += new System.Windows.Forms.DragEventHandler(this.OnBinDragDrop);
+ this.m_lvBinaries.DragEnter += new System.Windows.Forms.DragEventHandler(this.OnBinDragEnter);
+ this.m_lvBinaries.DragOver += new System.Windows.Forms.DragEventHandler(this.OnBinDragOver);
+ //
+ // m_lvStrings
+ //
+ this.m_lvStrings.ContextMenuStrip = this.m_ctxListOperations;
+ this.m_lvStrings.FullRowSelect = true;
+ this.m_lvStrings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.m_lvStrings.HideSelection = false;
+ this.m_lvStrings.Location = new System.Drawing.Point(6, 20);
+ this.m_lvStrings.Name = "m_lvStrings";
+ this.m_lvStrings.ShowItemToolTips = true;
+ this.m_lvStrings.Size = new System.Drawing.Size(362, 135);
+ this.m_lvStrings.TabIndex = 0;
+ this.m_lvStrings.UseCompatibleStateImageBehavior = false;
+ this.m_lvStrings.View = System.Windows.Forms.View.Details;
+ this.m_lvStrings.ItemActivate += new System.EventHandler(this.OnStringsItemActivate);
+ this.m_lvStrings.SelectedIndexChanged += new System.EventHandler(this.OnStringsSelectedIndexChanged);
+ //
+ // m_lvAutoType
+ //
+ this.m_lvAutoType.ContextMenuStrip = this.m_ctxListOperations;
+ this.m_lvAutoType.FullRowSelect = true;
+ this.m_lvAutoType.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.m_lvAutoType.HideSelection = false;
+ this.m_lvAutoType.Location = new System.Drawing.Point(9, 134);
+ this.m_lvAutoType.Name = "m_lvAutoType";
+ this.m_lvAutoType.ShowItemToolTips = true;
+ this.m_lvAutoType.Size = new System.Drawing.Size(367, 170);
+ this.m_lvAutoType.TabIndex = 6;
+ this.m_lvAutoType.UseCompatibleStateImageBehavior = false;
+ this.m_lvAutoType.View = System.Windows.Forms.View.Details;
+ this.m_lvAutoType.ItemActivate += new System.EventHandler(this.OnAutoTypeItemActivate);
+ this.m_lvAutoType.SelectedIndexChanged += new System.EventHandler(this.OnAutoTypeSelectedIndexChanged);
+ //
+ // m_lvHistory
+ //
+ this.m_lvHistory.FullRowSelect = true;
+ this.m_lvHistory.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.m_lvHistory.HideSelection = false;
+ this.m_lvHistory.Location = new System.Drawing.Point(9, 13);
+ this.m_lvHistory.Name = "m_lvHistory";
+ this.m_lvHistory.ShowItemToolTips = true;
+ this.m_lvHistory.Size = new System.Drawing.Size(447, 288);
+ this.m_lvHistory.TabIndex = 0;
+ this.m_lvHistory.UseCompatibleStateImageBehavior = false;
+ this.m_lvHistory.View = System.Windows.Forms.View.Details;
+ this.m_lvHistory.ItemActivate += new System.EventHandler(this.OnHistoryItemActivate);
+ this.m_lvHistory.SelectedIndexChanged += new System.EventHandler(this.OnHistorySelectedIndexChanged);
+ //
// PwEntryForm
//
this.AcceptButton = this.m_btnOK;
diff --git a/KeePass/Forms/PwEntryForm.cs b/KeePass/Forms/PwEntryForm.cs
index 37bc5b3..a20a5f2 100644
--- a/KeePass/Forms/PwEntryForm.cs
+++ b/KeePass/Forms/PwEntryForm.cs
@@ -943,8 +943,9 @@ namespace KeePass.Forms
if(nSelCount == 1)
{
- SaveFileDialog sfd = UIUtil.CreateSaveFileDialog(KPRes.AttachmentSave,
- lvsc[0].Text, UIUtil.CreateFileTypeFilter(null, null, true), 1, null, false);
+ SaveFileDialogEx sfd = UIUtil.CreateSaveFileDialog(KPRes.AttachmentSave,
+ lvsc[0].Text, UIUtil.CreateFileTypeFilter(null, null, true), 1, null,
+ AppDefs.FileDialogContext.Attachments);
if(sfd.ShowDialog() == DialogResult.OK)
SaveAttachmentTo(lvsc[0], sfd.FileName, false);
@@ -1532,8 +1533,8 @@ namespace KeePass.Forms
if(strFilter != null) strFlt += strFilter;
strFlt += KPRes.AllFiles + @" (*.*)|*.*";
- OpenFileDialog dlg = UIUtil.CreateOpenFileDialog(null, strFlt, 1, null,
- false, false);
+ OpenFileDialogEx dlg = UIUtil.CreateOpenFileDialog(null, strFlt, 1, null,
+ false, AppDefs.FileDialogContext.Attachments);
if(dlg.ShowDialog() == DialogResult.OK)
m_tbUrl.Text = "cmd://\"" + dlg.FileName + "\"";
@@ -1662,70 +1663,78 @@ namespace KeePass.Forms
{
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.AttachFiles,
- UIUtil.CreateFileTypeFilter(null, null, true), 1, null, true, true);
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog(KPRes.AttachFiles,
+ UIUtil.CreateFileTypeFilter(null, null, true), 1, null, true,
+ AppDefs.FileDialogContext.Attachments);
if(ofd.ShowDialog() == DialogResult.OK)
+ BinImportFiles(ofd.FileNames);
+ }
+
+ private void BinImportFiles(string[] vPaths)
+ {
+ if(vPaths == null) { Debug.Assert(false); return; }
+
+ UpdateEntryBinaries(true, false);
+
+ foreach(string strFile in vPaths)
{
- UpdateEntryBinaries(true, false);
+ if(string.IsNullOrEmpty(strFile)) { Debug.Assert(false); continue; }
+
+ byte[] vBytes = null;
+ string strMsg, strItem = UrlUtil.GetFileName(strFile);
- foreach(string strFile in ofd.FileNames)
+ if(m_vBinaries.Get(strItem) != null)
{
- byte[] vBytes = null;
- string strMsg, strItem = UrlUtil.GetFileName(strFile);
+ strMsg = KPRes.AttachedExistsAlready + MessageService.NewLine +
+ strItem + MessageService.NewParagraph + KPRes.AttachNewRename +
+ MessageService.NewParagraph + KPRes.AttachNewRenameRemarks0 +
+ MessageService.NewLine + KPRes.AttachNewRenameRemarks1 +
+ MessageService.NewLine + KPRes.AttachNewRenameRemarks2;
- if(m_vBinaries.Get(strItem) != null)
- {
- strMsg = KPRes.AttachedExistsAlready + MessageService.NewLine +
- strItem + MessageService.NewParagraph + KPRes.AttachNewRename +
- MessageService.NewParagraph + KPRes.AttachNewRenameRemarks0 +
- MessageService.NewLine + KPRes.AttachNewRenameRemarks1 +
- MessageService.NewLine + KPRes.AttachNewRenameRemarks2;
+ DialogResult dr = MessageService.Ask(strMsg, null,
+ MessageBoxButtons.YesNoCancel);
- DialogResult dr = MessageService.Ask(strMsg, null,
- MessageBoxButtons.YesNoCancel);
+ if(dr == DialogResult.Cancel) continue;
+ else if(dr == DialogResult.Yes)
+ {
+ string strFileName = UrlUtil.StripExtension(strItem);
+ string strExtension = "." + UrlUtil.GetExtension(strItem);
- if(dr == DialogResult.Cancel) continue;
- else if(dr == DialogResult.Yes)
+ int nTry = 0;
+ while(true)
{
- string strFileName = UrlUtil.StripExtension(strItem);
- string strExtension = "." + UrlUtil.GetExtension(strItem);
-
- int nTry = 0;
- while(true)
+ string strNewName = strFileName + nTry.ToString() + strExtension;
+ if(m_vBinaries.Get(strNewName) == null)
{
- string strNewName = strFileName + nTry.ToString() + strExtension;
- if(m_vBinaries.Get(strNewName) == null)
- {
- strItem = strNewName;
- break;
- }
-
- ++nTry;
+ strItem = strNewName;
+ break;
}
+
+ ++nTry;
}
}
+ }
- try
- {
- vBytes = File.ReadAllBytes(strFile);
- vBytes = DataEditorForm.ConvertAttachment(strItem, vBytes);
+ try
+ {
+ vBytes = File.ReadAllBytes(strFile);
+ vBytes = DataEditorForm.ConvertAttachment(strItem, vBytes);
- if(vBytes != null)
- {
- ProtectedBinary pb = new ProtectedBinary(false, vBytes);
- m_vBinaries.Set(strItem, pb);
- }
- }
- catch(Exception exAttach)
+ if(vBytes != null)
{
- MessageService.ShowWarning(KPRes.AttachFailed, strFile, exAttach);
+ ProtectedBinary pb = new ProtectedBinary(false, vBytes);
+ m_vBinaries.Set(strItem, pb);
}
}
-
- UpdateEntryBinaries(false, true);
- ResizeColumnHeaders();
+ catch(Exception exAttach)
+ {
+ MessageService.ShowWarning(KPRes.AttachFailed, strFile, exAttach);
+ }
}
+
+ UpdateEntryBinaries(false, true);
+ ResizeColumnHeaders();
}
private void OnCtxBinNew(object sender, EventArgs e)
@@ -1779,5 +1788,34 @@ namespace KeePass.Forms
UpdateEntryBinaries(false, true, strNew);
}
+
+ private void BinDragAccept(DragEventArgs e)
+ {
+ if(e == null) { Debug.Assert(false); return; }
+
+ IDataObject ido = e.Data;
+ if((ido == null) || !ido.GetDataPresent(DataFormats.FileDrop))
+ e.Effect = DragDropEffects.None;
+ else e.Effect = DragDropEffects.Copy;
+ }
+
+ private void OnBinDragEnter(object sender, DragEventArgs e)
+ {
+ BinDragAccept(e);
+ }
+
+ private void OnBinDragOver(object sender, DragEventArgs e)
+ {
+ BinDragAccept(e);
+ }
+
+ private void OnBinDragDrop(object sender, DragEventArgs e)
+ {
+ try
+ {
+ BinImportFiles(e.Data.GetData(DataFormats.FileDrop) as string[]);
+ }
+ catch(Exception) { Debug.Assert(false); }
+ }
}
}
diff --git a/KeePass/Forms/PwGeneratorForm.cs b/KeePass/Forms/PwGeneratorForm.cs
index 1fd6be8..750b772 100644
--- a/KeePass/Forms/PwGeneratorForm.cs
+++ b/KeePass/Forms/PwGeneratorForm.cs
@@ -536,7 +536,7 @@ namespace KeePass.Forms
}
m_pbPreview.Value = 100;
- m_tbPreview.Text = sbList.ToString();
+ UIUtil.SetMultilineText(m_tbPreview, sbList.ToString());
this.Cursor = cNormalCursor;
}
diff --git a/KeePass/Forms/StatusLoggerForm.cs b/KeePass/Forms/StatusLoggerForm.cs
index 2f7bd06..13fdd0f 100644
--- a/KeePass/Forms/StatusLoggerForm.cs
+++ b/KeePass/Forms/StatusLoggerForm.cs
@@ -168,7 +168,7 @@ namespace KeePass.Forms
return;
}
- m_tbDetails.Text = slvic[0].Text;
+ UIUtil.SetMultilineText(m_tbDetails, slvic[0].Text);
}
private void OnFormClosed(object sender, FormClosedEventArgs e)
diff --git a/KeePass/KeePass.csproj b/KeePass/KeePass.csproj
index 87f61d0..0013d09 100644
--- a/KeePass/KeePass.csproj
+++ b/KeePass/KeePass.csproj
@@ -240,17 +240,17 @@
<Compile Include="..\KeePassLib\Serialization\IOConnectionInfo.cs">
<Link>KeePassLib\Serialization\IOConnectionInfo.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.cs">
- <Link>KeePassLib\Serialization\Kdb4File.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.cs">
+ <Link>KeePassLib\Serialization\KdbxFile.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.Read.cs">
- <Link>KeePassLib\Serialization\Kdb4File.Read.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.Read.cs">
+ <Link>KeePassLib\Serialization\KdbxFile.Read.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.Read.Streamed.cs">
- <Link>KeePassLib\Serialization\Kdb4File.Read.Streamed.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.Read.Streamed.cs">
+ <Link>KeePassLib\Serialization\KdbxFile.Read.Streamed.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.Write.cs">
- <Link>KeePassLib\Serialization\Kdb4File.Write.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.Write.cs">
+ <Link>KeePassLib\Serialization\KdbxFile.Write.cs</Link>
</Compile>
<Compile Include="..\KeePassLib\Serialization\OldFormatException.cs">
<Link>KeePassLib\Serialization\OldFormatException.cs</Link>
@@ -276,6 +276,9 @@
<Compile Include="..\KeePassLib\Utility\AppLogEx.cs">
<Link>KeePassLib\Utility\AppLogEx.cs</Link>
</Compile>
+ <Compile Include="..\KeePassLib\Utility\GfxUtil.cs">
+ <Link>KeePassLib\Utility\GfxUtil.cs</Link>
+ </Compile>
<Compile Include="..\KeePassLib\Utility\MemUtil.cs">
<Link>KeePassLib\Utility\MemUtil.cs</Link>
</Compile>
@@ -316,11 +319,13 @@
<Compile Include="DataExchange\Formats\AnyPwCsv144.cs" />
<Compile Include="DataExchange\Formats\CodeWalletTxt605.cs" />
<Compile Include="DataExchange\Formats\DataVaultCsv47.cs" />
+ <Compile Include="DataExchange\Formats\DesktopKnox32.cs" />
<Compile Include="DataExchange\Formats\FlexWalletXml17.cs" />
<Compile Include="DataExchange\Formats\GenericCsv.cs" />
<Compile Include="DataExchange\Formats\HandySafeProXml12.cs" />
<Compile Include="DataExchange\Formats\HandySafeTxt512.cs" />
<Compile Include="DataExchange\Formats\KasperskyPwMgrXml50.cs" />
+ <Compile Include="DataExchange\Formats\KeePassCsv1x.cs" />
<Compile Include="DataExchange\Formats\KeePassHtml2x.cs" />
<Compile Include="DataExchange\Formats\KeePassKdb1x.cs" />
<Compile Include="DataExchange\Formats\KeePassKdb2x.cs" />
@@ -359,8 +364,8 @@
<Compile Include="DataExchange\Formats\ZdnPwProTxt314.cs" />
<Compile Include="DataExchange\ImportUtil.cs" />
<Compile Include="DataExchange\Json.cs" />
- <Compile Include="DataExchange\Kdb3File.cs" />
- <Compile Include="DataExchange\Kdb3Manager.cs" />
+ <Compile Include="DataExchange\KdbFile.cs" />
+ <Compile Include="DataExchange\KdbManager.cs" />
<Compile Include="DataExchange\PwExportInfo.cs" />
<Compile Include="Ecas\EcasContext.cs" />
<Compile Include="Ecas\EcasEnum.cs" />
@@ -699,6 +704,7 @@
<SubType>Component</SubType>
</Compile>
<Compile Include="UI\DocumentManagerEx.cs" />
+ <Compile Include="UI\DwmUtil.cs" />
<Compile Include="UI\ExpiryControlGroup.cs" />
<Compile Include="UI\FileDialogsEx.cs" />
<Compile Include="UI\FontUtil.cs" />
@@ -948,7 +954,7 @@
<Compile Include="Util\ClipboardContents.cs" />
<Compile Include="Util\ClipboardEventChainBlocker.cs" />
<Compile Include="Util\ClipboardUtil.cs" />
- <Compile Include="Util\ClipboardUtil.MacOSX.cs" />
+ <Compile Include="Util\ClipboardUtil.Unix.cs" />
<Compile Include="Util\ClipboardUtil.Windows.cs" />
<Compile Include="Util\CommandLineArgs.cs" />
<Compile Include="Ecas\EcasActionType.cs" />
@@ -1124,6 +1130,7 @@
</ItemGroup>
<ItemGroup>
<Content Include="KeePass.ico" />
+ <None Include="Resources\Images\B16x16_Imp_DesktopKnox.png" />
<None Include="Resources\Nuvola_Derived\B16x16_Key_New.png" />
<None Include="Resources\Nuvola_Derived\B16x16_EditCopyLink.png" />
<None Include="Resources\Images\B16x16_Imp_KasperskyPwMgr.png" />
diff --git a/KeePass/Native/NativeMethods.Defs.cs b/KeePass/Native/NativeMethods.Defs.cs
index 46b33c6..6d8acee 100644
--- a/KeePass/Native/NativeMethods.Defs.cs
+++ b/KeePass/Native/NativeMethods.Defs.cs
@@ -160,8 +160,6 @@ namespace KeePass.Native
internal const int OFN_DONTADDTORECENT = 0x02000000;
- internal const uint DWMWA_DISALLOW_PEEK = 11;
-
internal const uint SHGFI_DISPLAYNAME = 0x000000200;
internal const uint SHGFI_ICON = 0x000000100;
internal const uint SHGFI_TYPENAME = 0x000000400;
diff --git a/KeePass/Native/NativeMethods.New.cs b/KeePass/Native/NativeMethods.New.cs
index 8d2c89d..7867518 100644
--- a/KeePass/Native/NativeMethods.New.cs
+++ b/KeePass/Native/NativeMethods.New.cs
@@ -277,14 +277,6 @@ namespace KeePass.Native
catch(Exception) { Debug.Assert(!WinUtil.IsAtLeastWindows7); }
} */
- internal static void EnableWindowPeekPreview(IntPtr hWnd, bool bEnable)
- {
- int iNoPeek = (bEnable ? 0 : 1);
-
- try { DwmSetWindowAttributeInt(hWnd, DWMWA_DISALLOW_PEEK, ref iNoPeek, 4); }
- catch(Exception) { Debug.Assert(!WinUtil.IsAtLeastWindowsVista); }
- }
-
internal static uint? GetLastInputTime()
{
try
diff --git a/KeePass/Native/NativeMethods.Unix.cs b/KeePass/Native/NativeMethods.Unix.cs
index 812a3df..8544892 100644
--- a/KeePass/Native/NativeMethods.Unix.cs
+++ b/KeePass/Native/NativeMethods.Unix.cs
@@ -22,6 +22,7 @@ using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
+using System.Reflection;
using System.Diagnostics;
using KeePass.UI;
@@ -35,6 +36,13 @@ namespace KeePass.Native
{
internal static partial class NativeMethods
{
+ [StructLayout(LayoutKind.Sequential)]
+ private struct XClassHint
+ {
+ public IntPtr res_name;
+ public IntPtr res_class;
+ }
+
/* private const string PathLibDo = "/usr/lib/gnome-do/libdo";
private const UnmanagedType NtvStringType = UnmanagedType.LPStr;
@@ -71,6 +79,9 @@ namespace KeePass.Native
internal delegate void BindKeyHandler(string strKey, IntPtr lpUserData); */
+ [DllImport("libX11")]
+ private static extern int XSetClassHint(IntPtr display, IntPtr window, IntPtr class_hints);
+
private static bool LoseFocusUnix(Form fCurrent)
{
if(fCurrent == null) { Debug.Assert(false); return true; }
@@ -131,5 +142,68 @@ namespace KeePass.Native
return string.Empty;
}
+
+ private static Type m_tXplatUIX11 = null;
+ private static Type GetXplatUIX11Type(bool bThrowOnError)
+ {
+ if(m_tXplatUIX11 == null)
+ {
+ CheckState cs = CheckState.Indeterminate; // In System.Windows.Forms
+ string strTypeCS = cs.GetType().AssemblyQualifiedName;
+ string strTypeX11 = strTypeCS.Replace("CheckState", "XplatUIX11");
+ m_tXplatUIX11 = Type.GetType(strTypeX11, bThrowOnError, true);
+ }
+
+ return m_tXplatUIX11;
+ }
+
+ private static Type m_tHwnd = null;
+ private static Type GetHwndType(bool bThrowOnError)
+ {
+ if(m_tHwnd == null)
+ {
+ CheckState cs = CheckState.Indeterminate; // In System.Windows.Forms
+ string strTypeCS = cs.GetType().AssemblyQualifiedName;
+ string strTypeHwnd = strTypeCS.Replace("CheckState", "Hwnd");
+ m_tHwnd = Type.GetType(strTypeHwnd, bThrowOnError, true);
+ }
+
+ return m_tHwnd;
+ }
+
+ internal static void SetWmClass(Form f, string strName, string strClass)
+ {
+ if(f == null) { Debug.Assert(false); return; }
+
+ try
+ {
+ Type tXplatUIX11 = GetXplatUIX11Type(true);
+ FieldInfo fiDisplayHandle = tXplatUIX11.GetField("DisplayHandle",
+ BindingFlags.NonPublic | BindingFlags.Static);
+ IntPtr hDisplay = (IntPtr)fiDisplayHandle.GetValue(null);
+
+ Type tHwnd = GetHwndType(true);
+ MethodInfo miObjectFromHandle = tHwnd.GetMethod("ObjectFromHandle",
+ BindingFlags.Public | BindingFlags.Static);
+ object oHwnd = miObjectFromHandle.Invoke(null, new object[] { f.Handle });
+
+ FieldInfo fiWholeWindow = tHwnd.GetField("whole_window",
+ BindingFlags.NonPublic | BindingFlags.Instance);
+ IntPtr hWindow = (IntPtr)fiWholeWindow.GetValue(oHwnd);
+
+ XClassHint xch = new XClassHint();
+ xch.res_name = Marshal.StringToCoTaskMemAnsi(strName ?? string.Empty);
+ xch.res_class = Marshal.StringToCoTaskMemAnsi(strClass ?? string.Empty);
+ IntPtr pXch = Marshal.AllocCoTaskMem(Marshal.SizeOf(xch));
+ Marshal.StructureToPtr(xch, pXch, false);
+
+ XSetClassHint(hDisplay, hWindow, pXch);
+
+ Marshal.FreeCoTaskMem(pXch);
+ Marshal.FreeCoTaskMem(xch.res_name);
+ Marshal.FreeCoTaskMem(xch.res_class);
+ }
+ catch(Exception) { Debug.Assert(false); }
+ }
}
}
diff --git a/KeePass/Native/NativeMethods.cs b/KeePass/Native/NativeMethods.cs
index e0ce628..44c486e 100644
--- a/KeePass/Native/NativeMethods.cs
+++ b/KeePass/Native/NativeMethods.cs
@@ -21,8 +21,8 @@ using System;
using System.Text;
using System.Security;
using System.Runtime.InteropServices;
-using System.Diagnostics;
using System.Windows.Forms;
+using System.Diagnostics;
using KeePass.UI;
@@ -281,13 +281,6 @@ namespace KeePass.Native
IntPtr lpInBuffer, uint nInBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize,
out uint lpBytesReturned, IntPtr lpOverlapped);
- // [DllImport("DwmApi.dll")]
- // internal static extern Int32 DwmExtendFrameIntoClientArea(IntPtr hWnd,
- // ref MARGINS pMarInset);
-
- // [DllImport("DwmApi.dll")]
- // internal static extern Int32 DwmIsCompositionEnabled(ref Int32 pfEnabled);
-
[DllImport("ComCtl32.dll", CharSet = CharSet.Auto)]
internal static extern Int32 TaskDialogIndirect([In] ref VtdConfig pTaskConfig,
[Out] out int pnButton, [Out] out int pnRadioButton,
@@ -336,24 +329,9 @@ namespace KeePass.Native
// internal extern static uint DrawThemeBackground(IntPtr hTheme, IntPtr hdc,
// int iPartId, int iStateId, ref RECT pRect, ref RECT pClipRect);
- // [DllImport("Gdi32.dll")]
- // [return: MarshalAs(UnmanagedType.Bool)]
- // internal static extern bool DeleteObject(IntPtr hObject);
-
- // [DllImport("DwmApi.dll")]
- // internal static extern int DwmInvalidateIconicBitmaps(IntPtr hWnd);
-
- [DllImport("DwmApi.dll", EntryPoint = "DwmSetWindowAttribute")]
- internal static extern int DwmSetWindowAttributeInt(IntPtr hWnd,
- uint dwAttribute, [In] ref int pvAttribute, uint cbAttribute);
-
- // [DllImport("DwmApi.dll")]
- // internal static extern int DwmSetIconicThumbnail(IntPtr hWnd,
- // IntPtr hBmp, uint dwSITFlags);
-
- // [DllImport("DwmApi.dll")]
- // internal static extern int DwmSetIconicLivePreviewBitmap(IntPtr hWnd,
- // IntPtr hBmp, IntPtr pptClient, uint dwSITFlags);
+ [DllImport("Gdi32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static extern bool DeleteObject(IntPtr hObject);
[DllImport("User32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
diff --git a/KeePass/Plugins/PlgxPlugin.cs b/KeePass/Plugins/PlgxPlugin.cs
index 30df3d0..6345912 100644
--- a/KeePass/Plugins/PlgxPlugin.cs
+++ b/KeePass/Plugins/PlgxPlugin.cs
@@ -105,11 +105,7 @@ namespace KeePass.Plugins
}
catch(Exception exLoad)
{
- if(Program.CommandLineArgs[AppDefs.CommandLineOptions.Debug] != null)
- MessageService.ShowWarningExcp(strFilePath, exLoad);
- else
- MessageService.ShowWarning(KPRes.PluginIncompatible +
- MessageService.NewLine + strFilePath, KPRes.PluginUpdateHint);
+ PluginManager.ShowLoadError(strFilePath, exLoad, slStatus);
}
}
diff --git a/KeePass/Plugins/PluginManager.cs b/KeePass/Plugins/PluginManager.cs
index d4afafe..466927a 100644
--- a/KeePass/Plugins/PluginManager.cs
+++ b/KeePass/Plugins/PluginManager.cs
@@ -33,6 +33,7 @@ using KeePass.Plugins;
using KeePass.UI;
using KeePassLib;
+using KeePassLib.Interfaces;
using KeePassLib.Utility;
namespace KeePass.Plugins
@@ -126,37 +127,64 @@ namespace KeePass.Plugins
}
catch(Exception) { continue; }
- bool bShowStandardError = false;
+ Exception exShowStd = null;
try
{
PluginInfo pi = new PluginInfo(fi.FullName, fvi, strDisplayFilePath);
pi.Interface = CreatePluginInstance(pi.FilePath, strTypeName);
- if(pi.Interface.Initialize(m_host) == false)
+ if(!pi.Interface.Initialize(m_host))
continue; // Fail without error
m_vPlugins.Add(pi);
}
- catch(BadImageFormatException)
+ catch(BadImageFormatException exBif)
{
if(Is1xPlugin(fi.FullName))
MessageService.ShowWarning(KPRes.PluginIncompatible +
MessageService.NewLine + fi.FullName + MessageService.NewParagraph +
KPRes.Plugin1x + MessageService.NewParagraph + KPRes.Plugin1xHint);
- else bShowStandardError = true;
+ else exShowStd = exBif;
}
catch(Exception exLoad)
{
if(Program.CommandLineArgs[AppDefs.CommandLineOptions.Debug] != null)
MessageService.ShowWarningExcp(fi.FullName, exLoad);
- else bShowStandardError = true;
+ else exShowStd = exLoad;
}
- if(bShowStandardError)
- MessageService.ShowWarning(KPRes.PluginIncompatible +
- MessageService.NewLine + fi.FullName + MessageService.NewParagraph +
- KPRes.PluginUpdateHint);
+ if(exShowStd != null)
+ ShowLoadError(fi.FullName, exShowStd, null);
+ }
+ }
+
+ internal static void ShowLoadError(string strPath, Exception ex,
+ IStatusLogger slStatus)
+ {
+ if(string.IsNullOrEmpty(strPath)) { Debug.Assert(false); return; }
+
+ if(slStatus != null)
+ slStatus.SetText(KPRes.PluginLoadFailed, LogStatusType.Info);
+
+ bool bShowExcp = (Program.CommandLineArgs[
+ AppDefs.CommandLineOptions.Debug] != null);
+
+ string strMsg = KPRes.PluginIncompatible + MessageService.NewLine +
+ strPath + MessageService.NewParagraph + KPRes.PluginUpdateHint;
+ string strExcp = ((ex != null) ? StrUtil.FormatException(ex).Trim() : null);
+
+ VistaTaskDialog vtd = new VistaTaskDialog();
+ vtd.Content = strMsg;
+ vtd.ExpandedByDefault = ((strExcp != null) && bShowExcp);
+ vtd.ExpandedInformation = strExcp;
+ vtd.WindowTitle = PwDefs.ShortProductName;
+ vtd.SetIcon(VtdIcon.Warning);
+
+ if(!vtd.ShowDialog())
+ {
+ if(!bShowExcp) MessageService.ShowWarning(strMsg);
+ else MessageService.ShowWarningExcp(strPath, ex);
}
}
diff --git a/KeePass/Program.cs b/KeePass/Program.cs
index 82f50a2..a41b7a9 100644
--- a/KeePass/Program.cs
+++ b/KeePass/Program.cs
@@ -19,6 +19,7 @@
using System;
using System.Collections;
+using System.Collections.Generic;
using System.Windows.Forms;
using System.Globalization;
using System.Threading;
@@ -203,6 +204,10 @@ namespace KeePass
Application.SetCompatibleTextRenderingDefault(false);
Application.DoEvents(); // Required
+#if DEBUG
+ string strInitialWorkDir = WinUtil.GetWorkingDirectory();
+#endif
+
if(!CommonInit()) { CommonTerminate(); return; }
if(m_appConfig.Application.Start.PluginCacheClearOnce)
@@ -408,6 +413,11 @@ namespace KeePass
MainCleanUp();
+#if DEBUG
+ string strEndWorkDir = WinUtil.GetWorkingDirectory();
+ Debug.Assert(strEndWorkDir.Equals(strInitialWorkDir, StrUtil.CaseIgnoreCmp));
+#endif
+
if(mGlobalNotify != null) { GC.KeepAlive(mGlobalNotify); }
// if(mSingleLock != null) { GC.KeepAlive(mSingleLock); }
}
@@ -435,7 +445,7 @@ namespace KeePass
// Set global localized strings
PwDatabase.LocalizedAppName = PwDefs.ShortProductName;
- Kdb4File.DetermineLanguageId();
+ KdbxFile.DetermineLanguageId();
m_appConfig = AppConfigSerializer.Load();
if(m_appConfig.Logging.Enabled)
@@ -557,8 +567,10 @@ namespace KeePass
}
else
{
+ string[] vFlt = KeyUtil.MakeCtxIndependent(args);
+
IpcParamEx ipcMsg = new IpcParamEx(IpcUtilEx.CmdOpenDatabase,
- CommandLineArgs.SafeSerialize(args), null, null, null, null);
+ CommandLineArgs.SafeSerialize(vFlt), null, null, null, null);
IpcUtilEx.SendGlobalMessage(ipcMsg);
}
diff --git a/KeePass/Properties/AssemblyInfo.cs b/KeePass/Properties/AssemblyInfo.cs
index 9ed86df..03f753b 100644
--- a/KeePass/Properties/AssemblyInfo.cs
+++ b/KeePass/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
[assembly: Guid("02020c52-c0da-47c0-9f3f-a6fe76cee400")]
// Assembly version information
-[assembly: AssemblyVersion("2.19.0.*")]
-[assembly: AssemblyFileVersion("2.19.0.0")]
+[assembly: AssemblyVersion("2.20.0.*")]
+[assembly: AssemblyFileVersion("2.20.0.0")]
diff --git a/KeePass/Properties/Resources.Designer.cs b/KeePass/Properties/Resources.Designer.cs
index b3977f4..9779f3f 100644
--- a/KeePass/Properties/Resources.Designer.cs
+++ b/KeePass/Properties/Resources.Designer.cs
@@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
-// Runtime Version:2.0.50727.5448
+// Runtime Version:2.0.50727.5456
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -466,6 +466,13 @@ namespace KeePass.Properties {
}
}
+ internal static System.Drawing.Bitmap B16x16_Imp_DesktopKnox {
+ get {
+ object obj = ResourceManager.GetObject("B16x16_Imp_DesktopKnox", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
internal static System.Drawing.Bitmap B16x16_Imp_FlexWallet {
get {
object obj = ResourceManager.GetObject("B16x16_Imp_FlexWallet", resourceCulture);
diff --git a/KeePass/Properties/Resources.resx b/KeePass/Properties/Resources.resx
index 686cff6..5e2c52a 100644
--- a/KeePass/Properties/Resources.resx
+++ b/KeePass/Properties/Resources.resx
@@ -574,4 +574,7 @@
<data name="B16x16_Key_New" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Nuvola_Derived\B16x16_Key_New.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="B16x16_Imp_DesktopKnox" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Images\B16x16_Imp_DesktopKnox.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
</root>
\ No newline at end of file
diff --git a/KeePass/Resources/Images/B16x16_Imp_DesktopKnox.png b/KeePass/Resources/Images/B16x16_Imp_DesktopKnox.png
new file mode 100644
index 0000000..b1f7af8
Binary files /dev/null and b/KeePass/Resources/Images/B16x16_Imp_DesktopKnox.png differ
diff --git a/KeePass/Resources/KPRes.Generated.cs b/KeePass/Resources/KPRes.Generated.cs
index 8bcb45b..2517b65 100644
--- a/KeePass/Resources/KPRes.Generated.cs
+++ b/KeePass/Resources/KPRes.Generated.cs
@@ -68,6 +68,7 @@ namespace KeePass.Resources
m_strAutoShowExpiredEntries = TryGetEx(dictNew, "AutoShowExpiredEntries", m_strAutoShowExpiredEntries);
m_strAutoShowSoonToExpireEntries = TryGetEx(dictNew, "AutoShowSoonToExpireEntries", m_strAutoShowSoonToExpireEntries);
m_strAutoType = TryGetEx(dictNew, "AutoType", m_strAutoType);
+ m_strAutoTypeCancelOnTitleChange = TryGetEx(dictNew, "AutoTypeCancelOnTitleChange", m_strAutoTypeCancelOnTitleChange);
m_strAutoTypeCancelOnWindowChange = TryGetEx(dictNew, "AutoTypeCancelOnWindowChange", m_strAutoTypeCancelOnWindowChange);
m_strAutoTypeEntrySelection = TryGetEx(dictNew, "AutoTypeEntrySelection", m_strAutoTypeEntrySelection);
m_strAutoTypeEntrySelectionDescLong = TryGetEx(dictNew, "AutoTypeEntrySelectionDescLong", m_strAutoTypeEntrySelectionDescLong);
@@ -345,7 +346,7 @@ namespace KeePass.Resources
m_strInvalidUserPassword = TryGetEx(dictNew, "InvalidUserPassword", m_strInvalidUserPassword);
m_strIOConnection = TryGetEx(dictNew, "IOConnection", m_strIOConnection);
m_strItalic = TryGetEx(dictNew, "Italic", m_strItalic);
- m_strKdb3KeePassLibC = TryGetEx(dictNew, "Kdb3KeePassLibC", m_strKdb3KeePassLibC);
+ m_strKdbKeePassLibC = TryGetEx(dictNew, "KdbKeePassLibC", m_strKdbKeePassLibC);
m_strKdbxFiles = TryGetEx(dictNew, "KdbxFiles", m_strKdbxFiles);
m_strKeePassEditor = TryGetEx(dictNew, "KeePassEditor", m_strKeePassEditor);
m_strKeePassLibCLong = TryGetEx(dictNew, "KeePassLibCLong", m_strKeePassLibCLong);
@@ -500,6 +501,7 @@ namespace KeePass.Resources
m_strRedo = TryGetEx(dictNew, "Redo", m_strRedo);
m_strRememberHidingSettings = TryGetEx(dictNew, "RememberHidingSettings", m_strRememberHidingSettings);
m_strRememberKeySources = TryGetEx(dictNew, "RememberKeySources", m_strRememberKeySources);
+ m_strRememberWorkingDirectories = TryGetEx(dictNew, "RememberWorkingDirectories", m_strRememberWorkingDirectories);
m_strRemoteHostReachable = TryGetEx(dictNew, "RemoteHostReachable", m_strRemoteHostReachable);
m_strRepairMode = TryGetEx(dictNew, "RepairMode", m_strRepairMode);
m_strRepeatOnlyWhenHidden = TryGetEx(dictNew, "RepeatOnlyWhenHidden", m_strRepeatOnlyWhenHidden);
@@ -656,7 +658,7 @@ namespace KeePass.Resources
m_strXslExporter = TryGetEx(dictNew, "XslExporter", m_strXslExporter);
m_strXslFileType = TryGetEx(dictNew, "XslFileType", m_strXslFileType);
m_strXslSelectFile = TryGetEx(dictNew, "XslSelectFile", m_strXslSelectFile);
- m_strXslStylesheets = TryGetEx(dictNew, "XslStylesheets", m_strXslStylesheets);
+ m_strXslStylesheetsKdbx = TryGetEx(dictNew, "XslStylesheetsKdbx", m_strXslStylesheetsKdbx);
m_strYes = TryGetEx(dictNew, "Yes", m_strYes);
m_strZoom = TryGetEx(dictNew, "Zoom", m_strZoom);
}
@@ -704,6 +706,7 @@ namespace KeePass.Resources
"AutoShowExpiredEntries",
"AutoShowSoonToExpireEntries",
"AutoType",
+ "AutoTypeCancelOnTitleChange",
"AutoTypeCancelOnWindowChange",
"AutoTypeEntrySelection",
"AutoTypeEntrySelectionDescLong",
@@ -981,7 +984,7 @@ namespace KeePass.Resources
"InvalidUserPassword",
"IOConnection",
"Italic",
- "Kdb3KeePassLibC",
+ "KdbKeePassLibC",
"KdbxFiles",
"KeePassEditor",
"KeePassLibCLong",
@@ -1136,6 +1139,7 @@ namespace KeePass.Resources
"Redo",
"RememberHidingSettings",
"RememberKeySources",
+ "RememberWorkingDirectories",
"RemoteHostReachable",
"RepairMode",
"RepeatOnlyWhenHidden",
@@ -1292,7 +1296,7 @@ namespace KeePass.Resources
"XslExporter",
"XslFileType",
"XslSelectFile",
- "XslStylesheets",
+ "XslStylesheetsKdbx",
"Yes",
"Zoom"
};
@@ -1764,6 +1768,17 @@ namespace KeePass.Resources
get { return m_strAutoType; }
}
+ private static string m_strAutoTypeCancelOnTitleChange =
+ @"Cancel auto-type when the target window title changes";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Cancel auto-type when the target window title changes'.
+ /// </summary>
+ public static string AutoTypeCancelOnTitleChange
+ {
+ get { return m_strAutoTypeCancelOnTitleChange; }
+ }
+
private static string m_strAutoTypeCancelOnWindowChange =
@"Cancel auto-type when the target window changes";
/// <summary>
@@ -4811,15 +4826,15 @@ namespace KeePass.Resources
get { return m_strItalic; }
}
- private static string m_strKdb3KeePassLibC =
+ private static string m_strKdbKeePassLibC =
@"The KeePassLibC library is required to open and save KDB files created by KeePass 1.x.";
/// <summary>
/// Look up a localized string similar to
/// 'The KeePassLibC library is required to open and save KDB files created by KeePass 1.x.'.
/// </summary>
- public static string Kdb3KeePassLibC
+ public static string KdbKeePassLibC
{
- get { return m_strKdb3KeePassLibC; }
+ get { return m_strKdbKeePassLibC; }
}
private static string m_strKdbxFiles =
@@ -6516,6 +6531,17 @@ namespace KeePass.Resources
get { return m_strRememberKeySources; }
}
+ private static string m_strRememberWorkingDirectories =
+ @"Remember working directories";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Remember working directories'.
+ /// </summary>
+ public static string RememberWorkingDirectories
+ {
+ get { return m_strRememberWorkingDirectories; }
+ }
+
private static string m_strRemoteHostReachable =
@"Remote host is reachable (ping)";
/// <summary>
@@ -7782,10 +7808,10 @@ namespace KeePass.Resources
}
private static string m_strUpdateCheckInfoPriv =
- @"No personal information is sent to the KeePass server. KeePass just downloads a small version information file and compares the available version with the installed version.";
+ @"No personal information is sent to the KeePass web server. KeePass just downloads a small version information file and compares the available version with the installed version.";
/// <summary>
/// Look up a localized string similar to
- /// 'No personal information is sent to the KeePass server. KeePass just downloads a small version information file and compares the available version with the installed version.'.
+ /// 'No personal information is sent to the KeePass web server. KeePass just downloads a small version information file and compares the available version with the installed version.'.
/// </summary>
public static string UpdateCheckInfoPriv
{
@@ -8232,15 +8258,15 @@ namespace KeePass.Resources
get { return m_strXslSelectFile; }
}
- private static string m_strXslStylesheets =
- @"XSL Stylesheets for KDB4 XML";
+ private static string m_strXslStylesheetsKdbx =
+ @"XSL Stylesheets for KDBX XML";
/// <summary>
/// Look up a localized string similar to
- /// 'XSL Stylesheets for KDB4 XML'.
+ /// 'XSL Stylesheets for KDBX XML'.
/// </summary>
- public static string XslStylesheets
+ public static string XslStylesheetsKdbx
{
- get { return m_strXslStylesheets; }
+ get { return m_strXslStylesheetsKdbx; }
}
private static string m_strYes =
diff --git a/KeePass/UI/DwmUtil.cs b/KeePass/UI/DwmUtil.cs
new file mode 100644
index 0000000..80b21f8
--- /dev/null
+++ b/KeePass/UI/DwmUtil.cs
@@ -0,0 +1,175 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+using KeePass.Native;
+using KeePass.Util;
+
+namespace KeePass.UI
+{
+ public static class DwmUtil
+ {
+ // private const uint DWMWA_FORCE_ICONIC_REPRESENTATION = 7;
+ // private const uint DWMWA_HAS_ICONIC_BITMAP = 10;
+ private const uint DWMWA_DISALLOW_PEEK = 11;
+
+ // public const int WM_DWMSENDICONICTHUMBNAIL = 0x0323;
+ // public const int WM_DWMSENDICONICLIVEPREVIEWBITMAP = 0x0326;
+
+ // [DllImport("DwmApi.dll")]
+ // private static extern Int32 DwmExtendFrameIntoClientArea(IntPtr hWnd,
+ // ref MARGINS pMarInset);
+
+ // [DllImport("DwmApi.dll")]
+ // private static extern Int32 DwmIsCompositionEnabled(ref Int32 pfEnabled);
+
+ // [DllImport("DwmApi.dll")]
+ // private static extern int DwmInvalidateIconicBitmaps(IntPtr hWnd);
+
+ [DllImport("DwmApi.dll", EntryPoint = "DwmSetWindowAttribute")]
+ private static extern int DwmSetWindowAttributeInt(IntPtr hWnd,
+ uint dwAttribute, [In] ref int pvAttribute, uint cbAttribute);
+
+ // [DllImport("DwmApi.dll")]
+ // private static extern int DwmSetIconicThumbnail(IntPtr hWnd,
+ // IntPtr hBmp, uint dwSITFlags);
+
+ // [DllImport("DwmApi.dll")]
+ // private static extern int DwmSetIconicLivePreviewBitmap(IntPtr hWnd,
+ // IntPtr hBmp, IntPtr pptClient, uint dwSITFlags);
+
+ public static void EnableWindowPeekPreview(Form f, bool bEnable)
+ {
+ int iNoPeek = (bEnable ? 0 : 1);
+
+ try
+ {
+ IntPtr h = f.Handle;
+ if(h == IntPtr.Zero) { Debug.Assert(false); return; }
+
+ DwmSetWindowAttributeInt(h, DWMWA_DISALLOW_PEEK, ref iNoPeek, 4);
+ // DwmInvalidateIconicBitmaps(h);
+
+ // EnableCustomPreviews(f, !bEnable);
+ }
+ catch(Exception) { Debug.Assert(!WinUtil.IsAtLeastWindowsVista); }
+ }
+
+ /* private static void EnableCustomPreviews(Form f, bool bEnable)
+ {
+ int s = (bEnable ? 1 : 0);
+
+ try
+ {
+ IntPtr h = f.Handle;
+ if(h == IntPtr.Zero) { Debug.Assert(false); return; }
+
+ DwmSetWindowAttributeInt(h, DWMWA_HAS_ICONIC_BITMAP, ref s, 4);
+ DwmSetWindowAttributeInt(h, DWMWA_FORCE_ICONIC_REPRESENTATION, ref s, 4);
+ }
+ catch(Exception) { Debug.Assert(!WinUtil.IsAtLeastWindowsVista); }
+ }
+
+ public static void SetThumbnailIcon(Form f, Icon ico, IntPtr lParam)
+ {
+ Image img = null;
+ Bitmap bmp = null;
+ IntPtr hBmp = IntPtr.Zero;
+ try
+ {
+ if((f.WindowState != FormWindowState.Minimized) &&
+ f.Visible)
+ return;
+
+ IntPtr h = f.Handle;
+ if(h == IntPtr.Zero) { Debug.Assert(false); return; }
+
+ img = UIUtil.ExtractVistaIcon(ico);
+ if(img == null) img = ico.ToBitmap();
+ if(img == null) { Debug.Assert(false); return; }
+
+ long lThumbInfo = lParam.ToInt64();
+ int iThumbWidth = (int)((lThumbInfo >> 16) & 0xFFFF);
+ int iThumbHeight = (int)(lThumbInfo & 0xFFFF);
+
+ if((iThumbWidth <= 0) || (iThumbHeight <= 0)) return;
+ if(iThumbWidth > 512) iThumbWidth = 512;
+ if(iThumbHeight > 512) iThumbHeight = 512;
+
+ int iImgW = img.Width;
+ int iImgH = img.Height;
+ if(iImgW > iThumbWidth)
+ {
+ float fRatio = (float)iThumbWidth / (float)iImgW;
+ iImgW = iThumbWidth;
+ iImgH = (int)((float)iImgH * fRatio);
+ }
+ if(iImgH > iThumbHeight)
+ {
+ float fRatio = (float)iThumbHeight / (float)iImgH;
+ iImgW = (int)((float)iImgW * fRatio);
+ iImgH = iThumbHeight;
+ }
+ if((iImgW <= 0) || (iImgH <= 0)) { Debug.Assert(false); return; }
+ if(iImgW > iThumbWidth) { Debug.Assert(false); iImgW = iThumbWidth; }
+ if(iImgH > iThumbHeight) { Debug.Assert(false); iImgH = iThumbHeight; }
+
+ iImgW = Math.Min(iImgW, 64);
+ iImgH = Math.Min(iImgH, 64);
+
+ int iImgX = (iThumbWidth - iImgW) / 2;
+ int iImgY = (iThumbHeight - iImgH) / 2;
+
+ bmp = new Bitmap(iThumbWidth, iThumbHeight, PixelFormat.Format32bppArgb);
+ using(Graphics g = Graphics.FromImage(bmp))
+ {
+ g.Clear(Color.Black);
+
+ g.InterpolationMode = InterpolationMode.HighQualityBicubic;
+ g.SmoothingMode = SmoothingMode.HighQuality;
+
+ g.DrawImage(img, iImgX, iImgY, iImgW, iImgH);
+ }
+
+ hBmp = bmp.GetHbitmap();
+ DwmSetIconicThumbnail(h, hBmp, 0);
+ }
+ catch(Exception) { Debug.Assert(!WinUtil.IsAtLeastWindowsVista); }
+ finally
+ {
+ if(hBmp != IntPtr.Zero)
+ {
+ try { NativeMethods.DeleteObject(hBmp); }
+ catch(Exception) { }
+ }
+ if(bmp != null) bmp.Dispose();
+ if(img != null) img.Dispose();
+ }
+ } */
+ }
+}
diff --git a/KeePass/UI/FileDialogsEx.cs b/KeePass/UI/FileDialogsEx.cs
index 5242fd5..4a06cea 100644
--- a/KeePass/UI/FileDialogsEx.cs
+++ b/KeePass/UI/FileDialogsEx.cs
@@ -21,6 +21,7 @@ using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
+using System.IO;
using System.Diagnostics;
using KeePass.Resources;
@@ -41,13 +42,13 @@ namespace KeePass.UI
public static class FileDialogsEx
{
public static DialogResult ShowFileSaveQuestion(string strFile,
- FileSaveOrigin fsOrigin, IntPtr hParent)
+ FileSaveOrigin fsOrigin)
{
bool bFile = ((strFile != null) && (strFile.Length > 0));
if(WinUtil.IsAtLeastWindowsVista)
{
- VistaTaskDialog dlg = new VistaTaskDialog(hParent);
+ VistaTaskDialog dlg = new VistaTaskDialog();
string strText = KPRes.DatabaseModifiedNoDot;
if(bFile) strText += ":\r\n" + strFile;
@@ -104,4 +105,180 @@ namespace KeePass.UI
MessageBoxButtons.YesNoCancel);
}
}
+
+ public abstract class FileDialogEx
+ {
+ private readonly bool m_bSaveMode;
+ private readonly string m_strContext;
+
+ public abstract FileDialog FileDialog
+ {
+ get;
+ }
+
+ public string DefaultExt
+ {
+ get { return this.FileDialog.DefaultExt; }
+ set { this.FileDialog.DefaultExt = value; }
+ }
+
+ public string FileName
+ {
+ get { return this.FileDialog.FileName; }
+ set { this.FileDialog.FileName = value; }
+ }
+
+ public string[] FileNames
+ {
+ get { return this.FileDialog.FileNames; }
+ }
+
+ public string Filter
+ {
+ get { return this.FileDialog.Filter; }
+ set { this.FileDialog.Filter = value; }
+ }
+
+ public int FilterIndex
+ {
+ get { return this.FileDialog.FilterIndex; }
+ set { this.FileDialog.FilterIndex = value; }
+ }
+
+ private string m_strInitialDirectoryOvr = null;
+ public string InitialDirectory
+ {
+ get { return m_strInitialDirectoryOvr; }
+ set { m_strInitialDirectoryOvr = value; }
+ }
+
+ public string Title
+ {
+ get { return this.FileDialog.Title; }
+ set { this.FileDialog.Title = value; }
+ }
+
+ public FileDialogEx(bool bSaveMode, string strContext)
+ {
+ m_bSaveMode = bSaveMode;
+ m_strContext = strContext; // May be null
+ }
+
+ public DialogResult ShowDialog()
+ {
+ string strPrevWorkDir = PreShowDialog();
+ DialogResult dr = this.FileDialog.ShowDialog();
+ PostShowDialog(strPrevWorkDir, dr);
+ return dr;
+ }
+
+ public DialogResult ShowDialog(IWin32Window owner)
+ {
+ string strPrevWorkDir = PreShowDialog();
+ DialogResult dr = this.FileDialog.ShowDialog(owner);
+ PostShowDialog(strPrevWorkDir, dr);
+ return dr;
+ }
+
+ private string PreShowDialog()
+ {
+ string strPrevWorkDir = WinUtil.GetWorkingDirectory();
+
+ string strNew = Program.Config.Application.GetWorkingDirectory(m_strContext);
+ if(!string.IsNullOrEmpty(m_strInitialDirectoryOvr))
+ strNew = m_strInitialDirectoryOvr;
+ WinUtil.SetWorkingDirectory(strNew); // Always, even when no context
+
+ try
+ {
+ string strWD = WinUtil.GetWorkingDirectory();
+ this.FileDialog.InitialDirectory = strWD;
+ }
+ catch(Exception) { Debug.Assert(false); }
+
+ return strPrevWorkDir;
+ }
+
+ private void PostShowDialog(string strPrevWorkDir, DialogResult dr)
+ {
+ string strCur = null;
+ // Modern file dialogs (on Windows >= Vista) do not change the
+ // working directory (in contrast to Windows <= XP), thus we
+ // derive the working directory from the first file
+ try
+ {
+ if(dr == DialogResult.OK)
+ {
+ string strFile = null;
+ if(m_bSaveMode) strFile = this.FileDialog.FileName;
+ else if(this.FileDialog.FileNames.Length > 0)
+ strFile = this.FileDialog.FileNames[0];
+
+ if(!string.IsNullOrEmpty(strFile))
+ strCur = UrlUtil.GetFileDirectory(strFile, false, true);
+ }
+ }
+ catch(Exception) { Debug.Assert(false); }
+
+ if(!string.IsNullOrEmpty(strCur))
+ Program.Config.Application.SetWorkingDirectory(m_strContext, strCur);
+
+ WinUtil.SetWorkingDirectory(strPrevWorkDir);
+ }
+ }
+
+ public sealed class OpenFileDialogEx : FileDialogEx
+ {
+ private OpenFileDialog m_dlg = new OpenFileDialog();
+
+ public override FileDialog FileDialog
+ {
+ get { return m_dlg; }
+ }
+
+ public bool Multiselect
+ {
+ get { return m_dlg.Multiselect; }
+ set { m_dlg.Multiselect = value; }
+ }
+
+ public OpenFileDialogEx(string strContext) : base(false, strContext)
+ {
+ m_dlg.CheckFileExists = true;
+ m_dlg.CheckPathExists = true;
+ m_dlg.DereferenceLinks = true;
+ m_dlg.ReadOnlyChecked = false;
+ m_dlg.ShowHelp = false;
+ m_dlg.ShowReadOnly = false;
+ // m_dlg.SupportMultiDottedExtensions = false; // Default
+ m_dlg.ValidateNames = true;
+
+ m_dlg.RestoreDirectory = false; // Want new working directory
+ }
+ }
+
+ public sealed class SaveFileDialogEx : FileDialogEx
+ {
+ private SaveFileDialog m_dlg = new SaveFileDialog();
+
+ public override FileDialog FileDialog
+ {
+ get { return m_dlg; }
+ }
+
+ public SaveFileDialogEx(string strContext) : base(true, strContext)
+ {
+ m_dlg.AddExtension = true;
+ m_dlg.CheckFileExists = false;
+ m_dlg.CheckPathExists = true;
+ m_dlg.CreatePrompt = false;
+ m_dlg.DereferenceLinks = true;
+ m_dlg.OverwritePrompt = true;
+ m_dlg.ShowHelp = false;
+ // m_dlg.SupportMultiDottedExtensions = false; // Default
+ m_dlg.ValidateNames = true;
+
+ m_dlg.RestoreDirectory = false; // Want new working directory
+ }
+ }
}
diff --git a/KeePass/UI/PwInputControlGroup.cs b/KeePass/UI/PwInputControlGroup.cs
index 060ec72..03d8bb1 100644
--- a/KeePass/UI/PwInputControlGroup.cs
+++ b/KeePass/UI/PwInputControlGroup.cs
@@ -50,7 +50,7 @@ namespace KeePass.UI
private SecureEdit m_secRepeat = null;
private bool m_bInitializing = false;
- private bool m_bPrgmCheck = false;
+ private uint m_uPrgmCheck = 0;
private bool m_bEnabled = true;
public bool Enabled
@@ -183,15 +183,15 @@ namespace KeePass.UI
if((uFlags & (ulong)AceKeyUIFlags.CheckHidePassword) != 0)
{
- m_bPrgmCheck = true;
+ ++m_uPrgmCheck;
m_cbHide.Checked = true;
- m_bPrgmCheck = false;
+ --m_uPrgmCheck;
}
if((uFlags & (ulong)AceKeyUIFlags.UncheckHidePassword) != 0)
{
- m_bPrgmCheck = true;
+ ++m_uPrgmCheck;
m_cbHide.Checked = false;
- m_bPrgmCheck = false;
+ --m_uPrgmCheck;
}
bool bAutoRepeat = this.AutoRepeat;
@@ -237,17 +237,22 @@ namespace KeePass.UI
if(m_bInitializing) return;
bool bHide = m_cbHide.Checked;
- if(!bHide && !m_bPrgmCheck && !AppPolicy.Try(AppPolicyId.UnhidePasswords))
+ if(!bHide && (m_uPrgmCheck == 0))
{
- m_cbHide.Checked = true;
- return;
+ if(!AppPolicy.Try(AppPolicyId.UnhidePasswords))
+ {
+ ++m_uPrgmCheck;
+ m_cbHide.Checked = true;
+ --m_uPrgmCheck;
+ return;
+ }
}
m_secPassword.EnableProtection(bHide);
m_secRepeat.EnableProtection(bHide);
bool bWasAutoRepeat = Program.Config.UI.RepeatPasswordOnlyWhenHidden;
- if(bHide && !m_bPrgmCheck && bWasAutoRepeat)
+ if(bHide && (m_uPrgmCheck == 0) && bWasAutoRepeat)
{
++m_uBlockUIUpdate;
byte[] pb = GetPasswordUtf8();
@@ -257,7 +262,7 @@ namespace KeePass.UI
}
UpdateUI();
- if(!m_bPrgmCheck) UIUtil.SetFocus(m_tbPassword, m_fParent);
+ if(m_uPrgmCheck == 0) UIUtil.SetFocus(m_tbPassword, m_fParent);
}
public void SetPassword(byte[] pbUtf8, bool bSetRepeatPw)
@@ -325,7 +330,7 @@ namespace KeePass.UI
{
if(!VistaTaskDialog.ShowMessageBox(KPRes.PasswordRepeatFailed,
KPRes.ValidationFailed, PwDefs.ShortProductName,
- VtdIcon.Warning, m_fParent.Handle))
+ VtdIcon.Warning, m_fParent))
MessageService.ShowWarning(KPRes.PasswordRepeatFailed);
}
diff --git a/KeePass/UI/UIUtil.cs b/KeePass/UI/UIUtil.cs
index 7d4bb56..9c94b6c 100644
--- a/KeePass/UI/UIUtil.cs
+++ b/KeePass/UI/UIUtil.cs
@@ -206,6 +206,12 @@ namespace KeePass.UI
catch(Exception) { Debug.Assert(false); }
}
+ [Obsolete("Use GfxUtil.LoadImage instead.")]
+ public static Image LoadImage(byte[] pb)
+ {
+ return GfxUtil.LoadImage(pb);
+ }
+
public static Image CreateColorBitmap24(int nWidth, int nHeight, Color color)
{
Bitmap bmp = new Bitmap(nWidth, nHeight, PixelFormat.Format24bppRgb);
@@ -435,6 +441,17 @@ namespace KeePass.UI
else { Debug.Assert(!bSimpleTextOnly && !bCtrlEnterAccepts); }
}
+ public static void SetMultilineText(TextBox tb, string str)
+ {
+ if(tb == null) { Debug.Assert(false); return; }
+ if(str == null) str = string.Empty;
+
+ if(!KeePassLib.Native.NativeLib.IsUnix())
+ str = StrUtil.NormalizeNewLines(str, true);
+
+ tb.Text = str;
+ }
+
/// <summary>
/// Fill a <c>ListView</c> with password entries.
/// </summary>
@@ -720,20 +737,23 @@ namespace KeePass.UI
return strExtensions; // Single extension
}
+ [Obsolete("Use the overload with the strContext parameter.")]
public static OpenFileDialog CreateOpenFileDialog(string strTitle, string strFilter,
int iFilterIndex, string strDefaultExt, bool bMultiSelect, bool bRestoreDirectory)
{
- OpenFileDialog ofd = new OpenFileDialog();
+ return (OpenFileDialog)CreateOpenFileDialog(strTitle, strFilter,
+ iFilterIndex, strDefaultExt, bMultiSelect, string.Empty).FileDialog;
+ }
- ofd.CheckFileExists = true;
- ofd.CheckPathExists = true;
+ public static OpenFileDialogEx CreateOpenFileDialog(string strTitle, string strFilter,
+ int iFilterIndex, string strDefaultExt, bool bMultiSelect, string strContext)
+ {
+ OpenFileDialogEx ofd = new OpenFileDialogEx(strContext);
- if((strDefaultExt != null) && (strDefaultExt.Length > 0))
+ if(!string.IsNullOrEmpty(strDefaultExt))
ofd.DefaultExt = strDefaultExt;
- ofd.DereferenceLinks = true;
-
- if((strFilter != null) && (strFilter.Length > 0))
+ if(!string.IsNullOrEmpty(strFilter))
{
ofd.Filter = strFilter;
@@ -741,66 +761,60 @@ namespace KeePass.UI
}
ofd.Multiselect = bMultiSelect;
- ofd.ReadOnlyChecked = false;
- ofd.RestoreDirectory = bRestoreDirectory;
- ofd.ShowHelp = false;
- ofd.ShowReadOnly = false;
- // ofd.SupportMultiDottedExtensions = false; // Default
- if((strTitle != null) && (strTitle.Length > 0))
+ if(!string.IsNullOrEmpty(strTitle))
ofd.Title = strTitle;
- ofd.ValidateNames = true;
-
return ofd;
}
+ [Obsolete("Use the overload with the strContext parameter.")]
public static SaveFileDialog CreateSaveFileDialog(string strTitle,
string strSuggestedFileName, string strFilter, int iFilterIndex,
string strDefaultExt, bool bRestoreDirectory)
{
- return CreateSaveFileDialog(strTitle, strSuggestedFileName, strFilter,
- iFilterIndex, strDefaultExt, bRestoreDirectory, false);
+ return (SaveFileDialog)CreateSaveFileDialog(strTitle, strSuggestedFileName,
+ strFilter, iFilterIndex, strDefaultExt, string.Empty).FileDialog;
}
+ [Obsolete("Use the overload with the strContext parameter.")]
public static SaveFileDialog CreateSaveFileDialog(string strTitle,
string strSuggestedFileName, string strFilter, int iFilterIndex,
string strDefaultExt, bool bRestoreDirectory, bool bIsDatabaseFile)
{
- SaveFileDialog sfd = new SaveFileDialog();
+ return (SaveFileDialog)CreateSaveFileDialog(strTitle, strSuggestedFileName,
+ strFilter, iFilterIndex, strDefaultExt, (bIsDatabaseFile ?
+ AppDefs.FileDialogContext.Database : string.Empty)).FileDialog;
+ }
- sfd.AddExtension = true;
- sfd.CheckFileExists = false;
- sfd.CheckPathExists = true;
- sfd.CreatePrompt = false;
+ public static SaveFileDialogEx CreateSaveFileDialog(string strTitle,
+ string strSuggestedFileName, string strFilter, int iFilterIndex,
+ string strDefaultExt, string strContext)
+ {
+ SaveFileDialogEx sfd = new SaveFileDialogEx(strContext);
- if((strDefaultExt != null) && (strDefaultExt.Length > 0))
+ if(!string.IsNullOrEmpty(strDefaultExt))
sfd.DefaultExt = strDefaultExt;
- sfd.DereferenceLinks = true;
-
- if((strSuggestedFileName != null) && (strSuggestedFileName.Length > 0))
+ if(!string.IsNullOrEmpty(strSuggestedFileName))
sfd.FileName = strSuggestedFileName;
- if((strFilter != null) && (strFilter.Length > 0))
+ if(!string.IsNullOrEmpty(strFilter))
{
sfd.Filter = strFilter;
if(iFilterIndex > 0) sfd.FilterIndex = iFilterIndex;
}
- sfd.OverwritePrompt = true;
- sfd.RestoreDirectory = bRestoreDirectory;
- sfd.ShowHelp = false;
- // sfd.SupportMultiDottedExtensions = false; // Default
-
- if((strTitle != null) && (strTitle.Length > 0))
+ if(!string.IsNullOrEmpty(strTitle))
sfd.Title = strTitle;
- sfd.ValidateNames = true;
-
- if(bIsDatabaseFile && (Program.Config.Defaults.FileSaveAsDirectory.Length > 0))
- sfd.InitialDirectory = Program.Config.Defaults.FileSaveAsDirectory;
+ if(strContext != null)
+ {
+ if((strContext == AppDefs.FileDialogContext.Database) &&
+ (Program.Config.Defaults.FileSaveAsDirectory.Length > 0))
+ sfd.InitialDirectory = Program.Config.Defaults.FileSaveAsDirectory;
+ }
return sfd;
}
@@ -1056,32 +1070,6 @@ namespace KeePass.UI
}
}
- public static Image LoadImage(byte[] pb)
- {
- if(pb == null) throw new ArgumentNullException("pb");
-
- MemoryStream ms = new MemoryStream(pb, false);
- try { return Image.FromStream(ms); }
- catch(Exception)
- {
- Image imgIco = TryLoadIco(pb);
- if(imgIco != null) return imgIco;
-
- throw;
- }
- finally { ms.Close(); }
- }
-
- private static Image TryLoadIco(byte[] pb)
- {
- MemoryStream ms = new MemoryStream(pb, false);
- try { return (new Icon(ms)).ToBitmap(); }
- catch(Exception) { }
- finally { ms.Close(); }
-
- return null;
- }
-
public static void SetShield(Button btn, bool bSetShield)
{
if(btn == null) throw new ArgumentNullException("btn");
@@ -1713,7 +1701,7 @@ namespace KeePass.UI
catch(Exception) { Debug.Assert(false); }
}
- public static Bitmap ExtractVistaIcon(Icon ico)
+ public static Image ExtractVistaIcon(Icon ico)
{
if(ico == null) { Debug.Assert(false); return null; }
@@ -1747,11 +1735,7 @@ namespace KeePass.UI
byte[] pbImage = msImage.ToArray();
msImage.Close();
- msImage = new MemoryStream(pbImage, false);
- Bitmap bmp = new Bitmap(msImage);
- msImage.Close();
-
- return bmp;
+ return GfxUtil.LoadImage(pbImage);
}
}
}
@@ -1817,11 +1801,11 @@ namespace KeePass.UI
if(qSize > 32)
{
- Bitmap bmpIco = ExtractVistaIcon(icoBase);
- if(bmpIco != null)
+ Image imgIco = ExtractVistaIcon(icoBase);
+ if(imgIco != null)
{
- g.DrawImage(bmpIco, 0, 0, bmp.Width, bmp.Height);
- bmpIco.Dispose();
+ g.DrawImage(imgIco, 0, 0, bmp.Width, bmp.Height);
+ imgIco.Dispose();
}
else g.DrawIcon(icoBase, new Rectangle(0, 0, bmp.Width, bmp.Height));
}
@@ -2135,5 +2119,23 @@ namespace KeePass.UI
return bmp;
}
+
+ public static Bitmap CreateScaledImage(Image img, int w, int h)
+ {
+ if(img == null) { Debug.Assert(false); return null; }
+
+ Bitmap bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
+ using(Graphics g = Graphics.FromImage(bmp))
+ {
+ g.Clear(Color.Transparent);
+
+ g.InterpolationMode = InterpolationMode.HighQualityBicubic;
+ g.SmoothingMode = SmoothingMode.HighQuality;
+
+ g.DrawImage(img, 0, 0, w, h);
+ }
+
+ return bmp;
+ }
}
}
diff --git a/KeePass/UI/VistaTaskDialog.cs b/KeePass/UI/VistaTaskDialog.cs
index 959f22f..9193e85 100644
--- a/KeePass/UI/VistaTaskDialog.cs
+++ b/KeePass/UI/VistaTaskDialog.cs
@@ -26,6 +26,7 @@ using System.Diagnostics;
using System.Drawing;
using KeePass.Native;
+using KeePass.Resources;
using KeePassLib.Utility;
@@ -223,6 +224,22 @@ namespace KeePass.UI
}
}
+ public string ExpandedInformation
+ {
+ get { return m_cfg.pszExpandedInformation; }
+ set { m_cfg.pszExpandedInformation = value; }
+ }
+
+ public bool ExpandedByDefault
+ {
+ get { return ((m_cfg.dwFlags & VtdFlags.ExpandedByDefault) != VtdFlags.None); }
+ set
+ {
+ if(value) m_cfg.dwFlags |= VtdFlags.ExpandedByDefault;
+ else m_cfg.dwFlags &= ~VtdFlags.ExpandedByDefault;
+ }
+ }
+
public string FooterText
{
get { return m_cfg.pszFooter; }
@@ -245,9 +262,8 @@ namespace KeePass.UI
get { return m_bVerification; }
}
- public VistaTaskDialog(IntPtr hParent)
+ public VistaTaskDialog()
{
- m_cfg.hwndParent = hParent;
}
public void AddButton(int iResult, string strCommand, string strDescription)
@@ -321,13 +337,39 @@ namespace KeePass.UI
public bool ShowDialog()
{
+ return ShowDialog(null);
+ }
+
+ public bool ShowDialog(Form fParent)
+ {
MessageService.ExternalIncrementMessageCount();
- bool bResult = InternalShowDialog();
+
+ Form f = fParent;
+ if(f == null) f = MessageService.GetTopForm();
+ if(f == null) f = GlobalWindowManager.TopWindow;
+
+#if DEBUG
+ if(GlobalWindowManager.TopWindow != null)
+ {
+ Debug.Assert(f == GlobalWindowManager.TopWindow);
+ }
+ Debug.Assert(f == MessageService.GetTopForm());
+#endif
+
+ bool bResult;
+ if((f == null) || !f.InvokeRequired)
+ bResult = InternalShowDialog(f);
+ else
+ bResult = (bool)f.Invoke(new InternalShowDialogDelegate(
+ this.InternalShowDialog), f);
+
MessageService.ExternalDecrementMessageCount();
return bResult;
}
- private bool InternalShowDialog()
+ private delegate bool InternalShowDialogDelegate(Form fParent);
+
+ private bool InternalShowDialog(Form fParent)
{
if(IntPtr.Size == 4)
{ Debug.Assert(Marshal.SizeOf(typeof(VtdConfig)) == VtdConfigSize32); }
@@ -337,6 +379,21 @@ namespace KeePass.UI
m_cfg.cbSize = (uint)Marshal.SizeOf(typeof(VtdConfig));
+ if(fParent == null) m_cfg.hwndParent = IntPtr.Zero;
+ else
+ {
+ try { m_cfg.hwndParent = fParent.Handle; }
+ catch(Exception)
+ {
+ Debug.Assert(false);
+ m_cfg.hwndParent = IntPtr.Zero;
+ }
+ }
+
+ bool bExp = (m_cfg.pszExpandedInformation != null);
+ m_cfg.pszExpandedControlText = (bExp ? KPRes.Details : null);
+ m_cfg.pszCollapsedControlText = (bExp ? KPRes.Details : null);
+
int pnButton = 0, pnRadioButton = 0;
bool bVerification = false;
@@ -362,9 +419,9 @@ namespace KeePass.UI
}
public static bool ShowMessageBox(string strContent, string strMainInstruction,
- string strWindowTitle, VtdIcon vtdIcon, IntPtr hParent)
+ string strWindowTitle, VtdIcon vtdIcon, Form fParent)
{
- VistaTaskDialog vtd = new VistaTaskDialog(hParent);
+ VistaTaskDialog vtd = new VistaTaskDialog();
vtd.CommandLinks = false;
@@ -374,7 +431,7 @@ namespace KeePass.UI
vtd.SetIcon(vtdIcon);
- return vtd.ShowDialog();
+ return vtd.ShowDialog(fParent);
}
}
}
diff --git a/KeePass/Util/AppLocator.cs b/KeePass/Util/AppLocator.cs
index 2df75b1..0b7c26b 100644
--- a/KeePass/Util/AppLocator.cs
+++ b/KeePass/Util/AppLocator.cs
@@ -297,7 +297,11 @@ namespace KeePass.Util
public static string FindAppUnix(string strApp)
{
- string str = NativeLib.RunConsoleApp("whereis", "-b " + strApp);
+ string strArgPrefix = "-b ";
+ if(NativeLib.GetPlatformID() == PlatformID.MacOSX)
+ strArgPrefix = string.Empty; // FR 3535696
+
+ string str = NativeLib.RunConsoleApp("whereis", strArgPrefix + strApp);
if(str == null) return null;
str = str.Trim();
diff --git a/KeePass/Util/BinaryDataClassifier.cs b/KeePass/Util/BinaryDataClassifier.cs
index d144ebe..e41fbc6 100644
--- a/KeePass/Util/BinaryDataClassifier.cs
+++ b/KeePass/Util/BinaryDataClassifier.cs
@@ -97,14 +97,16 @@ namespace KeePass.Util
Debug.Assert(pbData != null);
if(pbData == null) throw new ArgumentNullException("pbData");
- MemoryStream ms = new MemoryStream(pbData, false);
try
{
- Image.FromStream(ms);
- return BinaryDataClass.Image;
+ Image img = GfxUtil.LoadImage(pbData);
+ if(img != null)
+ {
+ img.Dispose();
+ return BinaryDataClass.Image;
+ }
}
catch(Exception) { }
- finally { ms.Close(); }
return BinaryDataClass.Unknown;
}
diff --git a/KeePass/Util/ClipboardUtil.MacOSX.cs b/KeePass/Util/ClipboardUtil.MacOSX.cs
deleted file mode 100644
index 5d0301f..0000000
--- a/KeePass/Util/ClipboardUtil.MacOSX.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- KeePass Password Safe - The Open-Source Password Manager
- Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Diagnostics;
-
-using KeePassLib.Native;
-
-namespace KeePass.Util
-{
- public static partial class ClipboardUtil
- {
- private static string GetStringM()
- {
- return (NativeLib.RunConsoleApp("pbpaste", "-pboard general") ??
- string.Empty);
- }
-
- private static void SetStringM(string str)
- {
- NativeLib.RunConsoleApp("pbcopy", "-pboard general", str);
- }
- }
-}
diff --git a/KeePass/Util/ClipboardUtil.Unix.cs b/KeePass/Util/ClipboardUtil.Unix.cs
new file mode 100644
index 0000000..8e41b20
--- /dev/null
+++ b/KeePass/Util/ClipboardUtil.Unix.cs
@@ -0,0 +1,83 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+using KeePassLib.Native;
+
+namespace KeePass.Util
+{
+ public static partial class ClipboardUtil
+ {
+ private static string GetStringM()
+ {
+ return (NativeLib.RunConsoleApp("pbpaste", "-pboard general") ??
+ string.Empty);
+ }
+
+ private static void SetStringM(string str)
+ {
+ NativeLib.RunConsoleApp("pbcopy", "-pboard general", str);
+ }
+
+ private static string GetStringU()
+ {
+ // string str = NativeLib.RunConsoleApp("xclip",
+ // "-out -selection clipboard");
+ // if(str != null) return str;
+
+ string str = NativeLib.RunConsoleApp("xsel",
+ "--output --clipboard");
+ if(str != null) return str;
+
+ if(Clipboard.ContainsText())
+ return (Clipboard.GetText() ?? string.Empty);
+
+ return string.Empty;
+ }
+
+ private static void SetStringU(string str)
+ {
+ // string r = NativeLib.RunConsoleApp("xclip",
+ // "-in -selection clipboard", str);
+ // if(r != null) return;
+
+ if(string.IsNullOrEmpty(str))
+ {
+ NativeLib.RunConsoleApp("xsel", "--delete --clipboard");
+
+ try { Clipboard.Clear(); }
+ catch(Exception) { Debug.Assert(false); }
+
+ return; // xsel with an empty input can hang
+ }
+
+ string r = NativeLib.RunConsoleApp("xsel",
+ "--input --clipboard", str);
+ if(r != null) return;
+
+ try { Clipboard.SetText(str); }
+ catch(Exception) { Debug.Assert(false); }
+ }
+ }
+}
diff --git a/KeePass/Util/ClipboardUtil.cs b/KeePass/Util/ClipboardUtil.cs
index af9f3fe..2c3c498 100644
--- a/KeePass/Util/ClipboardUtil.cs
+++ b/KeePass/Util/ClipboardUtil.cs
@@ -97,13 +97,14 @@ namespace KeePass.Util
}
else if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
SetStringM(strData);
- else // Managed
- {
- Clear();
-
- DataObject doData = CreateProtectedDataObject(strData);
- Clipboard.SetDataObject(doData);
- }
+ else if(KeeNativeLib.NativeLib.IsUnix())
+ SetStringU(strData);
+ // else // Managed
+ // {
+ // Clear();
+ // DataObject doData = CreateProtectedDataObject(strData);
+ // Clipboard.SetDataObject(doData);
+ // }
}
catch(Exception) { Debug.Assert(false); return false; }
@@ -168,13 +169,15 @@ namespace KeePass.Util
else if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
SetStringM(Convert.ToBase64String(pbToCopy,
Base64FormattingOptions.None));
- else // Managed, no encoding
- {
- Clear();
-
- DataObject doData = CreateProtectedDataObject(strFormat, pbToCopy);
- Clipboard.SetDataObject(doData);
- }
+ else if(KeeNativeLib.NativeLib.IsUnix())
+ SetStringU(Convert.ToBase64String(pbToCopy,
+ Base64FormattingOptions.None));
+ // else // Managed, no encoding
+ // {
+ // Clear();
+ // DataObject doData = CreateProtectedDataObject(strFormat, pbToCopy);
+ // Clipboard.SetDataObject(doData);
+ // }
}
catch(Exception) { Debug.Assert(false); return false; }
@@ -208,10 +211,12 @@ namespace KeePass.Util
}
else if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
return Convert.FromBase64String(GetStringM());
- else // Managed, no encoding
- {
- return (byte[])Clipboard.GetData(strFormat);
- }
+ else if(KeeNativeLib.NativeLib.IsUnix())
+ return Convert.FromBase64String(GetStringU());
+ // else // Managed, no encoding
+ // {
+ // return (byte[])Clipboard.GetData(strFormat);
+ // }
}
catch(Exception) { Debug.Assert(false); }
@@ -283,6 +288,11 @@ namespace KeePass.Util
SetStringM(string.Empty);
bNativeSuccess = true;
}
+ else if(KeeNativeLib.NativeLib.IsUnix())
+ {
+ SetStringU(string.Empty);
+ bNativeSuccess = true;
+ }
}
catch(Exception) { Debug.Assert(false); }
@@ -318,17 +328,19 @@ namespace KeePass.Util
{
string strData = GetStringM();
byte[] pbUtf8 = StrUtil.Utf8.GetBytes(strData);
-
- SHA256Managed sha256 = new SHA256Managed();
- return sha256.ComputeHash(pbUtf8);
+ return (new SHA256Managed()).ComputeHash(pbUtf8);
+ }
+ else if(KeeNativeLib.NativeLib.IsUnix())
+ {
+ string strData = GetStringU();
+ byte[] pbUtf8 = StrUtil.Utf8.GetBytes(strData);
+ return (new SHA256Managed()).ComputeHash(pbUtf8);
}
else if(Clipboard.ContainsText())
{
string strData = Clipboard.GetText();
byte[] pbUtf8 = StrUtil.Utf8.GetBytes(strData);
-
- SHA256Managed sha256 = new SHA256Managed();
- return sha256.ComputeHash(pbUtf8);
+ return (new SHA256Managed()).ComputeHash(pbUtf8);
}
else if(m_strFormat != null)
{
@@ -370,9 +382,13 @@ namespace KeePass.Util
{
string str = GetStringM();
byte[] pbText = StrUtil.Utf8.GetBytes("pb" + str);
-
- SHA256Managed sha256 = new SHA256Managed();
- return sha256.ComputeHash(pbText);
+ return (new SHA256Managed()).ComputeHash(pbText);
+ }
+ if(KeeNativeLib.NativeLib.IsUnix())
+ {
+ string str = GetStringU();
+ byte[] pbText = StrUtil.Utf8.GetBytes("pb" + str);
+ return (new SHA256Managed()).ComputeHash(pbText);
}
try
diff --git a/KeePass/Util/CommandLineArgs.cs b/KeePass/Util/CommandLineArgs.cs
index 91ba956..abc71c2 100644
--- a/KeePass/Util/CommandLineArgs.cs
+++ b/KeePass/Util/CommandLineArgs.cs
@@ -98,7 +98,7 @@ namespace KeePass.Util
}
}
- private static KeyValuePair<string, string> GetParameter(string strCompiled)
+ internal static KeyValuePair<string, string> GetParameter(string strCompiled)
{
string str = strCompiled;
diff --git a/KeePass/Util/EntryUtil.cs b/KeePass/Util/EntryUtil.cs
index 5351775..0712ae3 100644
--- a/KeePass/Util/EntryUtil.cs
+++ b/KeePass/Util/EntryUtil.cs
@@ -119,7 +119,7 @@ namespace KeePass.Util
{
MemoryStream ms = new MemoryStream();
GZipStream gz = new GZipStream(ms, CompressionMode.Compress);
- Kdb4File.WriteEntries(gz, vEntries);
+ KdbxFile.WriteEntries(gz, vEntries);
byte[] pbFinal;
if(WinUtil.IsWindows9x) pbFinal = ms.ToArray();
@@ -154,7 +154,7 @@ namespace KeePass.Util
MemoryStream ms = new MemoryStream(pbPlain, false);
GZipStream gz = new GZipStream(ms, CompressionMode.Decompress);
- List<PwEntry> vEntries = Kdb4File.ReadEntries(gz);
+ List<PwEntry> vEntries = KdbxFile.ReadEntries(gz);
// Adjust protection settings and add entries
foreach(PwEntry pe in vEntries)
diff --git a/KeePass/Util/KeyUtil.cs b/KeePass/Util/KeyUtil.cs
index a3f51e5..d7ca539 100644
--- a/KeePass/Util/KeyUtil.cs
+++ b/KeePass/Util/KeyUtil.cs
@@ -46,6 +46,7 @@ namespace KeePass.Util
CompositeKey cmpKey = new CompositeKey();
string strPassword = args[AppDefs.CommandLineOptions.Password];
string strPasswordEnc = args[AppDefs.CommandLineOptions.PasswordEncrypted];
+ string strPasswordStdIn = args[AppDefs.CommandLineOptions.PasswordStdIn];
string strKeyFile = args[AppDefs.CommandLineOptions.KeyFile];
string strUserAcc = args[AppDefs.CommandLineOptions.UserAccount];
@@ -53,6 +54,11 @@ namespace KeePass.Util
cmpKey.AddUserKey(new KcpPassword(strPassword));
else if(strPasswordEnc != null)
cmpKey.AddUserKey(new KcpPassword(StrUtil.DecryptString(strPasswordEnc)));
+ else if(strPasswordStdIn != null)
+ {
+ KcpPassword kcpPw = ReadPasswordStdIn(true);
+ if(kcpPw != null) cmpKey.AddUserKey(kcpPw);
+ }
if(strKeyFile != null)
{
@@ -116,11 +122,76 @@ namespace KeePass.Util
args.Remove(AppDefs.CommandLineOptions.Password);
args.Remove(AppDefs.CommandLineOptions.PasswordEncrypted);
+ args.Remove(AppDefs.CommandLineOptions.PasswordStdIn);
args.Remove(AppDefs.CommandLineOptions.KeyFile);
args.Remove(AppDefs.CommandLineOptions.PreSelect);
args.Remove(AppDefs.CommandLineOptions.UserAccount);
}
+ private static bool m_bReadPwStdIn = false;
+ private static string m_strReadPwStdIn = null;
+ /// <summary>
+ /// Read a password from StdIn. The password is read only once
+ /// and then cached.
+ /// </summary>
+ internal static KcpPassword ReadPasswordStdIn(bool bFailWithUI)
+ {
+ string strPw = null;
+
+ if(m_bReadPwStdIn) strPw = m_strReadPwStdIn;
+ else
+ {
+ try { strPw = Console.ReadLine(); }
+ catch(Exception exCon)
+ {
+ if(bFailWithUI) MessageService.ShowWarning(exCon);
+ }
+ }
+
+ if(strPw == null)
+ {
+ m_strReadPwStdIn = null;
+ m_bReadPwStdIn = true;
+
+ return null;
+ }
+
+ strPw = strPw.Trim();
+
+ m_strReadPwStdIn = strPw;
+ m_bReadPwStdIn = true;
+
+ return new KcpPassword(strPw);
+ }
+
+ internal static string[] MakeCtxIndependent(string[] vCmdLineArgs)
+ {
+ if(vCmdLineArgs == null) { Debug.Assert(false); return new string[0]; }
+
+ CommandLineArgs cl = new CommandLineArgs(vCmdLineArgs);
+ List<string> lFlt = new List<string>();
+
+ foreach(string strArg in vCmdLineArgs)
+ {
+ KeyValuePair<string, string> kvpArg = CommandLineArgs.GetParameter(strArg);
+ if(kvpArg.Key.Equals(AppDefs.CommandLineOptions.PasswordStdIn, StrUtil.CaseIgnoreCmp))
+ {
+ KcpPassword kcpPw = ReadPasswordStdIn(true);
+
+ if((cl[AppDefs.CommandLineOptions.Password] == null) &&
+ (cl[AppDefs.CommandLineOptions.PasswordEncrypted] == null) &&
+ (kcpPw != null))
+ {
+ lFlt.Add("-" + AppDefs.CommandLineOptions.Password + ":" +
+ kcpPw.Password.ReadString()); // No quote wrapping/encoding
+ }
+ }
+ else lFlt.Add(strArg);
+ }
+
+ return lFlt.ToArray();
+ }
+
public static bool ReAskKey(PwDatabase pwDatabase, bool bFailWithUI)
{
if(pwDatabase == null) { Debug.Assert(false); return false; }
diff --git a/KeePass/Util/MonoWorkarounds.cs b/KeePass/Util/MonoWorkarounds.cs
index a409aea..449dc71 100644
--- a/KeePass/Util/MonoWorkarounds.cs
+++ b/KeePass/Util/MonoWorkarounds.cs
@@ -25,6 +25,7 @@ using System.ComponentModel;
using System.Reflection;
using System.Diagnostics;
+using KeePassLib;
using KeePassLib.Native;
namespace KeePass.Util
@@ -46,6 +47,9 @@ namespace KeePass.Util
if(!MonoWorkarounds.IsRequired) return;
if(f == null) { Debug.Assert(false); return; }
+ f.HandleCreated += MonoWorkarounds.OnFormHandleCreated;
+ SetWmClass(f);
+
ApplyToControlsRec(f.Controls, f, MonoWorkarounds.ApplyToControl);
}
@@ -54,6 +58,8 @@ namespace KeePass.Util
if(!MonoWorkarounds.IsRequired) return;
if(f == null) { Debug.Assert(false); return; }
+ f.HandleCreated -= MonoWorkarounds.OnFormHandleCreated;
+
ApplyToControlsRec(f.Controls, f, MonoWorkarounds.ReleaseControl);
}
@@ -203,5 +209,16 @@ namespace KeePass.Util
if((f != null) && (f.DialogResult == hi.Result))
f.DialogResult = hi.Result; // Raises close events
}
+
+ private static void SetWmClass(Form f)
+ {
+ KeePass.Native.NativeMethods.SetWmClass(f, PwDefs.UnixName,
+ PwDefs.ResClass);
+ }
+
+ private static void OnFormHandleCreated(object sender, EventArgs e)
+ {
+ SetWmClass(sender as Form);
+ }
}
}
diff --git a/KeePass/Util/SendInputEx.cs b/KeePass/Util/SendInputEx.cs
index 279072d..42a9790 100644
--- a/KeePass/Util/SendInputEx.cs
+++ b/KeePass/Util/SendInputEx.cs
@@ -41,6 +41,8 @@ namespace KeePass.Util
public uint DefaultDelay = 10;
public IntPtr TargetHWnd = IntPtr.Zero;
+ public string TargetWindowTitle = string.Empty;
+
public uint ThisThreadID = 0;
public uint TargetThreadID = 0;
public uint TargetProcessID = 0;
@@ -92,7 +94,13 @@ namespace KeePass.Util
try
{
- si.TargetHWnd = NativeMethods.GetForegroundWindowHandle();
+ IntPtr hWndTarget;
+ string strTargetTitle;
+ NativeMethods.GetForegroundWindowInfo(out hWndTarget,
+ out strTargetTitle, false);
+ si.TargetHWnd = hWndTarget;
+ si.TargetWindowTitle = (strTargetTitle ?? string.Empty);
+
si.ThisThreadID = NativeMethods.GetCurrentThreadId();
uint uTargetProcessID;
si.TargetThreadID = NativeMethods.GetWindowThreadProcessId(
@@ -393,14 +401,26 @@ namespace KeePass.Util
{
if(siState.Cancelled) return false;
- if(!Program.Config.Integration.AutoTypeCancelOnWindowChange) return true;
if(KeePassLib.Native.NativeLib.IsUnix()) return true;
+ bool bChkWnd = Program.Config.Integration.AutoTypeCancelOnWindowChange;
+ bool bChkTitle = Program.Config.Integration.AutoTypeCancelOnTitleChange;
+ if(!bChkWnd && !bChkTitle) return true;
+
bool bValid = true;
try
{
- IntPtr h = NativeMethods.GetForegroundWindowHandle();
- if(h != siState.TargetHWnd)
+ IntPtr h;
+ string strTitle;
+ NativeMethods.GetForegroundWindowInfo(out h, out strTitle, false);
+
+ if(bChkWnd && (h != siState.TargetHWnd))
+ {
+ siState.Cancelled = true;
+ bValid = false;
+ }
+
+ if(bChkTitle && ((strTitle ?? string.Empty) != siState.TargetWindowTitle))
{
siState.Cancelled = true;
bValid = false;
diff --git a/KeePass/Util/Spr/SprContext.cs b/KeePass/Util/Spr/SprContext.cs
index 41b8c54..336cdda 100644
--- a/KeePass/Util/Spr/SprContext.cs
+++ b/KeePass/Util/Spr/SprContext.cs
@@ -37,7 +37,7 @@ namespace KeePass.Util.Spr
AppPaths = 0x1, // Paths to IE, Firefox, Opera, ...
PickChars = 0x2,
EntryStrings = 0x4,
- UrlRmvScm = 0x8,
+ EntryStringsSpecial = 0x8, // {URL:RMVSCM}, ...
PasswordEnc = 0x10,
Group = 0x20,
Paths = 0x40, // App-dir, doc-dir, path sep, ...
@@ -49,15 +49,21 @@ namespace KeePass.Util.Spr
HmacOtp = 0x1000,
Comments = 0x2000,
- All = 0x3FFF,
+ ExtActive = 0x4000, // Active transformations provided by plugins
+ ExtNonActive = 0x8000, // Non-active transformations provided by plugins
+ // Next free: 0x10000
+ All = 0xFFFF,
+
+ // Internal:
UIInteractive = SprCompileFlags.PickChars,
StateChanging = (SprCompileFlags.NewPassword | SprCompileFlags.HmacOtp),
- Active = (SprCompileFlags.UIInteractive | SprCompileFlags.StateChanging),
+ Active = (SprCompileFlags.UIInteractive | SprCompileFlags.StateChanging |
+ SprCompileFlags.ExtActive),
NonActive = (SprCompileFlags.All & ~SprCompileFlags.Active),
- Deref = (SprCompileFlags.EntryStrings | SprCompileFlags.UrlRmvScm |
+ Deref = (SprCompileFlags.EntryStrings | SprCompileFlags.EntryStringsSpecial |
SprCompileFlags.References)
}
@@ -114,15 +120,15 @@ namespace KeePass.Util.Spr
get { return m_refsCache; }
}
- private bool m_bNoUrlSchemeOnce = false;
- /// <summary>
- /// Used internally by <c>SprEngine</c>; don't modify it.
- /// </summary>
- internal bool UrlRemoveSchemeOnce
- {
- get { return m_bNoUrlSchemeOnce; }
- set { m_bNoUrlSchemeOnce = value; }
- }
+ // private bool m_bNoUrlSchemeOnce = false;
+ // /// <summary>
+ // /// Used internally by <c>SprEngine</c>; don't modify it.
+ // /// </summary>
+ // internal bool UrlRemoveSchemeOnce
+ // {
+ // get { return m_bNoUrlSchemeOnce; }
+ // set { m_bNoUrlSchemeOnce = value; }
+ // }
public SprContext() { }
@@ -161,7 +167,7 @@ namespace KeePass.Util.Spr
ctx.m_bMakeAT = false;
ctx.m_bMakeCmdQuotes = false;
- ctx.m_bNoUrlSchemeOnce = false;
+ // ctx.m_bNoUrlSchemeOnce = false;
Debug.Assert(object.ReferenceEquals(m_pe, ctx.m_pe));
Debug.Assert(object.ReferenceEquals(m_pd, ctx.m_pd));
@@ -169,4 +175,35 @@ namespace KeePass.Util.Spr
return ctx;
}
}
+
+ public sealed class SprEventArgs : EventArgs
+ {
+ private string m_str = string.Empty;
+ public string Text
+ {
+ get { return m_str; }
+ set
+ {
+ if(value == null) throw new ArgumentNullException("value");
+ m_str = value;
+ }
+ }
+
+ private SprContext m_ctx = null;
+ public SprContext Context
+ {
+ get { return m_ctx; }
+ }
+
+ public SprEventArgs() { }
+
+ public SprEventArgs(string strText, SprContext ctx)
+ {
+ if(strText == null) throw new ArgumentNullException("strText");
+ // ctx == null is allowed
+
+ m_str = strText;
+ m_ctx = ctx;
+ }
+ }
}
diff --git a/KeePass/Util/Spr/SprEngine.cs b/KeePass/Util/Spr/SprEngine.cs
index 6e0a72e..46482d5 100644
--- a/KeePass/Util/Spr/SprEngine.cs
+++ b/KeePass/Util/Spr/SprEngine.cs
@@ -45,6 +45,19 @@ namespace KeePass.Util.Spr
// private static readonly char[] m_vPlhEscapes = new char[] { '{', '}', '%' };
+ // Important notes for plugin developers subscribing to the following events:
+ // * If possible, prefer subscribing to FilterCompile instead of
+ // FilterCompilePre.
+ // * If your plugin provides an active transformation (e.g. replacing a
+ // placeholder that changes some state or requires UI interaction), you
+ // must only perform the transformation if the ExtActive bit is set in
+ // args.Context.Flags of the event arguments object args provided to the
+ // event handler.
+ // * Non-active transformations should only be performed if the ExtNonActive
+ // bit is set in args.Context.Flags.
+ public static event EventHandler<SprEventArgs> FilterCompilePre;
+ public static event EventHandler<SprEventArgs> FilterCompile;
+
private static void InitializeStatic()
{
m_strAppExePath = WinUtil.GetExecutable();
@@ -92,6 +105,15 @@ namespace KeePass.Util.Spr
string str = strText;
+ bool bExt = ((ctx.Flags & (SprCompileFlags.ExtActive |
+ SprCompileFlags.ExtNonActive)) != SprCompileFlags.None);
+ if(bExt && (SprEngine.FilterCompilePre != null))
+ {
+ SprEventArgs args = new SprEventArgs(str, ctx.Clone());
+ SprEngine.FilterCompilePre(null, args);
+ str = args.Text;
+ }
+
if((ctx.Flags & SprCompileFlags.Comments) != SprCompileFlags.None)
str = RemoveComments(str);
@@ -106,12 +128,14 @@ namespace KeePass.Util.Spr
if((ctx.Flags & SprCompileFlags.EntryStrings) != SprCompileFlags.None)
str = FillEntryStrings(str, ctx, uRecursionLevel);
- if((ctx.Flags & SprCompileFlags.UrlRmvScm) != SprCompileFlags.None)
+ if((ctx.Flags & SprCompileFlags.EntryStringsSpecial) != SprCompileFlags.None)
{
- ctx.UrlRemoveSchemeOnce = true;
- str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}",
- ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel);
- Debug.Assert(!ctx.UrlRemoveSchemeOnce);
+ // ctx.UrlRemoveSchemeOnce = true;
+ // str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}",
+ // ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel);
+ // Debug.Assert(!ctx.UrlRemoveSchemeOnce);
+
+ str = FillEntryStringsSpecial(str, ctx, uRecursionLevel);
}
if(((ctx.Flags & SprCompileFlags.PasswordEnc) != SprCompileFlags.None) &&
@@ -239,6 +263,13 @@ namespace KeePass.Util.Spr
if((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None)
str = ReplacePickChars(str, ctx, uRecursionLevel);
+ if(bExt && (SprEngine.FilterCompile != null))
+ {
+ SprEventArgs args = new SprEventArgs(str, ctx.Clone());
+ SprEngine.FilterCompile(null, args);
+ str = args.Text;
+ }
+
if(ctx.EncodeAsAutoTypeSequence)
{
str = StrUtil.NormalizeNewLines(str, false);
@@ -251,14 +282,14 @@ namespace KeePass.Util.Spr
private static string FillIfExists(string strData, string strPlaceholder,
ProtectedString psParsable, SprContext ctx, uint uRecursionLevel)
{
- // The UrlRemoveSchemeOnce property of ctx must be cleared
- // before this method returns and before any recursive call
- bool bRemoveScheme = false;
- if(ctx != null)
- {
- bRemoveScheme = ctx.UrlRemoveSchemeOnce;
- ctx.UrlRemoveSchemeOnce = false;
- }
+ // // The UrlRemoveSchemeOnce property of ctx must be cleared
+ // // before this method returns and before any recursive call
+ // bool bRemoveScheme = false;
+ // if(ctx != null)
+ // {
+ // bRemoveScheme = ctx.UrlRemoveSchemeOnce;
+ // ctx.UrlRemoveSchemeOnce = false;
+ // }
if(strData == null) { Debug.Assert(false); return string.Empty; }
if(strPlaceholder == null) { Debug.Assert(false); return strData; }
@@ -271,8 +302,8 @@ namespace KeePass.Util.Spr
psParsable.ReadString(), ctx.WithoutContentTransformations(),
uRecursionLevel + 1);
- if(bRemoveScheme)
- strReplacement = UrlUtil.RemoveScheme(strReplacement);
+ // if(bRemoveScheme)
+ // strReplacement = UrlUtil.RemoveScheme(strReplacement);
return SprEngine.FillPlaceholder(strData, strPlaceholder,
strReplacement, ctx);
@@ -352,6 +383,49 @@ namespace KeePass.Util.Spr
return str;
}
+ private const string UrlSpecialRmvScm = @"{URL:RMVSCM}";
+ private const string UrlSpecialScm = @"{URL:SCM}";
+ private const string UrlSpecialHost = @"{URL:HOST}";
+ private const string UrlSpecialPort = @"{URL:PORT}";
+ private const string UrlSpecialPath = @"{URL:PATH}";
+ private const string UrlSpecialQuery = @"{URL:QUERY}";
+ private static string FillEntryStringsSpecial(string str, SprContext ctx,
+ uint uRecursionLevel)
+ {
+ if((str.IndexOf(UrlSpecialRmvScm, SprEngine.ScMethod) >= 0) ||
+ (str.IndexOf(UrlSpecialScm, SprEngine.ScMethod) >= 0) ||
+ (str.IndexOf(UrlSpecialHost, SprEngine.ScMethod) >= 0) ||
+ (str.IndexOf(UrlSpecialPort, SprEngine.ScMethod) >= 0) ||
+ (str.IndexOf(UrlSpecialPath, SprEngine.ScMethod) >= 0) ||
+ (str.IndexOf(UrlSpecialQuery, SprEngine.ScMethod) >= 0))
+ {
+ string strUrl = SprEngine.FillIfExists(@"{URL}", @"{URL}",
+ ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel);
+
+ str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialRmvScm,
+ UrlUtil.RemoveScheme(strUrl));
+
+ try
+ {
+ Uri uri = new Uri(strUrl);
+
+ str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialScm,
+ uri.Scheme);
+ str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialHost,
+ uri.Host);
+ str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialPort,
+ uri.Port.ToString());
+ str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialPath,
+ uri.AbsolutePath);
+ str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialQuery,
+ uri.Query);
+ }
+ catch(Exception) { } // Invalid URI
+ }
+
+ return str;
+ }
+
private const string StrRemStart = @"{C:";
private const string StrRemEnd = @"}";
private static string RemoveComments(string strSeq)
diff --git a/KeePass/Util/UpdateCheckEx.cs b/KeePass/Util/UpdateCheckEx.cs
index 59a23cc..6233cff 100644
--- a/KeePass/Util/UpdateCheckEx.cs
+++ b/KeePass/Util/UpdateCheckEx.cs
@@ -475,8 +475,7 @@ namespace KeePass.Util
string strSub = KPRes.UpdateCheckInfoRes + MessageService.NewParagraph +
KPRes.UpdateCheckInfoPriv;
- VistaTaskDialog dlg = new VistaTaskDialog((fParent != null) ?
- fParent.Handle : IntPtr.Zero);
+ VistaTaskDialog dlg = new VistaTaskDialog();
dlg.CommandLinks = true;
dlg.Content = strHdr;
dlg.MainInstruction = KPRes.UpdateCheckEnableQ;
@@ -489,7 +488,7 @@ namespace KeePass.Util
dlg.SetFooterIcon(VtdIcon.Information);
int iResult;
- if(dlg.ShowDialog()) iResult = dlg.Result;
+ if(dlg.ShowDialog(fParent)) iResult = dlg.Result;
else
{
string strMain = strHdr + MessageService.NewParagraph + strSub;
diff --git a/KeePass/Util/WinUtil.cs b/KeePass/Util/WinUtil.cs
index 8772aab..d068296 100644
--- a/KeePass/Util/WinUtil.cs
+++ b/KeePass/Util/WinUtil.cs
@@ -128,12 +128,11 @@ namespace KeePass.Util
// If URL is null, return, do not throw exception.
Debug.Assert(strUrlToOpen != null); if(strUrlToOpen == null) return;
- string strPrevWorkDir = Directory.GetCurrentDirectory();
+ string strPrevWorkDir = WinUtil.GetWorkingDirectory();
string strThisExe = WinUtil.GetExecutable();
string strExeDir = UrlUtil.GetFileDirectory(strThisExe, false, true);
- try { Directory.SetCurrentDirectory(strExeDir); }
- catch(Exception) { Debug.Assert(false); }
+ WinUtil.SetWorkingDirectory(strExeDir);
string strUrlFlt = strUrlToOpen;
strUrlFlt = strUrlFlt.TrimStart(new char[]{ ' ', '\t', '\r', '\n' });
@@ -194,8 +193,7 @@ namespace KeePass.Util
}
// Restore previous working directory
- try { Directory.SetCurrentDirectory(strPrevWorkDir); }
- catch(Exception) { Debug.Assert(false); }
+ WinUtil.SetWorkingDirectory(strPrevWorkDir);
// SprEngine.Compile might have modified the database
Program.MainForm.UpdateUI(false, null, false, null, false, null, false);
@@ -345,7 +343,7 @@ namespace KeePass.Util
}
else bResult = false;
- if(strDir.Length > 0) Directory.SetCurrentDirectory(strDir);
+ if(strDir.Length > 0) WinUtil.SetWorkingDirectory(strDir);
if(!NativeMethods.CloseHandle(hDevice)) { Debug.Assert(false); }
}
@@ -372,7 +370,7 @@ namespace KeePass.Util
{
try
{
- string strCur = Directory.GetCurrentDirectory();
+ string strCur = WinUtil.GetWorkingDirectory();
if((strCur == null) || (strCur.Length < 3)) return string.Empty;
if(strCur[1] != ':') return string.Empty;
if(strCur[2] != '\\') return string.Empty;
@@ -382,7 +380,7 @@ namespace KeePass.Util
if(chPar != chCur) return string.Empty;
string strTemp = Path.GetTempPath();
- Directory.SetCurrentDirectory(strTemp);
+ WinUtil.SetWorkingDirectory(strTemp);
return strCur;
}
@@ -580,5 +578,54 @@ namespace KeePass.Util
return strExeName;
}
+
+ public static string GetHomeDirectory()
+ {
+ string str = null;
+ try
+ {
+ str = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
+ }
+ catch(Exception) { Debug.Assert(false); }
+
+ if(string.IsNullOrEmpty(str))
+ {
+ try
+ {
+ str = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
+ }
+ catch(Exception) { Debug.Assert(false); }
+ }
+
+ if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return string.Empty; }
+
+ return str;
+ }
+
+ public static string GetWorkingDirectory()
+ {
+ string strWorkDir = null;
+ try { strWorkDir = Directory.GetCurrentDirectory(); }
+ catch(Exception) { Debug.Assert(false); }
+
+ return (!string.IsNullOrEmpty(strWorkDir) ? strWorkDir : GetHomeDirectory());
+ }
+
+ public static void SetWorkingDirectory(string strWorkDir)
+ {
+ string str = strWorkDir; // May be null
+
+ if(!string.IsNullOrEmpty(str))
+ {
+ try { if(!Directory.Exists(str)) str = null; }
+ catch(Exception) { Debug.Assert(false); str = null; }
+ }
+
+ if(string.IsNullOrEmpty(str))
+ str = GetHomeDirectory(); // Not app dir
+
+ try { Directory.SetCurrentDirectory(str); }
+ catch(Exception) { Debug.Assert(false); }
+ }
}
}
diff --git a/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs b/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs
index 765e894..7b57215 100644
--- a/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs
+++ b/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs
@@ -196,6 +196,12 @@ namespace KeePass.Util.XmlSerialization
case "MostRecentlyUsed":
o.MostRecentlyUsed = ReadAceMru(xr);
break;
+ case "RememberWorkingDirectories":
+ o.RememberWorkingDirectories = ReadBoolean(xr);
+ break;
+ case "WorkingDirectories":
+ o.WorkingDirectoriesSerialized = ReadArrayOfString(xr);
+ break;
case "Start":
o.Start = ReadAceStartUp(xr);
break;
@@ -776,6 +782,9 @@ namespace KeePass.Util.XmlSerialization
case "AutoTypeCancelOnWindowChange":
o.AutoTypeCancelOnWindowChange = ReadBoolean(xr);
break;
+ case "AutoTypeCancelOnTitleChange":
+ o.AutoTypeCancelOnTitleChange = ReadBoolean(xr);
+ break;
case "ProxyType":
o.ProxyType = ReadProxyServerType(xr);
break;
@@ -1047,6 +1056,33 @@ namespace KeePass.Util.XmlSerialization
return o;
}
+ private static System.String[] ReadArrayOfString(XmlReader xr)
+ {
+ List<System.String> l = new List<System.String>();
+
+ if(SkipEmptyElement(xr)) return l.ToArray();
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ System.String oElem = ReadString(xr);
+ l.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return l.ToArray();
+ }
+
private static KeePass.App.Configuration.AceStartUp ReadAceStartUp(XmlReader xr)
{
KeePass.App.Configuration.AceStartUp o = new KeePass.App.Configuration.AceStartUp();
diff --git a/KeePass/Util/XmlSerialization/XmlSerializerEx.cs b/KeePass/Util/XmlSerialization/XmlSerializerEx.cs
index 71835be..fb748b2 100644
--- a/KeePass/Util/XmlSerialization/XmlSerializerEx.cs
+++ b/KeePass/Util/XmlSerialization/XmlSerializerEx.cs
@@ -59,7 +59,7 @@ namespace KeePass.Util.XmlSerialization
object oResult = null;
if((m_t == typeof(AppConfigEx)) || (m_t == typeof(KPTranslation)))
{
- XmlReaderSettings xrs = Kdb4File.CreateStdXmlReaderSettings();
+ XmlReaderSettings xrs = KdbxFile.CreateStdXmlReaderSettings();
XmlReader xr = XmlReader.Create(s, xrs);
string strRootName = GetXmlName(m_t);
diff --git a/KeePassLib/Cryptography/HashingStreamEx.cs b/KeePassLib/Cryptography/HashingStreamEx.cs
index aa2e4db..4834f91 100644
--- a/KeePassLib/Cryptography/HashingStreamEx.cs
+++ b/KeePassLib/Cryptography/HashingStreamEx.cs
@@ -135,8 +135,6 @@ namespace KeePassLib.Cryptography
if(m_bWriting) throw new InvalidOperationException();
int nRead = m_sBaseStream.Read(pbBuffer, nOffset, nCount);
-
- // Mono bug workaround (LaunchPad 798910)
int nPartialRead = nRead;
while((nRead < nCount) && (nPartialRead != 0))
{
diff --git a/KeePassLib/KeePassLib.csproj b/KeePassLib/KeePassLib.csproj
index 63b65a8..a692379 100644
--- a/KeePassLib/KeePassLib.csproj
+++ b/KeePassLib/KeePassLib.csproj
@@ -107,10 +107,10 @@
<Compile Include="Serialization\IOConnection.cs">
<SubType>Component</SubType>
</Compile>
- <Compile Include="Serialization\Kdb4File.cs" />
- <Compile Include="Serialization\Kdb4File.Read.cs" />
- <Compile Include="Serialization\Kdb4File.Read.Streamed.cs" />
- <Compile Include="Serialization\Kdb4File.Write.cs" />
+ <Compile Include="Serialization\KdbxFile.cs" />
+ <Compile Include="Serialization\KdbxFile.Read.cs" />
+ <Compile Include="Serialization\KdbxFile.Read.Streamed.cs" />
+ <Compile Include="Serialization\KdbxFile.Write.cs" />
<Compile Include="Serialization\IOConnectionInfo.cs" />
<Compile Include="Serialization\OldFormatException.cs" />
<Compile Include="Translation\KPControlCustomization.cs" />
@@ -120,6 +120,7 @@
<Compile Include="Translation\KPTranslation.cs" />
<Compile Include="Translation\KPTranslationProperties.cs" />
<Compile Include="Utility\AppLogEx.cs" />
+ <Compile Include="Utility\GfxUtil.cs" />
<Compile Include="Utility\MemUtil.cs" />
<Compile Include="Utility\MessageService.cs" />
<Compile Include="Native\NativeLib.cs" />
diff --git a/KeePassLib/Properties/AssemblyInfo.cs b/KeePassLib/Properties/AssemblyInfo.cs
index 8b13823..2fe2c41 100644
--- a/KeePassLib/Properties/AssemblyInfo.cs
+++ b/KeePassLib/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
[assembly: Guid("395f6eec-a1e0-4438-aa82-b75099348134")]
// Assembly version information
-[assembly: AssemblyVersion("2.19.0.*")]
-[assembly: AssemblyFileVersion("2.19.0.0")]
+[assembly: AssemblyVersion("2.20.0.*")]
+[assembly: AssemblyFileVersion("2.20.0.0")]
diff --git a/KeePassLib/PwCustomIcon.cs b/KeePassLib/PwCustomIcon.cs
index 72470dc..bbc78dd 100644
--- a/KeePassLib/PwCustomIcon.cs
+++ b/KeePassLib/PwCustomIcon.cs
@@ -22,6 +22,8 @@ using System.Diagnostics;
using System.Drawing;
using System.IO;
+using KeePassLib.Utility;
+
namespace KeePassLib
{
/// <summary>
@@ -62,9 +64,10 @@ namespace KeePassLib
m_pbImageDataPng = pbImageDataPng;
#if !KeePassLibSD
- MemoryStream ms = new MemoryStream(m_pbImageDataPng, false);
- m_pCachedImage = Image.FromStream(ms);
- ms.Close();
+ // MemoryStream ms = new MemoryStream(m_pbImageDataPng, false);
+ // m_pCachedImage = Image.FromStream(ms);
+ // ms.Close();
+ m_pCachedImage = GfxUtil.LoadImage(m_pbImageDataPng);
#else
m_pCachedImage = null;
#endif
diff --git a/KeePassLib/PwDatabase.cs b/KeePassLib/PwDatabase.cs
index df2d771..2f0278d 100644
--- a/KeePassLib/PwDatabase.cs
+++ b/KeePassLib/PwDatabase.cs
@@ -582,15 +582,15 @@ namespace KeePassLib
m_bModified = false;
- Kdb4File kdb4 = new Kdb4File(this);
- kdb4.DetachBinaries = m_strDetachBins;
+ KdbxFile kdbx = new KdbxFile(this);
+ kdbx.DetachBinaries = m_strDetachBins;
Stream s = IOConnection.OpenRead(ioSource);
- kdb4.Load(s, Kdb4Format.Default, slLogger);
+ kdbx.Load(s, KdbxFormat.Default, slLogger);
s.Close();
- m_pbHashOfLastIO = kdb4.HashOfFileOnDisk;
- m_pbHashOfFileOnDisk = kdb4.HashOfFileOnDisk;
+ m_pbHashOfLastIO = kdbx.HashOfFileOnDisk;
+ m_pbHashOfFileOnDisk = kdbx.HashOfFileOnDisk;
Debug.Assert(m_pbHashOfFileOnDisk != null);
m_bDatabaseOpened = true;
@@ -620,8 +620,8 @@ namespace KeePassLib
m_bUseFileTransactions);
Stream s = ft.OpenWrite();
- Kdb4File kdb = new Kdb4File(this);
- kdb.Save(s, null, Kdb4Format.Default, slLogger);
+ KdbxFile kdb = new KdbxFile(this);
+ kdb.Save(s, null, KdbxFormat.Default, slLogger);
ft.CommitWrite();
diff --git a/KeePassLib/PwDefs.cs b/KeePassLib/PwDefs.cs
index 5d2418b..d165d4b 100644
--- a/KeePassLib/PwDefs.cs
+++ b/KeePassLib/PwDefs.cs
@@ -44,6 +44,9 @@ namespace KeePassLib
/// </summary>
public const string ShortProductName = "KeePass";
+ internal const string UnixName = "keepass2";
+ internal const string ResClass = "KeePass2"; // With initial capital
+
/// <summary>
/// Version, encoded as 32-bit unsigned integer.
/// 2.00 = 0x02000000, 2.01 = 0x02000100, ..., 2.18 = 0x02010800.
@@ -51,18 +54,18 @@ namespace KeePassLib
/// e.g. 2.19 = 0x02130000.
/// It is highly recommended to use <c>FileVersion64</c> instead.
/// </summary>
- public const uint Version32 = 0x02130000;
+ public const uint Version32 = 0x02140000;
/// <summary>
/// Version, encoded as 64-bit unsigned integer
/// (component-wise, 16 bits per component).
/// </summary>
- public const ulong FileVersion64 = 0x0002001300000000UL;
+ public const ulong FileVersion64 = 0x0002001400000000UL;
/// <summary>
/// Version, encoded as string.
/// </summary>
- public const string VersionString = "2.19";
+ public const string VersionString = "2.20";
public const string Copyright = @"Copyright © 2003-2012 Dominik Reichl";
diff --git a/KeePassLib/Resources/KLRes.Generated.cs b/KeePassLib/Resources/KLRes.Generated.cs
index bfa2048..d56bbc7 100644
--- a/KeePassLib/Resources/KLRes.Generated.cs
+++ b/KeePassLib/Resources/KLRes.Generated.cs
@@ -201,10 +201,10 @@ namespace KeePassLib.Resources
}
private static string m_strFileSaveCorruptionWarning =
- @"The target file might be in a corrupted state. Please try saving again, and if that fails, save the database to a different location.";
+ @"The target file might be corrupted. Please try saving again. If that fails, save the database to a different location.";
/// <summary>
/// Look up a localized string similar to
- /// 'The target file might be in a corrupted state. Please try saving again, and if that fails, save the database to a different location.'.
+ /// 'The target file might be corrupted. Please try saving again. If that fails, save the database to a different location.'.
/// </summary>
public static string FileSaveCorruptionWarning
{
diff --git a/KeePassLib/Serialization/BinaryReaderEx.cs b/KeePassLib/Serialization/BinaryReaderEx.cs
index 6f04850..3ed7314 100644
--- a/KeePassLib/Serialization/BinaryReaderEx.cs
+++ b/KeePassLib/Serialization/BinaryReaderEx.cs
@@ -22,35 +22,56 @@ using System.Collections.Generic;
using System.Text;
using System.IO;
+using KeePassLib.Utility;
+
namespace KeePassLib.Serialization
{
- public sealed class BinaryReaderEx : BinaryReader
+ public sealed class BinaryReaderEx
{
- private string m_strReadExcp = null;
+ private Stream m_s;
+ private Encoding m_enc;
+
+ private string m_strReadExcp;
public string ReadExceptionText
{
get { return m_strReadExcp; }
set { m_strReadExcp = value; }
}
+ private Stream m_sCopyTo = null;
+ /// <summary>
+ /// If this property is set to a non-null stream, all data that
+ /// is read from the input stream is automatically written to
+ /// the copy stream (before returning the read data).
+ /// </summary>
+ public Stream CopyDataTo
+ {
+ get { return m_sCopyTo; }
+ set { m_sCopyTo = value; }
+ }
+
public BinaryReaderEx(Stream input, Encoding encoding,
- string strReadExceptionText) :
- base(input, encoding)
+ string strReadExceptionText)
{
+ if(input == null) throw new ArgumentNullException("input");
+
+ m_s = input;
+ m_enc = encoding;
m_strReadExcp = strReadExceptionText;
}
- public override byte[] ReadBytes(int count)
+ public byte[] ReadBytes(int nCount)
{
try
{
- byte[] pb = base.ReadBytes(count);
- if((pb == null) || (pb.Length != count))
+ byte[] pb = MemUtil.Read(m_s, nCount);
+ if((pb == null) || (pb.Length != nCount))
{
if(m_strReadExcp != null) throw new IOException(m_strReadExcp);
else throw new EndOfStreamException();
}
+ if(m_sCopyTo != null) m_sCopyTo.Write(pb, 0, pb.Length);
return pb;
}
catch(Exception)
@@ -59,5 +80,11 @@ namespace KeePassLib.Serialization
else throw;
}
}
+
+ public byte ReadByte()
+ {
+ byte[] pb = ReadBytes(1);
+ return pb[0];
+ }
}
}
diff --git a/KeePassLib/Serialization/IOConnection.cs b/KeePassLib/Serialization/IOConnection.cs
index 274a473..153f77c 100644
--- a/KeePassLib/Serialization/IOConnection.cs
+++ b/KeePassLib/Serialization/IOConnection.cs
@@ -284,14 +284,25 @@ namespace KeePassLib.Serialization
if(ioc.IsLocalFile()) return File.Exists(ioc.Path);
+#if !KeePassLibSD
+ if(ioc.Path.StartsWith("ftp://", StrUtil.CaseIgnoreCmp))
+ {
+ bool b = SendCommand(ioc, WebRequestMethods.Ftp.GetDateTimestamp);
+ if(!b && bThrowErrors) throw new InvalidOperationException();
+ return b;
+ }
+#endif
+
try
{
Stream s = OpenRead(ioc);
if(s == null) throw new FileNotFoundException();
- // For FTP clients we called RETR to get the file, but we never
- // followed-up and downloaded the file; close may produce a
- // 550 error -- that's okay
+ try { s.ReadByte(); }
+ catch(Exception) { }
+
+ // We didn't download the file completely; close may throw
+ // an exception -- that's okay
try { s.Close(); }
catch(Exception) { }
}
@@ -382,6 +393,21 @@ namespace KeePassLib.Serialization
// DeleteFile(iocFrom);
}
+#if !KeePassLibSD
+ private static bool SendCommand(IOConnectionInfo ioc, string strMethod)
+ {
+ try
+ {
+ WebRequest req = CreateWebRequest(ioc);
+ req.Method = strMethod;
+ DisposeResponse(req.GetResponse(), true);
+ }
+ catch(Exception) { return false; }
+
+ return true;
+ }
+#endif
+
private static void DisposeResponse(WebResponse wr, bool bGetStream)
{
if(wr == null) return;
diff --git a/KeePassLib/Serialization/IOConnectionInfo.cs b/KeePassLib/Serialization/IOConnectionInfo.cs
index 3eafc2a..a6bfe7d 100644
--- a/KeePassLib/Serialization/IOConnectionInfo.cs
+++ b/KeePassLib/Serialization/IOConnectionInfo.cs
@@ -276,7 +276,7 @@ namespace KeePassLib.Serialization
string str = m_strUrl;
if(m_strUser.Length > 0)
- str += @": " + m_strUser;
+ str += " (" + m_strUser + ")";
return str;
}
@@ -305,6 +305,7 @@ namespace KeePassLib.Serialization
public bool IsLocalFile()
{
+ // Not just ":/", see e.g. AppConfigEx.ChangePathRelAbs
return (m_strUrl.IndexOf(@"://") < 0);
}
diff --git a/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs b/KeePassLib/Serialization/KdbxFile.Read.Streamed.cs
similarity index 94%
rename from KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
rename to KeePassLib/Serialization/KdbxFile.Read.Streamed.cs
index 2488e49..53591cd 100644
--- a/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
+++ b/KeePassLib/Serialization/KdbxFile.Read.Streamed.cs
@@ -32,12 +32,16 @@ using KeePassLib.Collections;
using KeePassLib.Cryptography;
using KeePassLib.Cryptography.Cipher;
using KeePassLib.Interfaces;
+using KeePassLib.Resources;
using KeePassLib.Security;
using KeePassLib.Utility;
namespace KeePassLib.Serialization
{
- public sealed partial class Kdb4File
+ /// <summary>
+ /// Serialization to KeePass KDBX files.
+ /// </summary>
+ public sealed partial class KdbxFile
{
private enum KdbContext
{
@@ -206,6 +210,17 @@ namespace KeePassLib.Serialization
case KdbContext.Meta:
if(xr.Name == ElemGenerator)
ReadString(xr); // Ignore
+ else if(xr.Name == ElemHeaderHash)
+ {
+ string strHash = ReadString(xr);
+ if(!string.IsNullOrEmpty(strHash) && (m_pbHashOfHeader != null) &&
+ !m_bRepairMode)
+ {
+ byte[] pbHash = Convert.FromBase64String(strHash);
+ if(!MemUtil.ArraysEqual(pbHash, m_pbHashOfHeader))
+ throw new IOException(KLRes.FileCorrupted);
+ }
+ }
else if(xr.Name == ElemDbName)
m_pwDatabase.Name = ReadString(xr);
else if(xr.Name == ElemDbNameChanged)
@@ -757,7 +772,7 @@ namespace KeePassLib.Serialization
if(xb != null) return new ProtectedString(true, xb);
bool bProtect = false;
- if(m_format == Kdb4Format.PlainXml)
+ if(m_format == KdbxFormat.PlainXml)
{
if(xr.MoveToAttribute(AttrProtectedInMemPlainXml))
{
diff --git a/KeePassLib/Serialization/Kdb4File.Read.cs b/KeePassLib/Serialization/KdbxFile.Read.cs
similarity index 85%
rename from KeePassLib/Serialization/Kdb4File.Read.cs
rename to KeePassLib/Serialization/KdbxFile.Read.cs
index 96ba492..8fd7c37 100644
--- a/KeePassLib/Serialization/Kdb4File.Read.cs
+++ b/KeePassLib/Serialization/KdbxFile.Read.cs
@@ -44,7 +44,7 @@ namespace KeePassLib.Serialization
/// <summary>
/// Serialization to KeePass KDBX files.
/// </summary>
- public sealed partial class Kdb4File
+ public sealed partial class KdbxFile
{
/// <summary>
/// Load a KDB file from a file.
@@ -52,7 +52,7 @@ namespace KeePassLib.Serialization
/// <param name="strFilePath">File to load.</param>
/// <param name="kdbFormat">Format specifier.</param>
/// <param name="slLogger">Status logger (optional).</param>
- public void Load(string strFilePath, Kdb4Format kdbFormat, IStatusLogger slLogger)
+ public void Load(string strFilePath, KdbxFormat kdbFormat, IStatusLogger slLogger)
{
IOConnectionInfo ioc = IOConnectionInfo.FromPath(strFilePath);
Load(IOConnection.OpenRead(ioc), kdbFormat, slLogger);
@@ -62,10 +62,10 @@ namespace KeePassLib.Serialization
/// Load a KDB file from a stream.
/// </summary>
/// <param name="sSource">Stream to read the data from. Must contain
- /// a KDB4 stream.</param>
+ /// a KDBX stream.</param>
/// <param name="kdbFormat">Format specifier.</param>
/// <param name="slLogger">Status logger (optional).</param>
- public void Load(Stream sSource, Kdb4Format kdbFormat, IStatusLogger slLogger)
+ public void Load(Stream sSource, KdbxFormat kdbFormat, IStatusLogger slLogger)
{
Debug.Assert(sSource != null);
if(sSource == null) throw new ArgumentNullException("sSource");
@@ -82,7 +82,7 @@ namespace KeePassLib.Serialization
BinaryReaderEx brDecrypted = null;
Stream readerStream = null;
- if(kdbFormat == Kdb4Format.Default)
+ if(kdbFormat == KdbxFormat.Default)
{
br = new BinaryReaderEx(hashedStream, encNoBom, KLRes.FileCorrupted);
ReadHeader(br);
@@ -110,11 +110,11 @@ namespace KeePassLib.Serialization
readerStream = new GZipStream(sHashed, CompressionMode.Decompress);
else readerStream = sHashed;
}
- else if(kdbFormat == Kdb4Format.PlainXml)
+ else if(kdbFormat == KdbxFormat.PlainXml)
readerStream = hashedStream;
else { Debug.Assert(false); throw new FormatException("KdbFormat"); }
- if(kdbFormat != Kdb4Format.PlainXml) // Is an encrypted format
+ if(kdbFormat != KdbxFormat.PlainXml) // Is an encrypted format
{
if(m_pbProtectedStreamKey == null)
{
@@ -131,8 +131,8 @@ namespace KeePassLib.Serialization
// ReadXmlDom(readerStream);
readerStream.Close();
- GC.KeepAlive(brDecrypted);
- GC.KeepAlive(br);
+ // GC.KeepAlive(br);
+ // GC.KeepAlive(brDecrypted);
}
catch(CryptographicException) // Thrown on invalid padding
{
@@ -158,12 +158,15 @@ namespace KeePassLib.Serialization
// case a different application has created the KDBX file and ignored
// the history maintenance settings)
m_pwDatabase.MaintainBackups(); // Don't mark database as modified
+
+ m_pbHashOfHeader = null;
}
private void ReadHeader(BinaryReaderEx br)
{
- Debug.Assert(br != null);
- if(br == null) throw new ArgumentNullException("br");
+ MemoryStream msHeader = new MemoryStream();
+ Debug.Assert(br.CopyDataTo == null);
+ br.CopyDataTo = msHeader;
byte[] pbSig1 = br.ReadBytes(4);
uint uSig1 = MemUtil.BytesToUInt32(pbSig1);
@@ -190,6 +193,12 @@ namespace KeePassLib.Serialization
if(ReadHeaderField(br) == false)
break;
}
+
+ br.CopyDataTo = null;
+ byte[] pbHeader = msHeader.ToArray();
+ msHeader.Close();
+ SHA256Managed sha256 = new SHA256Managed();
+ m_pbHashOfHeader = sha256.ComputeHash(pbHeader);
}
private bool ReadHeaderField(BinaryReaderEx brSource)
@@ -212,49 +221,49 @@ namespace KeePassLib.Serialization
}
bool bResult = true;
- Kdb4HeaderFieldID kdbID = (Kdb4HeaderFieldID)btFieldID;
+ KdbxHeaderFieldID kdbID = (KdbxHeaderFieldID)btFieldID;
switch(kdbID)
{
- case Kdb4HeaderFieldID.EndOfHeader:
+ case KdbxHeaderFieldID.EndOfHeader:
bResult = false; // Returning false indicates end of header
break;
- case Kdb4HeaderFieldID.CipherID:
+ case KdbxHeaderFieldID.CipherID:
SetCipher(pbData);
break;
- case Kdb4HeaderFieldID.CompressionFlags:
+ case KdbxHeaderFieldID.CompressionFlags:
SetCompressionFlags(pbData);
break;
- case Kdb4HeaderFieldID.MasterSeed:
+ case KdbxHeaderFieldID.MasterSeed:
m_pbMasterSeed = pbData;
CryptoRandom.Instance.AddEntropy(pbData);
break;
- case Kdb4HeaderFieldID.TransformSeed:
+ case KdbxHeaderFieldID.TransformSeed:
m_pbTransformSeed = pbData;
CryptoRandom.Instance.AddEntropy(pbData);
break;
- case Kdb4HeaderFieldID.TransformRounds:
+ case KdbxHeaderFieldID.TransformRounds:
m_pwDatabase.KeyEncryptionRounds = MemUtil.BytesToUInt64(pbData);
break;
- case Kdb4HeaderFieldID.EncryptionIV:
+ case KdbxHeaderFieldID.EncryptionIV:
m_pbEncryptionIV = pbData;
break;
- case Kdb4HeaderFieldID.ProtectedStreamKey:
+ case KdbxHeaderFieldID.ProtectedStreamKey:
m_pbProtectedStreamKey = pbData;
CryptoRandom.Instance.AddEntropy(pbData);
break;
- case Kdb4HeaderFieldID.StreamStartBytes:
+ case KdbxHeaderFieldID.StreamStartBytes:
m_pbStreamStartBytes = pbData;
break;
- case Kdb4HeaderFieldID.InnerRandomStreamID:
+ case KdbxHeaderFieldID.InnerRandomStreamID:
SetInnerRandomStreamID(pbData);
break;
@@ -337,8 +346,8 @@ namespace KeePassLib.Serialization
/// <returns>Extracted entries.</returns>
public static List<PwEntry> ReadEntries(Stream msData)
{
- /* Kdb4File f = new Kdb4File(pwDatabase);
- f.m_format = Kdb4Format.PlainXml;
+ /* KdbxFile f = new KdbxFile(pwDatabase);
+ f.m_format = KdbxFormat.PlainXml;
XmlDocument doc = new XmlDocument();
doc.Load(msData);
@@ -366,8 +375,8 @@ namespace KeePassLib.Serialization
return vEntries; */
PwDatabase pd = new PwDatabase();
- Kdb4File f = new Kdb4File(pd);
- f.Load(msData, Kdb4Format.PlainXml, null);
+ KdbxFile f = new KdbxFile(pd);
+ f.Load(msData, KdbxFormat.PlainXml, null);
List<PwEntry> vEntries = new List<PwEntry>();
foreach(PwEntry pe in pd.RootGroup.Entries)
diff --git a/KeePassLib/Serialization/Kdb4File.Write.cs b/KeePassLib/Serialization/KdbxFile.Write.cs
similarity index 88%
rename from KeePassLib/Serialization/Kdb4File.Write.cs
rename to KeePassLib/Serialization/KdbxFile.Write.cs
index b16af6f..ff46180 100644
--- a/KeePassLib/Serialization/Kdb4File.Write.cs
+++ b/KeePassLib/Serialization/KdbxFile.Write.cs
@@ -48,11 +48,11 @@ using KeePassLib.Utility;
namespace KeePassLib.Serialization
{
/// <summary>
- /// Serialization to KeePass KDB files.
+ /// Serialization to KeePass KDBX files.
/// </summary>
- public sealed partial class Kdb4File
+ public sealed partial class KdbxFile
{
- // public void Save(string strFile, PwGroup pgDataSource, Kdb4Format format,
+ // public void Save(string strFile, PwGroup pgDataSource, KdbxFormat format,
// IStatusLogger slLogger)
// {
// bool bMadeUnhidden = UrlUtil.UnhideFile(strFile);
@@ -72,7 +72,7 @@ namespace KeePassLib.Serialization
/// be written.</param>
/// <param name="format">Format of the file to create.</param>
/// <param name="slLogger">Logger that recieves status information.</param>
- public void Save(Stream sSaveTo, PwGroup pgDataSource, Kdb4Format format,
+ public void Save(Stream sSaveTo, PwGroup pgDataSource, KdbxFormat format,
IStatusLogger slLogger)
{
Debug.Assert(sSaveTo != null);
@@ -100,11 +100,9 @@ namespace KeePassLib.Serialization
m_pbStreamStartBytes = cr.GetRandomBytes(32);
Stream writerStream;
- BinaryWriter bw = null;
- if(m_format == Kdb4Format.Default)
+ if(m_format == KdbxFormat.Default)
{
- bw = new BinaryWriter(hashedStream, encNoBom);
- WriteHeader(bw); // Also flushes bw
+ WriteHeader(hashedStream); // Also flushes the stream
Stream sEncrypted = AttachStreamEncryptor(hashedStream);
if((sEncrypted == null) || (sEncrypted == hashedStream))
@@ -119,7 +117,7 @@ namespace KeePassLib.Serialization
else
writerStream = sHashed;
}
- else if(m_format == Kdb4Format.PlainXml)
+ else if(m_format == KdbxFormat.PlainXml)
writerStream = hashedStream;
else { Debug.Assert(false); throw new FormatException("KdbFormat"); }
@@ -129,8 +127,6 @@ namespace KeePassLib.Serialization
m_xmlWriter.Flush();
m_xmlWriter.Close();
writerStream.Close();
-
- GC.KeepAlive(bw);
}
finally { CommonCleanUpWrite(sSaveTo, hashedStream); }
}
@@ -143,55 +139,62 @@ namespace KeePassLib.Serialization
sSaveTo.Close();
m_xmlWriter = null;
+ m_pbHashOfHeader = null;
}
- private void WriteHeader(BinaryWriter bw)
+ private void WriteHeader(Stream s)
{
- Debug.Assert(bw != null);
- if(bw == null) throw new ArgumentNullException("bw");
+ MemoryStream ms = new MemoryStream();
- bw.Write(MemUtil.UInt32ToBytes(FileSignature1));
- bw.Write(MemUtil.UInt32ToBytes(FileSignature2));
- bw.Write(MemUtil.UInt32ToBytes(FileVersion32));
+ MemUtil.Write(ms, MemUtil.UInt32ToBytes(FileSignature1));
+ MemUtil.Write(ms, MemUtil.UInt32ToBytes(FileSignature2));
+ MemUtil.Write(ms, MemUtil.UInt32ToBytes(FileVersion32));
- WriteHeaderField(bw, Kdb4HeaderFieldID.CipherID,
+ WriteHeaderField(ms, KdbxHeaderFieldID.CipherID,
m_pwDatabase.DataCipherUuid.UuidBytes);
int nCprID = (int)m_pwDatabase.Compression;
- WriteHeaderField(bw, Kdb4HeaderFieldID.CompressionFlags,
+ WriteHeaderField(ms, KdbxHeaderFieldID.CompressionFlags,
MemUtil.UInt32ToBytes((uint)nCprID));
- WriteHeaderField(bw, Kdb4HeaderFieldID.MasterSeed, m_pbMasterSeed);
- WriteHeaderField(bw, Kdb4HeaderFieldID.TransformSeed, m_pbTransformSeed);
- WriteHeaderField(bw, Kdb4HeaderFieldID.TransformRounds, MemUtil.UInt64ToBytes(m_pwDatabase.KeyEncryptionRounds));
- WriteHeaderField(bw, Kdb4HeaderFieldID.EncryptionIV, m_pbEncryptionIV);
- WriteHeaderField(bw, Kdb4HeaderFieldID.ProtectedStreamKey, m_pbProtectedStreamKey);
- WriteHeaderField(bw, Kdb4HeaderFieldID.StreamStartBytes, m_pbStreamStartBytes);
+ WriteHeaderField(ms, KdbxHeaderFieldID.MasterSeed, m_pbMasterSeed);
+ WriteHeaderField(ms, KdbxHeaderFieldID.TransformSeed, m_pbTransformSeed);
+ WriteHeaderField(ms, KdbxHeaderFieldID.TransformRounds,
+ MemUtil.UInt64ToBytes(m_pwDatabase.KeyEncryptionRounds));
+ WriteHeaderField(ms, KdbxHeaderFieldID.EncryptionIV, m_pbEncryptionIV);
+ WriteHeaderField(ms, KdbxHeaderFieldID.ProtectedStreamKey, m_pbProtectedStreamKey);
+ WriteHeaderField(ms, KdbxHeaderFieldID.StreamStartBytes, m_pbStreamStartBytes);
int nIrsID = (int)m_craInnerRandomStream;
- WriteHeaderField(bw, Kdb4HeaderFieldID.InnerRandomStreamID,
+ WriteHeaderField(ms, KdbxHeaderFieldID.InnerRandomStreamID,
MemUtil.UInt32ToBytes((uint)nIrsID));
- WriteHeaderField(bw, Kdb4HeaderFieldID.EndOfHeader, new byte[]{ (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' });
- bw.Flush();
+ WriteHeaderField(ms, KdbxHeaderFieldID.EndOfHeader, new byte[]{
+ (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' });
+
+ byte[] pbHeader = ms.ToArray();
+ ms.Close();
+
+ SHA256Managed sha256 = new SHA256Managed();
+ m_pbHashOfHeader = sha256.ComputeHash(pbHeader);
+
+ s.Write(pbHeader, 0, pbHeader.Length);
+ s.Flush();
}
- private static void WriteHeaderField(BinaryWriter bwOut,
- Kdb4HeaderFieldID kdbID, byte[] pbData)
+ private static void WriteHeaderField(Stream s, KdbxHeaderFieldID kdbID,
+ byte[] pbData)
{
- Debug.Assert(bwOut != null);
- if(bwOut == null) throw new ArgumentNullException("bwOut");
-
- bwOut.Write((byte)kdbID);
+ s.WriteByte((byte)kdbID);
if(pbData != null)
{
ushort uLength = (ushort)pbData.Length;
- bwOut.Write(uLength);
+ MemUtil.Write(s, MemUtil.UInt16ToBytes(uLength));
- if(uLength > 0) bwOut.Write(pbData);
+ if(uLength > 0) s.Write(pbData, 0, pbData.Length);
}
- else bwOut.Write((ushort)0);
+ else MemUtil.Write(s, MemUtil.UInt16ToBytes((ushort)0));
}
private Stream AttachStreamEncryptor(Stream s)
@@ -314,6 +317,11 @@ namespace KeePassLib.Serialization
m_xmlWriter.WriteStartElement(ElemMeta);
WriteObject(ElemGenerator, PwDatabase.LocalizedAppName, false); // Generator name
+
+ if(m_pbHashOfHeader != null)
+ WriteObject(ElemHeaderHash, Convert.ToBase64String(
+ m_pbHashOfHeader), false);
+
WriteObject(ElemDbName, m_pwDatabase.Name, true);
WriteObject(ElemDbNameChanged, m_pwDatabase.NameChanged);
WriteObject(ElemDbDesc, m_pwDatabase.Description, true);
@@ -651,7 +659,7 @@ namespace KeePassLib.Serialization
bProtected = m_pwDatabase.MemoryProtection.ProtectNotes;
}
- if(bProtected && (m_format != Kdb4Format.PlainXml))
+ if(bProtected && (m_format != KdbxFormat.PlainXml))
{
m_xmlWriter.WriteAttributeString(AttrProtected, ValTrue);
@@ -700,7 +708,7 @@ namespace KeePassLib.Serialization
strValue = sb.ToString(); // Correct string for current code page
}
- if((m_format == Kdb4Format.PlainXml) && bProtected)
+ if((m_format == KdbxFormat.PlainXml) && bProtected)
m_xmlWriter.WriteAttributeString(AttrProtectedInMemPlainXml, ValTrue);
m_xmlWriter.WriteString(StrUtil.SafeXmlString(strValue));
@@ -734,7 +742,7 @@ namespace KeePassLib.Serialization
private void SubWriteValue(ProtectedBinary value)
{
- if(value.IsProtected && (m_format != Kdb4Format.PlainXml))
+ if(value.IsProtected && (m_format != KdbxFormat.PlainXml))
{
m_xmlWriter.WriteAttributeString(AttrProtected, ValTrue);
@@ -802,8 +810,8 @@ namespace KeePassLib.Serialization
/// to the stream.</returns>
public static bool WriteEntries(Stream msOutput, PwEntry[] vEntries)
{
- /* Kdb4File f = new Kdb4File(pwDatabase);
- f.m_format = Kdb4Format.PlainXml;
+ /* KdbxFile f = new KdbxFile(pwDatabase);
+ f.m_format = KdbxFormat.PlainXml;
XmlTextWriter xtw = null;
try { xtw = new XmlTextWriter(msOutput, StrUtil.Utf8); }
@@ -835,8 +843,8 @@ namespace KeePassLib.Serialization
foreach(PwEntry peCopy in vEntries)
pd.RootGroup.AddEntry(peCopy.CloneDeep(), true);
- Kdb4File f = new Kdb4File(pd);
- f.Save(msOutput, null, Kdb4Format.PlainXml, null);
+ KdbxFile f = new KdbxFile(pd);
+ f.Save(msOutput, null, KdbxFormat.PlainXml, null);
return true;
}
}
diff --git a/KeePassLib/Serialization/Kdb4File.cs b/KeePassLib/Serialization/KdbxFile.cs
similarity index 92%
rename from KeePassLib/Serialization/Kdb4File.cs
rename to KeePassLib/Serialization/KdbxFile.cs
index 25df286..d76b551 100644
--- a/KeePassLib/Serialization/Kdb4File.cs
+++ b/KeePassLib/Serialization/KdbxFile.cs
@@ -39,10 +39,10 @@ using KeePassLib.Utility;
namespace KeePassLib.Serialization
{
/// <summary>
- /// The <c>Kdb4File</c> class supports saving the data to various
+ /// The <c>KdbxFile</c> class supports saving the data to various
/// formats.
/// </summary>
- public enum Kdb4Format
+ public enum KdbxFormat
{
/// <summary>
/// The default, encrypted file format.
@@ -56,9 +56,9 @@ namespace KeePassLib.Serialization
}
/// <summary>
- /// Serialization to KeePass KDB files.
+ /// Serialization to KeePass KDBX files.
/// </summary>
- public sealed partial class Kdb4File
+ public sealed partial class KdbxFile
{
/// <summary>
/// File identifier, first 32-bit value.
@@ -71,13 +71,13 @@ namespace KeePassLib.Serialization
private const uint FileSignature2 = 0xB54BFB67;
/// <summary>
- /// File version of files saved by the current <c>Kdb4File</c> class.
+ /// File version of files saved by the current <c>KdbxFile</c> class.
/// KeePass 2.07 has version 1.01, 2.08 has 1.02, 2.09 has 2.00,
- /// 2.10 has 2.02, 2.11 has 2.04, 2.15 has 3.00.
+ /// 2.10 has 2.02, 2.11 has 2.04, 2.15 has 3.00, 2.20 has 3.01.
/// The first 2 bytes are critical (i.e. loading will fail, if the
/// file version is too high), the last 2 bytes are informational.
/// </summary>
- private const uint FileVersion32 = 0x00030000;
+ private const uint FileVersion32 = 0x00030001;
private const uint FileVersionCriticalMask = 0xFFFF0000;
@@ -95,6 +95,7 @@ namespace KeePassLib.Serialization
private const string ElemEntry = "Entry";
private const string ElemGenerator = "Generator";
+ private const string ElemHeaderHash = "HeaderHash";
private const string ElemDbName = "DatabaseName";
private const string ElemDbNameChanged = "DatabaseNameChanged";
private const string ElemDbDesc = "DatabaseDescription";
@@ -192,7 +193,7 @@ namespace KeePassLib.Serialization
private XmlTextWriter m_xmlWriter = null;
private CryptoRandomStream m_randomStream = null;
- private Kdb4Format m_format = Kdb4Format.Default;
+ private KdbxFormat m_format = KdbxFormat.Default;
private IStatusLogger m_slLogger = null;
private byte[] m_pbMasterSeed = null;
@@ -208,6 +209,7 @@ namespace KeePassLib.Serialization
private Dictionary<string, ProtectedBinary> m_dictBinPool =
new Dictionary<string, ProtectedBinary>();
+ private byte[] m_pbHashOfHeader = null;
private byte[] m_pbHashOfFileOnDisk = null;
private readonly DateTime m_dtNow = DateTime.Now; // Cache current time
@@ -217,7 +219,7 @@ namespace KeePassLib.Serialization
private const uint NeutralLanguageID = NeutralLanguageOffset + NeutralLanguageIDSec;
private static bool m_bLocalizedNames = false;
- private enum Kdb4HeaderFieldID : byte
+ private enum KdbxHeaderFieldID : byte
{
EndOfHeader = 0,
Comment = 1,
@@ -261,7 +263,7 @@ namespace KeePassLib.Serialization
/// </summary>
/// <param name="pwDataStore">The <c>PwDatabase</c> instance that the
/// class will load file data into or use to create a KDBX file.</param>
- public Kdb4File(PwDatabase pwDataStore)
+ public KdbxFile(PwDatabase pwDataStore)
{
Debug.Assert(pwDataStore != null);
if(pwDataStore == null) throw new ArgumentNullException("pwDataStore");
diff --git a/KeePassLib/Utility/GfxUtil.cs b/KeePassLib/Utility/GfxUtil.cs
new file mode 100644
index 0000000..cbccc72
--- /dev/null
+++ b/KeePassLib/Utility/GfxUtil.cs
@@ -0,0 +1,87 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Diagnostics;
+
+namespace KeePassLib.Utility
+{
+ public static class GfxUtil
+ {
+ public static Image LoadImage(byte[] pb)
+ {
+ if(pb == null) throw new ArgumentNullException("pb");
+
+ MemoryStream ms = new MemoryStream(pb, false);
+ try { return LoadImagePriv(ms); }
+ catch(Exception)
+ {
+ Image imgIco = TryLoadIco(pb);
+ if(imgIco != null) return imgIco;
+ throw;
+ }
+ finally { ms.Close(); }
+ }
+
+ private static Image LoadImagePriv(Stream s)
+ {
+ // Image.FromStream wants the stream to be open during
+ // the whole lifetime of the image; as we can't guarantee
+ // this, we make a copy of the image
+ Image imgSrc = null;
+ try
+ {
+#if !KeePassLibSD
+ imgSrc = Image.FromStream(s);
+ Image img = new Bitmap(imgSrc.Width, imgSrc.Height,
+ PixelFormat.Format32bppArgb);
+#else
+ imgSrc = new Bitmap(s);
+ Image img = new Bitmap(imgSrc.Width, imgSrc.Height);
+#endif
+
+ using(Graphics g = Graphics.FromImage(img))
+ {
+ g.Clear(Color.Transparent);
+ g.DrawImage(imgSrc, 0, 0);
+ }
+
+ return img;
+ }
+ finally { if(imgSrc != null) imgSrc.Dispose(); }
+ }
+
+ private static Image TryLoadIco(byte[] pb)
+ {
+#if !KeePassLibSD
+ MemoryStream ms = new MemoryStream(pb, false);
+ try { return (new Icon(ms)).ToBitmap(); }
+ catch(Exception) { }
+ finally { ms.Close(); }
+#endif
+
+ return null;
+ }
+ }
+}
diff --git a/KeePassLib/Utility/MemUtil.cs b/KeePassLib/Utility/MemUtil.cs
index 94e8207..5d8c86c 100644
--- a/KeePassLib/Utility/MemUtil.cs
+++ b/KeePassLib/Utility/MemUtil.cs
@@ -285,14 +285,52 @@ namespace KeePassLib.Utility
const int nBufSize = 4096;
byte[] pbBuf = new byte[nBufSize];
- int nRead;
- while((nRead = sSource.Read(pbBuf, 0, nBufSize)) > 0)
+ while(true)
+ {
+ int nRead = sSource.Read(pbBuf, 0, nBufSize);
+ if(nRead == 0) break;
+
sTarget.Write(pbBuf, 0, nRead);
+ }
// Do not close any of the streams
}
+ public static byte[] Read(Stream s, int nCount)
+ {
+ if(s == null) throw new ArgumentNullException("s");
+ if(nCount < 0) throw new ArgumentOutOfRangeException("nCount");
+
+ byte[] pb = new byte[nCount];
+ int iOffset = 0;
+ while(nCount > 0)
+ {
+ int iRead = s.Read(pb, iOffset, nCount);
+ if(iRead == 0) break;
+
+ iOffset += iRead;
+ nCount -= iRead;
+ }
+
+ if(iOffset != pb.Length)
+ {
+ byte[] pbPart = new byte[iOffset];
+ Array.Copy(pb, pbPart, iOffset);
+ return pbPart;
+ }
+
+ return pb;
+ }
+
+ public static void Write(Stream s, byte[] pbData)
+ {
+ if(s == null) { Debug.Assert(false); return; }
+ if(pbData == null) { Debug.Assert(false); return; }
+
+ s.Write(pbData, 0, pbData.Length);
+ }
+
public static byte[] Compress(byte[] pbData)
{
if(pbData == null) throw new ArgumentNullException("pbData");
diff --git a/KeePassLib/Utility/MessageService.cs b/KeePassLib/Utility/MessageService.cs
index 4085382..998900e 100644
--- a/KeePassLib/Utility/MessageService.cs
+++ b/KeePassLib/Utility/MessageService.cs
@@ -158,6 +158,16 @@ namespace KeePassLib.Utility
return sbText.ToString();
}
+#if !KeePassLibSD
+ internal static Form GetTopForm()
+ {
+ FormCollection fc = Application.OpenForms;
+ if((fc == null) || (fc.Count == 0)) return null;
+
+ return fc[fc.Count - 1];
+ }
+#endif
+
private static DialogResult SafeShowMessageBox(string strText, string strTitle,
MessageBoxButtons mb, MessageBoxIcon mi, MessageBoxDefaultButton mdb)
{
@@ -167,15 +177,11 @@ namespace KeePassLib.Utility
IWin32Window wnd = null;
try
{
- FormCollection fc = Application.OpenForms;
- if((fc != null) && (fc.Count > 0))
- {
- Form f = fc[fc.Count - 1];
- if((f != null) && f.InvokeRequired)
- return (DialogResult)f.Invoke(new SafeShowMessageBoxInternalDelegate(
- SafeShowMessageBoxInternal), f, strText, strTitle, mb, mi, mdb);
- else wnd = f;
- }
+ Form f = GetTopForm();
+ if((f != null) && f.InvokeRequired)
+ return (DialogResult)f.Invoke(new SafeShowMessageBoxInternalDelegate(
+ SafeShowMessageBoxInternal), f, strText, strTitle, mb, mi, mdb);
+ else wnd = f;
}
catch(Exception) { Debug.Assert(false); }
diff --git a/KeePassLibSD/KeePassLibSD.csproj b/KeePassLibSD/KeePassLibSD.csproj
index 3e4bf78..0afa13d 100644
--- a/KeePassLibSD/KeePassLibSD.csproj
+++ b/KeePassLibSD/KeePassLibSD.csproj
@@ -248,17 +248,17 @@
<Compile Include="..\KeePassLib\Serialization\IOConnectionInfo.cs">
<Link>Serialization\IOConnectionInfo.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.cs">
- <Link>Serialization\Kdb4File.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.cs">
+ <Link>Serialization\KdbxFile.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.Read.cs">
- <Link>Serialization\Kdb4File.Read.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.Read.cs">
+ <Link>Serialization\KdbxFile.Read.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.Read.Streamed.cs">
- <Link>Serialization\Kdb4File.Read.Streamed.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.Read.Streamed.cs">
+ <Link>Serialization\KdbxFile.Read.Streamed.cs</Link>
</Compile>
- <Compile Include="..\KeePassLib\Serialization\Kdb4File.Write.cs">
- <Link>Serialization\Kdb4File.Write.cs</Link>
+ <Compile Include="..\KeePassLib\Serialization\KdbxFile.Write.cs">
+ <Link>Serialization\KdbxFile.Write.cs</Link>
</Compile>
<Compile Include="..\KeePassLib\Serialization\OldFormatException.cs">
<Link>Serialization\OldFormatException.cs</Link>
@@ -284,6 +284,9 @@
<Compile Include="..\KeePassLib\Utility\AppLogEx.cs">
<Link>Utility\AppLogEx.cs</Link>
</Compile>
+ <Compile Include="..\KeePassLib\Utility\GfxUtil.cs">
+ <Link>Utility\GfxUtil.cs</Link>
+ </Compile>
<Compile Include="..\KeePassLib\Utility\MemUtil.cs">
<Link>Utility\MemUtil.cs</Link>
</Compile>
diff --git a/KeePassLibSD/Properties/AssemblyInfo.cs b/KeePassLibSD/Properties/AssemblyInfo.cs
index 7ec1fff..5cd83ff 100644
--- a/KeePassLibSD/Properties/AssemblyInfo.cs
+++ b/KeePassLibSD/Properties/AssemblyInfo.cs
@@ -38,4 +38,4 @@ using System.Runtime.InteropServices;
[assembly: Guid("1d3c6f10-e10b-47be-a2f1-af2562d7d470")]
// Assembly version information
-[assembly: AssemblyVersion("2.19.0.*")]
+[assembly: AssemblyVersion("2.20.0.*")]
diff --git a/ShInstUtil/ShInstUtil.rc b/ShInstUtil/ShInstUtil.rc
index a95027b..31cfe29 100644
--- a/ShInstUtil/ShInstUtil.rc
+++ b/ShInstUtil/ShInstUtil.rc
@@ -65,8 +65,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,19,0,0
- PRODUCTVERSION 2,19,0,0
+ FILEVERSION 2,20,0,0
+ PRODUCTVERSION 2,20,0,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -83,12 +83,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Dominik Reichl"
VALUE "FileDescription", "ShInstUtil - KeePass Helper Utility"
- VALUE "FileVersion", "2, 19, 0, 0"
+ VALUE "FileVersion", "2, 20, 0, 0"
VALUE "InternalName", "ShInstUtil"
VALUE "LegalCopyright", "Copyright (c) 2007-2012 Dominik Reichl"
VALUE "OriginalFilename", "ShInstUtil.exe"
VALUE "ProductName", "ShInstUtil - KeePass Helper Utility"
- VALUE "ProductVersion", "2, 19, 0, 0"
+ VALUE "ProductVersion", "2, 20, 0, 0"
END
END
BLOCK "VarFileInfo"
diff --git a/Translation/DefaultText.xml b/Translation/DefaultText.xml
index c751cb3..3d7a7af 100644
--- a/Translation/DefaultText.xml
+++ b/Translation/DefaultText.xml
@@ -127,6 +127,9 @@
<Data Name="AutoType">
<Value>Auto-Type</Value>
</Data>
+ <Data Name="AutoTypeCancelOnTitleChange">
+ <Value>Cancel auto-type when the target window title changes</Value>
+ </Data>
<Data Name="AutoTypeCancelOnWindowChange">
<Value>Cancel auto-type when the target window changes</Value>
</Data>
@@ -958,7 +961,7 @@
<Data Name="Italic">
<Value>Italic</Value>
</Data>
- <Data Name="Kdb3KeePassLibC">
+ <Data Name="KdbKeePassLibC">
<Value>The KeePassLibC library is required to open and save KDB files created by KeePass 1.x.</Value>
</Data>
<Data Name="KdbxFiles">
@@ -1423,6 +1426,9 @@
<Data Name="RememberKeySources">
<Value>Remember key sources (key file paths, provider names, ...)</Value>
</Data>
+ <Data Name="RememberWorkingDirectories">
+ <Value>Remember working directories</Value>
+ </Data>
<Data Name="RemoteHostReachable">
<Value>Remote host is reachable (ping)</Value>
</Data>
@@ -1891,8 +1897,8 @@
<Data Name="XslSelectFile">
<Value>Select XSL Transformation File</Value>
</Data>
- <Data Name="XslStylesheets">
- <Value>XSL Stylesheets for KDB4 XML</Value>
+ <Data Name="XslStylesheetsKdbx">
+ <Value>XSL Stylesheets for KDBX XML</Value>
</Data>
<Data Name="Yes">
<Value>Yes</Value>
@@ -1934,7 +1940,7 @@
<Value>A newer KeePass version is required to open this file.</Value>
</Data>
<Data Name="FileSaveCorruptionWarning">
- <Value>The target file might be in a corrupted state. Please try saving again, and if that fails, save the database to a different location.</Value>
+ <Value>The target file might be corrupted. Please try saving again. If that fails, save the database to a different location.</Value>
</Data>
<Data Name="FileSaveFailed">
<Value>Failed to save the current database to the specified location!</Value>
diff --git a/Translation/TrlUtil/MainForm.Designer.cs b/Translation/TrlUtil/MainForm.Designer.cs
index 29e1cd8..316433e 100644
--- a/Translation/TrlUtil/MainForm.Designer.cs
+++ b/Translation/TrlUtil/MainForm.Designer.cs
@@ -92,6 +92,7 @@
this.m_tbSave = new System.Windows.Forms.ToolStripButton();
this.m_tbSep0 = new System.Windows.Forms.ToolStripSeparator();
this.m_tbFind = new System.Windows.Forms.ToolStripTextBox();
+ this.m_menuFileImportPo = new System.Windows.Forms.ToolStripMenuItem();
this.m_tabMain.SuspendLayout();
this.m_tabProps.SuspendLayout();
this.m_tabStrings.SuspendLayout();
@@ -588,14 +589,14 @@
this.m_menuFileSep1,
this.m_menuFileExit});
this.m_menuFile.Name = "m_menuFile";
- this.m_menuFile.Size = new System.Drawing.Size(35, 20);
+ this.m_menuFile.Size = new System.Drawing.Size(39, 20);
this.m_menuFile.Text = "&File";
//
// m_menuFileOpen
//
this.m_menuFileOpen.Image = global::TrlUtil.Properties.Resources.B16x16_Folder_Yellow_Open;
this.m_menuFileOpen.Name = "m_menuFileOpen";
- this.m_menuFileOpen.Size = new System.Drawing.Size(123, 22);
+ this.m_menuFileOpen.Size = new System.Drawing.Size(152, 22);
this.m_menuFileOpen.Text = "&Open...";
this.m_menuFileOpen.Click += new System.EventHandler(this.OnFileOpen);
//
@@ -603,7 +604,7 @@
//
this.m_menuFileSave.Image = global::TrlUtil.Properties.Resources.B16x16_FileSave;
this.m_menuFileSave.Name = "m_menuFileSave";
- this.m_menuFileSave.Size = new System.Drawing.Size(123, 22);
+ this.m_menuFileSave.Size = new System.Drawing.Size(152, 22);
this.m_menuFileSave.Text = "&Save";
this.m_menuFileSave.Click += new System.EventHandler(this.OnFileSave);
//
@@ -611,53 +612,54 @@
//
this.m_menuFileSaveAs.Image = global::TrlUtil.Properties.Resources.B16x16_FileSaveAs;
this.m_menuFileSaveAs.Name = "m_menuFileSaveAs";
- this.m_menuFileSaveAs.Size = new System.Drawing.Size(123, 22);
+ this.m_menuFileSaveAs.Size = new System.Drawing.Size(152, 22);
this.m_menuFileSaveAs.Text = "Save &As...";
this.m_menuFileSaveAs.Click += new System.EventHandler(this.OnFileSaveAs);
//
// m_menuFileSep0
//
this.m_menuFileSep0.Name = "m_menuFileSep0";
- this.m_menuFileSep0.Size = new System.Drawing.Size(120, 6);
+ this.m_menuFileSep0.Size = new System.Drawing.Size(149, 6);
//
// m_menuFileImport
//
this.m_menuFileImport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.m_menuFileImportLng,
+ this.m_menuFileImportPo,
this.m_menuFileImportSep0,
this.m_menuFileImport2xNoChecks});
this.m_menuFileImport.Name = "m_menuFileImport";
- this.m_menuFileImport.Size = new System.Drawing.Size(123, 22);
- this.m_menuFileImport.Text = "Import";
+ this.m_menuFileImport.Size = new System.Drawing.Size(152, 22);
+ this.m_menuFileImport.Text = "&Import";
//
// m_menuFileImportLng
//
this.m_menuFileImportLng.Name = "m_menuFileImportLng";
- this.m_menuFileImportLng.Size = new System.Drawing.Size(282, 22);
- this.m_menuFileImportLng.Text = "KeePass 1.x LNG File...";
+ this.m_menuFileImportLng.Size = new System.Drawing.Size(311, 22);
+ this.m_menuFileImportLng.Text = "KeePass &1.x LNG File...";
this.m_menuFileImportLng.Click += new System.EventHandler(this.OnImport1xLng);
//
// m_menuFileImportSep0
//
this.m_menuFileImportSep0.Name = "m_menuFileImportSep0";
- this.m_menuFileImportSep0.Size = new System.Drawing.Size(279, 6);
+ this.m_menuFileImportSep0.Size = new System.Drawing.Size(308, 6);
//
// m_menuFileImport2xNoChecks
//
this.m_menuFileImport2xNoChecks.Name = "m_menuFileImport2xNoChecks";
- this.m_menuFileImport2xNoChecks.Size = new System.Drawing.Size(282, 22);
- this.m_menuFileImport2xNoChecks.Text = "KeePass 2.x LNGX File (No Base Checks)...";
+ this.m_menuFileImport2xNoChecks.Size = new System.Drawing.Size(311, 22);
+ this.m_menuFileImport2xNoChecks.Text = "KeePass &2.x LNGX File (No Base Checks)...";
this.m_menuFileImport2xNoChecks.Click += new System.EventHandler(this.OnImport2xNoChecks);
//
// m_menuFileSep1
//
this.m_menuFileSep1.Name = "m_menuFileSep1";
- this.m_menuFileSep1.Size = new System.Drawing.Size(120, 6);
+ this.m_menuFileSep1.Size = new System.Drawing.Size(149, 6);
//
// m_menuFileExit
//
this.m_menuFileExit.Name = "m_menuFileExit";
- this.m_menuFileExit.Size = new System.Drawing.Size(123, 22);
+ this.m_menuFileExit.Size = new System.Drawing.Size(152, 22);
this.m_menuFileExit.Text = "&Exit";
this.m_menuFileExit.Click += new System.EventHandler(this.OnFileExit);
//
@@ -708,6 +710,13 @@
this.m_tbFind.KeyUp += new System.Windows.Forms.KeyEventHandler(this.OnFindKeyUp);
this.m_tbFind.TextChanged += new System.EventHandler(this.OnFindTextChanged);
//
+ // m_menuFileImportPo
+ //
+ this.m_menuFileImportPo.Name = "m_menuFileImportPo";
+ this.m_menuFileImportPo.Size = new System.Drawing.Size(311, 22);
+ this.m_menuFileImportPo.Text = "&PO File...";
+ this.m_menuFileImportPo.Click += new System.EventHandler(this.OnImportPo);
+ //
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -809,6 +818,7 @@
private System.Windows.Forms.ToolStripSeparator m_menuFileImportSep0;
private System.Windows.Forms.ToolStripMenuItem m_menuFileImport2xNoChecks;
private System.Windows.Forms.CheckBox m_cbRtl;
+ private System.Windows.Forms.ToolStripMenuItem m_menuFileImportPo;
}
}
diff --git a/Translation/TrlUtil/MainForm.cs b/Translation/TrlUtil/MainForm.cs
index cb3ebd4..b203caa 100644
--- a/Translation/TrlUtil/MainForm.cs
+++ b/Translation/TrlUtil/MainForm.cs
@@ -34,6 +34,7 @@ using KeePass.Util.XmlSerialization;
using KeePassLib;
using KeePassLib.Resources;
+using KeePassLib.Serialization;
using KeePassLib.Translation;
using KeePassLib.Utility;
@@ -59,6 +60,8 @@ namespace TrlUtil
private PreviewForm m_prev = new PreviewForm();
+ private delegate void ImportFn(KPTranslation trlInto, IOConnectionInfo ioc);
+
public MainForm()
{
InitializeComponent();
@@ -393,8 +396,8 @@ namespace TrlUtil
private void OnFileOpen(object sender, EventArgs e)
{
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog("Open KeePass Translation",
- m_strFileFilter, 1, null, false, false);
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog("Open KeePass Translation",
+ m_strFileFilter, 1, null, false, AppDefs.FileDialogContext.Attachments);
if(ofd.ShowDialog() != DialogResult.OK) return;
@@ -623,7 +626,7 @@ namespace TrlUtil
Debug.Assert(kpstItem != null);
if(kpstItem == null) return;
- m_tbStrEng.Text = lvsic[0].SubItems[1].Text;
+ UIUtil.SetMultilineText(m_tbStrEng, lvsic[0].SubItems[1].Text);
m_tbStrTrl.Text = lvsic[0].SubItems[2].Text;
}
@@ -667,8 +670,9 @@ namespace TrlUtil
private void OnFileSaveAs(object sender, EventArgs e)
{
- SaveFileDialog sfd = UIUtil.CreateSaveFileDialog("Save KeePass Translation",
- m_tbNameEng.Text + ".lngx", m_strFileFilter, 1, "lngx", false);
+ SaveFileDialogEx sfd = UIUtil.CreateSaveFileDialog("Save KeePass Translation",
+ m_tbNameEng.Text + ".lngx", m_strFileFilter, 1, "lngx",
+ AppDefs.FileDialogContext.Attachments);
if(sfd.ShowDialog() != DialogResult.OK) return;
@@ -694,7 +698,7 @@ namespace TrlUtil
m_kpccLast = kpcc;
- m_tbCtrlEngText.Text = m_kpccLast.TextEnglish;
+ UIUtil.SetMultilineText(m_tbCtrlEngText, m_kpccLast.TextEnglish);
m_tbCtrlTrlText.Text = m_kpccLast.Text;
m_tbLayoutX.Text = KpccLayout.ToControlRelativeString(m_kpccLast.Layout.X);
@@ -821,12 +825,24 @@ namespace TrlUtil
private void OnImport1xLng(object sender, EventArgs e)
{
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog("Import KeePass 1.x LNG File",
- "KeePass 1.x LNG File (*.lng)|*.lng|All Files (*.*)|*.*", 1, "lng", false, true);
+ PerformImport("lng", "KeePass 1.x LNG File", Import1xLng);
+ }
+
+ private static void Import1xLng(KPTranslation trlInto, IOConnectionInfo ioc)
+ {
+ TrlImport.Import1xLng(trlInto, ioc.Path);
+ }
+
+ private void PerformImport(string strFileExt, string strFileDesc, ImportFn f)
+ {
+ OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog("Import " + strFileDesc,
+ strFileDesc + " (*." + strFileExt + ")|*." + strFileExt +
+ "|All Files (*.*)|*.*", 1, strFileExt, false,
+ AppDefs.FileDialogContext.Import);
if(ofd.ShowDialog() != DialogResult.OK) return;
- try { KeePass1xLngImport.Import(m_trl, ofd.FileName); }
+ try { f(m_trl, IOConnectionInfo.FromPath(ofd.FileName)); }
catch(Exception ex) { MessageService.ShowWarning(ex); }
UpdateStringTableUI();
@@ -955,5 +971,15 @@ namespace TrlUtil
OnFileOpen(sender, EventArgs.Empty);
FormTrlMgr.IgnoreBaseHash = false;
}
+
+ private void OnImportPo(object sender, EventArgs e)
+ {
+ PerformImport("po", "PO File", ImportPo);
+ }
+
+ private static void ImportPo(KPTranslation trlInto, IOConnectionInfo ioc)
+ {
+ TrlImport.ImportPo(trlInto, ioc.Path);
+ }
}
}
diff --git a/Translation/TrlUtil/Properties/AssemblyInfo.cs b/Translation/TrlUtil/Properties/AssemblyInfo.cs
index aca8622..e45e4fa 100644
--- a/Translation/TrlUtil/Properties/AssemblyInfo.cs
+++ b/Translation/TrlUtil/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
[assembly: Guid("39aa6f93-a1c9-497f-bad2-cc42a61d5710")]
// Assembly version information
-[assembly: AssemblyVersion("2.19.0.*")]
-[assembly: AssemblyFileVersion("2.19.0.0")]
+[assembly: AssemblyVersion("2.20.0.*")]
+[assembly: AssemblyFileVersion("2.20.0.0")]
diff --git a/Translation/TrlUtil/KeePass1xLngImport.cs b/Translation/TrlUtil/TrlImport.cs
similarity index 58%
rename from Translation/TrlUtil/KeePass1xLngImport.cs
rename to Translation/TrlUtil/TrlImport.cs
index b211e5e..32e1c51 100644
--- a/Translation/TrlUtil/KeePass1xLngImport.cs
+++ b/Translation/TrlUtil/TrlImport.cs
@@ -24,16 +24,17 @@ using System.IO;
using System.Diagnostics;
using KeePassLib.Translation;
+using KeePassLib.Utility;
namespace TrlUtil
{
- public static class KeePass1xLngImport
+ public static class TrlImport
{
- public static void Import(KPTranslation kpInto, string strFile)
+ public static void Import1xLng(KPTranslation kpInto, string strFile)
{
if((strFile == null) || (strFile.Length == 0)) { Debug.Assert(false); return; }
- string strData = File.ReadAllText(strFile, Encoding.UTF8);
+ string strData = File.ReadAllText(strFile, StrUtil.Utf8);
Dictionary<string, string> dict = new Dictionary<string, string>();
@@ -85,34 +86,66 @@ namespace TrlUtil
{
foreach(KPStringTableItem kpsti in kpst.Strings)
{
- if(kpsti.Value.Length == 0)
- {
- string strTrl;
- if(dict.TryGetValue(kpsti.ValueEnglish, out strTrl))
- kpsti.Value = strTrl;
- }
+ string strTrl;
+ if(dict.TryGetValue(kpsti.ValueEnglish, out strTrl))
+ kpsti.Value = strTrl;
}
}
foreach(KPFormCustomization kpfc in kpInto.Forms)
{
- if(kpfc.Window.Text.Length == 0)
+ string strTrlWnd;
+ if(dict.TryGetValue(kpfc.Window.TextEnglish, out strTrlWnd))
+ kpfc.Window.Text = strTrlWnd;
+
+ foreach(KPControlCustomization kpcc in kpfc.Controls)
{
- string strTrlWnd;
- if(dict.TryGetValue(kpfc.Window.TextEnglish, out strTrlWnd))
- kpfc.Window.Text = strTrlWnd;
+ string strTrlCtrl;
+ if(dict.TryGetValue(kpcc.TextEnglish, out strTrlCtrl))
+ kpcc.Text = strTrlCtrl;
}
+ }
+ }
- foreach(KPControlCustomization kpcc in kpfc.Controls)
+ public static void ImportPo(KPTranslation kpInto, string strFile)
+ {
+ if((strFile == null) || (strFile.Length == 0)) { Debug.Assert(false); return; }
+
+ string strData = File.ReadAllText(strFile, StrUtil.Utf8);
+ strData = StrUtil.NormalizeNewLines(strData, false);
+ string[] vData = strData.Split('\n');
+
+ Dictionary<string, string> dict = new Dictionary<string, string>();
+ string strID = string.Empty;
+ foreach(string strLine in vData)
+ {
+ string str = strLine.Trim();
+ if(str.StartsWith("msgid ", StrUtil.CaseIgnoreCmp))
+ strID = FilterPoValue(str.Substring(6));
+ else if(str.StartsWith("msgstr ", StrUtil.CaseIgnoreCmp))
{
- if(kpcc.Text.Length == 0)
+ if(strID.Length > 0)
{
- string strTrlCtrl;
- if(dict.TryGetValue(kpcc.TextEnglish, out strTrlCtrl))
- kpcc.Text = strTrlCtrl;
+ dict[strID] = FilterPoValue(str.Substring(7));
+ strID = string.Empty;
}
}
}
+
+ MergeDict(kpInto, dict);
+ }
+
+ private static string FilterPoValue(string str)
+ {
+ if(str == null) { Debug.Assert(false); return string.Empty; }
+
+ if(str.StartsWith("\"") && str.EndsWith("\"") && (str.Length >= 2))
+ str = str.Substring(1, str.Length - 2);
+ else { Debug.Assert(false); }
+
+ str = str.Replace("\\\"", "\"");
+
+ return str;
}
}
}
diff --git a/Translation/TrlUtil/TrlUtil.csproj b/Translation/TrlUtil/TrlUtil.csproj
index c99a16a..4f4f6f5 100644
--- a/Translation/TrlUtil/TrlUtil.csproj
+++ b/Translation/TrlUtil/TrlUtil.csproj
@@ -42,7 +42,7 @@
<ItemGroup>
<Compile Include="AccelKeysCheck.cs" />
<Compile Include="FormTrlMgr.cs" />
- <Compile Include="KeePass1xLngImport.cs" />
+ <Compile Include="TrlImport.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
--
keepass2
More information about the Pkg-cli-apps-commits
mailing list