]> code.delx.au - refind/commitdiff
Added forgotten new or split files to git repo.
authorsrs5694 <srs5694@users.sourceforge.net>
Sun, 29 Nov 2015 18:27:00 +0000 (13:27 -0500)
committersrs5694 <srs5694@users.sourceforge.net>
Sun, 29 Nov 2015 18:27:00 +0000 (13:27 -0500)
docs/refind/about.svg [new file with mode: 0644]
refind/mystrings.c [new file with mode: 0644]
refind/mystrings.h [new file with mode: 0644]

diff --git a/docs/refind/about.svg b/docs/refind/about.svg
new file mode 100644 (file)
index 0000000..47b2b8b
--- /dev/null
@@ -0,0 +1,972 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   width="525"
+   height="559"
+   sodipodi:docname="about.svg"
+   inkscape:export-filename="/home/rodsmith/programming/refind/current/docs/refind/about.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1190"
+     inkscape:window-height="936"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="1.1941123"
+     inkscape:cx="118.45995"
+     inkscape:cy="279.5"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <image
+     width="525"
+     height="559"
+     xlink:href="data:image/png;base64,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
+i83KyoqOjmaxWBoaGjQa7fvvvzcxMYEfSfSRIfx0gMArR+Tnkhj/0KFDGRkZEv1caWlp2dnZdXV1
+VCpVS0vL29u71/XGsacP0ndPHwBg2bJlbDabw+FwuVz4Q7B///7r168TtRei/OLeOn19/YULFxJ5
+3Prevoj2ktjugHz/r6io2LdvH5vNNjY2trKyOn78uL6+fk5ODlE9yOu4IKocieWxtrYmioPwDEqE
+6DiSuL9o7x4pj6EMvwPyZTCOExgh2NM3OEG3OwbTAzzvhCEEe/owGAzA1xODGezpG5wg2h2DkQge
+JzAYDAaDAs87YTAYDAYFHicwGAwGgwKPExgMBoNBMRjHiSNHjlhYWMyZM2fevHmOjo4hISFwUSMh
+/e3b6hH/xIkTs2fPll5W0xf6w9v1PuOL8jH5wkiRmZnp7OxsbW3t5OTU460RaZBvveXl5fn4+DAY
+DDc3t+3bt7948eLbb781NzeHb1EAAH766ac5c+asXLkyNjbW3Nzc0tIyISEBABAVFTVnzhz4Oiep
++EQ+ypycHCcnpzlz5lhaWjo5OT148KDXwl+9enXNmjVOTk7z5s3bvHlzXV0dOj/aP/gBevrkxWAc
+J8LCwmxtbc3Nza9fv3727Nm2trZly5bBxV4gpHxbMvjXesTfvHmzmZkZqV2QbbtAHt6ugYrf374w
+2erz/dPd3b1v3z5nZ+cbN26cO3fu5s2b6Pz9Wm8//fRTeHi4r69vbm5uUlLSkydPWCxWcHDwjBkz
+4uLi4BJbnp6eM2fOjIyM3Lhx44wZMxwcHNavXw8A2LFjx8yZMxMTE8nGJ/JROjs7M5nMmTNnOjg4
+MJlMaZ7ArqmpsbW1zc7OzsjI6Ojo+Prrr9H50f7BD9DTJy8G4zghio6OzrfffsvlclNTU4WJdnZ2
+KSkp/bfMVn/Hx3zENDc383g8KysrKpWqoaEhPG1//3R3d8fFxa1du9ba2lpBQWHkyJEzZsxQUlKC
+n9bX11+6dKn/4gvpi49SR0dn0qRJCgoKampqixcvfvDggZSWcol8xMf1oF4vFqKurm5lZXX79u1N
+mzYR+bYk+qSIPFYILxVRfEhJSYmoXywhISE+Pt7e3j4yMhIA4ODgwGKxcnJyXr9+TdabRsrbRbTd
+n3/+mawXjKy3S2J55OULI9pfsh46ovKfO3eupaUlJCTku+++CwsLq6+vT0xMjIiIsLOzI+sjk+hN
+AwBYWFjAk3Q/Pz9otYuLi5s5c+aA1Ft5eTmbzWYwGMKU3bt3C/9vbW0dHx/v4uJCo9EQe4oAHV8U
+oY9SInDxGHE/Y3FxsWiXa2tr09DQ6PV9fokgjmuJXkWJ9SyD11JensReGezXExA9PT3oFyO6rpTo
+kyLyWMngfQMAPHr06Ny5c1u3bl20aBH0i61fv17U+RwVFQX/I4M3jZS3i2i7MnjByHq7JCIvX5gM
+8UmVf/Xq1V1dXaWlpVZWVrGxsc+fP58+fTpczIesj0yiNw0AcPv2bbhcXWJiYllZWVlZGdEg8R7q
+raGhAQDQwyQoZMOGDS0tLXCCSDbQ8YWI+iglsmPHDnE/IzwHgrx79660tPTs2bMBAQGyFZXouCby
+KkqsZxm8lnLxJEoDHicAAEBNTQ29viMpn5Rs/ruurq5Dhw5ZWFh89dVX6urq165dI7sXRJ4sst4u
+Ish6wWTwdsmA9L4wspHJll9VVZXD4axdu3bq1Kn19fVbtmyZMmVKU1MTINl/ZPOmkaXv9cZmsxUV
+FaHsSBx9fX0PD48ffviBw+HIVkJ0fIioj5Ioj7ifsaKiQvgW+ubNmz/77DN/f/958+Y5OzvLVlQi
+JHoVieqZrNdSXv1cGvC8EwAAtLW1wSVRiZDNJ0XKf2diYgKvnalU6qhRo3o8giUNRJ4sst4uNNJ7
+wWTwdsmlPPLyx5Etf0FBwYgRI8aMGVNaWjp27FhVVVXhZDqp/iObN40sfa83LS2tt2/fcjgcFRWV
+Fy9e+Pr6vnr1KjQ0VLg0i5+fX0ZGRlpaGlEEtNWn1/g9fJSIUD38jLa2tsKpoRMnTvD5/CdPnhw+
+fHjdunVnzpyR441oiV5FdD1L77WUVz+XBjxOAABAfX09nP8loleflHy9Xd3d3VL6xaTxpt2/fx/I
+29slCpEXTF4eN1H6yRcmMb4McYhWjhpwH1l/1Btc8vrp06fTpk3T19dnMpnm5ubwnB2ipaW1fPny
+5ORk4SWmhoYGnECDcDgcxOVCr/Gl8VEmJCSsX7++h58xKChINI+CgoKxsfGuXbsWL158+/ZteTku
+AYFXUV4+O3jEyff4IgLPOwEWi3X79u2FCxci8iB8UmT9a73y6tUroVeORqN1dHTAdPhzL0R6bxpZ
+bxd6u+IQxZejxw30sy9MYnw5lp+Uj0yOfjfQn/VGp9P19fXRep9169YJBALhqwz6+vqPHz+Ggxaf
+z2ez2fDcWeb4vZKVlQX/I/QztrW1CW9mREREwLsg4L8/371a8Egh0asoL5+dfI8vNIN9nHjx4kVg
+YKCpqSl63gPhkyLrXyNC1C+mpaUFvXJGRkaVlZUdHR1FRUU9DhjpvWlkvV3o7YqDiC8vjxvR/hIh
+w3b71UNHykcmR78b0X4RQWp/FRUVt27deuHCheTkZDiTLv4jq6GhsXr1auGfLi4utbW1ubm5AoEg
+IyPD3NwcsXavNPGlR+hnFK3JFy9e/Prrr3w+//Xr19HR0VpaWjK8yYSAyKsoL5+dHI8vNINxvdhD
+hw5dunRJIBAoKysrKytbW1sHBQUNHToUEHvZED4pcY9Veno6We+bv79/aWkpAEBVVVXUL9ba2rp9
++/bHjx9bWVm5urp+9dVXmpqa8KkJ6b1pRkZGZL1dErfLYDBk8IKR8nYh6LsvDH1KLn19EpV/3bp1
+FRUV+/fv53K5R44cOXbsWGVlZXx8/J07d8j6yIi8aY6Ojjwer6WlRVNTc8iQIdOnTxc+jTZQ9VZS
+UpKYmPjnn3/SaDRLS8tNmzalpKT89NNPU6dOPXv2LADg9evXCxYs+M9//gNXp8/JyTl58mR3d7eZ
+mdnu3bt7VZSLx797965EH2V8fHxCQgKPx6NQKPDiAAAwcuRI4dNBwcHB+fn5eXl5whm/o0ePFhQU
+dHZ28vn8Tz/9dOvWrcbGxkQl6e7uJvIPEh3XgNirKF7PP/74owxeS7LtJRuDcZzAYDAYjPQM9nkn
+DAaDwaDB4wQGg8FgUOBxAoPBYDAo8DiBwWAwGBR4nMBgMBgMCjxOYDAYDAYFHicwGAwGgwKPExgM
+BoNBgccJDAaDwaDA4wQGg8FgUOBxAoPBYDAo8DiBwWAwGBR4nMBgMBgMCjxOYDAYDAYFHicwGAwG
+gwKPExgMBoNBgccJDAaDwaDA4wQGg8FgUOBxAoPBYDAo8DiBwWAwGBR4nMBgMBgMCjxOYDAYDAYF
+HicwGAwGgwKPExgMBoNBMRjHiZycHCsrq1mzZjk5OdnY2Hh4eJSWlvbHhi5cuECn01+8eNEfwTEY
+DOb9MBjHCWdnZ09PT2NjYyaTWVhYOGnSpJCQEB6PJ/cNjRgx4tNPPx0yZIjcI2MwGMx7YzCOE6JQ
+qdT58+e3t7c3NDTIPbidnV1KSoqWlpbcI2MwGMx7Y7CPEwAANputoqKir6+fkJBgbm4eGhoK0x0c
+HOCsUUxMDJ1ODw4OLioqWrp0qb29PZPJBAAQpQMAHB0dGQzG3Llz6XT6u3fvYCIif2NjY1BQkIOD
+w4IFC1asWOHo6LhhwwZEmXk83okTJ1xdXRkMxqZNm+rq6tDxIZ6ennQ6/f79+3KtPwwG85EzqMcJ
+gUBQW1ubnJy8YcMGKpW6fv36OXPmCD+NioqC//H19bW0tKypqTl37tyePXssLCyOHDnC5/OJ0gEA
+ubm5eXl5e/bsEd0cIv+OHTu6urqys7OTkpLYbLaHh8fOnTsRJY+Ojs7Ly0tMTGQymRMnTvTx8ens
+7ETEx2AwGJkZvOPE48ePGQyGu7v7lClTvL29ETlVVVVpNNqrV68OHDhgamrq5OTU3t7OYrGI0snG
+aW1tvX//vre3N41G09HRcXNzu3PnjpGREVEcLpebnp6+atUqbW1tKpW6YcOGjo6O7OzsXstz7Nix
+zMzMyZMny1ZjGAxmcDJ4xwljY+OrV68uX778zp073d3dvean0+mampoAAHi/QfgVonTp4ygqKgIA
+4L8AAAqFgo5QX1//9u3bcePGwT+VlZV1dXUfP37ca3lGjRplaGhIo9F63VkMBoMRMnjHCYiXlxeb
+zc7KyhrAMqirq1tbW589e5bL5dbX11+6dMnJyWkAy4PBYDCiDPZxYvTo0QwGIzk5Gc7j02i0jo4O
++NH7vN+7b9++u3fvLl68OCgoaO3atYsWLUJkNjAwUFRUfPr0KfyTw+E0NjYi5qmENDQ01NfXS3Px
+hMFgMEIG+zgBAPD29q6rq8vPzwcAGBkZVVZWdnR0FBUVXbx48b2V4ejRo87Ozunp6YmJiW5ubuip
+J2VlZU9Pz7S0NBaLxefz4+Pj1dTUFixY0OtWtmzZ4urq+tdff8mv4BgM5uOH8uuvvw50Gd43WVlZ
+hw4d6u7udnZ23r9/PwDA39//t99+u337dmtr6/bt2x8/fmxlZeXq6vrVV19pamoyGIyMjAwKhRIa
+Guru7r58+fI///xz5MiR8+bNk5h+/fp1R0dHPp/f1dXV0dGhra1NoVCWLFnCYrGI8kdGRv7444/C
+EhoYGBw/fhxxicDj8f7973/n5eW9fft2woQJoaGhY8eOPXToEFF8+C1PT8+qqqqzZ8+ampr2dyVj
+MJiPhsE4TnxotLe3+/n5BQYGWlpaCgSCZ8+eLV++fPXq1V9++eVAFw2DwWAG5bxTa2vrQBfhb5SV
+lT169Gj48OF8Pr+zs7OmpubNmzeffPLJQJcLg8FgAMDXEx8CnZ2d33zzTVFREZfLVVRUNDQ0XLZs
+maur60CXC4PBYADA4wQGg8Fg0AzGeScMBoPBSA8eJzAYDAaDAo8TGAwGg0GhONAF+IBITU1NTExs
+aWnR0dGhUqkAgLa2th9++OHt27ehoaEtLS1UKhUuncTn8w0MDH744YeVK1ey2exXr151dnbq6uoC
+AP71r3+JLjorSk5OzsGDB7u7u7W1tV+/fq2joxMSEkKUWRouXLiwb9++nJwcfX39/shPChaLVVhY
+WFBQEBYWZmhoKHP+jIyMtLS0169fz5w5c+fOncrKynIvKgaDIQUeJ/7HqlWrpk2b5uPjc+bMGfhL
+ChcGNzU1ZTKZ/v7++vr6e/fuBQC0tbVt374dAJCWlgYAOH369IULF3rIHsRxdnaurq4uLi7+6aef
+3r17t3v37pCQkGvXrikpKclWYLK+vH7y69XX13/99deNjY3GxsYlJSVv376VOT+TyYyKikpOTjY0
+NNy5c+e2bdtOnTrV68KIGAymX8HjBAo9PT2Jq6sqKipOmzatL5GhR4/JZDY0NEhz9i0ROzs7Ozu7
+/ssvJerq6hEREePGjauqqiopKZE5v0AgSExMXLp06YQJEwAAgYGBrq6ulZWV+FUSDGZgweMEio0b
+N0pMV1VVhdcTfUHo0QMACASC7Ozs1NTUlpYWNTW1gIAAOzs7uJiHmppaYGCgu7t7ampqXFycQCAo
+Li4WXRekvLwczpIBAFgs1sGDBysqKgQCgaqqqo2NTVhYGACAKD+Pxzt16tSVK1e6u7snTpwYGho6
+ZsyYmJiYpKQkBweHRYsWxcTEsFiskJAQxBK2GhoaGhoa0u84Uf4XL15UV1cHBgbCPw0NDXV1dQsK
+CvA4gcEMLPg+NiGRkZES0ysqKvLy8voSuYdHDwBw4cKF2NjYqKiovLy8gICA4ODgly9f7tixQ1tb
+29XV1d3dHQCwatWqefPmwVJJ9OUBAGJiYng8XlZWVkFBQWRkpHAqjCj/B+XFg4pybW1tYYqWllZj
+Y2N/bxeDwaDB44QE1q5d6+TkdPny5R7pubm5Tk5OgYGBQimQDIh79AQCQVxcnJeXl4GBAQDAzs5O
+VVX11q1bCgoKLi4uOTk5PB4PAMDlcisqKiwtLRHBm5qaOjs7KRSKgoKCiYmJl5cXIrPMXjw0AoFA
+2rr4e/62tjYAgOiNaxUVFTabTSoaBoORO3ickMCZM2eYTKboiS3E0dGRyWTCmRyZEffosdlsFot1
++vRpp//C5/PhIlRubm5tbW3FxcUAgPz8fFtbW+GUkUR8fHzq6uoYDMbOnTvz8/N9fX0RmWX24vUT
+cHMcDkeYwuFwhg8f3t/bxWAwaPD9CUIyMjIkpjs6OvY9uJeXV3p6elZWloeHBzSeBgQEwPklUYyM
+jD755JPMzEw7O7vMzMygoCB0WAsLi+zs7Nzc3IKCgpCQEENDw9OnT8Mf+veGzNcTo0aNAgA0NzdP
+mjQJprBYLPT1EwaDeQ/g6wkUv//++88//9wfkUU9eurq6gYGBkVFRRJzurm53bhxo6qqqq2tTfgD
+SsShQ4f4fP7ChQujo6MvXrz49OnTW7duEWWW2YtHFik9evr6+pMmTSorK4N/Pnv2rLGx0d7eXu7l
+wWAwpMDjBAo2m/3kyZN+Ci7q0du2bVt+fn5cXNyzZ8/q6+svXLhQUVEBs8HLl9DQUGmMdeXl5Zcv
+X25sbBQIBK9fvwYAwGdMJSKzF48sUnr0KBSKj4/PL7/8Ul1d3dXVdfToUXNz8z4+f4zBYPoOXi/2
+f5w+ffrUqVNv375VUlKC73a9e/du+fLl8+fPDw4OZrPZCgoKGhoavr6+y5Ytg19ZtmwZm83mcDhc
+LhdO7+zfv5/oFWuERw8AUFxcHB8f/+jRI0VFRVNT06CgIOGpfXBwcH5+fl5ennAGSaIvb8OGDWlp
+adnZ2XV1dVQqVUtLy9vbG65PTpRfNi9eD/744w84Icbj8dhs9ogRI+BMmvCpsB4ePXT+8+fPp6am
+dnZ2zp49G7+PjcF8COBxAoPBYDAo8LzT++ND8+hhMBiMNOBx4v0xYsSIgS4CBoPBkAaPExgMBoNB
+gccJDAaDwaDA4wQGg8FgUOBxAoPBYDAo8DjxP3JychwdHel0ur29PYPBmDt37q5du7q6ugAAjo6O
+MIVOp797966PG8rMzHR2dra2tnZycjpy5Ig8yi5nBALBmTNnXFxcGAzGqlWr7t69K/yopaVl165d
+rq6uCxYs2LFjh/B1biLQ+dPS0uh0+v3796UsWHl5OYPBiI2NlWP8EydOzJ49W3wxXSEXLlyg0+kv
+XrzotXh//fWXs7PzN99808fldXk8XlRU1IIFCxwcHFxcXGJiYvoSrZ9ITU21t7en0+mOjo4ODg6O
+jo4XLlx4nwWQvl0+ju0OIHic+B/Ozs5wlY6IiIi8vLyTJ08ymcxffvkFEK/LjaC4uJhOp7969apH
+end39759+5ydnW/cuHHu3LmbN2/KcRfkxYULFy5fvnz69OkrV664urpu3boVjpetra2rVq1SVVVN
+T08/d+5cY2Pjs2fPEHHQ+VksVkpKCnzJThoqKioCAgL2798v9ILIJf7mzZvNzMwQGSR6ACW27+TJ
+k8+fP19ZWXngwAEpd0oiaWlphYWFqamp165dCwsLy83N7Uu0fmLVqlXh4eEAgEuXLl27ds3FxeXA
+gQNNTU2yRSM6XhD0k5+x1/L063Y/TPA4Qci0adMmTpxYWVkp37DNzc08Hs/KyopKpWpoaOTk5Mg3
+vly4ffv2J598oqenR6FQbGxsOBxOc3MzAODHH3+kUqlhYWHKyspqamqzZs0aNmwYIg46/3fffbdu
+3Topta/v3r0LDw9fsWKF6OvucoyPwM7OLiUlRcrlFIcNG3bw4MGMjIyHDx/KvMWKigozMzO4gO7s
+2bNljvM+mTt3Lp/Pr6ure29bJNUuH8F2BxA8TqCgUqkqKiqIDFVVVbt373Z2draxsbG3t4e67Kqq
+KnNz8y1btgAAPv/8c3NzcysrK5jfwsJi0aJFAAA/Pz9zc3Nzc/Py8nIAAI/HO3HihKurK4PB2LRp
+EzzYTp48SafT6XR6REREYWHh4sWL4aW9p6fnvHnzrly5wmAw8vPzk5OTbW1tCwsLhaXy9PSUZjJn
+9+7d5ubmZmZmWVlZAIDCwsI5c+bY2toCACZPnpyXlwcXFLl27ZqhoeHo0aMBAJcvX54/f76Cwv/v
+Nlu2bEGfiSPyl5aW1tXVeXh4oAsp5NatW8+ePVuyZEk/xQcAlJSUrFixwsHBAV5EAoL5RkT7QkaP
+Hm1jYxMXF9cjvpTtAgBQU1O7d+8edG/QaDThfI5AIMjKylqxYgWDwfDw8BBt9MLCQi8vLwcHB1dX
+1507dwIAEhISzM3NQ0NDYQYHBwc4W0LUr9DxewWWVk9PDxD0Z6L0XutTHIntEhMTQ6fTg4ODi4qK
+li5dam9vL/R0STxOieoNUR6J242MjKTT6TY2NrAOU1NTra2t4Vf6Up8fFHicIKS7u7uurg69RGtJ
+ScmQIUNSU1MLCwvhPLJAIICLnh47dgwAkJ+fX1ZWBgUSAIDbt29fvHgRAJCYmFhWVlZWVjZz5kxA
+4JVzc3NLSEiYOnXqgwcPkpOTfX19P/3005qamnFK82QAACAASURBVNWrV3d1dZWWllpZWcXGxj5/
+/nz69OlEiy8hOHDgALTj6erqAgAmTpw4fvx4eH2zZs2aGTNmbNy48eDBg//5z39OnDihoKDw5s2b
+xsZGHR2dgwcPuri4eHp6ZmdnI+Ij8vN4vMjIyK+//lr4E98rDx48GDduHPwZ6o/4jx49Onfu3Nat
+WxctWnTgwIGamhpAMN+IaF8h8AyA7BLrQtavX0+lUj08PJhMJp/PF14kSfQeAgCKioq2bdu2evXq
+q1evHj9+HP4erV+/XvTaKyoqCv6HqF8h4vdKY2NjfHy8u7s7PJ+Q2J+J0qWpzx5IbBeEh1HicUpU
+b4jySNwuwjspc31+aOBxQjJcLvfo0aPq6upubm6IbEuWLNmxY8fw4cOpVOrs2bO7u7u5XK4M25Lo
+ldPX1581a5a6unp7e/vRo0ddXFxcXFzU1dVVVVU5HM7atWunTp1aX1+/ZcuWKVOmiM4LHzt2LDMz
+c/Lkyb1u2t7efsmSJTt37mSxWOHh4eHh4fD6SUFBQUVFxcLC4uLFi6qqqnCKHyrtEhMTLSwsMjIy
+AgICdu/efe/ePaLgiPxnz56dPXs2qbVgnzx5oqOj03/xu7q6Dh06ZGFh8dVXX6mrq1+7dk3674qj
+q6vL4XB6rNQifbuMHTv23LlzdnZ2u3bt8vPzg/JXIu8hACAxMdHKymr+/PkUCmXs2LFwvUUiiPoV
+Ij4aFxeX+fPnv3379quvvgLE/Zkovdf4UoLwMBIdp6TqjQgi76TM9fkBgj1FEti7d6+qqqqpqWlK
+SgqNRkNnTk5OvnnzJpvNlmGEgKC9cgCAzz77DE5V29ra2traFhQUjBgxYsyYMaWlpWPHjlVVVe0x
+BQ+FP1Kyffv2ioqKpUuX+vn5TZkyBSbu37+fw+HExsZWVVVt27Zt7dq1ycnJcAixs7ObN28eAMDG
+xoZOp2dlZRFNPRHlHzVq1IULF86dOyd9IQEALBZr5MiR/RffxMQEBqRSqaNGjeqjlxu2V0tLi2iZ
+SbWLsrJyeHj48uXLQ0JCPD09U1NTlZWVofcwJSUF5hF6D2tqaoQzchQK5dSpU9Jsoke/am1tJYqP
+Jisri8PhREVFrVixIi0tra2tTWJ/7rWfywUiD6PE41S2ehPHzc0tKSmpuLjYzs5O6J2UuT4/QPA4
+IYGIiIi5c+dKmfPBgweRkZHTpk0rKiqCc5qiyDzzgAYuey4vFBUVoVUb/snlcnNycr7//nsFBYUp
+U6YkJyc7OTlduXJl7dq1NBpt7Nixwi/q6Ogg+r26urrE/Ddv3mxoaHBychJuzt/ff86cOdHR0YhC
+6uvrP3/+vP/ii9Ld3a2hoSFNTqL2bWlpAQDASRgZ+P333z/99FMAwKRJk06dOuXo6Hjz5k0XFxdA
+4D1UUlJ6+/atbNsSgvAq9sqIESP27t1rbW19+fJlKY8difTT8UJ0nPZab1KWR6J3si/1+aGB5536
+RElJiaurq4mJiYKCQo9H5uHPbnt7e69B5O6Vk9IfB/nuu++++OKL4ODg77//HqqEOBwOj8cbOnQo
+zKCrq6ulpcXhcCgUymeffSaqG2pqahL9me4BUX5XV9fMzMyf/guNRjt48ODu3bvR5RwzZkyPJ9bl
+G1/Iq1evXr58OXHiRHQ2dPu+fPlSR0enx0MQ0rdLQECA8P/a2trKysojRoxAeA8nTZp0584d8R81
+Go3W0dEB/9/r/XO0V7FXhg4dqqam1tHRQdSf0f1c+uNFBoiOU6J6k6E84t7JPtbnBwUeJ/qEjo7O
+/fv34R3vHi9DwcvekpKSly9f/vzzz4hZKbl75aT0xwEACgoKamtr165du2TJEhsbm9DQUChcmjFj
+xsmTJ9va2gQCAZPJZLPZDAYDAODt7X3lypXCwkKBQFBaWlpZWdnjAaQeSMyvoqKiL4KCgoKWllav
+Txna29s3NTX98ccf/RS/vb39xYsX9fX1hw8f1tLS+uKLL9D50e179epVc3PzHl+Rvl06OzszMjK6
+u7v5fH5SUtLQoUOhJ5zIe+jv7//w4cPDhw/X1tY+f/78/PnzcDQyMjKqrKzs6OgoKiqCD1CgQXgV
+0Qj7yfTp04n6M7qfS3+8yADRcUpUbzKUR6J3Uub6/NDAnqL/kZWVFR0dzWKxNDQ0aDTa999/b2Ji
+AgDo7u5euHChRB9cRUXFvn372Gy2sbGxlZXV8ePH9fX14SNDAoEgPDw8Ly9PVVXVxsZm165dQ4YM
+cXR05PF4LS0tmpqaQ4YMmT59OnwKRaJXLiUlJSUlRejRAwAkJSWNHj163bp1FRUV+/fv53K5R44c
+OXbsWGVlZXx8/J07d+CO9PDHERETE5Oamjp06FD4rp+bm1tdXZ2GhsaNGzdaWlpiYmLgc7F6enob
+N24UPjlz69atuLi4pqYmfX397du3T58+HV2riPwbNmx48uRJU1OTpqbmkiVLNm/ejA4VFhYGAOjx
+Brtc4vv7+5eWlgIAVFVVzczMdu3aBe8lEHkAAUH7wmi//vrr+vXr09PTx48fL7oV2C4///wz+mLl
+4cOH9+7du3LlSl1dHY1GGz9+fFBQkNBfS+Q9vHPnzokTJ6qrq5WUlOh0elRU1JAhQ1pbW7dv3/74
+8WMrKytXV9evvvpKU1PT19dXYr9Cxxfn22+/zczMbG9v19bW7u7uVlZW9vDwWL9+PYVCkdifAUE/
+h9EQ9SmOxHZhsVhEHkbEcSqx3ojKg+gPQJJ3klR9fsjgcQLTV6ytrSWmy/2Ku6GhYd26de7u7j4+
+PlQqVb7B5cXDhw+3bNni5+fn6enZ46NXr17Z2treunUL/VIOBvOhgccJTF8hWuhGX19f7ttqamqK
+iopSUlI6dOiQ3IP3ndLS0sjIyK+++kritFVUVBSPx9u1a9f7LxgG0xfwOIH55/HmzZsPc3WdN2/e
+KCkpET2N9ujRI2NjY+lf/cNgPhDwOIHBYDAYFPjUBoPBYDAo8DiBwWAwGBR4nMBgMBgMCjxO/I1/
+hEcMALBy5UonJydra2szMzMnJycnJyf4+P/A0k+eL4Rn8MOkv31ncoy/cuVKOzs7Op1eX18vr/gI
+P6DMXkiJ5UQg7j3MyMjw9PR0dnbes2cPXLwWAV0M+H4cUbq8PIYfLHic+Bty9IjJ4OeSnrS0NCaT
+6e3traury2QymUym6ArS7788EOm9b6RAeAZlQF71MIC+MznGT0tLgwtoyzE+wg8ogxcSIrGcRIh7
+D5lMZlRU1KFDhy5evMjhcLZt24ZeuOmoCAcPHlRVVYUL2hOly8tj+MGC1wH8G/9Ej9iHg52dnZ2d
+XX9vpZ88g3Kkv+vhnx6/XxH3HgoEgsTExKVLl8J32gMDA11dXSsrKz/55BOiIPb29sL/R0dHe3t7
+w/fzidLBfz2Grq6uS5cunTp1an/s2gCCx4m/IfSIDR8+XOgR27NnT2ZmppqaWmBgoLu7e2pqalxc
+nEAgKC4uZrFYBw8erKioEAgE8P3+sLCwqqoqLy8veFn9+eefUygUJSUlqDoRCATZ2dmpqaktLS1q
+amoBAQF2dnaenp4tLS0hISHfffddWFhYfX19YmJiREQE2WM1JiYmKSnJwcFh0aJFMTExLBYrJCTE
+ycmJbHkAAI2NjZGRkffv36fRaOrq6mw2e8yYMWZmZidPngQALF682NbWNiYmhsvlbtiwwd3dXXQ9
+g/LycviyNNF2EfUp5Z5Cz+DJkyeJysPj8U6dOnXlypXu7u6JEyeGhoaOGTNGhnoAABQWFiYkJDQ0
+NAwbNszExOTw4cOIOBLrAQAgsTxE7YXYcaL4EvshIg6fz09MTMzMzGxoaFBTU5M5Plwe5t69e69e
+vVJUVPTz81u5cqUwWklJybFjx5qbm7/88kv0OmBE9U9UTgTi3sMXL15UV1cHBgbCPw0NDXV1dQsK
+Cn788Ue4gsi+fftcXFwKCwtDQ0OHDh1648YN4Xerq6uhx77HViSmCz2G0l/6/FPA805/Q6JHLCIi
+QtxXBVcZiomJ4fF4WVlZBQUFkZGR0LOI8GFJ9FvJy09H5PMiWx4AwI4dO7q6urKzs5OSkthstoeH
+x86dOxEeNFLeN0R9SoPQM4goD1lvGilPHFnfGVF5EP41IojiS+yHCE6fPp2WlhYWFpaVlbV161aZ
+4xN54gCBH5AIovonKicCce9hQ0MDAEBbW1uYoqWl1djYiPA5iu74pk2bxCU0ROl99Bh+sOBx4m9I
+9IiJ+6ru3bsH1+9samqC5gYFBQUTExMvLy9EcCK/Va9+OilB+LxIlae1tfX+/fve3t40Gk1HR8fN
+ze3OnTtGRkZEHjSy5UTUZ6+IegaJykPWmyYvTxyizBLLQ7a9EJDqhzwe7+zZs97e3paWltra2oiV
+4XuNj/A5Su8HJKp/GcoJJHkP29raAADKysrCFBUVFWjzJvI5Qn7//fenT59+/vnnPTZBlA4IPIYf
+AXjeqSfiHjEDA4Mevqq5c+dCCYmPj8/u3bvhIxxffPGFr68vIjKbzZbot9LW1kb76UhB5POSvjxw
+1+C/QJITqYcHTYZCEtUnGiLPYI/yVFVVkfKmEdUDkJPvDO1xk769EJDqhy9fvuRwOKTm0BHxiXyO
+0vsBiepfhnICSd5DWL0cDkeYwuFw4DUEIPA5QuLi4pYvXy6+zgpROiDwGH4E4HHib0j0iK1cubKH
+r0p4CWxhYZGdnZ2bm1tQUBASEmJoaHj69GnRVYVFr0CJ/FYFBQXy9dMhkKY8AABra+uzZ89OmzaN
+xWJdunTJ399fjtsFYv4vKacUpPcMkioPoh7k5Tvrb3rth6LA82tSjzMRxe/V5whB+wGJ6h+Klcg+
+diXuPYS3mpubm6E+CADAYrFEr197+BwhDx48+L//+7/w8PAe8YnSIX30GH6w4HmnvyHRIwb/FPqq
+WlpahOcdhw4d4vP5CxcujI6Ovnjx4tOnT4WedHEf1sD6rUiVZ9++fXfv3l28eHFQUNDatWsXLVok
+x+1CJNanXCDrTZPBEycxjmzlkQuIfigOPJWura2Ffz569Ejm+Aifo5Be/YBE9S9DOYEk76G+vj68
+pQT/fPbsWWNjo/DJJXGfI6SgoMDIyEhcaU6UDpHoMfwIwOPE3yDyiAERX5Wzs7Pw1KO8vPzy5cuN
+jY0CgeD169cAAKFPRqIPawD9VqTKc/ToUWdn5/T09MTERDc3t75c7hB5wSTWp1yQwZtG1hOH2C+y
+5ZELiH4ojq6urqmp6a1bt/h8/t27d6Xx3BHFR/gcSfkBJda/DOUEkryHFArFx8fnl19+qa6u7urq
+Onr0qLm5+bRp0wCBzxF+q6SkROLpC1E6RKLH8CMArxf7P4g8Ys+fP4cXksHBwdevX8/NzRVObqal
+pWVnZ9fV1VGpVC0tLW9vb1dXV/gRkZ9L3G+1f/9+tJ9OnGXLlrHZbA6HAzWlAID9+/dfv36dyOdF
+qjxGRkaRkZE//vijcHMGBgbHjx8vKioi8qCR8r41NzcT1adEiDyDRL4/IJM3jZQnjigOUT1ILM+h
+Q4cQ7SURoviIfiiR+vp6ePPWxsbG0dHR19dXW1v76tWrZOMTeeIk+gERXkii+icqJ2LXAIH38Pz5
+86mpqZ2dnbNnz965c6eysjLC59jR0WFra+vl5bV9+3bRIETpECKP4UcAHidI8ODBg2PHjsl2M/Mf
+RHt7u5+fX2BgoKWlpUAgePbs2fLly1evXv3ll1/Kd0ODpD4x75kB8R4iPIYfAXjeiQQ5OTno07SP
+g7KyskePHg0fPpzP53d2dtbU1Lx58wbx8qrMDJL6xLxnRo0adebMmb/++kuGBUJko7S09Ouvv4ZP
+SL6fLb5n8PWEVDQ0NKxZs4bNZqupqSUnJxsaGg50ifqRzs7Ob775pqioiMvlKioqGhoaLlu2TL4/
+6IOqPjEDxXvzHqI9hh8BeJzAYDAYDAo874TBYDAYFHicwGAwGAwKPE5gMBgMBgUeJ/7H/fv3nZyc
+zM3NLS0toSRu/vz5okvZ9LenbKCA67XJtrIQRGZPmTgsFuuXX37ZtGmTlOYyovyk/GUYDAYBHif+
+h6mpKZPJnDFjhqOjI5TEpaeni2bob0/ZgCAQCEpKSrq6uvryZrjMnjJR6uvr16xZs2rVquvXrxcX
+F6MXVkLnJ+svw2AwCPA6gCgUFRXh+/2Qf7Tniwi4DvO7d++KioosLCwGsCTq6uoRERHjxo2rqqoq
+KSmROb8M/jIMBoMAX0+gUFVVhS/oS5xXOXnyJHSpR0REFBYWLl682NHR8cKFC56envPmzbty5QqD
+wcjPz09OTra1tS0sLFy2bNmcOXPKy8uF8aOjo2fOnAkAqKqq2r17t7Ozs42Njb29fVpaGiI+AEAg
+EGRlZa1YsYLBYHh4eEB/jhBPT086nQ6X2+yV4uJiS0tLCwsLoWzn8OHDdDp9z549JSUlK1ascHBw
+gDJqonQE6HL2QENDw8jISPqH0InyQ3+ZcJkdob9MyrAYDKYHeJwgpKKiIi8vD/5f4rwKkU+NyE/n
+4eExYcKEmTNnlpWVLV68mMvl+vn5wbWOJXrBEL42Iv+XDBQVFX322WeWlpa1tbXw1svWrVvNzMwe
+PXp06dKl8PDwNWvWQB8ZUToiuBzLKT1E/rL+3i4G87GCxwkJ5ObmOjk5BQYGIuQ2AAAinxqRn87Y
+2Pjx48d8Pr+0tPTp06e///57bW0tXGxOoheMKD7CvwY5duxYZmbm5MmTe91TLpf7+PHjKVOmmJub
+UygUeEmhrKyspKTU1dW1d+/eqVOnenl5aWpqXrt2jSidKHiv5URD9o6CMD/CX4bBYGQA35+QgKOj
+4969e3Nzc588eSJN/h4+tYKCAol+OmNjYy6X29jYeP/+/Xnz5t27d09fX9/Y2BgGIfKCicdvbW0l
+8q9BiBbHF6esrMzMzAyutzp16tTi4uKlS5fCj0xMTKAeXEFBQVdXV3g+TpQuDsIT16+g/WUYDIYs
+eJwgBAoSZEPiJPvw4cM1NDT+/PPPd+/eWVlZ5eTkcLnc6dOnAwCk9IJBEP41shQXF5eUlDg5OQEA
+Ojo6amtrJS6Jw+VyJfrIiNLlUk6Zryd69ZdhMBhS4Hmn9weFQhk/fvzly5c/+eSTGTNm3L9//6+/
+/oLzTtJ4wYT06sVraGior6/v9X2IxsbG27dvZ2ZmwoeAT58+zeVyxZ+O7ejokOgjI0qXvpxkkXK/
+0P4yDAZDFjxOvFeMjY1v3LhhZmY2ZsyYYcOGVVRUwKVSEV4wiaC9eFu2bHF1dRWVOEqks7NTT09P
+XV0d/jl16lQdHR3hU0+iPjJtbW2hj4woXYZykkXK/UL4yzAYjAzgeaf/cf/+/eDgYDab/euvvxYX
+F/v6+i5btgx+JPR8wf9DD9ewYcOgTw3mB//1qaWkpLS2tmZlZQEAampq4Ef37t0DABgbG/P5/Bkz
+ZlAolBkzZjx58gROzuzevXvfvn3z5883NjZ2cXE5fvz4kiVLVqxYITE+AMDBweHf//53fHz8f/7z
+H+j/mjFjBtn93bt3b3V1dUJCwvr16wEAQUFBbDb73LlzQUFBAIDy8vIVK1a8e/fOzMwsMTER3mKR
+mC7qKROtnw0bNpAq5x9//AE3zePxAAB+fn6wcoRPnUmf38nJqbOzMzQ0FPrL9u/f/xGv+YzB9Dd4
+XXGMBPz9/XV0dPbv3y9lOgaD+YjB804YDAaDQYHHCUxPYmNjKyoqrl275uTkJLoeBlE6BoP5uMHz
+ThgMBoNBga8nMBgMBoMCjxMYDAaDQYHHCQwGg8GgwOPE3+DxeFFRUQsWLHBwcIDrtg50iQj56aef
+oK/t66+/7ujoGOjikCYvL8/Hx4fBYLi5uW3fvl2OlsCEhARzc/Pg4GCiDP3qJfxntUt5eTmDwYiN
+jQUAxMbGQpljQkICACAqKmrOnDmOjo6pqanz5s2j0+kMBgN6Hi0tLSsrKxH+x5UrVzo5OVlbW5uZ
+mcGPSktLAQB//fWXs7PzN9980+uiA72C9h6mpaVJXFpfPJ2U9/DVq1f79u1zdXVdsGDBt99+K6rG
+IorzcXgV8TjxN9LS0goLC1NTU69duxYWFpabmzvQJZJMampqYmLi0aNHMzIyVFRU1q9fD981Q1Bc
+XEyn01+9etXHTcslzk8//RQeHu7r65ubm5uUlPTkyRMWi9XHgglZv379Z599hsjQf17Cf1a7VFRU
+BAQE7N+/f+PGjQCAjRs3zpgxw8HBAb53uWPHjpkzZyYmJq5aterbb78FAJw5cwYu8eLg4ACQ/se0
+tDQmk+nt7a2rqws/mjNnDgBg8uTJ58+fr6ysPHDggMx72qv3kMVipaSkwJcu0emkvIcCgSA0NPTN
+mzcZGRlnz569d++e8EUiojgfjVcRjxN/o6KiwszMDC44Onv27IEujmS4XO6pU6c2b948evToIUOG
+7Nix48WLF1euXBnocklLd3d3XFzc2rVrra2tFRQURo4cOWPGDOH73u8BOzu7lJQULS0t+Yb9Z7XL
+u3fvwsPDV6xYAX/BSaGnp0ej0cTTe/gfJTJs2LCDBw9mZGQ8fPiQ7HYh0GOYm5u7bds2iRm+++67
+devWifeoHumi3kMajRYYGFhWVlZZWUm03SdPnvzf//2fr68vlUodOXJkSEhIZmZmU1MTURyy8T9k
+8DjxN9TU1O7duwddBTQaDcrjIIWFhV5eXg4ODq6urjt37gQy+eYkpsfExNDp9ODg4KKioqVLl9rb
+2zOZTEQhi4qKOjo65s6dC/9UUlKytLTMysqC8y2hoaEw3cHBAc6uVFVVmZubwzVoP//8c3Nzcysr
+K0DspyMbR4iUHr3y8nI2m81gMIQpu3fvnjp1KqI+Jfr+evXridenRC8hUfsCAFgsVmBgoJ2dna2t
+7YIFC44cOfJPbBeJ3Lp169mzZ0uWLOk1pzgbN24cP368eLrQ/4hm9OjRNjY2cXFxMmwa9OY9LC0t
+raur8/Dw6DWdyHu4e/duc3NzMzMzuPROYWHhnDlzbG1tnz59CkT8V5MnT4YuGaI4H5NXEY8Tf2P9
++vVUKtXDw4PJZPL5fChaAAAUFRVt27Zt9erVV69ePX78OPx9l8E3JzHd19fX0tKypqbm3Llze/bs
+sbCwOHLkCGIC9/nz58rKysL1+wAAurq6z58/X79+vei5YVRUFPwPXDz12LFjAID8/PyysjK4WhSR
+n45sHLJA35yenl6PdER9SvT9of16EutTopcQELQvACAmJobH42VlZRUUFERGRqLH739Wuzx48GDc
+uHHirdArkZGREtNF/Y+9Ym5uXl5eLvdJGB6PFxkZ+fXXXysoKPSaTuQ9PHDgANxH6CyZOHHi+PHj
+c3Jy4AVoc3MzzFxbWwsAaGxsJIrzMXkV8TjxN8aOHXvu3Dk7O7tdu3b5+fkJGzUxMdHKymr+/PkU
+CmXs2LGmpqaA2GdH5HEjSldVVaXRaK9evTpw4ICpqamTk1N7eztivr6lpUVFRUU0RU1NTYb5fbJ+
+ul6R0qPHZrMVFRWFY7AQovoEBL4/dPmlr09A0L4AgKamps7OTgqFoqCgYGJi4uXlhQjywbaLRJ48
+eaKjo0PqK2vXrnVycrp8+XKPdCn9j6Lo6upyOBy5SKtEB5uzZ8/Onj1bfO5LYjrCe2hvb79kyZKd
+O3eyWKzw8PDw8HAVFZWpU6caGxufPn26q6vr+fPn0dHRSkpKnZ2dRHE+Jq8iHid6oqysHB4enp6e
+3tLS4unp+ezZMwBATU3NlClTYAYKhXLq1CnRr4j65vz9/YUeN6f/Aj1uROkwCJ1Oh0HgaQvCsjBy
+5MjXr1+LpnA4HJln26X30/XKqFGjDA0NJc5ci6KlpfX27Vvom3vx4gV8MCYzM1OYoUd9wsTk5GT4
+FE14eLg05Ze+PgFx+/r4+NTV1TEYjJ07d+bn58OHeYj4YNtFIiwWS01NDZ2nx/k+vI8teoIMgfex
+w8LCpN/6/2vv3gOhzPfHgX+GYST33FMuyVkdaWhDK0ubREtXS0VXyqmNNtmUE226b3YXSW5HYTmV
+s4hcYruhVTZptV3WJbdaZJiwDDEzvz+e35mvwzwfMyLk/fpLH898rk/znufzPOZNLE1LS4vgLxnS
+n3/+mZKSsnv3bgHL+eY9lJeXJ37et2+fvLz8F198sWTJEuLcEBUVPXv2bHt7+4oVK7755pvdu3ez
+2WwVFRWyevD1TyzwveL/4/Hjx3PnzkUI6enpRUZG2tra5ufnb9iwQUxMbPBjFWTI8rgRT0m+ex46
+DQ0NFovV1tbGyyX3+vVr4hplSPgrfXx+OsHrwSO+Gr22tnbOnDnq6urZ2dkmJib454IEzPcneP8H
+IFtfMzOzzMzMnJycW7du7d+/f8aMGdHR0WRv/RNrXdTV1V+9ejWgUFZWtv+zm52dnYMv+9LS0vhW
+KFT+RyJCEGfCO+INOT8/v7GxkUjOiBBisVgeHh6mpqZmZmZ8y7/++muEzXtIpVKJq0leyfTp08PC
+woifX758yeFwNDQ0yPInfkh5FeF64n94enryflZSUpKUlFRQUEAI6enp/frrrwL+JyTL4zZS+d0W
+LVokKytbUFBA/JPNZhcVFdnb2yOEaDQa75n9AfeTidO9ra2NrNr++emGV4+A+ebodLq6unpqair+
+sP4Eyfc3ZH49DLL1PXHiBIfDWblyZXBwcGpqam1tLW/aBxu368LXzJkzB/8Fibq6+osXL4h54HA4
+TCaT+FA8wOPHj5OTkwVsiK+GhgZlZeUB23QCnj9kHBwcMjIyrvwXjUY7fvz4oUOHyMrxeQ+/++67
+pUuX+vj4fP/997zUWB4eHrzTLzs7W0VFxdTUlKyeDymvIsSJ/9HV1ZWWltbT08PhcC5cuCAhIUHE
+fw8Pj2fPnp08ebK6uvrVq1c//fQT/mwmy+M2IvndJCQkduzYcfbs2fr6+rdv3wYHB6uqqhKPD2lr
+az99+rS9vb2wsHDAGzHxKbioqKihoSE5R/hxQAAAIABJREFUOZnFYhHlfPPTDaMeJHC+OSqVumfP
+npSUlLi4OOLOwZB/dYXJ9ydUfj0yZOtbUlKSnp7e1NTE5XKJPSVdXV2ySsbtuvC1ePHi169f//77
+7/0L7e3tq6urc3JyuFxuWlqaiYkJ38eKmExmTU0Nvn68vLw83oNAPAKeP2SmTp2q3o+IiIiioqKi
+oiJZOSbv4a1bt6qrq7ds2eLo6GhhYeHr60vMZ11dXVlZGYfDyc/Pj42N3b17N5VKJavnQ8qrCN8X
++3+ePXv28OHD69ev19XV0Wi0WbNmeXt7894Xfv3117CwsIqKCjExMTqdfubMmcuXLxP55kRERIht
+AV6+OYTQ3bt3o6KiKisriTxu3t7eRCrsweX//ve/09LSKBSKr6/vmjVr1q1b9/z582nTpt24cQPT
+28uXL1+5cqWrq8vY2PjAgQPEXnNra+u+fftevHhhbm7u4OCwc+dOOTk54ukdLpcbEBCQm5srJSVl
+YWHh5+cnLi7u4eHx+++/U6lUIj+dn58fcbEsbD1El5ycnMrLy+Pj43n3gTGKiopiY2OfP39Oo9EW
+Llz45Zdf5uXlkc1naWlpYGAgk8nU0dExNzc/e/asurp6VlYW3/7HxMRERUXxnU9eXsL29nYlJSVe
+3j2+6ysuLp6UlJSZmVlXVycqKqqoqLh582YHBwf8uMbhupAh7igMeNg3KysrIiKip6fH2Nj40KFD
+U6dOjY6OjoyM7OvrExMTI8IGm81et27dsmXLiPyPxHr1z//o7OzMZDI7OztZLBYRwI4ePcp7WOvR
+o0fu7u6XL18e8HAtcf4kJyfjLwr75zFkMpkKCgoD8h7u2LGjpqbm9evXcnJyjo6OvDsTfMt/+umn
+xMREIu/hwYMHJSUlQ0JCEhMTJSQk8vPzEUIrVqyoq6uTlZW9c+dOWFhYQUFBS0uLpqbmxo0brays
+eL0aXA++fGKBODGpTfT8dBO9/2Tez7gaGxu3bdu2Zs2arVu3ioqKjmpbPM+ePfPy8tq+fbuTk9OA
+X3V0dFhaWhYUFAzYjwJjDvadAJikVFVVL168+Mcffwz+g5JRcv/+/X/+85/79+8fHCQQQhEREY6O
+jhAkxiG4npi8wsPDL168KCoqKicnFxAQMOGexJjo/Sfz/sf19u3b0fi2K74N8TavBqusrNTR0Rnw
+J3JgPIA4AQAAAAdCNwAAAByIEwAAAHAgTgAAAMCBOAEAAAAH4gQAAAAciBMAAABwIE4AAADAgTgB
+AAAAB+IEAAAAHIgTAAAAcCBOAAAAwIE4AQAAAAfiBAAAAByIEwAAAHAgTgAAAMCBOAEAAAAH4gQA
+AAAciBMAAABwIE4AAADAgTgBAAAAB+IEAAAAHOpYd2AMJCYmxsTEMJlMVVXVvr4+KpW6Y8eONWvW
+DPnClJSUwMDArKwsdXV1osTW1pbD4XR3d7e3t5eUlIiKio5Ghwe3y1dMTExUVNSnn34aFBQkSLUn
+T57My8uj0Wh//fVXZ2eniooKQqilpaW4uFiodoenrq7u+++/f/78uYiIyIwZM9auXWtjYzPirfSX
+mJgYGxvb0tKirKxMrNSbN2/+9a9/paenp6WlcblcKSkpMTExQ0PDffv2qaioJCYmhoWFsdlsPz+/
+ZcuW2dnZdXV1BQYG2trapqSkZGZmNjQ0sFgsXV1dHx+fv/3tb6PaeQDG0GS8nnBxcQkICEAIXb16
+9eeff7a3tz927Njr16+HfKGCgsLcuXPFxcV5JTk5Obm5uf7+/oMPvnv3Lp1O7+joePcOD26Xb/3u
+7u6ffPKJUDWfPHkyOzt769atioqK2dnZ2dnZRLTAtDsi6uvrXVxclJWVU1JSUlNT9fX1f/vttxFv
+ZQAXFxcigl68eJEYrLW1NULowIEDlpaWJiYmN27ciI+Pf/PmjbOz85s3b1xcXGxtbY2MjFatWiUh
+IUGn07/55htbW1uEUHx8/PLly69du5aTkyMtLe3l5dXT0zPa/QdgrEzGODHAp59+yuFw6urqhjzS
+ysoqISFBUVHxPfTqPbQ7depUKnXgBaWcnNxot4sQunDhgqys7IEDByQlJWk02vz582VkZEa8lSGp
+qanRaLT+JcrKykFBQSwWKzExsX/5zz//zGaz7ezseCVLliwRERGh0WibN29uamqqqKh4T50G4L2b
+jPtOAzCZTISQmpoasW+zePHi06dPI4Ssra0ZDAax6yLU/lJ5ebmrqyubzUYIffbZZxQKRUxM7O7d
+u2THOzs719TUhIeHz58/nygJDg5OSEgoKSnh2+6Q9RcWFoaEhDAYjP379/d/axvAy8trcGFCQgIi
+308rLy+Pj49/+PBhR0cHlUrdvn37hg0bQkJCLly4YG1tvWrVqgHt9vb2RkZGXr9+vaenZ/bs2b6+
+vjNnzkQI5eXlffHFFyIi//9jioWFhYWFBdnxERERERERCKHVq1dbWlqGhISwWCxiq5DL5WZmZiYm
+Jra0tEhLS3t6elpZWWGWZoBdu3YNLpSRkTE3N793796XX35JlLS1tYWFhUVFRVEoFKIkKCiIF9ia
+m5sRQrKysoK3C8DEMtmvJ5qamqKiotasWTN9+nR3d3dTU1Per86cOcP7GbO/NJienl5xcXFoaChC
+6ObNm8XFxZgggRBau3atrq7u/Pnzi4uLV69ezWKxtm/frqenR9Yuvv6qqqpLly75+/ubmZmdOnWK
+w+EINBH/i2y8RUVF4uLiiYmJt2/ftre3DwkJ4XK5bm5uCxcu5NtucHBwbm5ubGxsdnb27Nmzt27d
+2tXV1dnZ2dHRoaGhMbhdvsevWLEiJiZGX1//yZMncXFxbm5uc+fOraqqQgilpKSEh4efOXMmNzfX
+09PTx8enoaFBwDESnwb4UlNT619PUFDQ5s2b++/I6erqEkGOy+Veu3ZNU1OT73AA+DBM6jhhb2+/
+bNmyvr6+nTt3jmE3dHR0Xrx4weFw7t+/X1tb+/jx4+rqam1t7eHV1tHRcezYMUNDQzs7u7a2NgaD
+MYJddXR0/Prrr+Xl5UVFRRcsWNDT08NisaSkpGg02uB2WSzW5cuXXVxclJSUREVFd+zY0d7enpmZ
++ebNG8TvAzjZ8erq6h9//LGMjExbW9sPP/xgb29vb28vIyPD5XLPnz/v6upKvEdbWVlJSUkVFBQM
+OYotW7bY2dmlp6eTHSAtLc1isYifm5qaMjIyeJc+AyQlJT148CA4OJh3qQHAh2dS7ztdu3ats7Pz
+zJkz69evT0pKUlZWHpNu6OjosFispqamsrKyJUuWPHz4UF1dXUdHZ3i10el04h4DcV9hxO+vxsXF
+5efnM5lM3jspWbtv3rzp6+vT0tIiDpCUlFRRUXnx4sWKFSsQQm1tbQNqrq+v53s874BPPvmEaMLS
+0tLS0rK1tZXBYERHRxN7ZQghDofT2to65BAuXryorq6+atUqsgPevHnDu3pQUVExNzc/ffq0sbEx
+sWnGc/Xq1ZiYmPDw8GEHdQAmhEkdJxBCCgoKhw8fXrRoUXp6uru7+4jXz+VyhzxGXl5eVlb2+fPn
+bDbb3Nw8KyuLxWLNmzdvpOofQUeOHHny5Mnp06fnzJlTWFjI9w7HkGg02rRp06qrq9+xM8RNeE9P
+T0GeaR4sLS2N7Ff19fX9Q4KXl1dxcfHBgwfj4uJ4d/4zMzODg4MjIyOJHUIAPmCTet+JICEhIS0t
+3d7ejhCi0WjEDwihsrKyd6mW2IgY/KmZ75GzZs1KT0//+9//bmRkVFZW9scffwz5EVXw+kdQUVGR
+g4ODgYGBiIjIkHc+NDQ0qFRqbW0t8c/Ozs6mpiZiXPb29pmZmQOudTDH8yUjI6OhoVFYWDjs4Tx+
+/Dg5OXlAIYPBuHfv3sqVK3klNBrt1KlTFRUV58+fJ0oqKipOnDgREREBQQJMBpM9TnC53OzsbCaT
+SXx+19bWfvr0aXt7e2FhYWpq6rvUTGy/FBUVNTQ0JCcnD9ilGUBHR+fOnTvEzsaUKVNKS0tnzJgx
+gvWPFGVl5bKysp6enrq6upCQEPzBkpKSTk5OSUlJDAaDw+FERUVJS0t//vnnCKGNGzeKiop6e3vX
+1dX19PTcv38/PDwcczyZr7766ubNm+fPn3/58mV9fX1KSkppaangw2EymTU1Nf1L/vzzz7179xoa
+GlpaWvYvnzVrlre3d2xsbElJSU9Pj4+Pz9y5c7u6ukr/q76+XvB2AZhYKI8ePRrrPrxvQUFBGRkZ
+bW1tSkpKPT09kpKSa9eudXd3p1Aora2t+/bte/Hihbm5uYODw86dO+Xk5G7fvt3/OVElJSUKheLo
+6Lh58+aVK1cOLt+xYwdCiMvlBgQE5ObmSklJWVhY+Pn5Yf5gLSkp6dtvv719+7acnJy3t3dNTU1K
+Sgr63+dTh6w/Pj6eeHbT19d3zZo169ate/78+bRp027cuEHWbllZmY+PT2dnJ4vFUlRUtLKy8vPz
+w7RbWloaGBjIZDJ1dHTMzc3Pnj2rrq6+aNGitLQ0vu329vaeO3cuNze3r69PV1fX19dXU1OTaLq5
+uTkoKOjRo0ddXV0GBgbbtm1bsGAB3+MTEhISEhKYTKaIiAhx9/vChQvTp08n6rl7925UVFRlZSWV
+SjU0NPT29ia7BImOjo6MjOzr6xMTEyOuxths9rp163p7e69evcrlciUlJSUlJRctWuTt7S0hIZGQ
+kBAWFsbhcLZt27Zz5879+/fn5ubSaLTw8HA3N7cBlTs7Ox88eFDQUxCACWUyxgkAAACCm+z7TgAA
+APAgTgAAAMCBOAEAAAAH4gQAAAAciBMAAABwIE4AAADAgTgBAAAAB+IEAAAAHIgTAAAAcCBOAAAA
+wIE4AQAAAAfiBAAAAByIEwAAAHAgTgAAAMCBOAEAAAAH4gQAAAAciBMAAABwIE4AAADAgTgBAAAA
+B+IEAAAAHIgTAAAAcCBOAAAAwIE4AQAAAAfiBAAAAJzJGCfKysrs7OxMTEwWLlxoZ2dnZ2e3bNky
+Nze3se7XiElJSaHT6X/++aeAx2dkZCxfvnzRokV2dnanTp0a1b4JQtj+T1AxMTEmJiY+Pj6jVH9i
+YuKSJUvodLqNjQ1xni9cuPDp06eY83/Dhg12dnaLFi0yNjYmfnX//n1B2tqwYYOVlRWdTq+vryc7
+ZtWqVQsXLiwtLeWVBAcHz58/n+z4sLCwBQsW+Pv7CzNonElyXo2GyRgnDA0Ns7OzjYyMbG1ts7Oz
+s7OzL1++PNadGkkKCgpz584VFxcX5OCenp7AwMDly5ffuXPn0qVL+fn5o909wt27d+l0ekdHx+Bf
+CdX/iWLweN3d3T/55JPRa9HFxSUoKAghdPHiReI8t7a2RtjzPykpKTs7e/PmzSoqKsSvTE1NBWkr
+KSkpNDQUf8zatWsXLVpkZGTU0tKSm5uLEPryyy+1tLTIjt+9e7exsbFgYxUI3/MKcx4CHupYd2Bc
+oFKpc+bMGetejBgrKysrKysBD25ubu7t7TU3NxcVFZWVlc3KyhrNrglEqP4DwampqdFotMHl7+f8
+V1VVzcvLQwjdu3fP39/fysqqublZRUVltNvlgfNq2CBOIISQlJTUvn37EEK9vb2RkZHXr1/v6emZ
+PXu2r6/vzJkzIyIiIiIiEEKrV6+2tLQMCQlhsVg7duxYs2YN39qcnJxaWlr279//3XffHThwoL6+
+PjY29siRI1ZWVsLWz+VyMzMzExMTW1papKWlPT098Se6ra0th8Pp7u5ub28vKSkRFRVFCIWEhFy4
+cMHa2nrVqlUhISEMBmP//v12dnYIITMzs76+PoTQ9u3bRUREEELnz5+fP3++UP28dOkS2XjLy8vj
+4+MfPnzY0dFBpVK3b9++YcOG8vJyV1dXNpuNEPrss88oFIqYmNjdu3fJ+k+2LphxCYvBYBw/fry0
+tJTL5UpJSVlYWBw4cAAhRDb/Qq0LZryEwsLCAf0Xqn7Bz89du3bxrYF3/vOFmWcOhxMbG5uRkdHY
+2CgtLU1WA0FVVbWxsZGYEIRQdXX1X3/9paqqOuR4i4qKQkNDm5ub//GPfzg6OmKaIFtHvucVZl3w
+/XFyciJObENDQ/yQPxiTcd9pgNLSUuIqGCEUHBycm5sbGxubnZ09e/bsrVu3dnV1rVixIiYmRl9f
+/8mTJ3FxcW5ubnPnzq2qqiKrcOPGjd3d3ffv3zc3Nw8PD3/16tW8efNu3LgxjPpTUlLCw8PPnDmT
+m5vr6enp4+PT0NCAGUtOTk5ubu6ALV03N7eFCxdWVVVdunTJ39/fzMzs1KlTHA4HIXTv3r3U1FSE
+UGxsbHFxcXFxMbFfLFQ/MeMtKioSFxdPTEy8ffu2vb19SEgIl8vV09MrLi4mtilu3rxZXFzMe9Pk
+23+y/mDGJayQkJDe3t5r167dunXr9OnT2dnZRDnZ/Au1LpjxIoT49l+o+gU8P0+fPs335f3Pf74w
+8xwdHZ2UlHTgwIFr167t2bMHUwlCSE1NjcFgsNnsysrKBQsWVFZWNjY2EtcTmPFWVlZeunRpz549
+q1atOnbsGOb/HSJfR77nFWZdhP1/98Gb1HEiJyfHzs5u7969L168QAixWKzLly+7uLgoKSmJioru
+2LGjvb09MzNTXV39448/lpGRaWtr++GHH+zt7e3t7WVkZMiqlZKS6uzs3LJli76+fn19vZeX10cf
+ffT69Wth6+dyuefPn3d1ddXQ0EAIWVlZSUlJFRQUCDtMKSkpGo3W0dFx7NgxQ0NDOzu7trY2BoNB
+dryw/SQbL0LI0dHx66+/lpeXFxUVXbBgQU9PD4vFErb/ZP0RdlwYr1+/7urqolAoIiIiBgYGrq6u
+CCGy+R+pdSEM7r+w9Q95fm7ZssXOzi49PX3ACwec/2TI5rm3tzc+Pn7z5s0LFy5UUlLS1NTEj1RB
+QUFERKS5ubmtre3jjz+uqKhobGxUVVXFj7e7u/vEiRNmZmY7d+6UkZH5+eefMU3wXUdhDTn/oaGh
+GRkZf/vb34ZR+QQ1qfedbG1tDx8+nJOTU1NTgxCqr6/v6+vj3ViTlJRUUVHp/1/ok08+kZOTQwhZ
+WlpaWlpialZQUJg5c+b9+/c1NTWlpKTExMSGUX9rayuDwYiOjk5ISCAO4HA4ra2twxssnU4nKldU
+VEQI9fT0kB0pbD9v3brFd7yEuLi4/Px8JpM5jAghSH8EHxfG1q1bDx06ZGNj8+mnny5dupR4+IfJ
+ZPKdf7Ly4Y1ucP+HXT/Z+Xnx4kV1dfVVq1YNOH7A+S9sPxsaGjo7O/X19QUbKBIREVFRUSkvL5eW
+lp41a1ZKSoqampqBgQF+vAYGBlOnTkUIiYqKqqqqNjU1YZrgu47CGnL+ib2ySWVSxwmCra3tiNdJ
+oVDevRIqlYoQ8vT0JLsRMn6QjffIkSNPnjw5ffr0nDlzCgsLvby8BhzA5XJHv3dDMzMzy8zMzMnJ
+uXXr1v79+2fMmBEdHU08GDN4/tvb2/mWC0KQ8Y7SuqelpfEtH/b5/+bNG4SQUI+lqaqqFhYWzp49
+W1dXt7KykkKhqKqqCj7enp4eWVlZzAF815EIbHj912UC/b97byb1vtMAGhoaVCq1traW+GdnZ2dT
+U5O2tvZY1S8jI6OhoVFYWDhSHRDQCM5DUVGRg4ODgYGBiIjIgDsHRGhpa2sbvf40NjbW19cLcoVx
+4sQJDoezcuXK4ODg1NTU2tragoICsvkf3roIPt7RW/fHjx8nJyePVG3ErYXq6mrin5WVlUO+RFVV
+NT8/X1dXV0NDg8lkVlRUqKioCDjejo6OhoaG2bNnY47hu474agevy5D9Efy8+mBAnPg/kpKSTk5O
+SUlJDAaDw+FERUVJS0t//vnnY1j/V199dfPmzfPnz798+bK+vj4lJaX/nymNkhGcB2Vl5bKysp6e
+nrq6upCQkP6/Ij7lFRUVNTQ0JCcnY3alht0fLy8vBweHP/74Y8gjS0pK0tPTm5qauFzuX3/9hRDS
+1dVF5PM/jHURfLzDq18QTCZTkC0mAamoqBgaGhYUFHA4nAcPHhAPROCpqak1Njbq6uqKiIhoa2uz
+WCwJCQmEHW9bW9uff/5ZX19/8uRJRUXFpUuXYuonW0cMvuuCn3/Bz6sPBuXRo0dj3Yf3rayszMfH
+h8lkioiIyMrKurm5OTs7E7/q7e09d+5cbm5uX1+frq6ur6+vpqZmQkJCQkIC73iE0IULF6ZPn05W
+/7Zt20pLS48ePcpisU6dOhUaGvr06dOoqKhff/11GPXfvXs3KiqqsrKSSqUaGhp6e3tjPkr3f/5P
+SUmJQqE4OjoyGIy0tDQKheLr67tmzZp169Y9f/582rRpN27csLW17e3tbWlpkZOTExcXnzdv3pkz
+Z4SdB8x4S0tLAwMDmUymjo6Oubn52bNn1dXViT/R4HK5AQEBubm5xPOLfn5+4uLifPu/Y8cOvv05
+ceIE2biI2SCeX0xOTsZ/CEUIJSUlZWZm1tXViYqKKioqbt682cHBAT//Qq0L3/HGx8dHRUWR9V/w
++snWJTo6OjIysq+vT0xMjPjUzGaz161bt2zZMrLz39nZmclkdnZ2slgs4g306NGjN27cIJvn+vr6
+gwcPMhgMCwsLW1tbNzc3JSUl4o8k+PrPf/5z/Pjxe/fu0Wi0Q4cOVVRU8P7Ej+94PTw8iD8Il5KS
+MjY29vPzw98bIFtHsvOK77oQO2mY+Z+Ez8VOxjgBJomOjg5LS8uCggLiRigAYHhg3wl8sCIiIhwd
+HSFIAPCO4Hkn8MFavXq1jo7OWPcCgAkP4gT4YA15DxMAIAjYdwIAAIADcQIAAAAOxAkAAAA4kzFO
+jHYeMcF98803YWFhgpePH4LkLxupfGQJCQmmpqaenp7vWM/oecf1IssnOIz8a/h1Gf/nFRifJmOc
+wOcRI8tvNeJ5r1pbW/Py8tatWydg+bgiSP6ykcpHtnHjxvGcXuYd1wuTT3AYef0w6zIhziswPsHz
+TmMmOTl58eLFg7+kjKwcjE/vuF6YfIIjm38NziswbJPxeoKnsLDwiy++WLx4MZHPpLy83MTEhPhO
+088++8zExMTc3BxTfvLkSTqd7u/vX1RUtH79emtr6//85z/963dycqLT6WVlZYObfvv27ZUrV1xc
+XDDlzs7OpqamJSUlvN8SeeeFLScbfkREBJ1Op9PpR44cuX379urVq21tbVNSUhBCvb29YWFhDg4O
+NjY2X375ZV1dHfESDocTExOzcuVKU1NTb29vXlUMBmPv3r1WVlaWlpaff/55/80ThNDg+SGrn6yc
+JzExccGCBebm5sT3PeDb5ev27duurq7W1tYODg4HDx7EtOvk5LRkyZLr16/b2NjcvHkzLi7O0tLy
+9u3b/Wvrv16Y+eRyudeuXVu/fr2Njc3atWt5lZiZmRFf9719+3YTExMTExNi+WxtbYkvx6bT6UTC
+NYRQSEgInU738fEZcN5i1oVvPwEQ1uSNE4Pzc5HltyIr37Nnj7GxcWVl5dWrVwMCAjZt2jRkvi2e
+69eva2lpDf7u/v7la9eu1dXVnT9/fnFx8erVq1ks1vbt2/X09IQtJ+sDJg8a3/xxiDx/GVkeMUSS
+j4ysfrJyHkVFxTlz5mRlZRFfSYRpl6/CwsKvvvpq48aNeXl5Z8+e5b1f820Xk6eP73oNIy8hWT5B
+YfMSDplXjux8A0AQkzdOvHseNElJSTExse7u7sOHD+vr67u6usrJyfXPt0WW94rL5SYkJAz+cDeg
+XEdH58WLFxwO5/79+7W1tY8fP66urtbW1ha2nKz/ZHnQyPLHYfKXYfKIDc5HRlY/WTmvqoyMjNTU
+1PDwcF4SAmHzl8XGxpqbmy9btoxCoWhqahLf44bJl0eWp4/veo1VXsIh88qRnW8ACGjy3p8YkTxo
+CCEDA4MpU6ag/6br6p9vi+y7LR88eNDZ2Tl463lAuY6ODovFampqKisrW7JkycOHD9XV1XV0dIQt
+H3IIA/KglZeX880fh8lfhskjNjgfGVl+OnzeuqqqqsOHD3/77bf9v69J2PxlVVVVjo6OxM8UCiUy
+MhKR58tTVFTE5OlD5Ov4nvMSDplXjqyfAAho8sYJPLK8Y/h8ZCwWC59vi5CYmLhhwwYRkYEXcwPK
+5eXlZWVlnz9/zmazzc3Ns7KyWCzWvHnzhC0XbMRDw+QvEzCP2JD5yDBmzZq1fPnygICAmTNn8jbT
+hM1fJiYm1tfXJ3ij+LyEZOs4wGjnRxsyr5yA/QSADJw6A5HlHRsyH1l7e/uAfFt8817V19eXlJQM
+TlY8uJxCocyaNSs9Pf3vf/+7kZFRWVnZH3/8oa2tLWw5vj+DkeWPw+QvEySPGC8fGVn9Q+at27Vr
+18cff+zp6dnc3CxIu4PHq6en9+uvvw4I9sPLl0e2joONdl5CfF45wfsJABmIEwOR5R0jK++fb0tJ
+Sal/vi2+ea+SkpJWrlw5+Muu+Zbr6OjcuXPH2Nh45syZU6ZMKS0tnTFjxjDKMf0ZjCx/HCZ/GSaP
+2OB8ZGT1D5m3TkRE5OTJk5KSkl5eXsT84/OXDR6vh4fHs2fPTp48WV1d/erVq59++qmnp2d4+fLI
+1pGvUc1LiM8rJ1Q/AeBrMu47xcTE/PLLLxQKJSUlZc2aNYGBgQihLVu2EI+yzJ4928HB4bvvvouM
+jLSwsFi5ciXxKrLykpKS9evXs9lsY2Pj2NjYAVvYA3R0dGRkZPByeA1ZrqOjw+FwjIyMKBSKkZFR
+TU0NsYkhbDlfvDxojx49Ip7g4uXR27t3r7i4+KZNm4j8cRcuXCDeaI4fP37w4MHly5dbWFh89dVX
+bm5u27Zty8vLW7t2bXp6elhYGJFH7MiRI3PnziVayc/Pz8/PJ/KR8eaHrH6+5QkJCbdv3+Zyubm5
+uTY2Nq6urkePHrW1tb1z5w6mXb7mzZsXFRUVFhbm4uIiJiZGp9OJfGdk7ba2tl67dg0hVFVVRUzR
+w4cPydYLM5/W1tbnzp2Lior68cfyu8ImAAAIHElEQVQfifxoRkZGCCEinyBCyMvLq38+QV7+NeJn
+Xl5CsvOWbF3IzisAhAL57N6Jh4eHsrLy0aNHBTw+Li6urKzsu+++E7AcjE8TZb0mSj/BOAf7Tu8P
+m83+97//PfjZTbJyMD5NlPWaKP0E45/oP/7xj7Huw0QVHh6ek5NTU1Pz008/zZo1q/+dAL6am5un
+TJlCPLwvSDkYnybKek2UfoLxD/adAAAA4MC+EwAAAByIEwAAAHAgTgAAAMCBOAEAAAAH4gQAAAAc
+iBMAAABwIE4AAADAgTgBAAAAB+IEAAAAHIgTAAAAcCBOAAAAwIE4AQAAAAfiBAAAAByIEwAAAHAg
+TgAAAMCBOAEAAAAH4gQAAAAciBMAAABwIE4AAADAoY51B0bRvHnzxroLAAAwLvz222/Dfi1cTwAA
+AMCZjHEiMTFRVlZWXFxcS0tLXl7ewMDgxo0bY92pUfTpp59SKJT+Y7S0tJw6deqQL4yJiaFQKDU1
+Ne+5XQDAuDIZ44SLi8vOnTvnzJlTU1PT3NxsaGjo7Oz89u1b/KtycnIoFMqbN2/eTydHsN3AwECE
+0PXr14l/trW1/fLLL6tXrx7yhUpKSqampjQa7T23CwAYVyZjnOiPSqU6Ozu3tLTU19ePdV9G0bRp
+03jv1z///DOFQhHkVStXrrx3756amtp7bhcAMK5M9jiBEGIwGDIyMpqamgghLpebkJAwf/58DQ0N
+AwODq1evIoR+++03CQkJBwcHhJCKioqEhISsrCxC6MSJExISEuvWrSPqUVNTI3ZpvvnmGwqFQqFQ
+3N3dr169qq+vr6mpGRMTc+DAAQqF4ujomJWVZWhoqKysnJSUhOkYWbsIobdv3/7zn/+cPXu2hoaG
+nZ1dRUUFfoyWlpZPnjxpaGhACGVnZ1tYWPCa2LRpk7a2try8vLKycmhoKFGuqampoaGhoKBAoVD6
++vqIQmH7j2mX7zyT1U82z/imAQAjZVLHCS6X+/z58zNnzvj7+1OpVIRQdHR0QEBAcnLyy5cvT5w4
+8cUXX9TW1s6bN6+7uzsjIwMh1NTU1N3d3dbWhhDy8/Oztrbm1ZacnEz8sGXLllu3bhkbGz948CAo
+KMjPz8/U1PT3338/ePCgjY3N06dPz507FxkZuXTpUk9PTzabTdY9snYRQvv3709OTr5z505NTY2h
+oaGFhcVff/2FGam8vPyCBQvy8vK4XG5BQQHv/TovL09CQqK4uLi5uXnjxo0HDhzgcrkIodra2pcv
+X0ZFRfWvRNj+Y9rlO89k9ZPNMwDg/Zi8ceLp06caGhpz5swxMjLy8fFBCHG53MOHD+/du1dHRwch
+tGLFCllZ2czMTGFr1tLSsrKykpeXb2lpSU1N3bhx48aNGxUUFGRlZadMmcJkMuPi4hYuXLh+/frW
+1tbGxkZh6+/s7AwPD9+zZ4+6ujqVSvX392cymT/++CP+VTY2NtevX3/8+LGenp6EhARR6OHh8cMP
+PygpKVGp1MWLF7NYrM7OTrIahtf/we2SzfNIzQ8AYGRN3jgxZ86cV69e7d69+9atW93d3Qih5ubm
+xsbGY8eOaf0Xm81ubm4edhPLli1TVFRECDk4OAQEBBCF5ubmRKGqqipCiMViCVttVVVVb2/vRx99
+RPxTSkpKQ0Pj6dOn+FfZ2Njk5eVlZWUtX768f/mZM2cWLFigpaW1detWQVoXtv+D28XP87vPDwBg
+ZE3eOEHYu3dvc3NzfHw8QkhMTAwhdPz48Zr/am1tPXz4cP/jiW2Z969/u8Prg4mJSXd3d2hoqJ2d
+Ha/Q3d09Pj7+3LlzVVVVFy5cGIGOCtCuIPMMABg/Jnuc0NbWdnJyCgoKYrPZ8vLyOjo62dnZfI8k
+ntVpbW3tXyghIcFkMomfi4qKRqOHg9udNWuWmJhYeXk58c+Ojo6XL1/q6+vj6xETE/vss89kZWW1
+tLR4hbm5uZs2bTIxMREVFeVwOCPfe37t4ueZr/cwzwAAMpM9TiCEvv7664qKirS0NITQt99+m5qa
+evjw4RcvXlRVVUVHRxcWFhKHEY+H5ubm1tbWRkREEPv4+vr6Dx48YDKZ2dnZ//rXv0aje4PblZKS
+2rlzZ0hISGNjI5vNDgwMlJOTc3V1HbKqXbt2HTp0qH/J9OnT7927193dXVFR4evrOxr959suZp75
+eg/zDAAgQ3n06NFY92G0kH2/U0JCwq5du7q7uzds2BAXF4cQWrp06S+//EK89efk5Bw9evTx48fi
+4uJmZmZBQUHEnQAul7t169YrV67IyMh8/vnn4eHhNBrt9evXa9euffbsma2t7aZNm4gbEgcPHvz+
++++bm5tFRUUVFBQQQgUFBdra2rt27YqNjaVQKGfPnnV3dzc2Ni4tLVVRUcHfquXb7tu3b/39/a9c
+udLb22tgYBAaGqqnp0dWw6JFix4+fFhUVMSbEDU1tba2tq6ursLCwu3btzMYDH19fTs7Oz8/Py0t
+rerqak1NTTab3dXVxWQy1dXVKRSKh4dHQ0ODUP3HtMt3nkNDQ8nq5zvP73LrCIDJ5l2+32kyxgkA
+AJhs4HsAhfP69eux7gIAAEwYkzFOKCsrj3UXAABgwpiMcQIAAIDgIE4AAADA+ZDz2b3LfRsAAAAE
+uJ4AAACAA3ECAAAADsQJAAAAOBAnAAAA4ECcAAAAgANxAgAAAA7ECQAAADgQJwAAAOBAnAAAAIAD
+cQIAAAAOxAkAAAA4ECcAAADgQJwAAACAA3ECAAAADsQJAAAAOBAnAAAA4ECcAAAAgPP/AJqRiwZc
+EFGMAAAAAElFTkSuQmCC
+"
+     id="image10"
+     x="0"
+     y="0" />
+  <rect
+     style="fill:#ffff00;fill-opacity:0.16818182;stroke:#ff0000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="rect2987"
+     width="381.05719"
+     height="20.119629"
+     x="82.896263"
+     y="359.67828" />
+</svg>
diff --git a/refind/mystrings.c b/refind/mystrings.c
new file mode 100644 (file)
index 0000000..a5c5823
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+ * refind/mystrings.c
+ * String-manipulation functions
+ *
+ * Copyright (c) 2012-2015 Roderick W. Smith
+ *
+ * Distributed under the terms of the GNU General Public License (GPL)
+ * version 3 (GPLv3), or (at your option) any later version.
+ *
+ */
+/*
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "mystrings.h"
+#include "lib.h"
+
+BOOLEAN StriSubCmp(IN CHAR16 *SmallStr, IN CHAR16 *BigStr) {
+    BOOLEAN Found = 0, Terminate = 0;
+    UINTN BigIndex = 0, SmallIndex = 0, BigStart = 0;
+
+    if (SmallStr && BigStr) {
+        while (!Terminate) {
+            if (BigStr[BigIndex] == '\0') {
+                Terminate = 1;
+            }
+            if (SmallStr[SmallIndex] == '\0') {
+                Found = 1;
+                Terminate = 1;
+            }
+            if ((SmallStr[SmallIndex] & ~0x20) == (BigStr[BigIndex] & ~0x20)) {
+                SmallIndex++;
+                BigIndex++;
+            } else {
+                SmallIndex = 0;
+                BigStart++;
+                BigIndex = BigStart;
+            }
+        } // while
+    } // if
+    return Found;
+} // BOOLEAN StriSubCmp()
+
+// Performs a case-insensitive string comparison. This function is necesary
+// because some EFIs have buggy StriCmp() functions that actually perform
+// case-sensitive comparisons.
+// Returns TRUE if strings are identical, FALSE otherwise.
+BOOLEAN MyStriCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString) {
+    if (FirstString && SecondString) {
+        while ((*FirstString != L'\0') && ((*FirstString & ~0x20) == (*SecondString & ~0x20))) {
+                FirstString++;
+                SecondString++;
+        }
+        return (*FirstString == *SecondString);
+    } else {
+        return FALSE;
+    }
+} // BOOLEAN MyStriCmp()
+
+/*++
+ * 
+ * Routine Description:
+ *
+ *  Find a substring.
+ *
+ * Arguments: 
+ *
+ *  String      - Null-terminated string to search.
+ *  StrCharSet  - Null-terminated string to search for.
+ *
+ * Returns:
+ *  The address of the first occurrence of the matching substring if successful, or NULL otherwise.
+ * --*/
+CHAR16* MyStrStr (IN CHAR16  *String, IN CHAR16  *StrCharSet)
+{
+    CHAR16 *Src;
+    CHAR16 *Sub;
+
+    if ((String == NULL) || (StrCharSet == NULL))
+        return NULL;
+
+    Src = String;
+    Sub = StrCharSet;
+
+    while ((*String != L'\0') && (*StrCharSet != L'\0')) {
+        if (*String++ != *StrCharSet) {
+            String = ++Src;
+            StrCharSet = Sub;
+        } else {
+            StrCharSet++;
+        }
+    }
+    if (*StrCharSet == L'\0') {
+        return Src;
+    } else {
+        return NULL;
+    }
+} // CHAR16 *MyStrStr()
+
+// Convert input string to all-lowercase.
+// DO NOT USE the standard StrLwr() function, since it's broken on some EFIs!
+VOID ToLower(CHAR16 * MyString) {
+    UINTN i = 0;
+
+    if (MyString) {
+        while (MyString[i] != L'\0') {
+            if ((MyString[i] >= L'A') && (MyString[i] <= L'Z'))
+                MyString[i] = MyString[i] - L'A' + L'a';
+            i++;
+        } // while
+    } // if
+} // VOID ToLower()
+
+// Merges two strings, creating a new one and returning a pointer to it.
+// If AddChar != 0, the specified character is placed between the two original
+// strings (unless the first string is NULL or empty). The original input
+// string *First is de-allocated and replaced by the new merged string.
+// This is similar to StrCat, but safer and more flexible because
+// MergeStrings allocates memory that's the correct size for the
+// new merged string, so it can take a NULL *First and it cleans
+// up the old memory. It should *NOT* be used with a constant
+// *First, though....
+VOID MergeStrings(IN OUT CHAR16 **First, IN CHAR16 *Second, CHAR16 AddChar) {
+    UINTN Length1 = 0, Length2 = 0;
+    CHAR16* NewString;
+
+    if (*First != NULL)
+        Length1 = StrLen(*First);
+    if (Second != NULL)
+        Length2 = StrLen(Second);
+    NewString = AllocatePool(sizeof(CHAR16) * (Length1 + Length2 + 2));
+    if (NewString != NULL) {
+        if ((*First != NULL) && (Length1 == 0)) {
+            MyFreePool(*First);
+            *First = NULL;
+        }
+        NewString[0] = L'\0';
+        if (*First != NULL) {
+            StrCat(NewString, *First);
+            if (AddChar) {
+                NewString[Length1] = AddChar;
+                NewString[Length1 + 1] = '\0';
+            } // if (AddChar)
+        } // if (*First != NULL)
+        if (Second != NULL)
+            StrCat(NewString, Second);
+        MyFreePool(*First);
+        *First = NewString;
+    } else {
+        Print(L"Error! Unable to allocate memory in MergeStrings()!\n");
+    } // if/else
+} // VOID MergeStrings()
+
+// Similar to MergeStrings, but breaks the input string into word chunks and
+// merges each word separately. Words are defined as string fragments separated
+// by ' ', '_', or '-'.
+VOID MergeWords(CHAR16 **MergeTo, CHAR16 *SourceString, CHAR16 AddChar) {
+    CHAR16 *Temp, *Word, *p;
+    BOOLEAN LineFinished = FALSE;
+
+    if (SourceString) {
+        Temp = Word = p = StrDuplicate(SourceString);
+        if (Temp) {
+            while (!LineFinished) {
+                if ((*p == L' ') || (*p == L'_') || (*p == L'-') || (*p == L'\0')) {
+                    if (*p == L'\0')
+                        LineFinished = TRUE;
+                    *p = L'\0';
+                    if (*Word != L'\0')
+                        MergeStrings(MergeTo, Word, AddChar);
+                    Word = p + 1;
+                } // if
+                p++;
+            } // while
+            MyFreePool(Temp);
+        } else {
+            Print(L"Error! Unable to allocate memory in MergeWords()!\n");
+        } // if/else
+    } // if
+} // VOID MergeWords()
+
+// Restrict TheString to at most Limit characters.
+// Does this in two ways:
+// - Locates stretches of two or more spaces and compresses
+//   them down to one space.
+// - Truncates TheString
+// Returns TRUE if changes were made, FALSE otherwise
+BOOLEAN LimitStringLength(CHAR16 *TheString, UINTN Limit) {
+    CHAR16    *SubString, *TempString;
+    UINTN     i;
+    BOOLEAN   HasChanged = FALSE;
+
+    // SubString will be NULL or point WITHIN TheString
+    SubString = MyStrStr(TheString, L"  ");
+    while (SubString != NULL) {
+        i = 0;
+        while (SubString[i] == L' ')
+            i++;
+        if (i >= StrLen(SubString)) {
+            SubString[0] = '\0';
+            HasChanged = TRUE;
+        } else {
+            TempString = StrDuplicate(&SubString[i]);
+            if (TempString != NULL) {
+                StrCpy(&SubString[1], TempString);
+                MyFreePool(TempString);
+                HasChanged = TRUE;
+            } else {
+                // memory allocation problem; abort to avoid potentially infinite loop!
+                break;
+            } // if/else
+        } // if/else
+        SubString = MyStrStr(TheString, L"  ");
+    } // while
+
+    // If the string is still too long, truncate it....
+    if (StrLen(TheString) > Limit) {
+        TheString[Limit] = '\0';
+        HasChanged = TRUE;
+    } // if
+
+    return HasChanged;
+} // BOOLEAN LimitStringLength()
+
+// Returns all the digits in the input string, including intervening
+// non-digit characters. For instance, if InString is "foo-3.3.4-7.img",
+// this function returns "3.3.4-7". If InString contains no digits,
+// the return value is NULL.
+CHAR16 *FindNumbers(IN CHAR16 *InString) {
+    UINTN i, StartOfElement, EndOfElement = 0, CopyLength;
+    CHAR16 *Found = NULL;
+
+    if (InString == NULL)
+        return NULL;
+
+    StartOfElement = StrLen(InString);
+    // Find start & end of target element
+    for (i = 0; InString[i] != L'\0'; i++) {
+        if ((InString[i] >= L'0') && (InString[i] <= L'9')) {
+            if (StartOfElement > i)
+                StartOfElement = i;
+            if (EndOfElement < i)
+                EndOfElement = i;
+        } // if
+    } // for
+    // Extract the target element
+    if (EndOfElement > 0) {
+        if (EndOfElement >= StartOfElement) {
+            CopyLength = EndOfElement - StartOfElement + 1;
+            Found = StrDuplicate(&InString[StartOfElement]);
+            if (Found != NULL)
+                Found[CopyLength] = 0;
+        } // if (EndOfElement >= StartOfElement)
+    } // if (EndOfElement > 0)
+    return (Found);
+} // CHAR16 *FindNumbers()
+
+// Find the #Index element (numbered from 0) in a comma-delimited string
+// of elements.
+// Returns the found element, or NULL if Index is out of range or InString
+// is NULL. Note that the calling function is responsible for freeing the
+// memory associated with the returned string pointer.
+CHAR16 *FindCommaDelimited(IN CHAR16 *InString, IN UINTN Index) {
+    UINTN    StartPos = 0, CurPos = 0, InLength;
+    BOOLEAN  Found = FALSE;
+    CHAR16   *FoundString = NULL;
+
+    if (InString != NULL) {
+        InLength = StrLen(InString);
+        // After while() loop, StartPos marks start of item #Index
+        while ((Index > 0) && (CurPos < InLength)) {
+            if (InString[CurPos] == L',') {
+                Index--;
+                StartPos = CurPos + 1;
+            } // if
+            CurPos++;
+        } // while
+        // After while() loop, CurPos is one past the end of the element
+        while ((CurPos < InLength) && (!Found)) {
+            if (InString[CurPos] == L',')
+                Found = TRUE;
+            else
+                CurPos++;
+        } // while
+        if (Index == 0)
+            FoundString = StrDuplicate(&InString[StartPos]);
+        if (FoundString != NULL)
+            FoundString[CurPos - StartPos] = 0;
+    } // if
+    return (FoundString);
+} // CHAR16 *FindCommaDelimited()
+
+// Returns TRUE if SmallString is an element in the comma-delimited List,
+// FALSE otherwise. Performs comparison case-insensitively.
+BOOLEAN IsIn(IN CHAR16 *SmallString, IN CHAR16 *List) {
+   UINTN     i = 0;
+   BOOLEAN   Found = FALSE;
+   CHAR16    *OneElement;
+
+   if (SmallString && List) {
+      while (!Found && (OneElement = FindCommaDelimited(List, i++))) {
+         if (MyStriCmp(OneElement, SmallString))
+            Found = TRUE;
+      } // while
+   } // if
+   return Found;
+} // BOOLEAN IsIn()
+
+// Returns TRUE if any element of List can be found as a substring of
+// BigString, FALSE otherwise. Performs comparisons case-insensitively.
+BOOLEAN IsInSubstring(IN CHAR16 *BigString, IN CHAR16 *List) {
+   UINTN   i = 0, ElementLength;
+   BOOLEAN Found = FALSE;
+   CHAR16  *OneElement;
+
+   if (BigString && List) {
+      while (!Found && (OneElement = FindCommaDelimited(List, i++))) {
+         ElementLength = StrLen(OneElement);
+         if ((ElementLength <= StrLen(BigString)) && (StriSubCmp(OneElement, BigString)))
+            Found = TRUE;
+      } // while
+   } // if
+   return Found;
+} // BOOLEAN IsSubstringIn()
+
+// Returns TRUE if *Input contains nothing but valid hexadecimal characters,
+// FALSE otherwise. Note that a leading "0x" is NOT acceptable in the input!
+BOOLEAN IsValidHex(CHAR16 *Input) {
+    BOOLEAN IsHex = TRUE;
+    UINTN i = 0;
+
+    while ((Input[i] != L'\0') && IsHex) {
+        if (!(((Input[i] >= L'0') && (Input[i] <= L'9')) ||
+              ((Input[i] >= L'A') && (Input[i] <= L'F')) ||
+              ((Input[i] >= L'a') && (Input[i] <= L'f')))) {
+                IsHex = FALSE;
+        }
+        i++;
+    } // while
+    return IsHex;
+} // BOOLEAN IsValidHex()
+
+// Converts consecutive characters in the input string into a
+// number, interpreting the string as a hexadecimal number, starting
+// at the specified position and continuing for the specified number
+// of characters or until the end of the string, whichever is first.
+// NumChars must be between 1 and 16. Ignores invalid characters.
+UINT64 StrToHex(CHAR16 *Input, UINTN Pos, UINTN NumChars) {
+    UINT64 retval = 0x00;
+    UINTN  NumDone = 0, InputLength;
+    CHAR16 a;
+
+    if ((Input == NULL) || (NumChars == 0) || (NumChars > 16)) {
+        return 0;
+    }
+
+    InputLength = StrLen(Input);
+    while ((Pos <= InputLength) && (NumDone < NumChars)) {
+        a = Input[Pos];
+        if ((a >= '0') && (a <= '9')) {
+            retval *= 0x10;
+            retval += (a - '0');
+            NumDone++;
+        }
+        if ((a >= 'a') && (a <= 'f')) {
+            retval *= 0x10;
+            retval += (a - 'a' + 0x0a);
+            NumDone++;
+        }
+        if ((a >= 'A') && (a <= 'F')) {
+            retval *= 0x10;
+            retval += (a - 'A' + 0x0a);
+            NumDone++;
+        }
+        Pos++;
+    } // while()
+    return retval;
+} // StrToHex()
+
+// Returns TRUE if UnknownString can be interpreted as a GUID, FALSE otherwise.
+// Note that the input string must have no extraneous spaces and must be
+// conventionally formatted as a 36-character GUID, complete with dashes in
+// appropriate places.
+BOOLEAN IsGuid(CHAR16 *UnknownString) {
+    UINTN   Length, i;
+    BOOLEAN retval = TRUE;
+    CHAR16  a;
+
+    if (UnknownString == NULL)
+        return FALSE;
+
+    Length = StrLen(UnknownString);
+    if (Length != 36)
+        return FALSE;
+
+    for (i = 0; i < Length; i++) {
+        a = UnknownString[i];
+        if ((i == 8) || (i == 13) || (i == 18) || (i == 23)) {
+            if (a != L'-')
+                retval = FALSE;
+        } else if (((a < L'a') || (a > L'f')) &&
+                   ((a < L'A') || (a > L'F')) &&
+                   ((a < L'0') && (a > L'9'))) {
+            retval = FALSE;
+        } // if/else if
+    } // for
+    return retval;
+} // BOOLEAN IsGuid()
+
+// Return the GUID as a string, suitable for display to the user. Note that the calling
+// function is responsible for freeing the allocated memory.
+CHAR16 * GuidAsString(EFI_GUID *GuidData) {
+   CHAR16 *TheString;
+
+   TheString = AllocateZeroPool(42 * sizeof(CHAR16));
+   if (TheString != 0) {
+      SPrint (TheString, 82, L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+              (UINTN)GuidData->Data1, (UINTN)GuidData->Data2, (UINTN)GuidData->Data3,
+              (UINTN)GuidData->Data4[0], (UINTN)GuidData->Data4[1], (UINTN)GuidData->Data4[2],
+              (UINTN)GuidData->Data4[3], (UINTN)GuidData->Data4[4], (UINTN)GuidData->Data4[5],
+              (UINTN)GuidData->Data4[6], (UINTN)GuidData->Data4[7]);
+   }
+   return TheString;
+} // GuidAsString(EFI_GUID *GuidData)
+
+EFI_GUID StringAsGuid(CHAR16 * InString) {
+    EFI_GUID  Guid = NULL_GUID_VALUE;
+
+    if (!IsGuid(InString)) {
+        return Guid;
+    }
+
+    Guid.Data1 = (UINT32) StrToHex(InString, 0, 8);
+    Guid.Data2 = (UINT16) StrToHex(InString, 9, 4);
+    Guid.Data3 = (UINT16) StrToHex(InString, 14, 4);
+    Guid.Data4[0] = (UINT8) StrToHex(InString, 19, 2);
+    Guid.Data4[1] = (UINT8) StrToHex(InString, 21, 2);
+    Guid.Data4[2] = (UINT8) StrToHex(InString, 23, 2);
+    Guid.Data4[3] = (UINT8) StrToHex(InString, 26, 2);
+    Guid.Data4[4] = (UINT8) StrToHex(InString, 28, 2);
+    Guid.Data4[5] = (UINT8) StrToHex(InString, 30, 2);
+    Guid.Data4[6] = (UINT8) StrToHex(InString, 32, 2);
+    Guid.Data4[7] = (UINT8) StrToHex(InString, 34, 2);
+
+    return Guid;
+} // EFI_GUID StringAsGuid()
diff --git a/refind/mystrings.h b/refind/mystrings.h
new file mode 100644 (file)
index 0000000..9b4faec
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * refit/mystrings.h
+ * String functions header file
+ *
+ * Copyright (c) 2012-2015 Roderick W. Smith
+ *
+ * Distributed under the terms of the GNU General Public License (GPL)
+ * version 3 (GPLv3), or (at your option) any later version.
+ *
+ */
+/*
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MYSTRINGS_H_
+#define __MYSTRINGS_H_
+
+#ifdef __MAKEWITH_GNUEFI
+#include <efi.h>
+#include <efilib.h>
+#else
+#include "../include/tiano_includes.h"
+#endif
+#include "../EfiLib/GenericBdsLib.h"
+
+BOOLEAN StriSubCmp(IN CHAR16 *TargetStr, IN CHAR16 *BigStr);
+BOOLEAN MyStriCmp(IN CONST CHAR16 *String1, IN CONST CHAR16 *String2);
+CHAR16* MyStrStr (IN CHAR16  *String, IN CHAR16  *StrCharSet);
+VOID ToLower(CHAR16 * MyString);
+VOID MergeStrings(IN OUT CHAR16 **First, IN CHAR16 *Second, CHAR16 AddChar);
+VOID MergeWords(CHAR16 **MergeTo, CHAR16 *InString, CHAR16 AddChar);
+BOOLEAN LimitStringLength(CHAR16 *TheString, UINTN Limit);
+CHAR16 *FindNumbers(IN CHAR16 *InString);
+CHAR16 *FindCommaDelimited(IN CHAR16 *InString, IN UINTN Index);
+BOOLEAN IsIn(IN CHAR16 *SmallString, IN CHAR16 *List);
+BOOLEAN IsInSubstring(IN CHAR16 *BigString, IN CHAR16 *List);
+
+BOOLEAN IsValidHex(CHAR16 *Input);
+UINT64 StrToHex(CHAR16 *Input, UINTN Position, UINTN NumChars);
+BOOLEAN IsGuid(CHAR16 *UnknownString);
+CHAR16 * GuidAsString(EFI_GUID *GuidData);
+EFI_GUID StringAsGuid(CHAR16 * InString);
+
+
+#endif
\ No newline at end of file