{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Writing multiple netCDF files in parallel with xarray and dask\n", "\n", "A typical computation workflow with xarray consists of:\n", "\n", "1. reading one or more netCDF files into an xarray dataset backed by dask using `xr.open_mfdataset()` or `xr.open_dataset(chunks=...)`,\n", "2. applying some transformation to the input dataset, and\n", "3. saving the resulting output to disk in a netCDF file using `xr.to_netcdf()`.\n", "\n", "\n", "The last step (3) can easily lead to a large netCDF file (>=10GB in size). As a result, this step can take a very long time to complete (since it is run in serial), and sometimes may hang. So, to avoid these issues one can use one of the lesser-used but helpful xarray capabilities: the [`xr.save_mfdataset()`](https://xarray.pydata.org/en/latest/generated/xarray.save_mfdataset.html) function. This function allows users to write multiple datasets to disk as netCDF files simultaneously. The `xr.save_mfdataset()` function signature looks like this:\n", "\n", "```python\n", "xr.save_mfdataset(\n", " datasets,\n", " paths,\n", " mode='w',\n", " format=None,\n", " groups=None,\n", " engine=None,\n", " compute=True,\n", ")\n", "Docstring:\n", "Write multiple datasets to disk as netCDF files simultaneously.\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Please show me the code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Package imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'0.15.1'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "import xarray as xr\n", "from distributed import Client, performance_report\n", "\n", "xr.__version__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "

Client

\n", "\n", "
\n", "

Cluster

\n", "
    \n", "
  • Workers: 4
  • \n", "
  • Cores: 8
  • \n", "
  • Memory: 17.18 GB
  • \n", "
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "client = Client()\n", "client" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load some toy dataset" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "Show/Hide data repr\n", "\n", "\n", "\n", "\n", "\n", "Show/Hide attributes\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
xarray.Dataset
    • time: 36
    • x: 275
    • y: 205
    • time
      (time)
      object
      1980-09-16 12:00:00 ... 1983-08-17 00:00:00
      long_name :
      time
      type_preferred :
      int
      array([cftime.DatetimeNoLeap(1980-09-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1980-10-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1980-11-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1980-12-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-01-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-02-15 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-03-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-04-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-05-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-06-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-07-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-08-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-09-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-10-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-11-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-12-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-01-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-02-15 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-03-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-04-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-05-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-06-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-07-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-08-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-09-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-10-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-11-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-12-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-01-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-02-15 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-03-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-04-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-05-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-06-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-07-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-08-17 00:00:00)], dtype=object)
    • xc
      (y, x)
      float64
      dask.array<chunksize=(205, 275), meta=np.ndarray>
      long_name :
      longitude of grid cell center
      units :
      degrees_east
      bounds :
      xv
      \n",
             "\n",
             "\n",
             "\n",
             "\n",
             "
      \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
      Array Chunk
      Bytes 451.00 kB 451.00 kB
      Shape (205, 275) (205, 275)
      Count 2 Tasks 1 Chunks
      Type float64 numpy.ndarray
      \n", "
      \n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " 275\n", " 205\n", "\n", "
    • yc
      (y, x)
      float64
      dask.array<chunksize=(205, 275), meta=np.ndarray>
      long_name :
      latitude of grid cell center
      units :
      degrees_north
      bounds :
      yv
      \n",
             "\n",
             "\n",
             "\n",
             "\n",
             "
      \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
      Array Chunk
      Bytes 451.00 kB 451.00 kB
      Shape (205, 275) (205, 275)
      Count 2 Tasks 1 Chunks
      Type float64 numpy.ndarray
      \n", "
      \n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " 275\n", " 205\n", "\n", "
    • Tair
      (time, y, x)
      float64
      dask.array<chunksize=(12, 205, 275), meta=np.ndarray>
      units :
      C
      long_name :
      Surface air temperature
      type_preferred :
      double
      time_rep :
      instantaneous
      \n",
             "\n",
             "\n",
             "\n",
             "\n",
             "
      \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
      Array Chunk
      Bytes 16.24 MB 5.41 MB
      Shape (36, 205, 275) (12, 205, 275)
      Count 4 Tasks 3 Chunks
      Type float64 numpy.ndarray
      \n", "
      \n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " 275\n", " 205\n", " 36\n", "\n", "
  • title :
    /workspace/jhamman/processed/R1002RBRxaaa01a/lnd/temp/R1002RBRxaaa01a.vic.ha.1979-09-01.nc
    institution :
    U.W.
    source :
    RACM R1002RBRxaaa01a
    output_frequency :
    daily
    output_mode :
    averaged
    convention :
    CF-1.4
    references :
    Based on the initial model of Liang et al., 1994, JGR, 99, 14,415- 14,429.
    comment :
    Output from the Variable Infiltration Capacity (VIC) model.
    nco_openmp_thread_number :
    1
    NCO :
    "4.6.0"
    history :
    Tue Dec 27 14:15:22 2016: ncatted -a dimensions,,d,, rasm.nc rasm.nc\n", "Tue Dec 27 13:38:40 2016: ncks -3 rasm.nc rasm.nc\n", "history deleted for brevity
" ], "text/plain": [ "\n", "Dimensions: (time: 36, x: 275, y: 205)\n", "Coordinates:\n", " * time (time) object 1980-09-16 12:00:00 ... 1983-08-17 00:00:00\n", " xc (y, x) float64 dask.array\n", " yc (y, x) float64 dask.array\n", "Dimensions without coordinates: x, y\n", "Data variables:\n", " Tair (time, y, x) float64 dask.array\n", "Attributes:\n", " title: /workspace/jhamman/processed/R1002RBRxaaa01a/l...\n", " institution: U.W.\n", " source: RACM R1002RBRxaaa01a\n", " output_frequency: daily\n", " output_mode: averaged\n", " convention: CF-1.4\n", " references: Based on the initial model of Liang et al., 19...\n", " comment: Output from the Variable Infiltration Capacity...\n", " nco_openmp_thread_number: 1\n", " NCO: \"4.6.0\"\n", " history: Tue Dec 27 14:15:22 2016: ncatted -a dimension..." ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds = xr.tutorial.open_dataset('rasm', chunks={'time': 12})\n", "ds" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds.Tair.data.visualize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Perform a computation on input dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, our input dataset is chunked along the `time` dimension. This produces an xarray dataset with 3 chunks. For illustrative purposes, let's apply some arbitray computation on our dataset:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "result = np.sqrt(np.sin(ds) ** 2 + np.cos(ds) ** 2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAN0CAYAAAA0w2jwAAAAAXNSR0IArs4c6QAAQABJREFUeAHsnQn8V1P+/9/f+rZoIy1fraK9ZNCiSJRCGE0JMYQmU0SG4WcM40/ZJ8tYQguSNmOL0diKolTSqrRvtGrf9/M/72M+n+/n+1nPPZ/7uevrPB71uffs9/l+f+/7nj1PCPEwwYEACIAACIAACCQlkCcNpUgaAk8QAAEQAAEQAAEqBgYgAAIgAAIgAAKpCeSnDgp2SNga0nl5ecEWqHw6yDTwIg70A0J/vSveULYoH330USpWrFio/pUqVcq7WmhDzSBTGyAiC9cIQH9dQ69VcCgN5YIFC2js2LGqBcJfcUH/d+TIEeJ/QXaQaZClG/xng/56W8ahNJTeFglqBwIgAAIg4CUCMJRekgbqAgIgAAIg4DkCMJSeEwkqBAIgAAIg4CUCMJRekgbqAgIgAAIg4DkCMJSeEwkqBAIgAAIg4CUCMJRekgbqAgIgAAIg4DkCMJSeEwkqBAIgAAIg4CUCMJRekgbqAgIgAAIg4DkCMJSeEwkqBAIgAAIg4CUCMJRekgbqAgIgAAIg4DkCMJQaIjl27Bjt3bs3GnPbtm1GG3DblW7Pnj3EdYIzJxAvU84pVsa6OUOmuqQQz04C8fq7efNmvJPsBByXFwxlHJD42/3791OfPn2IFXHp0qXUtm1bGjBgALVr147Gjx8fHz3pvd3pNmzYQP3796dDhw4lLQ+e6QnEypRjzp8/n7p06UL33ntv+oQxoZBpDAxcOkogVn9nzpxJrVu3poKCAqpXrx4NHz5cqy7QXy1MhZHkhuChc1dffbWQm6JnfG7ZwhDt27cX06ZNE3JTcdGkSRMhd/lX6aZPny7Kli0r1qxZkzafXKWbM2eO6Ny5szh8+HDa8jmQ6yBPS8kYz88RTGTKzytbhGLEiBGidu3aom/fvloIIFMtTIhkgYCJ/h49elS0bNlSDB48WEydOlWcc845okKFCmLfvn1pS4b+psWTNBAtysJvhoSrl156iRo1akRt2rShJUuW0KJFi+jaa69V8c4++2yqUqUKTZw4MSFdrEeu0p1xxhkk/yho5MiRscXhOgOBWJly1IoVK1LPnj2pVq1aGVIWBkOmhSxw5SyBWP2dNWsWyY87uvXWW0kaSXrwwQdp165dNGXKlLSVgv6mxZM0EIYyKRYi7t54+umn6ZprrlExZAtO/daoUSOaolq1asRdH+lcLtN1796dBg4cSPLLMl0VEPY/AvEyNQUDmZqSQ7psCMTrb6tWrahXr17RLBs3bkwlSpQg9k/noL/p6CQPg6FMzkW1Hrdu3UpNmzZVMVi5ypUrR7EHIFeuXFnLUOYqnewupFWrVtHKlStTPAW8Ywlwj0CsTGPDrFznUhcgUyuSCFfcTPo7efJk6tixo+olSUcG+puOTvIwGMrkXNTEneLFi1OlSpVUjIMHD6qvtdjopUuXpry8vFivhOtcpot0F3JXClxmAjyBIVammVMkjwGZJucC39wSSKe/3Np8/vnnadCgQRkrAf3NiCghAgxlApLfPOSAuJpuHVmGwV2uO3bsIDl5JpqCl2nwGGY6l8t0PEbKjusFl5lAvEwzp0geAzJNzgW+uSWQTn9vu+02euihh0hOOMxYCehvRkQJEWAoE5D85tGgQQO1VpGXhbCTs8uU4eSlGRHH3Z6RrtmIX/xvLtNt375dFRdpWcaXjfuiBOJlWjRU/w4y1WeFmPYRSKW/L7zwAvHkvq5du6rC1q9fn3adNfTXukxgKFMw4y8zuaSCWOnYdejQQX2tjRo1St2vXbuW2FDxGkt2O3fupH79+pGcpq3uI//lKh3nv27dOsrPz9f6iozUJ8y/8TKNZXHgwIGESVGQaSwhXLtNIJn+8lru0aNHU/369WnChAk0ZswY9R7idxf01z6J5duXVbBy4rHJG2+8kSZNmkTNmzdXY5EffvghXXfddfTzzz8rIzlkyBA68cQT1YPL9ZT0yiuv0I8//kg8qB5xPIaZi3Sc/8cff0xXXnmlWqYSKQ+/qQnEy5RjsoF84oknaO7cucS9BcOGDaPevXurTCDT1CwR4jyBeP3lyT38PuIu2csuuyxaIbnWW11Df6NIsr9Iuroy4J66i3tla1LIKddCDn4XIbJly5Yi95Gb5cuXC9mqjNwm/NqZTo5LihYtWgg5wJ9QTrwHNhwoJJJKpoUxil5BpkV54C43BLJ9J6WqFfQ3FRlr/jzuFjqnq5QMhnflkWuVEoxlPDQ56UfIlojgF7EVZ5KOdwy65JJLVN10yoKhLEoJMi3KA3fuE8A7yX0ZpKtBHgdm3y71Vw68iUC3bt2imwlkqr38KlNReC9FLzjucuH1nHXr1tWqDm9IULJkyYQxOK3EPokEmfpEUKhmUgLQ36RYPOOJMUoNUXjFQEaqqjMFPBIXv8kJQKbJucDXHwSgv87KCbNeneWN0kAABEAABHxGAIbSZwJDdUEABEAABJwlAEPpLG+UBgIgAAIg4DMCMJQ+ExiqCwIgAAIg4CwBGEpneaM0EAABEAABnxGAofSZwFBdEAABEAABZwnAUDrLG6WBAAiAAAj4jAAMpc8EhuqCAAiAAAg4SyDUGw6EcFMiZ7XLhdIgUxego0jbCEB/bUNpa0ahNJSnn3469ejRQ/2zlaaHM+Mt74LsINMgSzf4zwb99baMQ7nXq1siueCCC9QRXLt376Zy5cq5VQ2UayMByNRGmMjKcQLQXz3kGKPU45R1LHksFn333XfKQH7wwQdZ54cM3CcAmbovA9TAnAD0V58dDKU+q6xivvfee1SiRAnas2cPvfrqq1nlhcTeIACZekMOqIUZAeivPjd0veqzyipmq1at6Pvvv1d58JFX69ato8qVK2eVJxK7SwAydZc/Ss+OAPRXnx9alPqsjGNu2LCB5s+fH02fn59P48aNi97jwn8EIFP/yQw1LiQA/S1koXMFQ6lDKcs4Y8aMoWLFClHv27ePhgwZkmWuSO4mAcjUTfooO1sC0F9rBNH1ao2XUezGjRvT4sWLi6Tl5RrLli2jWrVqFfHHjT8IQKb+kBNqmZwA9Dc5l1S+hc2cVDHgnxWBFStW0OrVqxPyyMvLo5EjRyb4w8P7BCBT78sINUxNAPqbmk2qEBjKVGRs8n/rrbco2W4bBw4coGHDhtlUCrJxkgBk6iRtlGU3AeivdaLoerXOzFKKZs2aqW5XnsDDBpP/RcYr2Vhu3LiRCgoKLOWJyO4SgEzd5Y/SsyMA/bXOD4bSOjNLKQ4ePEi7du1SacaPH08ff/xxtCVZunRpKl++vKX8ENl9ApCp+zJADcwJQH+tswvlXq/WMZmn4Ek7VapUURlUqFCBYu/Nc0VKNwnEyhAydVMSKNuEAPTXOjWMUVpnhhQgAAIgAAIhIgBDGSJh41FBAARAAASsE4ChtM4MKUAABEAABEJEAIYyRMLGo4IACIAACFgnAENpnZlxCt5kILI0xDgTJPQUAcjUU+JAZSwSgP7qAYOh1ONkSyxeQ3ns2DFb8kIm3iAAmXpDDqiFGQHorx43GEo9TogFAiAAAiAQUgIwlCEVPB4bBEAABEBAjwAMpR4nxAIBEAABEAgpARjKkAoejw0CIAACIKBHAIZSj5MtsXjGK88ygwsOAcg0OLIM45NAf/WkDkOpx8mWWDzjlWeZwQWHAGQaHFmG8Umgv3pSh6HU44RYIAACIAACISUAQxlSweOxQQAEQAAE9AjAUOpxQiwQAAEQAIGQEoChDKng8dggAAIgAAJ6BGAo9TghFgiAAAiAQEgJwFA6KHhsQOwgbIeKgkwdAo1ickIA+quHFYZSj5MtsbABsS0YPZUJZOopcaAyFglAf/WAwVDqcUIsEAABEACBkBKAoXRQ8OjmcBC2Q0VBpg6BRjE5IQD91cMKQ6nHyZZY6OawBaOnMoFMPSUOVMYiAeivHjAYSj1OiAUCIAACIBBSAnnyiwKbj9osfEa6aNEimjx5Mi1ZskT927ZtG23fvp0OHjxIlSpVogoVKlC9evWoYcOG1KpVK2rTpg2VKlXK5pogO7sIQKZ2kUQ+bhCA/mZHHYYyO35FUn/33Xc0cuRIev/996ls2bLUqVMnatCgATVt2pQqVqxI5cuXV8Zw586dtHv3blq8eDEtX76cpkyZQj/++CNdcMEFdMMNN1CXLl2odOnSRfLGjTsEIFN3uKNUewhAf+3hyKdZwGVB4OjRo+Ldd98VZ5xxhmjSpIl47LHHxJo1ayznuGvXLjFmzBhx0UUXiSpVqohHH31UyFao5XyQIHsCkGn2DJGDewSgv/azh6HMgunMmTNFixYthOw2FR999FEWORVNKluZomfPnqKgoEAMGzZMsOLDOUMAMnWGM0rJDQHob264wlAacJXjjOJvf/ubqFatmhgxYoRBDnpJFi5cKFq3bi3OO+888csvv+glQiwjApCpETYk8ggB6G9uBYFZrxa7sDdv3kzt27enuXPnqgk7suVnMQf96LIrl6ZNm0ZXXHEFtWzZkr788kv9xIipTQAy1UaFiB4kAP11QCi5tcPByn3Pnj2icuXKYuDAgUKeDO7ow02dOlVUrVpVjBs3ztFyg14YZBp0CQf7+aC/zsgXXa+anNeuXSvkTFYxYMAAzRT2R5szZw4v5RHffvut/ZmHMEfINIRCD9AjQ3+dEyYMpQbrLVu2CLnMQwwaNEgjdm6jzJo1SxnLL774IrcFBTx3yDTgAg7440F/nRUw1lFqdG9fdtlldPrpp9MTTzyhETv3UXjc8sorryQ5w41q1aqV+wIDWAJkGkChhuiRoL/OChuTeTLwlq1ItTmAXNeYIaZzweeccw7dc889dO2115IcK3Wu4ICUBJkGRJAhfQzor/OCR4syDXM5BkBnnnkm/fDDD1SnTp00MZ0Pkh0PJJeNEM+6/fOf/+x8BXxaImTqU8Gh2ooA9NcdRYChTMO9W7dudPbZZ9N9992XJpZ7QbwFXrt27dRWeCeeeKJ7FfFRyZCpj4SFqiYQgP4mIHHEA4YyBeYFCxaQ3E6OVq1a5el9V3v37k01a9akhx9+OMWTwDtCADKNkMCvHwlAf92TGgxlCvY8/setyb/85S8pYnjDW+4rS82bNyfukilTpow3KuXRWkCmHhUMqqVFAPqrhSknkWAok2DdsWMHnXzyycr4HH/88UlieMvr8ssvpx49etD111/vrYp5qDaQqYeEgapYJgD9tYzM1gSY9ZoE5zvvvEM8/doPRpKrf9NNN6njvZI8Crz+RwAyhSr4mQD0113pwVAm4f/JJ5+oMyGTBHnSi4263K2H9u3b58n6eaFSkKkXpIA6mBKA/pqSsycdDGUcR3mklTpImTc+94s77rjj1DglG0u4RAKQaSIT+PiHAPTXfVnBUMbJgJdcyOOzSG5AHhfi7dvzzz+fZsyY4e1KulQ7yNQl8CjWFgLQX1swZpUJDGUcvqVLl1K9evXifJ27feaZZ4wK4zovWbLEKG3QE0GmQZdwsJ8P+uu+fGEo42SwbNkyaty4cZyv3i1vJ5dqS7mIf+Q3kiPf8y477N5//33j/WS5zsuXL49ki98YApBpDAxc+o4A9Nd9kcFQxslg9+7dVK5cuTjfzLdvvfWW2kqudevWasPySIqvvvqKLr30UrUvK6935MOYDx8+TMOHDyeO+8gjj9Cpp55KXbt2Vfu3cvm///3v6fvvv49kofXLdd61a5dW3LBFgkzDJvFgPS/013155rtfBW/VQB6ESqeccoqlSvFg+913303yvEg1vvmnP/1JpeddfdhIctcJn/Lxwgsv0J133qnCCgoKomOK/+///T/VquQJRI899hh9/PHHlsrnyLyUhesOl0gAMk1kAh//EID+ui8rtCjjZFCsWDHV4ovzTntbvHhxOuGEE+jqq6+mFStW0MCBA1X8l19+merXrx89Cou3mos4XtLBZd1+++1qHeTNN9+sgvLy8iJRLP1yK5Xzg0skAJkmMoGPfwhAf92XFd6scTIoX768OlYrzjvj7dChQ9UYYbNmzUgeqqzi//TTT1EjGZ8BG0T+AyhdunSRIFNDyd0zXHe4RAKQaSIT+PiHAPTXfVnBUMbJgE/h2L59e5xv+luekMNdn/PmzaOOHTuqbtht27ZRgwYNaNasWdHEkUk7UQ8bL7i8SpUq2ZhjcLKCTIMjyzA+CfTXfanDUMbJoGHDhrRw4cI43/S3PEY5YMAAql69On300Ud06NAhWrlyJXXu3Jk2b96swnjXnO+++y6aEadhwxm7mw5vas57Ou7cuVONa0Yja1wsWrRIGWaNqKGLApmGTuSBemDorwfEKV/WcDEE5AQcISfexPhkvpSGUUgjJ2677TZx//33i759+6pEBw4cEBdccAGv/RCytSfkuKS6PnjwoIrL/vJgaDF9+nQVX04DF3IikahRo4b4+uuvMxccE0OeciLkyecxPriMEIBMIyTw60cC0F/3pcatGrg4Amwo5eL9ON/0t3IyjZBdtmLv3r0JETds2CBkC1KMHj1aGUo2rKmcbGEKNrBW3WmnnSZmzpxpNVlo4kOmoRF1IB8U+uuuWNH1mqRVz8s0ZIsuSUhqr/z8fDXzNdmZkCeddJKauCMNoMpAijxlRrxva6lSpVKGJwvYsmULrVu3jmTrNFkw/CQByBRq4GcC0F93pQdDmYT/lVdeSW+//XaSEHMvHp985ZVXVAZPPfWUeUZJUo4aNUptUsDGGi45Acg0ORf4+oMA9NddOeHg5iT8eU0ir3mUXZnqAOckUSx78QQf/seOl4Uka3lazvR/CVq1akWPP/64mnFrmkfQ00GmQZdwsJ8P+uuufNGiTMK/RIkSxBsA/POf/0wSauZVsmRJtTUebzVnp5HkLfJ4lmyHDh3MKhaSVJBpSAQd0MeE/rorWLQoU/D/9ddf1ebovFSEt5vzqrvooovouuuuU7v7eLWOXqkXZOoVSaAeJgSgvybU7EmDFmUKjlWqVKFbbrmF/vrXv6aI4b73Bx98QL/88gtdf/317lfGBzWATH0gJFQxJQHob0o0uQ9wd9Ktt0uXmxGL2rVri8mTJ3uuoryM5OSTTxaTJk3yXN28XCHI1MvSQd0yEYD+ZiKUm3B0vWb4Fvnyyy/pxhtvVCeDVK1aNUNs54KvueYatWXd4MGDnSs0ICVBpgERZEgfA/rrvODR9ZqBOe/d+sc//pFuuOGGlIcyZ8jC9uBXX32VFi9eTHInHtvzDkOGkGkYpBzcZ4T+uiDb3DRUg5Ur76rTrVs3tasOX7vp5CklQi5dEWvXrnWzGr4vGzL1vQhD/QDQX2fFj65XzY8TPiGkefPmVLduXXrnnXdcOftR7iWrNi3gDdetHi6t+ZihigaZhkrcgXtY6K9zIkXXqyZr3iSANyCQX3J06aWXEk/VdtI98cQT9Mknn9CmTZtgJG0CD5naBBLZuEIA+uscdhhKC6x50e97771HcgNyta/qt99+ayG1WdSNGzcqw/zZZ5+pY7q8NKHI7Im8lQoy9ZY8UBtrBKC/1ngZx3a2pzc4pUnDpY7j6tmzp5CtS9sfjE8jkTNahTy0VfzjH/9Qp4/YXggyLEIAMi2CAzc+IwD9zZ3A0KI0/MTgHXEiu/bwwaryPEh1godhdtFk+/fvp2HDhlG9evVU65U3U+dDobmbBS63BCDT3PJF7rklAP3NId/c2eDw5MznTcodfFTrT+65Kt544w3Bh63qOrlXq/joo49E7969xfHHHy8uv/xyIQ2kbnLEywEByDQHUJGlYwSgv/aixqxXGz9CDh48SP/5z3/o3XffJd6svHz58tSgQQNq0qSJ2hyA73lzdN7EXO6wQT/99BMtX76c5CHR1KZNG+rcubNas+nlvWVtxOWLrCBTX4gJlUxBAPqbAoxFbxhKi8CsROdNAZYuXar+8eHKfBj03Llz6fbbb6cKFSqo7lU2pKeffroyoFbyRlx3CECm7nBHqfYQgP6acYShNONmlKpp06a0aNEitZF5jRo1jPJAIm8RgEy9JQ/UxhoB6K8eL8wQ0eOUdazVq1cTbxRw3HHH0ejRo7PODxm4TwAydV8GqIE5AeivPjsYSn1WWcV8++23SQ4vE89qHTJkSFZ5IbE3CECm3pADamFGAPqrzw1dr/qssopZp04dWrNmjcqjdOnSNH/+fKpfv35WeSKxuwQgU3f5o/TsCEB/9fmhRanPyjgmr7fcvHlzND3v0ThixIjoPS78RwAy9Z/MUONCAtDfQhY6VzCUOpSyjMNG8ciRI9FcDh06RK+//nr0Hhf+IwCZ+k9mqHEhAehvIQudK3S96lDKMk6VKlWIl4fEurJly9KUKVPorLPOivXGtU8IQKY+ERSqmZQA9DcplpSeaFGmRGNPAG9Bd+DAgYTMeCHwm2++meAPD+8TgEy9LyPUMDUB6G9qNqlC0KJMRcYm/+uuu47GjRtHPC6ZzLF/Xl5esiD4eZQAZOpRwaBaWgSgv1qYikTKL3KHG9sJ8DE4fDQWb2ouTwRR/8qUKaPK4TWV3CXL3SBw/iEAmfpHVqhpIgHobyKTTD5oUWYiZGP4O++8o/aB5V+4YBCATIMhx7A+BfRXT/IYo9TjhFggAAIgAAIhJQBDGVLB47FBAARAAAT0CMBQ6nFCLBAAARAAgZASgKEMqeDx2CAAAiAAAnoEYCj1OCEWCIAACIBASAnAUDooeF4igjWTDgJ3oCjI1AHIKCJnBKC/emhhKPU42RKLNxfgo7bggkMAMg2OLMP4JNBfPanDUOpxQiwQAAEQAIGQEoChDKng8dggAAIgAAJ6BGAo9TghFgiAAAiAQEgJwFCGVPB4bBAAARAAAT0CMJR6nGyJxTNeeZYZXHAIQKbBkWUYnwT6qyd1vLX1ONkSi2e88iwzuOAQgEyDI8swPgn0V0/qMJR6nBALBEAABEAgpARgKB0UPLo5HITtUFGQqUOgUUxOCEB/9bDCUOpxsiUWujlsweipTCBTT4kDlbFIAPqrBwyGUo8TYoEACIAACISUAAxlSAWPxwYBEAABENAjAEOpx8mWWBgPsAWjpzKBTD0lDlTGIgHorx4wGEo9TrbEwniALRg9lQlk6ilxoDIWCUB/9YDBUOpxQiwQAAEQAIGQEoChdFDwOPvNQdgOFQWZOgQaxeSEAPRXDysMpR4nW2Lh7DdbMHoqE8jUU+JAZSwSgP7qAcvXixasWPv27aPvvvvO8YdasGABbdq0iSZOnOh42XXr1qU6deo4Xq5TBUKmTpFGObkgAP3NBVX78syTg7nCvuz8kVOvXr3ozTffpPbt2zta4aNHjxL/K1mypKPl8lfj119/TUEWNWTqqEqhMJsJQH9tBmpzdqFsUe7du5fGjBlD11xzjc04vZmdG8bZaRKQqdPEUZ6dBKC/dtK0Py+MUdrPFDmCAAiAAAgEiAAMZYCEiUcBARAAARCwnwAMpf1MkSMIgAAIgECACMBQBkiYeBQQAAEQAAH7CcBQ2s8UOYIACIAACASIAAxlgISJRwEBEAABELCfAAyl/UyRIwiAAAiAQIAIwFAGSJh4FBAAARAAAfsJwFDazxQ5ggAIgAAIBIgADGWAhIlHAQEQAAEQsJ8ADKUGU94rlbeYirht27YZ7ZtqV7o9e/YQ1wnOnEC8TDmnWBnr5gyZ6pJCPDsJxOvv5s2b8U6yE3BcXjCUcUDib/fv3099+vQhVsSlS5dS27ZtacCAAdSuXTsaP358fPSk93an27BhA/Xv358OHTqUtDx4picQK1OOOX/+fOrSpQvde++96RPGhEKmMTBw6SiBWP2dOXMmtW7dmgoKCqhevXo0fPhwrbpAf7UwFUbi00PC5q6++moxduzYjI8tWxhCnjAipk2bJo4cOSKaNGkiHn30UZVu+vTpomzZsmLNmjVp88lVujlz5ojOnTuLw4cPpy2fA7kO8oDWjPH8HMFEpvy8skUoRowYIWrXri369u2rhQAy1cKESBYImOivPOxAtGzZUgwePFhMnTpVnHPOOaJChQpCHtmVtmTob1o8SQPRoiz8Zki4eumll6hRo0bUpk0bWrJkCS1atIiuvfZaFe/ss8+mKlWqZDxbMlfpzjjjDJJ/FDRy5MiEesMjNYFYmXKsihUrUs+ePalWrVqpE8WFQKZxQHDrGIFY/Z01axbJjzu69dZbSRpJevDBB2nXrl00ZcqUtPWB/qbFkzQQhjIpFiLu3nj66aejR3HJFpyKWaNGjWiKatWqEXd9pHO5TNe9e3caOHCgOuMyXR0Q9huBeJmacoFMTckhXTYE4vW3VatWxOdYRlzjxo2pRIkSxP7pHPQ3HZ3kYTCUybmo1uPWrVupadOmKgYrV7ly5ahUqVLRFJUrV9YylLlKJ7sLadWqVbRy5cponXCRmgD3CMTKNHXM9CG51AXIND37MIdm0t/JkydTx44dVS9JOk7Q33R0kofBUCbnoibuFC9enCpVqqRiHDx4UH2txUYvXbo05eXlxXolXOcyXaS7kLtS4DIT4AkMsTLNnCJ5DMg0ORf45pZAOv3l1ubzzz9PgwYNylgJ6G9GRAkRYCgTkPzmIQfE1XTryDIM7nLdsWMHyckz0RS8TIPHMNO5XKbjMVJ2XC+4zATiZZo5RfIYkGlyLvDNLYF0+nvbbbfRQw89RHLCYcZKQH8zIkqIAEOZgOQ3jwYNGqi1irwshJ2cXaYMJy/NiDju9ox0zUb84n9zmW779u2quEjLMr5s3BclEC/ToqH6d5CpPivEtI9AKv194YUXiCf3de3aVRW2fv36tOusob/WZQJDmYIZf5nJJRXESseuQ4cO6mtt1KhR6n7t2rXEhorXWLLbuXMn9evXj+Q0bXUf+S9X6Tj/devWUX5+vtZXZKQ+Yf6Nl2ksiwMHDiRMioJMYwnh2m0CyfSX13KPHj2a6tevTxMmTKAxY8ao9xC/u6C/9kks376sgpUTj03eeOONNGnSJGrevLkai/zwww/puuuuo59//lkZySFDhtCJJ56oHlyup6RXXnmFfvzxR+JB9YjjMcxcpOP8P/74Y7ryyivVMpVIefhNTSBephyTDeQTTzxBc+fOJe4tGDZsGPXu3VtlApmmZokQ5wnE6y9P7uH3EXfJXnbZZdEKybXe6hr6G0WS/UXS1ZUB99Rd3Ctbk0JOuRZy8LsIkS1bthS5j9wsX75cyFZl5Dbh1850clxStGjRQsgB/oRy4j2w4UAhkVQyLYxR9AoyLcoDd7khkO07KVWtoL+pyFjz53G30DldpWQwvCuPXKuUYCzjoclJP0K2RAS/iK04k3S8Y9All1yi6qZTFgxlUUqQaVEeuHOfAN5J7ssgXQ3yODD7dqm/crjmmmuoW7du0c0EMtVefpWpKLyXohccd7nwes66detqVUdudUUlS5ZMGIPTSuyTSJCpTwSFaiYlAP1NisUznhij1BCFVwxkpKo6U8AjcfGbnABkmpwLfP1BAPrrrJww69VZ3igNBEAABEDAZwRgKH0mMFQXBEAABEDAWQIwlM7yRmkgAAIgAAI+IwBD6TOBobogAAIgAALOEoChdJY3SgMBEAABEPAZARhKnwkM1QUBEAABEHCWAAyls7xRGgiAAAiAgM8IwFD6TGCoLgiAAAiAgLMEQrnhAG8izCd/TJw40VnaLpXGmy9FztV0qQo5LxYyzTliFJBDAtDfHMK1IetQGso77riDeIf9EiVK2IBQPws+deSXX36hNm3a6CeyKWbfvn1tysmb2UCm3pQLaqVHAPqrx8mtWKHc69Ut2Hy46rx582jjxo1UUFDgVjVQro0EIFMbYSIrxwlAf/WQY4xSj1PWsbgluXjxYjruuONo7NixWeeHDNwnAJm6LwPUwJwA9FefHQylPqusYvIp5HyI8/79++m1117LKi8k9gYByNQbckAtzAhAf/W5oetVn1VWMevXr0+R47pKly5NfFTWKaecklWeSOwuAcjUXf4oPTsC0F99fmhR6rMyjrl06VJat25dND3PQh05cmT0Hhf+IwCZ+k9mqHEhAehvIQudKxhKHUpZxnnrrbeKHJp88OBBGj58eJa5IrmbBCBTN+mj7GwJQH+tEUTXqzVeRrGrVaumZrrGJi5TpgxNnz6dmjVrFuuNa58QgEx9IihUMykB6G9SLCk90aJMicaegFmzZtHu3bsTMjt8+DC9+eabCf7w8D4ByNT7MkINUxOA/qZmkyoELcpUZGzy7927tzKIR48eTciRJ/XwLFg4fxGATP0lL9S2KAHob1EeOneh3JlHB4xdcbZs2ULczVqsWDG1jRwbzNgdgTZv3kxVq1a1qzjk4wAByNQByCgiZwSgv9bRokVpnZlxinfeeYfeffdd4l+4YBCATIMhx7A+BfRXT/IYo9TjhFggAAIgAAIhJQBDGVLB47FBAARAAAT0CMBQ6nFCLBAAARAAgZASgKEMqeDx2CAAAiAAAnoEYCj1ONkSizdF59mvcMEhAJkGR5ZhfBLor57U8dbW42RLLN7j9dixY7bkhUy8QQAy9YYcUAszAtBfPW4wlHqcEAsEQAAEQCCkBGAoQyp4PDYIgAAIgIAeARhKPU6IBQIgAAIgEFICMJQhFTweGwRAAARAQI8ADKUeJ8QCARAAARAIKQEYSgcFj6nYDsJ2qCjI1CHQKCYnBKC/elhhKPU42RILU7FtweipTCBTT4kDlbFIAPqrBwyGUo8TYoEACIAACISUAAxlSAWPxwYBEAABENAjAEOpxwmxQAAEQAAEQkoAhjKkgsdjgwAIgAAI6BGAodTjZEsszDCzBaOnMoFMPSUOVMYiAeivHjAYSj1OtsTCDDNbMHoqE8jUU+JAZSwSgP7qAYOh1OOEWCAAAiAAAiElAEMZUsHjsUEABEAABPQIwFDqcbIlFsYDbMHoqUwgU0+JA5WxSAD6qwcMhlKPky2xMB5gC0ZPZQKZekocqIxFAtBfPWAwlHqcso61e/du2rZtG+3du5e2b99OR44cyTpPZOAuAcjUXf4oPTsC0F99fnnyi0LoR0dMHQI//fQTff311/TVV1/R4sWLaenSpVSiRAkqV64clSpVinbu3KkMZs2aNalBgwbUpk0b6tChg/rNz8/XKQJxHCYAmToMHMXZSgD6mx1OGMrs+EVTcytx2LBh9Pbbb9OuXbvoggsuoE6dOlHjxo3Vv9KlS0fj8gV/nyxfvlz9Y6M6efJkWrlyJV177bXUp08fatKkSZH4uHGeAGTqPHOUaB8B6K99LPmFDZcFAamM4p577hEVK1YUvXv3FtLoGee2YsUK8fDDD4uTTjpJdOnSRcybN884LyQ0JwCZmrNDSvcJQH/tlwEMZRZMhw8fLgoKCsTtt98u1q5dm0VORZMeOHBAvPjii9G8ZQu1aATc5YwAZJoztMjYAQLQ39xAhqE04Lp161bRvXt30aJFCzFr1iyDHPSSyMk/QnbDilNPPVXMmDFDLxFiGRGATI2wIZFHCEB/cysIGEqLfNesWSPq1asn+vXrJw4fPmwxtVn0d955R1StWlXwL5z9BCBT+5kiR+cIQH9zzxqG0gLjzZs38wxh8cgjj1hIZU/UJUuWiOrVq4sPP/zQngyRiyIAmUIR/EwA+uuM9GAoNTmvWrVKGapXX31VM4X90dhYsqEeM2aM/ZmHMEfINIRCD9AjR/T3lVdece2pwvJOgqHUUDEeK6xfv754/fXXNWLnNsrs2bPVrNiJEyfmtqCA5w6ZBlzAAX886K+zAsY6So2lNj169CC5/IPkl5tG7NxH+eKLL+imm26iuXPnUpUqVXJfYABLgEwDKNQQPRL011lhYwu7DLzfeustWrZsGb300ksZYjoXzBsZ/PnPf6ZbbrnFuUIDVBJkGiBhhvBRoL8uCN3ZBqy/SpNbzYlq1aqJ6dOne67ivNaybt264r///a/n6ublCkGmXpYO6paJAPQ3E6HchKPrNc3HyQMPPEByfRLJCTxpYrkX9Pnnn9Ndd91FP/74I/FxOXCZCUCmmRkhhncJQH/dkQ0MZQruvLN+nTp16Pvvvye54D9FLPe95aYH9OCDD9If/vAH9yvj8RpAph4XEKqXlgD0Ny2enAZijDIF3hEjRtCll17qaSPJVf/HP/5Bzz33XIqngHcsAcg0lgau/UYA+uuexGAoU7AfOXIkXX/99SlCvePduXNnWrhwIcm9Zr1TKY/WBDL1qGBQLS0C0F8tTDmJBEOZBOvq1avp559/posuuihJqLe8SpYsSTxV/N///re3Kuax2kCmHhMIqmOJAPTXEi7bI8NQJkHK50O2a9cuZxNkFi1alKTU37zShaVKxGdf8iHRcKkJQKap2SDE+wSgv+7KCIYyCX9WSl6raLf75ZdfqGPHjnTaaaclZJ0uLCFynAfn+c033/AuS3EhuI0QgEwjJPDrRwLQX3elBkOZhP/ixYupUaNGSUKy86pZs6baJKB48eIJGaULS4gc53HCCSfQcccdR+vXr48LwW2EAGQaIYFfPxKA/rorNRjKJPzlRr/UtGnTJCGZvY4dO0YHDx5MGvHIkSNUokQJKlYsEXu6sKSZxXk2adKEuN5wyQlApsm5wNcfBKC/7sop393ivVc6Gzq5+wVxK82qu++++2jfvn0kD3OmZs2a0ZAhQ1QWn332GT399NNUUFBA8+bNKzL2mS7MSvmVKlVSmyNYSROWuJBpWCQdzOeE/npArrnZ8Me/ue7YsUNUqFDB8gPIMUJ1BBbv6r9ixQp1vWnTJiFnq4nSpUsLOYtW5dmnTx9RqlQpdZ0uzGoFbr75ZjF8+HCryUIRHzINhZgD+5DQX/dFm9gH6AHj7WYVjh49Srzkwqo766yzaOzYsWqskFuJ7FauXEmDBw8meUQX8Rgkuw4dOkRblOnCVGQL/3Gdue5wiQQg00Qm8PEPAeiv+7KCoYyTgWxN0vbt2+N8M9+WKVOGDh06RF26dKGqVauqBNxlwss9atSoEc0gPz8/aijThUUTaF7Ir04qX768ZuxwRYNMwyXvoD0t9Nd9iWKMMk4GbMi4dbZ//37VOowLTnkrD1Kmfv36qR1yZEdBNB7vFztq1Ci1dCN+4/J0YdEMNC94H0j+g4JLJACZJjKBj38IQH/dlxValElkwF2lP/30U5KQ1F68zolnu+7Zs4c+/fRTFXHXrl102WWXqRYqG0t2CxYsUPHWrVtHV155ZcowFdnCf9w6bdCggYUU4YoKmYZL3kF7WuivyxJ1f5jUezW46qqrhBxvtFSxOXPmiMqVK4vjjz9ePPTQQ6JevXqidu3aYunSpaJnz55CLglR961atRJyvFLIEz+EXBKSMsxK4dJAC7mOUhw+fNhKslDFhUxDJe7APSz0112R4pitJB8qzz//PPECX6vnUPIYJXev8lpJabSINxaIrJnk1iV36Upxk5z1GvXn4tOFJalegtcXX3xBAwYMULvzJATCQxGATKEIfiYA/XVXehijTMKfZ6a+9tprSULSe8XOlmVjGevSjR+mC4vNI9X15MmTqX379qmC4S8JQKZQAz8TgP66Kz2MUSbhz5sF8Hij7E5NEuo9r9GjR+Pg5gxigUwzAEKwpwlAf90VDwxlEv7cfSrHFYnPf/O6mzZtGvHSFF7HCZeaAGSamg1CvE8A+uuujDBGmYI/H4R8xhlnqE0DTLazS5Gt7d5du3ZV3Yp33HGH7XkHLUPINGgSDdfzQH/dkzcMZRr2vXr1olNPPZXkDNU0sdwL4iUhF154Icmt8NQEIfdq4p+SIVP/yAo1TSQA/U1k4oQPDGUayrwFnVzOocYqa9WqlSamO0E8gYfXYt5+++3uVMCHpUKmPhQaqhwlAP2NonD0AmOUaXBza5KN0N13350mljtBvK8sb1vXt29fdyrg01IhU58KDtVWBKC/LimCu8s4vV/6gQMHxJlnnilefvllz1R22bJlanMD3uQAzjoByNQ6M6TwDgHor/Oy4AXwcBkIyO3shNzoXMht6jLEzH3w3r17leF+4YUXcl9YgEuATAMs3BA8GutvlSpVPPNOkhMfRZDfSRij1GzJf/nll9SpUyeaMWOGGrfUTGZrND4U+rzzzlP/eKcOuOwIQKbZ8UNqdwl4RX/btm1L7dq1oyC/kzBGqanrHTt2pO+++07tgDNz5kzNVPZFky1JKlu2LF1xxRWBVkj7iGXOiWU6ffp0yDQzKsTwIAHor4NCCUEvha2P+N///ld1w44ZM8bWfNNltmTJEvG73/1O3HnnnemiIcyQAGRqCA7JPEEA+pt7MWCM0oCx3CxdyH1dxZ///Gexc+dOgxz0k8jdgUSlSpXESy+9pJ8IMS0TmDVrljrxRc5ydkSmcn9f9fGzbds2y3VFAhCIJ+C0/obtnYSuVwutdz7lg7e24yUjvFsPnxbSqFEjGjduHB07dsxCTpmjzp07l84//3zVzfrVV1+pQ6Ezp0IMUwLNmzdX62X5PFEnZPrss8/SwoULiQ/vfuedd0yrjXQgoAg4rb+heyfFf5ngPjmBjz76SEjjKEqXLq1ak3zmJDs5xiXatGmjWiNvvPGGkMY0eQYavkePHhVygF5cfvnlolq1aoJbruwH5ywBJ2TKcuVWpXzLCTn2LOTmEUJuUebsg6K0QBJg/eUZsfIjTNj1TurcubPSV/mBF8p3ErpeM/ypbN68Wfz+978XcuNx9VLjFxsfkizPqyySkpeOdOnSRSnTH//4RzFs2DCtFx933Y4fP17cdddd6kBnubm5GDJkiODDmOHcJZBrmd5yyy1Cnlmq9Co/P1/p1XPPPRfKF5G7kg5O6bJnS/Tu3Vt90D/yyCO2vZNeeeUVpadsfDdu3BgcYJpPguUhabpu3n77bbr11ltVFyt3s0bcySefrPZXjdzH/soxJ3r//feJuybki5a2b99OTZo0IfmFR+XLl1d7svKOOrt37ya5Fop4yYeUFXHXyeDBg6lp06ax2eHaAwRYptw9yl3ufHaoXPCdUaayl0FtVi8/slLKlE9+ufjii4m7eyOOZzazfnF3/mmnnRbxxi8IZCQgeymoR48eNGHCBHVo/Lfffkunn346mbyTkunvSSedRFu3blXvMp4tXrt27Yx1CkoEGMokkly+fDn96U9/IjlArgxZbBQ+nPn++++nhx9+ONY75TUbRNn6pC1btijjeOTIEWUw2Wg2aNCAZBcryRmtaryKX5xnn312yrwQ4B6BPn360KhRo0h+WauzPzPJlI9FyuT4A6ly5crqRRYbl9OWKlWKZIuT5CLu2CBcg0BSAnx+Ln+UTZ06Vb2zZE8F8ZwKPoIv3um8k5Lp77nnnkv8juK8jz/+eHXdsGHD+OyDea/Z8gxVNJ75KF9U0a5WKfnodbJu12zhcHcGl1G9enUhW5jZZof0NhP45ptvVLdoiRIlxD//+U9bc+clP9ztGqtjsde2FobMAklA9kioeRL8boroDs+nsNvJj8Vo/tKQqmGmsGyjiVmvUrPi3cCBA9XxVdwNFu8KCgrI7q8o7oplx920XtyAPZ5BmO73799PV111FfHv4cOHad26dbY+/g033JBwRBp/zbPuffbZZ7aWhcyCR4DfHdxNKg2W0tHIE8qP78ilbb88FCAnM6r8pBFWLVbelYdbmUF3MJRJJMxLPz755BP629/+RtzVGnF8feONN0ZubfuNjFHxy3jEiBE0efJk2/JGRtkRuOeee0hOuIpmwofn2ul4bJq74SOOu1z5Y2z27Nl00UUXRbzxCwIJBHjsUU7+I7khiRo3j42Qi7kO9evXT/io4x3DeIegzz//PLb4wF3DUKYQKffvv/XWW3TfffepNZOy2031zV933XUpUph5s6LFukgLhscR4NwlwFsWvv7660W+1O1uUfIT8seX7H5VrUh+6bRo0QLbFLorel+UzhMEf/75ZzXZMLbC/K7ieQ92OzaUPMci3vE7Sy4fSTnBMT6+H+9hKFNI7aabblKboA8YMEBNxmEladasmZqAkyKJkTfPIuNWRKxjI8mzbeHcI8AzW7t3757wpf7rr7/aXimeTcsvoH/84x/0n//8h0aPHk2TJk2iN9980/aykGFwCPAM7Ph3Bz+dHKskfl/Z7Xg2Nv9dxDseJuAyeUJRYJ3dA75ByI8nbLRq1arIWkb5IhNr1qyx/fFkF1t04blUsuhgOQ/My2netpeHDPUI3HHHHWoCT6xM+FrO9tPLwGKspUuXFknBxyjxNmGsH3AgkIqA/KASjRs3VusmI7oqu/LFjz/+mCpJVv68EUqkHN58pVy5cuJf//qXelfKMfys8vZyYrQopdRjnZzhSLy92HvvvVdkfJKnROdi3RAvG0k2FZu7My699FI1wSe2frjOPQEeI5a7IhXpco2Umqsu8fgWAG+jJzetoG7duiUsH4nUBb8gIHd0olNOOUV135966qmq+551tG7dujmBw2VxK5ZbkdwTwt281157rXpX8vBBUF1wn8xAYhs2bKBrrrlGjU3WrFnTIAfrSbjrNXaf2GLFipH8SlMv6datWyft6rBeClJYJcAvA34JsONNISKOXwY8ieLEE0+MeOXs9w9/+IM6Box1kmfAsm7AgUAsAR5Hl61H+uCDD5S+jh07Vk0GjMxOjY1rx/VTTz2lNlThdeSRzTeefPJJeuaZZ+zI3rN5YMOB/4mGx4j464x3SnnwwQcdE5jcro54MTvPqOWdL9ix0vHgeLLlKY5VDAWR7A6loUOHqheD3MpQ7aDEk6/YP74FmCtcvNsK66QcCqDHH388V8UgX58SuOCCC4jnU/A/N9ymTZtIdv3SggULqEaNGm5UwZEy8Yn6P8z/93//p3abeOCBBxwBHylEHtVF/BXIyw7kGKiaMCT76mEkI4Bc/OWdk3iCAn/IcHfW999/r7YHc8pI8qNzlz9vZ8e7AnGrAQ4EIgS++OILkvuuEq/FdcvxUiZ+h/Ha8yA7tCildHk8kg0lr13jrZncdM8//7zaA/a1115zsxoo+38EeKYzLxFp2bKlq0xYNy+55BLi/TvZgMOBAPcy8Drfq6++2lUYvFFKvXr11Ickj5MG0YW+RcmLdfv27Uvvvvuu60aSFaxTp07EX4pw7hPgiVbc0udF3W47rgOPD8kTalTr1u36oHx3CcgTh9T6Sd41ym1XsWJFklsxEo9bBtWF2lDyeFPXrl3VC+jMM8/0hIx5Rw2u1+rVqz1RnzBXgk+Aadeuner+9AKHm2++mXhMKhe7Q3nh+VAHPQI8NMNDRI899ljSGfN6udgbSx4TqCacLVq0yN6MPZJbqA2lPLeNzjnnHOrVq5dHxPFbNXjrsqBvCeUp4Ckqw4aSJ3h5yck1a7R+/Xr1ceeleqEuzhHgOQ28zeZll13mXKEZSuJtGHnLT3mgfYaY/gwOraF88cUX1R6JL730kuckh+5Xb4jEi4aSZ0fzmDobzC+//NIboFALxwhEdnB69NFHHStTtyDeTYyXq/zwww+6SXwTL5STefjQ0SuuuIJmzJihFut6TVq8npMPXOUlCck2I/BafYNYH572zgdu8zpXL7opU6aoSRysw7y1GFw4CPByJT5E3KvzGHijjg8//JA+/fTTQAkkdC1K3quTB8DfeOMNTxpJ1i4+zLlq1aqB/DLzy18P77XK45NedVw33rD/yiuvxKYUXhWSzfXipUq89zSPTXrV8YH3vM6YdzgLkguVoeTF2z169FCLc73Uv59MofgUCXStJSPjjJ8Xu13jn5wnUPC0/H79+sUH4T6ABLi1xrOfeVmIVx3vZsWzX51ej55rHqEylHw6A28D9sgjj+Saa9b5w1BmjTCrDPxgKPkBeY3nzJkz1d60WT0wEnuaAM+Ef+KJJ8iLY5Px4K6//nrinrsgHTwemjFKPr6IN/HlgWZ5KkO8bD13z4c5864XPEaWq30bPffQHqkQnznJ5/nxH7sfxohXrlypTrn/+OOPPd3a8Ih4fVkN3r6Q93TlI9j84HjCGdc5KBN7QtGiXLFihVoCwoPgfjCS/IfAG6Pz2s6g9fX74Y+cxyd5WYgfjCTz5N1QuGXJJ43wBDC4YBHYuXOnOsjbT9vE8dg5u6Bsuxh4Q8nHVbHQuN/cy337yf60eZnIxIkTkwXBL4cEvv76a+rQoUMOS7A/ax5z53XBPFGNlxDABYfA008/rXZkytXRWbkixZOOeKwy9nSkXJWV63wD3/XKu+rzJJ6RI0fmmqXt+U+dOpXkAcJqD1rbM0eGKQnwmXvy0Gx1KkLKSB4M4B1bLr/8crUX7HPPPefBGqJKVglw93/Dhg1p3rx5VKtWLavJXY9/3nnnqU3T3dy43Q4IgTaUfPAtbyzA6yaPO+44O3g5mge3DPjcw1WrVvmmy9hRQDkojE9w4Z4HXkfpR8fddC1atFCTPvgcSzh/E+CZzdwi4w0m/Oh46Ii3XOQ9tSPnu/rxOQLb9cqDyPfff7/a7NyPRpKViQ8J5r09sUzEuT8tHp/0W7drLB0+/eb9999XE9f4jEA4/xLgSWXcE+bk+bh20+IWJbeIed26n10gDSWfQM/jknwospNnB+ZCEXjfV4xT5oJs8jwnT57sa0PJT8VHg73wwgtqw/8dO3Ykf1D4ep4AL2Pjsx6rVKni+bqmqyAvaeFnOXDgQLpong4LXNcrj9N07txZbQHHg+B+d7wbP0/U4O5XuNwT4HEgblX6/QOLSXG3He+Swkuj/DKDN/cS9kcJy5cvp9atWxP/8gbofnc8I7tt27Z09913+/JRAtei5CnUvNXTk08+6UuBxFea9xvl5+ElLnC5JcCMeTwoCEaSSQ0aNEgd2eanZQW5lbB/cucWGBuVIBhJps4zYPk8Vd44wY8uUIaSd4J47bXXiI+h4R14guLQ/eqMJHlZyIUXXuhMYQ6UUrx4cRo3bhzxRtqffPKJAyWiCDsILFy4UB2z179/fzuy80QejRs3Jn6PPfvss56oj9VKBMaa8GxFnl3FLwbe0SZIjl/eOJ8y9xLlLtfzzz8/9wU5WAL/Lfz73/8mPvQZvRIOgs+iKJ68w2c78qYjQXLcSn7++edp+/btvnusQIxRHjp0iHh21bXXXkt/+ctffCeETBXeuHGjWtPH29kFqaWc6bmdDudTW6ZNm+bZU2Wy4cEbavM/Pi/Qr7PAs3l+v6T9/vvv1SQs/qgpVaqUX6qtXc++ffuq7mS/DY0FwlAyfDYi/OUcVMfnU/I2ZbxGDs5+AjzphbuGVq9ebX/mHsmRN984fPgwjRo1yiM1QjXiCVxyySXUvXt3tctSfFgQ7tevX68mWvIkRT5K0C/O912vvM6IT3pgIxJkh+7X3EqXu115zWqQHbcoFy9erLq/gvycfn02Xpq0bNkydQygX58hU72rV69OPXv29MUpKLHP4mtDOX/+fDUFnk/ULl++fOxzBe4ax27lVqR+OVYrGwp8Cg1vRsDHNWGz/WxI5ibt3//+d3UwM280EmTHG8Fwr8batWt985hFul63bNmiFir7pfa8Yw3PpqpRo4ZxldkAZXuSvRPceDs7ntXLXTM8m9Ft5xduupw+/fRTNZEn1+N3XuDG+4fOnj2bLr74Yl08rsfzArdcQuAtE7k7kns17Fzz6lVu3LPBB1bwCUledPHcihhKXhTKTWM/9R1nA5k3J+BTRfg3GwduZvTADdx0CODvVIdSYhxwS2Si45OMWxFDyZso88srLJsp86kiJUuWVKeL6ABMFQfcUpFJ7w9u6fmkCgW3VGTS+4Nbej6pQsGNyNdjlKkEC38QAAEQAAEQsIsADKVdJJEPCIAACIBAIAnAUAZSrHgoEAABEAABuwjAUNpFEvmAAAiAAAgEkgAMZSDFiocCARAAARCwiwAMpV0kkQ8IgAAIgEAgCcBQBlKseCgQAAEQAAG7CMBQ2kUS+YAACIAACASSAAxlIMWKhwIBEAABELCLAAylXSSRDwiAAAiAQCAJZGUojx07Rnv37m5TskkAAEAASURBVI2C2bZtm9G+qXal27NnD3GdvO7AzUxC8dw4l1j908017PoGbnqaEq9vmzdvxvtNA10QuRkbSt75vU+fPsTKw4fetm3bVh0RwydxjB8/XgMn2Z5uw4YN1L9/fzp06JBW+W5EAjcz6rHcOAc+Yq1Lly507733amdot576Td/ATVtV1MkWkffbzJkzqXXr1lRQUED16tWj4cOHa2UUdn0LFDe5U3rUXX311WLs2LHR+1QX8itetG/fXkybNk3I459EkyZNxKOPPqqiT58+XZQtW1asWbMmVXLln6t0c+bMEZ07dxbyJPe05XMg16FYsWIZ42WKAG6ZCCUPN+HGOckWoRgxYoSoXbu26Nu3b/LM43zDrm/gJoSJvsmDE0TLli3F4MGDxdSpU8U555wjKlSoIPbt2xenYUVvw65vQePGXQlRp6tITz31lLj11ltVuoULF/IZVWLFihXRfOrUqSNef/316H2yi1ymk7vdZyyf6+S0oQS3oppgom+xOZx77rnahjLs+gZu+oYy9u90xowZQrYgo/gmTJig3nfy/NKoX7KLsOtb0LhZ7nrlLrCnn346ehSXbMGpbojYw5OrVatG3OxO53KZrnv37jRw4MCsj89KV3+rYeBmldhv8eO5meVCFHZ9Azc9AvH61qpVK+rVq1c0MR8UX6JECWL/dC7s+hY0bpYNJZ/CvXXrVmratKnSE1aIcuXKUalSpaJ6U7lyZS1Dmat0skuOVq1aRStXrozWye0LcDOTQDw3s1x+M5Rh1jdw0yOQSd8mT55MHTt2pIoVK6bNMJfvRT+83+Lh+J2bZUPJA9TFixenSpUqKRYHDx5UX1ixYEqXLk15eXmxXgnXuUxXq1YtVd6SJUsSynXLA9zMyMdzM8uFKOz6Bm56BNLpG7c2n3/+eRo0aFDGzKBvhYiCwM2yoZSD2GqKNE8BZsddrjt27CA5eSZKhpdpNGrUKHqf7CKX6apUqaKK5Hp5xYGbmSTiuZnlkls99YO+gZsegXT6dtttt9FDDz1EcvJixszC/n6LBRQEbpYNZYMGDdRaRV4Wwk7OCFOGk6fKRxx3e0a6ZiN+8b+5TLd9+3ZVXKRlGV+2G/fgZkY9nptZLrnVUz/oG7jpEUilby+88AKdccYZ1LVrV5XR+vXr067ZDvv7LUI7KNwsG0r+mpJLKogVhV2HDh3UF9aoUaPU/dq1a4lfHLwGid3OnTupX79+JKdWq/vIf7lKx/mvW7eO8vPztb78IvXJ9S+4mRGO5xaby4EDBxImbEHffiMEbrGaon+djBuvCx89ejTVr1+f5KxXGjNmjHqn8XsQ+pZa3wLFLXZqs+50/ZtvvlnIma/RpLJfX7Ro0UItGenRo4eQgKJh8+bNE3K8UsiNCKJ+kYtcpOO8BwwYIHiJSCbn9PIQcCsqEVN9k2MeQnaBCTlWLqpXry6GDh0azRj6FkUh4vUN3PTWicdy42UeZcqUUUtCpEmI/kbWjUPfkutb0LgZraOUrUkhp0kLOWBdSElebdmypch95Gb58uVCtiojtwm/dqaT45LKaLMRzuScNpTgVlQiuoYyFbeiuRXeQd9+YwFuhTrBV9C3ojx078BNCCNDyYB5Vx65vijBWMbDl5N+RO/evQX/0VpxJul4x6BLLrlE1U2nLKcNJdcJ3Aolo/sHCG6FzPgK3Iry0L0DN11SReOBmxB5jCTSgy+7K6lbt27RzQQi/ql+5Ze7CuL9D73geA0Ur+esW7euVnXkNktUsmTJhHEurcQxkcAtBoaFS3CzACsmKrjFwLBwCW4WYMVEBTei/Bgeli+9YiAjFeeBeD84cDOTEriBmxkBs1TQN3CLELA86zWSEL8gAAIgAAIgEAYCMJRhkDKeEQRAAARAwJgADKUxOiQEARAAARAIAwEYyjBIGc8IAiAAAiBgTACG0hgdEoIACIAACISBAAxlGKSMZwQBEAABEDAmAENpjA4JQQAEQAAEwkAAhjIMUsYzggAIgAAIGBMosuHAtm3b6KuvviK5oa1xhn5KyGdqRs7VzKbe4GZGD9zATYcA/k51KCXGAbdEJjo+ybgV2cJObk5OgwcP1snL1jizZs2iH374IXo0l62ZZ8isffv2dN5552WIlT4Y3NLzSRUKbqnIpPcHt/R8UoWCWyoy6f3BjaiIoUyPK3ehzZs3p9mzZ9Ovv/5KlStXzl1BAcsZ3MwECm7gZkbALBX0zf/cXB+j3Lhxo+rqlWe+0bhx48yIhjAVuJkJHdzAzYyAWSroWzC4uW4o+bRwPil83759NGTIEDOqIUwFbmZCBzdwMyNglgr6Fgxurne9ygOgafHixYomH5G1bNkyqlWrlhndEKUCNzNhgxu4mREwSwV9CwY3V1uUK1eupNWrV0dJ5uXl0dtvvx29x0VyAuCWnEsmX3DLRCh5OLgl55LJF9wyEUoe7kVurhrKt956i2LOjaYDBw7Q0KFDk9ODb5QAuEVRWLoAN0u4opHBLYrC0gW4WcIVjexFbq52vXIX6y+//BIFxBfHHXecWirCXRZwyQmAW3IumXzBLROh5OHglpxLJl9wy0QoebgXubnWopw3bx7xgvN4d+TIEeIvCrjkBMAtOZdMvuCWiVDycHBLziWTL7hlIpQ83KvcXDOU3MV66NChBFqHDx+mV199NcEfHr8RADczTQA3cDMjYJYK+hYsbkW2sDN7NLNUPNOVJ+/wTFd2PFbJ9+x27NhBmzZtooKCAnWP/woJgFshCytX4GaFVmFccCtkYeUK3KzQKozrVW6ujlFG8Lzzzjv07rvvEv/C6RMAN31WsTHBLZaG/jW46bOKjQlusTT0r73EzbWuV31ciAkCIAACIAAC7hGAoXSPPUoGARAAARDwAQEYSh8ICVUEARAAARBwjwAMpXvsUTIIgAAIgIAPCHjCUPJsV94YHc4aAXCzxisSG9wiJKz9gps1XpHY4BYhYe3XS9w8YZ14aQifKg1njQC4WeMViQ1uERLWfsHNGq9IbHCLkLD26yVunjCU1vAhNgiAAAiAAAg4RwCG0jnWKAkEQAAEQMCHBGAofSg0VBkEQAAEQMA5AjCUzrFGSSAAAiAAAj4kAEPpQ6GhyiAAAiAAAs4R8ISh5KUhPBUYzhoBcLPGKxIb3CIkrP2CmzVekdjgFiFh7ddL3DxhKHlpCE8FhrNGANys8YrEBrcICWu/4GaNVyQ2uEVIWPv1EjdPGEpr+BAbBEAABEAABJwjAEPpHGuUBAIgAAIg4EMCMJQ+FBqqDAIgAAIg4BwBGErnWKMkEAABEAABHxLwhKH00uwmP8kQ3MykBW7gZkbALBX0zf/cPGEovTS7yUyk7qQCNzPu4AZuZgTMUkHf/M/NE4bSDCNSgQAIgAAIgEDuCcBQ5p4xSgABEAABEPAxARhKHwsPVQcBEAABEMg9ARjK3DNGCSAAAiAAAj4mkO9W3Xfv3k2LFy+mXbt20YIFC2jPnj302WefUbly5ahOnTpUo0YNt6rm6XLBzUw84AZuZgTMUkHfgsUtT+6x6sgmq/Pnz6eJEyfSpEmT6IcffqAdO3bQaaedRuXLl1f/SpUqpfz27dtHy5YtI1a0Zs2aUYcOHej888+nCy+8kPLzXbPrZlK3IRW4mUEEN3AzI2CWCvoWbG45NZRsDIcOHUpvv/22ajFedNFFyvCde+65VL169bRkuaXJyvf555/T5MmT6aeffqLrrruObrnlFmratGnatH4PBDczCYIbuJkRMEsFfQsRN25R2u22bt0q7rvvPnHiiSeKP/3pT+Lrr7/OuogVK1aIRx55RBQUFIiuXbuK2bNnZ52n1zIANzOJgBu4mREwSwV9Cx83Pt7KNicX1orhw4eLqlWrin79+onVq1fblnckI9k1K/71r38J2SJVZbDS+t2Bm5kEwQ3czAiYpYK+hZebbYZy48aNolOnTqJNmzZizpw5ZkQtpNq5c6fo27evqFmzppgyZYqFlN6KCm5m8gA3cDMjYJYK+hZubrYYymnTpgk5S1U88MADZjSzSCUnCKnu2CeffDKLXNxJCm5m3MEN3MwImKWCvoFb1oZy7ty5okqVKuKLL74wo2lDqnXr1omzzjpL3HnnnTbk5kwW4GbGGdzAzYyAWSroG7gxgawM5SeffMJLS8To0aPNaNqYirtiGzZsKG677TYbc81NVuBmxhXcwM2MgFkq6Bu4RQgYG8pvv/1WVK5cWXC3hFecXFKiDPff//53r1QpoR7gloBEywPctDAlRAK3BCRaHuCmhSkhUlC5GRlKns160kknCbm+MQGU2x5sLLllOWLECLerklA+uCUg0fIANy1MCZHALQGJlge4aWFKiBRkbpYN5ZEjR0Tbtm3F448/ngDKKx7z5s0TlSpVEkuXLvVKlQS4mYkC3MDNjIBZKugbuCUjYNlQPv300+KSSy5Jlpen/OSOQGqpytGjRz1RL3AzEwO4gZsZAbNU0DdwS0bAkqHk2aW8247cizVZXp7y48XBLVu2FG+88Ybr9QI3MxGAG7iZETBLBX0Dt1QELBnKm266STz88MOp8vKcP3fBVqtWTezdu9fVuoGbGX5wAzczAmapoG/gloqAtqFcu3atqFixoti2bVuqvDzpf8UVV4iXXnrJtbqBmxl6cAM3MwJmqaBv4JaOgPbpIXfddReVLVuWHn30UbMt411KJbfTI7mJOq1cuZKKFXP+nGpwMxM8uIGbGQGzVNA3cEtLIJ0VjYTxTDDe6NwPY5OROsf+ynMtXVnKAm6xUtC/Bjd9VrExwS2Whv41uOmzio0ZJm5aTSw+E7JBgwZUr169tEbXq4G9evWit956y/HqgZsZcnADNzMCZqmgb+CWiYCWofzss8/osssuy5SXZ8Mvv/xy+vTTTx2vH7iZIQc3cDMjYJYK+gZumQhoGcpJkyZRhw4dMuXl2XBuCefl5ZHsOna0juBmhhvcwM2MgFkq6Bu4ZSKQ0VDu3r2bVq1aRa1atcqUl6fD2dBPnTrVsTqCmxlqcAM3/J1a1wG836wz4xS63DIaSm6FnXrqqWa18FAqblXKLe0cqxG4maEGN3DD36l1HcD7zTozTqHLLaOhXLx4MTVt2tSsFjKVnCWl0h4+fNg4DzsS8jMsWbLEjqy08gA3LUwJkcAtAYmWB7hpYUqIBG4JSLQ8wsYto6GUGwyQ3LZOC15spGeffZZ+97vfUf/+/ZWh5TWYt956azQKT67hZu+ll16qunW//vprFXb//ffTCSecQLfffjvNnj2b6tatSzVq1CCembZ//3668MILSZ45Gc1H90JulkD8LE45cDMjDW7ghr9TvN88Zxdi18Uku+ZTQv72t78lC0rrN3PmTHU2JO+Ms2jRItGnTx91P3/+fPHjjz+KMmXKiBUrVqg8eFu80qVLq3s+JqtcuXLiueeeU2G8STHvL3vo0CF136NHD7F8+fK0ZScL5Pq0aNEiWVBO/MDNDCu4gRv+TvF+478CL9mFjC3KAwcOqB15rH7nnn766SqJ3D+RGjduTM888wyVKFGCJkyYQEOGDFHrMiNjnz179iQuR54hSeXLl6errrqK3n33XZW+Vq1aqiXIU7ilEVX/uJVp1XGLlstwyoGbGWlwAzf8neL9xn8FXrIL+Zn+LNlwbdy4MVO0jOFsqLgrlvu247tWTjnlFJI7/5A8+FPlwxsEnHfeeSRbnCRP/1Bds2+//TatX7+errnmmoxlJYuwc+dOki3VZEE58QM3M6zgBm74O7WuA3i/5dYuZGxRVqhQgeTpG9YlF5dCtqSV4WvYsKEac1ywYEGRfPPz86lmzZoqlTwYmurXr0933nmn8pNdv/TRRx/R66+/Tt27d4/LWe+Wn4GfxSkHbmakwQ3c8HdqXQfwfsutXchoKKtXrx5t6VkXH9HmzZtVMl4btW/fPtWcvvbaa0keqKwm6HDgL7/8olqtsa3Fm2++mT755BPizYp5Zx3+ypR7tpIc2zSphnoGfhanHLiZkQY3cMPfqXUd4N44cMsht0xTB+SaJiG7RjNFSwiX4wxq8k6jRo2ENIxqU/X3338/Go8n68jZrGLgwIGiSZMm4rXXXouG8YU0nqJz585RP2kwxbRp06L3Vi/uuece8cQTT1hNZhwf3MzQgRu44e/Uug7g/WadGafQ5ZbxPEq5/lHI8UXLhx9HDCUbRzm2KHin+XjHByrzDFjZ0owPUvd79uyJ+sdeRz0tXMhWqfjggw8spMguKriZ8QM3cMPfqXUdwPvNOjNOocsto6HkzOTaRfHxxx/zpbZjwyYbwmLcuHHaaXIVkV++vORETiLKVRFJ8wW3pFgyeoJbRkRJI4BbUiwZPcEtI6KkEcLELeMYJff6tm/fniIbAuj0Akuq9Pe//11FHTx4MM2YMUMnWc7izJo1S21VxJsOOOnAzYw2uIGbGQGzVNA3cMtEII8/FTJF+umnn6hjx470888/U7FiWraVZIsymm2pUqXUGsqoh8MXvMvPSSedRA8++KCjJYObGW5wAzczAmapoG/glpFA0jZ1Es/mzZuLL774IkmIt714R59KlSoJOSvMlYqCmxl2cAM3MwJmqaBv4JaOgF7zUJrb3r1708svv5zR8HotghwjpTPPPJNOPvlkV6oGbmbYwQ3czAiYpYK+gVtaAumsaGwYz2KtVq2amDt3bqy3p6/lWk0hNy4QX331lWv1BDcz9OAGbmYEzFJB38AtHQHtFiWPM8o1J/TQQw+lNbxeCuRt73hrvAsuuMC1aoGbGXpwAzczAmapoG/glpZAOisaH8bLLHhzgPfeey8+yHP3W7ZsUZsceKEFDG5m6gFu4GZGwCwV9A3cUhHQWkcZm5i7MWvXri22b98e6+256xtuuEHccccdnqkXuJmJAtzAzYyAWSroG7glI2DZUHImDzzwgOjUqZM4duxYsjxd93vllVeEPKlE8LiDlxy4mUkD3MDNjIBZKugbuMUTMDKUBw8eFO3atRPydI/4/Fy/5/1g5bikWLhwoet1ia8AuMUT0bsHNz1O8bHALZ6I3j246XGKjxVkbkaGkgFx16s8O1D0798/npdr9998842oUqWKmDx5smt1yFQwuGUilDwc3JJzyeQLbpkIJQ8Ht+RcMvkGlZuxoWRg3LVZq1YtIbery8Qv5+Effvih2lv2hx9+yHlZ2RYAbmYEwQ3czAiYpYK+gVuEQFaGkjP59ddfRYsWLUSfPn1SngISKSxXvyNHjhQFBQWebknGPzu4xRPRuwc3PU7xscAtnojePbjpcYqPFTRuWRtKBrR792515qQ8WFnweYJOOT6hpG/fvqJhw4a+2gghwgfcIiSs/YKbNV6R2OAWIWHtF9ys8YrEDhI3WwxlBMzQoUNF5cqVVVcsD+zm0o0fP17UrFlT3HjjjSLbsypzWU+dvMFNh1JiHHBLZKLjA246lBLjgFsiEx2fIHCz1VAytA0bNqjWZY0aNcQzzzwj7DaYEyZMEOecc45o2rSpmDJlio6cfBEH3MzEBG7gZkbALBX0LZzcbDeUEYyzZ88WV111lZqFyt2jM2fONF53+csvv4jHH39cGcfTTjtNjB07Vhw5ciRSVKB+wc1MnOAGbmYEzFJB38LFTes8yrR74GUIXLNmDY0ePZp431X5NaYOgW7bti3JzcpJbodHFSpUoHLlylHJkiVp165dtHfvXlq2bBktWbKEFixYQPJoL9q2bRt1796devbsSW3atMlQYjCCwc1MjuAGbmYEzFJB38LBLeeGMhYjG8pJkybR999/rwyhnPhDO3fuVAZSnvRBcl2m+lenTh2SE3RIth6VYZWThLQPjI4tLyjX4GYmSXADNzMCZqmgb8Hl5qihTIWxW7du9MEHH5A8ZJlKlCiRKhr84wiAWxwQzVtw0wQVFw3c4oBo3oKbJqi4aF7ipn3MVtwz2HYrJ/vQf//7X9X9+tlnn9mWb9AzAjczCYMbuJkRMEsFfQsGN9cNpZzFqlqRcokHDRs2zIxqCFOBm5nQwQ3czAiYpYK+BYOb612vnTt3pk8//VTR5MNTeeJOmTJlzOiGKBW4mQkb3MDNjIBZKuhbMLi52qKUOzeoyT0RlDzz9aOPPorc4jcFAXBLASaDN7hlAJQiGNxSgMngDW4ZAKUI9iI3Vw0lT+Bh4xhxDOi1116L3OI3BQFwSwEmgze4ZQCUIhjcUoDJ4A1uGQClCPYiN1e7XuUOO/Tdd98VwcWGc+PGjVSxYsUi/rgpJABuhSysXIGbFVqFccGtkIWVK3CzQqswrhe5udailLvLkzwSq5DO/654eci7776b4A+P3wiAm5kmgBu4mREwSwV9CxY31wzluHHjKD8/P4Em78zz6quvJvjD4zcC4GamCeAGbmYEzFJB34LFzbWu11NPPZX4q6t48eK836yimpeXp355t54tW7ZQpUqVzGgHOBW4mQkX3MDNjIBZKuhbsLi5Zig3bdpEc+fOVTQnT55M3377LT3wwAPqvlq1anT66aebkQ54KnAzEzC4gZsZAbNU0LdgcUvs+zR7PsupCgoK6OKLL1bpuAW5fPny6L3lzEKUANzMhA1u4GZGwCwV9C1Y3FwbozTDiFQgAAIgAAIg4CwBGEpneaM0EAABEAABnxGAofSZwFBdEAABEAABZwnAUDrLG6WBAAiAAAj4jIAnDCUvCylWzBNV8ZX4wM1MXOAGbmYEzFJB3/zPzRPWiddRHjt2zIxmiFOBm5nwwQ3czAiYpYK++Z+bJwylGUakAgEQAAEQAIHcE4ChzD1jlAACIAACIOBjAjCUPhYeqg4CIAACIJB7AjCUuWeMEkAABEAABHxMAIbSx8JD1UEABEAABHJPwBOGEtOnzQQNbuBmRsAsFfQN3MwImKXykr55wlBi+rSZIoEbuJkRMEsFfQM3MwJmqbykb54wlGYYkQoEQAAEQAAEck/AE4bSS03s3CO3rwRwM2MJbuBmRsAsFfTN/9w8YSi91MQ2E6k7qcDNjDu4gZsZAbNU0Df/c/OEoTTDiFQgAAIgAAIgkHsCnjCU6JowEzS4gZsZAbNU0DdwMyNglspL+uYJQ4muCTNFAjdwMyNglgr6Bm5mBMxSeUnfPGEozTAiFQiAAAiAAAjknoAnDKWXmti5R25fCeBmxhLcwM2MgFkq6Jv/uXnCUHqpiW0mUndSgZsZd3ADNzMCZqmgb/7n5glDaYYRqUAABEAABEAg9wTy5NeOiBQzevRo6tu3L9WsWTPi5cjvwYMHif9VqFDBkfJiC6lRowZ98cUXsV6Wr8HNMjKVANzATZcA/k51SRWNB25FeejexXMrYiivuuoq6ty5M7Vu3Vo3P1/H42+E0047jWK+FYyeB9yMsBG4gZsOAfyd6lBKjANuiUx0fJJxy49NWKxYMSpbtiw1adIk1juw10ePHiV+5mwduJkRBDdw0yGAv1MdSolxwC2RiY5PMm7ZWwmdkhEHBEAABEAABHxKAIbSp4JDtUEABEAABJwhAEPpDGeUAgIgAAIg4FMCMJQ+FRyqDQIgAAIg4AwBGEpnOKMUEAABEAABnxKAofSp4FBtEAABEAABZwjAUDrDGaWAAAiAAAj4lAAMpU8Fh2qDAAiAAAg4QwCG0hnOKAUEQAAEQMCnBLIylMeOHaO9e/dGH33btm1G28HZlW7Pnj3EdfK6AzczCcVz41xi9U8317DrG7jpaUq8vm3evBnvNw10QeRmbCj3799Pffr0IVaepUuXUtu2bWnAgAHUrl07Gj9+vAZOsj3dhg0bqH///nTo0CGt8t2IBG5m1GO5cQ7z58+nLl260L333qudod166jd9AzdtVaFYfZs5c6ba/7qgoIDq1atHw4cP18oo7PoWKG5yA9iou/rqq8XYsWOj96ku5Fe8aN++vZg2bZo4cuSIkHvDikcffVRFnz59upD7xYo1a9akSq78c5Vuzpw5Qm7sLg4fPpy2fA7kOsj9RjPGyxQB3DIRSh5uwo1zki1CMWLECFG7dm0hT7tJnnmcb9j1DdyEMNE3ue+naNmypRg8eLCYOnWqOOecc4Q85Ujs27cvTsOK3oZd34LGjbsSok5XkZ566ilx6623qnQLFy7kY7rEihUrovnUqVNHvP7669H7ZBe5THfNNddkLJ/r5LShBLeimmCib7E5nHvuudqGMuz6Bm76hjL273TGjBlCtiCj+CZMmKDed59++mnUL9lF2PUtaNwsd71yl8TTTz9N0hip7gfZglO/fH5XxFWrVo242Z3O5TJd9+7daeDAgcS7wHvFgZuZJOK5meVCFHZ9Azc9AvH61qpVK+rVq1c0cePGjalEiRLE/ulc2PUtaNwsG8pFixbR1q1bqWnTpkpPWCHKlStHpUqViupN5cqVtQxlrtLJLjlatWoVrVy5Mlonty/AzUwC8dzMcvnNUIZZ38BNj0AmfZs8eTJ17NiRKlasmDbDXL4X/fB+i4fjd26WDSUPUBcvXpwqVaqkWBw8eFB9YcWCKV26NOXl5cV6JVznMl2tWrVUeUuWLEko1y0PcDMjH8/NLBeisOsbuOkRSKdv3Np8/vnnadCgQRkzg74VIgoCN8uGUg5iqynSPAWYHXe57tixg+TkmSgZXqbRqFGj6H2yi1ymq1KliiqS6+UVB25mkojnZpZLbvXUD/oGbnoE0unbbbfdRg899JDWwfZhf7/F0g4CN8uGskGDBmqtIi8LYSdnhCnDyVPlI467PSNdsxG/+N9cptu+fbsqLtKyjC/bjXtwM6Mez80sl9zqqR/0Ddz0CKTStxdeeIHOOOMM6tq1q8po/fr1addsh/39FqEdFG6WDaVcCkJySQWxorDr0KGD+sIaNWqUul+7di3xi4PXWLLbuXMn9evXj+TUanUf+S9X6Tj/devWUX5+vtaXX6Q+uf4FNzPC8dxiczlw4EDChC3o22+EwC1WU/Svk3HjdeGjR4+m+vXrk5z1SmPGjFHvNH4PQt9S61uguMVObdadrn/zzTcLOfM1mlT264sWLVqoJSM9evQQElA0bN68eUKOVwq5EUHUL3KRi3Sct9z4QPASkUzO6eUh4FZUIqb6Jsc8hOwCE3KsXFSvXl0MHTo0mjH0LYpCxOsbuOmtE4/lxss8ypQpo5aESJMQ/Y2sG4e+Jde3oHEzWkcpW5NCTpMWcsC6kJK82rJlS5H7yM3y5cuFbFVGbhN+7UwnxyWV0WYjnMk5bSjBrahEdA1lKm5Fcyu8g779xgLcCnWCr6BvRXno3oGbEEaGkgHzrjxyfVGCsYyHLyf9iN69ewv+o7XiTNLxjkGXXHKJqptOWU4bSq4TuBVKRvcPENwKmfEVuBXloXsHbrqkisYDNyHyGEmkB583EejWrVt0M4GIf6pf+eWugnj/Qy84XgPF6znr1q2rVR3ekKBkyZIJ41xaiWMigVsMDAuX4GYBVkxUcIuBYeES3CzAiokKbkT5MTwsX3rFQEYqzgPxfnDgZiYlcAM3MwJmqaBv4BYhYHnWayQhfkEABEAABEAgDARgKMMgZTwjCIAACICAMQEYSmN0SAgCIAACIBAGAjCUYZAynhEEQAAEQMCYAAylMTokBAEQAAEQCAMBGMowSBnPCAIgAAIgYEwAhtIYHRKCAAiAAAiEgQAMZRikjGcEARAAARAwJgBDaYwOCUEABEAABMJAoMgWdv3796f333+fKlSo4Piz82HPfPhzxYoVHSubd+9bvHixOk8zm0Kd5saHZnPd5ekZ2VTbOK1fucU+MPQtlkb6a+hbej46odA3HUqFcVjn2PFRZk67ZO+3Ioby0KFDFNm/1enK3XjjjTRr1iyaPXu22q/VqfKrVq1KlStXzqo4p7ldeOGF6mPmgw8+yKre2ST2I7fY54W+xdJIfw19S89HJxT6pkOpMI48lpFq1qypzgEt9HXuKv79VsRQOleNoiXJUzyoXLly6rDll19+mVip4JITmDRpEl1++eWqNbl79+7kkeCblgD0LS2eIoHQtyI4jG6gb9awzZw5k84//3yS5xgTt8TdaFXG19j5dm18DeT9N998o1qR8pgseuqpp5LEgFeEwL333kvyAF514snq1asj3vi1QAD6pg8L+qbPKlVM6FsqMsn9n3zySeJeuvz8fNXLmDyWs76eMJQffvghsZFkt2bNGtX96iwGf5Q2ZcoUNabKtWUl+u677/xRcY/VEvqmJxDomx6nTLGgb5kIFYZv2rSJJkyYQDxGeeDAAXVdGOrelScMJU8g4rMh2R08eJCeffZZ94h4uOR77rmH9u3bp2rI3a6TJ0/2cG29WzXom55soG96nDLFgr5lIlQY/uKLL6ouV/bhyZ3vvfdeYaCLV66PUXILslGjRurrIcKBD1/mL4vjjz8+4hX632nTplGnTp2ihpKBNGzYMNrCDD0gTQDQNz1Q0Dc9TpliQd8yESoMZ8PIEyt37doV9SxRogRt2bLFlZUY0UrIC9dblJ988knCYC0ve3jjjTdi6xn669iv+wiMFStWqL78yD1+MxOAvmVmxDGgb3qcMsWCvmUiVBj+73//W3W5FvoQHXfccTRx4sRYL1euXTeUY8eOLdJKYgrcvTho0CBXgHix0BkzZtC8efMSqlamTBn64YcfEvzhkZoA9C01m0gI9C1CIvtf6Js+w8cee0zNco1Nwa3L8ePHx3q5cu2qoeTBWv6jTOZ27txJX331VbKg0PndddddaqZr/IPzeO706dPjvXGfggD0LQWYOG/oWxwQw1vomz44XkOfahY/T+5x27lqKNlI8jRgHovkf2XLllX/eIyS18/MnTvXbT6ul89jtTy7tXTp0opR+fLl1YxXrhgbSjc3HXAdjsUKQN8yA4O+ZWakGwP6pkuKaNiwYWoSD+8Kx3aAxyYj7tdff3VtI5xIHVyfzPOf//xHjVEyoJtuuol4w4GWLVuqwVteAgH3G4H169erpTN//etfqVmzZuoDg7ffa9WqFf3rX/8CJk0C0Dc9UNA3PU6ZYkHfMhH6LZw/+vnDYvv27TRnzhzi8co//OEPtHHjRjW5Z8iQIY5ubxpfa9ctEe8yE3G8bRC3mE488cSIF37/R6B69erE/3gG2N13361mvAKOdQLQNz1m0Dc9TpliQd8yEfotnHsReds6dtya5N15eMzSK87Vrtd4CGwksS1bPJXCe96sd+3atXTyyScXeuLKmAD0LT066Ft6PlZDoW96xLhV6eThGDq18pSh5O7X2DU0Og8QpjjcDXHCCSeo8cowPXeunhX6lp4s9C09H6uh0Dc9Ytu2bfNcryIMpZ7sPBGLFy+jNWmfKPDiSs8S+paej9VQ6JseMbQoM3CCIqUHhBdXej5WQ6Fv6YlB39LzsRoKfdMjBkOZgRN3K2KMMjWkn3/+mU455ZTUERBiiQD0LT0u6Ft6PlZDoW96xNhQZntGsF5J+rE81fXKZ1LyRgNwyQmsWrWKatWqlTwQvpYJQN/SI4O+pedjNRT6pkeMxyi9ts+3pwwluibSKxK6wtLzsRoKfUtPDPqWno/VUOibHjF0vWbghOnT6QHxFk916tRJHwmh2gSgb+lRQd/S87EaCn3TI4ZZrxk44YsrPSB84afnYzUU+paeGPQtPR+rodA3PWJoUWbgBEVKDYi/snhLP2YEZw8B6FtqjtC31GxMQ6BveuTQoszACYqUGhC+7lOzMQ2BvqUmB31LzcY0BPqWmdz+/fvV5uh8CISXnKcm8/BMJz41BC6RAG9dh6UhiVyy8YG+paYHfUvNxjQE+paZ3I4dO6hSpUqZIzocw1OGkge7GRRcIgGeql+7du3EAPgYE4C+pUYHfUvNxjQE+paZHHe7em1pCNfaU4YSXROpFQldYanZmIZA31KTg76lZmMaAn3LTM6L45Nca08ZSp6swkescD81XFECeHEV5WHHHfQtNUXoW2o2piHQt8zkvDjjlWvtKUPJFcJXF1NIdHhxJTKxwwf6lpwi9C05l2x9oW/pCcJQpucTDYUiRVEUucCLqwgO226gb8lRQt+Sc8nWF/qWniC6XtPziYZCkaIoohf79u2jAwcOUJUqVaJ+uLCHAPQtkSP0LZGJXT7Qt/Qkea/vE088MX0kF0I91/WKHfYTtQAzEBOZ2OUDfUskCX1LZGKXD/QtPcmtW7eqw+nTx3I+1HOGEjvsJyoBusESmdjlA31LJAl9S2Rilw/0LT1JjFGm5xMNxcbBURTRC5wLGEVh+wX0LREp9C2RiV0+0Lf0JLHhQHo+0VDsXhFFEb3grjCcQxnFYesF9C0RJ/QtkYldPtC39CTR9ZqeTzQUu1dEUUQv0BUWRWH7BfQtESn0LZGJXT7Qt/Qkvdr1mp++2s6HhnFW2OHDh2nGjBm0cOFCWrJkCW3atIl2795NR44cIf7D4hfXjz/+SB999BGdd955VLFiRecFE9ASoW/QNydVO4z6Fs833fsuLy+PnnrqKWratCk1aNDAM+87TxnKdevWEX9RLFu2jD777DNlJHiqcN26ddWOPfHA/XzPU/DHjx9PI0eOpG+++UYpxmmnnUZNmjSh5s2bq2cvVaqU2vt2165dtGjRInrttdfoj3/8I9WvX5+uvvpquu6667D/axZKAH2DvmWhPpaThknf4uGYvO+++uorz7zv8oR08Q/l1P28efPogw8+IAYye/ZsKlu2LNWsWZP4iBX+8uKBXV6AymMmbCw7dOhAF110EXXu3Nm3hnPLli304osv0uDBg6lFixbUq1cv6tSpk/aUaG5lfv/99zRixAh6//33qX379nTffffRWWed5ZTYfFsO9A365qTyhlHf4vkG5n3HhtJJJxfOi6FDhwrZehInn3yykC958emnnwrZakpZjUOHDgmpdOKf//ynuOCCC0TlypXFPffcI9avX58yjdcCjh49Kl555RVRtWpV0bt3byG7U7OuIrMcNGiQqFGjhspTdtlmnWfQMoC+Qd+c1Omw6ls846C97yj+AXN5P27cOCFbjOLiiy8WsrtRHDt2zKg42cIUd999t5DdsuL//u//hNzNwSgfpxKtXr1atGvXTrRt21YsXrzY9mJlt4a48847xUknnSRkl7Xt+fs1Q+gb9M1J3Q2rvsUzDuL7zhFDuWHDBiG7TEWzZs2E7DaM52p8/+uvv4obbrhByHMaxZQpU4zzyWXCb7/9VhmwJ598MpfFqLynT5+uWpcDBgzIeVleLgD6dpKAvjmnoWHWt3jKQX3f5dxQ8su7evXq4uGHHxZyfC2eqy33kyZNEgUFBULOlrIlP7symTNnDo//qq5lu/LMlM/mzZuFnAwkbrvttkxRAxkOfYO+OanYYda3eM5Bft/l1FDKmZrKUMgJO/FMbb+XM8rE6aefrrpkbc/cIMOJEycKOWvVlZauXLSrWrEPPvigQc39mwT6Bn1zUnvDrG/xnIP+vsuZoeSuUDl7VXz++efxTHN2z60pHrd0otsp3UPwxCN50ocrRvL/t3clcFsO6/tukTbRIktEFEoRSYstlaNsiZRWJ44WJFmOXUiyhCRFcUh0qFA5SUkkhURJQqXVTguVxD/zn2t4vt7v/d7v+97lmWe95ver932fZ+aemWuu77mfmbnnvp12wThKn0NS9913n3Mp0p/kG/nmJcHjzLdknOPwvLOiKD/77DOzFDpr1qxkTK3/1kdKVO3atdWIESOs15Wqgm3btqm6deuqp59+OtVtT6/BshYKG8tDUU7kG/nmJb/jzLdknOPyvHNdUcI8+phjjlGPPvpoMqae/dYOC1TVqlXV4sWLPavTqQh7gzj+EZSEozeHHHKIAqGjmMg38s1LXsedb8lYx+V557qiHDhwoOrQoUMynp7/fv7551XDhg2VdpfkWd1QzJjBYY8wSOn88883xlRBapNbbSHfyDe3uJSOnDjzLRmfOD3vXFWUq1atMs4AguIIoFWrVp4uweJ86OjRo5P55PtvmK9j7xbHaaKUyDfyzUs+x51vyVjH6XnnqqLs1auXCpKlJcyVcTQFyyW2k3bBZ+rasWOH7aqykt+7d2918803Z1U2qIXIt/0V+eYdO+PMt2SU4/a8c01ROrMWGNMEKZ177rlKOxO33qRLL73UuNizXlGWFXz55ZfmyIiXS9FZNjWtYuQb+ZYWUVzKFHe+JcMYt+ddyWQnttn+1nuCcvbZZwsCkwYpXXLJJfLMM89YbZJ+q5eJEyeaaB5WK8pBuDboEfxDVJYoJPKNfPOSx3HmWzLOcXzeuaYox48fLz179kzGNOPfiMO4fPnyjMsVVuCMM86QlStXmpiOheXJ9bo+UyXa2YHoZd5cRVktf+GFF5qYllYr8Ug4+Ua+eUQ1U02c+ZaMcxyfd64oSu2U3MRLbN68eTKmGf8eMmSIaOfhGZcrrEDJkiVFRxwxobwKy5Prde1Cz9SRqxzb5YED2hr2RL6Rb15yOO58S8Y6js87VxTlvHnzjHLbbbfdkjHN+LeOgmECGmdcsIgC2vpV8BZkK73//vuio4PYEu+aXO2UXrTlqwmO7ZpQHwSRb+Sbl7SLO9+SsY7j884VRfnFF1+IdpeWjGdav7VxSb582rm5NG3aNN81vZFsfuuwXPmup/vj8MMPF7TRVoLsOnXqZC3e6V+6ApIxS7cc8qGdNrHIpC3Z5iXfyLdsuZNNubjzLRmzOD7vXFGU2FPUbtuS8SzyN8Du2rWrdO7cWWrVqiX67KWsX79errvuOvMbhbV3H9FefkRHHpFmzZrJHnvsIY888kiRclPdPOKII0R760l1K+drOqi0bNy4UXSor4xkQenrw8vSsmVLs2zbr1+/vPLam465jv3V448/Xt566y1zDwpVH/MQ5IXy19a8eWXS/YJy+jxYutkDmY98I9+8JGac+ZaMc2yfd8lmv9n81gpPjRs3LqOiMC8eOnSoKYOzlzi+oBWOuvXWW03UDdzANb3HaIIe47CvtmBV1atXz6geZEZgYzhot5F++uknc5g/U9noe/v27RUigcPDhSakQiy3pUuXqvLly5u+QybCk6HtwOL1119XTZo0MVXBEbHez820WgXcvTguk3HDMihAvlXJAK2/spJvGUOWVyDOfMsD4e8vcX3euTKj1H5EpVKlSskvH0X+1r5YZfDgweZYxZVXXin77befVK5cOd8SLo4zlCtXTmCtiVknZlg6QojouJZFyk6+CRkok+3SbbK8xN9bt27N6kjMAw88INrVn8DY6Oijjxas+2P2qD37GAzQd6QePXqIdpggY8eOFWCGfFdffbUceuihWR1H2WuvvQSWxWFO5FvmR7DIt+wZH2e+JaMW1+edK4pSz4AyfvjiYV+/fn3p2LGjaCfiomM3Jo9Jgd+OsZB+uSlwr6gLUDSlSpUySqmofNncy6bvOgSW6APM+V4uoCTRvzVr1uRrBl4Q9CzaXMcytJ59y7Bhw6RevXqyffv2fHnT+YG6K1SokE7WwObJBnPyjXzLltBx5lsyZtlgEYXnnSuKEnuHeOvKJOkQUOaoAmaV//vf/+SFF17IpHhGedE2tNFGqlixouil3YxEQ1FBKU6bNi2vHJQeZos1atSQTz75JB+epUuXlgMOOEA+//xzuf7660WHLxO9ZCs33nhjXvl0v6CttrBItw255iPfyLdcOZRJ+TjzLRmnuD7vXFGUWCaEcU4mCUtBeGjfdNNNZlap9+lMcVyDVSf+YakUS6ZQCkiOQsp06RVtc5YyjSAX/8OyLhQfZojpJsxuTzvtNLOciiXVOXPmGMMmWPzCuAn91QGvjbivvvpKvvvuO+nUqZN8+OGH5ugMDICGDx8u2pdtulXm5YPzhUwNj/IKB+QL+Ua+eUnFOPMtGefYPu+SN2uz+f3yyy+rc845J6OieslVnXLKKeree+9V2vWd0gpBaUWg9BKkMWy56qqrzD09UMaAZeHCheqkk04y92Dwk0lCEOXu3btnUiSjvGiXtkzNqAyCKh933HGmP9rtn5o0aVJe+YceekjpmaUaNGiQ0kusecY3zz77rDrwwAPVPffco7p06aK027y8Mul+QZxOvc+bbvZA5iPfyDcviRl3viVjHcfnnStO0fHgxcNez/SSMS30t54xmqgesKKynS666CI1atQoa9VAqd99991ZyQd2qXDTy8XGAlbPovPkAjM9y1Zw0IzPTJM2c1d6CTfTYoHLT76Rb16SMu58S8Y6js87V5ZedbBi0TMd0aFXkmfqhf7GvhsMeGDJaTu9+eab5lyirXpOPfXUrF3kATssxSYnbJofeeSRxurXuQfMSpQoIfvuu6/5dK6n+wnXU1i2DXsi38g3Lzkcd74lYx3H550rihJAYg8N+21BS1CSOmhxvmMnbrcRykcvDRvHA27LdlOeXkKSs846y02Rvski38g3L8kXZ74l4xzH551rilLvmRnLVYRgCVJ66qmnpFu3blabBEuwtm3byn//+1+r9eQiHJ6PFixYYEKh5SInKGXJN/LNSy7GmW/JOMfyeZe8/pzLb/3WFajgxdrCU8F4RZ/jyaVbaZXVM1elXeVltXeYVgU5ZrrhhhuUdn2Xo5RgFSffyDcvGRlnviXjHLfnnSvGPA6IS5YsUXr/TOmwNM4lXz9hGQoXcF4lHWZMTZgwwavq0q5n06ZNqlq1amrdunVplwlDRvKNfPOSp3HnWzLWcXreuaooAaR2R6e04+5kTD3/Db+o2s2b0gf5PasbR0RwfAMWq0FKvXr1itxs0sGXfCPfHC548RlnviXjG6fnneuKErNJ7XYt37nAZIBt/9YH9JX2HaveeOMN21UVkK/90irtMafAdb8uaG8/Bgs4nI9iIt/INy95HXe+JWMdl+ed64oSQL777rsmysd7772XjKv13zoMjHFkcPPNN1uvK1UFOBcKZwHTp09PddvTaxs2bDAzXO0i0NN6va6MfCPfvORcnPmWjHNcnndWFCXAnDx5svE6o/2WJmNr7be2uDWefbSVq69GNdjoxl4tPA35leDE4PTTT1cDBgzwqwme1ku+kW9eEi7OfEvGOQ7PO2uKEmDqAMRGYWAT3HbSoaOUDldljHey8Vrjdvuef/5586KgHZm7LbpYefDgc+KJJyq4CUS8y7gk8k0U+eYd2+PMt2SUo/68s6ooAeaUKVOMxSX8rdpKn332mVnuRFDiIChJp5/oO5ZhvXx4weXdQQcdZPZJ46QkEzGHha9tvtWuXVv17duXfCPfPHm+BZFvzt+c8xnl5511RQkQly1bpo466iilAy+7ekQBS606PqPSLqbM7E0fhDWzWGfggvCJ4yI6nqTCG5fttGrVKtWgQQPVs2fPQD3Abfc7Wb4XfNPOJZKrDcRv8s37YYgz35LRBv90cPjIPe88UZQAUwdPNtFA8LaP4yOInpFt0lG2lQ4zZQxVcAgYsu666y5VpkwZpX2kmkgmsHwNSsJe5eGHH66wd2rDCTxm0Yg4gheGMWPGBKXbvrbDNt987VwxlZNvxQBk4Xac+ebAuWLFirzoTzo0WaSed54pSgdMKDBYpOKhfvLJJ5uoHlg6LS7h0DzeVv75z3+qSpUqqQ4dOuQzllmzZo3STtbNzFIHRVY6RqR67LHHAjOzgnLXQZfN7BLhs/DbjYTwXA0bNlStW7dW6eDoRp1hkuEG3/Dypd14GQO1sPSdfPNnpNzgW6rnmz+9Sa9WvCTgma5jVaqSJUuaVa2o8a8EoEj25efFb32MQ/QRChOIGFEttJs5qVOnjugzmILIGYgssnnzZtEKUj799FPRxjqi46DJP/7xDxPcWM9MCzRTLzvK0qVL864joLJ2OmB8sOq4jnnX/fyCINJDhgyRadOmiVb2cvHFF4uOS5lRNJCvv/5annnmGdHxKQV+F/W5TTn33HP97Fbg686Fb+3btzfRccAnBNlu1KhR4PvrNNDhmz4iJDpmrOh9VfLNAcfiZzp802eb5ccffxQd/k60Yin2+WaxuVmL1mfVpUePHuZZre0jTBD7Bx54QPSqoZHp8C/szzvfFGXyyEAh6hmRQAlAKerjDbLHHnuYyB962VJq1qwp+m0luVi+3yNGjBA9axMMmJMQlgpKV/s5Fe3Ozihh556fn9qdnDz33HMybtw40W+hctpppwkUfd26dU0YLfRdLyWLPuBsXiLwsoA/qFmzZpmXByhZOHs/4YQT/OxGaOvOlG+I7K7fnM2Lyfz5881YhaXzixYtkmOPPdZwBQ9n8s37kUvFNzzjLr/8chk2bJh5PhX3fPO+1YXX+P333xtlOHPmTNHez/Iy4pkFflWuXDnvGr6E/XkXGEWZD9Usf+DtTAcmFrzNJaeyZcua2I54UAQt6UDMglk1ZsP4h7c0vcaPZXHzYNab4yZMGF4Y9HK11K9fv9iXhqD1Mezt0dbLgggsSHppTLTHI9FO8APfLW3gZZQkHmb33Xef9O/fXxL5hpcvPNjwcqqtpMk3D0f0xRdfNLMxxOTVW0eh+JvGyh9WszAh0cfQzL9EyPQWkGj3oYmXCnwPJf/SW4UOT65mzZqZ/SQ9Ovk+sX6uQ24FviNwf6cDORvvRoFvbIwaiH1gh1N6lULpN2aF6DRBTvqt35xjxr4R9uxtHpkJMg5BbRv8xoJLsNZ/4YUXgtrMfO3CXqRjC+L8PTifehXMV9el+Rrq8o+i1zI1AmFLffr0MW/FTrtLly4tmJFhlqYNgZzLgfzE0t4jjzxi3iyxpMEUHAT233//vMbov0GzJN60aVOzpJR3I0BfsOeF1QftxlC0VbToly/Zc889A9RCNgWrSOASxurf//63+R50VLp3726ep1hiTU5YSo5KYPjkvkVOUcLwwll6xb6SdiVnHhBBMeZJHoDE39ivxB8OljSmTp2aeIvffUZAO3HI1wIoHyzjH3/88XlLsvky+PgD/IHRmz42lbc0hr16vDAyBQMBKBXtiCSvMXihefnll/N+B/ULtn/0uVE55phj8tl7YH/1vPPOM/YgQW17Lu2KnKKEEUzLli0NJhdccIFgjwYWoYhQjodbkNOdd94pOkSXaaJ2+2eMR4Lc3ji1DYoSqxOJCXzCAw77lz/88EPiLd++40VLuy6UxYsX5+MPrnNG6duwFKj4448/NjYTzg3MKq+77jrnZ6A/YaiDiQeMD3FCAQkW4dozWqDbnUvjIqcoAYZ2WCzaIYGMHTtW9JlKGTp0qFFAAwcOzAUrq2VnzJhhTKydSjAbnjdvnvOTnz4jgJUJGIQlJnALyvOGG24Q7X0p8ZZv32HdnWyJiMbAUIczSt+GpUDFOrKSsexPvAFL0jCsJMGQB1aseD7hpAH+BvDSiKX+yCb9phmLpN/4jScfvbwRyP4mGyHBoOfaa68NZFvj2Cj9IqP0jMwY9GiFqfTDQV100UVq9erVgYED3qpwWF0/rAr8gwEGwq4xBQMBvcpVYIwwbvoseTAaWEgr9JE2E29Ybzvk5UDYsag7O4nU8ZDi3mY++ugjadu2rTk0HiTTfpyRbNy4cb7zSOgL9gMS9zGK6x/v20MA+zJHHnmkMRTTocuMMQ9qe/jhh+1VmqFkvNXDYE17sDLGO4nniSEK+2Iw6mHyHwGsUGAGmZzgQASORNq1a5d8y/ff2jWitGnTRt566y3zt+B7g7xsQN5rQUy+6OVYBU/8iFQelKT3T82RED3u+d4y4YpPeycKSjNj3w5tOa30eUSDgz5TaY6IBHGWBs7AMb5eajVHD8ArzICZgoEA/D0n/q3j6BpWK3C8AtdxbCRoCStyep/eRIMKWtu8aE+sZpSahCZpIhojn1deeSUj13FOeTc/YQSyzz77pBSJg+043BvEt8uUDY7ZxX/9618CI59bb701UD2H1Tccb7zzzjuil4Zl8ODBxqkAnAsw+Y8A/uZhcAjuwBMXDujjb1wHeJCDDz7YGMb438pdLQCf0F54DwuynceuFrv/LZaKEktQGPhTTz1V7rgFlfVzAAA9Q0lEQVTjDvdRzUAiTPhPP/1045YOXi906DBjNAJDEbQTlmRwccUUPATgxxL+h2HYkGzo42drsXSHo0YwEHMSrCqxrMcUPATw4g6f1PCaFMSEZxCOQukADL5PLPzCJ7+9u1+t8LheWGnBfRSckePf2Wef7XELdlWHt8rEfUiYXmMmACWpl2gEh9qZgokA9pC1EZY8/fTTAkcXQUmPPvqocZSf2B4qyUQ0gvUdzwC8MAcxjRw5UmChqw12YqskMS6xnFE6hFy4cKEx7pk7d24g/HZCOeJYCJY6cECcKfgIwEReW78ah/VBcGoNgzU43cCSaxDaE/wR9L+FmKnpQODm5d3/1uxqAZ6LOJOLIACI6hTnFMlzlOkOKGaTOGOJ8ENY9vQ7YQYJB8lUkn6PRPr1I3oLzlAGxasKzrVddtllVJLpD6HvOYM4o8R2Ahy2YBk/7koSBIm1ogQAmA3A3RdCVmnrKVzyLSH6iQ5o7Vv9rDg7BOBw4P7778+usIulsI/00ksvCYyMmMKDQNAUJY4VwbgIvG7VqlV4gLTY0tgrSmD70EMPGWMauJDzM1FR+ol+9nVjjxvxBhHU2c/0n//8xyy7YlWCKTwIYEUCxlbJ51796gHO4upoOXLVVVf51YTA1UtFqYcEFqbYJxgzZowgErxfiYrSL+RzqxdL5fDTiXiPfiU4G4ARDwIBM4UPAcSfDYJBz5AhQ0w7HnvssfCBaLHFVJR/g4uzjFi20ge1jWGGRcwLFY2lMy69FgpPoG8g/NCiRYtM4G0/Gvrqq6+avVLsuzOFD4EDDzzQBG/2s+XTpk0zL1vYb9cuD/1sSuDqpqJMGBKETLr33nuNcQ8ivnud4NKqWrVqXlfL+lxAAA8WnIfza6+Ss0kXBtFHEX7vU+KIGiYJODaXGHvVR0gCVTUVZdJwXHzxxcYZAdbpvU5cevUacXfr69u3r4n+8PXXX7sruBhpK1euFPjhhGcXpnAi4Kei1O48zeQAWwdNmjQJJ4CWW01FmQJgOLr+7rvvZNCgQSnu2rtERWkPWy8kI94jXrRgHOZlwqHwSy65hMtlXoLucl1+KUpY+iNW75lnnil+TA5chtGaOCrKFNDCuAdLENjQxt6PVwnnKLn06hXaduq55pprjKcer87laiftJu5qkDwD2UE22lL9UpQ33nijCfDt15ZBWEaVirKQkUIYHBj34JzlihUrCsnl7mXOKN3F0w9p2N/B2zlmeV6k8ePHm4C5eNAyhRcBOENfs2aNpx14/vnnTUg2hGWDW0+mwhGItQu7wmHZdeeJJ56QBx54QD744APrTqX3228/Wbx4caHRRHa1it+CjMDSpUtNpAWY+5cpU8ZqU3HeDbMBRHZgCi8CWAItX7688RCGFS3bCRbacLQye/ZsadCgge3qQi+fM8pihhBeTlq0aGF9/R5/KI4Lu2KaxNsBR6B+/fpyzDHHmAgeNpsKP7NYem3durXNaijbAwRwFhcvynAdZzth5eq8886T0aNHU0mmCTYVZRpAwbhHB+o1cf3SyJ5VFnh20YFbuQSSFXrBK3T99deblQibLYNfVzgYoG9gmyh7J9uLfco//vjDKMkePXoYL07e9S7cNVFRpjF+WD6DcQ/2naZPn55Gicyz0JAnc8yCXOKUU04xS/VTpkyx0kwE/505c6Y5+2alAgr1HAHsU9qeUfbr188EXrj99ts971+YK6SiTHP0sCwCN3cw7sG5NbcTFCW8AzFFB4F///vf1tzaPf744ya6A1YhmKKBQM2aNa0a9IAzb7/9tokIwlWIzDhDRZkBXgjSe9ddd5klC7cdGGOGQGfWGQxGCLJiHwjncRHPz82EuKU4unTFFVe4KZayfEbApuUr9rMHDhwocFPHIN6ZDzQVZYaY9erVS5o2bSpY43cz8WiIm2gGQxYCJ8NZuttn1KZOnSqHHXaYwGiIKToIQFGuX7/e9Q5BZocOHYxxGWNLZgcvFWUWuMGv5ldffSXwtO9W2rBhg3Fq7ZY8ygkGAvB2grf5L774wrUGDR8+3ARndk0gBQUCASy9rl692tW2wCoasSXxwsYjRNlDS0WZBXYw7oEzgkceeURmzJiRhYSCRbj0WhCTKFwpW7aswIDCrVnlsmXLjNJt3759FOBhHxIQgKLECzhCprmV4Ogc5ySvvvpqt0TGUg4VZZbDDg8ssISFcc+qVauylLKrGJded2ERtW/YS0ToIkSHyTXhSAjc1dGTSq5IBq88HA0gzB6OormR4OQc3n5wXpIpNwSoKHPAD8Y92CDH0sa2bdtykCTG2QAinTNFD4HKlStL165dZdiwYTl1DqHfXnjhBaMocxLEwoFFwK0Azq+99prhG17mGVsy9+GmoswRQ4RWaty4sYkakYsoLL3SIXouCAa7LJa+xowZI7nEOX366afNPhOPEQV7rHNpnRsBnJcvX26MDaEka9SokUtzWPZvBOgJ928g4EIu21kh9p/gNxFhuQYMGJAVuaAoy5UrJ1u3bs2qfDaF8KbphV/JbNrmZ5lcuFBYu/ESdOqpp5p9bQR4zibBiAeGZDY4Qi6kHhEbXEhd019XcV4bii7bMUbUGjjlh0MB7E1mI4dcKDhCdIr+Nya33XabUXQVKlQoiFIaV/AHtXPnzqz3jnA2rlSpUp65I0N7cRYUn0z5EciVC/ml7fqVC0dQFkYe4IjbiVwoHFFbXCisRowxxiPbccYzCM4EcDQpm0QupEaNM8q/cYH5PsLOxCVKPP6gbEe2SE254F8lF4I/Rl61kFzwCulg15Pda0ew+8TWEQEiQASIABFwDQEqStegpCAiQASIABGIIgJUlFEcVfaJCBABIkAEXEOAitI1KCmICBABIkAEoogAFWUUR5V9IgJEgAgQAdcQoKJ0DUoKIgJEgAgQgSgiQEUZxVFln4gAESACRMA1BKgoXYOSgogAESACRCCKCFBRRnFU2SciQASIABFwDQEqStegpCAiQASIABGIIgJUlFmOKnwyJjpR37hxY1Z+U90qB+fHbgZ8zRKWWBZL5gJASORGuqCQC+kiFdx8yVxAsAP4T800kQuZImY3PxVlFvhu375devfuLfgjgKf/E088Ue688045+eSTZcqUKWlJdLvct99+K4hK8fvvv6dVPzO5g0AiFyBxyZIlJj7pddddl3YF5ELaUAU6YyIXFixYIE2bNhWERKtdu7Y8+eSTabWdXEgLJu8z6bcdJo1Ax44dlXaKXiwWeqagdLgkNX/+fKUjfqh69eqpu+66y5R77733lI4+otauXVukHFvlFi1apNq2bav++OOPIuvHTbRBRxgoNl8cM2TDBeCkZwFq7NixqmbNmqpPnz5pQUcupAWTb5my4YIOOKB0jFo1cuRINW/ePNW8eXNVqVIlpaP1FNkPcqFIeHy9yRllhu8mI0aMkCOOOEKaNWsmiCywbNky6dy5s5HSpEkT2XvvveWNN94oUqqtcg0bNhT9Bynjxo0rsn7edAeBRC5AYuXKlU3AXATfTTeRC+kiFex8iVxYuHCh6BclQVB3rSTllltuEcSJfPvtt4vsBLlQJDy+3qSizAB+LK3cd999eaG49AzOlE6MIo7Aq1h2KSrZLNehQwcTVxNhtJjsIZDMhWxrIheyRS445ZK5cPzxx8vFF1+c18C6deuaAOm4XlQiF4pCx997VJQZ4I/Z44YNG+TII480pUDsihUrCiKCOwmR7NNRlLbK6WU/Wb16taxatcppEj8tIJDMhWyrsMkhciHbUcmsXHFcmDNnjrRu3dqsOBQlmVwoCh1/71FRZoA/NtoRebxq1aqm1I4dO8ybYqKIsmXLmgjjideSv9ss5yz7YRmHyR4CyVzItiZyIVvkglOuKC5gtjls2DAZOnRosQ0mF4qFyLcMVJQZQK83442pt3MMA0uumzdvFm08kycFxzSwh1lUslkOe6RIaBeTPQSSuZBtTeRCtsgFp1xRXLjsssvktttuE230V2yDyYViIfItAxVlBtAfdthh5qwijoUgacs2ozhxNMNJWPZ0lmada8mfNstt2rTJVOfMLJPr5m93EEjmQrZSyYVskQtOucK4MHz4cIGBXfv27U1jv/nmmyLPOpMLwRnT5JZQUSYjUsRvvBXqIxUCwiO1bNnSvCk+99xz5ve6desEigpnLJF+/vlnufzyy0WbiJvfzn+2ykH+119/LaVLl07rDdZpDz8zRyCZC4kSfvvtN0k2piIXEhGK1vdUXMB56vHjx0udOnXk1Vdflf/+97/mWYDnB7kQvvEvHb4m+9di7E1edNFFMnv2bGnUqJHZi5w8ebJ06dJF1q9fb5Tk6NGjpUqVKqaR+jyljBo1SpYuXSrY0HdSiRIlxEY5yH/llVfk/PPPN8dUnPr46T4CyVxADVCQQ4YMkcWLFwtWGZ544gn517/+ZSonF9wfg6BITOYCjHvwTMCS7JlnnpnXTH3emlzIQyNkX3w9xRmgytM9WKxnk0qbeyu98Z6v9T/99FO+386PlStXKj2rdH4W+HSznN6XVMcdd5zSxgUF6km+QIcDyYjs+p0rF3ZJyv+NXMiPRxh+kQthGCX7bcQeG5NGIN0/CIAFrzz6nFQBZZkMpDb6UXpGoaBcM0nZlIPHoDZt2pi2pVMXFWXhKJELhWMTtzvkQtxGPHV/S+ByyCbBVprbqVMnOe+88/KcCRRXiZ4dmCzw4xiEhOUenOc89NBD02oO9tDKlClTYC8trcIRz0QuRHyAM+geuZABWBHOyj3KLAc3KArSaX465udOXn66iwC54C6eYZZGLoR59ApvO61eC8eGd4gAESACRIAICBUlSUAEiAARIAJEoAgEqCiLAIe3iAARIAJEgAhQUZIDRIAIEAEiQASKQICKsghweIsIEAEiQASIABUlOUAEiAARIAJEoAgEqCiLAIe3iAARIAJEgAhQUZIDRIAIEAEiQASKQIAOB/4GBw6K4K0G8STjkNBfOmVKPdLkQmpc4niVXIjjqBfsMxXl35g0adJEunXrJuXLly+IksUrCAKNfwiN5WXCA6B69epeVhmausiF0AyV9YaSC9YhDkUF9PXq8zBdcMEFMmnSJNFOyqVUqVI+t4bV+4kAueAn+sGqm1wI1nhwj9LH8fjjjz9MUNcKFSrIG2+84WNLWLXfCJALfo9AcOonF4IzFk5LqCgdJHz4nDFjhplFIsArgvwyxRcBciG+Y5/cc3IhGRH/f3Pp1ccxaNeunUydOtW0oGzZsrJp0ybBJ1P8ECAX4jfmhfWYXCgMGf+uc0bpE/aYReLN0Um77babTJs2zfnJzxghQC7EaLCL6Sq5UAxAPt2movQJ+ClTpgiUo5O2bNkio0ePdn7yM0YIkAsxGuxiukouFAOQT7e59OoT8C1atJA5c+bkq71MmTLy448/SqVKlfJd549oI0AuRHt8M+kduZAJWt7l5YzSO6zzatq4caO8++67eb+dL1CUL730kvOTnzFAgFyIwSCn2UVyIU2gfMhGRekD6Dg3mbjs6jQBXoEef/xx5yc/Y4AAuRCDQU6zi+RCmkD5kI1Lrz6AXqtWLfnhhx9SOhjAXuWGDRukSpUqPrSMVXqNALngNeLBrY9cCO7YeOs3Lbg4eNqyuXPnyvz5802dH3zwgSxcuFD69u1rftesWZNK0tPR8LcycsFf/INUO7kQpNHI3xYqyvx4ePLrgAMOkI4dO+bVtXbt2ny/827wS+QRIBciP8Rpd5BcSBsqzzNyj9JzyFkhESACRIAIhAkBKsowjRbbSgSIABEgAp4jQEXpOeSskAgQASJABMKEABVlmEaLbSUCRIAIEAHPEaCi9Bzy/BWWLFlSSpQokf8if8USAXIhlsOestPkQkpYfLtIRekb9H9V/Oeff4pSyudWsPogIEAuBGEUgtEGciEY4+C0gorSQYKfRIAIEAEiQARSIEBFmQIUXiICRIAIEAEi4CBARekgwU8iQASIABEgAikQoKJMAQovEQEiQASIABFwEKCidJDw6RMWr7BwYyIC5AI54CBALjhIBOOTT2ifxwEWr7BwYyIC5AI54CBALjhIBOOTijIY48BWEAEiQASIQEARoKIM6MCwWUSACBABIhAMBKgogzEObAURIAJEgAgEFAEqyoAODJtFBIgAESACwUCAitLncaBPR58HIEDVkwsBGgyfm0Iu+DwASdVTUSYB4vVP+nT0GvHg1kcuBHdsvG4ZueA14kXXR0VZND68SwSIABEgAjFHgIoy5gRg94kAESACRKBoBKgoi8aHd4kAESACRCDmCFBRxpwA7D4RIAJEgAgUjQAVZdH48C4RIAJEgAjEHIES2qegijkG1roPy7Xly5fL6tWrzb9169bJhg0b5KeffpLNmzfLjh07ZMuWLfL7779L5cqVpUyZMlKpUiWpUqWK7L333rLffvvJwQcfbP7Vq1dPypcvb62tFGwXAXLBLr5hkk4uhGm0/morFaWLY7Zy5UqZN2+e+ffhhx/KsmXLpGbNmkbR1apVSw455BCjEKtVq2aU4W677Sa77767lC5dWrZv324U5rZt2+THH3+UjRs3ChTrmjVrzOenn34qNWrUkKOPPlqaN28uJ5xwghx33HGmrItdoCiXECAXXAIyAmLIhfAPIhVlDmMI5fbaa6/J9OnTzb9SpUpJs2bN5KSTTpJGjRpJ/fr1pUKFCjnUsKvozp07ZcWKFbJkyRKZO3euUcZffvmlnHLKKdK2bVtp166d7L///rsK8JunCJALnsId6MrIhUAPT1aNo6LMEDYoLCjH5557TqZNm2YUY5s2bYyyOvzwwzOUllt2LN+iLTNmzJDJkydLgwYNpFOnTtK1a1fZa6+9chPO0sUiQC4UC1FsMpALER9q7FEyFY/AN998o2699ValZ21KL32qUaNGKb1EWnxBj3LofU71yiuvqG7duim9z6m6d++u5s+f71Ht8aqGXIjXeBfVW3KhKHSic0+i0xU7PdF7g6pHjx5qzz33VFdddZVaunSpnYpclKoNhtSwYcOU3hdVeilYvfjii0obELhYQzxFkQvxHPdUvSYXUqES3WtUlIWM7eeff646d+6s9t13XzVkyBC1adOmQnIG97JeDlKTJk1STZo0UdoISE2ZMiW4jQ1wy8iFAA+Ox00jFzwGPCDVUVEmDYQ+uqEuu+wyVb16dXX33XerX3/9NSlHOH9CSTZs2NAsGy9cuDCcnfC41eSCx4AHuDpyIcCD40HTqCj/BhlLkyNHjlT6/KLq16+f+vnnnz2A3/sqnnzySTNLvvjii5U+guJ9A0JQI7kQgkHyqInkgkdAB7waKko9QFhO0ecSzX4evkc9/fLLL2rAgAFqn332Uc8//3zUu5tR/8iFjOCKdGZyIdLDm1HnYq8oH330UaUdAKgRI0bEzuDlvffeU0ceeaTq0qVLKPdgM2J6GpnJBXLBoQm5QC44XMBnbBUljHPOPPNMpb3bqFWrViViEqvv2o2e2ZPVrvLUggULYtV3p7Pkwl9IkAvKvDDyuaAUueA8Hf76jKWihDELjk5cd911CucPmZTSzhNU1apV1WOPPRYrOMiFgsNNLvC54LAirlxw+u98xk5RYuBh0cq9OYcCuz61izyl3e6p/v37x2IZmlzYNfbJ38iFZETi+ztuXEg10rFSlM8884wxYFm8eHEqLHhNI6Cdsivtq1ZdeOGFkZ5tkwvF051cKB6juOSICxcKG8/YxKMcOnSo3HzzzTJnzhwTgSPingmz7h5Ceb3++uvy22+/id6rka1bt2YtK6gFyYX0RoZcSA+nOOSKAxeKGsdYOEUfPXq09O7dW9avXy8HHHBAUXjw3t8I6PNj0qdPH1m0aJGJVIJYmVFI5ELmo0guZI5ZVEtElQvFjVfkZ5QDBw6UQYMGmRiPVJLF0WHX/ZIlSwqUij4+ItrIx8TL3HU3nN/IhezGjVzIDrcolooiF9IZp0jPKHWED3nwwQfNjEgb8KSDB/OkQOC0004zAaKnTp0qCDYdxkQuuDNq5II7OEZBShS4kO44RHZGOXHiRBk8eLDZb6OSTJcOqfMh5iWWXnv27Anjr9SZAnyVXHBvcMgF97AMu6SwcyET/CM5o3zzzTelY8eOMnv2bBPMOBNAmDc1AjDuwRtk48aNzSw9da7gXSUX3B8TcsF9TMMqMaxcyBjvwsxhw3p9zZo1xun3O++8E9YuBLbdW7ZsUUcccYR66qmnAtvGxIaRC4louPudXHAXzzBLCxsXssE6Uucot2/fro455hgTtDgbMFimeAQ+++wz48Hno48+Kj6zjznIBfvgkwv2MQ5LDWHhQrZ4Rmrp9YorrpBy5crJ/fffn/HMmgXSR+Cll16S66+/XrTjBqlQoUL6BT3MSS54Aza54A3OYaglDFzIFsfIKMrp06ebs5KffPKJ7LnnntniwXJpInDJJZeYnDq+ZZolvMtGLniHNWoiF7zFO8i1BZkLOeGW7VQ0SOUQgHj//fdX8+fPD1KzIt0WLG3Wrl1bTZkyJVD9JBe8Hw5ywXvMg1pjULmQK16RmFHiLQYulh555JGcXhpYODME3nrrLenevbssW7ZM9thjj8wKW8pNLlgCthix5EIxAMXodhC5kCv8oVeU8N160UUXid5MNvuTuQLC8pkh0LdvX+OEYPjw4ZkVtJCbXLAAagYiyYUMwIp41iBxwRWoc52S+ll+586d6qijjlL6QLmfzYh13Rs2bDBWsHpW6SsO5IKv8JvKyQX/xyAoLQgKF9zCI9SeeZ544gnZa6+9pEOHDq68NFBI5ghUqVJFbrvtNrnqqqsyL+xiCXLBRTCzFEUuZAlcBIsFhQtuQRvapdcdO3aINiYR+B/VZyfdwoNyskAAEQW0IwIZM2aMnHLKKVlIyK0IuZAbfm6WJhfcRDPcsvzmgpvohXZGOXLkSONOjUrSTTpkJwsRBTCrvOWWW7ITkGMpciFHAF0sTi64CGbIRfnNBTfhC+WMEjOIWrVqyaxZs6RevXpu4kFZOSCAkFww6mnVqlUOUjIrSi5khpdXuckFr5AOfj1+cMFtVEI5o3z22WelYcOGVJJusyFHeddcc40MHTo0RymZFScXMsPLq9zkgldIB78eP7jgNiqhnFHWr19fRowYIS1atHAbD8rLAYE//vhDatasaaK21K1bNwdJ6RclF9LHysuc5IKXaAe7Lj+44DYioZtR4qwcEpWk21TIXR6COvfq1UsQJNmLRC54gXJ2dZAL2eEWxVJec8EGhqGbUXbr1s0Y8fTv398GHpSZIwLr1q0zVshff/21lC1bNkdpRRcnF4rGx++75ILfIxCc+r3kgo1eh0pR/vLLL2Zpb+3atXR8boMNLsk866yzpGvXrtK5c2eXJBYUQy4UxCSIV8iFII6KP23yggu2ehaqpVecmTz55JOpJG2xwSW5HTt2lBdeeMElaanFkAupcQnaVXIhaCPiX3u84IKt3oVKUeLh26lTJ1tYUK5LCLRr184Y9OjI5y5JLCiGXCiISRCvkAtBHBV/2uQFF2z1LDSK8rfffhN4pQfYTMFGAPFAMfOfMWOGlYaSC1ZgtSKUXLACayiF2uaCTVBCoyhnz54tjRo1kooVK9rEg7JdQqBNmzby6quvuiQtvxhyIT8eQf9FLgR9hLxrn00u2OxFaBTla6+9JtgMZgoHAmeeeaZgzGwkcsEGqvZkkgv2sA2bZJtcsIlFaBTl3Llz5aSTTrKJBWW7iABcDMLX46pVq1yU+pcocsF1SK0KJBeswhsq4Ta5YBOIUCjKrVu3yvLly+XYY4+1iQVlu4zACSecIPPmzXNVKgyEVqxYQS64iqp9YTa4wOeC/XGzUYMNLthoZ6LMUCjKBQsWGCcD8PDAFB4EsALw7rvvutpgcOG4444TcsFVWK0Ls8WFxo0bkwvWR8/dCmxwwd0WFpQWCkX58ccfS4MGDQq2nlcCjQDGDGPnZlqyZAm54CagHsmywQU+FzwaPJerscEFl5tYQFwoFOUnn3zCh2OBoQv+haOOOkqg2NxM5IKbaHoni1zwDuug12SDC7b7HApF+dlnn1FR2maCBfmVK1c2XpTg99WtRC64haS3csgFb/EOcm02uGC7v6FQlKtXr5aDDjrINhaUbwGBAw88UNasWeOaZHLBNSg9F0QueA55YCt0mwu2Oxp4RYkI9ps3b5b999/fNha+y0fctpUrV/reDjcbcMghh7imKMkFN0fGe1nkQnaY87mQHW5ulgq8osSyXRyUJLzYYNZ88803uzm+vsvC2H3zzTeutINccAVG34SQC5lDz+dC5pjZKBF4RblhwwapWrWqjb4HSuYZZ5whzZs3l9KlSxfbrrfffls++OCDYvNlmuGBBx7ItEix+TF2GEM3ErlQEEVyoSAmUbrC50IwRjPwinLjxo2y9957e4qWUsrUhyWPdJNTBp/O93TL/vnnn4J/UJLwZpOY4AA8Ud63334rCFiMeIyJKTmfcy/dPrz00ksyZMgQp5hrnxg7jKEbiVwgFxwekQvkgsMFLz7zP5W9qDHDOuB9o1y5chmWKjo7lvDat29vIpEcc8wxMnjwYKOoEJ3knHPOkbPPPtv4la1QoYI53O5YbcI7UMuWLQV7LT169DB7b5s2bZIrrrhC9t13X3nyySdNYGlsVC9btqzoRui7UIA33HCDdOjQwdT55ptv5pX56quvTEixm266SerUqSNTpkwx96655hpZv3693HLLLfLQQw9JYfkgu3fv3tKvXz85/PDD5fHHHzflU/UB8q699lqB1xv03c3Zavny5Y3cvI7l8IVcIBcc+pAL5ILDBU8+9QM10Om5555TnTt3dq2NO3fuVFo5qgcffNDI1IeWlZ7JqWHDhimt9My9KlWqKK0s1NixY5VWlkorJfX777+revXqKX2OT2mFovRZINWnTx+lZ4Jq6NChmIIqrXDVl19+qbQ/Q6WVZ7Ftfvjhh5V252Rk6Jmfql69uurevbspd+WVV6pWrVqZ7/fcc4/SYavMdz2jNHXNmTOnyHyvv/66atKkicmDPurZYqF9QCa0BfW7nSZNmqTOO+88V8SSC0qRC39RiVwgF1x5qKQppPgNMU/UdeGVYOmwbNmyhWfI8M78+fNl0aJFMmHCBFMSh1+PPvpoM+Pq37+/YDZ4xBFHmJkkXKVhSRIb6scff7yZyekHlSlXokQJeeeddwSfWoGaa7169ZJq1aqZvJjpFZe0cpaePXsaGVh2RQxHJ/Xt29fs7WE2ixleYc7FC8uHvcH3339frr76ahk0aJB06dLFRPPA7DG5D06d6IvbCasB+iXDFbHkArngEIlcIBccLnjxGXhFWapUKdcetAB07dq1BXBt2rSp/Oc//ylwHRdgYHPnnXeKnilK7dq15dlnn02ZL/FimTJlBHuGRaXt27ebpdsDDjggLxv66igreNnH0ioSlk6TfaYWlw9LyliexbLyiy++KDNnziy2D47MvAa58AVKEv1yI5EL5ILDI3KBXHC44MVn4PcooXTcmpEAUOeoSaLiwWyuRo0aKfHGucbDDjtMMPPEvuN3332Xlw/u2Qqb6eVlKuTL7rvvbvY1McNNTI6ywkzw+++/NzPdVM4Wisv3+eefy/XXXy+zZs0SvdwsN954o+t9SGx3Yd8xdhhDNxK58HhKxxvkQu7s4nPBvWdbOqPh5nMhnfpyzRN4RQmF8n//93+59jOvfLNmzeTggw+W6dOn513DEmXXrl3zfv/www/m+6+//iqzZ88WLKnC4z0e1O3atTPX3njjDTPThCwchEeC5SrStm3bim0zrFvPPfdcmTp1qlnSxVISDG2w1IrZKOTDshVtgJEPrsHYBsYxSGu0t5svvvii0HwffvihMQCC8dHw4cPNcnNRfYBcOHb4+eefTTtMJS785+YSGblALjiUJBfIBYcLnnymuZfpWzYYregHvKv1w1BHz9KMwY1WVuqCCy5QWiGZOrTVqzFqwTW91Kq05aiCARDS6NGjlVaWSis51bZtW7V06VKllYtq3bq1MbDRFqbqrbfeUnp/UGl/hkorOFOusP9g+FO3bl0jU++LKvzTilzpPVF17733GiMjPZtVd999t8mjLXWNKBjH6AeFuu222wrNp5eIld5vNcYfen9STZw40ZRN1Qfc0DEejRGSnlmbPpjMLvwHIykYJrmRyAVyweERuUAuOFzw4rMEKvFEI2dZCZY7cXwineMWmVSB2R8CAMNBr7b2zCuKGSOOhYwcOdLMIJ0ZnJMBMzvMuvbZZx/nUqGfmA1ilpYqwUBJW9eaW5jB4rwhZqIVK1bMy47faAsS6k00aoLcvfbay9xLlQ+zcOzjYPkWbXWW5xxZqfqAfVPMdPG27la69dZbDY74zDWRC+SCwyFygVxwuODFZ+CNeWBF6taB9URAoRBgJJOcoGCwfu4ooeT7UFaJCiv5fuJvLJ/qYyiJl/K+w9jGueco6kQliYyOksT35DoT25cqH/ZdkXC+MzkV1ge3z6uiXoxd/fr1k5uQ1W9y4S/YyAUx1uV8LvC5kNWDJJtCXkxbc61DPxiUPmCcq5hiy0+ePFnhDKV+ICvtPKDY/MxQPAKnn366mjZtWvEZ08xBLqQJVACzkQsBHBSfmuQ2F2x3I/AzSih/HJVAeCW3ZiaFvVC0adMm7/gIZpxMuSMAoyMYPLmVyAW3kPReDrngPeZBrdFtLtjuZyi0Ac4v4hyj7YS9OSx/4l/y3qTtuqMoH/vAcHAAl39uJXLBLSS9lUMueIt3kGuzwQXb/Q2FomzQoIEsXrzYNhaU7zICn332mcChQvKeWi7VkAu5oOdfWXLBP+yDVrMNLtjuY2gUpfaxahsLyncZAYwZFJubCfLIBTcR9UYWueANzmGoxQYXbPc7FIoSPldxgJ4pXAgsXLhQGjdu7GqjyQVX4fRMGLngGdSBr8gGF2x3OhSKEvtSCKvjhLuyDQrlu4PA3Llzja9cd6T9JYVccBNN72SRC95hHfSabHDBdp9DoSgBwoknnijJflFtg0P52SMABwnYi3B7RokWkQvZj4sfJckFP1APZp02uWCzx6FRlNpNnAl3ZRMMynYPAThbaNSokauGPE7ryAUHiXB8kgvhGCcvWmmTCzbbHxpFecYZZ1BR2mSCy7LhdF77w3VZ6l/iyAUrsFoTSi5YgzZ0gm1ywSYYoVGUOGgOt208JmKTDu7JRrBrKDQbiVywgao9meSCPWzDJtkmF2xiERpFCRB0RA8ZP368TTwo2wUEELYMzhtselIiF1wYKA9EkAsegBySKrzggi0oQqUoL7zwQpkwYYItLCjXJQR0SC/p1KmTS9JSiyEXUuMStKvkQtBGxL/2eMEFW70LlaLEDGWPPfYQHfPRFh6UmyMCCNQ8bty4fIGwcxSZsji5kBKWQF0kFwI1HL42xisu2OpkqBQlQOjVq5fo4MO28KDcHBGYOnWq6GDUUqdOnRwlFV+cXCgeIz9zkAt+oh+sur3kgo2eBz5wc3KnN23aJIceeqisXLkyL/Bxch7+9g8BWLp27dpVunXrZr0R5IJ1iHOqgFzICb5IFfaSCzaAC92MsnLlytKxY0d5+OGHbeBBmTkgAB+OsEq2vT/pNJFccJAI3ie5ELwx8atFXnPBRj9DN6MECMuXLzfeWdauXSvlypWzgQtlZoHARRddZJZdb7jhhixKZ1eEXMgON9ulyAXbCIdHvh9ccBudUCpKgIDjAc2bN5cBAwa4jQnlZYHAqlWrpGnTprJixQrZc889s5CQfRFyIXvsbJQkF2ygGk6ZfnLBTcRCqyiXLVsmLVq0kNWrV0uFChXcxISyskCge/fucvjhh8stt9ySRencipALueHndmlywW1EwyvPTy64iVpoFSVA6NKliznUftNNN7mJCWVliACcn5966qlmNonjO34kcsEP1AvWSS4UxCSuV4LABbewD7WiXLdunTRs2NAE8q1Ro4ZbmFBOhghAScKAp0+fPhmWdC87ueAelrlIIhdyQS9aZYPABbcQDZ3Va2LHa9asKZdffrnceOONiZf53UMEpkyZIj/99JNceumlHtZasCpyoSAmXl8hF7xGPLj1BYULriGkQp5+/fVXdfDBByvtlT7kPQlf83/++We13377KR2INRCNJxf8GwZywT/sg1Zz0LjgBj6hXnp13hYQ46xnz54mUDANexxU7H/27t1bSpYsKaNGjbJfWZo1kAtpAuVyNnLBZUBDLC6IXMgVzkgoSoAAd2Z//vmnPPHEE7liwvJpIDBjxgzBH8SSJUukUqVKaZTwLgu54B3WqIlc8BbvINcWZC7khJsb09IgyNi6davSru3UpEmTgtCcSLfh+++/V/vss09gllyTwSYXkhGx95tcsIdt2CQHnQu54BmZGSXeFj744AM566yzZMGCBXLQQQfl9ALBwqkRwKy9TZs20qRJExk0aFDqTAG4Si7YHwRywT7GYakhLFzIFs9QW70md7px48Zy++23y9lnny3asCP5Nn+7gIBjYXzHHXe4IM2eCHLBHraOZHLBQYKfYeFCtiMVqRmlA0KPHj3MjPLOO++UEiVKOJf5mSMC48ePl5tvvtnM2Pfee+8cpXlTnFywgzO5YAfXMEoNIxcyxTlSM0qn808++aR5mMOog8kdBP73v//JlVdeaZyewxl9WBK54P5IgQtXX321zJw5U8LywvTdd9+Zl+eJEycawz/3UYmnxDByIauRymWDM8hlYdChl9+UngEFuZmhaNs777yj9ANRTZ48WWmSqbJly6oDDzxQDRkyRH377beB7wO54N4QOVzQe8DuCbUk6bffflMvvPCCOvHEE1WZMmXU7rvvrgYPHszngkt4h4kLuXZZchUQ5PLaY4w67LDDzB9KkNsZ5LZ9+OGHRkm+/vrrppl6L0KVL1/eKEwd4sw8fE466STzQMKDKaiJXMh9ZJK5kLtEOxK0MZ/S56oNT7XvYcNVvOAdcsgh6v/+7/8UuZA77mHhQu49/UtCpBUlurht2zbzh3LPPfe4hVls5OhlFYPdtGnT8vq8fft2Va1atbyHDx5A+IcHEhQoHlALFy7Myx+kL+RC9qORigvZS3O/5ObNm9Xdd9+tDjjgAKWdjqhSpUrl4yhe6hI9SJEL2Y9B0LmQfc8KLxl5RYmuf/XVV0qHgFI6oHDhSPBOPgS0hxszk5wzZ06+6/iBJVhnVukoSufTeUBpX48FygXhArmQ+SgUxYXMpblf4osvvjBKEUurDg8TP7Hsev755xeomFwoAEmxF4LOhWI7kGWGWChKYLNhwwalz/6ZGY8+85MlXPEoNmHCBKMk33777UI7jH0fRykmPpR22203dfTRR6sdO3YUWtbvG+RC+iOQDhfSl2Yvp7ZwL/TlDbNJbcyTsnJyISUsKS+GhQspG5/jxdgoSuCE5RZ9WF6dd955asuWLTlCF83i2m+r2n///ZV2TVdkB1esWGGMehKVJL5jWfaHH34osmwQbpILxY9CulwoXpI3OTBrhKFZIiexDPvAAw8U2QByoUh4zM2wcaH4HmWWI5LHQ/QfSsqklwvllVdekb322ktwIP3LL79MmS+OF3///Xf55z//aRycz58/Xxo0aFAkDLVr15Z+/fqJflvPywd8Ee5q586dedeC+oVcKHxkMuVC4ZK8uwPPMHp/UvRLnpQuXTqvYhxfwbGmohK5UDg6YeRC4b3J4U5mejU6ufX5OlW9enX17LPPRqdTWfZk2bJlSgfAVl26dDGz7nTFIKxV1apVzRs8lrf0S4i69957lQ6irWAVF5ZELuwaqWy5sEuC999++eUX1bZtW9WyZUv19ddf5xmbgZOp9tiLaiG5sAudMHJhV+vd/Rarpddk6D766CN1xBFHqO7duytYzcUtYa/2scceU1WqVFGjR4/Oqvsvv/yyUZTDhw/PK//SSy+Zh1WYHNSTC7lzIY8AHn5ZtWqV+Ru+7LLL1B9//GFq/vzzzw0nmzdvnlVLyIVwciGrwU6zUKwVJTDCcQe9hKj23Xdf9eKLL6YJW/iz4QFzyimnqOOPP15hv9HttGjRImOqDyOLsCRywQ4XbI0/ZotYFRo5cqTrVZAL4eKC6wRIEhh7RengMW/ePHOEpH379mrlypXO5ch9wnBh4MCBZsY3bNgwpfcTrfURloZQxJ06dVJYpg1LIheCP1I67qyxzJ41a5bVxpILVuENjXAqyoShwpEG7LFhKRIeaGA6HpUEhfjcc8+ZWd6FF16o1q1b50nX4K0He5+NGjVS33zzjSd1ulEJueAGiu7LAI8HDBig6tSpo5YvX+5+BSkkkgspQInZJSrKFAOOmZB2qG4UJpYON23alCJXOC7hwYIlZezFwtUc3pD9SPALC68pQfXaUxgm5EJhyHh/HXYEZ5xxhmrVqpUvf5PkgvdjHpQaqSiLGInVq1cbBwX6OInSJuaezcKKaFLat7DUOWLECOPfslmzZmrGjBlpl7WVcerUqcZKFo6qw5bIBX9HDPvoeNnD3yH8tfqZyAU/0fenbirKNHCHyfn1119v9vXgsACWnvp8URolvc/y8ccfq759+xqFhP1Wv2aQhfUcjgz0WUt16623qjB6SCIXChtZe9fhNg1GO48//ri9SrKQTC5kAVpIi1BRZjBwmKWNGzdOtWjRwizLXnzxxQpRNfx217Z06VJ12223mTfugw46SGG5GH/EQU3w3HPCCScY/5swLgpjIhe8GbVHH33UKMm33nrLmwqzqIVcyAK0kBUpgfbm4K8gtkW1Q2VBEFj8++STT0QrT9GzTdFnt0T7OpWSJe05PdKGOKJniqLN4wWBU7UzaDn33HOlY8eOov3ZhmJM4PGjd+/eos+smT7o+JahaHeqRpILqVDJ7ZpeXpX+/fuLVpCGH7Vq1cpNoEelyQWPgPa4GipKFwDXxj4m2vvs2bNFBzMV/LEcddRRxg2c9ngj+CPHv4MPPjife63iqtZBkUXvhwgUo15SNQpZL10KlIyekYk+B2mUs465WZyowN5/6KGH5L777hPtpED0Xmpg25luw8iFdJEqPJ822hHtj9m4R3z++edFh3ArPHOA75ALAR6cDJtGRZkhYOlkxx+6PnBvFBtmm/pwv1F4ejnU/PFrx+GiXb8ZpalDAImOuCH6gLPoJVzzqZcmBX9klStXzlOy9erVM4oXClgHoE2nGaHJ89prr4n2jiQPPvig+QxNw9NoKLmQBkgJWbRXHTn77LNF76+LjiFrdWUmoVpPvpILnsBspRIqSiuwphaKVe6ff/5ZdIR1wR8NFCNmh3DoDIWJJdSKFSsaJQplqsNYpRYUwat4QJ5zzjnSrl070WdZI/WATDVcqbiApUbtI1d0eLNYcmH69OnSo0cPwSpDt27dUsEWyWupuMDnQrCGmooyWOMR69bg5UGHSjJKAktulSpVig0eeFji5Ugbhpi9Z+3RKDZ9R0d1KCzzD0vwTZs2jVXf2dngI2DP4iT4fWcLA4YAwp/NnDlTDj30UGOUFKcwaDDOwixCO/aWp556KmAjY685WFVBeDftNUoWLFhAJWkPakrOAQEqyhzAY1H3EcBy8yOPPCLaTZkx7oHVYxwSlCNmk9qTkowfP94sx0e939iLP/XUU0UfETJGcIgnyUQEgogAFWUQR4VtEu1CUHSYLuncubPos3SRRgRHIbS3ojzliGXYN998M9J9hrEblpdxpApHrBA8mYkIBBUBKsqgjgzbJSeffLK89957MmrUKOnTp49ZlowiLNppRT7jpa1bt4oOIBzFrpo+QTGedtppoqPXiHaUEdl+smPRQYDGPNEZy8j2BIpDRyAxlsIw9oDRS5QSDJjQr8RUrlw5019YQ0clYaasQ7zJ2LFj5ZVXXjFnjaPSN/Yj2ghwRhnt8Y1E73BkZsqUKWaGqcN1mfOpkeiY7gTOz7766qsFuoOztamuF8gYkgvYh8QLAZxy6AgyVJIhGTc28y8EqCjJhFAgUKJECbnrrrvk/vvvNwYgUJxRSJhZQSkmp19++UXGjBmTfDmUv9euXWusWXWcV7P3uvfee4eyH2x0fBHg0mt8xz60PYd/WPi2vfTSS0VHIQltP9BwuDZcs2ZNoX3YsmWLcUJRaIaA34DzBBhk3XDDDdKvX7+At5bNIwKpEaCiTI0LrwYcARwtgBcfHCnAnldYrSYXL14sEyZMMGhj5gW/vjrAtvl95JFHmr1ZzKbDmHRYLPMiA+cRLVu2DGMX2GYiYBCgoiQRQosADugjAgmOGuig0KLjXIa2L2g4FCaOxDiKM6ydwXEXHWBZcAYW0W2i5ps4rOPCdmePAPcos8eOJX1GABahOKgPzy44kzd37lyfW8TqN2zYIK1btzYRdN5//30qSVIiEghQUUZiGOPdiauuukqeffZZ6dChQ2QMYMI4ooiUA6tkxGSdPHlyaMNjhRF7ttkuAlSUdvGldI8QwCwG/lIRqgtGI1j+Y/IOAShG7EMi8svdd9+dz4GCd61gTUTADgJUlHZwpVQfEKhdu7ZguQ/xP//xj3/Ixo0bfWhFvKqEE4FBgwaZl5MZM2ZIp06d4gUAexsLBKgoYzHM8ekkQnPhbCL2LLEM+Omnn8an8x73FE7coRjhGAFOBI499liPW8DqiIA3CFBReoMza/EQgZIlS8o999xjlgBbtGhhFKeH1WddFY6BoO1hSOvXrzd7kRUqVDDxM/fZZ58wNJttJAJZIRCOv8qsusZCcUcAB92nT58ul112mQwePDjwcGAZ888//wx8O2Fd3KRJE2NtDKvjKPmjDTz4bKAvCFBR+gI7K/UKgeOOO84sC2I5tmPHjibmo1d1R7Ge0aNHG+vicePGCayNmYhAHBCgoozDKMe8j1gWnDNnjvHec8IJJxjvNzGHJOPuw4r48ssvl4ceeshYF7dq1SpjGSxABMKKABVlWEeO7c4Igd13312efvpp6dGjh1k2pHOC9OH76aefjBMBuNdbsGCBwLqYiQjECQEqyjiNNvsqAwYMkGeeecYsHz7xxBNEpBgEli5dKo0bNzaGO4jYssceexRTgreJQPQQoKKM3piyR8UgcNppp5nlQywjYjkxKM4JYPEaJAfoCCYNJwKOBXFYLHKLGX7eJgIZI0BFmTFkLBAFBBznBIjYgf02LC/6nWDxCstXvxPacPvttxtjnZkzZ9KJgN8Dwvp9R4CK0vchYAP8QqBixYrmjOWJJ54osI5dsmSJX00JTL1bt26V888/X15//XVjLdywYcPAtI0NIQJ+IUBF6RfyrDcQCGCpE2cs77vvPrPMiOVGv5LfS68IIN20aVOpWrWqCZFVvXp1v6BgvUQgUAhQUQZqONgYvxDAGctZs2bJ1VdfLbfddpsvS6B+Lr3Onj3bKEk4ZxgzZozstttufg0F6yUCgUOAijJwQ8IG+YUAlhnhs/TNN9+Udu3ayZYtW/xqiqf1Dh8+XODFaOLEicaLkaeVszIiEAIEqChDMEhsoncIVKtWTTC7qlGjhjlv+eWXX3pWude+Xn///Xe55JJLBMdkcD7ypJNO8qyvrIgIhAkBKsowjRbb6gkCWHYcNWqU9O/fX5o1a2aWZL2o2Etfr99//72cfPLJsnnzZnnvvffkoIMO8qKLrIMIhBIBKspQDhsb7QUCvXv3lhdffFG6desmDz/8sBdVelLHBx98YKx8zzrrLNO/8uXLe1IvKyECYUWAijKsI8d2e4IAliOxLDl27Fjp2bOn7Nixw1q9Xiy9wpn5GWecYWbMt9xyi7W+UDARiBICVJRRGk32xQoCNWvWNJ58tm3bZpYrv/32Wyv12Fx63blzp1xzzTVyxx13yNtvvy2YTTIRASKQHgJUlOnhxFwxR6BcuXIyYcIEOffcc82y5fvvvx8aRKDg27ZtK/DbCqveunXrhqbtbCgRCAICJfRbrP8+s4KABNtABApB4NFHH5Uffvgh7+7y5csFDsKvvfZaV32zfvPNN4LZaqNGjfLqcuMLYnEiekrr1q0l0V9rv379BFa+TESACBSNABVl0fjwbswRwCyyU6dOxvdpIhTwDVu5cmUpVapU4uVAfl+9erXUqlUrX9vQL8TpxFEYJiJABIpGoHTRt3mXCBCBCy64QAYOHBgpILD8OmnSpEj1iZ0hArYQ4B6lLWQplwgQASJABCKBABVlJIaRnSACRIAIEAFbCFBR2kKWcokAESACRCASCFBRRmIY2QkiQASIABGwhQAVpS1kKZcIEAEiQAQigQAVZSSGkZ0gAkSACBABWwhQUdpClnKJABEgAkQgEghQUUZiGNkJIkAEiAARsIUAFaUtZCmXCBABIkAEIoEAFWUkhpGdIAJEgAgQAVsIUFHaQpZyiQARIAJEIBIIUFFGYhjZCSJABIgAEbCFABWlLWQplwgQASJABCKBABVlJIaRnSACRIAIEAFbCFBR2kKWcokAESACRCASCFBRRmIY2QkiQASIABGwhQAVpS1kKZcIEAEiQAQigQAVZSSGkZ0gAkSACBABWwhQUdpClnKJABEgAkQgEghQUUZiGNkJIkAEiAARsIUAFaUtZCmXCBABIkAEIoEAFWUkhpGdIAJEgAgQAVsIUFHaQpZyiQARIAJEIBIIUFFGYhjZCSJABIgAEbCFABWlLWQplwgQASJABCKBABVlJIaRnSACRIAIEAFbCFBR2kKWcokAESACRCASCFBRRmIY2QkiQASIABGwhQAVpS1kKZcIEAEiQAQigQAVZSSGkZ0gAkSACBABWwhQUdpClnKJABEgAkQgEghQUUZiGNkJIkAEiAARsIUAFaUtZCmXCBABIkAEIoFA6Uj0gp0gAhYRmDhxogwcONBiDd6LnjBhguy3337eV8waiUAIESihdAphu9lkIuAZAiNHjpQff/zRs/q8qujyyy+XatWqeVUd6yECoUWAijK0Q8eGEwEiQASIgBcIcI/SC5RZBxEgAkSACIQWASrK0A4dG04EiAARIAJeIPD/nBQLZZwR2wQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.Tair.data.visualize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our resulting xarray dataset has the same dimensions and the same number of chunks as our input dataset." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a helper function to split a dataset into sub-datasets\n", "\n", "Our main objective is to save this resulting dataset into multiple netCDF files by saving each chunk in its own netCDF file. To accomplish this, we need to create a function that allows us to split a dataset into sub-datasets for each chunk. The following code snippet was adapted from this [comment](https://github.com/pydata/xarray/issues/1093#issuecomment-259213382) by [Stephan Hoyer](https://github.com/shoyer)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import itertools\n", "\n", "\n", "def split_by_chunks(dataset):\n", " chunk_slices = {}\n", " for dim, chunks in dataset.chunks.items():\n", " slices = []\n", " start = 0\n", " for chunk in chunks:\n", " if start >= dataset.sizes[dim]:\n", " break\n", " stop = start + chunk\n", " slices.append(slice(start, stop))\n", " start = stop\n", " chunk_slices[dim] = slices\n", " for slices in itertools.product(*chunk_slices.values()):\n", " selection = dict(zip(chunk_slices.keys(), slices))\n", " yield dataset[selection]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "datasets = list(split_by_chunks(result))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's confirm that we have three items corresponding to our three chunks:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "print(len(datasets))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each item in the returned list consists of an xarray dataset corresponding to each sliced chunk. Now that we have a list of datasets, we need another helper function that will generate a filepath for us when given an xarray dataset as input:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a helper function for generating a filepath" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def create_filepath(ds, prefix='filename', root_path=\".\"):\n", " \"\"\"\n", " Generate a filepath when given an xarray dataset\n", " \"\"\"\n", " start = ds.time.data[0].strftime(\"%Y-%m-%d\")\n", " end = ds.time.data[-1].strftime(\"%Y-%m-%d\")\n", " filepath = f'{root_path}/{prefix}_{start}_{end}.nc'\n", " return filepath" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's run a small test to make sure this function is working as expected:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'./filename_1981-09-16_1982-08-17.nc'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "create_filepath(datasets[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create a list of paths to which to save each corresponding dataset." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['./filename_1980-09-16_1981-08-17.nc',\n", " './filename_1981-09-16_1982-08-17.nc',\n", " './filename_1982-09-16_1983-08-17.nc']" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paths = [create_filepath(ds) for ds in datasets]\n", "paths" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Invoke `xr.save_mfdataset()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this point we have two lists:\n", " \n", "1. `datasets`: List of datasets to save.\n", "2. `paths`: List of paths to which to save each corresponding dataset.\n", "\n", "\n", "We are ready to invoke the `xr.save_mfdataset()`:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "xr.save_mfdataset(datasets=datasets, paths=paths)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Confirm that the output files were properly written" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "Show/Hide data repr\n", "\n", "\n", "\n", "\n", "\n", "Show/Hide attributes\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
xarray.Dataset
    • time: 36
    • x: 275
    • y: 205
    • xc
      (y, x)
      float64
      dask.array<chunksize=(205, 275), meta=np.ndarray>
      long_name :
      longitude of grid cell center
      units :
      degrees_east
      bounds :
      xv
      \n",
             "\n",
             "\n",
             "\n",
             "\n",
             "
      \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
      Array Chunk
      Bytes 451.00 kB 451.00 kB
      Shape (205, 275) (205, 275)
      Count 10 Tasks 1 Chunks
      Type float64 numpy.ndarray
      \n", "
      \n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " 275\n", " 205\n", "\n", "
    • yc
      (y, x)
      float64
      dask.array<chunksize=(205, 275), meta=np.ndarray>
      long_name :
      latitude of grid cell center
      units :
      degrees_north
      bounds :
      yv
      \n",
             "\n",
             "\n",
             "\n",
             "\n",
             "
      \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
      Array Chunk
      Bytes 451.00 kB 451.00 kB
      Shape (205, 275) (205, 275)
      Count 10 Tasks 1 Chunks
      Type float64 numpy.ndarray
      \n", "
      \n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " 275\n", " 205\n", "\n", "
    • time
      (time)
      object
      1980-09-16 12:00:00 ... 1983-08-17 00:00:00
      long_name :
      time
      type_preferred :
      int
      array([cftime.DatetimeNoLeap(1980-09-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1980-10-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1980-11-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1980-12-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-01-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-02-15 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-03-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-04-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-05-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-06-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-07-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-08-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-09-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-10-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-11-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1981-12-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-01-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-02-15 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-03-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-04-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-05-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-06-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-07-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-08-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-09-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-10-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-11-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1982-12-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-01-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-02-15 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-03-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-04-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-05-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-06-16 12:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-07-17 00:00:00),\n",
             "       cftime.DatetimeNoLeap(1983-08-17 00:00:00)], dtype=object)
    • Tair
      (time, y, x)
      float64
      dask.array<chunksize=(12, 205, 275), meta=np.ndarray>
      \n",
             "\n",
             "\n",
             "\n",
             "\n",
             "
      \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
      Array Chunk
      Bytes 16.24 MB 5.41 MB
      Shape (36, 205, 275) (12, 205, 275)
      Count 9 Tasks 3 Chunks
      Type float64 numpy.ndarray
      \n", "
      \n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", "\n", " \n", " 275\n", " 205\n", " 36\n", "\n", "
" ], "text/plain": [ "\n", "Dimensions: (time: 36, x: 275, y: 205)\n", "Coordinates:\n", " xc (y, x) float64 dask.array\n", " yc (y, x) float64 dask.array\n", " * time (time) object 1980-09-16 12:00:00 ... 1983-08-17 00:00:00\n", "Dimensions without coordinates: x, y\n", "Data variables:\n", " Tair (time, y, x) float64 dask.array" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_ds = xr.open_mfdataset(paths, combine='by_coords')\n", "new_ds" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The datasets are identical!\n" ] } ], "source": [ "try:\n", " xr.testing.assert_identical(result, new_ds)\n", "except AssertionError:\n", " print('The datasets are not identical!')\n", "else:\n", " print('The datasets are identical!')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There you have it 🎉🎉🎉🎉" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This article was inspired by a problem that my colleague was running into. I thought it would be useful to document this fix in a blog post. Many thanks to [Deepak Cherian](https://github.com/dcherian) for pointing me to some relevant xarray issues and to the [@NCAR/xdev](https://github.com/orgs/NCAR/teams/xdev) team for their valuable and critical feedback on drafts of this article along the way." ] } ], "metadata": { "author": "Anderson Banihirwe", "date": "2020-06-29", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.4" }, "tags": "python,xarray,netcdf,dask", "title": "Writing multiple netCDF files in parallel with xarray and dask", "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 }