{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Numpy and arrays\n", "We do not advise you to use Numpy directly. The XArray and Pandas packages are now mature enough to be used instead. However, Numpy is the historical package for numerical calculations in Python. The other packages have been built upon it, i.e. they encapsulate Numpy arrays with additional information to simplify some analyses. \n", "\n", "Additionally, some functionalities of Numpy haven't been ported to Xarray and should be used directly.\n", "Additionally, most examples you will find in documentation of some packages (e.g. SciPy) or StackOverflow might use Numpy. It is worth for you knowing about this package and understanding how to adapt Numpy examples to Xarray." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create an array\n", "There are plenty of ways to do so depending on what you want. The low-level function is `np.ndarray()` which you probably won't use much. But the [webpage](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html) for this function is interesting as it lists all attributes and methods associated with numpy arrays!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[[2.00000000e+000, 2.00000000e+000, 9.38724727e-323],\n", " [0.00000000e+000, 0.00000000e+000, 5.02034658e+175],\n", " [1.21647076e-046, 4.95419814e-062, 3.27611965e+179],\n", " [1.51954764e-051, 5.82777938e-144, 1.12855837e+277]],\n", "\n", " [[6.32672840e+180, 2.66371964e+233, 5.04621361e+180],\n", " [8.37170571e-144, 1.36347154e+161, 4.50618609e-144],\n", " [7.79952704e-143, 8.45341552e+169, 1.68749783e+160],\n", " [1.16066661e-046, 1.23139611e+165, 1.41529403e+161]]])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Low-level \n", "rr = np.ndarray(shape=(2,4,3),dtype=float)\n", "rr" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[3. 4.]\n", " [5. 6.]]\n" ] } ], "source": [ "# From list or tuple\n", "rr = np.array([[3.,4.],[5.,6.]])\n", "print(rr)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[['Claire' 'Paola']\n", " ['Scott' 'Danny']]\n" ] } ], "source": [ "rr1 = np.array([['Claire','Paola'],['Scott','Danny']]) # It doesn't have to be a numerical type \n", "print(rr1)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[['Claire' '10']\n", " ['Paola' '6']]\n" ] } ], "source": [ "rr2 = np.array([['Claire',10], ['Paola', 6]]) # It doesn't have to be only 1 type\n", "print(rr2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0.]\n", " [0. 0. 0.]]\n", "[[1 1 1 1]\n", " [1 1 1 1]]\n" ] } ], "source": [ "# Initialise to 0 or 1.\n", "rr = np.zeros((2,3),dtype=float)\n", "print(rr)\n", "rr1 = np.ones((2,4),dtype=np.int32)\n", "print(rr1)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 0, 0, 0],\n", " [0, 0, 0, 0]], dtype=int32)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Same shape as an existing array. It's possible to choose the data-type with the dtype argument.\n", "rr2 = np.zeros_like(rr1)\n", "rr2" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37,\n", " 39, 41, 43])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Evenly spaced values\n", "rr2= np.arange(5,45,2)\n", "rr2" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[[ 5, 7],\n", " [ 9, 11]],\n", "\n", " [[13, 15],\n", " [17, 19]],\n", "\n", " [[21, 23],\n", " [25, 27]],\n", "\n", " [[29, 31],\n", " [33, 35]],\n", "\n", " [[37, 39],\n", " [41, 43]]])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Reshaping an existing array\n", "rr2 = rr2.reshape((5,2,2))\n", "rr2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Read data from file\n", "Do you remember the csv example from the last training? Here it is with numpy." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[50. 30. 40.]\n", " [70. 20. 30.]]\n", "[[50. 70.]\n", " [30. 20.]\n", " [40. 30.]]\n", "[50. 70.] [30. 20.] [40. 30.]\n" ] } ], "source": [ "li = np.loadtxt('test.txt',delimiter=',',skiprows=2)\n", "print(li)\n", "# For the third format example, simply take the transpose\n", "print(li.T)\n", "# You want the columns in separate arrays?\n", "c1,c2,c3 = np.loadtxt('test.txt', delimiter=',',skiprows=2,unpack=True)\n", "print(c1,c2,c3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Indexing\n", "It is the same as for lists etc, except for the multi-dimensional part:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First element 5\n", "\n", "First index of the second dimension \n", " [[ 5 7]\n", " [13 15]\n", " [21 23]\n", " [29 31]\n", " [37 39]]\n", "\n", "First 2 indexes along the 1st dimension and all other indexes along other dimensions\n", " [[[ 5 7]\n", " [ 9 11]]\n", "\n", " [[13 15]\n", " [17 19]]]\n", "\n", "Stride [ 7 23 39]\n", "\n" ] } ], "source": [ "print(f\"First element {rr2[0,0,0]}\\n\")\n", "print(f\"First index of the second dimension \\n {rr2[:,0,:]}\\n\")\n", "print(f\"First 2 indexes along the 1st dimension and all other indexes along other dimensions\\n {rr2[:2,:,:]}\\n\")\n", "print(f\"Stride {rr2[0:5:2,0,1]}\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is a generic form to say \"all other indexes along all other dimensions\", i.e. \"everything else\", without specifying the number of dimensions in your array. It can be used to indicate all dimensions before or after the specified slice:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Specify slices in all dimensions: \n", "[[[ 5 7]\n", " [ 9 11]]\n", "\n", " [[13 15]\n", " [17 19]]]\n", "\n", "Generic form:\n", "[[[ 5 7]\n", " [ 9 11]]\n", "\n", " [[13 15]\n", " [17 19]]]\n", "\n", "Any number of dimensions specified before:\n", "[[ 5 7]\n", " [13 15]]\n", "\n", "Works for the start of the array as well:\n", "[[ 5 9]\n", " [13 17]\n", " [21 25]\n", " [29 33]\n", " [37 41]]\n", "\n", "You can omit the dimensions, but it is confusing to read:\n", "[[[ 5 7]\n", " [ 9 11]]\n", "\n", " [[13 15]\n", " [17 19]]]\n", "\n" ] } ], "source": [ "print(f\"Specify slices in all dimensions: \\n{rr2[:2,:,:]}\\n\")\n", "print(f\"Generic form:\\n{rr2[:2,...]}\\n\")\n", "print(f\"Any number of dimensions specified before:\\n{rr2[:2,0,...]}\\n\")\n", "print(f\"Works for the start of the array as well:\\n{rr2[...,0]}\\n\")\n", "print(f\"You can omit the dimensions, but it is confusing to read:\\n{rr2[:2]}\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matlab users\n", "In Matlab, arrays are matrices. That is not true in Python. This means in Matlab, the multiplication is the matrice multiplication, in Python that's multiplication element by element.\n", "This [page](https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html#numpy-for-matlab-users-notes) provides a long table of equivalents between Matlab and Python." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations with arrays along some given axis\n", "`numpy` has a lot of handy functions for common operations. For example if you want the mean of an array:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rr2.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's handy, what is even more handy is the possibility to calculate the mean over a given dimension only. For example, rr2 is 3D. Let's say the dimensions are time, latitude and longitude respectively and you want to calculate the time average at each spatial point:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[21., 23.],\n", " [25., 27.]])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rr2.mean(axis=0) # Remember indexes start at 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Working with time\n", "There is already a lot out there. You probably won't need to develop much yourself.\n", "\n", "Numpy has a date data type: `datetime64`. Do not confuse `datetime64` from Numpy and `datetime` from Python! They do not have the same methods or abilities. Both can be useful.\n", "\n", "`datetime64` is relatively simple, it doesn't have a lot of built-in capabilities. When doing fancy date calculations in Python, the must is probably to work with `pandas`. `pandas` is built upon numpy so can readily convert `datetime64` to its own date and time objects. \n", "\n", "Note `xarray` and `pandas` are also very compatible with each other." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-04-15T05:00:00.000\n", "2020-04\n" ] } ], "source": [ "print(np.datetime64('2020-04-15T05:00','ms'))\n", "print(np.datetime64('2020-04-10','M'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can do simple calculations. For example, the number of days in February 2036:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "29 days\n" ] } ], "source": [ "print(np.datetime64('2036-03','D')-np.datetime64('2036-02','D'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Be careful of the unit:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 months\n" ] } ], "source": [ "print(np.datetime64('2036-03','M')-np.datetime64('2036-02','M'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's possible to convert units. So if you want both the number of months and the number of days:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "22 months\n", "669 days\n" ] } ], "source": [ "timeA = np.datetime64('1988-05','M')\n", "timeB = np.datetime64('1990-03','M')\n", "delta = timeB - timeA\n", "print(delta)\n", "deltaD = timeB.astype('datetime64[D]') - timeA.astype('datetime64[D]')\n", "print(deltaD)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note, `delta` and `deltaD` are not the strings printed out above. They are `numpy.timedelta64` objects. The `print()` function gives a pretty output because of the way the object has been developed." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.timedelta64(669,'D')" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "deltaD" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Xarray \n", "Numpy is great but it is very generic. And it only gives you the raw data. The coder has to keep track of the additional information: is there a time dimension? What field does this data represent? etc.\n", "\n", "Xarray introduces labelled arrays which typically means you get self-described arrays: name of\n", "the field, name of dimensions, coordinates for the dimensions, etc.\n", "\n", "As such it works very well with the netCDF format since this is also a self-describing format." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "import xarray as xr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reading in netcdf file" ] }, { "cell_type": "code", "execution_count": 32, "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
" ], "text/plain": [ "\n", "Dimensions: (lat: 145, lon: 192, time: 408)\n", "Coordinates:\n", " * lat (lat) float32 -90.0 -88.75 -87.5 -86.25 ... 86.25 87.5 88.75 90.0\n", " * lon (lon) float32 0.0 1.875 3.75 5.625 ... 352.5 354.375 356.25 358.125\n", " * time (time) datetime64[ns] 1978-01-16T12:00:00 ... 2011-12-16T12:00:00\n", "Data variables:\n", " pr (time, lat, lon) float32 ...\n", " tas (time, lat, lon) float32 ...\n", "Attributes:\n", " input_file_format: UM ancillary\n", " input_uri: file:///short/dt6/rzl561/UM_ROUTDIR/rzl5...\n", " input_word_length: 8\n", " history: Wed Jun 4 11:09:52 2014: ncks -v tas,pr...\n", " input_byte_ordering: big_endian\n", " nco_openmp_thread_number: 1\n", " NCO: 4.3.8\n", " summary: ACCESS1.3b model output \\n from Land use...\n", " institution: ARC Centre of Excellence for Climate Sys...\n", " source: ACCESS1.3b (HadGEM3-CABLE2.0), AMIP, N96\\n\n", " contact: ruth.lorenz@env.ethz.ch\n", " title: ACCESS1.3b model output from the Amazoni...\n", " Conventions: CF-1.6, ACDD-1.3\n", " license: http://creativecommons.org/licenses/by-n...\n", " id: http://dx.doi.org/10.4225/41/563BEB78E3A93\n", " keywords: climatology\n", " date_created: 2014-06-04\n", " creator_name: Ruth Lorenz\n", " creator_email: ruth.lorenz@env.ethz.ch\n", " publisher_name: ARCCSS data manager\n", " publisher_email: paola.petrelli@utas.edu.au\n", " product_version: 1.0\n", " references: Lorenz, R., and A. J. Pitman (2014), Eff...\n", " time_coverage_start: 1978-01-01T00:00\n", " time_coverage_end: 2012-01-01T00:00\n", " geospatial_lat_min: -90.0\n", " geospatial_lat_max: 90.0\n", " geospatial_lon_min: 0.0\n", " geospatial_lon_max: 358.125\n", " DODS_EXTRA.Unlimited_Dimension: time" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# open netcdf file\n", "ds = xr.open_dataset(\"http://dapds00.nci.org.au/thredds/dodsC/ks32/ARCCSS_Data/ACCESS1-3b_AMZDEF/v1-0/001GPwc.tas_pr_monthly_TS.1978_2011.nc\")\n", "# see how all the info is there\n", "ds\n", "# print just a variable to see the variable level attributes." ] }, { "cell_type": "code", "execution_count": 33, "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.DataArray
'tas'
  • time: 408
  • lat: 145
  • lon: 192
  • ...
    [11358720 values with dtype=float32]
    • lat
      (lat)
      float32
      -90.0 -88.75 -87.5 ... 88.75 90.0
      units :
      degrees_north
      standard_name :
      latitude
      point_spacing :
      even
      axis :
      Y
      array([-90.  , -88.75, -87.5 , -86.25, -85.  , -83.75, -82.5 , -81.25, -80.  ,\n",
             "       -78.75, -77.5 , -76.25, -75.  , -73.75, -72.5 , -71.25, -70.  , -68.75,\n",
             "       -67.5 , -66.25, -65.  , -63.75, -62.5 , -61.25, -60.  , -58.75, -57.5 ,\n",
             "       -56.25, -55.  , -53.75, -52.5 , -51.25, -50.  , -48.75, -47.5 , -46.25,\n",
             "       -45.  , -43.75, -42.5 , -41.25, -40.  , -38.75, -37.5 , -36.25, -35.  ,\n",
             "       -33.75, -32.5 , -31.25, -30.  , -28.75, -27.5 , -26.25, -25.  , -23.75,\n",
             "       -22.5 , -21.25, -20.  , -18.75, -17.5 , -16.25, -15.  , -13.75, -12.5 ,\n",
             "       -11.25, -10.  ,  -8.75,  -7.5 ,  -6.25,  -5.  ,  -3.75,  -2.5 ,  -1.25,\n",
             "         0.  ,   1.25,   2.5 ,   3.75,   5.  ,   6.25,   7.5 ,   8.75,  10.  ,\n",
             "        11.25,  12.5 ,  13.75,  15.  ,  16.25,  17.5 ,  18.75,  20.  ,  21.25,\n",
             "        22.5 ,  23.75,  25.  ,  26.25,  27.5 ,  28.75,  30.  ,  31.25,  32.5 ,\n",
             "        33.75,  35.  ,  36.25,  37.5 ,  38.75,  40.  ,  41.25,  42.5 ,  43.75,\n",
             "        45.  ,  46.25,  47.5 ,  48.75,  50.  ,  51.25,  52.5 ,  53.75,  55.  ,\n",
             "        56.25,  57.5 ,  58.75,  60.  ,  61.25,  62.5 ,  63.75,  65.  ,  66.25,\n",
             "        67.5 ,  68.75,  70.  ,  71.25,  72.5 ,  73.75,  75.  ,  76.25,  77.5 ,\n",
             "        78.75,  80.  ,  81.25,  82.5 ,  83.75,  85.  ,  86.25,  87.5 ,  88.75,\n",
             "        90.  ], dtype=float32)
    • lon
      (lon)
      float32
      0.0 1.875 3.75 ... 356.25 358.125
      units :
      degrees_east
      standard_name :
      longitude
      modulo :
      360.0
      point_spacing :
      even
      axis :
      X
      array([  0.   ,   1.875,   3.75 ,   5.625,   7.5  ,   9.375,  11.25 ,  13.125,\n",
             "        15.   ,  16.875,  18.75 ,  20.625,  22.5  ,  24.375,  26.25 ,  28.125,\n",
             "        30.   ,  31.875,  33.75 ,  35.625,  37.5  ,  39.375,  41.25 ,  43.125,\n",
             "        45.   ,  46.875,  48.75 ,  50.625,  52.5  ,  54.375,  56.25 ,  58.125,\n",
             "        60.   ,  61.875,  63.75 ,  65.625,  67.5  ,  69.375,  71.25 ,  73.125,\n",
             "        75.   ,  76.875,  78.75 ,  80.625,  82.5  ,  84.375,  86.25 ,  88.125,\n",
             "        90.   ,  91.875,  93.75 ,  95.625,  97.5  ,  99.375, 101.25 , 103.125,\n",
             "       105.   , 106.875, 108.75 , 110.625, 112.5  , 114.375, 116.25 , 118.125,\n",
             "       120.   , 121.875, 123.75 , 125.625, 127.5  , 129.375, 131.25 , 133.125,\n",
             "       135.   , 136.875, 138.75 , 140.625, 142.5  , 144.375, 146.25 , 148.125,\n",
             "       150.   , 151.875, 153.75 , 155.625, 157.5  , 159.375, 161.25 , 163.125,\n",
             "       165.   , 166.875, 168.75 , 170.625, 172.5  , 174.375, 176.25 , 178.125,\n",
             "       180.   , 181.875, 183.75 , 185.625, 187.5  , 189.375, 191.25 , 193.125,\n",
             "       195.   , 196.875, 198.75 , 200.625, 202.5  , 204.375, 206.25 , 208.125,\n",
             "       210.   , 211.875, 213.75 , 215.625, 217.5  , 219.375, 221.25 , 223.125,\n",
             "       225.   , 226.875, 228.75 , 230.625, 232.5  , 234.375, 236.25 , 238.125,\n",
             "       240.   , 241.875, 243.75 , 245.625, 247.5  , 249.375, 251.25 , 253.125,\n",
             "       255.   , 256.875, 258.75 , 260.625, 262.5  , 264.375, 266.25 , 268.125,\n",
             "       270.   , 271.875, 273.75 , 275.625, 277.5  , 279.375, 281.25 , 283.125,\n",
             "       285.   , 286.875, 288.75 , 290.625, 292.5  , 294.375, 296.25 , 298.125,\n",
             "       300.   , 301.875, 303.75 , 305.625, 307.5  , 309.375, 311.25 , 313.125,\n",
             "       315.   , 316.875, 318.75 , 320.625, 322.5  , 324.375, 326.25 , 328.125,\n",
             "       330.   , 331.875, 333.75 , 335.625, 337.5  , 339.375, 341.25 , 343.125,\n",
             "       345.   , 346.875, 348.75 , 350.625, 352.5  , 354.375, 356.25 , 358.125],\n",
             "      dtype=float32)
    • time
      (time)
      datetime64[ns]
      1978-01-16T12:00:00 ... 2011-12-16T12:00:00
      standard_name :
      time
      axis :
      T
      array(['1978-01-16T12:00:00.000000000', '1978-02-15T00:00:00.000000000',\n",
             "       '1978-03-16T12:00:00.000000000', ..., '2011-10-16T12:00:00.000000000',\n",
             "       '2011-11-16T00:00:00.000000000', '2011-12-16T12:00:00.000000000'],\n",
             "      dtype='datetime64[ns]')
  • stash_item :
    236
    stash_model :
    1
    lookup_source :
    defaults (cdunifpp V0.13)
    long_name :
    air temperature at 1.5 m
    cell_methods :
    time: mean
    units :
    K
    stash_section :
    3
    name :
    tas
    standard_name :
    air_temperature
" ], "text/plain": [ "\n", "[11358720 values with dtype=float32]\n", "Coordinates:\n", " * lat (lat) float32 -90.0 -88.75 -87.5 -86.25 ... 86.25 87.5 88.75 90.0\n", " * lon (lon) float32 0.0 1.875 3.75 5.625 ... 352.5 354.375 356.25 358.125\n", " * time (time) datetime64[ns] 1978-01-16T12:00:00 ... 2011-12-16T12:00:00\n", "Attributes:\n", " stash_item: 236\n", " stash_model: 1\n", " lookup_source: defaults (cdunifpp V0.13)\n", " long_name: air temperature at 1.5 m\n", " cell_methods: time: mean\n", " units: K\n", " stash_section: 3\n", " name: tas\n", " standard_name: air_temperature" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Variables are stored in the Dataset in a dictionary so you can refer to them by name\n", "tas = ds['tas']\n", "tas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculations using dimension names\n", "Just like numpy, arrays have common functions as methods. But unlike numpy, you can identify\n", "dimensions by name instead of index position.\n", "\n", "Xarray arrays work with most numpy functions. If not, you can access the underlying numpy array." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Global mean\n", " \n", "array(278.28284, dtype=float32) \n", "\n", "Latitudinal mean\n", " \n", "array([[278.467 , 278.4859 , 278.38632, ..., 278.32104, 278.27985,\n", " 278.3821 ],\n", " [278.21014, 278.16296, 278.00296, ..., 278.27924, 278.2395 ,\n", " 278.24582],\n", " [277.4103 , 277.37396, 277.2726 , ..., 277.37128, 277.35922,\n", " 277.40472],\n", " ...,\n", " [278.6603 , 278.71646, 278.6278 , ..., 278.4839 , 278.49448,\n", " 278.61685],\n", " [279.5895 , 279.64603, 279.59464, ..., 279.65546, 279.55872,\n", " 279.58517],\n", " [279.07565, 279.1083 , 279.01367, ..., 279.26144, 279.12497,\n", " 279.1093 ]], dtype=float32)\n", "Coordinates:\n", " * lon (lon) float32 0.0 1.875 3.75 5.625 ... 352.5 354.375 356.25 358.125\n", " * time (time) datetime64[ns] 1978-01-16T12:00:00 ... 2011-12-16T12:00:00\n" ] } ], "source": [ "print('Global mean\\n',tas.mean(),'\\n')\n", "print('Latitudinal mean\\n',tas.mean(dim='lat'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Selection using coordinate values\n", "Remember how the variables have the dimension names and the coordinate arrays attached to them? This means you can select data using the coordinate names and values rather than indexes." ] }, { "cell_type": "code", "execution_count": 35, "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.DataArray
'tas'
  • time: 408
  • lon: 192
  • 245.47575 245.20438 244.97054 ... 249.84563 249.65027 249.47154
    array([[245.47575, 245.20438, 244.97054, ..., 246.39372, 246.07375, 245.7676 ],\n",
           "       [237.7508 , 237.50137, 237.2808 , ..., 238.60011, 238.29971, 238.01099],\n",
           "       [223.22281, 222.64638, 222.1247 , ..., 225.09627, 224.4605 , 223.82877],\n",
           "       ...,\n",
           "       [225.40732, 225.0019 , 224.64072, ..., 226.89435, 226.37177, 225.8708 ],\n",
           "       [243.86288, 243.60034, 243.36409, ..., 244.71707, 244.42044, 244.13028],\n",
           "       [249.29846, 249.13568, 248.98572, ..., 249.84563, 249.65027, 249.47154]],\n",
           "      dtype=float32)
    • lat
      ()
      float32
      -85.0
      units :
      degrees_north
      standard_name :
      latitude
      point_spacing :
      even
      axis :
      Y
      array(-85., dtype=float32)
    • lon
      (lon)
      float32
      0.0 1.875 3.75 ... 356.25 358.125
      units :
      degrees_east
      standard_name :
      longitude
      modulo :
      360.0
      point_spacing :
      even
      axis :
      X
      array([  0.   ,   1.875,   3.75 ,   5.625,   7.5  ,   9.375,  11.25 ,  13.125,\n",
             "        15.   ,  16.875,  18.75 ,  20.625,  22.5  ,  24.375,  26.25 ,  28.125,\n",
             "        30.   ,  31.875,  33.75 ,  35.625,  37.5  ,  39.375,  41.25 ,  43.125,\n",
             "        45.   ,  46.875,  48.75 ,  50.625,  52.5  ,  54.375,  56.25 ,  58.125,\n",
             "        60.   ,  61.875,  63.75 ,  65.625,  67.5  ,  69.375,  71.25 ,  73.125,\n",
             "        75.   ,  76.875,  78.75 ,  80.625,  82.5  ,  84.375,  86.25 ,  88.125,\n",
             "        90.   ,  91.875,  93.75 ,  95.625,  97.5  ,  99.375, 101.25 , 103.125,\n",
             "       105.   , 106.875, 108.75 , 110.625, 112.5  , 114.375, 116.25 , 118.125,\n",
             "       120.   , 121.875, 123.75 , 125.625, 127.5  , 129.375, 131.25 , 133.125,\n",
             "       135.   , 136.875, 138.75 , 140.625, 142.5  , 144.375, 146.25 , 148.125,\n",
             "       150.   , 151.875, 153.75 , 155.625, 157.5  , 159.375, 161.25 , 163.125,\n",
             "       165.   , 166.875, 168.75 , 170.625, 172.5  , 174.375, 176.25 , 178.125,\n",
             "       180.   , 181.875, 183.75 , 185.625, 187.5  , 189.375, 191.25 , 193.125,\n",
             "       195.   , 196.875, 198.75 , 200.625, 202.5  , 204.375, 206.25 , 208.125,\n",
             "       210.   , 211.875, 213.75 , 215.625, 217.5  , 219.375, 221.25 , 223.125,\n",
             "       225.   , 226.875, 228.75 , 230.625, 232.5  , 234.375, 236.25 , 238.125,\n",
             "       240.   , 241.875, 243.75 , 245.625, 247.5  , 249.375, 251.25 , 253.125,\n",
             "       255.   , 256.875, 258.75 , 260.625, 262.5  , 264.375, 266.25 , 268.125,\n",
             "       270.   , 271.875, 273.75 , 275.625, 277.5  , 279.375, 281.25 , 283.125,\n",
             "       285.   , 286.875, 288.75 , 290.625, 292.5  , 294.375, 296.25 , 298.125,\n",
             "       300.   , 301.875, 303.75 , 305.625, 307.5  , 309.375, 311.25 , 313.125,\n",
             "       315.   , 316.875, 318.75 , 320.625, 322.5  , 324.375, 326.25 , 328.125,\n",
             "       330.   , 331.875, 333.75 , 335.625, 337.5  , 339.375, 341.25 , 343.125,\n",
             "       345.   , 346.875, 348.75 , 350.625, 352.5  , 354.375, 356.25 , 358.125],\n",
             "      dtype=float32)
    • time
      (time)
      datetime64[ns]
      1978-01-16T12:00:00 ... 2011-12-16T12:00:00
      standard_name :
      time
      axis :
      T
      array(['1978-01-16T12:00:00.000000000', '1978-02-15T00:00:00.000000000',\n",
             "       '1978-03-16T12:00:00.000000000', ..., '2011-10-16T12:00:00.000000000',\n",
             "       '2011-11-16T00:00:00.000000000', '2011-12-16T12:00:00.000000000'],\n",
             "      dtype='datetime64[ns]')
  • stash_item :
    236
    stash_model :
    1
    lookup_source :
    defaults (cdunifpp V0.13)
    long_name :
    air temperature at 1.5 m
    cell_methods :
    time: mean
    units :
    K
    stash_section :
    3
    name :
    tas
    standard_name :
    air_temperature
" ], "text/plain": [ "\n", "array([[245.47575, 245.20438, 244.97054, ..., 246.39372, 246.07375, 245.7676 ],\n", " [237.7508 , 237.50137, 237.2808 , ..., 238.60011, 238.29971, 238.01099],\n", " [223.22281, 222.64638, 222.1247 , ..., 225.09627, 224.4605 , 223.82877],\n", " ...,\n", " [225.40732, 225.0019 , 224.64072, ..., 226.89435, 226.37177, 225.8708 ],\n", " [243.86288, 243.60034, 243.36409, ..., 244.71707, 244.42044, 244.13028],\n", " [249.29846, 249.13568, 248.98572, ..., 249.84563, 249.65027, 249.47154]],\n", " dtype=float32)\n", "Coordinates:\n", " lat float32 -85.0\n", " * lon (lon) float32 0.0 1.875 3.75 5.625 ... 352.5 354.375 356.25 358.125\n", " * time (time) datetime64[ns] 1978-01-16T12:00:00 ... 2011-12-16T12:00:00\n", "Attributes:\n", " stash_item: 236\n", " stash_model: 1\n", " lookup_source: defaults (cdunifpp V0.13)\n", " long_name: air temperature at 1.5 m\n", " cell_methods: time: mean\n", " units: K\n", " stash_section: 3\n", " name: tas\n", " standard_name: air_temperature" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tas.sel(lat=-85)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Xarray can even interpolate for you. You don't have to know the exact values of the points that are in your array. For example you could ask for the nearest points to 100°E in longitude. I would not use this to actually interpolate a whole field! Just use it to save on typing or if you have a projected grid." ] }, { "cell_type": "code", "execution_count": 36, "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.DataArray
'tas'
  • time: 408
  • lon: 192
  • 244.72847 244.6048 244.46696 ... 249.38219 249.31053 249.22963
    array([[244.72847, 244.6048 , 244.46696, ..., 245.10951, 244.98584, 244.85846],\n",
           "       [237.15535, 237.08058, 237.00803, ..., 237.37787, 237.30826, 237.23053],\n",
           "       [222.5073 , 222.38301, 222.26732, ..., 222.87436, 222.75264, 222.6297 ],\n",
           "       ...,\n",
           "       [225.26901, 225.17426, 225.08258, ..., 225.56303, 225.46518, 225.36763],\n",
           "       [242.8312 , 242.72885, 242.62749, ..., 243.12952, 243.03493, 242.93588],\n",
           "       [249.1559 , 249.08406, 249.00839, ..., 249.38219, 249.31053, 249.22963]],\n",
           "      dtype=float32)
    • lat
      ()
      float32
      -87.5
      units :
      degrees_north
      standard_name :
      latitude
      point_spacing :
      even
      axis :
      Y
      array(-87.5, dtype=float32)
    • lon
      (lon)
      float32
      0.0 1.875 3.75 ... 356.25 358.125
      units :
      degrees_east
      standard_name :
      longitude
      modulo :
      360.0
      point_spacing :
      even
      axis :
      X
      array([  0.   ,   1.875,   3.75 ,   5.625,   7.5  ,   9.375,  11.25 ,  13.125,\n",
             "        15.   ,  16.875,  18.75 ,  20.625,  22.5  ,  24.375,  26.25 ,  28.125,\n",
             "        30.   ,  31.875,  33.75 ,  35.625,  37.5  ,  39.375,  41.25 ,  43.125,\n",
             "        45.   ,  46.875,  48.75 ,  50.625,  52.5  ,  54.375,  56.25 ,  58.125,\n",
             "        60.   ,  61.875,  63.75 ,  65.625,  67.5  ,  69.375,  71.25 ,  73.125,\n",
             "        75.   ,  76.875,  78.75 ,  80.625,  82.5  ,  84.375,  86.25 ,  88.125,\n",
             "        90.   ,  91.875,  93.75 ,  95.625,  97.5  ,  99.375, 101.25 , 103.125,\n",
             "       105.   , 106.875, 108.75 , 110.625, 112.5  , 114.375, 116.25 , 118.125,\n",
             "       120.   , 121.875, 123.75 , 125.625, 127.5  , 129.375, 131.25 , 133.125,\n",
             "       135.   , 136.875, 138.75 , 140.625, 142.5  , 144.375, 146.25 , 148.125,\n",
             "       150.   , 151.875, 153.75 , 155.625, 157.5  , 159.375, 161.25 , 163.125,\n",
             "       165.   , 166.875, 168.75 , 170.625, 172.5  , 174.375, 176.25 , 178.125,\n",
             "       180.   , 181.875, 183.75 , 185.625, 187.5  , 189.375, 191.25 , 193.125,\n",
             "       195.   , 196.875, 198.75 , 200.625, 202.5  , 204.375, 206.25 , 208.125,\n",
             "       210.   , 211.875, 213.75 , 215.625, 217.5  , 219.375, 221.25 , 223.125,\n",
             "       225.   , 226.875, 228.75 , 230.625, 232.5  , 234.375, 236.25 , 238.125,\n",
             "       240.   , 241.875, 243.75 , 245.625, 247.5  , 249.375, 251.25 , 253.125,\n",
             "       255.   , 256.875, 258.75 , 260.625, 262.5  , 264.375, 266.25 , 268.125,\n",
             "       270.   , 271.875, 273.75 , 275.625, 277.5  , 279.375, 281.25 , 283.125,\n",
             "       285.   , 286.875, 288.75 , 290.625, 292.5  , 294.375, 296.25 , 298.125,\n",
             "       300.   , 301.875, 303.75 , 305.625, 307.5  , 309.375, 311.25 , 313.125,\n",
             "       315.   , 316.875, 318.75 , 320.625, 322.5  , 324.375, 326.25 , 328.125,\n",
             "       330.   , 331.875, 333.75 , 335.625, 337.5  , 339.375, 341.25 , 343.125,\n",
             "       345.   , 346.875, 348.75 , 350.625, 352.5  , 354.375, 356.25 , 358.125],\n",
             "      dtype=float32)
    • time
      (time)
      datetime64[ns]
      1978-01-16T12:00:00 ... 2011-12-16T12:00:00
      standard_name :
      time
      axis :
      T
      array(['1978-01-16T12:00:00.000000000', '1978-02-15T00:00:00.000000000',\n",
             "       '1978-03-16T12:00:00.000000000', ..., '2011-10-16T12:00:00.000000000',\n",
             "       '2011-11-16T00:00:00.000000000', '2011-12-16T12:00:00.000000000'],\n",
             "      dtype='datetime64[ns]')
  • stash_item :
    236
    stash_model :
    1
    lookup_source :
    defaults (cdunifpp V0.13)
    long_name :
    air temperature at 1.5 m
    cell_methods :
    time: mean
    units :
    K
    stash_section :
    3
    name :
    tas
    standard_name :
    air_temperature
" ], "text/plain": [ "\n", "array([[244.72847, 244.6048 , 244.46696, ..., 245.10951, 244.98584, 244.85846],\n", " [237.15535, 237.08058, 237.00803, ..., 237.37787, 237.30826, 237.23053],\n", " [222.5073 , 222.38301, 222.26732, ..., 222.87436, 222.75264, 222.6297 ],\n", " ...,\n", " [225.26901, 225.17426, 225.08258, ..., 225.56303, 225.46518, 225.36763],\n", " [242.8312 , 242.72885, 242.62749, ..., 243.12952, 243.03493, 242.93588],\n", " [249.1559 , 249.08406, 249.00839, ..., 249.38219, 249.31053, 249.22963]],\n", " dtype=float32)\n", "Coordinates:\n", " lat float32 -87.5\n", " * lon (lon) float32 0.0 1.875 3.75 5.625 ... 352.5 354.375 356.25 358.125\n", " * time (time) datetime64[ns] 1978-01-16T12:00:00 ... 2011-12-16T12:00:00\n", "Attributes:\n", " stash_item: 236\n", " stash_model: 1\n", " lookup_source: defaults (cdunifpp V0.13)\n", " long_name: air temperature at 1.5 m\n", " cell_methods: time: mean\n", " units: K\n", " stash_section: 3\n", " name: tas\n", " standard_name: air_temperature" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tas.sel(lat=-87, method='nearest')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quick plotting\n", "It is very easy to do a quick plot of your data. It isn't a plot ready for publication but it can easily allow you to visualise your fields. And the nice touch is Xarray will automatically use the meta-data to add labelling to the plot." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEXCAYAAABYsbiOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOy9e7wl21XX+x2zqtZa+9Xdp3NOTpJzDhyCBCVcE674jFwV8IJeBRTh4oOHgkHEjyJ4Lw8VRUSRD6Lo5WF8BETDS4hELhoBBYOgmIACMYEbTEhikpOcZ7/2Xquq5rh/zNeoWmvtvbt7n9O7mxqfz+5eVXPWnLNmVc0xxm88pqgqE0000UQTTbSJ3J0ewEQTTTTRROeXJiYx0UQTTTTRVpqYxEQTTTTRRFtpYhITTTTRRBNtpYlJTDTRRBNNtJUmJjHRRBNNNNFWmpjEOSQR+SARuSYi1Z0ey0QTTfSrmyYmcQ5IRN4hIh+fjlX1naq6r6r9nRzXcSQif0ZE3igiSxH5tg3lnycib4vM7t+IyItM2b+O59PfSkR+3pS/XETeICLPiMi7ReQrTxjLoyLy70Xkhoi81c6liLxQRF4nIu8RERWRR09o68T6IvLxIvIzInJdRN4lIp8uIh9j7ud6vNbe4wfFej8Zx/ljozZfIiI/ICIfEJEnReT1IvLhJ4z1z4vI++I8/RMRmZuyyyLy2jiWXxGRP3JCWx8X5+5GnMsPNmUiIn9LRJ6If18nInJcexPdOzQxiYluld4D/HXgn4wLROR3AH8D+GTgMvB24DtTuar+nsgE91V1H/hJ4HtNE68B/kO89ncAXyAin3TMWL4T+FngecBfBP6FiDwQyzzwb4BPPeV9HVtfRD4iju8vAheBlwNvUtU3mPt5aax+ydznO4Engb8LfO2Gpi8BrwM+HHgQ+GngB7YNUkQ+Afgy4OOAR4EXA19lqnwTsIpt/VHgW0TkpWwgEbkf+H7gLxPm/I3Ad5sqrwQ+BXgZ8OuB3wd8/raxTXSPkapOf3fwD/gOwsJ0CFwD/m/CR69AHev8GGFB/slY518RFsR/DlwB/gvwqGnz1wI/TFiUfhH49Gdx/H8d+LbRua8Hvskcvyjez4duuP5RoAc+xJy7AXyEOf5e4Mu39P8SYAkcmHNvAP7UqF4dx/DoKe9rY30Cg/jqE64dPL8N5Z8H/NgJbVyObTxvS/lrgL9hjj8OeF/8vUdgEC8ZvWdfu6WtVwI/aY734vv4a+PxTwKvNOWfC/ynO/G9TH/P/d+kSdxhUtXPBN4J/H4NEufXban6GcBnAg8BHwr8FPBqwmLyFuCvAIjIHoFBvAZ4PvCHgW8+Ror8ZhF5esvfz93ibUn8s8cAH7mh7mcBb1DVt5tzfxf4LBFpIuTyW4Ef2dLXS4H/oapXzbn/RpHmz5p+C4CI/LyIvFdE/pmIXH4W+vnfCIv+E7G/3y4iT5vylxLuM9F/Ax4UkecRGGevqr80Ks9zEp/vb9/UlqpeB37Z1N/U17M1vxOdM5qYxN1Dr1bVX1bVZ4B/Dfyyqv6IqnYESfujYr3fB7xDVV+tqp2q/gzwfcAf2tSoqv5pVb205e/X3+JYfwj4dBH59SKyA3wlQSre3VD3s4BvG537wTjeQ+CtwD9W1f+ypa994JnRuWeAg1sb+on0MIFZfyrwYcAO8PfPsgMReZgAF31xOqeqP6Gql0y18X2n3wcbylJ5npP4fH9iS1vj+pv62p/sEr86aGISdw89Zn4fbjjej78/GPjNViMgYNIveG6GCar6owTN5vuAXwHeAVwF3m3rRUn2BcC/MOcuE2wCfw1YAI8AnyAifzqWv9kYgz+GAL9dGA3hQuzvWBoZm998yts7JDDsX1LVawTby+895bUnUrSl/Fvgm1X1O4+pOr7v9PvqhrJUvm1OTqq/qa9rqjplB/1VQBOTOB90lh/bu4AfH2kE+6r6BZsqi8i3jrxwrt3CwrlGqvpNqvphqvp8ArOogV8YVfts4PvjYpvoxQSo5J9GTejdwHcRF2JVfakWY/AbgDcDLxYRqzm8LJ4/aYxvMG2dFj75Oc72eWUSkfsIDOJ1qvo1J1R/M+E+E70MeCzCU78E1CLyYaPybXMyaCtClh9q6m/q65bfjYnuLpqYxPmgxwiL41nQDwIvEZHPjJh+IyK/UUR+3abKqvqnzEI5/tu6cIpILSILoAIqEVmISB3LFiLykdF18oOAVwHfqKpPmet3gE9jHWr6pVAsf0REnIi8APg/GWLidvy/BPxX4K/Efv8AwQPn+0xfCyC5h87j8VY6of6rgT8uIi8WkV3gSwlzfiKJSBXbqgEXx9vEsgvA64H/qKpfdorm/inwuSLyEZG5/CXiXEabwvcDf01E9kTkFQRPs+/Y0tZrgY8UkU+N4/tK4OdU9a2mry8WkYckuDJ/CevPbaJ7le605Xz6Uwgf8DuBp4G/wGbvps8z9QceRcDHA28zxx8O/L/AB4AngH8HvPyMx/xX4xjt31+NZZcIEvd14H3A3wSq0fV/mABFyYa2P5bgsfVMvP4fArvHjOXROEeHBG+ujx+Vj8epJ9zbsfUJrqYfiH/fAdy3YTxr3k3A52xo+9ti2WfH4+sEeCf9fVAs/xgCxGPb+2KCgHGFwLzmpuwy8C9je+8E/sjo2mvAx4zeobfGOfwxht5yAnwdwVvuyfh77blNf/fmn8SXYKKJJppooonWaIKbJppoookm2koTk5hoookmmmgrTUxiookmmmiirTQxiYkmmmiiibZSfacHcFY0a/Z0sbjvTg9jookmugvo6rX/+biqPnByze30Cb9rT5948nSJmt/0c8vXq+on3k5/d4ruGSaxWNzHb/zoL7zTw5hooonuAvp3P/YVv3K7bTzxZM9Pv/6DTlW3euH/d//t9nen6J5hEirgm/OBnsnNuBX7O9DnzdB58pB+jt215YTuVE5X76Yo3eM4LZLq+rmz6O5mmjxN/ydU0dPewwmf8qnbeRZJAX9WH/A5pnuGSUw00UQTPZekKO353RfszOjeYRICeouKxFgStNLVVilx03lJ19+ElHNGApGahk6lVWwRgG5JIznHAZk3JeWf8j4kzZ0bHd9mu6OLTj532mbtO6bD87f0+m14vwffnikfaCoi4f0y5wbfittyPn9Xpx/Pc0WTJnE3kYCO4SZ/zEcl5dzat5bKnGz/Dje1bdqEUy5QmxaQ9NKfsLhsa19Fjl1ARHWzOu/XGdxgBjbN3/pBrHtrjONMoJtj+j5xQT+unfEC223p43aY5q1eewtr1VlBlCqymdk4Rgwj4XN2EOFAY90M4YlghS6tSh8q5rrxziUA7rlhGorSn2MB6azo3mESE0000UTPMflzZbR7duieYhK+Cv9nadRKFFrOq5jfbl2NtdLs1jIna22O6+lY2zBjKdKPbJd8NkmHuuX3oE5Q6bdqGiPRa5tEeaKkeVzxNgjgOCl/XHSrGsHNSHejqsfe87YyM5ZN1ycJOpWdtdH15Oe07UXQPPbchq07/r3tPu1vv+V8vtDCSzI4ryJFw3XOaAsClaAuFlaCxmu1dmgVNA0AdYLGF0ld1EbcMVrHbZAC/cQk7i5y0YakjvwSgfFCiS+wVgaOEUDB9ekjoai5TtbsExovdBvsVQmXlQRh1ce8kVuhG3tDx1+fb0EJH2eq7yk5RnP9ciCj/vMi5vT0sMVJ38ZWHHyD104ex/Fw020xhgwBjiEku8CZvlQDjGIXTzv2bYtkbqBAhuMN3HKbo/O2v9tiJKplTH7EAI4rA+j9hjYU1A+PfazX9+G3YQ6qmx+UiDv2nRaR0odzUIflSar4u4pSYOUyU8A5tKnQOnx8WlfZy1HrwEyyvcRx5lDUpElMNNFEE020kRRoJ5vE3UUJbkIE6RVJ2kGUJvpZlDDEaBVOqFYeXxd1NZNqkGwtpBQlPJ/aMLBVgbBGEuLISLzNSyP1JUYqG0jWOqo7hrP6zdfJAAIgSPlWu1qDHNKFwz63SutjqXd8f+Pjbc2Mz48k96ABrl8sPtbdCqtsPp376DdXOFbr2HQMZi6LND143mOHAaNVDOy5NwMh9Vrqex+Ok6TvjUagCm0LXb/eRjYqm/+rLY4gfR/+zHntulymfovKlzWB8L9UVemjqobP2/7uemi7or1UFXKwF26hEeSwRZIm0XjwYVnzUkUnji2Y8G2SohPcdFeRlsVZK0Fnkt4V1EmAgNI7IiC+4JRaOVwbYaTWZ1gjeVxYhmLJV0aVtZ4ZCq7TfKyutGHtGGksmUGRFrxY5Au8la7ZCMekNi10E+85HxuPLfFaxjP+nm07o762ugqvQTEbxpjLtLQzWgg3wUmWwcqWxTy3dRxUdRwun/o4Ds46KbgtwyTx8DTg92mYzqZyT2AC8Vg6X2AiH3+bRXvtHjK278rCbc+nvjrjvlVV6NNXQtFqNWhTnMuMQaoKWYRN/WQ+h90daMKHmGAhTX0a76ex3QbVcF/5/vp8TF/uV0TQxjAYKTY+3zh8ZbykzO8zId0qX9xTdO8wiYkmmmii55CUM0uYcK7pnmES/Vy4+kiRivoZdHvxQMC1UB3GY4WL7wgSlnjFtVoMYVKk13C+HFupVq10wrBcugB9Fc0mNkyQll2npUyMBB2l7PGxpaytnCDCpPsKdf1AurIGeYeB5fxQazmW7NiOg3pS3Vv8mqxWp+4E4/UWY7lYIyyc6I20iawhWTalyDjGIH9qOga+AgqEpDqEmKAYZFcdrNqsBeiqzZCOzOdBc4gGYSpXtId0T7bN2Sz8v1zCrEH2dkM7i3lpo2lg3kA2HNfovIq/q6Al2/gIC6fa9yIZ7DEaQZMgYIe0As5oS+myWU2/Px84p2QjthO0lqyp+1rwzfoU3zoJ/ZmqJueT7hkm4Rs4fDD8trASgPSBSew9Fl7E2dUeacuCaKFKX9mXSgfwTz8zqmu0T2QGYnD+fh47H9sQABR8M/wYE8MQD9WKAiMga3BTJifrNolRX4WBFe7m2qEnymBhiG69G/tMY9oICZ28IG6LyN1aPz/DsX3nFPYa88yIXkqpwRBIWGCbNQ+mLbSR0dxqqrBN92+gJNtnhmHG8NKqhWWEfSpX4Ka2xV+7XhoxAoIeHiHzORLhH5wr/dZ1GFcdBa2dRYBxADk8gqMVRCbhDxb4WYSQogfRJujNdUq17JE2CmRtD51HOgOBpbE5B5VkpjVwh00usPGEqOJ3AwPz8wRlhTIv5vudCf3c0e7F40o4urw+9bdKm8yC9yLdM0xiookmmui5JAVWvwq25LmjTEJEPhz4bnPqxcBXApeAPwl8IJ7/ClX9oeMbg342MoRqKezncPWhIFHsva9i730tAH7mBnXFa46B8FXSj4ukryZgTw005Ssjwcu65O+NURuG2kOGqXzor7lR2nQ29cPY2yjHRWh0WioQFlpMp2riNRQJxvkMMZXfISjJZThAPANRSbwfGhqzip+kQTPULbCQOor0alMrnIaEgcSqI02izK0dc9SUkgZI0RyydrBBis/XHxcPcSsQmgjYOIKxBG5Tslhp2lMMt4mSZ5AvRmbtOnS53BjIKU6C0VniO19Vg7gBt78H8/1w0BuJfz6Dpqa/sAhFi7poAJUM5sF1HmnDCbfqkGWLHIVvjeUKlssAgUEwqqdvazaDWRP+4rEmLaGqoHboIsJYWqHx3n0Mpsvaw9xlL8d+4VjtS9TsYXUB+p21abkt8mfsMXUe6Y4yCVX9ReDlACJSAf8TeC3wx4G/o6pff1MNWpjJOrvExbwP7zjXXyAsLwZ11XVxIU7rxKwsdn0TX6rYbnNtvcs+Ypy+oeCdCe+PC3x1I8JIhCA81youfifVquCy0gcGVZjG+mI7YD5pIUgfrPGgch6kM4thur7zuCOr7pu22zjATZi99+F8hLBEZGSPcaeyF4gXxi7B26LWGeXvWRPaBq67JvDRzlHGwfNIS+SuBAZRXKXNdWOMPPax3u8Gupmobesu2mtZmJMdwdZNZV0fYKHEUPquQFHiAqRkA9/WxhD61K5Fo/eT292FSxfRWZXvURdlkXbLFnd9GeoedSZ4zQ0D2JxA+q0V1kuJNkCk2oaXX1dtHousWmRnERhXvH+NkJaf10GAsQwtvttaC37mMpOIkxDKJEDN+XSEnc+KFCabxHNMHwf8sqr+yjhCdaKJJprovJEi9BPc9JzSZwDfaY7/jIh8FvBG4EtU9anxBSLySuCVAPXF+6hvJIMz+LmacHylr6LBGPDz8AfgVkHKTCqpn+VYHEIMQ5HEVgeSJVLXRbgp1vW15t/ik9RSJM+sSayU2TULh7DmqZSkpDSGVG/glG2hpz7AKamd1GaBjYzPeesDbJTrmnQLMT9PTg1RSfGjj/BHTp9fDaU0vB9K4tYbqPPFO6gqRmQiLFY8y4bSoLqiPVh4q0xUGpoxSttJS3Njc9kqxgivEe7bAM2cJn2H1QIshDa+dgwhbQoI7BWdObxLL2Yw9Lob8cXpTV91Nby4qbNRmbbFLebGGWEU++B9iZ2QYihmN+AwGRoSWTcwJwnd9wWy6zxae9wylK3uWxSFa+aQtqKKBnA3b5CdBe4ojbVoQNnrKsVU1C5rfFo7fO0G74I28R2NKEF617u5yxq9r0PZwKPpjA3NZwE3icgC+A/AnLAm/wtV/SsicpkAxz8KvAP49LQOisiXA58L9MCfVdXX3/ZAttC5YBIiMgM+CfjyeOpbgK8mPNKvBv428CfG16nqq4BXASwefkTT4t7vKFoZ76HRL+8LTlkdClpDv0gflQ5hD7ummYAt6aV4ySTy5kKVkkra2CiaGyMvIYOXE+0cFidOjK5aKVrLZrgpdTNemxKTaD0ueZisuuhlkgwvZtFQDW0mqKNp0PSBpQRraUHvFTuzMsKmx3aH1D8wgCoCuVw3uwZHBmHTS4/3Jih9hHv3ad5sYGNm3IUx5Ofkoh/XBt6Sz2X7hfmdbDVa7DPZPXVDPiZL4n2BuzDMKOH3JihMncPvR4x0ZI+QvodFxO8NExYRaIxtYxw1bdxjh1HNccF2Be4ZMEFfGIo4QdO77SKvj4ygOupo9+NLUwvOBqB6cN4jPrrWymhsdqzmXUvvgjfCRB8hreTmnW0SDbS7oazdD67wSSBUR7YpngUpwupsGlwCH6uq10SkAX5CRP418AeBH1XVrxWRLwO+DPhSEfkIglD9UuBFwI+IyEtUn50dkM6LrvR7gJ9R1ccAVPUxVe01ZAr7h8BvuqOjm2iiiSYakQIed6q/Y9sJlCyeTfxT4JOBb4/nvx34lPj7k4HvUtWlqr4deBvP4hp5LjQJ4A9joCYReaGqvjce/gHgF05qQB20FyMjdaxDE7auKkRhJns7DKCS8QXmPxPcJUNheihEaoGYmqswuxolnkYGEJP0UjQCGbYpvvjJZyl6nIcp9a2mjoR/EgyDCpqxtzoYmZMUb42l3ofcPm0UE4+WQ6N30xhj6Sjdw8FelpCtf39KvZCNl52VgF1M07D+EYkq6iVkpiV6JTHUJrIhUxhk+9yEAEiei3WNy+b8yj7+rX3oIUuwTWXiupL/089cgQyjxpENq1W5d60EFfPJqSKrZLjtQhtGqwsxHSmyUwbzi4GCdNEg147CweEhdH3OxBo8mEx+pM5APPZdSplWk4ownxfJvk9phRMV6AfnBtqSW/VUbZhQX8fAzWTInlVoXw2hzgSjuaCpaJ0C8dxAq1RXHCV8I2U/e/F0C8fRfeG4X0Abg2j7edAcMvw0GyIMZ0FnZbiOjjtvAn4N8E2q+p9F5MG0Dqrqe0Xk+bH6Q8B/Mpe/O557VuiOMwkR2QV+N/D55vTXicjLCW/mO0Zlm8kpmlxgRY9lEsOkddHO0JUFlSYtaBEHt14zUhpJC1cuU/OboOoCuDm0O6Fmc6hhUYovvOsU15kFrNf8EauUFOZre2T4YTR2WCDLRxQ+sBgM5RW3CpXrox531OOW8cKZoMSvSBVZNQWXPjzKAVvaxUheAx9kTxQR6Hok2nw4WiEJ0khYtk1klwO4Kuhdvke/25TdBRWclsh0HIPcOyplDhMubZlGHqOP5ccJDYP6cQ5nYcwJFkw5BMO4hX7hsvu0r0OSyERupag5ljzOke1EhX4Ry+oqMOtU56jD3ViWees1RM5DOGdsFLKUAiGpBgaR8o31xp3HusymdlLOpZ1FeB61WRKS7aOpA1OyQZfWjlS7AoeZXFAygkN9EwwEKXB6YA8TQesqe1T1u01wtSUxV4buutHN9uhSxeHzhPYg9UGxE84U3wxtk2eJnagK/en3TL5fRN5ojl8V4fLYlvbAy0XkEvBaEfnIY9ra9DafsbWl0B1nEqp6A3je6Nxn3qHhTDTRRBOdmvzpNYnHVfWjT6qkqk+LyI8Bnwg8llAVEXkh8P5Y7d3AI+ayh4H3nH7UN0d3nEmcJUmdRBQ2Q0ZJgPKCrKLq3gpuKcyeCRfUN6A9CGXVIXT70O1EqaymqKtWuyBIoNnbJ0IaOd5iASlvpm+E2TUdeAZZ25dq8aBSMeJBPZJ4baHEjLTJxb2WoTTdK1VSFmqhoRiSZdkWrynHUGQ2GTWBIK1mg2hVNlWazUJZzjxqjOHtSMIUKVJwXyO+zhCeA1wyaldBA8lBU80w6FGNt1eBJYqkW4IcZe1dGKf8sMGDCSZyS4/r/FA+S0pc7QKceBSDxpzx23cSUlGYAMXyjviBAdy1frDDGlTFOF67MPc286lPsKAOtACWy/J7Y/6n9ZxHY9LlKgS05XuVDGnprIG5WSpc8TyidvhZBdFw3e03GRZyK4+fOZMnDLw6SJqr1UAcIQ9T1B66/Zo+524K40mwkYUWr79IWN4HWqf5Lu+BOqDS7GAS2jk7gVvhTFxgReQBoI0MYgf4eOBvAa8DPhv42vj/D8RLXge8RkS+gWC4/jDgp297IFvo3mESgsn1Ej+0tI1hTKykbahQP1MxfyrCP1fXm5obZ9v60ODZwPJS+N3Pod8tnlCuFWbPhN9agVuWYDrXlrFVK4J7bAp06wuT2ASNrKUiT3CLGnV+5B4qPni35MWvw6j1AfbI+XSOWkipnzvjGpk6STh4XYfAq7SINTXsBldG3ZkHL5dVvP7wqCxIXR+iaA22nuEO30PLwO6h8ZUUHFBcd91hiAy3rrTZRbIJC1WCf9TYpKq0PqZ07HYOEy8c2IDC737H0blqYOewCRvTwpXmqQRHhhD6+jDOb+czNBIgo1GwosH285zH63RW58R50nnoYp2uC0zD2oes7UgcmpPhmbbTM7HeVQle2lmE55TaPDwqdboOxIXnDAVqiuMVr4FRxHlL3kXNDUFaLRDiyuNw+fbzeQIz7RYV/SLZFkwUdQXdrtAtUl3ooi2xvRggpdyOZQSRSSSmIWfOJIRWz2QJfSHw7dEu4YDvUdUfFJGfAr5HRD4XeCfwaQCq+mYR+R7gvwMd8IXPlmcT3EtMYqKJJproOab+DOIkVPXngI/acP4JQpDxpmu+Bvia2+78FHRPMQlxBm6iaBIoaB+gJQhSv4vCs6+DpD/YH3vgJTSU7OdP23PC8nnluioKX+IDbNUcFhhjbMQrg2aQzsLCVMGjY1g3/+wZSLLVyvSho7pdMcC6zlMdloRQ2tRhD2EIXk1WKhXJwU0h6+iy9OlcCXxaBMjI7gQ4gD1Eck6etWAys1+ytJ3JVbQuWdP7bEzVnWLk9vOKblEFYzNjiCfeuzWQVkUjAOiTZGz20vG10A82rjICagfVkVIvY0qLlQZoCrK2k3OC9YpPsFbnobKeXt5oFX4wNzk7bfJuq90INesGRwNvMweS5q+CY/d1thsQMZynrHncOIS6LrvtzWYZflIqdC6sLobn2+46VhGunV3p0ab0LckxI46nb4rxv5sLfiZ086SpS3b8aA8CZJvgpn7Xm1T9IycV+9sFLaJoayc4tNwkTRHXdxsJ2V1y/CIIinrH7KmwKjRXyIuIa8Mi3aWI64ZhPqOebD8QNd9Q/H/+RDw2eZZSqurk0eR6Da6uRGakQ4hjnPOo4NTlN4xsEibKVHrBo1TJA3jlcW3xhgkR1wkHj6mb0400FT66Zcq8CQuDSXgnNl9QVeXFSI+WeQcy/Lx4H0EI6ErMJCaHy4tRXZUIa8/QDVIVWaaEV47x1ps6a9CdsFL0uw2+Se6SwwcedhtMnkQy2GbWRqpnqDALCJIZXZg/A+EYe0V15OMOhjpoJ5FTDXYLov0ifWVxn4XEUNzK46InWWAc1l0tvaAGkpHR/KYX0xevqJBjy5sXTIrHUmJC2WOqh4OY0C8xCWuPyh5qbsjYbRsuMLA+MujVgWMVPY1uPL9mdtXn+c3zHp9Nu1fR7sfAtx2h3ynfYb9bmEK3p/i5L9+1Fap6yTAtgN8ZSlziKEGvomWNOCPyp/duumvp3mESE0000UTPIZ2V4fq80z3EJIoqae2umVaOOu7Foq5kg9Q6SC/dbinDaAsDTcIPy6zHVKqb6rnOCHoILktvsY8kPFcMpFy1O9qNoK+xxJp8+qUi5iCKHloSBpQgNdEiWQYpbpRKIEEcPWGT+awu+ZLConLIfIamuInVCuKexw7Q/Z0y8TuLofRqtYe0JzGgTYV0PnhYEQ3fNkWICJogrd0Z/U6dtYfxtylaNALQAiXNZJB51td2X/LwjFJ+ruBoUF6ebTBgv+PodocDyIJ7FzSQdOzrAj31swAfpveiWnqaqzGdxWEXPM4S9NYz9EYy2plWgqiR7tUYsW0+pnRsgxVt/q+qZJLV2oXrEmxms8xW1Xo2WVc0D1+7nBet2yl50G48XxDvmD8TjfhxvH1M+b06cFx/UdIqAAf9PNbZ89ljSZKHUhrCUUXzdFXmSUMqHgC/p0g9GmvaROvZgJumVOF3EQm46Mqi0UVII8Sj1xt231U8VdyqfNSrA+j2TcCNhYJ6QSpMamgM1j2EmNSHxRpAYvK//B0ZTxgZB8EJ6Kx4cdjtU60nziYaphQvHk69OlR8iV5dSU42KJ0gnRYX2NYszD58yBmq6fzQ42k2K7mFiIwC4Imn4JmrZcczKExib5d+f2HyNAGGCTKrqHNeor4sRpXg9xZ0F8OKkxaWHFzYa67rlGGwlZb6/axitUnBVq4AACAASURBVF88ZapWs2slSSBIz6YvjLhqg52nWiYPuZJivJ+H3F8+Q1olQru5rlSt4pbFRmHdYbt5YVKyW1Jsz54R6hsmqZ74oVfaiGGEqHnMueTN1A+TAVrmsr8DziGH8bnVVWbYGUJK9pq6HvQZosHj9zUr16kLDKKL0Kqvja1nB5YXhfmV2KYI2kj2frr6QcLRg7FNp1CXiGipRtCQdahqPO2FdCBQK7IfBI1KtGQaGJE4Pc2miKcmVc7Ku+lc071/hxNNNNFEzwrJzQTT3bV0zzAJASMlKO3VGc2T4faqo5AiI8UtaAM3oldSd9AH2KFL0qTkjcPERcghwTq+QAWpU6uBZAOoJO0htVN+oxIM2a4cJ8lLnQyN0yOteVyWDadJ8zBBeANYxWAzIoKjN7mcysSJj/mIkuTpXA6SQpuBNCk7O8gy5PbQG4fQdXkDG1TRmP/JrVq4tEd70QRq5RtSXKv0cb/iSrV4zcxq+r3ZMK+Tye5qN7gPHkOaDdhXHqkz5JE2m0pGUNcVzzbXMTB6JpgQoKsEX5XUKn3jcp4vP/pqsiZH8OevbyjzZ1If5SFWRxr2UDebU3UxLUe1ckCNW0UHh9Yj9XAHwWywjXF3GZoSIee68A5qNRqZC8FwcU7xwG6YHBXJ6VN0VofYjOztJNAPPTgy8tkrRIjQX9hhdaEu+0g3Q014eR8cXQ0n5hE+XR2kuQKdJU0CcLrR+WQME7mdDuwOc8ZPAlGbGJ7xNpFypnES3ExajruW7hkmAfYFENyhG2z9aXef6+fgI/ZJitTsEwRRVFJ1ErT95IbZg7jipTTYhVKL12ZwTzXH3XCBVy8DvNu+Z/ad1vzPBvLkRiXaYzKzqYHewE/EYyI0o47euDwWeE0H2LM2bjBu15atKaXtkbjVn+zvhYC8tuQP4sZhGObhIe76kv5F4avuZ664krYebciLe79XXsdup+LaQ3Xu/8K7OqobhUP3c8fycty5rILD+4U2Our4uU3ax8BNUnqojtJCHJ5Nsk+JZ83lNUFK2hhmooRd/NKj2KXkwlqEhb/bCQOYX9EMWUHK1VXGltLJ+0pgUXZYC/UKk5BR9HdI8pcWWBeC9CAE7Hk/ZBI7JTcXULykvC+R8D7aiFaJS2pZeZ3Dug6Hi5NQ5QeMYRjUCt0eXHsk1D26VuF8+S78TM2HcfLinRjIADISReQ4GGnY7lkyCZgM1xNNNNFEE20hRaY9ru86SpIeGrOCxvMuqMF59zkTxo8CM1/y/rQuaxVpk6Ei2Rcx30vI1ZQN17EfiNqAWG+bMjbPBshKhnXGKcDtWDfuI+0l9hklrdp4U8WGU6AZleDnRvoxMQSu15BCIt1vLeub5qQ0EbVDuuhhUlXIvM6pPmg7I9n2SNtRHyapt0ik/dxRXek5el54DesbnvpGqHf1kZrVQbnfpz+kZvF0lWNPglE0jTNsGpU1KSHk7Em/ZagFJC0yaZtZsjfhBQXWMjdvPNmWD/qSx2u/Q1dxLlZCfd3lXGD9vDgNpJicqi3PJhmffQ/VSqjiDfe1BB/8nFZbi9G+C6kwchBko7jWpN7otRid7Q6BveacWABalVxRGcoa7Q4YKkZPs1k9rAshHYd1ZrCOFzENxupSOF5eBrcqWnS/0MGcBq3dPChDA21BFJe1ipFm8Byu2cpkuL67yCySisBBS98GQLnf78M7l7YTFTLMxCyuDL0pSwnBNGDNGcQy7rEaXWqsh1H2gorBdDpiGvl3XdoZu7ZuZQqJWR3zEZTAuzC2nB/KuMd6wgdv8z6Nt09NZV6Ka6P4ENmc8hBJR4EVahcx5eQ+VuAPaRp00eBS6uz9KkM67a5w4/lNxv1FXdmRdQf8rESx10fBpTLh+e1+sTNoFRlEem7WVpTSQ+d3g+z94ps+zGt89vU1l10ps5dNZ+4/pqLXiy3VbIQ1zs3+Ds+D69fD4OqnaurrpY1qWdqsluX5VivBN0o/L95GgYGZZ5h+Jzfb7OnlTYp1jUykeFflcSX70ibKUGWJFM/XJbfl9K4v+5xTyjfVwKPJoi9JUBtsI7xj7AtOB88sGBaLTSLDSylqOpY5p4U5mO8+Hq5RkvZ9L1T1JinrVknObD+J80z3DpOYaKKJJnoOSZkiru9aElFmey26Ez1sFHzv6A+TVZIQoANI5Yd+1aLF396vOUeYekHaLPCErIsx1lidpLCKtXiLXEfC6WJINm1ELWIAgRpV3fbn61HeH1c2NpI+1U/HReUvWpKBKBKcVgevr+TFEyAjF38TcgWlQCxAL+zF6xw6q0tA2VxodwsU0+4VSMfX5h6aoEXMnxzOzyr6x/uZDuBENR4wajeXiecLpDfAD8N/sXC147Nkm94PH2EcacqDcrXf8lLELkRp9oMLld/pWF4NWkV1paJfmLxhc7IB3DeEXQtzCovgBWefW4KbqmXwCsupVnqjGXpCMJkWjaQE+pVUIqlssC+7CfJc27/dGe2iLrvR9XOHr4qjgK8YGrHTH0bDs1lajVYhRrMQ4+mUtAgLMeWydLzheaQsJKsbQVX1bQU77Vq926FJk7jLaOD0IJq9KPpVFWKK0oeuQ1U2ezalRrbZBDCQafwnF3sthRuEi9yDYRDjNsc2CRtMt2auSG6QEBfvUZuueOqIK4nqXC8hIV2KQvWlcXUUuAMi5BEa9rjAKBJsNa+yp1No2EyGnUNV+kVFexAG0O4Iy4uhjW4vukyaBSYtEm4l7Lzf3JcE+ClDPjXFjhTHXnL0DH+rORYLaaS6Y4zPFLpFFDTWong3U8LOJUMjPf5SuImuX6BtSXGOlNj3XsJc2Kh96SXbtUJ6+TRPEhhF2sOiLwxjbXtWEznuYuLDkvMrGQLCddo4XEz3Pt6WQp0rkJKSBanZMyuWl+vNtjKJqddl9FwMY1DzHTJgDMZNPDIIMUzCme0AwrYnBnIyv3vvSn+G0ZwFqcq51iRE5HWnqPakqn7OcRXuKSYx0UQTTfRc0jmPk/h1wOcdUy7AN53UyD3FJIabDJVjcYp6yWk7BiqHEjGleDgwhMkwbsGVXa11pBGIkfoHQXYwDNiy/cLoZOrHnLbogK1j0K2cxtrAT+JN2ghX9or2vVKJQPTrl16toAWqg3QT2ac+Sp12c3oG9dIkMBBDxUO7X7G8EMraAylBaU0IVsteQvZ7i3OYJNRuB1YXQaNn2iCvVZJOB5BSmac1dXCgudkJFhPcoiGYrTpZ8hwYTtP7I6WsThLw/Ue0NxrUlbxWaT7zhlMpNVUX4LYqhJtQrczA43Mom1oJLsGnSVMwkGV2oKiqocG7slBjnNdxyvA8TgNDjlKPz670dIuUpkNok8bhg0qZPcUSDJiM1Tb1hhtCTFbDS1qE1R6SRuBynMT6c+r6irarqJuoHdUe72Wt3q1S2HToGGeAO09/UVV//LgKIvJVJzVy7zAJHX6sqoLaF0IL88BTygZ7hEbKi0+4MC2jIclbgmnS9eaaxKRcTF9s80FtG7Zd3Gx7qczmf9JSd+xq6JsSFJawMBvtmxr2dcC6C8RksKHY/uB7s/1VkgPfxinME4MBYnruWNYrqwsuR+S2+9YVmeKZZPpK96SuuLneeMRv9loKHQ6vHeCOocy6Tw44tZECpPKDL2L4Ppk2RuUWXkr3kctMvbrucQeeoy5NavH0CgkhSwe+WX838pw6QSvN+2BoBWp2QRwkoqykPBcf3iNJQXGjJIau8wWitPBRZGZlZ74ioaTtYXc/EBbidremi0GNY1sZVVioJb/TBRtLDKKU+WKDcOELdDGqvDLeTeNAOgs7HS4rfC/U0aPJuZ7lsuGsSOG8x0n84rYCEfkCVf0WVf2ekxo517rSRBNNNNF5ph53qr87RK8Vkd8wPhm1hz952kbuuCYhIu8ArhKyR3Sq+tEichn4buBR4B3Ap6vqU9vaSGRhJq9CH3PP6AYVM6m1IbWGmFQcmuvLCMYYePeMNAo1BuAEv+ReXbw7jCQ8kHbTDaxrHFqyJqxBVGqMuutpxIMfPgRf+5xSYaZ5gxiAxlOC2+qQA6nACVLQFx/TXmepf5hnqmqLVKpViR/RmTB/xtNcC5Wviyt7FTvWPFwS+RkcPii0+1EDqggTO/JaAnPvY4M0Iw3CnC/1NucLOg2V7NxDeMlqD1bDqFx4L+eXwoNZMsfdiDBNL4N082k8SesC8r3XN4aSft8UzU6leEQBg0zF6V3OmeDH+6ur2FfR3GB6phGytBplFXbws55mA8cLV74VrbSk/YY1D6ZN2gMEDWKb9pDgJrcGB0DlPJWDOsLMbVdRVZss7LdGd0HE9acB3ysif1RVf0pCCudvAV4C/M7TNnLHmUSk36Wqj5vjLwN+VFW/VkS+LB5/6XENWJyy6x195wykxMDNNZwv0NP6CmvecqvyuwA+QWQOFn7CpBWTiPXmZmQoSxiEZwAn9AxcYO3iP7Y7DLykJC4GpqxaKrOr0SXVK32MslYJ20Kmxb6fF28bSe6TmD7yrccodrv1p1lsBnsoiKk3EqIS4wplOvA8GuS3apTVJR3CS6buulurmccNcNOQAawzk3LtGDYatZWGsyWgKzEIC0VZLL0SxUW7ysrNS/8S5nTg/myG0s8MvCgMbBLSg2abggy8WqW3TEMHrtpibD644MGWF22vg4SCvpKyXWxFTnHez8KWpUf3xx5cYWza6Lo7siPbeVylecvhsd3BDX77tXnM3nmGWSRKC/fuIu59koLpVAZbbZwF+XMMxqjqm0TkUwgaxRdStIdPVNXVMZcO6Lze4ScD3x5/fzvwKXdwLBNNNNFEa6QKvcqp/o4jEXlERP69iLxFRN4sIn8unn+ZiPyUiPy8iPwrEblgrvlyEXmbiPyiiHzClnYvA+8GPhv4Z0ALfD6wH8tORedBk1Dg30oQvf6Bqr4KeFBV3wugqu8VkedvulBEXgm8EqB54AKdgZfGmoN6N8g5k7UMLxsNtWBsmla0NxCHpNET62SVn5GkX2I2RGS4WVGxm4bfJr0HDI3T1ldevBlqNFSmjKKD3DmAVsXH3fUgRzrIdpqNlTqaAEbwh9q2ZVggxTHIwk1okJBX+0UeGcAf1kvJdJ+9ksTW1fVyc81GqT+f26w9DKAiA3eNYapNHkw2oCvRWOq1147/r/dWdMuAvXkNRue0P4FT1rzi/MjmWpmU59pZuMkqPYL68v6K1wFslGMmPDHQU/LxYBc7IWeoXe07Du+PEOUipmJPsJWW3Fi+0WH8Shih8Tr0OU1GFSGlZJwOG+pFLWOD1rAtm6sTzfdQQYxliBc2Xc6NdRakCJ0/E++mDvgSVf0ZETkA3iQiPwz8I+AvqOqPi8ifAP4v4C+LyEcAnwG8FHgR8CMi8hJV7Uftvony4l8FfjPw0xQs48WnGdx5YBKvUNX3REbwwyLy1tNeGBnKqwB2fs2Lhm+NSo6W1VUV8uXYd97CKr6UbQ62yo2aN1WHCckUBq6fFuKykaw6bNPuQmkD21LfA7hm5FabFnDXmdTYpMVF8habrtO8b0HKB1VFT6jqyOf8TL6WIYykZmHzpU4adx6WQrdwo53ySrkKHBm5pTc2CRspneqWzs18JDz9OIhpg01i3QaxCVIaLkKpfYt9D5jEiDlsgpc22STGzGNvd0ncUZfuqQVeyiPuI7yYkgN6M9++jnOXGP8KnLEVgQ72NimpwTW3l27A5uay3Nr1Wq5TondTHOtC6KIbc7cXAhxzjquO/JuZhkSLYyaePotKs72grnoqp3kRH8NLMJy7Mqfr56qRl2MOWFQ587iGs4i4jgJxEoqvishbgIeADwf+Q6z2w8Drgb9MQFq+S1WXwNtF5G3AbwJ+atTuh9z24DgBbhKRKyf8XRWRX7qdAajqe+L/7wdeS7jZx0TkhXEMLwTefzt9TDTRRBOdNSnBznGaP+B+EXmj+XvlpjZF5FHgo4D/DPwC8Emx6NOAR+Lvh4B3mcveHc+N23rBSfdwmjonaRK/rKofdUInP3tSJ8dcuwe4yD33gP8d+GvA6wg42tfG/3/gZtr1XuhXDmKuJtdKkeABtXvp1op2UnzUeyO+mrQB4cIRNOXIIrN6MdqCRAN0wpEwYpQOvKRKJFqQDl3PmrGX1M0A7inSet40JymbUQPpU5ZUGUuPQ6G7pO7OQ8xDEyOFZk1jA/mmeDuJ1wyF+BoOLzvaA3O7o+C5jdpBegwGNhpDTNuMymvaH+V47Ik0jqFYi30wda3mMPyfUZqIofcN5jrrhSOVsL8XLPlXeoe/MitIow5ejThvpcxK9lUF2QwpYUCaYcniUOA6ga54oQWNRPJvO09WQs7KcnZ2sBl447XRGN+74mygTfzORjmXnNEemjq8tLOqH2hgm+C6TZpEIjuvgy1FzTWzqmfZnSV4clNpOR5X1Y8+tjWRfeD7gC9S1SsRYvp7IvKVhDXRPuUxbZqcHwL+1xPGdWKdk2bsU08oP22dbfQgwfKexvIaVf03IvJfgO8Rkc8F3kngoidS9mLoHCyr7HYKcXFNewzUmuEmV/fBI2QZ9wOwi6cLLnvFhdZ8tYnSofXiQMMeDzl1uBhmIwyMGfY30FemTTXMJI0nHldHDLxbfEN+mtWS4JHSlBWmREqP+xzuPqdS/LRUCuPxdUjT7c3uZDlZ3MDfFxDJe3YsLzgOnw/d/joUpG6EWY+gtkHkdISlxG34FtagpREjMGXDhZ8BY3Aj6MsyhmRrSDTGxbfBTQOmMIKbKjRDI828Yzmv8DHiWZYO6WT0Ptp71oK1D5hi+J1MRmKgVF9DN5fBfhY2b9ggqlqNkEN8/vH96uesRcf7lDrdCGCZAeeoasXVmoPbmrpnVoUXrKn6wXy6DW6t42DZ8blE1cb1MsBbyc5xVnRWe1yLSENgEP9cVb8fQFXfShCcEZGXAP9HrP5uilYB8DDwng3NvkxErhzXLXBcOXACk1DV/3FSA6epc8K1L9tw/gng42613YkmmmiiZ5tUoT0Dw3WMX/jHwFtU9RvM+eer6vtFxAF/CfjWWPQ64DUi8g0Ew/WHEQzSo/GdTc6QU+leIvIHgb8FPJ8it6iqXjj2wueaksTUu8G+xooiM8/excNc9ca1uBl8TN+Rg+uMJC+1D+fzprwUj4+YzsMKcwPYxJENeErRADTuoZ0hICnjzmTaUSPVI5Q007OQZjvdt+sKBFCt4lhjO74u0qTrQm6mbKw2vvkpQ+im/bcDrDCCmyJE50dRgNIXjePofmgPDLzXSf6dtYgBxGTKxlK/1SLWBLh1GMn+3gQppXZtdlELKW0K2sptAsdBSts8ccb+/EmTqJwPmm7yNlLi/tvxvZGilaRd+DZ5mqXUJSkFk3Tk5ylKhqryeFIm2So8W+ulZF9u35jPwGya5RsNWmNyBGnU5LtKc5+0dqWZdcxnAR+d1z2zusvz4tgMN41hJm9dAk9B6XqvMtCObpfOMJjuFcBnAj8vIv81nvsK4MNifAPA9wOvBlDVN4vI9wD/neAZ9YUbPJvOjE4L0H0d8PtV9S3P1kBulxTJybuaRYfsKLs7YUWdVT1XbizYnYXjnVmbo7GXhw2MPogERVUzHz2Pot1BrQdPgJQyI6gL9hu8pQwEM3qPBhDLJgax5T2WVnDLqGZ78j4Mq5jfKAWq1Yds9DCCAkFlnHlW+hMfcOv0IdmI3AI3mbq57TimdEsODmNw1fKSlqAqoDp04bUGuv3YiLU72D0EBkxhAySVimS4GG1iCtuio2FsT2BwzrpkbktHbZlCuta2vc1dsxId7mUyWnBcK9nOVbXg5/HZVUO7ml8oQ9c38j06GzCn8bdxpfVmR8YB4zFD6XdgeZ/mNO3SFziRxgd7RLQzuMZnm8PYM6yuexazjp0mMInG9QP4x4luZQ52MT7ONmHreRWOumZwrrduYmdAZwE3qepPsPHNBuAbt1zzNcDX3Hbnp6DTMonHzjODmGiiiSZ6rkk59wn+zoSOZRIRZgJ4o4h8N/AvyUmmIRlYzgVpMWZdvnCdvdmSOkopy75Gd+D6MuxQdWFxxEP3PQ3A++sDrl1Z5LQGIuBiauGq6VEvOUGXalGls6IQJTFZSRHmKg3ScpK27ItkpOW1snQ+5Y7yBbJybdjRLHuqrIpXU/KZT/tBqwQNIRm2B5llo2SZhTGjpAZ/eJNiXDTHRfhZ9IZJEqovzlwSA/KWccN7reMm94TAKp15iPfR7ffFq6nWIaQ02mjGSv1pPHYey3lTPx6PU2aMYSR77dgzyZ7fZoCG7R44dlOc4XXx3bHSbto9UCUHRUKY535HcUflXUjP20doyKYzSVI+SPE4Ilwz2MjI9DGWXb1dDaRoFe0Fpd/z4XkR+s07O9aeetbnnEhN3Wftazxfi7pjUbfMI8RUjwLbjtMQ1sa6ZXH2RqU7bBuuHC5YtmVHyrOm87zpkCURuY9g7M5PWVV/5jTXnqRJ/H7z+wbR0p76IOBk54YeuHQNgIP50UB1PeyEvdmKeRNezqePdtiL0NP+YsnRsqFL+ytUSj0rK6fvXQ7KCytOgkMErOssoOklX7ng5ZGgEy3QECNkANXt8JIX6sPEJIb4cnVYmIDrhx9/P2ewUIw/sJBrKfUxLLMb12slxY02QRFp7CtKWmcfUoAv7zeNJTir0cAsk5fWTl/mMGFrAyah5besL8zleB02knE5BULaxAhSu5tyAm0qSzRezCxTAE7E1gcLXIQ/JNqxMuetFJ+4NuFdSHBitQpMO+9M6DT/9jHHU0oHrnV51ihrCQRtUKclFeguxF0JdzzMDIxUad6joWl65k2XF/6m6rd6Jc2qnpnrs/B2LFMYz9MJZenY9l05T++FvjMY2k3YMk4kPfcJ/gAQka8GPgf4Zcpqo8DHnub6k7yb/njs5BWq+h9HHb/iZgc70UQTTXSvkALd3aFJfDrwoTeT1M/SaW0Sf5/1gItN5+4YVc7zvJ3rG8sa17NbDzdAX8Wgmlndsbuz5LoGb6cU3ARw7fo8GvaiVGY0B02QRvLXNtqCKPiqxGJQKRqlGetJBGBTKwODXFJuKXlnMtcFaa+Jtyh90RT6KkqIyThdM/BCspvXiAeqokG4niy9prQgyUuqnw+1keXlovVUR0J9o5QdPeCDxJluMvVXRUgp754UjJuJrMYw2MeYdakfhhrFNkPy+PhmMohuMziPpd5NMJKtN/5/Uxudd0FbIKSzdnWfs4oqIK3LEI+fF6+kBBcO9tSyO+iJ8SCzDgx+tBkWrGmZSfv1c0X3g7Ygs56q6XOepVndM4ta+aLumFUdCwMhbdMUHErtTueE49UdCzFZWGmbNF+PUoyrytnucX1M3+eMfgG4xC1mrjjJJvFbgd8GPCAiX2yKLlD2cD8XJKL55RzTbt2ufazJ9e6gWeJVWK7Cyrg/X2YMU5KnUVr7pHyMsnRIL8Md6qL7ol/4wUKJ0+wxpDFHTioa5C5Swq5ukRFVR+SF2M+G99Q3w2+on5s6OoSfbMI3XwdmloPBK2PbiJBSyq3UL0IqaIiL0rxkFfQ75HTRCOiFbrA97NjTqOtilO28y1DFmBGM9wyoNnzQY6+ibXRc4NsmCMmeT22PYaRN9TZeO2pnG6xiF6yDxZIbh+Uhe42J+dJzaqXYuFIeMjs/2R1WUa9FmMEIJumd2Cb8Stlq1O/2VIvICHZWzJoS+DarO3ai0DVz4XyyL9Su/D4JThrTYMEVP/Ac8io5QNCry88+nNeNTKMWH/aiqDOXvOkx3dSYzy/9TeBnReQXGNqUP2n7JYVO0iRmwH6sd2DOXwH+0M2Nc6KJJpro3qG7YNOhRN9OiHP7eWCzJH0MnWST+HER+Qngf1HVr7q18T03VLsiJRz1dZYwIEoUohz14XbnVccsqr218xzMlkE3Ag5mS+ZVkKCuHc3xg5Qa5BQdKlFxSAJz64qnk8Z9sZNmXSnHxfAMsmM6A+msQswDgO9heR90SVjvoU9OGzG4KRk2JeZ/yrCVDajqodstcJRWBpryQRspmoSauBCQTvC7UQtw0EUoRFZRcpunsiK5d21Fv6qQKM3t7qyyJ8xals9jgtC2nbNl2z7YTSkebL+DesfBRcdoLls1idHvsR9/LpstOdxvuHp9YcqJeVpiXEQad97EJ/2vQwc6pXgiaUkPU9zRSpmdAhVC3ANQ77c5zujCzhGLui2ahOvN99Pn7yvco88BgsfN1yaymkOvw7xIHjHldp1LKpQ5FavVzlNXnlldIK4LO0c3NaabGfM5psdV9e/d6sUn2iRUtb+ZDSruFHkV3nstrPRXj4J9oY4vtQi88OAK+8263carsKg6FjtdPk7q8sP3Pc1h1wy8UtLv9z11ITCQ6J3ie5P/qXVQGz9TLwO3VqDYMkxuneB9Uo67XXKEdbWE5gqDfSByYr+jYKtIOXnUQbtfcu34mpI6erzXxFoOnuK+OrBrpCoJ8hBFsmdhhas9dfwYnVPaNlzcryp05ZhfDBxsb77KAVRjD6Axzn9aqOdm6DgbgR3DJiZx7HXH2CwGZVKYwwAi8cLubMX1owA5iSitDreBzbnAlvFkEl7q4uKbYc4kzFjvueTdk969vsCORCi12g0v1cH+EZcWQUI5mC2PgZQCUyjzNgyOG9O2vEopoWCBiop7qUcGTMMyDCf9VijKOeXRi09tT/53u6R3Ddz0JhH5m4R0HhZuOhMX2EQ/KyKvA74Xcgr88xUnMdFEE030HJISnA/uAkqZvH+LOaechQusocvAE6NGlXMUJ9H5iiev7QJGCjWSsEMHUmL2qxZdky6SBLTvVlyaHWWPDCfKk8vQx2LesmprfBTFqga6KNn1WiOdQ9MGKtnDh2j9Np0ZNxXXCtJKVpdXl3r6RXgJZ08LO+8Pe1dD0BQS1YeatQoI2kF1CM5oEgN/eL8ZbvJ1yMWToQo7LS4YM5Nx2lkIrfIsdlcZKmq7itVhcARwtafZW3HfXpBKd5rVmvfLJk1iO0y4FAAAIABJREFUnKLBnk90M370m2hN+j/BkH1c3XL++ACxMC5X2jRrzF6z4to8PMgbR7MYrxPevZD+PkJPUVNIEJ5NbZKgvrK/u3nfokNB0n61k4GBv5p33HdfkAEv79zgwiwInTPXrUFKjdEknOhGDeGkuRiUJe3KTEh6pUN4TvEEG2gVyXBtNAtLXoWnV2GHpOvtLHs1ngXdLTYJVf1dt3P9qWYsxUucZ/LGH9CJ4pzNizOGEDyDr9M6idhFCFl7sY/iS9b7sGwMIJPonKJe8EemXTUwjQ/qfk7H5UxeoUOH+BBpC1Dff8RsFmCwG+/Zp75e0URvp+aa0sfd5lIa52w/0GFQHGSEIdgWxMBWJjoapyE3U2YS5t69II3Hpe0mK5/dVauI/R5FD7FuWTHfK3j2hcVRxrOHi816EFr+PXhWx9OmqNcM6YwFgFPaFcq57Z4629rathgWT5wCX+YP0MGCjgf3rwLwTL3D09d38n4LvZeME/QweGelKq7DVR3yjdlU2pYRqIJPSSprU88p9993jQd2Q0DqfrNiEbcv3AQpWSax7Z6rMdM9xmbqo6Gl1zI3KcVUgKKK766dw7R/9MB+YZ79k8td3nslwNDLtjZp/8+G9C5gErdLp9KVRORhEXmtiLxfRB4Tke8TkYef7cFNNNFEE51nSvaRk/7uZjqt7vVq4DWUzX/+WDz3u5+NQd0SSdk4van7Nc+VJw73uNoGg/aDO9cGQT1H/Sx7Pu03q5JT5hgbqfeCqgwCdfLG7TstK1H8MonrKeCCkNdJKblvjETeVRqM3tGIvrNouX8/SHZPVJ5r3UWqVeDr1VHZeS4Fv9nxNodFe7ApOnKgXTL0zbQEwUHwld8kOsQNj+zG9UnKTZvHpLnYPWizh9hO0w5SMQRNYpT5cyNUMYZ31qXQIj3262ka1nzsb87gvW7AXu+/2qIFrY1z5LWTqPNVloiJyu1+9FSoxXPY1iXvUVPe1yWEjbUiiStpMpDh3FVms6SkYfg6ZTUu8/KCi1d4YOc6u3Xof+66tXseQ0xpDtwx8QcVw2e9DZ7p0aEBWlzWKpwKHkdvHUhSm/HXULMI5661cx67dkDXp9xrwpnare8ew/Vt0WmZxAOq+mpz/G0i8kXPxoBulQTNwUlJBbSq4GFb00Ys9l3dJR46eAYIeOu1dsaNNmBFy67m4jy4yTlRajw+gvZHfT3cSF0DLhkGUKCTxKSO0jhWVXaPTXYSSQnR5t0AKuhbl3NHVVWJXn3w4CpHDzVc8WETib13S/Fu0ugSmwLfemh3yHqit26uMVgub0W538M8LhqdCQ5MDVsyTLGp+5yvZ9507DWr7A0zc/3A/XgcYGUXn5MW2puBm7YtxqeldXhE1xha6G+d6Ywx+X7EpEqbrozT9YXROXDq8/F+s+LizlHG0Ouqz++e947euGWnbUHTGG0gYmPcP73KAIoC8jdzcX7EfbMbzHNWSDMPye6QbUeGSXAc3LSJsQ6P0z05+uDFlF1avfH1BWutsHaLPjGejLVCFe0STx3tRCYZXva66s8YHpIzTz3+bJKIfAjBiP3f4653p6LT3uHjIvLHRKSKf3+MYMieaKKJJvpVS6pyqr87QSLyL83vTwb+HSFp6w+IyOectp3TahJ/Avh/gL9DADV+Mp47NyQGbuq9g5G0571Le93QOM97YkzF5cWNgWS47GsePwzSeuU8DmXZF2P1soseJhnLSf8JPkoVvcDzDq5zuAiq+5NP7OfcTUSpL+/VbAV3CRlo59FYXTlPG4OpdpqWRy4/xXviPV5t9lm8P3o+XRkZqaMRu5/He29GNuiZFs0ipRABxEnYCW/DO53ScSdq6j5n1d1rVuzWbQ6wcuIHaaBr12cptDbeJ0UatQbr4zUHn42XRepOwSf9FizBPt9N8MA2f/4xrHIz2okzdZPk2yPZrx+GHjv4iG+bsTywc50rqxjzY1LO9F5ou2qw+NjUJlXl88Y+F+ZHub+2r2iqITSXJOELzREXmqP8fDoTJJM0B6s1WC1hkHn1hOfXj7HMQX1HCgapJEBQ4axE+GkYGwGAuvBs4v13vsrvUMpIa7WpM9yY7m7I3fTB5veXAh+rqm8XkfuBHwW+7TSNnNa76Z3AqfJ83CkS8zJoWzw7EvXeZbWp9S572zx5tEtTrbvNhR8OTCQ3zlM540XhiwuhUKJe+95xcXbEffMAv1w7nNOtRlOdFi2TQNBVymLWsjcPzMWJ5iyTq75it275Nfc/DsAHdo9434WwJd3q8RnNNQM/eeh2oL0YYaS5R46SLUNCjqd0T73BaUVDCnRLlpmJ5ujVRR0gJgi5sXbr1VqAFRTIJkNx0g8W5SHcdAKDMLm0HX4AO8B2iGmYE8jcmmEAY3IjGKXCD67ttyjhJVAueeuIGTOjxHXFY6dx/WD8Xh37dUk2aRfiBEF5k2bcGbjpwvyIB2Kyy1nVlTGpo3ZDJnEUDVuXmkN23Cov8q0fPrPx4j+ADE8ZWR2YZLnOq8te6n3c6CTBUb0WhoGE39leYeY+M4wM2/Vc7wJjTcJdEh7P2iYR9rA5w/bOnuzoalV9O4CqPi5yChw3XXiaSiLyAPAngUftNap6rrSJiSaaaKLnks6559LLROQKgTXOReQFqvo+ETG7kZxMp4WbfgB4A/AjDPYyuz0SkUeAfwq8gCBuvUpVv1FE/iqBKX0gVv0KVf2h49sKMBKA1j29kfJVh5CCxQm35QKCooqnOi/YvZbbeduTzwOaEgphpDMlGLkf3gvG8Zc88IEMYa36ilVbZ48LS03dsztr2W2KJpHgJq8hcCelPP/gC09ln/b33H+Bp5/Zo7sWpELpBHY7di8EA/ys6bl2PUhX3VOL4F3Vpog9VzLbxlQiyZdcnGaNwzUhm2bKfbM/W3KhCZLuomrZqdqBz/wYQkrP5jij5yaoYg2e2ELeSInbpPxNVDGWkDdDJyd5L/XGcOpV1qCSRL3qIHDMeuzYVBQJhkm7BO7VS+6bhbLr7QxVSElmRCipuqueg9mS583Du9GIH8Bw9rm06jJECLBw5RnOXZvrOvHHagtj7WBMqX83qlNJX8oifJgN2dLntCVOdWDUdvQ4yhzGVgG41i14/Ggv9iMBfotjb7079jneLCnnO05CVbcxgl3g80/bzmmZxK6qfulpG70J6oAvUdWfEZEDQo6RH45lf0dVv/70TWnO1QTQissPsPNutL+AibgmMINcvsHQlGCUS7MbPLwI257e6Boeu3bA4TIszHErhjiSoOo28QN88f7jvPTie3N7v3LjMm976v44ltJPU/XsNqvBh2uxaI9kV91F1XFhFhfs+5bcOHgm49ervh7kPmqMt9FVgfawRhOT6qRASk6DB1M+Ju/90Mw77ts75PIiRPPtN0v2orvkzHVbYaRNeHZj7BKVcYk9zkPoOLKLy63QJua0bUybxubV5Xvq1eFFcCkojMIwYMg0xgwDGNhXKpS9CDnZ+f3QC4/z1qceHEixlYli361b9uvkSjuU6SrDpL0KfXOYz68zhltI+S0jmwduI3NI92jLKunzvFsoyqHDOVUpnk/RC6rzofbjR/usfFkbg3eTsU2euXfT7bd3jLD8cuBbgQVhrfzTqvrT8ZovBz6XILT/WVV9/Wn7U9WngZ86bf3Tflk/KCK/97SNnpZU9b0pyZSqXgXeAjx01v1MNNFEEz0bdEbeTUlY/nWE/EpfKCIfAXwd8FWq+nLgK+MxsewzgJcCnwh8syQ/31OSiLzqtHVPq0n8OeArRGRJSKkigKrqhZsZ2HEkIo8SfHj/M/AK4M+IyGcBbyRM4FMbrnkl8EqA+fMPsuSuGjh8SaERHlKd8g6ZjWDCPrhuZOSWWBYlcauhRA3uod1nuLJc0EZvp64ftnFjNeN6FwIXDuqSntir8MjOUxxECXG8U9dTq11uxOtCEFrM3aMup0CHoMkkrWJW9SyqLu+q51W41s5zuVfJMQ1tzA3koybRrxwuwU1OB2kLqqaniUFaF3ePeOH+lTxvF5vD7FMfAq90DbqBqMWMvF+S1D2GMY7zbDoOxkgbNx+3Kb2VUE/THxxvkG1M/350D4NNcTZJwJok9M3pKADqGJeQDOiN9Pn9fnjxNO9s7qOpwru36uoSv+J6Dpoj5tLmYzv/TdT6Ns3FQtqBltfI6ZDlMS6fYKGgRRTNospaUoKNNkBPG6AoIJzPz2vdqH0YI0o7dfkdTQGdCTZWJ8gZahLjmJNbb0ffC7w3/r4qIklYVvImBlwE3hN/fzLwXaq6BN4uIm8DfhM3oR0A/+C0FU/r3XRwXLmIvFRV33zaTjdcvw98H/BFqnpFRL4F+GrCJH018LfZ4HKrqq8CXgVw8OEv0ALNdLR9Vbw6vKOqfPYAaX1FMa24yBSSjWLYR2Ny519rFzw4D7l1LjfX2W1W2WawNC6JKRI7JRabufKB19JzqTnkRRG2GqcxvlAf8XQbrjvsZ4PgpkVVZ1V65eucgXLVV6yomFXDRTLNh1fJdg4IQXrL6G3VVdUgEMu6i85nLQeLwHge3L2GQ7k4C/DEhfooLyKbGEGePwMhQHEtTWWbGEuiHpfLeykJ3XLb4wtOY5OwUNeob3tdhR/0v4lytC86wN29ucdNDGMQ9GdsF6FOWkD9GjQ3j+5ru27Fb7j8Lv7b00Hp7r0zabw9B/VRfm8a8/5UKHPXsogMZDxPMykMxOE3en3B0IvM4wYW0N4s5hWeXl3xWDI2hTA3MmQcEXIKxzZALmVAsMcFbupouNqGfThq8XSxbNM2qme9J/VNwFf3i8gbzfGr4vo1oJGw/EXA60Xk6wk3/NtitYeA/2Quezc3icCo6ptOW/esZuw7bvVCEWkIDOKfp9TjqvqYqvaq6oF/SOCSE0000UTnilRP90fY+Oejzd8mBjEQloEvAP68qj4C/HngH6eqm4ZyM+N+NuCmE/u8pYtEhHDjb1HVbzDnXxhVMIA/QNjI+4QBGLgoqazG6DtvuoGEW2WtIqm3RprOWoUyr7uBJLKMSZAemj/Fw3tPZ2ledR41FADN3jwQfNGTxNE74el2hxdE2Md6lCQDaJJeb1RD9d/jsu93qy4HPLW+GkhIO1XLsq+5Fv3FvQpdgjW8o6l6VnVo58aqyONho3iftYdH9p/OsNhOtcptQ5BmK6MRHKctWKrw+TrHMChrbHxujCNdE9M2bHrTjrvuZmh8nWMzhAYFSgFixEbSdKIkPZaCAdQNvHaADEWVzYiGwYZFWytSfoXn0cXjPLkXvHje7i/n92vm+ghNRU1C+oExes8tB88kwacOpZEufweNWA3Ej7Qsl48rhvEdSPGt7AcQEWvLWAiYKxpBJaYfe+1aO0PoqfclZbcTzf3kvGBSjqszTKNhA2hvlzYJy8BnE6B+CHv5/KP4+93AI+byhylQlG1z22ZxApzaxnxWTOJW/cpeAXwm8PMi8l/jua+A/5+9dw+3JKvqBH9rxznnnjw3b2ZWZVYV1IOmCgsc8ImATtPqqDij8ym0ji+cZnzQomMp2r6mAUfR7prpbpVutH102ein3SDSAyrT4gN6fDTdIlKAIpS28rSgoJ6ZeevePOdExF7zx36tvWNHnDj3npuVN431fZn3RMSOvXe89lrrt154vrXsM4APoYe7FpFIxgbGuKh9oEupC1NZS6SrdoxgudgyaYktZk8iR824qH2hd8AGt1lGUHKBm6fn8fDCubaOoCuHvRpPq5y73dimWXbQgfEoCZDKmGt/rC4VZjbhm19M7RMrucDc4rALbWwVp6ztY0w1FnqED+yf8/N2QVPm9yhAIEyY2Gs/MSqhiHHLtoHCzowveWx7ViwjZiA9eqQnjBtjYhcZxwjcQi4XIn/dcMfiRToXHJcG0OXP28yH28ZsNMhDKQAAajIMLWAkLRZpILEFRDm/A77v7ptnElT7hXuqSszUEk+efQIAsFdNvNvnvB7hUj3BufGj/rzUS8nBTalNRnNY/CcN5h6YQUEpU5Th/qJPQpQKQFHdjCtwly+9ldJzHdNNGQUMS610gYm1P2hQ5N0kx1PEmBbN3FSHoU041LYJyzAL/+cD+H2YWj5/Zfe/EcBriOgVAG4EcDuAt2e6fgDAhxGLVmy3r+87v81V4DgAMfNbkddCOmMiBhpooIEec9qQ4RrtwvK3AHglEY0AzGGddJj5vUT0OgDvg/GMuoOZcxLNBwB8kc2YERER/U3fyW2KSTSLR19mSj2WyGbDBABdUmSQLZTGljDqLquR1zJk+u+xMl5DTkqRUt9MLbGj5rhualJj7Fdjb8QulMZWUUWG41A5S+NxWxewo0KmWSfpjVFHLPPMdN9rC86IWgsJzkmZU1Xg3Gi3YXh113vf4rQ3bM5pjJHSmKuQsuD6E0bqdBlbH79lggDHVGOa0XgAQKaklhCSu09O6i0y0qvsp7Zyd0paGDxjcobNjLcTh3u8aVrwWMA9eQMtAK9VaJ+KI2gVziNKekNJLSgNelOJJuG0sy0q7fM1Y9x04oLXTh4tJ7h/sYOzE/NMZ2rhtdE5j6HA/pmm971QOtLCHBTl3r3IkC0kfgWZRyvWKhQl6VPacjexfRd8vFIz7YojRfE8TxRLTGwKZM2EyqbOqbSKvJ1GpD0qsDHagCrRISwDwGe1nHMngDtXdP2vAFwDoMEkYN1p+1DftBzPBvBuZt6zGWCfDuCVzPxhO+HP6ezgMhABURCaAmOpLZyhFWqtAm5b1CIZHaMald62UOrCeyJNihqTosJ24SKgdeSyesP4Ap40ux+AdV216cbdua5PReyK1uFEUeJkETyDjOoeewa5j7cQmHTJBRTYf7glCoyta/S50S7GGVX+hrFZ7C9WUw8UX1JmJrvWXrHUI5yb+LLl2B4tsFME2Mot9i5/T4CN6oQxhN+Tho1C/BZuneaYtCWJRTIXfS1z9mQYS3EAP4y+0dlj1PGYCfauhL1AevQYTDx48yioVpfdMWQQXxyEKJ/FxP7+O5MH/TEXNHff/DT2qwkeWp4EYN4N914s9Bg7o0vi/YqfkWHu4b1079qSR9jXWxhTyCWVhYcAv9ibPkxSRHnfWpkG6ehc19a3EXaeGsErSoPsu2jeo+3R0t/XJRVRfohJCwR8GLrCI65/uuPYT/Xtp+9X9bMA9ono0wH8AAzO9ct9BxlooIEGuhppDe+mY0t94aaKmdnmJH8lM7+KiL7hKCe2LpEwSo2UNmqn8HJSxCJWQfu2U5sl81EbwMZliJBUMN4RqWcPYCT7kke4YXQRAHBytMCkMPENy3qEZV34MRQxTtv0B0/YejiSwlMPH2loHFMFW8Yac55EkvZUlThdmBQZE6pRQzUMvVt2vrdMH8aDpQl1GSujqbhr0qz875PFArNi4aGh3DyXbF6ZHTXP5D0KUnBbdtdUQ5BQTZqAFogN1YUQC3NG7chTqq/80/cDTofjvHRcIIYlU2htjDrMrSNmw2mYEraTmgQAjGGe0+1bH8eNYxNr+t+Kx+NCdcJrAR9ZnMXpkXn3pJaQjplK2LWM74DCTnEpuX53X8x75/sixPeU4ucgNQsNFZ6Z1xbEeakR27+LcQAjFLBduEBShXpkAxL1CBNVRJ5PafDqYYgZ4GNUdOig1JdJ7NpcIS8A8Lk2BLwRy/RYkslZE16U/WriISU9Kn2blHbGc9SCoVQCllI2/5ELTNop5v7je7Se4ryaYVuZMR8/veBdTh+enzCeFNZr6OYTj+CmLeMxtKVKTKjyH2ATXqoiiMHh0NDAHBMAYaFw2HJtYYyxXci0h4RM2xtGF3DdyAQBfnhxDmNV+TYlF9i3eO5YVZippWcS6dxKLvz1ynm64zkYA2gugA3q0Ni9B1QCzaQMpYFf84oxe4wNiIjg9BqofbyUaTgak6kul/OaCsw4D9tJxqugo3cIAK4vzPPdni1wvt7Gw5X1duKxf2cvVCdwutjHGd73Y/aBX6ZkhIgc41XQnlG4eTZ8aSQlNgt/n1IPJkYMaVGSINC5WNt9Jy2TUMQ+0npRj7DQI5Ti3WkLEDwoHXctoQ/1ZYNfC1Na95uZ+eMw0X0/dmSzGmiggQY6DsQ9/z2GRET/qc++NuqbluPjRPR6GH9cAHgQwK/1HeRyEIEjOMgYmY2cMS2qhpeD0zq2i4VNRxHSPjiD86SocaJYenX93GgX+9poCw+WJ3F/eQrXjw3cdO1oD2eFAXhWLPGEEw8DAB4/OR+p+tKjRaY/cNK5Oz6hquGxNGczvtMiTJ/c8GOXtK0Wvp9ZEbxdPFlx7EJ9AlMqfd/Sg8ZBHM7bakJ1Q3PoTmGR/1JczMEqigKtctQlsQqqmSJpshEMJttCZWMbzHndmkWR0RaA9nxIIZYhNiZL7UHeZwWOYhncs9ihOcZF7aX/Pb2FUkCED9fbXrPYKeZ43KiZHsZR6ggh41p8Og1WXpvwlMZKSEoM266th54SQ7b5HeJQTFsRp2EbXTMO3964tml0sGXWAZExe9NZYK9kwzURTWHSgp8jomsQnsYpmPiKXtTXu+lbYHx0rwXwJBhN4ucAfNEacz5SUsRe5TT5ZES+Fpcj39ksqPaplE8Wc6TkoKcTtk6Ca3Om2Pcf+W49xaP1FvYLA9VsqRI3Tw0ufMPWRcyKBa4tzIsr1XoH4ciAMgkppF5DDpqoSaHkkf9wNSsoCozC3IP2++Puh7sGt6hsqwV29QnbJ2FMVYR9S0ZQQHvdc8kFti0M5xYtP1biothF63mbxAtzxEBTb6ikWy0WpoZnVIahRDg70FjszP3PRxNHpVUTSt1zU8jOt+tgwKkdS16PebvIw4Jniv3IS8k9ayB4zLlx5DOT9Rsa9hLhiu3Oi+0MGVdZCKabs1k0vKRaXIxhIrX9e0M1ZlhETMu96+5bGXt35OCxtTG6suGmb4XJ/3QjgLsR7u5FAK2eTyn1tUncAZM/6Y8BgJn/ioh6R+wNNNBAA111tLlguiMhZn4lTDDed67j8ppSXyaxYOYlkctpRCNcYTy0gPawUM0KCwqXdonGmKjKaxqzYulTX+yoOeY8DvmetkLB+y1ryJXG2qmocX2pnuCR0hgIb50+gGttNbCC2MMyZjuW+oqoCE8ILiuIg8SOWGI8Q/vY11tegjJ1pPMwTRd8c91oF2OqPAShoHHGekk5zyppuE77clqGhGhSybYAxykU1qBYYowlyDRjbgR/JF5EaxnPxZssNQ4zH2GQlZRmC6Y43UPbs5F9S+pj9JdSf5rGPKr7HHlXMcYWeprREqfUHHtstN/z9XZjzvJ+u9+5+5me52mFodrss3Nm8dwo5IIy1xCM2jIOxVwrxXm9xL0vxZI2phqnR5ci7WHTcRK4gpmEI2b+KSL6FABPhSlg5Pb3CmPoyyT+gIheCuAEEX0xgG8H8P+uO9mjpII0zlkPHsB4dTivJOPhUGBmXT1PF5e8+ygAQAPaQkoy4d6UKmzZPDm58RZ6hIuVUd936xO+LsPD9RSP1lPPiG4YXWjAS5IxpJBObjGY89jPDzBQkGQmfe6PaWtU822HWfMEE+sxtaQiip5OYaQSeVU9XbTM9SSujxk3okKk2E7nuQ4170OzD5VAEBH19MZpCwJsjhXDPxKKSY/7/lbYdRouqrZyneu36z76xdaWWXUL7Ko07U5Y2NVTlFxE8FMuEaAbN2bs0oOJm+6ysp2E6KK6G3EAXgHJVON5aK1C7jMXaOcFsiOQa68oUTlPRPTDAP4HGCbxJgBfCuCt6Bnr1te76R/DJIt6DwzO9SYAP7jmXAcaaKCBri46Bt5NAL4Kxn78cWb+JgCfDmCr78l9vZs0Ef17AH/IzH95oGkeMY2o9ukkAGDGCw8T7ektXKhmIWcNaf/bSSBOyii58JLHTjHHjroUpcZwMNIj1g/9URtj8KH5WZwoTBGphR6hIPaeTzIQKhdo5lNuo27ANk5imtr9O8rWJE6M4TnKSrup5xMtcVEbDdQZqnNwl5NAnSQuIbPcOKk03SZ5R2k5ctpGm2aRMQwHaVyki2/AN7kssdJ4HCAs074d0kuhsbZ2ud9d7SR1aYnufnU5CTjtATBalHymU1Vi1z77qSqxTUuMrfZwiuYN7XVPB8869x0oC0XlPJ882UtwRm0J4cXaSdg276GAvpL7IOFa6WABFXJOudNDcGiFjcZJMI4F3ATgkl3DKyI6BeB+ALf1Pbmvd9NzYeIiJgButWm8f5SZn3uQGR8FKbBnCjWbugNTiMhh8UJKN8QJ1dgpLmGsbXlPHoWPyLqDOvW85AIPViZyeb8em0hln1gs1HcYU41ZscS1I2ujQBNeykE6edgG/tgt44f8hzrncewG2xP+WPLYfozkr0nCIGmgnyQzP0M1Kh99PaWqMVdH0vMlRzGMsJrZ1J5J6QYjkOcXLa6m6TED2wTy0d8ralJokT9oHZw7C3cJ6tNXjilEKbHBDU8lINTA8JXpSOE8zwCY934PwZtOQ+G8NseWXGBKJU5ZAWVKla8UeL6e4ax9z4Ems4uYBsfeT6kHmXSJNduB8TSSESbfkws63VYLwcA4ek7TNEnlBuiYBNO9g4jOwBRwuxvAo8inFs9SX5vED8N4N/0+ADDzu22ZvYEGGmigv72kr3xNgpm/3f78OSL6bQCnmPnP+p6/Tu6mC5QWgL6CiBCgoxnVRlW2XN6lvG6DIKZU+ip2NaR0rmNDrvBaKmDiMlwA37WjPcycJgOFbbXw6cBzFb9ykI6vINYi7ZjsokEqc9eTFohxlJXuOfaPl1JauM68YTU1NDstYM4jzGjZel4XHNKlZTTmwiI1A1SkETQkTQGTdZFCos20pO5uzKuz15ii926DNZZXaSUpFdDRu3KmuOS3l1xAg/BwbbLHnq9nIhW90SLcO7PkwkNRBTEeqE7hOpvDzI0jf8uYijiepGnMd7E+bTm7/LninZUwrQwGLetR1ulkk3QUtvCjJGb+0Lrn9GUSf05qb1XlAAAgAElEQVREXw+gIKLbAbwYwH9dd7CjJEUaO2QW5QnVmHDt1eUxKgCTRoIzwLzwRUvgkGsvq6o5u8f+aILTo2CvuGF8IYK7pFumtEm4MdpghS4GYc41502pFHBH90KroaKP86F6J7JttHkzAcGrygT6LTEWDG0JFxm+XtK0tpKlqzybUobRyxazos9uOExi4ocXkFbBRL37SfxNUgilrU8vGIh5yPdyzmE5uCCYxLZ6xLuKA4aBOBfqmgklFx4GlczE26867BVdNp8ukkKWfP9qVj6Plau05yv6URkxn0PTlWGUPnLqe8e+E8DTYPI3vQbABZhIvoEGGmigv6VExnDd598xppWahM34+iPM/P0AXnb0Uzo4OT9+zaY29NJV1uIpxlR7r4exMCQbQ/XSS0a7OhiEC1pgKQzZNSufknmnuBRJ3WeKvWDgpsL3BzSLyktaNy4gpNOoOqEU2e9cj1EiFEQaUxV819EMmPPniSDDGgozCqq7gvYeVzLoKR17FdxzkLgId16Xsd6387Da4T7UXExHF/VJSyIl/j6pzVv7TKbV9jw1yGjOFFK7SA+pGiqah4s3mKkFplR5TeKB6pT/RqZU4kyxj/P1zPfpaKe4lGS8jQ3962pRaeoXc61NiNb9vm500Th4uOBQZFKyHJaOiSZBRH8PwO3M/ItEdB2Ak8z8wT7nrmQSzFwTUbaE3pVGctHY15OQd9+6yG2JRW1uX+a5HqMotLc1aJB/4fe1gagcNFNDhY9DldjTWxEDiD1M2tXqbITymtTP/TJ4Ke3WxtXRpB+vG7YRNy8guBCWPPLuis6+EnvNxL/dNa9aINtsQ0dBuYW9b16pA4+Z9N+1GNYJg20LuOuCSXQCmbVFSBfQZi4uTXwyr5oV9rVNG081zhbGa+ls8Sh29RQfLa/x/Tv725RKzygAYFef8O/Wnt6K4KcUyjxo9HNcN8R5btnSwYKZF2DPIBxtFG4CjgWTsMF0zwDwFAC/CJPS89/D1NZeSX1tEu8iojcC+A8AfLpFZn7DWrMdaKCBBrpaiLER7yYiugUm+vlxMOrWXcz8SiL6VZiFHQDOADjPzJ9hz3kJgBfCFGh9MTP/TscQXwHgMwG8EwCY+WNEtNN3fn2ZxLUAHgLwhWIfAzgyJkFEXwLglTCOJP+Wmf/ZQfuaJEE0BWqvOUxVmfhyB0ljtzYVvuaFaTtTC2jrH576XDvYyvSvIwigqwJYVw4e074NOmhK7m2S+TYtUSojae3prSSYL1bhC3BkwMwZ+9eZZ442pUFIiVFud56T0cD6ahZt46wySHdBSakG4TQ3Jxm3noc0X1XcPs7lZNuRa5uf+5zH2K1NmpnTxb7XFsyxEU6J1DVu7DNqHwVplHq1v1f63A+q0XUHDwq6DJrqhrybKgDfy8zvtIv33UT0Zmb+Wj8O0U/A2IJBRE8F8HUwduIbAbyFiJ7MzG0eJEtbWZTt+dst7bLUN+L6m9bp9LBk7SA/DeCLAdwL4E+I6I3M/L6u87oWjTFVEV4qayaYQV27GtpKB5oINchHpV6oZ0HNViW2qMQZFdKTS6y1M7q2A0+XOXlcv23UmQso6X/qEvMphZpDXp7IrRbwyd8AYEYLb+eReYJy8+xyde08tiLiuou6YLr0mAzCy83Pt0vmmb5T0bEO5iAZQ9ei1mQOCVTVcq4BUJvX4phHHbmhkh8rTpwXM7IL9czbIYzb69yez5jzBDOyCTIJ2Ld1TSZU4yG93UgW6I4Z76KycQxYz3bVB7IL12thZQubBnfvI6ANMAlmvg/Affb3LhHdA1OO4X0AQCb24GsQhPTnAXgtMy8AfJCI/homju2PWoZ4HRH9GwBnbNmHb4YJrOtFfSOufzKz+wKAdzDzb/QdbA16FoC/ZuYP2PFfC3NjOpnEQAMNNNBxJhuk/JmwZRksfS6ATzDzX9ntmwC8TRy/1+7LEjP/uE3MehEGvvohZn5z3zn1hZumAD4ZxiYBAP8LgPcCeCERfQEzb9od9iYAfyO27wXw2WkjInoRTDEkXH/jyBtc0zwvXjW3wkiBUNkKSFIWo5lqORjHCBesUbvGPHIgPqP2vTdVSjlIp4u6pNccOQlRwk5SKpcGvBqEOULdY5OyRF5vuA8Tqn0lr7H1bnFtZQDTmDRKVln4pjPFdAZ666tN5O5NX82iM0guuYbOPlsk4VVahI6O52Epp0HUmbYOLmx730zN6eC9FrQ/HcUEpR54D1Q7uMEGxW0LqMk5fvjqhOK8i3qK3fpEqwdfajhuo3UKVZlrSTS+zP0PaT2OjtaAm84R0TvE9l3MfFfUF9FJAK8H8N3MfFEcej6AX5FNM/1nZ2JRmd9h5ucA6M0YJPVlEp8E4AuZubID/yyA34WBg95zkIFXUK+bYG/yXQBw+6fOOLw43QE6JY883OTyPOVoX2+h5MJXpivAeNiq1Vs2gju8iHHunGjcA3oypZBO7/M6bBQFGGPUHkaaIs67lM79jPXscv06j5hri33PQApolAgL05zHfpEpebSevaJjMV/XDbXPGLlxHKV5o/rOoxFlLMdKy6AmeYx8gjtqr27XVm41d7xGEWxQ7PJfOSZR+PlMiyU0y8Cz4O78QH3S50ZKyeUQyz3jCVVRdL+53m4Ytg+j6GIQOsNoHW3c/RVYJwbiQWZ+RttBIhrDMIhXS4cgW7vnKwFID9N7Adwitm8G8LHs9Ix36j4RnWbmC30nK6kvk7gJwDas4cT+vtFOYNF+2oGp900YaKCBBnpMiNEmj65F1ubwKgD3MPMrksPPAfAXzHyv2PdGAK8holfAGK5vR3fCvjmA9xDRmxF7p764z/z6Mol/AeDdRPT7MHL35wH4v6yV/C09+1iH/gTA7UR0K4CPwljyv77vyannh9vnSNYZHlMd6Shznog4ASNpLUSVuZBivLZBRiLX0xrQykHowJqFOG9MFWqQ1wLmPPLawpILnFJzD2NMqPYG74f0DNoWcXEkf8tqdFOEFNQP1TsYU+UziM5oGSS/FdBbX81hVTEZvULayzk6tKW7Bpqpz2uRaRSskFbNi8YS+YvinFFxQZ60HrTxwBNjHiKK1xvJ7VwB897L70JK/wqMs8Wef6bmuS/9vFzRqnDMjaOs8TqMt05q+F5aRUZbaHP2kB6Bm6INeTc9G8ALYBbyd9t9L2XmN8GsfRJqAjO/l4heB2OjrQDc0eHZBAC/af8diPp6N72KiN4EY1AmmAtwkv33H3TwjvEqIvoOAL8D4wL7C8z83s5z0A2zbKuFd+8D4IPpZLptR+78LVVGBe+jaFI1x6linvd6OcRivmpfamtwlPsAcjaKAmwXX24eIxfNbRaAsbiP27TEHiYielVHi+uYakxdAjgqsF+7oCyzgDjvl7mahLxRDUbevLac3WJdUsQRo5BMRe7v7FtAIelCFAVwNZL4abTZKBr9tNRa2BTl+pPzmamltzuYeiUu9xjhvD4hoqcV4AJVEec3SxdtE+EdkvHJ+hZTKlurHfalVRBVg5nSZu/phryb3ooW0JuZv7Fl/50A7uzZ/y8deHLo791EMJWNbmPmHyWiJxDRs5i5d07ydcly0TcdVf8DDTTQQIem4xFx/UHkbbq39Tm/L9z0MzDo2xcC+FEAuzBGlmf2PP+ykJfKGA2+XLPCmcLAcQ/VO0HC0M5zZ2LbBUhlR81RQ8BNFFJ7lFxgSssW9XVFWooWTSOFPbrglvT8rrrJafspBUOjFgZnJ0UGL7FwHWOqcZ3ai+YovVzMeWGuLo0HYLQIp1EsucADlangt1NcwlnlIVIPTxyW4iAzZwhuybrbsl8zNTSQvsF3RaR1BODaBW2m2gTQjIfpDsCL34muWBrj9ZY4AJCLedEBbhKQauN6VniSSbhNQlieksp4TnuYoI6KHB3EKSENRjT72gMZ6w0u6sTHJlW4NJhPAXw1TIB0L+rLJD6bmZ9ORO8CAGZ+hIgmq066nMSg8HKQivhmQbFav60WuGhzGc15jDmPsx9raq8AgktfQbpRQ6ENjpDU50OIXVLDotwFh0i4qZmOuXmeW4xr4TrbGTgGc0/3XYBS8nWkcI77+At1CTNaYpfN/T5fb/tFfE9vRUwiZRA5WKhvMfuuRbbNXpAbWwnPoBhSCm27bBSRO3Aa+byGy2cOfuqTh0hWWgRipqGEK/i+nuBCNfM5mOY8juwLkuT7bd45MQ/SKDllOOF+L4VH4Hk9wxm1b49R5Akl59wVoNhgrkzIuRK78zddme6YFB16KNn1r4jorQB+qM/5fZlEaf1tXVj3ddiIXX+ggQYa6PjScdAkiOjpYlPBaBYbz930kwB+DcD1RHQngK8C8IN9B7kcpEE+OKjkUCAdsCmRmXCRjeF6Wy28xPQxm9lS1iv2kgsr4+EUpfcwfW6Joj+OpPTYpk0c1MtpE95Rrf0m2pCrzpbCNm2StwlUVNi2Wtaci6jt2eISTvHCt3VGbM0KD+ntSJtwlGoMfTSItCKam3dX+1UFfOTx1mJGjanFkrU0ZEcpW6hd+1xluNYZqTo+LiRceZzyFQudxvGx8gwAm911FJw6zHthAyttUpBwtfl33cURRfeQtP9Ol+LbcqnK22qLp1pELrWIa5dqD2ncyEbpGDAJAD8hflcAPgiT5qMX9fVuejUR3Q1jvCYAf5+Z71lnlkdNzKGKmoJGIV4WF5jkvJTGqP1L51J+e/U1wTM1x4uEYxLeCyTj0udw577udgdJX9wFaaWUQlWNBVgcG5PGRHyoAYIy1zJx0b4oGovynqhiJ8cqWWFq79ctowve5dbYNQI00ccrrGvxb1tUnX1hVbt1KPVoavNaSpkwEsx+3SSDbZTaAeII5DCW5sJDTFLI2SkuYc4j3L809qLrRru4lk2q8AnVKEE+F1JB7XUZapG9oJmEUEXzmshof9Lxt5exbUiIKbU75CLUzTm0kqEemI6PTeKFLsWRIxte0Is6mQQRSePG/RD+ukR0LTM/3HeggQYaaKCrjo4Hk/h/ADw9s69XnaBVmsTdCL5CTwDwiP19BsBHAPTmRkdP5L1ygAKKQ13pwkoSe7XJXKlZibQcRtpxEq2s1gXfm3kTtlSAmMZURdCMpHWllU0F+ETeXYLSOIlUso7aohlTIUlqFg1jbQbuAYzW4QL00riEbQoVBKOcU9zUeNL++2gEbrw2w3dqcI+Nnv2NkpvSCBw1JOKOGIcoLTm3w4JeyheBfz4miEqcLi7hw/VZAMAnytO4bmRqRU/p0QiGldXtch540uAtzzNzDRr2JMr3FGJ3cveiDWJyWkSdOebGi9N2bNjQfAUzCSL6ZJh04qeJ6CvFoVMwXk69qJNJMPOtdrCfA/BGG7sAIvpSmHDxK4YYwFK4ZPoqXAAUmyfpIkYL0nioPAnAeHXMVMhTY6KRA0xVgD1MNaE4z1GrF9GG8uYflNIU4tH49ppyC6BbJFO4CAgL5phaGBqHY8ZTJVb/JVwlXWfrZIHrilqP7QNxu5TxtS3wsl0XE0iP9ekbaEKNXZBgF6NbN5hOlpntvC4U0TPx34g970RhhKcPXzrrvwu1pbGtFh5uktXt0MEcfQVGe2zJyjAYO+YpNffegkZQiO0FsmqfhJhS7yVpd8hBS9LGuGm6wuGmpwD4Mhih/svF/l0A39K3k76G62cy87e5DWb+LSL6J30HGWiggQa6KukKZhK2jMNvENF/z8xttSZWUl8m8SAR/SBMXVQG8A9gKtVdUSQlqBJjFBxLxE5D2NNbeLA0HmBjFWe3LMARhKRIe/V5THUkqaRF1mUfbWmcjyJ/TBtlpVg2hsy+mWk7pebI2wdee1ii8MbvMVV+P2A0h76p0LtgsRwsFDsdtI/RpWUcZC4HpXUN6G35miTEpFukbUeKtA8oi6vnGSeOa0bG6+8j+9fibaUJyL2wcwJPnn4cZwsDP8n08k4rjDRGIcEXYhydaKkuj5g7JimFqGT8g04gNWmcTg3ebSncN0LHx3D9LiK6AwZ68jATM39zn5P7MonnA/hhGDdYBvCHdt8VQ4z4JQIQ5YXRWvmqWwV0lLNJM/nFvkzU8THVEd4sXQb39Ba2C6uSJ3BEicJ/SLmi9ptkFG0Benn1urBeLvLjsUF41s6g7X2riZvBR+KjmDi3YQIKZuzZ12mCkNQN3M4MGrafpMB9Gyy2imR+oFUlLFelDY/yYx0iqV4bHQUE0nQDlYum+CYgmQcDDFw7Mh5NI9L4q0fOAQA+uncKj5yd4bN3jIPMTaNHfJ8O4s0FvwEmet+1yTE55zZ9v95qXEPIB0UNDyYJL6U2hzqBOo/iuXk6Hkzi3wH4CwD/E0zGjP8VQG/v1L4usA8D+K6DzG6ggQYa6Kql48EkPomZv5qInsfMv0REr4FJntqLVrnAvpyZX37YNo8FSQN0yQXmeuylpC0qRTrw+BYoYh/Q4zSOnNQ/psoYsol9W9fnHk+wp7dCjeBMpspsofoMdRk+U6NvfF4XdFIgzgLrPI8UamiR9hpeq1CJViFhIzBDEbDjvcnYz/qCHkValil6ZPqZ6/jep4brgxYYiiCGDkk9reCX7avjeK/a1ckzWuVdI4sQ9T0WpQkhBbCOxm8rXmQC/cwzUMKIDQC3zB7BR3ZNYN2DF0/iz9SNuH5i4KZttfD1rksuLPwUglG9p2AGJhpT5eHbmhWUSrzNEpjJ/048mFJ4KQcr5aC3TRLh2MBNDjY5T0SfAuDjAJ7Y9+RVmsQ/JKKLHccJJt/5y/sOeFTEkCUfKXJlLbnAQixIuzqkDN9KUoVHpRfTY8S+YtdUlSZ3k2i/Z5ME7tmKdm789tRphg6T5wnI4LCNgKJm/24xjnF8Nq6NfsFp1ntwC/6MamgO81Rg7JC7HvJMaOrtOWa7jOxGRROK2tBH1yfQUCcBj5uCAQ8SHNmH+tSQMB5LhffIk/BSI+08F9D2ho+BKCnmbdP7UV5nruMd9ARcXEzx7gumDtjJYo4bx48AaJYnNeV5nRAwjhZ357Elz/H2JPsOhbkdzJbQx3V4Y8Qr0cwrhe4iomtgsmS8EcBJAP9n35NXMYmfx+ocHz/fd7CBBhpooKuKrnBNgogUgIvM/AiMLfm2dftYFSfxIwec2xVBXrNI/kqYKOdD7aTsuR6bzJS27Zli32sXZ9VeXIULCufrmTmPJzhb7HqJKZXk19EQ/LUkklZ0ndZo3wVptaWXjuAl65lSCAjNkTNqn1EOiiPMvRTKGBMwpiC1ltazbKYYNQOFy3wK+A9rRy2wq7eiTLcyt06X99OqtCRNqbn5fE271AvtcJLnuprIpoLworxhxACHOA05oxR6csdqEMao/TutmfDUmakrNr5e47984lZ8bM+k7HhH8UR8/jUGbpqMdmGiGNq90Loyr6YeY5uQ/Nu9145Aq7jCmQQza1vA7XUH7aOvd9OxoK7FV0PhwcooRTeML4jobOPStxQq8dInCiywryeivsQl7JCxM6SBZ5plgsEiu2i3ztu2yy0YcZrk9uRzMiLVbLenTDZzdNdehfOoAkTEtcpElI/tsRmNBLbsGK7wBLJ/CxDGJLeDx5LDrttsK3LkNMgul6gtqsSXiUb2cxPPPl3cusbsQ+m8Vr0Da6ULb7FJpFHN0THSUN52pGyOpLzNZsEK2lZu21KlvzfXjy/icdu7+OB5k6Xn/vlJfGxpEmNeN9rFhKowPof3voBGQSFQteSRTbZpjs8xxsN1810Pc9uMV9KRMAdLx8Qm8WYi+j4Av4q4xnWvtEpXFZMYaKCBBrqsdDyYhIuHuEPsY/SEnq4iJiG8IkRaDQC+Xu/9y7wmEUnk4rdr4yTmgjgy+MaZRSkUkmcroWUEoToDb/ljuVw8woujNctpkrcmjRdJA4/ctZjtCaZw0t4ItYAOxlRH13jjSOMUTe2xEQqb/nsOV13M9cnRTKdUoLS6xB6H+2lSRRetuXViTa1ohTTS83TybNukdePdJLYbqT7CmKmU2zWXrrm5OeVoncy+61CULsZqE0AsYZdp8KeoJTRTC0xUjUKZ8yqtsK9DzTGpycjYJBdj5KreLbkwzgEWCptS6Z09HLUVEzLX4VKsKw+nHalhehUdE8O1S690UOpb4/rJAH4WwA3M/ClE9GkAnsvM//Qwgx8lSQhDgaGIvYeTx20BLPQYY8RR1zLCeky1L8U5pWUcpMXwhdVlimQFbVXwpptrGo2dgwn6VOCK2rdASzmXwdAmzGsO86GOUWFC4UOfosRTx6bhCYrzgWmEqmbGa4Uxdx9uFHDnPLxM2zNKAwiusnMe4TwHbzPJFNN7EUeJN3Mb5esq5JhxPsq3TphEykTkOM28XatXi1XzXcUgsq6vST+5RTMIL90Wk1pAQTWJd5c0Rqr2ggUgv5H425HzchRg2JEt+2tsdesk21MCJnP1S0wfMeOT32TONnFQt+pW2oAmQUS3APhlAI+DYc93MfMr7bHvBPAdMB/NbzLzD9j9LwHwQhiE9MXM3Br3QEQzAN8D4AnM/CIiuh3AU5j5P/aZX182/PMAXgLrb8vMfwbj+jrQQAMN9LeWXJ3rVf9WUAXge5n5vwPwOQDuIKKnEtEXAHgegE9j5qcB+HEAIKKnwqy/TwPwJQB+xlYObaNfBLAE8Hft9r0Aegv4feGmGTO/nSjiwk0RYg0ioh+DyUy4BPB+AN/EzOeJ6IkwIeN/aZu+TSYX7KIuA5VJsWGkjfvKM3jS1ifsOQY2cmmL53ocFcKZUuk9mrbVwkt7qeQo1ey0VjPQDK7K1e111FXcPfU5l9edg5VcP22GXFdDL95nth833scJMtlyF1xG2kPz+hhzO+a+Lnx8REGMEhpb9v6MoTB199qmgphZ4+YuTzsLyxSsgzRLVSMQMnft6X2RVOpQiMpQXEipAcHIc7mIJOucFpKfW3/IcJXBtbWvRLOUpGSlvFyQJwvYyF7CVJURvKqIsVMY7XqMGhOqfQ4n+V7WrHwNeXONFHkELjPPr0ubUhmYTEEbWLfjmnLnbYw2oEkw830A7rO/d4noHgA3wWRq/WfMBtdl5vvtKc8D8Fq7/4NE9NcAngWgLYnfk5j5a4no+bafS5Qs5l20ToK/JyHUuP4qd1GHoDcDeAkzV0T0z2E0lf/DHns/M3/GOp3JZ+UX4iixGWNk3TfneoyzNvraBVAFjF6h1MFLCQqYWezdlPB0XhwGv3eLSlz5zeD6OdW2ZhUxlL5uq+miodFMcpb2IRlDGyQh00XLfQAwJUbJQRbY5wozchG6As+Gxp7WmNtFdYnCP5AZquBdA2BMCkWSiG/f4tIFNEqEPD/5azZza0ugmFJbxTI/fuP+tyzuyfkmwt78Ninl8y7GknI5vFZRrk5CLhleO8OQz70j+hoxc5GQYVkX0Ky8TWKiasyULUdr7X3SduPen119Art66pnBhCps2/PS60jtMYfxbJK2i5rjINuNEmMdJnGOiN4htu9i5rvSRlZI/kwAfwzgxwB8ri0ZPQfwfcz8JzAM5G3itHvtvjZaEtEJhPX7SQAWHe0j6ssk7gBwF4BPJqKPwtRI/Qd9B8kRM/+u2HwbTN3sgQYaaKBjQYSsb0obPcjMz+jsj+gkgNcD+G5mvkhEIwDXwEBQzwTwOiK6rWXYLnb1wwB+G8AtRPRqAM8G8I19J943wd8HADyHiLYBKGbe7TtAT/pmGB9eR7cS0bsAXATwg8z8n3MnEdGLALwIAM48PjGsZiQmp+rKdBsztfDZXgEjwbjiRPt6YmAFK5mcKfb943GBXw6SqDlUu/M1ftu8djIxDZLa4hvSou6h71hzyI3Xls/GBeI5UkKaLxkorBGwYnNtcw55rUL/jBLkIQfN5O9TyYAWsMyca6QVyBz8tOTCX1/Jo7xXVov0ndZSlnWWu6TwlKSWt6pdcEZQPjlOGDc2spt9CUSVNawGCLFr7jIVSzNYsxuqymnagK1HruO0KY6WOvyejqoINpLwLBBgpD29hfP1zBuqt1QZwXuxppwvOJSb5zoeTcUReYw52pR3ExGNYRjEq5n5DXb3vQDewMwM4O1EpAGcs/tvEaffDOBjbX0z85uJ6J0wzIYAfBczP9h3bqsS/H1Py343+CtWnP8WGIt9Si+zBTFARC+DsW+82h67D8YK/xARfRaAXyeipzFzI4eUVdfuAoCbP+U0t738gFWLJaRkX+QplVG+mYIYC+uy92g9xYhEFCpU9EG0ebQYWCpPZuyi8yOQ/YTzmh45XUxBnp9i1CmEI2EQU03M1QpQWLCLGmeUHPTrGuwhljkz5lwIBhTDSSUzIALvHEwzsXYit12Q9s/FLZDNhbHtnqeM1lVR62agktKgNOnFlIvYdpCbYaY2hbxlHpKZuTnLWg45ygkEee+s1Untwv7YNVxCTmnOL50yJHZp8c29JPtenJ3s+WSZZ9U+7q9PeoZSc8g8sK8nWOgxdkbGfjHx0dzOftB+/fKacrQOHCXzWG3cLrEZ7yYC8CoA9yRr6q8D+EIAv289TCcAHoTJv/QaInoFgBsB3A7g7SuG+XwAf8/OeAxT9qEXrdIkXN6mp8CoO2+0218Okwekk5i5s8QpEX0DTHm9L7LcEtYY4ww1dxPR+wE8GcA7WjsaaKCBBnosaDPBdM8G8AIA7yGid9t9LwXwCwB+gYj+HMbB5xvsOvleInodgPfBCNh3MHObXAoi+hkAnwTgV+yubyWi5zDzHW3nSOqVu4mIfhfA0x3MREQvB/Af+gzQRkT0JTCG6s9n5n2x/zoADzNzbfG32wF8oE+fbekGHDnJ/9F6Cw/YFB3XFo9iSqVQ3SmkEdcKNVEERTnpUQuIIaUuKaercHtamzq6towxOh4zlirbtIesUT81XFsJ8rzewo3sijFpLJmx8PMlKA8pqahudVyoB5iDseQ48NDRlCrM7Wt4Uc8asR2p8b0t11ab15U714+9IqYglcRzHk4yn5ejSeTsV/i66jIdeRtUlnMXwQgAACAASURBVKO8FpWHEHPzlhRpjty8p23jO21soUeYjZa4Zsu0/aTZ/XhccQGAyfIrA+YmmbgJ/0zt82yDDg9irO6Cktw3cGRpOfq5t67uhvmtaDdvZG2/zHwngDt7DvH5AD7FCeJE9EsA3tN3fn0N108AsBTbS6yRj7yF/jWALZi8IkBwdf08AD9KRBVMoMi39c0x4qjV3dM+0ZPFAg9XxrVzR80jXD5amFhhrCofMFRDecmh6+XLu7X2c0k1lMfFuxa4OOW38tBCON7u4VEnC6H74D9UXofbRn8DACjB2GcVlSiV5WHTvpeuDgUYCiEoTTNEniybPjzy9go2ibTKmBYMPB7X9dfPM6mtzkAT7qD2JINitwn0Ivs7To4o51tYrzf3zNOo7SjxYC76PgMj5q5RPvv0PZB91qwyNqrQt7wfp8eXPGx0w/gCri/27XmEbVqiUA6iHHnb3IUake1C2u/MNjZCbcwz+x1egcF0l4H+EmYN/7DdvgXAn/U9uS+T+HcwhhNXvvQrYCIED0zM/Ekt+18PY8AZaKCBBrqi6Tik5QBwFsA9ROTsFs8E8EdE9EYAYObndp3c17vpTiL6LQCfa3d9EzO/64ATPhJipk4opiAdGSFd7hlFGnuivu75eubTdyjSGFHtJaOSRxHElEICDiZymkI25YaVdA5bdzcnBbcZ7lP/+FafejJZQJ0/fMkFLugw3q6eeMP9kgt/P4skJsRI3y71hoO+0uPGSWDOIyFZFrhgjZ5jqhv3Ka5zLPpjF+Tl5hN7OjWuswN6a7RtPSLIVmczv9ubpSks4op9ujN4LwctpcGUZh+1vgupwTuFJCvhXeb6AoAtZeZ9bmyM1Y8bnfdQY81IAuTi3E0ztYhS5udqUEta9exWtYuM72s854PSMckC+0OHOblv7qYnwFjVf03uY+aPHGbwTVOKV8cLcfyCOEhltz6BQjCKC9XML/xjpXFuvOs/gigpoFjYUsoxgWZ09GbV3k4mkXj2tEf9uojpwDQ/VJkSljtqjl099dchGetEJOwDzAfs8l3NaRwHGiIw6ykq7OotkTI8htNK4Y2SXpu878pW0HN+ZyboLoFYMtfcZ/HIpR9PyXhluTKvcXSvdPlM3xU37xypFSLqKjgx58GUfhfyPXUR7vEiG5jEmGqctFHWCowHapfoUWNKVfTsvOegKjHmOhrfPdfc9SjSWRfkrucjczo5yt0Xt3+jjGK9YLrHjJj5DwCAiE5BrPmbThX+mwi34wSAW2Fwrqf1nulAAw000NVGx4BJ2HiyfwLgEoxyTNh0qnBm/tRk0KcD+Na1ZnrExCCUNuAnbzgOKqoi9tqBCZgbRd45W1Y9nhVL7Kh51hsk9SBKJZZ0nzzWJelLWqfoTRu8lfbflddHM6Em5TOAKtI4X28DMJrDnt7y0NtufQIP22MXqpk/39HTZh8FAF8T3MVezGiBCZxmNopy+0gNpuSivybBCrpRlKiHJtHpPBDfNzleaqTugomA5nOUBuvGMZnNFAGa6ysxp9eUNU4n2oO8rmyMETRmxSLUruaxd1oosIxScaRGZBlX5ApzZaEwkIcNc9fXShxff45WPeeDEuHYwE3fD+Bp6wTQSTpQPQlmficRPfMg5x4VaQTPl1a3OPeOcAisu1DPoo/8ZDHH6ZHx3PD58F2CsoQp1HLMDsxflh5N4Z6ch0qfco9pPYu0L9lfeqzt/rh5yrYPqZN+Tg/X21Gp0ZQ5yCR1H1xcB8Dcw2tHj2KmrHOcArR1lFvyCPsCbvpEeTq4G9t72xb4VWoJN7VXZss9i/RYm5dQdF7OhnSABSK1Q7Qd955Qnml05ftqv6YUUjJtKGpjfjdh0ACZMQqbbj/MPST7UxTS30sGuK8nCQxVND2vxLUsViziBynx2vVNbISOB5N4P4D9la1aqK9NQkZeKwBPB/DAQQcdaKCBBjr2xADpY8ElXgLgvxLRH0Mk9mPmF/c5ua8msSN+VzA2iivKTZUZ3ivJUZwFVqN2BXCoDpJ9bSRyB6NoDkFymhVKCtKsSaeRpDkQx/pIpOa8vFTfLCqTeQGlfz63axxd/bZ5VikigMO4ZV1EHmEX6xNR+y6o4kJl2j5ab0GdCEbfmglzMprDnMc+TQkQwzYlFw2ja6zJBU3KpbrIVYvLBd81PaZiSTu9tjY6qIdaqgEC4Z67Z5rGW8h9q6TjrvcrfU7x+5w3+M4Ks644L6VttQiefEzY57Hv5+H6JHatUdtBS1JLSbWHHIy3zjX1oU3Vys7RMYGb/g2A/w8mgG5tp92+TOJ9zBxFWBPRV+OQUdebJA1aySRcPQkokwcfAArKeK4knjMRk0hV/Q5PEdmm7QPvCuBaVbCjywOmC79uJTYwghtXUSj5uiphXLrAyGfx4UvncMvUOFKkua/GVHtbRJ1hujkc3bRtBrpJhpbmXMoF0Gkf1R3gl7YFNHXzPQiltoxo7sL2kGtT2NobbdS2EKbPJfessueBfPAcYAQrJ0iNUXsvJOcl6Jjxx6vTPveZn5s9VupRAxrLfT+mv3Z7ifxGVj2Tw7qar6TjwSQqZs7m4etDfVnyS3ruG2iggQb6W0Mbqkx31PR7RPQiIno8EV3r/vU9eVUW2C8F8D8DuImIflIcOoVDVqbbNGlW2KuMRJqT2hUxKlt0aAKK2GOtVWtwTlwBrimVSMnWS7sZiS2dU5cE10U5SKWNDuLNsar/XEoJY4xvk2SNVnF/eQpA8BwDgJOjOQqwh6YklVw0pPy0X+nRVBOh8sZTHcE1Oe0BaMIvJbenWsm97PJeNCv+cdTGjdemEZg67KFqXE7bcJSLreij5bhr7fNe1Ey4xjpwzNQSUyqxoy4BMHExDiaa8xgayhuuH62n/ljIeZbXDt2cgGacRmzgNn+rjBeZv6diO77mzQfQRfTYM4A+9PX2rxTsN+YC+zGY7KvPBXC32L8L4B/1nOBlIWbCvB63HlfEqDizoKvYS0guGl1lD92x4N0UXs6Ki8j7RrYP43QxnhabwQHfyFx/ffrKLVR91Pdc+umPXjoNABiR9hUCT1QzLPUIJyyM4fa783J5hyTJnFMFB0+gsQKcPdHNpQ8zlwvoKhx7ncUnejfE/vT+pu9I1ibl2rY8v1UMoG5xc03nUOkC7983HmpP3v4EiiLMTbotn69n2NUn8Ki1QzxSbft2J9TSBBrqYHPK2UiA1c9Cs4Rz+0FMuevcKPx0ZWgJK4mZbz3M+auywP4pgD8lolcz8xWlOQw00EADPZZEOB65m4hoBuB7YOr0vIiIbgfwFGb+j33OXwU3vY6ZvwbAu4iaPJOZP+0gkz4K0oirZ6USgyLGKCO9V1w0oBN/TgIZSNXWQQxOSpLG6aUusBSG2xHpViNzKu1s0mOmT19dsIY5HuZ9ENW9AROR8hqdS8XgjNxSa6h0kQ0ga5ujBnmoZkvNvcSaanopjJGTWPtcB9APzut8Bpzc/2TsLm1v1XPrmk9n0SUfa0QeSrlQnbCBlTPf1mkS95bX4tFqikdrA/Uu9Cia24hqDxOVWmXvv5+bgC1zmkOlm1p74/oahvn8740RHwNVAvhFGCTo79rte2Gcjg7PJAB8l/37ZQea2mUkAzel3k2xTWCkLXxUkH/hTDBQfgFXxI0XOe2/yhxb1kW0fySq4rngozZa50Vu85haFWTXp8+w3c+Vt4vS5+D63BkZ10qXfrysJVadLJiZZ+QY9qKeQJHGyWLpx7hUhSSNbQuTW5Ry0F9uIW273rhew2YXoq53ZVV+pzZqe5/T/pzn0vnSBJy6MrMaCh9enANgmMK+nmDPMolSFz4h4AKMWgWvw0oXrYzA9Jv3vEoZW6U73GMzTPAoPZyOA9wE4EnM/LVE9HwAYOZL5MqL9qBOMY2Z77M/v52ZPyz/Afj2g895oIEGGuiYE6/x77GlJRGdcDMhoidBBNWtor5xEl8MU0VO0pdm9j1mpEFYVKPGPkcKjKWAg0YqrussqU0STw2y7l/artQFmMnXBFbE3m9/pHSrNpGTeA4KKwB5D5v0WruOHQXJ63lkOYuM1dG8EucBp31E0KDtq2IFxYRLNkhvsWy+1m2QkpQ8V2mNbX22He/bTx/KvwdFx7EDjMFNJw7APCcNwu7IGKdnauEDK2smXKrHWFgtXoOgnAagx1B65DUJd6+rDCycg4laYaM12vIRx0kcB5sEgJcD+G0AtxDRq2HKpX5T35NX2ST+dxiN4TYikpWMdgD8l7WneoTETP5FlfskyUVbmljkh9G1UKYvJ4uXU/5OPWMU2FfuImIUSsBPiT2kAc242gtKR3YPzc3cTSkdBI5ah4F19dc6N4HDL3XRgOuaAWcCFhT5gxRpVHXAz2fFEpesd9sokzQvB12kXjC5Y23UhXV3BU+6+a5LR2GfaEKLHI3jYJ0lF5iNliFAUbgmL/QIl+pJ9Bzd/ax0zBTc/Q33Pf5dpcy7x8Lv+mNuf25HySiOA5Ng5t8lorsBfA6Mvf271kn2t0qTeA2A3wLwfwP4x2L/7rolRQcaaKCBripiHAvDNRH9J2b+Iph0Sum+lbTKBfYCgAsAnm87vh7AFMBJIjp5JRUd0mwMxjmS0A8QBz+lEhpRuwRu+hJjykAprfyxnOTixi+UgZ6c2cgZxwGjgUQwVaKBuPZubu536ni2UlNo8eZyY6Zzzl1Txtmtt+aSXkMXLJYa/H1bXXhJd1LUUYxM1XBGkPBGHmry2x0SqaS+Ru5V3jWrxmnTEmKvqPXPT89zWpp8Nssk1scFxX1gfr2HkJZ6ZDRC3fz2nGFaameVjr2W3DPUTKiFQVpqHFJL91NP7qv79jToyCEmSZtA+ojoFphy0I8DoAHcxcyvJKKXA/gWhGSqL2XmN9lzXgLghQBqAC9m5t/J9DsFMANwjoiuQciDfQrAjX3n1zcL7JcDeIXt+H4AfwfAPbiiig4Ryqo7r78k9yKli11u8XMLumQQ6YvITKj16pezIgMd5RbgWqcePQxlbSeSeaVzLRIG4qjNxrFq8e9aWPy5SRNF7BPtpcSNOgHxWDkcXFGGSSA/t7n3ZMp7kLVdTyfunbFDpefmfvc53raI5Ri2tNjk3s2U+kBPuTb+/nKw8zy6NB5L05EJdnSM4WI59R5phkmMIgEtdTVPISW3XWnl70XFygpaoW2fhV+2A8y9bYOeNmW7iWgzXVYAvteWYNgBcDcRvdke+5fM/OOyMRE9FcDXway/NwJ4CxE9mZlTA9+3Avhu2+ZuBCZxEcBP951cX8f3fwqDZ/03G733RbjCbBIDDTTQQJeTCJvJ3cTM9zHzO+3vXRgB/KaOU54H4LXMvGDmDwL4awDPyvT7Srtefx8z38bMt9p/n87M/7rvdfb1biqZ+SEiUkSkmPn3iOif9x0kR4dVpVJixlqaRHwutUppbftzko3c1/ZeEIC6VllpPpV8iBhkoRIihlKxhOz6qCjAUjnKSVRdnlQS7mrzpm7TanLtUvFGaiMp/OXnnNGOFHHklZb6y6fah7uGrtiUCGJaERuRM1C3HeOWPtfxvGm9bxlK06b7/dk8T/n+RsKhYlGNvIZGxLFRGSEFzlKbdhE0lXdY85CST48jNIfaGrmdNs0c7k+XUdqRhHr9eUkbylzzochMsm/rc0T0DrF9FzPflTYioicC+EwAfwzjhfQdRPS/waRH+l5mfgSGgbxNnHYvOpgKM/9U30nmqC+TOE9EJwH8IYBXE9H92EyCv8OoUhFxgmn2Jv+MW17AdeDN5H2Ri4B7OcUSn20Xv3PyfIBUgIrkC0/E0IJJpB9CuhiVKzyVKMOI3Bza2sW2jNAufWg55pJjfK4/WStCE0eMoct7TY4nmUTOBbiPrSDHEFIvm1z7FDvPzbttTEmrmHLd0q6T0XDcnmtCYZnwoh6hssGNPDLzeqg0eZkeWc78c6i0wlIXKIWnWSvDtAu4g2VrVv63+35zi31Kq5Zl1vn7bK59s/aKNbybHmTmZ3T2ZdbY1wP4bma+SEQ/C1Obmu3fnwDwzchfxBFgaYb6rqrPgymi/Y9g/G3fD+DLj2hOvVSpgQYaaKDHmjYBNwEAEY1hGMSrmfkNAMDMn2Dmmpk1gJ9HWAfvBXCLOP1mmGSsuX7JGsYPTL00CWbeE5u/dJgBEzqUKkVELwLwIgAYnTsNXXepox0SRNuxFu+hA43RV4JhAllpjqXUDAA6lfLtX8WoNfsRyEr5sYbSb/w2Q6npU8Aa4rg7JqmP8dtI9RR5esk2kUGbOJJ8s1K30zoSDUf21WYob+uzyz9ftml623RBUc2pp32m1DyHGvccaNcoojOl9pDeY1dSmynyrFvWI3x0eQYAIuOz81iSEJKEjOR1OS3CG6trBe3a2uPuGXZ5CK56lxtehu7vpg3XDONWeUiyKTJeBeAeZn6F2P94kfXiKwD8uf39RgCvISLnTHQ7gLdnp8jMRPTrAD7roPNbFUy3i7waQ3b8UyvOfwuMW1dKLwNwaFXKYnp3AcDWbTexrhLFyPW00nCUf+mITB9u+U0/ylVwZN/sKGk/LHIYxXMnPxd5lxwM5ZkGcX+tuvMayPdj7CMxnh2YhNnXWNTbehXnKbv4u/0BDqKGRxdl7Bs5km0cLCbhpi44rsubKX1P2iAl5nw/qxa3Tsw9cz+p4+G1vZtEiIQiTu6vwxYmo8p7LDET9quxtztIOw5bF1fpoVeLY7Umzwg0E7SOvY8CNOSYRNiO5gz0W+RT6LYFvt0YbYbvPBvACwC8h4jebfe9FMDziegz7CgfgvFWAjO/l4heB+B9MLD/HSvg+LcR0TOZ+U8OMrlVcRI7XcdXETM/p087Ivp5hIyEvVWpgQYaaKDHkjahnDDzW5HnYG/qOOdOAHf2HOILAHwrEX0YwB6CkN8ri3dfw/XGaROqVERM0EICz8YCBCE1OTedXP4vJ/1GfaddEG8kGDPqv22eDDBRQ+Ja15OjK2COiGINRXiEOSO6lJ677lOqSeRgK6dhdEFTvfIgKZM03GceFZpLP6+ZPGyUBlWmfXXF1ByEcl10JfLMaR5AU/tw98VoWOE6iEK+sbIusFdO/DkVx/EM46KOrjvyWNLBOK1tIF2kPUhoijPfqrj26HI7UIK2b+ZIguyOQcQ1TJ69A9NjxiQA/IsNqVKBujB4Tn5TyzG527aTH5bvl5rnRWP2fR+72uX6z81VASL9fwj+y0BTvabkzmfyDIc5/kgdFOenKQ4ScWNVa8OYHYPx24IJ5GwizvtmVeU4B1tVtWrAVl02ghQmynsnxfvzEcH5Pty19KXUo6xvP+23J2/LYGIQpGATIqXrWqHmLUxHNlU4x66qMpBOeig5BiHhJtYGcgJgmIVk2C1Mwk6n13vc+d1vGm7itbybLjsR0SlmvghTSfTA9JgxCWZ+QcexdVSpgQYaaKDLTgSArmxN4jUwtYDuRl403kiN6+NFXVxdSMVmu6Wd1BCIAOZYe2g7Pyf19xFc1nnHOJ2E3a3N7k7vjx5zIaE1uHMojefo0iz8NOPgxK44EBLzhpD4tdAuHBUqSLqrnAKklw+BI82j3QCNRpucJuGMr5y0bSV5zdE96374EbqShfPkdnxum3dTCoO6OdRMIKJW76iqVpjb5WI6qrAUhuo08E3epyhDa23vm0tfwwi/kWrKUjW2bXt/K13axIbpCtYkmPnL7N9bD9PP1cMkGF06tm3Tcdx9FCm/lRudb2lOh2/dWIM6XngSP5i7F6uuQ5K5RIgZRwzDNHKYdbL4A4kVr2XAFJYR5xExmAImni6oWgNKmZ2FanoptQ/XziC6bA5p9K7/rSnC0xuUziuCIaUNpvt9ja4vaRtBcZnz2uxD6ZhtEFY0ZfvbQUx7y0kEKTmvJSCB3vw9tJuOoej4uCcpBDHCu+6/yTXhossg5F/hmoQnm+DvdpgErQAAZv7DPudePUxioIEGGuhykmRkVzAR0T+EKUV9M4B3w+Th+yMAX9jn/KuKSazD1BtCXC7gpmE8W6UtdI7Yv0muz1XjrMJfWs9P4DRuga0a4mqmw96BIYj694byDg8t513FcAbTZpxGr6E7DMoNCCmCUYLmwBoxbJJQI04l0sYEFEcr5p7GMERjJJpCx6Py2l/SD1EMw6UxFJ35rpzHktO2vGYh4kmcFtFmnAbEe0nxdooMREpqx8dwFB5M7YOBNhBMdxnouwA8E8DbmPkLiOiTAfxI35OvKiaxeiEVTZO2/ptjaZRYs//DUpY5dL30G5gQpR8i55lDztuk0VfPMZOFOgQrcsPdMcBPACiksuaWPFauzx5DNzxpUtsJC08diZ+bv9T+mrSu/BwdN0zPEuVsFCTWzngxj+E9ihhmahMK8zL/hQSLFD2y9Jw2T69cEFwWQnK/EztU6BDN3632q/RCOqjPu7opOh5w05yZ50bQoi1m/gsiekrfk68uJjHQQAMNdLmIcUW7wAq6l4jOAPh1AG8mokewRoDy3y4m0WFXjbxm+qisa6YIOCh1evNE/XNTYmqbYg4KkQej4/lOemkbfagF/mFKPKQIIBWMy8TaQy4GbkkfaMtwGeO0HCTSHIQULFNGeCy6jyNEvNNDeu4a5URTDSQ2XItp+mMCJqRgYIc4ls3iG19ybghzLIF7vCahKdaq0mco1aOctiAGb9cWWvavovSZiODJI6FjoEkw81fYny8not8DcBomUWsvurqYROJF0t022XbffxsM1TXWqmlt4D1KXU7zjdr2U7etpYsacJQ8doD+cpRj3pzcN7ueejhKq7BGdng6NYOrYkYQtckudgljsH2YNl3X1HxYCU8wz6QDmoq8zTg92mSi0TgtMFUXA+EGvOT+UnTfWMfwUoODZZhBrt/GdaVBh5zdnaXo9Y6EHFq9FhyGrnweEREz/8G651xdTGKggQYa6DLScXGBPQxdvUxiHa0CaIWiOrNpdnXXkKZWT6E5SLPPdTQb7pDSOoeNrJltIlpLm7Z59ZXmgi0WqYQq4RkJzTjvnl5xEw0ISR7NaE1Ce2iVgKMBMnCHHzsZhqn9XqewX24oP1YMSzUM10LojxTDBrwl+0bjPkWpt1NtrK2+OwMkUvhzwdE96nxkDmpNd6/4tBsaiHwHN+n9xGiWArwK6eplEoehrufeAkt19rEKu25bWDLwTq+FKhmTchBA0m/LqeFg5weWwlmZdrlT0zUuhUy65tpY7BjZNOqUeGutgke6vGt6QCMNSqEWCTkl0c9x/qtkvOxq2PgRxmlhIF2Mp3G5EQwnGIMmoIwNG356SrwnuSn3XaM73vMDL/Mbdo8l8KBJDDTQQAMN1EEDk7hKaB3IY6XU3+9cSiUhp467WtSpKpzph72h0ZLu6D/Xh3XPozqFVQQRwCNhwKwoPzVlIJ1srpr0GhRHc4ViwCUKzd1eaRBW7H8258pNaVtcR+63h1R6GEtXamldMEnPtSJGlDJahv+dis+Z6xYaSTSPVBMU7Q+U/8hpW0ubhkS+T+m3tUpar6n5DUjqM7+Mhp2jdQzfB6aBSRwvWskD5OLbdq5c0N32SLxtfWAFBlAT1NLsK+YEspnT9ASotjVQNDHjFHZpuHayGKeiyEebtByDoZZhWy2a0JP/gBSg7VvAIwZVoa0eM9gdK0xbJZO2C1iB6oA9k4afmy4AHjP02C7+Y8Fo7YLmzmMBhzRgCQJQdC2keQx/ZTXBvrYFdDDmhgdVS5/p8RRlTBkdSVw9OV1GWUvmlcJUjYkn96mH0MM1mffCnaepHV3sde1NWPBQHkjJ5TW+o6NaxxlXdIK/TdFVxSQGGmiggS4nDTaJ40SRx0VGskuMmdnzAWSLKDsjXQ5ucJpzHSR7KgmqBEZzty0kcAb0WKE+YTb1OAzjJXqrjuspG28QwEtITtJXC0JhNQQjxQfpnTSBqrzk643YuXdbEVgZjQEAeESwZY3BhZUe/RjN/p3mQlqMp83k2WZv1ZNwndXMaD2urrLMAuulaGnEl95A0gjr2mYfa8ez7qCs9JlqD22aReLpk74r8cGWadlCUlnvJxc/kTk3v2TJl7/nosbk3zUCAPl+66Q/lU5+Rde5KRTxNA8s/qfP5GixJkBf/arE1cMkAIN3Osq45IWPlfxCCKAZWp+eKpEh8Z2qZVio1QIoluaYWgKqMv8AmAVbjMEKwIXwm+Vip+AX1Pk5QnkqntzkvJl4sTD9AoCyTMhv1wAE5EOamwuVW1TEeKwCrBSOxe39dUT9NxmDlLBYEdgym1owiWIB6Al5RslEnmHokYG/PBNNmQYhrKAENJLq+cGp3XmM+kCUcV/RfgGv9YZwkvFz7xaA8P4K+YQiuDRhRO5k97zcc2pcZB6W65xvZQQEzzSEZxMXAEYIwky2g2QzB1XVFEOwh0m4JN91ySgcQ9sUMTZikyCiWwD8MoDHwTy5u5j5leL49wH4MQDXMfODdt9LALwQRqx9MTP/zqEn0kJXF5MYaKCBBrqctBlFogLwvcz8TiLaAXA3Eb2Zmd9nGcgXA/iIa0xETwXwdQCeBuBGAG8hoif3LvO8Jl09TEIDahHEBGlIdZKFg3yohpdsASdBs//t+9AWRsrAKIDRFEb79ncpNQlGsQRUxb6dJGks1mNCPbYS4sjsdxDPaD9MiNhI3sXcjQGMLtl2C4YqOWgumu1cOVyHm7cL/iks/FMAekR+LlxQpEnEExfaA8OnSXZQl9+WY7PRJNw11VuEemLGq6eEegwv3bESt5cMxFVvmbbVzBjS9ZY47oTNwuGJLWBLi7DX19FBXr/72/AYS/rqg5b0iu2SMGFn3wIuTWGonoZ1OZ/4nSGjGS+F5uS6Kgg1goQeDZUO6zXmFghQLrjy3WsY4pNjCazUgII9qrB56GkTNglmvg/Affb3LhHdA+AmAO8D8C8B/ACA3xCnPA/Aa5l5AeCDRPTXAJ4FUyNi43TVMAmqga2HwkvscHpA4PC+cRPi8QnSErhV9hNBOiVQ0nCQVQAAF99JREFUlAxV2u2KUSzZ/6aKw8fEHEEMXBC0ZQz1lvL911sGclFuQSXDGADDFIplsHOMLjHGe6bT0VxDLTWocgszAwJiopqDWpy+04oCk5gUhlGMHPxEkaYur0N6SMEypcAk2M8lzVCox8pfu54o1OPACCTUpR2z8tsGmvIMZguobY2tesbQWynmI2id7ziVDOXiI73J2mAod7AnFu4rWKSwUM5tuws3E/s406QvkVxYJXwohCUp9GgGqAjR6ISQ7r3pjttyHZn9VKXHWk5x9iwhvBR7VrDywovrNN/HoWjDhmsieiKAzwTwx0T0XAAfZeY/TSoK3gTgbWL7XrvvSOiqYRIDDTTQQJeVmIG6N950jojeIbbvYua7ZAMiOgng9QC+GwaCehmA/zHTV5b19p3IuvSYMQki+lUArvDFGQDnmfkzLCe9B8Bf2mNvY+ZvW9WfqoGtR8JvqgBVS/hDDp4YZykx5nkJiiNJRNVWKgegSjaahNcedCQ9O8k7JVYEHgcRWY84eP4ICAgAqAQKJ72VRqsYXTJ9jvc0RvtmYqN5Daq0n5uR8rlbyvGSF0NZbYX3K/BIBU1ipMCF07DIt8/1Ie+buweOjNHTNFaL2rfnQkFPFPTI3YugxegR2e1w3/QIXpOoThgICgAWI+slJo3sEnJoC0J0TTKfXJdHEiXwRrMNNd63VnL9WC+wRlBgbhxGDMdoQDljsnBIaI5ljwtjeDyWkMh1aEB14oghkG8FowF6Jx8ikAoXv1Kr6XASaTTNKFWqMp583tMvmWeEKNTra1Yrqb8m8SAzP6PtIBGNYRjEq5n5DUT0qQBuBeC0iJsBvJOIngWjOdwiTr8Za9SHWJceMybBzF/rfhPRT8D7+wAA3s/Mn7FOf6oCZg+YN5VqjhZ0qhmpB5OEm6Ao2i9hFEjsXcBWxGz6F8fCIp1ZNJ0HUUHQBUFPzFdcb8WeVlwE24mqBNRVGtvDaG46LUr2TNB93H6elbZSTuYFdtBaI5sbQFqD6hpYuHtDYGUnV1CcVE96L1G8QOUi2HyZx1rku6kZRVWjcFBfoTz0xYVCvaWgt+x9mlgGa6dTnQhwkx4beCTr7kowNgvxaChKc91v4YgYQ9dil0Kbkix8Kd2mI3sVBQGhgeeLhZfYMkUdFnHp/q2ENx1pCGae9hkLSynj8dCTXXgDfCrmZ5mOZxyEKFeWTFsu70PjGvs8BOHx5WDe4pLzvDLbqkICCYe20m63MdqMdxMBeBWAe5j5FaZbfg+A60WbDwF4BjM/SERvBPAaInoFjOH6dgBvP/REWugxh5vsDfoa9CzKPdBAAw10RRDDC4mHpGcDeAGA9xDRu+2+lzLzm7LDMr+XiF4HY9iuANxxVJ5NwBXAJAB8LoBPMPNfiX23EtG7AFwE8IPM/J9zJxLRiwC8CAC2TpzBaG41CQ0jsQpvGy/5A+jyb5YwkTQ8exKaRONYG1Go4+z9+9nBVlKTsJKOtEMKraJYBuM4VYwGvOOuT1voyWEAuUpKKodHiL5cUxddSBTFMUhtxKAiYtINiVRAX7JvpcAgcBHgJj0pxO/g+VVPCOU2YX7WnFtvIXiosfjntjtgjHVSecnYmrAz7s88U/tcSgLV5D3dwEGS9dBli2QfTddJ4B4aCrEmXNh/iZOFH09I01SLQE4d3xYGYs8y4Tgg83SlcTD+uD3PGIjXuKlyAon2GWn4oh3VQGG9q9QyzMU5qciYJPe7WALFglEITYI2mtqbAT68DywzvxXNNzZt88Rk+04Adx568B50pEyCiN4CEyCS0suY2bl0PR/Ar4hj9wF4AjM/RESfBeDXiehpzHwx7cQafu4CgJ0zN7NaWNy7ZGtPEDaCWiyq6QsoF7GOZ55d7NraS4+pkQqMp2aoSsN9narWYUEhivIXufmZsS1s5t1qGap016tBtQbpALdB6/wclZ1730hRuagThYh0wSSYbFJAt8CkMo0MrouC7ABQ8EXmQoVFqrBR2g6yH8WBeFwA9cTdHPunThbyVZQu9hmSLqH+tNpi4NId2I7tIMIIB9fx76y9g8xYcpFmFa4jWtBlO9dcLJrQgErGdJ20Oktlxm/YLjJzoQooLgWmpCdkough+pKwXhqp7vtmw3DE3JRgCsUihtDS+yuFKeXhJrbPIwh9atPy9pCW43DEzM/pOk5EIwBfCeCzxDkLWFScme8movcDeDKAd2Q7GWiggQZ6LIixjnfTsaXHGm56DoC/YOZ73Q4iug7Aw8xcE9FtMEaZD6zsiaU3k9UkhCGZNOe5fgcckiXp0dN1noR0BNTFdl6qMB1JablRKYxjSEleA9UMqoXmUFmjMxAbhxNiTUGbcPPsqgTTdczNxW23SWkRXCcNsEajYe382jWoKOw82aehAKwUWIa4kdFemBsrG5To8mGN4EXmJmwjr83Nyc0H0f1WJaG4JNq69tL33p0npNzIcCy1Che/IzQJ7+mVGP/dvCPNgjK/5Rxcn1JbSXJsRZpqarjO9BvNSe6TcI/QUFQF8Dw8FyhhjFeIYUGS45OPS3L9RNqC0Ihy91d6NBWlg3IZxYJDEK2M39kUDZrEkdPXIYaaAODzAPwoEVUwy863MfPDfTpzrqQYmcWQXC4YThZYERHsF0wBzVC6qOWOuf2OMWVyUDtvG6oRGEalQIWAaoqORZpZLD7a2lmEncEzRW09sVpeWCLvXUUAUItFSXGzbRf1Li2WP4eViuwaPBIYQ0IprKJKYOJyXllc3rUrlsB4z26bzuH/tC1+bhrukSZtIking7lEMI5gGK5tCuF4/syIyn5GUdU6/ssreHmYdNxPIxIc8XV6hy2XQ6zNdZbFLRALvY8bFDJHBE+xKCWSMOHoueTGj+C8BG4Secqku7uqDHMAzPsSuaKn4x+aOr65q4geUybBzN+Y2fd6GH/hgQYaaKArlxhDFtjjRkEqIS/FADASCcH9Z4u8Ow3ANhNaBvvYB06gG+0lP3LnOHVZU0MDIaGBeO8X1HG8QU5yi6CMPFRj2nUcA/qJnhqxNsHcfp7wykr7T6GySCKURu5CxF4okyvKB9NNlE/RocfK5nkyTeuxyRbrguu08Ovvgkg6KaNBpLBNb5K3RW6nUI9C9F76559K5En3kRTupXihKee0GjemgLBYBcMxafEICaaoUyLp5y4xetRWw3DQEOfmnvYhx5TODoQIsmyD0LLOAFLLSD8FD+Wxz1m2MRo0iWNGbiGyDqcRzithABIQg2MYMu00wjFCeA8Iyp/I9f/f3pnGWlJUcfz3v49VR0UdNIjoAGoQdUREXJiMxBBETABXNHwQIa7gGheMS1w+uOASd3EdY0YwMC4TVMCow8gIMgjMMAgjKCSiCBoEBBVl7vFDVd9b3be6733z3rv9puf8kpvbXV1ddbpu3T5Vp6pOgXo9UtuBpX9+khv7RjpVrlRNq5WsSRH0air4QHaNhlWJz1paDFd1q54qjQaFMTLtNZO/SeWFeImvqHA8XDDX3yX1zRQURHHe3zXathvcmJces/riz71EM/f1e8k9DO8bMZVY9XfM39dk3rDeaLxyvcybjoqxqqxiqJqX0re2QH0rjQP0kvz6NlRaI7Ps6siNV5Qvla9Vx1IqM6+UhqfKLJ3R1GdkxlJ6PvS1VvUpxnytaxjiSsJxHMfJYoZtm+85tYuPTikJpYPIVZNNqUVmybXRsBRLWt2D9QAQuubbahpbPQvmp8E5ySYwTU3LzLW63gPU9xySVnvdPSPmoUF+Y/LK3Ve9J+1lVHxj2bAzFjo1Ziiu95B6g1kqobU7NG+pL7QLg8Hq/gyDEdHBzJzMHH8o7z+ltCpUegclM03Rkk+ilgZuk1snNWAUvZEmH0aWnCvpgMoq5qXUxJI8x7i1bOlkAJsx+knGPRteU6U8R0x61R5BLq/cLamsud5CaS2Ela6VZimlvYq+JfcNf+BibVT6H593303z3TNZhHRGSahvzNxXGEZHfTWN7RZmLg+muVanvU6SXo/y+EVhC01NUDD60p20+9o03tCgHAanOd9LkF94N0melcV1pZXZabQ+Az9E6gP3Jzrmv/1kUVrwcTUzcDZowX14oiQGzgdn4vng5Udphk1pUVpyHGRNjjP7ZwwUgVV+muTlYzZ8uRUmytxLu1A8dbOiRsxiyWy6kRdoMkOvNB039a+UPn88TsfmAHpFAyjW10HcdHps/Gmzq6GrVaKidEcUWPrMJUVnoyalxEwUpr1a9hqJkhhxZ5+OKRrMu3nIzU2O4zhOltl4LtiB6ZaSqK6DKLVqKk3BSWYQVdxaZOPlehZN9aaYIVRrRprQeLE96xUKKq2fwXNV0hwsvMslkfHjVGvCGiNLMed9ZpsNewf3i14xGwfi4HfaKlZpALbwPRRkG943GOBOehKDa3F2jWV6GY2L8DLUDVgr6WUMWtE5M1GxSVRqfhlphdvIfUXcAdWGrQ1b58VsooH5tE/S+4s9vOrzJ8el3zctj+r/LM0715MoPX/5mdKNwoZudfLnQJx9mC+bkbVLC2Fu8p7EjkXdlMWRypJTEHWKYlKzVTo9tPJitZKBnLm94GuY1TaKNfmn4wgjcSdQBCOrhyH8MUnLwEZeWsN/tYau1wd5VuTrJccM0ymvpFblnKGr9vTl11PmZViOl1/xnEm/StZ8WVyz8nmMX3WiV92TZCR+6Xz2ZsrwjDY8Tq7nn68hj6rciVy1clefrZpGTinUpllu0IU0bGFMTEnGPnDtOI7j5EkVWYfpjpJIWwy57ub2tLSTxXIQzS/VjXdyLetcXkXYzOil7SYdfM41Z2fbY6nGr5qf6tyB58xXpaZopZySewc9hlwegwgNMsLogHMuTq4oqpslVfPv1YRX5xo0pT1XJqi3k8xoqr+5rlc5Ntv6vEfqQ/V6Lp2ankDdfU15VK/166/NmXlwFb7Y6Y6SILFZjiP986NGE1CpolbNSLOdztpVJlCUuW1Ph/clZodqMo2zuPL3jJNtorGTcVHGpJHdPnQ70hmkN/8Wyqkx0ThAw/8la0Zu/O9NkN88YDDwztBlOqUkHMdxpoaZ9yQ6RVOLrcEElDXjODs0Ew3yj43SHEHdH8902Dl6Emo0mexASPobcC/w97ZlqbAUl2lSFqNcLtNk7GgyPdbM9p5L4pIuiHlMwt/N7Ji55NcWnVESAJKuMLPD2pYjxWWanMUol8s0GS5Td5l0eM1xHMfZCXEl4TiO49TSNSXx1bYFyOAyTc5ilMtlmgyXqaN0akzCcRzHmV+61pNwHMdx5hFXEo7jOE4tnVASko6RtFXSjZLOaFmWmyVdI+lqSVfEsIdJ+pmkG+L3QxdYhm9Kul3SliSsVgZJ74llt1XS86co0wcl/TmW1dWSjp2yTPtJ+qWk6yRdK+ktMby1smqQqbWykrSHpMslbYoyfSiGt12n6uRqtV51DjPboT+E9dJ/AA4AdgM2AQe3KM/NwNJK2CeAM+LxGcDHF1iGlcChwJZxMgAHxzLbHdg/luXMlGT6IPCOTNxpybQPcGg8fhDw+5h3a2XVIFNrZUXwZLUkHu8K/AZ41iKoU3VytVqvuvbpQk/icOBGM/ujmf0XOAc4vmWZqhwPfDsefxs4YSEzM7P1wB0TynA8cI6Z3WdmNwE3Esp0GjLVMS2ZbjWzK+PxP4HrgH1psawaZKpjGjKZmd0TT3eNH6P9OlUnVx1TkatrdEFJ7Av8KTm/heY/1UJjwEWSfivptTHskWZ2K4SXAPCIFuSqk6Ht8jtd0uZojirMFVOXSdIy4GmE1uiiKKuKTNBiWUmakXQ1cDvwMzNbFOVUIxcsknrVBbqgJCbcF2xqHGFmhwIvAE6TtLJFWSahzfL7MnAgcAhwK/CpNmSStARYA7zVzO5uipoJWxC5MjK1WlZmts3MDgEeDRwu6ckN0adWTjVyLYp61RW6oCRuAfZLzh8N/KUlWTCzv8Tv24EfELqzt0naByB+396CaHUytFZ+ZnZb/JP3ga8x7PpPTSZJuxJexqvN7PsxuNWyysm0GMoqynEnsA44hkVUp1K5FktZdYUuKImNwOMl7S9pN+AVwNo2BJH0QEkPKo6Bo4EtUZ5XxWivAn7Ugnh1MqwFXiFpd0n7A48HLp+GQMULJvIiQllNTSZJAr4BXGdmn04utVZWdTK1WVaS9pa0VzzeEzgKuJ6W61SdXG3Xq87R9sj5fHyAYwmzQP4AvLdFOQ4gzJ7YBFxbyAI8HPg5cEP8ftgCy3E2oZv9P0Lr6dQmGYD3xrLbCrxgijJ9B7gG2Ez4A+8zZZlWEMwNm4Gr4+fYNsuqQabWygpYDlwV894CfGBcvZ7S71cnV6v1qmsfd8vhOI7j1NIFc5PjOI6zQLiScBzHcWpxJeE4juPU4krCcRzHqcWVhOM4jlOLKwnHcRynFlcSOxGS7hkfa9ZpHqfonl3SCZIO3o401kk6bJbxt0o6LnNtmRJ35F1H0smSHpWcr5Z0h6SXtimX0x1cSThzwszWmtnH4ukJBHfM0+AkM1vQlfWSZhYy/XniZGCgJMzsJFryOOB0E1cSOyEKnClpi8IGSSfG8CNjK/08SdfHVqnitWNj2CWSPifp/Bh+sqQvSHoOcBxwZtzo5cC0hyBpqaSb4/Geks6JXjq/B+yZyHa0pEslXSnp3OjobtzzPF1h45lLgdOS8Jn4nBtjXq+L4T1JX1LYqOZ8ST8pWt4Km0Z9QNIlwMvic1yg4NX3V5IOivH2lrQmpr1R0hEx/LkabnZzVeGmpUbudyayfSgJ/2HM71pFT8LxWVYlv9nbosyHAatjfnvW5eU428subQvgtMKLCR4ynwosBTZKWh+vPQ14EsHx2QbgCIUd9s4CVprZTZLOriZoZr+WtBY438zOA4j6JccbgH+Z2XJJy4ErY/ylwPuAo8zsXknvBt4OfHjM83wLeJOZXSzpzCT8VOAuM3uGpN2BDZIuAp4OLAOeQnBvfR3wzeS+/5jZiijTz4HXm9kNkp4JfAl4HvBZ4DNmdomkxwAXAk8E3gGcZmYbooL7T05gSUcTfAcdTvBOulbSSgv7bpxiZnfEl/5GSWuivPua2ZPj/XuZ2Z2STidssHPFmDJynO3ClcTOyQrgbDPbRvDkeTHwDOBu4HIzuwVAwU//MuAe4I8WNmqB4IfptSOpTs5K4HMAZrZZ0uYY/iyCuWpDVDC7AZc2JSTpIcBeZnZxDPoOwU07BAeLyxP7/EMIL+YVwLkWvIT+VdIvK8l+L6a9BHgOcG6i8HaP30cBByfhD469hg3ApyWtBr5flGWGo+Pnqni+JMq2HnizpBfF8P1i+FbgAEmfB34MXNRULo4zX7iS2DmpbeID9yXH2wh1pCl+E/czNGnuUbmWcxomwsYxr5xFHqpJq7j2JjO7sBQovXBMmvfG7x5wp4X9Cqr0gGeb2b8r4R+T9GOCU77LJB1lZtfXyPZRMzurItuRBAX0bDP7l6R1wB5m9g9JTwWeTzCpvRw4ZcxzOM6c8TGJnZP1wInRzr03oWXf5DL5ekIrdlk8P7Em3j8J+zIX3Eww7QCks23WAycBKGwSszyGX0Ywbz0uXnuApCc0PYiFfQTukrQiBp2UXL4QeIPC/gxIeoKCC/dLgJfEsYlHAkfWpH03cJOkl8X7FV/UEFrypxdxJR0Svw80s2vM7OPAFcBBNaJfCJxSjLlI2lfSIwi9nX9EBXEQoXdVmOJ6ZrYGeD9hv3AYLXPHmVdcSeyc/IDgRnkT8AvgXWb217rIsbX8RuCCOKB7G3BXJuo5wDvjgO2BwCcJL+lfE8Y+Cr4MLIlmpncRFZSZ/Y0wW+fseO0y6l+yKa8GvhgHrtOW/deB3wFXKkyLPYvQM1pDcFdehP2m5nkgKJ1TJRXu34v9098MHBYHnX8HvD6GvzUOLm+Ksvw0l6iZXQR8F7hU0jXAeYSX/QXALvH5PxLLAMI2m+uiCXAV8J4Yvgr4ig9cOwuFuwp3JkLSEjO7R8EI/0XgBjP7TEuyrGOOg7XJ8zycoKSOaFKUOxKSVpFMIHCcueA9CWdSXhNbsdcSTCJnjYm/kNwBrFJmMd0sOD8+z6+Aj3RIQawGnkvNrCrHmS3ek3CcBUTSUwgzrlLuM7NntiGP48wWVxKO4zhOLW5uchzHcWpxJeE4juPU4krCcRzHqcWVhOM4jlPL/wEprJeug+w9KwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tas.sel(time='1978-01').plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note we haven't loaded matplotlib, but because xarray uses it, it loads it for us." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Save data to file\n", "There is a very simple way to save data back to a netcdf file. It isn't necessarily the fastest way. But you should only have to write out some analysed fields using Python which means relatively small amounts of data.\n", "\n", "Note, netcdf support inline compression so you should ALWAYS save your data compressed. Inline compression means the file just looks the same, access is the same, you don't need to uncompress before being able to see the information from the file." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Compression\n", "encod={}\n", "for var in ds.data_vars: # data_vars stores the names of the variables in a dataset, as strings\n", " encod[var]={'zlib':True}\n", "\n", "# Write to file\n", "ds.to_netcdf('test.nc',encoding=encod)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### More info\n", "This was a very very quick presentation of `xarray`. We were simply trying to give you the very basics, especially highlights the philosophy of the package. We will run a `xarray` training soon. In the meantime if you want to know more, you can always run through [xarray quick overview](http://xarray.pydata.org/en/stable/quick-overview.html)\n", "\n", "In addition, the CMS team has a [blog](https://climate-cms.org/) with quite a few blogs using `xarray` and Python in general. Feel free to check those as well." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.8.3" } }, "nbformat": 4, "nbformat_minor": 2 }